Wie berechnet man den zugewiesenen txHash einer Transaktion?

Solidity unterstützt die txHash-Variable noch nicht, wurde aber bei EIP 901 https://github.com/ethereum/EIPs/issues/901 angefordert . Wie könnte ich in der Zwischenzeit den txHash einer Transaktion mit dem Solidity-Code im Smart Contract berechnen? Ich denke, txHash basiert auf einem Keccak-Hashing des msg.sender und wahrscheinlich der Nonce der Anfrage, oder? Gibt es eine kanonische Formel für die Ethereum txHash-Berechnung? Vielen Dank!

Antworten (2)

Kurze Antwort

Es ist nicht möglich.

Längere Antwort

Der TXHash ist keccak256(signedTransaction).

Diese keccak256-Funktion ist als Solidity-Funktion verfügbar http://solidity.readthedocs.io/en/v0.4.21/units-and-global-variables.html

Sie müssten also konstruieren, signedTransactionda dieser Wert nicht der Solidität ausgesetzt ist, vgl. https://stackoverflow.com/questions/49803424/how-can-we-access-rlp-encoded-signed-raw-transaction-in-solidity

Die Bestandteile von signedTransactionsind

  1. einmal
  2. Gaspreis
  3. Gasgrenze
  4. zu
  5. Wert in Wei
  6. Daten
  7. ecdsaV
  8. ecdsaR
  9. ecdsaS

Wert 3 ist nicht direkt verfügbar, aber Sie können das aktuelle verbleibende Gas an jedem Punkt Ihrer Codeausführung abrufen und daraus berechnen, wie viel verfügbar war, als die Ausführung gestartet wurde. Die Werte 1, 7, 8 und 9 (die Nonce- und die Signaturwerte) sind nicht mit Solidity verfügbar, noch sind sie mit Assemblercode verfügbar (der inline in Solidity-Quellcodedateien geschrieben werden kann). Damit lässt sich dein Problem leider nicht lösen.

Siehe auch: Haben die Kontrakte von Ethereum Zugriff auf die Nonce der Blöcke?

Gemäß dem Geth-Quellcode (Datei core/types/transactions) und diesem Medienbeitrag wird der Hash einer Transaktion durch den Keccak-256-Bit-Hashing der rlp-Codierung aller Felder einer Transaktion angegeben, wie in diesem Bild 1 gezeigt .

Um die Transaktionsfunktion zu berechnen, müssen Sie daher in der Lage sein:

  1. Berechnen Sie den KEC256-Bit-Hash einer beliebigen Anzahl von Bytes
  2. Zugriff auf/Berechnung einer RLP-Codierung einer Transaktion
  3. Greifen Sie auf alle Felder einer Transaktion zu:

Wenn Sie sich die EVM-Spezifikation ( Yellow Paper , Anhang H) ansehen, können Sie sehen, dass der erste Punkt sehr einfach ist, tatsächlich entspricht er der SHA3 (0x20)Anweisung. Es ist weder die RLP-Kodierung aller Felder einer Transaktion noch eine RLP-Kodierungsanweisung im EVM-Anweisungssatz angegeben, aber es ist möglich, sie zu berechnen ( Yellow Paper , Anhang B), vorausgesetzt, der Absender hat genügend Gas zur Verfügung. Schließlich gibt es keine Anweisung, auf alle Felder zuzugreifen. Insbesondere kann ich die EVM-Anweisungen für den Zugriff nicht finden:

  • die Nonce der Transaktion: Sie entspricht der Anzahl der vom Absender gesendeten Transaktionen (ich kann keine Funktion finden, um weder diese Nummer abzurufen)
  • die Signaturinformationen vundr
  • das Transaktionsgaslimit