Wie überprüft die Ethereum-Brieftasche die Vertragsbedingungen, um die Warnung anzuzeigen?

Ich habe eine Bedingung in meinem Vertrag.

require(msg.sender == tempTeam.getConvener());

Wenn ich eine Transaktion an diesen Vertrag sende, die gegen diese Bedingung verstößt, benachrichtigt mich Ethereum Wallet sofort mit einer Warnung, ohne die Transaktion überhaupt auszuführen, dass sie fehlschlagen wird. Wie macht es das? Gibt es eine Web3-API, die die Ausführung vorab überprüfen kann.

Geben Sie hier die Bildbeschreibung ein

Antworten (2)

Ich bin mir nicht sicher, aber es kann sein, dass es die gleiche Mechanik wie die Funktion "schätzenGas" von web3js verwendet.

Diese Funktion führt die Transaktion auf dem EVM aus und prüft, ob sie funktioniert hat, ob das Gas in Ordnung ist usw. (natürlich ohne es zu minen) und gibt Ihnen das Ergebnis oder einen Fehler zurück, wenn die Transaktion nicht gültig / fehlgeschlagen ist.

Vielleicht verwendet Mist also dieselbe Mechanik.

Hast du einen Link, der diese Vermutung stützen könnte? Es macht für mich Sinn, aber ich würde gerne prüfen, ob es Beweise dafür gibt

Ich verstehe jetzt, wie ein Wallet- oder Web3-Aufruf feststellen kann, ob eine Transaktion erfolgreich ist oder fehlschlägt. Die Antwort wurde im Blogbeitrag von Vitalik Buterin über Merkling in Ethereum begraben.

Wenn Sie Ethereum abfragen möchten nach - "Vorgeben, diese Transaktion für diesen Vertrag auszuführen. Was wäre die Ausgabe?"

Ethereum verwendet drei verschiedene Arten von Merkle-Bäumen:

  1. Transaktionen
  2. Quittungen
  3. Zustand

Um auf die obige Abfrage zu antworten, verwendet Ethereum den Zustandsbaum, indem es einen Merkle-Zustandsübergangsnachweis erstellt. Um Vitalik zu zitieren -

Im Wesentlichen ist es ein Beweis, der die Behauptung aufstellt: „Wenn Sie Transaktion T auf dem Zustand mit Wurzel S ausführen, wird das Ergebnis ein Zustand mit Wurzel S‘, mit Log L und Ausgabe O sein“ („Ausgabe“ existiert als Konzept in Ethereum, weil jede Transaktion ein Funktionsaufruf ist; es ist theoretisch nicht notwendig).

Um den Beweis zu berechnen, erstellt der Server lokal einen gefälschten Block, setzt den Status auf S und gibt vor, ein Light-Client zu sein, während er die Transaktion anwendet. Das heißt, wenn der Vorgang des Anwendens der Transaktion erfordert, dass der Client den Saldo eines Kontos ermittelt, führt der Light-Client eine Saldoabfrage durch. Wenn der Light-Client ein bestimmtes Element im Speicher eines bestimmten Vertrags überprüfen muss, stellt der Light-Client eine entsprechende Abfrage und so weiter. Der Server „antwortet“ korrekt auf alle seine eigenen Anfragen, verfolgt aber alle Daten, die er zurücksendet. Der Server sendet dann dem Client die kombinierten Daten aus all diesen Anfragen als Beweis. Der Kunde unternimmt dann genau das gleiche Verfahren, verwendet jedoch den bereitgestellten Nachweis als Datenbank; Wenn das Ergebnis mit dem übereinstimmt, was der Server behauptet, akzeptiert der Client den Beweis.

Woher weiß eine Ethereum-Brieftasche also, dass Ihre Transaktion fehlschlagen wird? Es wendet den Zustandsübergangsmechanismus an, bei dem Ihr Funktionsaufruf entweder zu wenig Gas gegeben oder einen Fehler ausgelöst oder eine erforderliche Bedingung nicht erfüllt hat.