EVM instrumentieren

Ich brauche alle vertragsinternen Transaktionen . Dazu muss ich Ethereum EVM instrumentieren.

Meine Frage ist: Was soll ich tun, um die Transaktionsdetails zu erhalten? Im Moment schaue ich auf den Code, aber wenn mich jemand auf den richtigen Teil des Codes verweisen kann, wird es geschätzt.

Verbesserungsvorschläge für Fragen: (1) Geben Sie an, was Sie mit „vertragsinternen Transaktionen“ meinen. (2) Fügen Sie einen Link zu dem Code (Teil des Codes) hinzu, den Sie sich ansehen.
Ich suche ein go-ethereum-Projekt in GitHub: github.com/ethereum/go-ethereum
Ja ich war da. Ich suche jemanden, der es getan hat, um die Aufgabe zu vereinfachen.

Antworten (1)

Dazu müssen Sie einen VM-Protokollsammler definieren, der StructLogCollector implementiert . Diese Funktion wird bei jedem Schritt der VM aufgerufen und erhält Kopien des Arbeitsspeichers, des Stapels und geänderter Teile des Speichers, zusammen mit dem Programmzähler, dem aktuellen Opcode, dem verbleibenden Gas und anderen Daten. Es wird auch aufgerufen, wenn ein Fehler auftritt, der dazu führt, dass eine Transaktion fehlschlägt.

Um die gewünschten Daten zu extrahieren, müssen Sie auf mehrere Dinge achten: 'CREATE', 'CALL', 'CALLCODE' und 'DELEGATECALL' Opcodes, die neue Verträge oder Konten aufrufen und möglicherweise Werte übertragen, und 'SUICIDE', das Werte zurückgibt zum Anrufer. Sie müssen auch auf alles achten, was dazu führt, dass ein Anruf zurückkehrt, und auf die oben genannten Fehler.

Während der Ablaufverfolgung müssen Sie einen Stapel verwalten, der den Stapel der von der aktuellen Transaktion getätigten Aufrufe darstellt, wobei jeder Stapelrahmen eine Liste der bisher durchgeführten Wertübertragungen enthält. Eine Nicht-Fehler-Rückgabe öffnet einen Stack-Frame und fügt alle seine Wertübertragungen dem darunter liegenden Frame hinzu. Eine Fehlerrückgabe lässt den Rahmen erscheinen und verwirft alle Übertragungen. Wenn Sie den letzten Frame öffnen, sind die darin enthaltenen Übertragungen diejenigen, die als Teil der Transaktion abgeschlossen wurden.

Eine Implementierung all dessen kann als Teil meines Etherquery-Codes angesehen werden .