撰文:Daejun Park
編譯:aididiaojp.eth,Foresight News
在可預見的未來,ERC-4626 金庫有可能成爲 DeFi 的重要組成部分。
隨着 DeFi 不斷發展並逐漸成熟,开發人員的首要考慮是可擴展的基礎設施和可組合性。用於構建基於以太坊的應用程序的標准化工具包 ERC 一直發揮着重要作用。例如廣泛使用的代幣標准 ERC-20 爲开發人員提供一致的指導方針,讓他們無需從頭开始就可以爲生態系統做出貢獻。今年早些時候,爲了鼓勵收益型代幣之間的交叉兼容性,代幣化金庫標准 ERC-4626 被推出。除此之外,ERC-4626 還可以解決緊迫的可組合性問題,使協議集成更容易,減少出錯幾率。
目前已經有一些 DeFi 項目爲了提高其金庫的可組合性,採用了該標准,我們預計整個生態系統將得到更廣泛的採用。然而,調整現有的金庫確實會帶來一些痛苦,至關重要的是某些實施錯誤可能被暴露,成爲新的攻擊目標。即使是很小的錯誤(小到對使用界面的誤解)也會對安全和用戶體驗產生重大影響,因此還需要更多的安全工具和措施,特別是在更可組合的 DeFi 生態系統中。
如果在被攻擊之前就檢測到簡單的錯誤,則可以提供相對簡單的解決方案,理想情況下甚至在部署之前就能進行檢查。爲此,我們發布了用於模糊測試和符號執行的 ERC-4626 屬性測試,以幫助金庫構建者檢測可能破壞集成或導致漏洞的標准違規行爲。這篇文章解釋了激勵問題,介紹了檢測方法,並在結尾處提到一些可行的建議。
ERC-4626 標准的背景
ERC-4626 於 3 月被推出,是一套代幣化金庫的標准,旨在擴展廣泛使用的 ERC-20 標准,推動跨收益金庫的標准化,並確保需要與其交互的應用程序和協議(例如收益聚合器)的可組合性。這意味着爲了與任何其他 ERC-4626 金庫一起使用,在 ERC-4626 金庫上構建的任何應用程序都可以輕松擴展。
金庫代幣化後,能夠允許用戶自由存入資產來鑄造金庫代幣,然後贖回這些代幣從金庫中提取本金和利息。這些金庫代幣是 ERC-20 代幣,可以輕松被交易或用作抵押以借入其他資產。例如,用戶可以將他們的資產存入 Yearn 金庫以鑄造 yVault 代幣,然後在 Uniswap 上進行交易、抵押以獲得額外收益,也可以用作貸款協議的抵押品。
產生、分配收益以及確定代幣價格的邏輯可能因實際情況而異。爲了覆蓋盡可能多的金庫,ERC-4626 標准側重於構建用戶界面,而大部分實現細節未確定。只要金庫滿足接口的特定要求,就能夠允許業務邏輯的變化,實現跨許多不同類型的應用程序和 ERC-4626 金庫類型的互操作性。
隨着越來越多的代幣化金庫被創建,我們希望看到它們從一开始就按照 ERC-4626 標准實施。但我們目前處於某種過渡階段,爲了符合標准,开發人員將需要以更大可組合性的方式來更新現有的金庫、應用程序和協議,他們也面臨着許多復雜挑战。
標准一致性的挑战
遵循新標准並不總是那么簡單。每個 ERC-4626 金庫都必須忠實且准確地實現所描述的標准要求,否則爲了應對不同的變化,集成會變得越來越復雜。這種復雜性使集成天生容易出錯。並且由於它們沒有足夠安全測試,隨着時間的推移可能會導致系統漏洞。
爲了安全地處理不同的行爲,非 ERC-20 標准代幣需要許多 DeFi 系統在執行代幣轉移時使用額外的金庫。例如 Tether USD 在執行代幣轉移時需要額外用到 SafeERC-20。
這意味着如果系統的設計不能正確處理「丟失退貨」的情況,任何與這些代幣交互的系統都可能變得脆弱。這些場景可能會引入一個常見的安全陷阱,並增加整體开發和維護成本。因此,符合標准不僅對個人至關重要,而且對整個生態系統的安全也至關重要,單個系統或依賴項中的一個漏洞就可能會導致廣泛的問題。
理想情況下,標准將被明確地正式指定,並且每個實現都可以根據標准規範進行正式驗證。然而在實踐中需要社區的努力且需要一定的費用或時間成本,這在短時間內並不容易實現。
通過引入可執行的 ERC-4626 屬性,識別一致性問題
當我們朝着理想狀態努力,每個金庫都根據嚴格的正式規範進行了正式驗證時,爲了捕捉標准要求的微妙、容易遺漏的細節中的差異,我們編寫了 ERC-4626 標准屬性。
爲了檢測其實施中潛在的標准違規行爲,代幣化金庫的开發人員可以在部署之前運行測試。金庫集成商可以檢查給定的金庫是否符合標准,然後再將它們集成到他們的系統中。針對已經部署在主網上的實時金庫,也可以通過主網分叉測試的方式進行測試。爲了確保所有系統參數都已正確設置,尤其是在最近部署或升級的金庫,測試實時金庫可能會很有用。
爲了使屬性可執行,我們用 Foundry 編寫,並由 fuzzer 運行。爲了正式驗證給定的進金庫是否滿足所有可能的輸入和條件的屬性,將來它們也可能由符號執行或模型檢查工具運行。
在編寫時通用性是首先考慮的,我們希望測試可以應用於實現不同業務邏輯的各種金庫。我們只使用公共接口函數來使它們與實現細節無關。但是由於此限制,某些涉及特定於實現的內部數據的標准要求從屬性中省略了。
例如,以下屬性對應於 convert To Shares() 函數的要求之一,「不得根據調用者顯示任何變化。」
給定兩個账戶地址和金額,它使每個账戶以相同的金額調用 convertToShares(),並確保兩個返回值相等。此屬性獨立於實現細節 convertToShares()。這些細節因金庫的不同而異,並且必須由任何實現 ERC-4626 的金庫來滿足。在這種情況下可以通過提供特定輸入值(用於單元測試)、許多用於模糊測試的隨機輸入或用於符號執行和形式驗證的符號值來執行此屬性。它也可以在本地運行或針對主網分叉運行。
用例:測試舍入錯誤的屬性
例如舍入錯誤是一類看似輕微的但很重要的錯誤,它可能會產生一些系列影響。在 ERC-4626 的基本會計邏輯中,舍入誤差是不可避免的,例如計算要鑄造的資產數量,或要提取的資產數量,等使用定點算法實現的指令。爲了安全性考慮,該標准明確指定了每個接口函數的首選舍入方向,同時未指定誤差範圍。具體來說 deposit() 和 redeem() 函數應該返回一個低於精確值的近似值,而 mint() 和 withdraw() 函數應該返回一個高於精確值的近似值。例如當前股價(即每股資產數量)爲 2,那么 deposit()3 wei 的資產最多只能鑄造 1 wei 的代幣(即 floor(3/2)),而 withdraw()3 wei 的資產應該在至少 2 wei 的代幣(即 ceil(3/2))。
我們將舍入相關屬性編寫爲獨立於基礎會計邏輯,並將其視爲「黑匣子」。具體來說我們將它們表述爲所謂的「往返」屬性,它描述了兩個相反函數之間的關系。例如以下屬性規定,通過鑄造 N 股來提取剛剛托管的資產必須燃燒不少於 N 股。換句話說,沒有人可以通過反復鑄造和提現來反復轉換資產和金庫代幣來獲利。
事實上,我們發現主網上的幾個 ERC-4626 保險庫由於舍入錯誤而無法滿足上述屬性。這意味着任何人都可以通過簡單的反復鑄造和提取,慢慢地耗盡金庫來賺取 satoshi BTC(在撰寫本文時爲 1 satoshi ~= 0.02 美分)。在低 Gas 費的鏈如 Fantom 上可能會實現獲利,或者在價格上漲時也會獲利。
ERC-4626 標准的廣泛測試
我們在主網上約 100 個 ERC-4626 金庫進行了屬性測試,發現許多金庫未能遵循標准要求。其中的主要原因是舍入錯誤。具體來說 mint() 函數盡管標准明確要求這樣做,但某些金庫未能鑄造該函數請求的確切份額數量。其中一些還發出了不一致的 Deposit 事件,其中記錄的數據與實際生成的數據不同,甚至有些金庫根本就沒有進行現場鑄造過。相反他們只是將鑄幣請求放入隊列中,稍後將它們作爲單獨的事務分批處理。
盡管這些不同的行爲本身是不可利用的,但當它們集成到只執行標准行爲的其他系統中時,它們可能會變得容易受到攻擊。這些問題將使金庫集成變得更加困難,可能會抵消一部分努力。
屬性測試和其他可操作的步驟實現標准一致性
在部署之前嚴格遵循標准可以防止出現不同的行爲。我們希望我們的屬性和一些額外的操作項對於那些正在开發或集成 ERC-4626 金庫的人能夠提供幫助:
我們強烈建議對您的金庫運行屬性測試。如果有任何明顯違反標准的行爲,問題會很快被發現。
我們還建議檢查我們的屬性,以檢查您對標准要求的理解,如果有任何無意的差異,請調整實施方案。
如果金庫必須偏離標准,我們建議明確記錄非標准行爲,以便其他人在與金庫集成時可以正確處理這些偏差。
小結
在可預見的未來,ERC-4626 金庫有可能成爲 DeFi 的重要組成部分。爲了保持可組合性,新的和現有的金庫都必須遵循該標准。新的標准將出現,因此現在是現有金庫標准化的最佳時機。
當我們朝着不同金庫統一組合的理想狀態努力時,可以運行 ERC-4626 屬性測試以更輕松地檢測金庫實施中的標准違規行爲。屬性測試的文檔和示例都在我們的 Github 存儲庫中公开可用。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
標題:a16z 介紹 ERC-4626 金庫通用屬性測試:讓 DeFi 可組合性更安全
地址:https://www.torrentbusiness.com/article/20724.html
標籤: