Wie fange ich an, eine Funktion zum Debuggen von Transaktionen zu schreiben?

Ich möchte ein Programm schreiben, das Folgendes tut:

  • für den angegebenen txhash debuggen Sie TraceTransaction und geben Sie das zurück

Was kann ich in Go tun?

Hast du Materialien, ein Tutorial oder kannst du mir Tipps geben, wie ich anfangen soll?

Ich möchte nur eine Ausgabe wie hier haben: https://rinkeby.etherscan.io/vmtrace?txhash=0xbb7323b02276aeed76b22fa50e2eefb76d5647560b8c15f23541ec5990d0e855 aber ich möchte dies in go tun und dies von "code" ausführen (zum Beispiel "go run x.go txhash" ).

Antworten (1)

Sie sollten cmd/geth-Quellen kopieren und Ihre eigene Binärdatei erstellen, die Ihr eigener Knoten wäre. Um ein Beispiel zu überprüfen, schauen Sie sich Folgendes an: https://github.com/Arachnid/etherquery , aber es ist ein alter Code und wird nicht mit der aktuellen Version von geth kompiliert, aber Sie werden eine Idee haben, wie Sie Dienste zum Stack hinzufügen können.

Sobald Ihre Node-Binärdatei voll funktionsfähig ist, schreiben Sie eine Funktion zum Verarbeiten von Blocktransaktionen, etwa so:

blockchain := ethereum.BlockChain()
block:=blockchain.GetBlockByNumber(uint64(383838))
statedb, err := blockchain.StateAt( blockchain.GetBlock( block.ParentHash(), block.NumberU64()-1).Root() )
if err != nil {
    return err
}

lcfg:=&vm.LogConfig{
    DisableMemory: false,
    DisableStack: false,
    DisableStorage: false,
    FullStorage: false,
}
vm_cfg:=&vm.Config{
    Debug: true,
    EnableJit: false,
    ForceJit: false,
}
gaspool:=new(core.GasPool).AddGas(block.GasLimit())
bconf:=blockchain.Config()
if bconf.DAOForkSupport && bconf.DAOForkBlock != nil && bconf.DAOForkBlock.Cmp(block.Number()) == 0 {
    misc.ApplyDAOHardFork(statedb)
}
for i, tx := range block.Transactions() {
    structLogger := vm.NewStructLogger(lcfg)
    vm_cfg.Tracer=structLogger
    statedb.Prepare(tx.Hash(), block.Hash(), i)

    receipt, gas, err := core.ApplyTransaction(bconf, blockchain, nil, gaspool, statedb, block.Header(), tx, totalUsedGas, *vm_cfg)
    if err != nil {
        return err
    }
    dump_StructLogs(statedb, tx, structLogger.StructLogs(), receipt)
}

wobei dump_StructLogs() Ihre Ausgabefunktion ist, die alle Anweisungen drucken soll.

Der obige Code wurde aus dem Ethereum-Quellcode selbst erstellt. Wenn Sie sich also damit befassen, werden Sie herausfinden, wie das geht.

Aber Sie bauen Anwendungen in Ihrem Fall. Wenn ich es aus dem Code ausführen möchte. Reicht es mir nicht, einen Wrapper in meinem Fall zu schreiben? (nur Paket von github importieren?)
@EricEnticman-Transaktionen werden alle 14 Sekunden eingefügt, daher muss ein Knoten ausgeführt werden, um neue Transaktionen zu erhalten. Sie könnten das Ausführen des Knotens vermeiden, wenn Sie die Datenbank selbst öffnen und die Blockchain-Daten daraus lesen. Auf diese Weise sind Sie nicht auf die Funktionalität des Knotens angewiesen, sondern jemand muss neue Transaktionen in diese Datenbank einspeisen. Außerdem sperrt LevelDB die Datenbank, sodass nur ein Prozess sie öffnen kann. Sie müssen den Sperrmechanismus umgehen, um tun zu können, was Sie wollen. Aber es ist möglich, zu tun, was Sie wollen, nur schwieriger zu codieren
state_processor.go und blockchain.go sind die Dateien, die die Funktionen enthalten, die Sie benötigen, um das zu tun, was Sie möchten. Versuchen Sie also, diese Dateien in Ihren Code aufzunehmen, und kopieren Sie dann, wenn Kompilierfehler auftreten, die Funktionen, die diese Dateien abfragen. Auf diese Weise könnten Sie den minimalen Code erstellen, der erforderlich wäre, um das zu tun, was Sie wollen. Aber noch einmal, irgendetwas muss eine neue Transaktion in die Level-DB einfügen, und ich habe keine Ahnung, wie Sie das beheben werden
Okay, aber wenn ich die Transaktionsverfolgung auf meiner lokalen privaten Blockchain ausführen möchte, zum Beispiel testrpc, muss ich dann meinen Knoten ausführen? Es besteht die Möglichkeit, in js eine Funktion zu schreiben, die den Ausführungs-Opcode zurückgibt? jetzt möchte ich etwas kleines machen, was ich lokal testen kann.
gethverfügt zwar über Funktionen zum Verfolgen von Transaktionen, zum Überprüfen der API des debugModuls, aber durch die Ausführung gethstarten Sie einen Knoten, es sei denn, Sie verwenden --nodiscover