DeFi security Summit 2023 - Session 3: Network & VM - Hari Mulackal
三句話摘要
以太坊EVM中的設計怪癖與權衡:從信標鏈存款合約、返回數據複製指令到瞬態存儲的深度分析。 EVM的每個怪癖都源自真實的權衡考量,設計新功能時必須謹慎權衡效率、安全與一致性。 RETURNDATACOPY因Nick Johnson提議允許越界訪問返回獎勵,導致Solidity編譯器優化步驟產生漏洞,因為需額外檢查自動退出情況,此例示設計例外如何造成生態工具鏈的問題。
重點整理
重點- 1
RETURNDATACOPY因Nick Johnson提議允許越界訪問返回獎勵,導致Solidity編譯器優化步驟產生漏洞,因為需額外檢查自動退出情況,此例示設計例外如何造成生態工具鏈的問題。
- 2
瞬態存儲在交易層級設計引入內交易死鎖風險——若開發者為省gas跳過解鎖,同交易內再次調用時會被阻止,呼應「安全vs混亂」的設計權衡。
- 3
EVM移位指令刻意設置X shifted by Y而非Y shifted by X,源自gas優化(避免額外堆棧交換),但與除法等指令的直觀順序不一致,成為工具開發與調試的長期痛點。
- 4
EVM設計服務編譯器建造者、應用開發者、節點運營者多方使用者,需在效率、安全性、一致性間做出複雜取捨,且歷史遺留決策難以全面修正。
實用技巧與重點
乾貨- 信標鏈存款合約:500億美元,8個前導零,以tornado cash錢包部署
- RETURNDATACOPY:EIP-211提案,Nick Johnson (ENS)建議實現越界獎勵語義
- 瞬態存儲:解鎖操作成本100 gas,初始化為1以優化gas退款
- 重入鎖實現:標準做法在存儲中切換布林值 0→1→0,需防止合約卡死
- 移位指令:設計目的是避免額外的SWAP操作以節省gas成本
- EIP-1459:首次在協議層面正式燒毀ETH(通過基礎費用),區別於發送到黑洞地址
結論
結論“EVM的每個怪癖都源自真實的權衡考量,設計新功能時必須謹慎權衡效率、安全與一致性。”
完整解析
詳細講者以一個看似不可能的「無限金錢漏洞」開場——以太坊信標鏈的存款合約允許用戶存入ETH、運行驗證者、再提出ETH,但合約餘額卻始終只增不減。實際上這不是漏洞,而是設計的基本事實:提款在信標鏈上處理,執行層的存款合約從不真正減少,造成計算以太坊總供應量異常困難。
這個觀察引出核心議題——EVM充滿歷史累積的設計決策,許多看似不合理的規則都有其時代背景。RETURNDATACOPY指令便是典範。此指令對於Solidity的動態數據類型至關重要,但在越界訪問時表現異常:它返回獎勵值而非零值,違反EVM中其他指令的慣例。這個例外源自EIP-211提案時,ENS的Nick Johnson建議認為「越界不應該發生」,因此應直接獎勵而非返回零。看似一個小建議,卻導致Solidity編譯器的優化步驟產生漏洞——優化器在移除「不被讀取的內存寫入」時,必須額外檢查RETURNDATACOPY是否可能觸發越界獎勵,增加複雜性,且Go Ethereum實現中也因此指令產生多個EVM漏洞。
瞬態存儲(Transient Storage)EIP提案揭示另一類設計權衡。它類似普通存儲但僅在交易內生效,交易結束後自動清零,主要用於實現重入鎖。傳統做法用存儲變數記錄鎖狀態(初始化為1以優化gas退款),但若開發者忘記解鎖會造成永久死鎖。瞬態存儲看似更安全——即使忘記解鎖也因交易結束自動清理——但實際上引入了新問題:若為節省100 gas的解鎖成本而跳過解鎖,同一交易內再次調用合約時會產生「瞬態死鎖」,破壞開發者對交易原子性的心智模型。此例示「安全vs混亂」的兩難。
移位指令的操作數順序問題更具體。EVM中除法寫作X÷Y符合直覺,但移位卻反過來——Y shifted by X(而非X shifted by Y)。這個設計純粹為節省gas:避免額外的STACK交換指令。但這成為工具開發者的長期陷阱——多數人曾因此調試數小時才發現順序反轉。
講者強調,EVM必須服務編譯器建造者、應用開發者、節點運營者多方使用者,每方都有不同的優化目標(gas成本、安全性、性能)。設計任何新提案時,應深思熟慮其對整體生態的影響,因為一旦實現就難以更正。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

