¿Cómo podemos implementar un nuevo código de operación en la máquina virtual de Ethereum?

¿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.

Respuestas (2)

Solo puedo darte una guía general sobre cómo hacer esto:

1) Modifique core/vm/instructions.gopara 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.gopara 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.gopara 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.gopara 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.

También había hecho estos pasos antes, pero me había perdido el segundo paso. Muchas gracias.
También me pueden orientar sobre cómo verificar si la modificación que había hecho es correcta
eso es fácil, procesa toda la cadena de bloques desde el bloque 0 hasta hoy, si obtienes el mismo bloque.Root() al final, entonces no rompiste el código de Ethereum. Después de eso, puede probar su instrucción para entrar en pánico.

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.