06.14 以太坊和智能合約

以太坊和智能合約

清華大學教授 徐恪

以太坊是一個比較著名的運行智能合約的去中心化的平臺。康奈爾大學教授加密貨幣專家E. Gün Sirer認為,以太坊區塊鏈網絡與比特幣相比,在去中心化方面更勝一籌,因為以太坊節點在全球更分佈,它的參與者來自不同的更多實體。而比特幣的集中度很高,56%集中在數據中心及礦石領域,更有利於結構式的分佈。另外,以太坊發行自己的貨幣——以太幣,用於調整激勵機制,來獎勵給尋找區塊的礦工。以太坊與比特幣相比,主要存在以下四點區別:

一、以太坊基於賬戶,而比特幣基於UTXO(未花費輸出);

二、以太坊圖靈完備的腳本語言比比特幣更強大,支持智能合約運行;

三、以太幣的發行不是主要目的,是智能合約品臺激勵調整機制的副產品;

四、以太坊計劃在不久的將來過渡至PoS(權益證明),比特幣仍然停留在PoW(工作量證明)上。

如此來看,以太坊回到了賬戶的概念,這個賬戶包括地址、餘額和代碼(可選)。賬戶分為兩種類型:一是外部賬戶,一般是個人或公司實體擁有的,合約以賬戶的形式存在;二是合約賬戶,合約以代碼的形式存在。

那麼,智能合約如何執行呢?在以太坊中,所有賬戶加在一起就是整個網絡狀態,每個網絡狀態由每個區塊更新,區塊可看成是一個狀態轉移的函數,是狀態發生的變化,所有賬戶與網絡、其他賬戶、其他合約和合約狀態之間的交互都通過“交易”進行。

以太坊智能合約是何方神聖?

在瞭解以太坊的背景之後,我們再來看智能合約。這個概念最早由Nick Szabo在1995年提出,智能合約是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協議。

有人把智能合約稱為區塊鏈2.0,它確實有別於以比特幣為代表的數字貨幣。在以太坊中,智能合約由網絡本身執行,具有諸多特性:網絡共識不需要可信第三方、無人可依違反合約、無法偽造合約的執行、允許在區塊鏈上達成永久的P2P的共識。

簡單看智能合約的優點和缺點,有很多優點可以帶來一些新的社會合作模式。但其實也存在很多問題,比如效率低,只能做高值低頻工作、法幣支持困難、數模綁定難題、代碼安全問題、隱私問題等。

而以太坊智能合約有四個目的:存儲和維護數據、管理不可信用戶之間的合約/關係、作為軟件庫為其他合約提供函、支持複雜權限管理。大家看其實很通用,並沒有針對某些特定的應用做優化,並且以上特性可以組合使用。這是以太坊一直堅持的,做一個最基本、對代碼執行機制的支持。

很多年前人們學習數據庫,數據庫裡有一個叫存儲過程,它是一個預先編制一系列SQL語句,存在數據庫裡面,不用臨時現編語句,這跟我們現在看到智能合約很類似。其實從多個渠道驗證智能合約並不是特別新的概念。存儲過程是管理人執行,智能合約同樣,但智能合約權限管理是一個最大的問題,很多的漏洞都是在權限管理的時候出現,對用戶的地址、對數據擁有者沒有做嚴格驗證導致它出現問題。

以太坊虛擬機如何運行合約代碼?

接下來我們來看EVM(以太坊虛擬機)的具體執行。其實虛擬機也不是新概念,以太坊是通過自己的虛擬機,在虛擬機框架裡運行合約代碼,每一個節點執行的是虛擬機的代碼。

以太坊虛擬機設計目標,首先要簡潔,操作碼越底層越好,數量儘量減少;其次是空間高效性、確定性,代碼的執行應該是確定的,每一次重複執行是相同的結果;然後是專業性,因為要特別針對20字節的地址和密碼學中常用的32字節數據做一些常用的處理;最後是安全性,以太坊有一個特別的設計——GAS機制,來自於區塊鏈本身有這樣一個激勵機制可以設計GAS機制。

我們做了一個對比,以太坊的虛擬機和JAVA虛擬機,前者更輕量級,然後有GAS機制,可以極大減輕它做其他安全措施的壓力。它的範圍會小一點,主要是智能合約的應用,而JAVA虛擬機是一個更復雜虛擬執行環境,適用於各種應用場景。

說到GAS問題,以太坊想了一個經濟機制,就像有人說比特幣雖然解決了分佈式系統一致性的問題,但它並不是一個完美的經濟方案。但以太坊想了一個GAS方案,每一個合約包含GAS,GAS就像汽油,合約執行時會“燃燒”掉,虛擬機操作時需要GAS才能執行,每一筆交易都有消耗的GAS的最大數量。當GAS消耗完以後,如果當前執行沒有完成,就會回滾到交易最初的狀態,所以你必須把足夠的GAS衝進去,才能夠保證交易正常進行。

智能合約的舉例和分析

看一下智能合約的幾個例子,以太坊白皮書上有一個非常簡單的事例,就是代幣系統,是隻包含操作(send)的數據庫,保證Alice有足夠的錢,並且發起了交易,很簡單幾行代碼完成了轉帳操作。

