23-ETH-反思

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

1、智能合約的反思——智能合約真的智能嗎?(Is smart contract really smart?)

首先我們必須瞭解智能合約裏面並沒有用到任何人工智能的技術,所以有人認爲應該把它叫做自動合約,按照事先寫好的代碼,自動執行某些操作,現實世界當中,有什麼自動合約的例子嗎?ATM 取款機可以看作物理世界上的一個自動合約,按照事先規定好的邏輯去做某些事情。所以智能合約其實並不智能,而且挺笨的,一旦寫好了之後就改不了了,就是作爲代碼合同。(Smart contract is anything but smart.)

2、不可篡改性是把雙刃劍(Irrevocability is a double edged sword.)
一般來說我們提到區塊鏈的不可篡改性都認爲這個是區塊鏈的一個優點,很多區塊鏈的應用都利用了不可篡改的特性,比如防僞、溯源。但是從“The DAO”事件當中,可以看出不可篡改性其實是一個雙刃劍。一方面,不可篡改性增加了合約的公信力,但另一方面,不可篡改性也意味着如果規則中有漏洞,我們想要修補這個漏洞,想軟件升級都是很困難的。

The DAO的盜幣事件有傳聞說,The DAO的開發團隊在發生盜幣事件前幾天已經收到了有關智能合約中存在安全漏洞的消息,但是沒有來的及發佈更新後的軟件。這個如果是對於一箇中心化的系統,大家可能會覺得是很難想象的,如果你發現你的軟件中的安全漏洞,你幹嘛不及時發佈一個安全補丁呢。但是問題在於在區塊鏈的世界裏,你怎麼發佈補丁,軟件更新需要硬分叉來實現,還需要得到大部分礦工的支持。無論是比特幣還是以太坊,硬分叉都不是隨便搞的,這次以太坊搞的硬分叉,最後就造成了兩條平行的鏈,而且要搞硬分叉要說明理由,否則別的礦工爲什麼要升級你的軟件,而你一旦說明理由的話,那就會把安全漏洞的信息泄露出去,那麼有惡意的攻擊者,在還沒有來得及升級軟件之前搶先發動攻擊,這些都是區塊鏈上不可篡改性帶來的一些問題。

不可篡改性還導致另一個問題,即使我們發現了這個安全漏洞,已經有人進行惡意攻擊了,我們想要凍結賬戶,終止交易都是很困難的。

這個和我們如常生活的體驗不太一樣的地方,比如說你的銀行卡的信息被泄露了,第一反應是通知銀行,凍結賬戶,修改密碼。很多人在剛接觸區塊鏈的時候也是同樣的反應,發現比特幣賬戶的私鑰泄露出去了,怎麼辦,趕緊通知誰把賬戶給凍結了,沒有辦法凍結,要凍結的話只能軟分叉。實質上要發佈一個軟件更新,有關要凍結的賬戶的交易都不予執行,這纔可以凍結,對於個人來說,你的私鑰泄露出去了,搞一個軟分叉,這是不可能的,對於普通人只能儘快將剩下的資金轉到安全賬戶。

與之相關的一個問題,智能合約發佈到區塊鏈上就無法阻止別人對它的調用,比如說這次的盜幣事件,黑客偷走了差不多1/3的以太幣,還有2/3的以太幣還在 The DAO 相關的子基金裏,同樣存在着安全的風險。我們傳統直觀的認爲,智能合約出問題了,那就不能讓別人去調用它了。但在區塊鏈上你沒辦法組織別人對它的調用,你要阻止的話又得要軟分叉,增加一條新的規則,凡是調用這個智能合約的交易都不予執行。

所以還剩的2/3的資金應該也及時轉走,怎麼轉走?利用黑客的這個漏洞把錢轉走。當時就有人建議這麼做的,比如說你是個好人,你創建一個新的智能合約,把這個事情公佈給大家,說現在要利用黑客的漏洞把剩下的錢轉移到安全的智能合約,手段和重入攻擊是一樣的,只不過你的目的是好的,這個新的合約的目的是將來把錢退給大家。

3、沒有什麼是真的不可篡改的(Nothing is irrevocability.)

理論上,沒有什麼什麼是絕對不可篡改的,比如分叉攻擊可以回滾交易。“The DAO”事件中,以太坊開發團隊通過軟件升級方式強行改變了某些賬戶的狀態,所以不能迷信不可篡改的特性。畢竟代碼是死的人是活的,沒有什麼是絕對改不了的,連憲法都可以修憲,比如美國的憲法修正案,修憲是很難的,但是有必要的時候還是可以改的。區塊鏈上是一樣的,想要篡改是比較難的,但是遇到重大事件,要是想改還是改的了的。

4、合約語言設計的反思(Is solidity the right programming language?)

