Ich versuche, die Methoden-ID, den Keccak (SHA-3)-Hash, in Python abzuleiten, damit ich die Funktionen meiner Verträge aufrufen kann, sobald sie wie in der ABI-Dokumentation beschrieben bereitgestellt werden: https://github.com/ethereum /wiki/wiki/Ethereum-Vertrag-ABI
Diese Details 0xcdcd77c0
sollten die ID sein, die für die Funktion mit der Signatur abgeleitet werden sollbaz(uint32,bool)
Ich habe versucht, dies mit dem Python-sha3-Modul ( https://pypi.python.org/pypi/pysha3 ) zu replizieren:
>>> import sys
>>> import hashlib
>>> import sha3
>>> s = hashlib.sha3_512()
>>> s.update(b"baz(uint32,bool)")
>>>s.hexdigest()
'f1bb0cbc152d49505684ee7d2a37a860af1820ff8052ed6b32eddd3d82f97e89b24aac5ef334f94474264795cb7672339aecfc2cd2dc1cd0b87adccada2e7bc1'
Wie kann ich die ersten vier Bytes davon im richtigen Format erhalten, um sie als Methodensignatur in einer Transaktion zu verwenden? Das Konvertieren dieses Digests in Hex scheint nicht die richtige Signatur zu geben.
Mit einer neueren (>=1.0) Version von pysha3 können Sie die Methoden-ID neu erstellen mit:
from sha3 import keccak_256
sha3_hash = keccak_256("baz(uint32,bool)").hexdigest()
method_id = "0x"+sha3_hash[:8]
print method_id
Wenn Ihr pysha3 alt ist (z. B. angeheftet an pysha3==0.3
), benötigen Sie:
from sha3 import sha3_256
sha3_hash = sha3_256("baz(uint32,bool)").hexdigest()
method_id = "0x"+sha3_hash[:8]
print method_id
Erläuterung: Nachdem Ethereum den damals jüngsten Kandidaten für SHA3 übernommen hatte, wurde der Standard geändert. Was Ethereum verwendet, heißt jetzt Keccak statt SHA3.
try: from sha3 import keccak_256 except ImportError: from sha3 import sha3_256 as keccak_256
TypeError: Unicode-objects must be encoded before hashing
, gelöst einfach durch "baz(uint32,bool)".encode('utf-8').keccak_256("baz(uint32,bool)".encode('utf-8')).hexdigest()
Tankman 六四
s = hashlib.sha3_256()
. Wenn Sie erwägen, Ihren Beitrag zu aktualisieren, um sich auf das falsche Bibliotheksproblem zu konzentrieren (nicht gleichzeitig auf die falsche Verwendung), dann ist s.hexgiest() Ihrer Nachricht'af54f249a9bc75430f5d7fcc6a2154e9f76ac500e4094c7a2167e43ff7fc53f7'