Contract-Development

在 Python 中獲取方法 ID“Keccak 雜湊”

  • January 25, 2017

我正在嘗試在 Python 中派生方法 ID、Keccak (SHA-3) 雜湊,以便在按照 ABI 文件中的詳細說明部署契約的功能後,我可以呼叫它們:https ://github.com/ethereum /wiki/wiki/Ethereum-Contract-ABI

此詳細資訊0xcdcd77c0應該是為具有簽名的函式派生的 IDbaz(uint32,bool)

我嘗試使用 python sha3 模組(https://pypi.python.org/pypi/pysha3)複製它:

>>> import sys
>>> import hashlib
>>> import sha3
>>> s = hashlib.sha3_512()
>>> s.update(b"baz(uint32,bool)")
>>>s.hexdigest()
'f1bb0cbc152d49505684ee7d2a37a860af1820ff8052ed6b32eddd3d82f97e89b24aac5ef334f94474264795cb7672339aecfc2cd2dc1cd0b87adccada2e7bc1'

如何以正確的格式從中獲取前四個字節以用作事務中的方法簽名?將此摘要轉換為十六進制似乎沒有給出正確的簽名。

使用最新 (>=1.0) 版本的 pysha3,您可以使用以下命令重新創建方法 ID:

from sha3 import keccak_256
sha3_hash = keccak_256("baz(uint32,bool)").hexdigest()
method_id = "0x"+sha3_hash[:8]
print method_id

如果您的 pysha3 舊(例如固定在pysha3==0.3),您需要:

from sha3 import sha3_256
sha3_hash = sha3_256("baz(uint32,bool)").hexdigest()
method_id = "0x"+sha3_hash[:8]
print method_id

說明:在乙太坊採用了當時最新的 SHA3 候選方案後,標準發生了變化。乙太坊使用的現在稱為 Keccak 而不是 SHA3。

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