Go-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 }
- 修改
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
以添加您的新操作碼。應該是這樣的。這是針對geth 1.7.2的,我還沒有看過1.8所以不知道。