Web3js
如何在 Python Web3 中獲取未打包的solidityKeccak 雜湊
為了
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()])