Web3js

如何在 Python Web3 中獲取未打包的solidityKeccak 雜湊

  • November 30, 2020

為了

Web3.solidityKeccak(['bool'], [True])

, Python Web3 產生:0x5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2

這與keccak256(abi.encodePacked(true))Solidity 中的輸出相匹配。但是,我想要輸出,keccak256(abi.encode(true))因為我的契約必須處理可變大小的資料結構。

在 Web3 JS 中,我可以0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6使用以下方法獲得正確的輸出 ():

web3.utils.soliditySha3(web3.eth.abi.encodeParameters(['bool'], [true]))

如何從 Python Web3 獲取它?

當然,我不需要布爾值的雜湊值。這只是作為一個範例,用於輕鬆驗證是否使用了正確的編碼。

我剛剛發現了它是如何完成的:有一個用於 Solidity ABI 編碼的 python 庫,我們可以濫用字節的緊湊 ABI 編碼是標識的事實。

該庫可以安裝:

pip install eth_abi

它的文件可以在這裡找到:https ://eth-abi.readthedocs.io/en/latest/

通過導入庫後

import eth_abi

,雜湊可以計算如下:

abiEncoded = eth_abi.encode_abi(['bytes', 'bytes32'], [input1, input2])
hash = w3.solidityKeccak(['bytes'], ['0x' + abiEncoded.hex()])

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