今天見證歷史。知名 DEX協議 CurveFinance遭攻擊,多個池子的流動性被薅走。初步查明,竟然是智能合約編譯器Vyper的鍋!太離譜,令人不禁直呼好傢伙。初步統計損失超5000萬刀,CRV平臺token瞬時價格一度接近歸零!
簡單給不懂技術的朋友解釋一下,我們使用區塊鏈,很多時候是在和運行在區塊鏈上的代碼打交道,這些代碼被稱作“智能合約”。
對於以太坊這樣的主打智能合約的公鏈,它有一套智能合約的標準代碼,供那些在上面開發應用(也叫dApp,去中心化App)的人來編寫和運行應用。比如Uniswap,Curve這些,都是運行在以太坊上面的dApp應用。
因爲要計算機運行起來方便,節省存儲空間,存儲在鏈上的標準代碼是接近機器語言非常緊湊的二進制數字,人類不太方便直接閱讀和書寫
爲了讓應用開放更方便,就發明了很多種人類方便閱讀和書寫的“高級語言”用來編寫程序。在以太坊上曾經有三種,同一種語法類似LISP語言,並沒有流行起來,一種語法類似於Python語言,因爲是Vitalik(以太坊創始人)力推的,叫Vyper:最後一個語法類似於Javascript語言的,稱之爲Solidity
程序員用這些高級語言編寫了智能合約程序以後,要使用一種叫做“編譯器”的工具程序給“翻譯”成以太坊區塊鏈能夠運行的“機器語言”也就是標準代碼
顯然,不同的高級語言,都有各自不同的編譯器。這個很好理解,日語翻譯和英語翻譯肯定不一樣,壞就壞在這個編譯器/翻譯官這裏。
這次Curve被攻擊,就是Curve部分池子用的Vyper編譯器的特定版本存在缺陷導致(疑似,還在進一步調查中。) 這就好比你用日語說“我要喝酒”結果翻譯官在翻譯成中文的時候翻譯成了“我要喫螃蟹”。這就離譜
好在這個Vyper的流行程度並不高,目前以太坊及兼容鏈使用最多的還是Solidity。英語的翻譯官比較清晰,沒有翻譯錯誤,謝天謝地
DEX龍頭Uniswap,在最最最早期的時候,創始人Hayden就是用的Vyper語言寫的代碼。幸運的是,後來Hayden請了一個專業的CTO,就把代碼改成Solidity了。所以這次Vyper編譯器問題,Uniswap安然無恙。而大量使用Vyper語言的Curve Finance就遭殃了,
這個缺陷導致的問題是經典的“重入問題”。遙想當年,2015年,The DAO事件直接導致以太坊硬分叉,分裂成了ETH和ETC,就是這個重入問題,真是歷史的魔咒!
但當年The DAO的重入問題是發生在高級語言層面,就是說你英語就說錯了,本來想喝酒說成了想喫螃蟹,翻譯官並沒有翻譯錯
而這一次Curve事件,可怕的是你說對了,翻譯官卻翻錯了,你又看不懂(審計公司也不會去審編譯後的二進制代碼),結果神不知鬼不覺就引入了致命BUG!這也給今天的整個DeFi行業乃至整個區塊鏈行業敲響了一記警鐘!
今天所有,從寫代碼的,到審覈代碼的,到第三方審計,都不會去看編譯之後的二進制代碼。大家都默認了編譯器不會有問題,只要看到高級語言寫對了就認爲沒問題了。
中本聰爲啥不給BTC腳本擴充太過強大的智能合約功能?就是爲了避免複雜度升高引起不可饒恕的錯誤。有人抨擊BTC保守,可是面對動輒百萬千萬甚至億萬刀的資產,謹慎、保守怎麼都不過分。大多數人都還是普通人,幾十、幾百萬美刀的損失,落在誰頭上,都是致命一擊
這也凸顯了墨菲定律的告誡: 凡是可能出錯的環節,只要經過足夠長的時間,就一定會出錯。這次是 Vyper實屬萬幸。將來呢? 如果Solidity出現致命漏洞呢? 整個DeFi,萬千協議,百億千億資產,一座座輝煌的大廈竟然是建立在流沙之上,瞬間釜底抽薪,全部轟然倒塌,是不是很可怕呢?
爲什麼穿越週期難?在追求這個那個夢想的目標之前,還是先審視審視自己能不能“活到那一天吧。很多時候,活到就是贏,剩者爲王。