Solidity
使用 AbiEncoderV2 對原始事務中的數據進行編碼
我遇到了一個需要將結構傳遞給 Solidity 函式的案例。我知道這可以通過元組來完成。但是,我需要
node.js
使用 Infura 作為提供者從我的後端簽署並發送此交易。目前,我使用
encodeABI()
from web3.js 對函式呼叫進行編碼。但是,在這種情況下,它有一個結構作為參數 usingencodeABI()
不能正確地做到這一點,我假設這是因為encodeABI()
只支持 AbiEncoder 的 V1。web3.js 或 ethers.js 等中是否有任何功能可以做什麼
encodeABI()
,但使用 AbiEncoder V2?我只想傳遞一個扁平結構來解決這個問題,但我遇到了臭名昭著的
stack to deep
錯誤,因為該結構有 10 個值,而且我不能將函式分成許多函式,因為唯一的程式碼是在函式內部形成結構。編輯:我意識到我可以只傳遞數組中的值來解決扁平化問題。但是,我仍然對如何正確編碼數據感到好奇。
感謝您的任何幫助或建議!
您可以使用 Ethers.js 實用程序以 v2 AbiEncoder 的方式打包數據:
https://docs.ethers.io/ethers.js/html/api-utils.html?highlight=packed#solidity
文件中的範例:
let result = utils.solidityKeccak256([ 'int8', 'bytes1', 'string' ], [ -1, '0x42', 'hello' ]); console.log(result); // '0x52d7e6a62ca667228365be2143375d0a2a92a3bd4325dd571609dfdc7026686e' result = utils.soliditySha256([ 'int8', 'bytes1', 'string' ], [ -1, '0x42', 'hello' ]); console.log(result); // '0x1eaebba7999af2691d823bf0c817e635bbe7e89ec7ed32a11e00ca94e86cbf37' result = utils.solidityPack([ 'int8', 'bytes1', 'string' ], [ -1, '0x42', 'hello' ]); console.log(result); // '0xff4268656c6c6f'