How can we implement a new opcode in the Ethereum Virtual Machine. For eg : I want to implement an opcode logic such that the opcode number of this operation is 0x21. The EVM-implementation I am using is in go-lang.
I can only give you a general guide on how to do this:
1) Modify core/vm/instructions.go
to add your instruction code, something like:
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) Modify core/vm/gas_table.go
to add the gas cost for your instruction, something like this:
func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
return GasFastestStep, nil
}
3) Modify core/vm/jump_table.go
to add your new instruction opcode, something like this:
ADD: {
execute: opAdd,
gasCost: constGasFunc(GasFastestStep),
validateStack: makeStackFunc(2, 1),
valid: true,
},
4) Modify core/vm/opcodes.go
to add your new opcode.
That should be it. This is for geth 1.7.2, I didn't look at 1.8 yet so can't tell.
-
I had done this steps earlier as well but I had missed the 2nd step. Thank you so much. – V.Agarwal Jun 26 '18 at 3:16
-
Can you also guide me on how to check whether the modification I had done is correct – V.Agarwal Jun 26 '18 at 3:29
-
that's easy, process the whole blockchain from block 0 until today, if you get the same block.Root() at the end then you didn't break Ethereum's code. After that you can test your instruction for go panics – Nulik Jun 26 '18 at 12:28
Well, it will be difficult to provide a copy&paste solution for this. However, for orientation:
You'll first have to at least understand how the code in this geth module works: https://github.com/ethereum/go-ethereum/tree/master/core/vm
opcodes.go / interpreter.go / evm.go are good entry points to start with.