對區(qū)塊鏈技術(shù)稍有了解的人都知道,區(qū)塊鏈存在的基礎(chǔ)是系統(tǒng)中參與交易的所有人要對數(shù)字資產(chǎn)的歸屬達成共識揭斧。而從整體上看莱革,區(qū)塊鏈則是一種將系統(tǒng)內(nèi)交易進行編碼的可附加賬本,除了要達成數(shù)字資產(chǎn)歸屬權(quán)共識外讹开,基于區(qū)塊鏈技術(shù)的任何應(yīng)用要生效盅视,還要滿足很重要的兩點,一是每次交易必須有效旦万,二是過往交易歷史不能篡改闹击。
然而,要保證交易有效成艘,就必須遵循某一事先約定的規(guī)則∩桶耄現(xiàn)實世界中,各類交易都有相關(guān)的法律條款甲乙約束淆两。而在計算機世界里断箫,正如美國著名學(xué)者勞倫斯·萊斯格當年所提出的“代碼即規(guī)則”(code is law)——一旦代碼被編寫出來并開始執(zhí)行,就永遠不能回收了秋冰。這多少能解釋區(qū)塊鏈在某些具體應(yīng)用場景下面臨的情況仲义。
以比特幣客戶端為例,目前該客戶端擁有約 3 萬行代碼,而目前的工業(yè)標準允許每一百行代碼中存在一個 bug埃撵。理論上說赵颅,哪怕比特幣客戶端存在 300 個 bug 也是符合行業(yè)規(guī)則的。但事實并非如此暂刘,2010 年 8 月那個利用整數(shù)溢出漏洞憑空創(chuàng)造出 1840 億個比特幣的黑客(比特幣設(shè)計之初的限額僅為 2100 萬個)饺谬,差點就徹底毀滅了比特幣。
所以鸳惯,在區(qū)塊鏈技術(shù)中商蕴,由于缺乏統(tǒng)一的外部技術(shù)說明文檔,“代碼即規(guī)則”往往會失效芝发,甚至被認為有史以來最安全的以太坊架構(gòu),也面臨同樣的問題苛谷。
以太坊雖然僅僅誕生了四年辅鲸,但是隨著人們越來越多地了解區(qū)塊鏈技術(shù),以太坊的熱度逐漸增加腹殿。甚至在 2017 年時独悴,以太坊被認為是區(qū)塊鏈 2.0 時代最重要的底層開源系統(tǒng)。然而锣尉,最新的研究顯示刻炒,基于以太坊架構(gòu),被稱作是“最安全自沧、最可靠坟奥、最方便”的智能合約技術(shù)卻漏洞百出。
最新研究揭露智能合約存在巨大漏洞
眾所周知拇厢,智能合約被存放于以太坊的區(qū)塊鏈上爱谁。但這也就意味著,一旦區(qū)塊鏈發(fā)生問題孝偎,智能合約所涉及的交易信息也會受到牽連访敌。區(qū)塊鏈本質(zhì)上是一個共享賬本,它使用密碼技術(shù)以及計算機網(wǎng)絡(luò)來確保交易信息不會出差錯衣盾。
然而寺旺,在執(zhí)行智能合約的過程中,如果賬戶是 NULL(即沒有賬戶)势决,那么智能合約則會為此次交易創(chuàng)建一個賬戶阻塑,并將合約寫到該項目下。虛擬機則通過執(zhí)行合約中的二進制字節(jié)碼實現(xiàn)合約的執(zhí)行徽龟。也就是說叮姑,智能合約可以被用來創(chuàng)建加密貨幣。比如火幣網(wǎng)的 HT,就是用以太坊智能合約創(chuàng)建的。
然而,在倫敦大學(xué)學(xué)院(University College London,UCL)計算機科學(xué)系副教授伊利亞·謝爾蓋最新的研究論文《Finding The Greedy , Prodigal , and Suicidal Contractsat Scale》中功戚,通過對將近 100 萬份智能合約進行每份合約 10 秒分析時間的分析后發(fā)現(xiàn)氢架,這其中有 34200 份智能合約很容易受到黑客攻擊。同時他們又對 3759 份智能合約抽樣調(diào)查似将,在這之中,3686 份智能合約有 89% 的概率含有漏洞。
論文下載地址:https://arxiv.org/pdf/1802.06038.pdf
此外狂秘,研究也證明,以太坊的 Parity 錢包漏洞使得用戶電子財產(chǎn)會鎖死在以太坊躯肌,全以太坊被鎖死的財產(chǎn)總額已經(jīng)達到 2 億美元者春。事實上,在 2017 年 11 月時就有媒體爆料清女,因為一些以太坊智能合約使用者的誤操作钱烟,導(dǎo)致了 3 億美元永久被凍結(jié)在以太坊之中。
研究人員發(fā)現(xiàn)嫡丙,這些漏洞分別為:
浪子合約:交易資金因為漏洞返還給所有者拴袭、交易者過去發(fā)送給以太網(wǎng)的地址,以及特定地址曙博。這種漏洞就像是空手套白狼拥刻,買家得到商品,而賣家無法得到加密貨幣父泳。
自殺合約:智能合約的擁有者可以在以太坊發(fā)生故障時選擇退回般哼,類似于微信中的撤回選項。但是這個指令也可以被其他人執(zhí)行尘吗,使得交易失敗逝她。
貪婪合約:這是指那些永遠停留在以太坊的智能合約,上述的 Parity 漏洞正是一種貪婪合約睬捶,它會把智能合約所涉及的商品以及加密貨幣鎖定在以太坊中黔宛,交易雙方均無法得到,也不能取消擒贸。
遺囑合約:在那些已完成或者被關(guān)閉的智能合約中臀晃,雖然他們的代碼和全局變量被清楚了,但是其中一部分仍然在繼續(xù)執(zhí)行介劫。遺囑合約和貪婪合約一樣徽惋,均是由以太坊的錯誤引起,目前并不能被黑客利用座韵。
這四種漏洞是最具代表性的险绘,不過他們并不是以太坊智能合約的全部漏洞踢京。研究人員們雖然通過自制的 MAIAN 工具檢測出了包含這四種漏洞的智能合約,然而他們并沒有找到解決方案宦棺。
那么這樣看來瓣距,即使傳統(tǒng)金融交易模式比智能合約要麻煩,但是它能最大程度地避免漏洞代咸,使得交易更加安全可靠蹈丸。
什么是智能合約?
接著呐芥,DT 君給各位讀者做個科普逻杖。以太坊是一個基于公鏈的分布式計算平臺,同時思瘟,它還提供了一個去中心化的虛擬主機荸百。以太坊一共分為五層:
數(shù)據(jù)層:層如其名,數(shù)據(jù)層包含了以太坊中最基本的數(shù)據(jù)結(jié)構(gòu)以及賬戶加密算法潮太,而該層也是以太坊的基礎(chǔ)組成部分管搪。
網(wǎng)絡(luò)層:用于校驗以太坊中各個節(jié)點數(shù)據(jù)傳輸。
共識層:用于保存基于作量的共識機制铡买。
激勵層:用于保存激勵機制,主要負責激勵節(jié)點自主挖礦霎箍,維持以太坊運行奇钞。
合約層:以太坊獨有結(jié)構(gòu),是一臺封裝了可以執(zhí)行圖靈完備腳本語言的虛擬機漂坏,可以通過編寫腳本語言作為智能合約部署到以太坊區(qū)塊鏈中景埃,以此實現(xiàn)應(yīng)用的去中心化。
智能合約則是一種編碼顶别,在合約層有著可以自動運行的業(yè)務(wù)邏輯谷徙,并依靠以太坊的虛擬機而運行。智能合約代碼基于堆棧的字節(jié)碼低級語言驯绎,每一種字節(jié)代表著不同的操作完慧。通常來講,代碼的執(zhí)行過程中是無限循環(huán)的剩失,只有代碼完成執(zhí)行屈尼、中斷指令等才能停止其工作。
以太坊虛擬機是執(zhí)行交易代碼的引擎拴孤,這也是以太坊區(qū)塊鏈和其他區(qū)塊鏈最大的不同之處脾歧。它并不是像沙盒一樣完全獨立的,這意味著智能合約代碼在虛擬機中運行時演熟,不需要網(wǎng)絡(luò)和文件系統(tǒng)鞭执。
另外,在智能合約的執(zhí)行過程中,合約賬戶的作用也非常關(guān)鍵兄纺。該賬戶的地址取決于合約建立的時間大溜,當以太坊虛擬機運行時,賬戶的計算狀態(tài)可以通過 block_state囤热、transaction 等元組來定義猎提。通過程序執(zhí)行時對元組數(shù)據(jù)的修改(block_state 包含所有賬戶的全局信息),從而實現(xiàn)智能合約的執(zhí)行過程旁蔼。
從應(yīng)用方面來講锨苏,智能合約是一項能夠改善傳統(tǒng)金融模式的技術(shù),它通過上述的網(wǎng)絡(luò)架構(gòu)以及虛擬電子貨幣簡化了價值轉(zhuǎn)移的過程棺聊。大概可以被理解為三步:
1伞租、A 向區(qū)塊鏈發(fā)送一條信息,并在信息中定義了一筆交易限佩;
2葵诈、B 通過網(wǎng)絡(luò)廣播接受該交易信息;
3.祟同、區(qū)塊鏈網(wǎng)絡(luò)驗證作喘,完成交易。
也就是說晕城,智能合約和“把大象裝進冰箱”的原理差不多泞坦。在傳統(tǒng)金融模式中,交易雙方都需要通過監(jiān)管中心砖顷,而智能合約則可以利用區(qū)塊鏈的分布式賬本來跳過金融監(jiān)管贰锁,以達到便捷交易的目的,這也是所謂的“去中心化”滤蝠。
在以太坊中豌熄,智能合約由二進制字節(jié)碼組成,其使用的編程語言為 Solidity物咳。以太坊將智能合約編譯后锣险,存儲于區(qū)塊鏈中,從而實現(xiàn)了上述的信息中定義交易所森。
智能合約能否實現(xiàn)囱持?
實際上,以太坊也在日益進步焕济。想要開發(fā)一個完善的智能合約纷妆,還需要時間磨礪。
以太坊去中心化的核心是其可以運行圖靈完備的腳本語言晴弃,而開發(fā)以太坊智能合約則有四種語言:Serpent掩幢、Solidity逊拍、Mutan、LLL际邻。這些語言都是面向底層設(shè)計的語言芯丧。目前來看,Solidity 是首選語言世曾,這是由于它內(nèi)置了 Serpent 語言的所有特性缨恒,語法類則似于使用廣泛的 JavaScript。再加上 Solidity 的語言特性較少轮听,該語言則可以更簡單地實現(xiàn)完備的智能合約體系骗露。
區(qū)塊鏈去中心化的應(yīng)用程序通常為 DApp,它由智能合約和后端代碼構(gòu)成血巍。在 DApp 中萧锉,所有的服務(wù)和邏輯都運行于區(qū)塊鏈上,也就意味著 DApp 不僅需要設(shè)計前端應(yīng)用述寡,還要開發(fā)基于以太坊的智能合約代碼柿隙。
這些智能合約代碼以 JsonPRC 的方式提供給應(yīng)用程序進行調(diào)用,而此時鲫凶,智能合約就如以太坊中的轉(zhuǎn)賬操作一樣禀崖,被廣播到所有節(jié)點上,通知這些節(jié)點運行被調(diào)用的智能合約 ABI螟炫,然后這些被調(diào)用的 ABI 會各自運行在該節(jié)點的虛擬機中帆焕。最后通過區(qū)塊鏈的生成將運行過程和結(jié)果打包進區(qū)塊鏈,并通過區(qū)塊鏈的同步實現(xiàn)全網(wǎng)統(tǒng)一不恭。
換句話說,要想實現(xiàn)沒有漏洞的智能合約财饥,開發(fā)步驟則是關(guān)鍵所在换吧。截止至 2018 年 3 月 4 日,開源社區(qū)中比較流行的 DApp 開發(fā)工具是 browser-solidity钥星。聽名字就知道是一款基于瀏覽器的工具沾瓦,用戶可以在線編寫智能合約代碼,同時還能編譯成二進制字節(jié)碼部署到用戶所屬的區(qū)塊鏈中谦炒。
目前贯莺, Solidity 的版本是 0.4.21,看版本號就知道還處于測試階段宁改。這也就意味著其開發(fā)工具 browser-solidity 也存在不成熟的地方缕探,導(dǎo)致 DApp 出現(xiàn)漏洞,最終影響了智能合約还蹲。不過 Solidity 的更新速度并沒有資本追逐區(qū)塊鏈的速度快爹耗,若過早將智能合約投入使用耙考,勢必會造成大量的經(jīng)濟損失。
另外潭兽,區(qū)塊鏈存在問題的不只是合約層倦始。以共識層為例,以太坊采用的是 PoW 共識機制山卦,需要進行大量的哈希運算才能確保全網(wǎng)共識鞋邑。它會造成算力浪費,并且在聯(lián)盟鏈中账蓉,該機制的可信程度也不怎么高枚碗。
如果真有一天區(qū)塊鏈可以被應(yīng)用于現(xiàn)實中,那么它需要的不是化妝剔猿,而是整容视译。