Solidity

Python 和 Solidity keccak256 函式給出不同的結果

  • March 21, 2021

我正在實施一個智能合約應用程序,其中存在鏈上和鏈下計算。我將不得不使用 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

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