¿Cómo podemos implementar un nuevo código de operación en la máquina virtual de Ethereum? Por ejemplo: quiero implementar una lógica de código de operación tal que el número de código de operación de esta operación sea 0x21. La implementación de EVM que estoy usando está en go-lang.
Solo puedo darte una guía general sobre cómo hacer esto:
1) Modifique core/vm/instructions.go
para agregar su código de instrucción, algo como:
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) Modifique core/vm/gas_table.go
para agregar el costo del gas para su instrucción, algo como esto:
func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
return GasFastestStep, nil
}
3) Modifique core/vm/jump_table.go
para agregar su nuevo código de operación de instrucción, algo como esto:
ADD: {
execute: opAdd,
gasCost: constGasFunc(GasFastestStep),
validateStack: makeStackFunc(2, 1),
valid: true,
},
4) Modifique core/vm/opcodes.go
para agregar su nuevo código de operación.
Eso debería ser. Esto es para geth 1.7.2, todavía no miré 1.8, así que no puedo decirlo.
Bueno, será difícil proporcionar una solución de copiar y pegar para esto. Sin embargo, para orientación:
Primero deberá comprender al menos cómo funciona el código en este módulo geth: https://github.com/ethereum/go-ethereum/tree/master/core/vm
opcodes.go / interpreter.go / evm.go son buenos puntos de entrada para comenzar.
V.Agarwal
V.Agarwal
Nulik