Solidity
Python 和 Solidity keccak256 函式給出不同的結果
我正在實施一個智能合約應用程序,其中存在鏈上和鏈下計算。我將不得不使用 Python 和 Solidity 計算多個整數的雜湊函式。但是 Solidity 和 Python 分別給出了不同的結果,如下所示。
(a=1, b=2, c=3) 的輸出為:49776295142305522338649292811956300178326541500117443588869412604416814650524
(a=1, b=2, c=3) 的輸出為:45637690538541992090000098772847886457082422231295691457910964509567538102535
我需要了解 Solidity 如何對輸入整數進行編碼並將它們傳遞給雜湊函式,這如何在 Python 中完成?
我會查看 Web3.py 庫,特別是函式
Web3.soliditySha3
這將用於計算您需要的雜湊:
from web3 import Web3 print(int(Web3.soliditySha3(['uint256', 'uint256', 'uint256'], [1 ,2, 3]), 16))
從 Web3.py 庫的 v5 開始,您將執行以下操作:
from web3 import Web3, EthereumTesterProvider w3 = Web3(EthereumTesterProvider()) print(w3.toInt(w3.solidityKeccak(['uint256', 'uint256', 'uint256'], [1, 2, 3]))) 49776295142305522338649292811956300178326541500117443588869412604416814650524
還有這個:
print(w3.toInt(w3.keccak( b'\x00'*31 + b'\x01' + b'\x00'*31 + b'\x02' + b'\x00'*31 + b'\x03'))) 49776295142305522338649292811956300178326541500117443588869412604416814650524