DeFi Security 101 2023 - 11 - Ernesto Boado
三句話摘要
區塊鏈協議開發中的形式驗證應用:從被動審計到主動保證。 形式驗證的核心價值在於從「被動發現已知漏洞」轉變為「主動防範未知風險」,通過定義與驗證系統的不變性在開發流程中早期發現隱蔽錯誤,並提升整個團隊對代碼安全性的信心。 Aave 系統的複雜性超出想像:協議不僅是流動性提供,還整合治理系統、智能合約部署、激勵管理、安全模組和穩定幣。開發團隊上線後才意識到只理解系統的 50%,剩餘部分由真實用戶使用方式決定,這使傳統測試無法窮盡所有可能。
重點整理
重點- 1
Aave 系統的複雜性超出想像:協議不僅是流動性提供,還整合治理系統、智能合約部署、激勵管理、安全模組和穩定幣。開發團隊上線後才意識到只理解系統的 50%,剩餘部分由真實用戶使用方式決定,這使傳統測試無法窮盡所有可能。
- 2
形式驗證填補了測試與審計的根本缺口:即使經頂級安全公司審計,也會遺漏開發者從未想到的邊界情況。形式驗證通過定義系統必須滿足的數學性質(屬性),自動驗證代碼是否違反,從而發現這些「隱蔽錯誤」。
- 3
改變開發實踐的三大效果:開發者被迫提前定義自然語言屬性,促進更好的文檔與內部溝通;屬性檢查在開發過程中執行,能在 PR 階段發現破壞系統不變性的改動;對於可升級系統(如 Aave Token),明確的屬性定義給團隊足夠信心進行大幅改動。
- 4
適用性有明確邊界:最佳場景是有會計邏輯(代幣轉帳)和複雜資產流動的系統;不適用於純任意邏輯、跨鏈互操作複雜、或小型治理提案。應精準選擇應用範圍,而非盲目全面投入。
實用技巧與重點
乾貨- Aave 協議架構:流動性協議、治理系統、智能合約部署系統、激勵管理系統、安全模組、穩定幣
- 安全檢查完整流程:
- 單元測試 → 集成測試 → 同行評審 → 外部安全審計 → 形式驗證
- 形式驗證三大適用場景:
- 記賬系統(代幣、流動性協議)— 邊界情況難以測試,屬性檢查可保證會計正確性
- 複雜資產流動系統(五協議間的資金轉移)— 可定義清晰的平衡約束
- 非對稱系統(用戶可選啟用/停用抵押品)— 狀態組合呈指數增長,手工測試覆蓋不全
- 不適用場景:純任意邏輯、跨鏈互操作性複雜、小型治理提案
- 實際案例:
- Aave Token 升級:移除快照機制降低 Gas 費,用形式驗證確保委託與會計正確
- Governance V3:跨鏈狀態機,需驗證七個狀態間的所有可能轉移
- 驗證效能:單個屬性檢查可覆蓋與 100 個不同測試場景相同的效用
- 開發流程改進:屬性檢查在 PR 審查階段執行,能立即發現代碼改動是否破壞不變性
結論
結論“形式驗證的核心價值在於從「被動發現已知漏洞」轉變為「主動防範未知風險」,通過定義與驗證系統的不變性在開發流程中早期發現隱蔽錯誤,並提升整個團隊對代碼安全性的信心。”
完整解析
詳細Aave 協議的複雜性遠超大眾對「流動性協議」的認知。它不僅提供借貸功能,而是一個完整的金融生態,包含五大子系統:核心流動性協議讓用戶質押資產並借貸;治理系統控制協議升級和決策;智能合約部署系統執行治理決議;激勵管理系統分配獎勵;安全模組在協議遭攻擊時通過扣除代幣來補償。這種多層結構加上用戶可選擇啟用/停用抵押品這類非對稱性設計,導致系統的狀態空間呈指數級增長。開發團隊的坦誠承認是關鍵:系統上線後,他們對自己構建的系統的理解度只有 50%,剩下的 50% 由真實用戶的使用方式決定。
正因為這種根本的不可預測性,傳統的安全檢查流程——單元測試、集成測試、同行評審、外部審計——都陷入了同一個窘境:它們依賴開發者和審計者主動想象邊界情況。但在指數級的狀態空間中,這種「想象式」檢查必然遺漏。即使是頂級安全公司也會遺漏某些場景,因為那些邊界情況往往源自開發者從未想過的狀態組合——這被稱為「隱蔽錯誤」。
形式驗證提供了根本不同的保證機制。它要求開發者不是預測邊界情況,而是定義系統在任何情況下都必須滿足的數學性質(例如「代幣總供應量不變」「用戶余額非負」)。然後工具自動驗證代碼是否可能違反這些性質。這種方法的妙處在於:它不依賴於開發者的想象力,而是依賴於系統的根本約束。一個屬性檢查可以替代數百個手工編寫的測試場景,因為它覆蓋的是所有可能的代碼執行路徑,而非枚舉式的測試用例。
採用形式驗證還改變了開發實踐本身。在編寫代碼之前,開發者被迫用自然語言定義系統應該滿足的屬性。這似乎是額外工作,但實際上它促進了更清晰的思維:團隊成員圍繞屬性進行討論,達成對系統行為的共識。更重要的是,屬性檢查不是事後的驗收測試,而是整合在開發流程中的——每當有人提交 PR,屬性檢查會立即運行,若發現改動破壞了某個屬性,整個團隊會立即知道。這種「早期發現」的威力在複雜系統中尤其明顯。開發者在高層次思考時往往忽視低層次的狀態轉移細節(比如遺漏某個鍵的初始化),但屬性檢查會毫不留情地指出每一個不變性違反。對於需要頻繁升級的系統(如 Aave Token),這種保證尤其寶貴,因為大規模重構時開發者有信心知道自己是否意外破壞了什麼。
然而,形式驗證並非銀彈。演講者強調了明確的適用邊界。首先是記賬系統(代幣轉帳、流動性池):這類系統的邊界情況有限但難以測試——例如浮點精度問題、溢出、餘額不一致。形式驗證可以數學上保證這些永遠不會發生。其次是複雜的資產流動系統(如 Aave 內部五個協議間的資金轉移):可以定義清晰的全局平衡約束(「流入=流出」),形式驗證會確保任何代碼改動都不會破壞這個約束。相反,三類場景不值得投入:純任意邏輯系統(無法定義有意義的屬性,因為什麼都可能發生);跨鏈互操作性複雜的系統(設置本身就複雜,邊界難以定義);小型治理提案的執行邏輯(成本高但收益低)。這要求開發者精準評估,而非盲目全面應用。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

