Safe Upgrades, The Most Dangerous Game - Daniel Von Fange, DeFi Security Summit 2023
三句話摘要
智能合約升級的三個關鍵實踐,以及如何避免導致資金鎖定的災難性失敗。 升級協議的核心是確保新代碼與現存環境兼容,而非僅驗證代碼本身正確;使用自動化存儲檢查、原子化部署和分叉模糊測試,能將升級風險從災難級別降至可控水平。 新代碼與升級代碼的根本區別:編寫新協議時,代碼獨立存在,審計後正確就足夠;但升級現有協議時,新代碼必須與整個現存的狀態、配置、內部合約及外部依賴相容,這正是 Ave 和 Compound 升級失敗的根本原因。
重點整理
重點- 1
新代碼與升級代碼的根本區別:編寫新協議時,代碼獨立存在,審計後正確就足夠;但升級現有協議時,新代碼必須與整個現存的狀態、配置、內部合約及外部依賴相容,這正是 Ave 和 Compound 升級失敗的根本原因。
- 2
存儲槽位誤用的災難性後果:智能合約變數被編譯到編號的存儲槽位,若升級時改變了變數順序,會導致存儲槽位對應錯亂,管理員地址可能被讀成利率等完全不同的數據,協議控制權失效。必須使用 OpenZeppelin 或 Foundry 的自動檢查工具集成到 CI 流程。
- 3
原子化程序化部署:將所有部署、配置和治理操作定義在單一文件中,使它們在一個交易內原子性執行,避免用戶在部署過程中接觸到不一致的狀態。
- 4
分叉測試的三層價值:在真實區塊鏈副本上測試新代碼、編寫針對 fork 環境的持續測試、進行百萬次隨機模糊測試來發現邊界情況,比形式化驗證更實用,能在上線前暴露與依賴協議的交互問題。
實用技巧與重點
乾貨- 案例數據:
- Ave:DeFi 第二大協議,TVL 80 億美元,升級失敗導致 1.2 億美元鎖定 7 天以上
- Compound:升級達 10 億美元規模,經三次審計仍被凍結 7 天以上
- Origin Protocol:完成 50+ 次升級,零黑客攻擊、零資金損失、零凍結
- 工具名稱:
- OpenZeppelin JavaScript 存儲檢查工具
- Foundry Storage Check
- Foundry 內置模糊測試
- 關鍵步驟:
- 第一步:讀 Solidity 官網存儲布局規則
- 第二步:自動檢查工具集成到 CI 流程,每個 PR 對比存儲槽位
- 原子化部署:編寫統一部署文件,本地模擬治理操作
- 分叉測試:在區塊鏈副本上運行新代碼,進行模糊測試
- 架構最佳實踐:
- Uniswap V2 模式:將協議拆分為安全關鍵部分(資金池轉移邏輯)和複雜部分(路由器),集中安全檢查範圍
結論
結論“升級協議的核心是確保新代碼與現存環境兼容,而非僅驗證代碼本身正確;使用自動化存儲檢查、原子化部署和分叉模糊測試,能將升級風險從災難級別降至可控水平。”
完整解析
詳細升級運行中的智能合約協議是加密領域最容易被忽視但風險最大的操作。講者 Daniel Von Fange(Origin Protocol 安全專家)以最近的真實災難開場:Ave 作為第二大 DeFi 協議,TVL 達 80 億美元,因一次升級部署出錯導致 1.2 億美元資金被鎖定超過一週;Compound 在三次審計後仍遭遇類似問題,被凍結一週多。雖然這些項目後來都恢復了,但事件暴露了一個普遍現象:即使是優秀的團隊也會在升級時失手。
這個問題的根源在於升級與新開發的本質區別。當你編寫一個全新的協議時,代碼在真空中獨立存在,審計人員可以完整理解所有邏輯,審計無誤就代表代碼正確。但升級不同——新代碼必須部署到一個已經充滿了狀態數據、配置參數、運行中的內部合約以及與外部生態交互的複雜環境裡。Ave 和 Compound 的失敗都不是因為新代碼本身有漏洞,而是新代碼與現存環境的不兼容。講者強調,大多數開發者在升級時只考慮新代碼清單,但實際上需要理解和兼容整個現存的「狀態和合約的雲」。
針對這個挑戰,講者提出三個必備實踐。首先是防止存儲槽位誤用。在 EVM 中,合約的狀態變數被編譯到編號的存儲槽位(slot 0、slot 1 等),變數名稱與實際執行無關。若升級時改變了變數宣告的順序,編譯器會將舊代碼中的管理員地址映射到新代碼中利率參數所在的槽位,讀取時會得到完全錯誤的值,協議控制權立刻失效。解決方案是使用 OpenZeppelin 的 JavaScript 存儲檢查工具或 Foundry Storage Check,將它們整合到 CI 流程中,確保每個提交都自動檢查是否改變了存儲槽位。
第二個實踐是原子化程序化部署。典型的升級分為兩個階段:部署者創建新合約並轉移所有權給治理系統,然後治理系統執行切換。問題是,如果這兩個階段之間發生任何變化,用戶可能會接觸到不一致的狀態。正確的做法是將所有操作(部署、配置、治理決策、切換)定義在單一文件中,在本地模擬整個過程反復測試,最終在一個原子交易內執行所有操作。
第三個實踐是分叉測試,講者認為這是智能合約開發中被嚴重低估的工具。分叉允許你複製整個區塊鏈狀態,部署新代碼,像升級已經發生一樣運行完整的交易流。這帶來三層價值:能在真實環境中測試新代碼,能編寫像單元測試一樣的 fork 環境測試並集成到 CI 系統,以及能進行百萬次隨機模糊測試來發現邊界問題。Foundry 內置了模糊測試功能,當模糊測試器遇到未知數據時會通過 RPC 從區塊鏈獲取,從而能測試與 Ave、Compound 等外部協議的真實交互。講者指出,即使只運行 10,000 筆交易,也比 Compound 升級前的測試數量多 10,000 倍。
講者最後強調,精簡安全關鍵代碼(如 Uniswap V2 的資金池合約)並將複雜性隔離到非關鍵部分(如路由器),既是優秀設計,也是升級時的最佳實踐。Origin Protocol 本身已完成 50 多次升級,零事故記錄,正是因為堅持了這些原則。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

