Как мы можем внедрить новый код операции в виртуальную машину Ethereum. Например: я хочу реализовать логику кода операции, чтобы номер кода операции этой операции был 0x21. Реализация EVM, которую я использую, находится на языке go-lang.
Я могу только дать вам общее руководство о том, как это сделать:
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 еще не смотрел, так что не могу сказать.
Что ж, для этого будет сложно предоставить решение для копирования и вставки. Однако для ориентации:
Сначала вам нужно хотя бы понять, как работает код в этом модуле geth: https://github.com/ethereum/go-ethereum/tree/master/core/vm .
opcodes.go/interpreter.go/evm.go — хорошие точки входа для начала.
В.Агарвал
В.Агарвал
Нулик