Я хочу написать программу, которая будет делать:
Что я могу делать в Go?
У вас есть какие-либо материалы, учебник или вы можете дать мне советы о том, как начать?
Я просто хочу получить вывод, как здесь: https://rinkeby.etherscan.io/vmtrace?txhash=0xbb7323b02276aeed76b22fa50e2eefb76d5647560b8c15f23541ec5990d0e855 , но я хочу сделать это в go и запустить это из "кода" (например, "go run x.go txhash" ).
Вы должны скопировать исходники cmd/geth и создать свой собственный двоичный файл, который будет вашим собственным узлом. Чтобы проверить пример, посмотрите на это: https://github.com/Arachnid/etherquery , но это старый код и он не будет компилироваться с текущей версией geth, однако у вас будет представление о том, как добавить службы в стек.
Как только у вас полностью заработает двоичный файл узла, вы пишете функцию для обработки блочных транзакций, что-то вроде этого:
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)
}
где dump_StructLogs() — ваша функция вывода, которая должна печатать все инструкции.
приведенный выше код был создан из самого исходного кода Ethereum, поэтому, если вы покопаетесь в нем, вы узнаете, как это сделать.
Эрик Энтикман
Нулик
Нулик
Эрик Энтикман
Нулик
geth
имеет функции для отслеживания транзакций, проверки API модуляdebug
, но при выполненииgeth
вы запускаете узел, если вы не используете --nodiscover