Evm
乙太坊方法執行開始時的程序計數器是什麼?
當呼叫已部署合約中的方法時(通過外部控制的賬戶或另一個智能合約),程序計數器在方法呼叫開始時會是什麼?換句話說:程式碼執行將從哪裡開始,乙太坊客戶端和其他合約如何知道不同方法在 EVM 中的位置?
程序計數器在執行開始時始終為 0。合約在合約執行開始時通過 switch 語句(跳轉表)設置程序計數器以匹配正確的方法呼叫。操作碼(堆棧上的
CALLDATALOAD
參數為 0x00)獲取方法呼叫的輸入數據到堆棧上。方法呼叫的第一個輸入數據是方法簽名,它是SHA3(<methodname>(methodArgumentType))
.對於
transfer
以 uint8 作為參數呼叫的方法,這將是前四個字節(大端,最左邊的字節,SHA3('transfer(uint8)')
其中是“0x865645aa”。SHA3 函式輸入的文本字元串被編碼為 ASCII。將函式簽名與該合約中可用方法的函式簽名進行比較,然後通過條件跳轉指令(JUMPI)將控制權交給該方法。
呼叫合約方法的呼叫約定在合約 ABI 規範中定義。
合約開頭的類似 switch 的語句是 Solidity 編譯器如何將控制權交給正確的方法。如果您編寫自己的編譯器或自己的 EVM,重要的是遵循合約 ABI 規範(如果您希望其他人、程序和合約能夠輕鬆地與您的程式碼互動)。