昨夜開始,Curve 因受 Vyper 個別版本的重入鎖故障影響,導致旗下 alETH/msETH/pETH 等穩(wěn)定池被黑客攻擊,由此引發(fā)一系列的 DeFi 次生災(zāi)害與加密世界震蕩,至今仍在持續(xù)發(fā)酵中(參見時間線《Curve 被攻擊,殃及多個 ...
昨夜開始,Curve 因受 Vyper 個別版本的重入鎖故障影響,導致旗下 alETH/msETH/pETH 等穩(wěn)定池被黑客攻擊,由此引發(fā)一系列的 DeFi 次生災(zāi)害與加密世界震蕩,至今仍在持續(xù)發(fā)酵中(參見時間線《Curve 被攻擊,殃及多個協(xié)議》)。 這也是 DeFi 世界罕見地直面針對智能合約語言層 Bug 的攻擊事件。不過相比于加密世界中常常見諸報端的 Solidity 語言,Vyper 其實并不那么為人所熟知。 那 Vyper 究竟是什么,它在 DeFi 世界中扮演著怎樣的角色,為什么它的 Bug 又會引起行業(yè)的高度關(guān)注?本篇文章 Foresight News 就帶大家來了解一下目前正處于風口浪尖的 Vyper 語言。 Vyper:第二受歡迎的智能合約編程語言Vyper 創(chuàng)建于 2017 年,在此之前,開發(fā)人員編寫智能合約最常用的語言是 Solidity。而 Vyper 和 Solidity 一樣,都是一種面向智能合約的編程語言,可編譯為以太坊虛擬機(EVM)的字節(jié)代碼,運行在 EVM 上。 不過 Vyper 的編譯器使用 Python 進行編寫,是一種基于 Python 且兼容 EVM 的編程語言,具有強類型、小型編譯器代碼和高效的字節(jié)碼生成的特點,這也使其成為想要進入 Web3 的 Python 開發(fā)人員的最佳選擇之一。 這導致從采用率角度看,目前的 Vyper 也是僅次于 Solidity 的「第二大兼容 EVM 的智能合約編程語言」,截至此次攻擊事件發(fā)生前的 DeFiLlama 最新統(tǒng)計數(shù)據(jù)顯示: 在目前的 DeFi 開發(fā)格局中(TVL 占比維度),Solidity 以 94.71% 的市場份額占據(jù)絕對壟斷地位,而 Vyper 以 3.04% 的市場份額位列第二名。 而第三名開始往后的 Rust(0.9%)、Cairo(0.53%)、Haskell(0.26%)已經(jīng)是斷崖式下降。 除了基于 Python 的特點之外,Vyper 不采用面向?qū)ο竽J?、?nèi)聯(lián)匯編,并且不支持代碼重用、修飾符、繼承、函數(shù)重載、遞歸調(diào)用、無限長度循環(huán)和二進制定長浮點等。 此外它還針對安全性、可讀性、可審核性和 Gas 效率進行了優(yōu)化: - 安全性:支持在 Vyper 中構(gòu)建安全的智能合約; - 可讀性:Vyper 的智能合約語言和編譯器實現(xiàn)力求簡單,以提高代碼的可讀性,尤其是對于沒有使用 Vyper 經(jīng)驗的用戶以及一般沒有編程經(jīng)驗的用戶; - 可審核性:Vyper 代碼最大限度地讓人可讀,且其簡單架構(gòu)減少了軟件錯誤,提升了智能合約的可審計性; Vyper 的創(chuàng)始人 John Max Skaller 曾表示,構(gòu)建 Vyper 有兩個原因:「首先,我喜歡 Python,特別是它的簡單性,但我不喜歡它缺乏范圍確定性,凡事都需要做大量更改來取得進展,因此我決定在保留與 Python 兼容性的同時,通過建造高級得多的編程語言,并在其中建造函數(shù)性編程語言的某些概念來改正這些問題。 第二個原因是性能。我有一個稱之為 interscript 的主要 Python 程序,一個有讀寫能力的編程工具,它受到 Python 中缺乏良好結(jié)構(gòu)和性能問題的困擾」。 總的來說,Vyper 的設(shè)計初衷是為了創(chuàng)建出智能合約參與方易懂的透明智能合約簡化流程,以主打可讀性與可審核性,從而確保安全。 Vyper 的優(yōu)劣勢本章節(jié)談及的 Vyper 優(yōu)劣勢,主要是相比 Solidity 語言,畢竟從上文提到的市場份額維度,其它的智能合約語言暫時還未形成較大的氣候。 首先,Vyper 相比 Solidity 的最大優(yōu)勢之一,就是它基于 Python 開發(fā)的特性,因此雖然 Vyper 的功能和流行程度不如 Solidity,但對于熟悉 Python 的開發(fā)人員來說,它是理想的可選語言。 同時,Vyper 編譯器還選擇將局部變量存儲在內(nèi)存中而不是堆棧上,這使得合約更加簡單和高效,并解決了其他高級語言中常見的「堆棧過深」的問題。 Vyper 也提供了更多內(nèi)置函數(shù),以確保幾乎每個 Solidity 和 Yul 中的功能在 Vyper 中也可以實現(xiàn)。開發(fā)者通過內(nèi)置函數(shù)可以訪問低級位運算、外部調(diào)用和代理合約操作,通過編譯時提供覆蓋文件可以實現(xiàn)自定義存儲布局。 而 Vyper 相比 Solidity 的劣勢也很明顯,主要源于它是一種相對 Solidity 較新的語言,所以首當其沖自然是開發(fā)者維護和社區(qū)工具層面的短板: Vyper 至今仍然缺乏 Solidity 所擁有的廣泛社區(qū)支持——Solidity 有大量優(yōu)秀的開發(fā)工具可供使用,像 OpenZeppelin 為安全的智能合約開發(fā)提供開源庫,以及 Remix 在線 IDE 和本地開發(fā)人員環(huán)境 Hardhat 等 IDE,為其提供了允許輕松開發(fā) DApp 的工具和功能。 截至發(fā)文時,GitHub 數(shù)據(jù)顯示,Solidity 的貢獻者為 568 人,而 Vyper 為 189 人,相差 3 倍。 不過 Vyper 雖然沒有豐富的的開發(fā)工具套件,但它有更緊密集成的工具,并且也可以插入到 Solidity 開發(fā)工具中——如 Titanaboa 解釋器,具有許多與 EVM 和 Vyper 相關(guān)的內(nèi)置工具,可用于實驗和開發(fā);Dasy,作為一種基于 Vyper 的 Lisp,具有編譯時代碼執(zhí)行功能。 此外從技術(shù)細節(jié)角度,Vyper 缺少修飾符、類繼承和遞歸調(diào)用,并且編程語言不是圖靈完備的。 當然這些大部分是 Vyper 特意提供更少的功能,旨在提升安全性和可審計性,以使合約更安全和易于審核,但這也使得開發(fā)人員需要額外的工作來解決這些限制,從而意味著本就不占人力優(yōu)勢的 Vyper 注定開發(fā)效能偏低。 Vyper 的影響力從何而來?目前來看,此次 Vyper 故障只涉及 0.2.15、0.2.16 和 0.3.0 等幾個特定版本,且從上文也可知,使用 Vyper 編寫的頭部 DeFi 項目的體量并不大,僅占不到 5% 的 TVL 市場份額。 那為何此次 Vyper 的故障卻造成了如此大的影響? 簡言之,雖然在主流 DeFi 協(xié)議中,主動使用 Vyper 語言進行開發(fā)的項目并不多,且此次出現(xiàn)問題的是 Vyper 的幾個特定版本,但有一個頭部 DeFi 項目卻是基于 Vyper 開發(fā): 沒錯,正是 Curve,主要原因似乎與上文提到的 Gas 優(yōu)化特性有關(guān)——因為 Curve 合約較為復(fù)雜,Vyper 使得這些復(fù)雜性變得更易于管理,并進一步節(jié)省 Gas(其它基于 Vyper 開發(fā)的知名項目則屈指可數(shù),如 Uniswap v1 版本、第一個 ETH 2.0 存款合約等)。 由于 Curve 已經(jīng)成為 DeFi 世界甚至整個鏈上金融的關(guān)鍵基礎(chǔ)設(shè)施,所以在層層嵌套之下,Curve 的穩(wěn)定池本質(zhì)上就是絕大部分協(xié)議的底層資金與收益來源,這也是此次安全事件發(fā)生至今,JPEG'd、Alchemix、Metronome、deBridge、Ellipsis Finance 等余震不斷的關(guān)鍵原因。 不過 Vyper 的新版本已經(jīng)修復(fù)這個漏洞,但由于受影響的 Curve 穩(wěn)定池合約不可升級,因此無法進行部署升級,只能選擇廢棄對應(yīng)合約,將資金撤出。 小結(jié)總的來看,此次安全事件之所以大家會心有余悸,主要是因為智能合約語言層的 Bug 風險,已經(jīng)遠超 DeFi 協(xié)議本身或者說智能合約邏輯的范疇。 試想一下,如果此次不只是 Vyper,而是連 Solidity 也同樣出了問題,那么鏈上所有的 DeFi 協(xié)議可能都幾難幸免,我們甚至會真的面臨「DeFi 不存在了」的風險。 但禍兮福之所倚,這次 Curve 也算被動掀開了對智能合約語言層進行攻擊的問題蓋子,讓大家意識到了這個可能,對 DeFi 世界而言,是一次大考,也是一場自我救贖的機會。
免責聲明:本文不構(gòu)成投資建議,用戶應(yīng)考慮本文中的任何意見、觀點或結(jié)論是否符合其特定狀況,及遵守所在國家和地區(qū)的相關(guān)法律法規(guī)。
歡迎轉(zhuǎn)載分享!
轉(zhuǎn)載請注明本文地址: 如有文章侵犯了您的權(quán)利,請聯(lián)系本站站長,我們將在第一時間刪除相關(guān)內(nèi)容,謝謝! |