爲什麼會出現重入攻擊這樣的事情,從某種意義上來說,solidity 語言上有一些反自然的特性,我們一般的理解是我給你轉賬,你是一個被動的接收者,你不可能再回來調用我。但solidity語言的特性是,我給你轉賬等於調用了你的fallback()函數,雖然表面上我沒有調用任何的函數,結果你還可以倒過來調用我。這個和平時的生活體驗不一樣,所以容易忽視這樣的安全漏洞。

有人提議應該改進爲函數式編程語言,這樣比較安全,不容易出現漏洞。而且從長遠來看,要實現理論上證明智能合約的正確性。如果能夠用形式化驗證(formal verification)的方式,證明一段程序的正確性,那麼將能夠解決智能合約的漏洞問題,這個有些人曾經認爲是智能合約的一個終極目標。但是形式化驗證距離實用仍有很大的距離,一般只能證明一些邏輯簡單的正確性,而且在證明過程要屏蔽掉很多實現上的細節,這樣導致的結果就是即使這個程序從理論上可以證明的正確的,實際跑起來可能仍然有問題。從語言設計上來說,solidity有很多值得改進的地方,但是不是說我們就該用函數式編程語言,就應該用formal proof的方法證明程序的正確性,這個還有待探討。

語言設計上的第二個反思是,編寫智能合約的語言應該有什麼表達能力。我們前面講過比特幣和以太坊的區別,比特幣的腳本語言就是很簡單的,表達能力很差,而以太坊的編程語言叫圖靈完備的,凡是計算機能完成的任務,語言都能實現起來,但是圖靈完備的表達能力是不是一個好事情。出現智能合約的漏洞後,有些人認爲,應該選取一個表達能力適中的語言,它可以實現智能合約的功能,又不容易出現漏洞。但是難以設計出適當的語言,因爲設計語言的時候很難預料將來所有可能出現的事情,也很難預料將來可能出現的所有安全攻擊。

我們說比特幣腳本是很簡單的,但在實際應用中大部分礦工也只是接收幾個常用的腳本,有一個安全腳本的白名單,如果交易的腳本不在白名單裏面,很多礦工缺省情況下是不接受的。聯想到現實中的合同,也會出現由於不嚴謹出現一些糾紛,所以通常使用模板寫合同來規避這些問題。智能合約可以參考這種在模板基礎上書寫合約的方法,以後應該也會出現類似寫智能合約的專門機構。所以大家不要對智能合約出現了各種各樣的問題就對它喪失信心,智能合約的歷史相對來說比較短的,最終還是會走向成熟。

5、開源軟件漏洞的反思(Many eyeball fallacy.)

去中心化的系統一般都是開源的,因爲需要所有節點執行同樣的操作,才能達成共識。開源的一個好處就是增加合約的公信力,接受羣衆的監督;有人認爲另一個好處是不容易出現安全漏洞,因爲全世界有這麼多雙眼睛在看着這個代碼,但實際情況並不如此,我們也看到了智能合約的代碼出現了各種各樣的漏洞,而且這個問題不是智能合約所特有的,其他開源的軟件也有類似的問題。那爲什麼全世界有這麼多雙眼睛看着還出現了這麼多漏洞?

理論上代碼是開源的,但實際上去研究代碼的人是很少的,例如像“The DAO”這樣涉及到財產安全的項目,你要把你的錢投進去,投錢之前是不是需要檢查下這個智能合約靠不靠譜,但是很多人都沒有仔細看,看的人可能也沒有足夠的安全知識去檢測裏面的安全漏洞。有很多手機上的區塊鏈錢包也是開源的,也是涉及到財產安全的,那麼有多少人是去看了錢包的源代碼的,有多少是看的懂的,大家都認爲別人一定看過了,實際上可能沒有誰認真看過,所以不要認爲開源軟件一定比不開源的軟件安全,有很多人用的軟件也不一定沒有安全漏洞,歷史上有很多開源軟件的安全漏洞是很多年後發現的。所以這些關鍵性應用我們還是要小心仔細,需要自己去檢查下智能合約是否有安全問題。

6、去中心化的反思(What does decentralization mean?)

區塊鏈技術的追隨者一般都是去中心理念的擁護者,這些人呢對於現實生活中中心化的管理方式不滿意,所以在區塊鏈的世界中去尋找一種全新的管理方式。這也是爲什麼以太坊開發團隊在推出了硬分叉的解決方案後引發了這麼大的爭議,有很多人認爲又回到了中心化的老路上面,你開發團隊憑什麼用一個軟件升級就把一個人賬上的錢轉走,這個豈不是比中心化更中心化,在中心化的社會里要沒收一個人的財產還需要通過法律各種各樣的程序,28天以內還不一定能完成。

