Как мы можем внедрить новый код операции в виртуальную машину Ethereum.

Как мы можем внедрить новый код операции в виртуальную машину Ethereum. Например: я хочу реализовать логику кода операции, чтобы номер кода операции этой операции был 0x21. Реализация EVM, которую я использую, находится на языке go-lang.

Ответы (2)

Я могу только дать вам общее руководство о том, как это сделать:

1) Измените core/vm/instructions.go, чтобы добавить свой код инструкции, например:

func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
    x, y := stack.pop(), stack.pop()
    stack.push(math.U256(x.Add(x, y)))

    evm.interpreter.intPool.put(y)

    return nil, nil
}

2) Измените core/vm/gas_table.go, чтобы добавить стоимость газа для вашей инструкции, примерно так:

func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
    return GasFastestStep, nil
}

3) Измените core/vm/jump_table.go, чтобы добавить новый код операции инструкции, примерно так:

    ADD: {
        execute:       opAdd,
        gasCost:       constGasFunc(GasFastestStep),
        validateStack: makeStackFunc(2, 1),
        valid:         true,
    },

4) Измените core/vm/opcodes.go, чтобы добавить новый код операции.

Это должно быть так. Это для гет 1.7.2, 1.8 еще не смотрел, так что не могу сказать.

Я делал эти шаги и раньше, но я пропустил 2-й шаг. Большое спасибо.
Можете ли вы также подсказать мне, как проверить правильность сделанной мной модификации?
это легко, обработайте всю цепочку блоков от блока 0 до сегодняшнего дня, если вы получите тот же блок.Root() в конце, то вы не нарушили код Ethereum. После этого вы можете протестировать свою инструкцию на предмет паники.

Что ж, для этого будет сложно предоставить решение для копирования и вставки. Однако для ориентации:

Сначала вам нужно хотя бы понять, как работает код в этом модуле geth: https://github.com/ethereum/go-ethereum/tree/master/core/vm .

opcodes.go/interpreter.go/evm.go — хорошие точки входа для начала.