還有一些類似的公共註冊,像常用的DNS系統,中間有很多的安全問題,包括到底誰有DNS控制權,大家爭論了很久,其實這種問題完全可以用以太坊實現:把一個名字註冊到一個地址,這個地址很容易放在鏈上,大家需要的時候可以上鍊上查找,像區塊鏈這樣的平臺很適合DNS公共查找基礎平臺。

此外,任何公共分佈式數據存儲都可以考慮智能合約解決方案。傳統分佈式數據庫分為兩種:物理分佈式邏輯集中式、物理和邏輯上都是分佈式,但實現難題在於數據一致性、不同分區之間的可靠性、數據讀寫操作的權限等。如果換一個思路,通過智能合約,其實可以有一個新的路徑讓底層區塊鏈的共識算法保證數據的一致性,數據可靠性也不依賴於單點穩定性,單點的崩潰不會造成全網數據的丟失,智能合約嚴格傳遞了權限,操作的結果在全網進行記錄。但性能問題目前未達成共識,目前只適用於關鍵數據上鍊,不適用過大的存儲體積和過高的交易吞吐。

智能能源網、物聯網也是智能合約常見的場景。另外還有一個去中心化的預測市場,再往前走一步,就變成了有一點像賭博性,比如NBA西部總決賽開始了,你可以預測,是火箭贏還是勇士贏,把大家的預測放在一個分佈式平臺上去做,它的模式是用一些購買費用看到底誰會贏,它的價格代表預測的概率,如果你去買大家都不認可的人,這樣才會有一個超額的回報。

智能合約的安全性分析

智能合約本質是計算機程序,計算機程序就是代碼,只要是代碼就會大概率出現漏洞。

來看幾個案例,4月22日美圖合約漏洞導致價值歸零,4月24日SMT智能合約類似的漏洞被黑客利用。這是一個很嚴重的問題,因為普通代碼的問題,可能丟失數據、可能造成崩潰,但智能合約的漏洞被利用,造成的是最直接的經濟損失。

今年年初,我們看到新加波科研工作者對以太坊上的智能合約做了細緻分析,主要是對漏洞進行分析,設計了合約漏洞的形式化驗證方法,設計了合約漏洞的檢測工具,並在Github上開源。

按照它的分析,大致分成三類:一是貪婪型,有進無出型,相當於以太幣鎖定在合約上,永遠無法取出;二是揮霍型,任何人都可以得到合約中的以太幣;三是自殺型,任何用戶都可以終止該合約。

研究人員對幾萬個合約進行了分析,實驗結果顯示69%的合約存在問題,最大99%都存在問題。就是一小段代碼,框出來了,如果用安全加值就不會溢出。但是開發者沒有正確採用,它用了一個簡單的沒有考慮它可能會有溢出的可能,帶來了問題,導致後門被利用,漏洞被利用帶來了很大的危害。這就是重入攻擊,類似還有重放攻擊、短地址攻擊。

這個問題我們必須得解決,其實有這樣一些可能的思路,可以將合約安全性問題得到顯著改善:首先是檢測,檢測包括靜態形式化檢查和驗證機制、動態分析以及模糊測試技術。還有一個思路是對整個鏈的設計,從新的角度考慮,功能分層,包括對操作系統分裝,這兩種角度可以同時發力,共同努力讓代碼質量有一個提升。

來具體談談檢測技術,這個技術在智能合約裡有廣泛的應用前景,叫CFI,最早在CCS2005提出,並被廣泛應用於安全漏洞分析理論研究之中。前面文章我們發現的一些漏洞是由於底層EVM自身執行機制的問題導致代碼的非正常跳轉,其實CFI可以防止這種重入的發生。CFI 核心思想是限制程序運行中的控制轉移,使之始終處於原有的控制流圖所限定的範圍內。

最後再來看一些常見的測試,比如模糊測試,通過對目標系統提供非預期的輸入,不正常的輸入看輸出是不是有問題,有的時候靠異常的輸入來考驗程序。在這種情況下,模糊測試是比較好的手段,針對智能合約可以有另外模糊系統,在另外層面完成合約執行,提高效率,分析結果看會不會發現隱藏的漏洞。

剛才講代碼層的措施,從整個鏈的設計角度,看是否可以對安全性有所增強。這裡面主要提出了鏈結構分層,底層區塊鏈就做關鍵數據存儲和研究,其他複雜業務在鏈外進行操作。

從這些分層結構,我們可以得到一些啟發:首先鏈上的合約邏輯複雜性會大大降低,鏈上的代碼本身不會特別的複雜,代碼越簡單出現漏洞可能性越小,因為漏洞往往都是很複雜的流程,把複雜過程放到鏈下處理,關鍵數據存儲再用鏈上合約,這是一個我們能想象到的,從結構的角度來解決安全性的問題。

我最近比較關注一個叫Elastos的項目,它做區塊鏈的操作系統,我覺得這個想法對於安全性有幫助,要基於區塊鏈,基於Elastos創造一個未來安全互聯網,這是一個小夢想,當然很難,但是從架構設計上還是有一點啟發,把操作系統對於應用訪問做了一個分裝,所有的應用不能直接訪問網絡資源,保證分裝這一層安全性,這樣應用對於網絡不透明瞭,應用操作系統提供了訪問機制,這也是一種新的思路。


分享到:


相關文章: