Ich möchte ein Programm schreiben, das Folgendes tut:
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" ).
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.
EricEnticman
Nulik
Nulik
EricEnticman
Nulik
geth
verfügt zwar über Funktionen zum Verfolgen von Transaktionen, zum Überprüfen der API desdebug
Moduls, aber durch die Ausführunggeth
starten Sie einen Knoten, es sei denn, Sie verwenden --nodiscover