Go-Ethereum
makeLog 指令函式是否是操作碼?
以下程式碼片段是
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*()
元函式返回的函式將執行單個操作碼的工作,因此與文件中的其他函式處於同等地位。