Как мне начать писать функцию для отладки транзакции?

Я хочу написать программу, которая будет делать:

  • для данного txhash отладить TraceTransaction и вернуть это

Что я могу делать в Go?

У вас есть какие-либо материалы, учебник или вы можете дать мне советы о том, как начать?

Я просто хочу получить вывод, как здесь: https://rinkeby.etherscan.io/vmtrace?txhash=0xbb7323b02276aeed76b22fa50e2eefb76d5647560b8c15f23541ec5990d0e855 , но я хочу сделать это в go и запустить это из "кода" (например, "go run x.go txhash" ).

Ответы (1)

Вы должны скопировать исходники 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, поэтому, если вы покопаетесь в нем, вы узнаете, как это сделать.

Но вы строите приложения в своем случае. Если я хочу запустить его из кода. Не достаточно ли мне написать обертку в моем случае? (просто импортировать пакет из github?)
Транзакции @EricEnticman вставляются каждые 14 секунд, поэтому у вас должен быть работающий узел для приема новых транзакций. Вы можете избежать запуска узла, если сами откроете базу данных и прочитаете из нее данные блокчейна, таким образом, вы не будете зависеть от функциональности узла, но кто-то должен передавать новые транзакции в эту БД. Кроме того, LevelDB блокирует базу данных, поэтому ее может открыть только один процесс, поэтому вам придется обойти механизм блокировки, чтобы иметь возможность делать то, что вы хотите. Но можно делать то, что вы хотите, просто сложнее кодировать
state_processor.go и blockchain.go — это файлы, содержащие функции, необходимые для того, чтобы делать то, что вы хотите, поэтому попробуйте включить эти файлы в свой код, а затем, когда появятся ошибки компиляции, скопируйте функции, которые запрашивают эти файлы, таким образом вы можете создать минимальный код, который потребуется для выполнения того, что вы хотите. но опять же, что-то должно вставлять новую транзакцию в базу данных уровня, и я понятия не имею, как вы собираетесь это исправить.
Хорошо, но если я хочу запустить трассировку транзакций в моем локальном частном блокчейне, например testrpc, нужно ли мне тогда запускать свой узел? Есть возможность написать на js какую-нибудь функцию, которая возвращает код операции execute? сейчас я хочу сделать что-то маленькое, что я смогу протестировать локально.
gethимеет функции для отслеживания транзакций, проверки API модуля debug, но при выполнении gethвы запускаете узел, если вы не используете --nodiscover