Die aufzurufende Funktion heißt xyz()
.
Mein Code:
web3.sha3("xyz()").substr(0,10)
Fehler:
AttributeError: Modul „web3“ hat kein Attribut „sha3“
In neueren Versionen von web3 tritt der obige Fehler auf. Was kann sonst verwendet werden, um das hexadezimale Äquivalent des Funktionsnamens zu erhalten?
Codequelle: Wie kann man den Hex-Code kennen, der in Daten verwendet werden soll, um eine bestimmte Vertragsfunktion aufzurufen? (Die Lösung funktioniert nicht auf neueren Versionen von web3)
Das hexadezimale Äquivalent der Methode wird als Funktionsselektor bezeichnet .
Der Funktionsselektor besteht aus den ersten 4 Bytes des Keccak-Hashes der Funktionssignatur , Argumente verpackt als String-Typen.
Sie können dies erhalten durch:
>>> from web3 import Web3
>>> Web3.keccak(text="xyz()")
HexBytes('0x356bc81e51224d094b17ccb8f80b1e659fe334bcf15c6240857cce0568cbb0ba')
>>> hex_bytes = Web3.keccak(text="xyz()")
>>> print(hex_bytes[0:4].hex())
0x356bc81e
du suchst das:
encodeFunctionSignature
web3.eth.abi.encodeFunctionSignature(functionName);
Kodiert den Funktionsnamen in seine ABI-Signatur, die die ersten 4 Bytes des sha3-Hashs des Funktionsnamens einschließlich Typen sind.
https://web3js.readthedocs.io/en/v1.2.11/web3-eth-abi.html
In Python sollte es einen äquivalenten Aufruf geben
Nulik
signature
, innerhalb der Quellen heißt es Signatur, aber in der Solidität heißt es SelektorMikko Ohtamaa