So erhalten Sie den Wert der Eingabeparameter aus dem Transaktionsverlauf

Ich möchte eine erfolgreiche Transaktion auf einem ETH-Block lesen und ich möchte die Werte der Eingabeparameter erhalten, die an die Funktion für diese Transaktion übergeben wurden. Ich spreche nicht von der

Daten
Feld in der Transaktion. Und ich bin mir bewusst, dass ich TransactionReceipt von web3 in meiner Webapp verwende, um andere Details dieser Transaktion anzuzeigen.

Zum Beispiel habe ich eine Methode im Vertrag:

Funktion setName(string n) {.....}

Wenn diese Funktion nun als aufgerufen wurde

Vertrag.setName("Abcde")....
Jetzt möchte ich irgendwann im Rahmen der Prüfung die Transaktions-ID verwenden und Transaktionsdetails lesen und den Wert "Abcde" lesen, der für diese bestimmte Transaktion an diese Funktion übergeben wurde.

Ich möchte wissen, ob dies möglich ist und wenn ja, wie ich es mache.

Antworten (1)

Ich spreche nicht von dem dataFeld in der Transaktion.

Nun, das sind Sie eigentlich. Das dataFeld sind die Eingabeparameter. Was Sie wissen müssen, ist, wie man sie entschlüsselt. Es lohnt sich, den Ethereum ABI zu studieren , wenn Sie das wirklich verstehen wollen.

Weitere Tools finden Sie unter web3.eth.abi (überprüfen Sie, ob Sie Version 1.0 oder höher von Web3 verwenden). Leider erledigt dies nicht die ganze Arbeit für Sie - es könnte dahingehend erweitert werden -, aber es kann helfen.

In Ihrem Beispiel hat Ihr Funktionsaufruf eine Signatur wie folgt:

> web3.eth.abi.encodeFunctionSignature('setName(string)');
'0xc47f0027'

Wenn Sie also ein dataFeld finden, das mit beginnt c47f0027, wissen Sie, dass es sich um einen Aufruf Ihrer setNameFunktion handelt und dass die verbleibenden Daten der Zeichenfolgenparameter sind.

In Ihrem Beispiel sehen die Zeichenfolgendaten folgendermaßen aus: 000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000. Dies ist die ABI-String-Darstellung von "Abcde").

Sie extrahieren dies also aus dataund speisen es in Web3 ein, um es wie folgt zu decodieren:

> web3.eth.abi.decodeParameter('string','000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000');
'Abcde'

Zusammenfassung

To summarise your example, the full datafield in the transaction would be "0xc47f0027000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000".

  • Die ersten 8 Hexadezimalzeichen, "c47f0027" (ignorieren Sie das 0x, falls vorhanden), bedeuten, dass dies ein Aufruf Ihrer setName(string n)Funktion ist.

  • Die verbleibenden Daten sind Ihre Zeichenfolgenparameter und können wie oben mit Web3 decodiert werden.

Anhang

Diese Bibliotheken versuchen, das Obige zu automatisieren, aber ich habe sie nicht getestet:

Würde dies zum Decodieren von Smart Contract-Erstellungsdaten funktionieren?
@MiguelMota Ja - die Konstruktorparameter werden an die Vertragserstellungsdaten angehängt. Es ist etwas schwieriger, da Sie herausfinden müssen, wo der Vertragscode endet und die Konstruktorparameter beginnen, aber im Prinzip ist es ähnlich wie oben. Es gibt jedoch keine Funktionssignatur.