Solidity

使用 AbiEncoderV2 對原始事務中的數據進行編碼

  • April 11, 2019

我遇到了一個需要將結構傳遞給 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'

引用自:https://ethereum.stackexchange.com/questions/69520