但是回想一下這個硬分叉的過程,是不是就是以太坊的開發團隊說的算的。首先他們搞了一個投票,最後是大部分人投票支持硬分叉,但是更重要的是以太坊的團隊是沒有辦法強迫大家支持這個投票結果,最後硬分叉能夠成功是因爲什麼,是因爲90%以上的礦工升級了軟件,用行動支持了硬分叉,即使是這樣還有少部分的礦工不支持硬分叉的方案,繼續留在舊鏈上挖礦,那也是他們的自由,以太坊的團隊沒有什麼辦法強制他們轉過來。所以說去中心化並不是說全自動化,讓機器決定一切,不能有人爲的干預,去中心化也不是說已經制定的規則就不能修改,而是說對規則的修改需要用去中心化的方式完成。我們平時說是用腳投票,區塊鏈的世界裏是用挖礦來投票的。這次硬分叉爲什麼成功,是因爲絕大多數礦工認爲以太坊的開發團隊所做的決定是符合大部分人的利益的,大家不要低估了廣大部分礦工的思想覺悟。如果以太坊開發團隊爲了一己私利做了什麼決定,那廣大工人階級是不會跟着他們這樣乾的,這是關於去中心化的反思。

關於分叉的事情,我們一般認爲分叉是件壞事,但是你仔細想一下分叉恰恰是去中心化的體現。在一箇中心化的系統裏,你是沒有辦法分叉的,你可以選擇放棄,但是你不能選擇分叉。比如以太坊創始人V神的故事,19歲的他非常喜歡打魔獸世界,直到有一天暴雪公司把他最喜歡的技能去掉了,他非常生氣,多次找暴雪公司的人反饋,沒有得到任何滿意的結果,他一氣之下就不玩了,後來他就想爲什麼會出現這種情況, 本質上是因爲這個遊戲是一個去中心化的遊戲,決定權在公司,普通用戶沒有任何辦法,所以他決定要去創建一個去中心的平臺,用戶不滿意就有選擇分叉的權利。所以存在分叉的選項恰恰是民主的體現。

7、去中心化與分佈式的反思(decentralized ≠ distributed)
一個去中心化系統必然是分佈式的,但是分佈式系統不一定是去中心化的,即使這個系統運行在成千上萬的計算機上,如果這些計算機都是由同一個組織所管轄的,那麼也不能叫做去中心化的。在分佈式的平臺上可以運行一箇中心化的應用,也可以運行一個去中心化的應用。

比特幣和以太坊都是交易驅動的狀態機(state machine),他的特點是讓系統中幾千臺計算機做同一個操作,付出很大的代價來維護狀態的一致性,而這個並不是分佈式系統常用的工作模式,大多數的分佈系統是讓不同機器做不同的事情。然後再把各臺機器的結果彙總起來,得到最後的結果,這樣做的目的是爲了比單機的速度要快。比如說1臺計算機要完成的任務,可能需要一個星期,用10臺計算機的分佈式集羣,可能一天就完成了,最理想的狀況是得到線性加速,就是10臺計算機的速度比1臺計算機的速度要快10倍,但是實際應用當中,線性加速是很難達到的,因爲存在任務切分,任務通訊,結果彙總都是有overlap,所以實際應用當中10臺計算的速度可能相當於1臺計算機的6、7倍,但是任然要比1臺計算機要強,這樣分佈式系統纔有意義。

狀態機的模式不是這樣的,狀態機的目的不是比1臺計算的處理速度快,而是爲了容錯。狀態機最早的應用場景是什麼,是一些mission critical applications(關鍵運算應用),比如像airtraffic control, stock exchange, space shuttle,這些是一些狀態機常見的應用場景,這些場景的特點是什麼?這些應用程序必須無間斷的向外提供服務,所以需要好幾臺計算機重複同一種操作,這樣即使1臺計算機宕機,這樣還能向外提供服務,這是狀態機模式的原理。這樣付出的代價是什麼,效率很低,幾臺機器合在一起比一臺機器還要慢,因爲它要同步狀態,而且集羣裏的機器越多速度越慢,所以傳統利用狀態機的模型裏面機器的數量是比較少的,有很多就是個位數的。像比特幣、以太坊這樣上千臺機器重複同一組操作,在以前是從來沒有過的。所以不要以爲比特幣和以太坊是分佈式系統的常態,我們理解了這點就能理解智能合約比較適用的場景是什麼,不要把智能合約EVM平臺當成大規模計算或者大規模存儲等服務,如果你這麼做的話,不光是速度很慢,而且也是非常貴的,因爲要耗很多汽油費、智能合約是用來編寫控制邏輯的,只有那些需要在互不信任的實體之間建立共識的操作,才需要寫在智能合約裏。如果你需要大規模計算服務的話,可以用亞馬遜的雲服務平臺。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章