Calldata
Calldata 是合約被呼叫時交給它的唯讀輸入——這則訊息說明要執行哪個函式、帶哪些引數。當你在錢包裡點下「swap」時,錢包建構並送出的位元組就是 calldata。EVM 把它們以一個不可變的位元組陣列交給合約,程式碼能檢視卻永遠不能更改,與合約自身的記憶體或儲存分開。
它的結構遵循 ABI 編碼。前四個位元組是函式選擇器:函式簽章的 Keccak-256 雜湊的前四個位元組,例如 transfer(address,uint256)。合約的分派器以這四個位元組比對,決定要呼叫哪個函式。選擇器之後是引數,各自補位並排在 32 位元組的邊界上(bytes、陣列這類動態型別則以偏移量與長度編碼)。三個操作碼能存取它:CALLDATALOAD 讀取某偏移處的 32 位元組字,CALLDATASIZE 給出總長度,CALLDATACOPY 把某段範圍複製進記憶體。
Calldata 是提供成本最低的資料區:零位元組每個 4 gas、非零位元組每個 16 gas(EIP-2028 把非零成本從 68 降下來)。由於它是唯讀且短暫的——永不留存、永不可改——把陣列或字串參數標為 calldata 而非 memory 的函式,能省去一次昂貴的複製,這是外部函式的標準 gas 最佳化。
Calldata 因彙整(rollup)而變得格外重要。樂觀型或 ZK 彙整把大量 L2 交易壓縮後貼到以太坊上,歷來以 L1 calldata 的形式,因為那是保證資料可得、讓任何人都能重建或挑戰 L2 狀態的最便宜方式。calldata 偏高的相對成本,事實上正是 EIP-4844 blob 的主要推手——那是一條專為彙整打造、更便宜的資料通道。
四位元組的選擇器只是某個雜湊的前四個位元組,因此不同函式可能碰撞到相同的選擇器;工具會維護選擇器資料庫,而代理合約必須防範管理函式與使用者函式共用同一個選擇器。