Go-Ethereum

makeLog 指令函式是否是操作碼?

  • September 29, 2017

以下程式碼片段是instructions.go文件的組成部分,我們的謊言opCodes都在其中。

// make log instruction function
func makeLog(size int) executionFunc {
   return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
       topics := make([]common.Hash, size)
       mStart, mSize := stack.pop(), stack.pop()
       for i := 0; i < size; i++ {
           topics[i] = common.BigToHash(stack.pop())
       }

       d := memory.Get(mStart.Int64(), mSize.Int64())
       evm.StateDB.AddLog(&types.Log{
           Address: contract.Address(),
           Topics:  topics,
           Data:    d,
           // This is a non-consensus field, but assigned here because
           // core/state doesn't know the current block number.
           BlockNumber: evm.BlockNumber.Uint64(),
       })

       evm.interpreter.intPool.put(mStart, mSize)
       return nil, nil
   }
}

// make push instruction function
func makePush(size uint64, pushByteSize int) executionFunc {
   return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
       codeLen := len(contract.Code)

       startMin := codeLen
       if int(*pc+1) < startMin {
           startMin = int(*pc + 1)
       }

       endMin := codeLen
       if startMin+pushByteSize < endMin {
           endMin = startMin + pushByteSize
       }

       integer := evm.interpreter.intPool.get()
       stack.push(integer.SetBytes(common.RightPadBytes(contract.Code[startMin:endMin], pushByteSize)))

       *pc += size
       return nil, nil
   }
}

// make push instruction function
func makeDup(size int64) executionFunc {
   return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
       stack.dup(evm.interpreter.intPool, int(size))
       return nil, nil
   }
}

// make swap instruction function
func makeSwap(size int64) executionFunc {
   // switch n + 1 otherwise n would be swapped with n
   size += 1
   return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
       stack.swap(int(size))
       return nil, nil
   }

問題是,這些make log instruction functions本身是操作碼嗎?

如果它們是——為什麼不這樣稱呼它們?

如果不是,他們在與所有的文件一起生活在做什麼opCodes

不確定我是否完全理解你的問題,但這是我的觀察結果……

您列出的四個make*函式處理的操作碼與其他 EVM 操作碼不同,因為它們都是更廣泛的操作碼系列的一部分:

  • makeLog()``LOG0通過處理操作碼LOG4
  • makePush()``PUSH1通過處理操作碼PUSH32
  • makeDup()``DUP1通過處理操作碼DUP16
  • makeSwap()``SWAP1通過處理操作碼SWAP16

這與文件中的其他函式不同,每個函式只處理一個操作碼及其堆棧操作數。

此外,LOG*操作碼特別不尋常,因為每個操作碼消耗不同數量的堆棧操作數:LOG0消耗 2,LOG4消耗 6。所以這也需要處理。

最後,每個make*()元函式返回的函式將執行單個操作碼的工作,因此與文件中的其他函式處於同等地位。

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