Abrufen der Methoden-ID "Keccak-Hash" in Python

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 0xcdcd77c0sollten 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.

Ethereum verwendet 256-Bit. Wäre sha3 von Python Hashlib dasselbe gewesen wie Keccak von Ethereum, hätte der Aufruf lauten müssen: 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'

Antworten (1)

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.

Vielen Dank! Mein PC hatte die ältere Version. Etwas schmerzlich, dass dies der Fall ist, ich nehme an, ich muss irgendwann eine Überprüfung implementieren, um zu sehen, welche Version verwendet werden soll.
Ja, ich denke, Sie könnten Folgendes tun:try: from sha3 import keccak_256 except ImportError: from sha3 import sha3_256 as keccak_256
Etwas in dieser Richtung, ich muss nur meinen normalen Code für die Abhängigkeitsprüfung überarbeiten, denke ich
Nur um anzumerken, dass ich beim Ausführen des oben Gesagten Folgendes erlebt habe: 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()