Ist es möglich, den Transaktions-Hash aus einem Solidity-Funktionsaufruf heraus zu erhalten?

Ist der Transaktions-Hash innerhalb einer Solidity-Funktion als globale Variable innerhalb des Vertrags verfügbar? Ich hätte gedacht, es wäre so etwas wie tx.hashSie es tun können tx.originusw.

Ich denke, dass der Transaktionshash erst verfügbar sein wird, wenn der Vertrag abgebaut wurde. Ist das richtig?

Antworten (1)

Hier haben Sie alle globalen Variablen in Solidity:

Globale Variablen

  • block.coinbase (Adresse): aktuelle Adresse des Blockminers
  • block.difficulty (uint): aktuelle Blockschwierigkeit
  • block.gaslimit (uint): aktuelle Blockgasgrenze
  • block.number (uint): aktuelle Blocknummer
  • block.blockhash (Funktion (uint) gibt (Bytes32) zurück): Hash des angegebenen Blocks - funktioniert nur für die 256 neuesten Blöcke
  • block.timestamp (uint): Zeitstempel des aktuellen Blocks
  • msg.data (Bytes): vollständige Anrufdaten
  • msg.gas (uint): verbleibendes Gas
  • msg.sender (Adresse): Absender der Nachricht (aktueller Anruf)
  • msg.value (uint): Anzahl der mit der Nachricht gesendeten Wei
  • now (uint): Zeitstempel des aktuellen Blocks (Alias ​​für block.timestamp)
  • tx.gasprice (uint): Gaspreis der Transaktion
  • tx.origin (Adresse): Absender der Transaktion (vollständige Aufrufkette)
  • keccak256(...) gibt (bytes32) zurück: Berechnen Sie den KECCAK256-Hash der (dicht gepackten) Argumente
  • sha256(...) gibt (bytes32) zurück: berechnet den SHA256-Hash der (dicht gepackten) Argumente
  • reifemd160(...) liefert (bytes20): berechnet RIPEMD von 256 den (dicht gepackten) Argumenten
  • ecrecover(bytes32, uint8, bytes32, bytes32) gibt (Adresse) zurück: Stellt den öffentlichen Schlüssel aus der Signatur der elliptischen Kurve wieder her
  • addmod(uint x, uint y, uint k) gibt (uint) zurück: compute (x + y) % k wobei die Addition mit beliebiger Genauigkeit durchgeführt wird und nicht bei 2**256 umbricht.
  • mulmod(uint x, uint y, uint k) gibt (uint) zurück: compute (x * y) % k wobei die Multiplikation mit beliebiger Genauigkeit durchgeführt wird und nicht bei 2**256 umbricht.
  • this (aktueller Vertragstyp): der aktuelle Vertrag, der explizit in eine Adresse umgewandelt werden kann
  • super: der Vertrag eine Ebene höher in der Vererbungshierarchie
  • Selbstzerstörung (Adresse): Zerstöre den aktuellen Vertrag und sende sein Geld an die angegebene Adresse
  • <Adresse>.balance: Saldo der Adresse in Wei
  • <address>.send(uint256) gibt zurück (bool): sendet die gegebene Menge an Wei an die Adresse, gibt bei einem Fehler false zurück.

Wie Sie sagen, da die Transaktion nicht abgebaut wird, können Sie hier die tx.hash.

Es ist der gleiche Grund, warum Sie es nicht tun können block.hash(block.number), da der Blockhash vom Ergebnis der Vertragsausführung abhängt, es sich also um einen Zirkelverweis handelt.
Tatsächlich hängt der Transaktionshash nur von den Daten der Transaktion ab (Beispiel: 0xabc sendet 0xcde 10 Ether mit nonce n, gas g...), nicht von ihrer Ausführung.
Der TxHash ist tatsächlich bekannt, bevor der Block abgebaut wird. Es ist die erste Information, die der Anrufer im Rückruf erhält. Warum kann es also nicht im EVM verfügbar sein? Das wäre schön.
@GuenoledeCadoudal Klingt nach einer guten Frage.
@GuenoledeCadoudal, denn wenn EVM die Transaktion ausführt, werden ihre Daten nicht vollständig erstellt und daher kann ihr Hah nicht bestimmt werden.
@AlirezaZojaji, das könnte ein Missverständnis sein. Der tx-Hash ist der Wert, der nur mit der Eingabe der Transaktion berechnet wird, und wird berechnet, bevor er die EVM erreicht, da er an den Aufrufer (das Programm außerhalb der Transaktion) zurückgegeben wird, damit er den Transaktionsstatus überprüfen kann. Die Frage ist: "Wäre es möglich / interessant, diesen TX-Hash als Konstante in die Solidity-Sprache zu bringen?" wie Sie die aktuelle tx.origin haben. Ein tx.hash zum Beispiel.
Ich habe einen Anwendungsfall, wo dies gut passen würde! Ich habe einen dapp, der versucht, den Überblick über wichtige Ereignisse zu behalten, und ich würde es lieben, wenn mein Vertrag den TX speichern und abrufen könnte, wenn es wichtig wäre!
Der Transaktionshash hängt nicht vom Mining-Prozess ab. Die Transaktion (zusammen mit ihrem Hash) existiert im Mempool, bevor der Block abgebaut wird.