Go-Ethereum

我們如何在乙太坊虛擬機中實現新的操作碼。

  • June 19, 2018

我們如何在乙太坊虛擬機中實現新的操作碼。例如:我想實現一個操作碼邏輯,使得該操作的操作碼編號為 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
}
  1. 修改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所以不知道。

引用自:https://ethereum.stackexchange.com/questions/51580