對區塊鏈技術稍有瞭解的人都知道,區塊鏈存在的基礎是系統中參與交易的所有人要對數字資產的歸屬達成共識。而從整體上看,區塊鏈則是一種將系統內交易進行編碼的可附加賬本,除瞭要達成數字資產歸屬權共識外,基於區塊鏈技術的任何應用要生效,還要滿足很重要的兩點,一是每次交易必須有效,二是過往交易歷史不能篡改。
然而,要保證交易有效,就必須遵循某一事先約定的規則。現實世界中,各類交易都有相關的法律條款甲乙約束。而在計算機世界裡,正如美國著名學者勞倫斯 · 萊斯格當年所提出的 " 代碼即規則 "(code is law)——一旦代碼被編寫出來並開始執行,就永遠不能回收瞭。這多少能解釋區塊鏈在某些具體應用場景下面臨的情況。
以比特幣客戶端為例,目前該客戶端擁有約 3 萬行代碼,而目前的工業標準允許每一百行代碼中存在一個 bug。理論上說,哪怕比特幣客戶端存在 300 個 bug 也是符合行業規則的。但事實並非如此,2010 年 8 月那個利用整數溢出漏洞憑空創造出 1840 億個比特幣的黑客(比特幣設計之初的限額僅為 2100 萬個),差點就徹底毀滅瞭比特幣。
所以,在區塊鏈技術中,由於缺乏統一的外部技術說明文檔," 代碼即規則 " 往往會失效,甚至被認為有史以來最安全的以太坊架構,也面臨同樣的問題。
以太坊雖然僅僅誕生瞭四年,但是隨著人們越來越多地瞭解區塊鏈技術,以太坊的熱度逐漸增加。甚至在 2017 年時,以太坊被認為是區塊鏈 2.0 時代最重要的底層開源系統。然而,最新的研究顯示,基於以太坊架構,被稱作是 " 最安全、最可靠、最方便 " 的智能合約技術卻漏洞百出。
最新研究揭露智能合約存在巨大漏洞
眾所周知,智能合約被存放於以太坊的區塊鏈上。但這也就意味著,一旦區塊鏈發生問題,智能合約所涉及的交易信息也會受到牽連。區塊鏈本質上是一個共享賬本,它使用密碼技術以及計算機網絡來確保交易信息不會出差錯。
然而,在執行智能合約的過程中,如果賬戶是 NULL(即沒有賬戶),那麼智能合約則會為此次交易創建一個賬戶,並將合約寫到該項目下。虛擬機則通過執行合約中的二進制字節碼實現合約的執行。也就是說,智能合約可以被用來創建加密貨幣。比如火幣網的 HT,就是用以太坊智能合約創建的。
圖丨火幣網 HT
然而,在倫敦大學學院(University College London,UCL)計算機科學系副教授伊利亞 · 謝爾蓋最新的研究論文《Finding The Greedy , Prodigal , and Suicidal Contractsat Scale》中,通過對將近 100 萬份智能合約進行每份合約 10 秒分析時間的分析後發現,這其中有 34200 份智能合約很容易受到黑客攻擊。同時他們又對 3759 份智能合約抽樣調查,在這之中,3686 份智能合約有 89% 的概率含有漏洞。
論文下載地址:https://arxiv.org/pdf/1802.06038.pdf
此外,研究也證明,以太坊的 Parity 錢包漏洞使得用戶電子財產會鎖死在以太坊,全以太坊被鎖死的財產總額已經達到 2 億美元。事實上,在 2017 年 11 月時就有媒體爆料,因為一些以太坊智能合約使用者的誤操作,導致瞭 3 億美元永久被凍結在以太坊之中。
研究人員發現,這些漏洞分別為:
浪子合約:交易資金因為漏洞返還給所有者、交易者過去發送給以太網的地址,以及特定地址。這種漏洞就像是空手套白狼,買傢得到商品,而賣傢無法得到加密貨幣。
自殺合約:智能合約的擁有者可以在以太坊發生故障時選擇退回,類似於微信中的撤回選項。但是這個指令也可以被其他人執行,使得交易失敗。
貪婪合約:這是指那些永遠停留在以太坊的智能合約,上述的 Parity 漏洞正是一種貪婪合約,它會把智能合約所涉及的商品以及加密貨幣鎖定在以太坊中,交易雙方均無法得到,也不能取消。
遺囑合約:在那些已完成或者被關閉的智能合約中,雖然他們的代碼和全局變量被清楚瞭,但是其中一部分仍然在繼續執行。遺囑合約和貪婪合約一樣,均是由以太坊的錯誤引起,目前並不能被黑客利用。
圖丨 MAIAN 工具
這四種漏洞是最具代表性的,不過他們並不是以太坊智能合約的全部漏洞。研究人員們雖然通過自制的 MAIAN 工具檢測出瞭包含這四種漏洞的智能合約,然而他們並沒有找到解決方案。
那麼這樣看來,即使傳統金融交易模式比智能合約要麻煩,但是它能最大程度地避免漏洞,使得交易更加安全可靠。
什麼是智能合約?
接著,DT 君給各位讀者做個科普。以太坊是一個基於公鏈的分佈式計算平臺,同時,它還提供瞭一個去中心化的虛擬主機。以太坊一共分為五層:
數據層:層如其名,數據層包含瞭以太坊中最基本的數據結構以及賬戶加密算法,而該層也是以太坊的基礎組成部分。
網絡層:用於校驗以太坊中各個節點數據傳輸。
共識層:用於保存基於作量的共識機制。
激勵層:用於保存激勵機制,主要負責激勵節點自主挖礦,維持以太坊運行。
合約層:以太坊獨有結構,是一臺封裝瞭可以執行圖靈完備腳本語言的虛擬機,可以通過編寫腳本語言作為智能合約部署到以太坊區塊鏈中,以此實現應用的去中心化。
智能合約則是一種編碼,在合約層有著可以自動運行的業務邏輯,並依靠以太坊的虛擬機而運行。智能合約代碼基於堆棧的字節碼低級語言,每一種字節代表著不同的操作。通常來講,代碼的執行過程中是無限循環的,隻有代碼完成執行、中斷指令等才能停止其工作。
圖丨去中心化架構
以太坊虛擬機是執行交易代碼的引擎,這也是以太坊區塊鏈和其他區塊鏈最大的不同之處。它並不是像沙盒一樣完全獨立的,這意味著智能合約代碼在虛擬機中運行時,不需要網絡和文件系統。
另外,在智能合約的執行過程中,合約賬戶的作用也非常關鍵。該賬戶的地址取決於合約建立的時間,當以太坊虛擬機運行時,賬戶的計算狀態可以通過 block_state、transaction 等元組來定義。通過程序執行時對元組數據的修改(block_state 包含所有賬戶的全局信息),從而實現智能合約的執行過程。
從應用方面來講,智能合約是一項能夠改善傳統金融模式的技術,它通過上述的網絡架構以及虛擬電子貨幣簡化瞭價值轉移的過程。大概可以被理解為三步:
1、A 向區塊鏈發送一條信息,並在信息中定義瞭一筆交易;
2、B 通過網絡廣播接受該交易信息;
3.、區塊鏈網絡驗證,完成交易。
也就是說,智能合約和 " 把大象裝進冰箱 " 的原理差不多。在傳統金融模式中,交易雙方都需要通過監管中心,而智能合約則可以利用區塊鏈的分佈式賬本來跳過金融監管,以達到便捷交易的目的,這也是所謂的 " 去中心化 "。
在以太坊中,智能合約由二進制字節碼組成,其使用的編程語言為 Solidity。以太坊將智能合約編譯後,存儲於區塊鏈中,從而實現瞭上述的信息中定義交易。
智能合約能否實現?
實際上,以太坊也在日益進步。想要開發一個完善的智能合約,還需要時間磨礪。
以太坊去中心化的核心是其可以運行圖靈完備的腳本語言,而開發以太坊智能合約則有四種語言:Serpent、Solidity、Mutan、LLL。這些語言都是面向底層設計的語言。目前來看,Solidity 是首選語言,這是由於它內置瞭 Serpent 語言的所有特性,語法類則似於使用廣泛的 JavaScript。再加上 Solidity 的語言特性較少,該語言則可以更簡單地實現完備的智能合約體系。
區塊鏈去中心化的應用程序通常為 DApp,它由智能合約和後端代碼構成。在 DApp 中,所有的服務和邏輯都運行於區塊鏈上,也就意味著 DApp 不僅需要設計前端應用,還要開發基於以太坊的智能合約代碼。
圖丨 DApp 與智能合約的關系
這些智能合約代碼以 JsonPRC 的方式提供給應用程序進行調用,而此時,智能合約就如以太坊中的轉賬操作一樣,被廣播到所有節點上,通知這些節點運行被調用的智能合約 ABI,然後這些被調用的 ABI 會各自運行在該節點的虛擬機中。最後通過區塊鏈的生成將運行過程和結果打包進區塊鏈,並通過區塊鏈的同步實現全網統一。
換句話說,要想實現沒有漏洞的智能合約,開發步驟則是關鍵所在。截止至 2018 年 3 月 4 日,開源社區中比較流行的 DApp 開發工具是 browser-solidity。聽名字就知道是一款基於瀏覽器的工具,用戶可以在線編寫智能合約代碼,同時還能編譯成二進制字節碼部署到用戶所屬的區塊鏈中。
圖丨 browser-solidity 開發界面
目前, Solidity 的版本是 0.4.21,看版本號就知道還處於測試階段。這也就意味著其開發工具 browser-solidity 也存在不成熟的地方,導致 DApp 出現漏洞,最終影響瞭智能合約。不過 Solidity 的更新速度並沒有資本追逐區塊鏈的速度快,若過早將智能合約投入使用,勢必會造成大量的經濟損失。
另外,區塊鏈存在問題的不隻是合約層。以共識層為例,以太坊采用的是 PoW 共識機制,需要進行大量的哈希運算才能確保全網共識。它會造成算力浪費,並且在聯盟鏈中,該機制的可信程度也不怎麼高。
如果真有一天區塊鏈可以被應用於現實中,那麼它需要的不是化妝,而是整容。