Gas 計量
Gas 計量是 EVM 為運算收費的方式。每個操作碼都有以「gas」計價的價格——gas 是衡量運算工作量的單位——隨著交易執行,EVM 會從寄送者事先設定的預算中扣除這個價格。可以把它想成計程車的計費表:運算跑得越久、越吃力,跳表跳得越多,錢一旦用完,行程就停止。這解決了一個根本問題——若運算沒有成本,惡意合約就能無限迴圈、凍結整個網路。
在任何操作碼執行前,交易要先付固有 gas(intrinsic gas):一筆基本交易固定 21,000,再加上每個 calldata 位元組的費用(依 EIP-2028,零位元組每個 4 gas、非零位元組每個 16 gas)。接著逐個操作碼執行。成本範圍極廣:瑣碎的算術 3 gas,一個 JUMPDEST 只要 1,而把一個為零的儲存槽寫成非零的 SSTORE 要 20,000。記憶體以二次式的擴張項計費,而自 EIP-2929 起,交易中對某個儲存槽或帳戶的首次(「冷」)存取,比之後(「熱」)的存取貴得多(冷 SLOAD 為 2,100 gas,熱的為 100)。
寄送者會指定 gas 上限(gas limit)——他們願意允許的最大 gas。若執行在上限之內結束,未用的 gas 會退還;若觸及上限,EVM 拋出 out-of-gas 例外,回滾該交易的所有狀態變更,但仍把已花掉的 gas 留作網路已執行工作的報酬。這種不對稱是刻意的:它讓垃圾攻擊即使失敗也代價高昂。
某些操作會給予 gas 退款以鼓勵清理狀態,最著名的就是把儲存槽清回零。為防濫用(例如囤積退款的「gas token」),EIP-3529 把退款總額上限訂為交易已用 gas 的五分之一,並移除了 SELFDESTRUCT 的退款。因此 gas 計量同時是一種安全機制、一道 DoS 防線,也是費用市場的基礎。
計量負責計算 gas_used;費用市場再乘上每單位 gas 的價格。
Gas(工作量)與 gas 價格(每單位支付的 ETH)是兩回事。交易費用是已用 gas 乘以每單位 gas 的價格,因此計量固定了工作量,費用市場則決定價格。