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
DatenFeld 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.
Ich spreche nicht von dem
data
Feld in der Transaktion.
Nun, das sind Sie eigentlich. Das data
Feld 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 data
Feld finden, das mit beginnt c47f0027
, wissen Sie, dass es sich um einen Aufruf Ihrer setName
Funktion 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 data
und speisen es in Web3 ein, um es wie folgt zu decodieren:
> web3.eth.abi.decodeParameter('string','000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000');
'Abcde'
To summarise your example, the full data
field 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.
Diese Bibliotheken versuchen, das Obige zu automatisieren, aber ich habe sie nicht getestet:
Miguel Mota
Benjaminion