Was macht diese Ethereum-Transaktion eigentlich?
Du schaust eine Smart-Contract-Transaktion an (ein Programm, das auf der Ethereum-Blockchain läuft), und du siehst etwas wie 0xa9059cbb000000...0de0b6b3a7640000. Die ersten zehn Zeichen sind nicht zufällig. Das ist der Function-Selector, ein kurzer Identifikator, der dem Contract sagt: *"ruf die transfer-Funktion auf"*.
Dieses Tool macht zwei Dinge. Erstens: tipp eine Funktionssignatur wie transfer(address,uint256) und bekomm ihren 4-Byte-Identifikator (0xa9059cbb). Das sind die 4 Bytes, die am Anfang jeder Transaktion erscheinen, die diese Funktion aufruft.
Zweitens: paste einen rohen Calldata-Blob (den Hex aus einer Transaktion), das Tool extrahiert den Selector, schaut ihn in einer eingebauten Registry von ~30 gängigen Funktionen nach (ERC-20, NFTs, Uniswap, WETH, Proxies, ENS) und zeigt dir, welche Argumente übergeben wurden.
Alles läuft lokal in deinem Browser, keine API-Calls, keine Daten verlassen dein Gerät. Perfekt zum Debuggen von Wallet-Transaktionen, zum Lesen ausstehender Transaktionen auf Etherscan oder einfach zum Lernen, wie die EVM-ABI funktioniert.
So nutzt du es
- Wähl oben einen Modus: Selector berechnen (du kennst den Funktionsnamen, du willst den Identifikator) oder Calldata dekodieren (du hast einen Hex-Blob und willst wissen, was er tut).
- Im Selector-berechnen-Modus: tipp die Funktionssignatur wie functionName(argType1,argType2). Keine Leerzeichen, keine Argument-Namen, nur die Typen. Das 4-Byte-Ergebnis erscheint sofort.
- Im Calldata-dekodieren-Modus: paste den vollen Transaktions-Hex (mit 0x oder ohne). Das Tool liest die ersten 4 Bytes und schaut sie in der eingebauten Registry nach. Wenn gefunden, zeigt es Funktionsname und eine Parameter-Tabelle. Wenn nicht, kannst du die Signatur manuell einfügen.
- Klick die Beispiel-Chips unter dem Input (transfer, approve, swap), um zu sehen, wie gängige Operationen aussehen.
- Die Liste unten ist die eingebaute Selector-Registry (~30 gängige). Klick einen Eintrag, um den Input automatisch zu füllen.
- string, bytes und Array-Argumente werden als *"(dynamischer Typ)"* markiert und übersprungen, volle Dekodierung erfordert komplexe Offset-Logik (außerhalb des Scopes hier). Adressen und Ganzzahlen dekodieren gut.
Wann das nützlich ist
Sechs typische Situationen, in denen der Selector eine konkrete Antwort liefert:
- Eine seltsame Wallet-Transaktion debuggen. Etwas ist aus deiner Wallet verschwunden, und du weißt nicht, worauf du geklickt hast. Kopier die Calldata von Etherscan, paste sie hier, du siehst sofort: *"ah, das war approve für unbegrenztes USDT an einen zufälligen Contract"*. Jetzt weißt du, was zu revoken ist.
- Eine ausstehende Transaktion auf Etherscan lesen. Du willst wissen, was der Contract gleich tun wird, bevor du in MetaMask signierst. Paste das *"Input Data"*-Feld, du siehst: *"swapExactTokensForTokens, ein DEX-Swap"*. Das Gehirn entspannt.
- Eine Integration mit einem Smart Contract bauen. Du musst Calldata per Hand konstruieren (z. B. für einen multicall oder ein Nicht-Standard-Framework). Du berechnest den Selector für jede Funktion, konkatenierst mit den Argumenten. Das ist Schritt eins.
- Lernen, wie die ABI funktioniert. Dein erster Tag mit Solidity, und jemand wirft dir *"Function-Selector"* hin. Tipp transfer(address,uint256), du bekommst 0xa9059cbb, ändre es in Transfer(...) (großes T), total anderer Selector. Also zählt sogar die Großschreibung. Lektion gelernt.
- Security-Review eines Contracts. Du hast eine verdächtige Transaktion, die angeblich *"claimAirdrop"* aufgerufen hat, aber etwas fühlt sich falsch an. Berechne den Selector für claimAirdrop() und prüf, ob er zu den ersten 4 Bytes der Calldata passt. Wenn nicht, hat jemand versucht, dich zu täuschen.
- Foundry-/Hardhat-Tests schreiben. Du musst einen Selector in einem Test hartkodieren (z. B. für expectRevert(bytes4)). Berechne ihn hier, kopier, paste in den Test. Kein cast installieren oder eine separate Toolchain einrichten nötig.