以太坊錢包爆嚴重漏洞,為何比特幣從無類似問題?

買賣虛擬貨幣


北京時間2017年7月20日凌晨,以太坊錢包Parity爆出極其嚴重的漏洞,導致15萬個以太幣(價值約3200萬美元)被盜。
該漏洞是由Parity錢包的多重簽名智慧合約程式碼造成的,其他錢包尚未發現該漏洞。駭客反覆呼叫了Parity錢包的enhanced-wallet.sol檔案中的initMultiowned和initDayLimit兩個智慧合約,這兩個初始化程式碼按理說只允許呼叫一次,但程式碼實現時未做限制,導致了資金被非法轉移。
截至筆者發稿時,Parity官方正在處理這個漏洞,但還未正式修復,所以建議所有使用多重簽名協議的客戶將全部資金轉出,待漏洞修復後再轉回來。
Parity錢包被盜對以太幣影響幾何?
Parity是目前以太坊使用最廣泛的錢包之一,這次被盜事件與2016年6月份發生的the DAO事件相類似。The DAO事件也是由於程式碼的漏洞導致350萬個以太幣(當時價值5000萬美元,如果以目前價格計算則為7億多美元)被盜。
The DAO事件發生後,以太坊創始人Vitalik Buterin提議修改以太坊程式碼,對以太坊區塊鏈實施硬分叉,將駭客盜取資金的交易記錄回滾,得到了社羣大部分礦工的支援,但也遭到了少數人的強烈反對。最終堅持不同意回滾的少數礦工們將他們挖出的區塊鏈命名為Ethereum Classic(以太坊經典,簡稱ETC),導致了以太坊社羣的分裂。

但本次Parity事件發生後,Vitalik Buterin迅速表示,因被盜取資金並非巨量,不考慮像上次那樣實施硬分叉回滾交易。因而,以太幣的價格在事件發生後並未大幅下跌,目前以太坊ETH的價格為213美元,以太坊經典ETC的價格為15美元。
什麼是智慧合約?
以太坊誕生於2014年,是繼比特幣之後又一個成功的區塊鏈專案,目前市值約200億美元,僅次於比特幣(約400億美元)。
以太坊在比特幣的基礎上發展了區塊鏈技術,維護了一個全球共享的計算平臺,實現了圖靈完備的虛擬機器EVM,試圖透過圖靈完備的智慧合約實現靈活、安全、全功能的計算。

而比特幣的設計初衷是一個電子現金系統,其內建的指令碼語言是專為資金轉賬交易而設計的,為了確保安全性故意放棄了圖靈完備性(沒有跳轉、迴圈指令),因而僅僅是一個全球共享賬本而非計算平臺。
以太坊實現了一個內建了多種程式語言的區塊鏈協議,這些程式語言都是圖靈完備的,可以支援條件分支、迴圈、跳轉、函式呼叫等複雜的運算邏輯,理論上可以在以太坊上執行任意的應用。

具體來說,作為在以太坊區塊鏈上執行的某個應用,可以由程式設計師根據業務需要,用以太坊支援的程式語言自行設計編寫程式碼,而不用為了一個應用去執行一個單獨的區塊鏈。基於以太坊協議,使得應用開發者們可以高效快速地開發各式各樣的應用程式。這樣的程式被稱為智慧合約,智慧合約程式碼釋出到區塊鏈上之後,能夠無需中介的參與在以太坊區塊鏈上自動執行,沒有人可以阻止它的執行。
目前在以太坊上執行的智慧合約已有數百種之多,Parity和the DAO都是其中之一。
受到以太坊的啟發,近年來出現了許多類似的專案,如Fabric、QTUM等,從不同的角度和層面對以太坊進行區域性最佳化,但總體思路都是差不多的,核心都是圖靈完備的智慧合約。
如何防範智慧合約漏洞的產生?
值得注意的是,此次Parity事件的損失雖然比the DAO事件小一些,但問題的根源是同樣的。
隨著智慧合約開始獲得越來越多的使用,智慧合約的流程和程式碼也變得越來越複雜,人們也發現,就像現實世界的合同一樣,如果沒有認真稽覈的話,在設計和編碼過程中難以避免人工失誤的產生,一旦被駭客找到漏洞,損失往往是巨大的。                   
但需要強調的是,這種漏洞不是以太坊區塊鏈本身的漏洞,人們不應對以太坊和區塊鏈的安全性產生不必要的懷疑。此次事件也不會對區塊鏈的應用帶來嚴重的負面影響,類似的事件將來還會發生,這並不意味著區塊鏈技術的末日。
當然,區塊鏈從業人員應吸取教訓,以儘可能減少類似的安全事故。在筆者看來,在區塊鏈和智慧合約的設計與編碼實踐中,需做到以下幾點:
1、簡化區塊鏈指令碼語言設計,犧牲一部分圖靈完備性換取安全性。比特幣由於其設計上的非圖靈完備性,加上中本聰大幅刪減了許多指令碼指令,所以其安全性是極高的,從2009年誕生至今8年多的時間裡,平安經歷了無數次的駭客攻擊,從未因比特幣區塊鏈和指令碼本身的原因出現過資金損失。然而,功能上的豐富性和安全性是一對永恆的矛盾,不可能兼顧,因此在設計區塊鏈指令碼語言時,儘量不要為了功能而使用通用的程式語言,要在語言的功能上有所取捨,採用最小可用指令集,同時在智慧合約虛擬機器的設計上要採用沙盒等隔離手段,並嚴格限制CALL指令的使用方式。
2、嚴格執行智慧合約程式碼審查。和現實中的合同文字一樣,智慧合約程式碼也要經過多層次的嚴格的程式碼審查,包括業務流程/邏輯審查、程式碼走查、詳盡的測試流程、安全性檢測、專家評審等。對邏輯複雜且涉及較大資金的智慧合約,要儘可能透過程式碼形式化驗證,透過數學證明的方式驗證智慧合約的確定性。
3、強化對智慧合約程式設計師的培訓。雖然智慧合約程式語言表面上看與傳統的程式語言極其相似,但其屬於一個全新的程式設計正規化,思維方式也與傳統的程序導向、物件導向、面向函式的程式設計正規化有很大差異,需要將公平交易、誠信和其他主觀概念加入智慧合約的設計和編碼中。為此,要加強智慧合約程式設計師的培訓工作,在實踐中提煉出智慧合約程式設計和設計模式,尤其是安全方面的模式,減少程式設計師出現差錯的可能。
4、在應用實踐中要謹慎漸行。在實際應用區塊鏈智慧合約時,應採用分步推進的策略,從簡單到複雜,從小範圍試點到全面推廣,涉及的資金量也應從少到多,不貿然涉及大量的資金。如此,即便在前期出現漏洞被攻擊,也不會損失過於巨大。


來源:;作者:洪蜀寧 蘇寧金融研究院高階研究員

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;