Wie kann ich mit Python das hexadezimale Äquivalent für einen Methodennamen in einem Ethereum-Vertrag erhalten?

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)

Antworten (2)

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
es heißt auch signature, innerhalb der Quellen heißt es Signatur, aber in der Solidität heißt es Selektor
Danke @Nulik. Ich glaubte, dass sich der Selektor auf die 4-Byte-Kennung von Solidity bezieht, während die Funktionssignatur ein allgemeines Programmiersprachenkonzept ist.

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

Ich habe ewig nach dem Äquivalent gesucht, bin aber immer noch nicht fündig geworden, kennst du es zufällig?