Wie kann ich einen Smart Contract debuggen?

Wie kann ich bei der Entwicklung meines Smart Contracts Fehler beheben? Gibt es Debugging-, Test-Tools oder Simulatoren, mit denen ich meinen Code untersuchen kann?

Hardhat hat Stack-Traces und console.log

Antworten (6)

  1. Die Remix-IDE verfügt über einen großartigen integrierten Block-für-Block-Simulator und Debugger.
  2. Ganache ermöglicht schnelle Vertragstests ohne den Aufwand, einen Knoten auszuführen.
  3. Sobald der Vertrag aktiv ist, kann der Block-Explorer etherscan.io verwendet werden, um interne Zustands- und EVM-Ausführungsprotokolle anzuzeigen.
Mix IDE wurde eingestellt...
@CodingYourLife hat die Antwort mit den neuesten Ressourcen aktualisiert

Das sind alles gute Tools, aber ich habe festgestellt, dass das Protokollieren von Ereignissen eine viel einfachere Methode zum Debuggen ist, und wenn Sie irgendetwas mit Geld tun, möchten Sie aufzeichnen, was passiert ist.

In Solidity melden Sie sich mit Events an . Sie können dann alle Ereignisse in Ihrem Vertrag mit dem Callback "allEvents" von web3.js abhören

So debugge ich meine (derzeit) 780 Solidity-Linien.

Könnten Sie bitte etwas näher darauf eingehen, wie Sie mit Ereignissen debuggen? Verwenden Sie eine Javascript-Konsole, um sich manuell mit dem Vertrag zu verbinden und nach Ereignissen zu suchen, oder verwenden Sie ein Skript, um den Prozess irgendwie zu automatisieren? Das hört sich nach einer guten Technik an, und ich versuche, sie anhand von console.log-Ereignisergebnissen in Truffle-Unit-Tests anzuwenden, habe es aber noch nicht geschafft, sie zum Laufen zu bringen!
Ich verwende nodejs-Skripte, die mit web3.js gut funktionieren. Hier ist eine gehackte Version von Ether Pudding, die Protokollierung enthält (aber vorerst nur von einem Vertrag), siehe Unit-Tests, um zu erfahren, wie es funktioniert. github.com/barkthins/ether-pudding
Aber wenn die Ausführung ausgelöst wird, werden keine Ereignisse in Solidity protokolliert
guter Punkt. Ausnahmen versuche ich möglichst zu vermeiden, weil sie unter anderem dein ganzes Benzin fressen. Ich würde es lieben, wenn jemand eine Antwort zum Post-hoc-Debuggen einer ausgelösten Ausnahme hinzufügen würde. AFAICT müssen Sie die Protokolle eines Knotens untersuchen. Ich hoffe, jemand arbeitet an einer "weichen" Ausnahmefunktion in der VM, die "harte Ausnahme" ist im Grunde das Äquivalent zu einem BSOD ...
@PaulS Und wenn selbst im einfachsten Fall wie dem Dumping von Variablen ohne vorherige Bedingung keine Ereignisse geschrieben werden, wie kann ich dann wissen, was falsch ist? (und in einem Fall, in dem keine Ausnahme protokolliert wird)
@PaulS Wenn in einigen Funktionen mit 100 Codezeilen ein Fehler auftritt, treten keine Ereignisse auf.

Um einen Vertrag zu debuggen, können Sie den Solidity-Browser verwenden

Der Debugger bietet Ihnen die Möglichkeit, jede Transaktion (Erstellung oder Aufruf) Schritt für Schritt zu debuggen und den Speicher/Speicherplatz zu visualisieren. Es hilft Ihnen, die Gaskosten nach Opcode und das verbleibende Gas nach jedem Schritt zu verfolgen.

Um Transaktionen zu debuggen, gibt es zwei Möglichkeiten:

1 – unter Verwendung einer Blocknummer und eines Transaktionsindex.Geben Sie hier die Bildbeschreibung ein

2-mit einem Transaktions-Hash.

Geben Sie hier die Bildbeschreibung ein

Wenn das Laden der Transaktion erfolgreich ist, werden die Hash-, Von- und Bis-Felder angezeigt. Dann wird der vm-Trace geladen.Geben Sie hier die Bildbeschreibung ein

Der Debugger selbst enthält mehrere Steuerelemente, die es ermöglichen, den Trace zu überspringen und den aktuellen Status eines ausgewählten Schritts anzuzeigen.

Slider- und Stepping-Aktion:

Der Schieberegler ermöglicht es, schnell von einem Zustand in einen anderen zu wechseln. Stepping-Aktionen sind:

Schritt zurück Schritt zurück Schritt vorwärts Schritt vorwärts Schritt zum nächsten Anruf (dies wählt den nächsten Status aus, der sich auf Kontextänderungen bezieht - CALL, CALLCODE, DELEGATECALL, CREATE) Statusanzeige:

Das obere rechte Feld enthält grundlegende Informationen über den aktuellen Schritt:

VMTraceStep : der Index im Trace des aktuellen Schritts. Schritt Speicher hinzufügen Gas: von diesem Schritt verwendetes Gas Verbleibendes Gas: verbleibendes Gas Geladene Adresse: Der aktuell geladene Code bezieht sich auf den ausführenden Code. Die anderen 6 Felder beschreiben den aktuell ausgewählten Zustand:

Befehlsliste : Liste aller Befehle, die den aktuellen Ausführungscode definieren. Stapelspeicher ändert Speicheraufrufdaten$ Aufrufstapel

Breakpoints in Remix Breakpoints können hinzugefügt und entfernt werden, indem Sie auf den linken Rand der ersten Codezeile klicken. Sie können beliebig viele Haltepunkte hinzufügen.Geben Sie hier die Bildbeschreibung ein

Wenn ich versuche, eine Transaktion zu debuggen, das Kopieren des Transaktionshashs und das Klicken auf die start debuggingSchaltfläche nichts bewirkt, außer 0xc09ff6fb32dd6ef66f5691367c11c762c8f730aadeab065d57f8137cd3746bfc is not a contract invokation or contract creationin das Protokoll zu schreiben.

Sie können den truffle debugBefehl verwenden: http://truffleframework.com/blog/announcing-full-portable-solidity-debugger

Es unterstützt:

  • Code-Stepping (over, into, out, next, Anweisung usw.)
  • Aktueller Codestandort, einschließlich der Adresse des laufenden Vertrags
  • Haltepunkte
  • Ausdrücke ansehen
  • Variableninspektion (Stack, Memory und Storage)
  • Benutzerdefinierte Ausdrucksauswertung mit Solidity-Variablen

Zum Debuggen von Truffle-JavaScript-Tests in Visual Studio Code hat diese Antwort für mich funktioniert: https://ethereum.stackexchange.com/a/41096/3708

Die neueste Version von Truffle verfügt über einen eingebauten Debugger, der zum Debuggen des Status einer fehlgeschlagenen Transaktion verwendet werden kann.

$ truffle debug <transaction-id>

Wo <transaction-id>ist die ID der fehlerhaften Transaktion,

Sobald der Debugger gestartet ist, folgen Sie den Anweisungen zum Durchlaufen und Drucken des Variablenstatus usw

Erfahren Sie hier mehr: https://www.trufflesuite.com/blog/announcing-full-portable-solidity-debugger