百度安全研究院:區塊鏈智慧合約介紹

百度安全發表於2020-08-06

摘要

智慧合約 (smart contract) 是一種由事件驅動的、具有狀態的程式碼合約和演算法合同 [11],隨著以比特幣為代表的區塊鏈技術的蓬勃發展, 區塊鏈技術已經開始逐步超越可程式設計貨幣時代而進入智慧合約時代。智慧合約作為區塊鏈的核心部分,在技術中得到廣泛應用,也是令區塊鏈成為具有一定顛覆性技術的原因之一。本文通過對智慧合約的背景知識以及流程介紹,總結出當前智慧合約的特點和應用領域,從而為區塊鏈智慧合約技術的發展提供一定參考。

1 引言

區塊鏈利用分散式節點共識演算法對資料進行生成和更新,使用由自動化指令碼程式碼組成的智慧合約來程式設計和運算元據的一種全新的分散式基礎架構與計算正規化 [10],本身具有去中心化的特性。

區塊鏈的發展主要分為三大階段 [6],第一階段為以比特幣為首的可程式設計貨幣,第二階段為以智慧合約為首的可程式設計金融,第三階段為以去中心化應用為首的可程式設計社會。比特幣發展迅速,區塊鏈發展階段逐漸向第二階段過渡,以以太坊為首的智慧合約技術得到了廣泛關注。

1995 年,由密碼學家 Szabo 提出智慧合約這一概念,由於當時缺少可信的執行環境,智慧合約並沒有被應用到實際產業中。比特幣誕生後,由於比特幣的底層技術區塊鏈具有去中心化的特性,滿足智慧合約所需的可信的執行環境,區塊鏈可以提供參與的各個節點的互信。

智慧合約是一種計算機協議,在協議制定和部署後,不需要外加人為干預,即可實現自我執行和自我驗證 [4]。從技術角度來說,智慧合約可以被看作一種計算機程式,這種程式可以自主地執行全部或部分和合約相關的操作,併產生相應的可以被驗證的證據,來說明執行合約操作的有效性。在部署智慧合約之前,與合約相關的所有條款的邏輯流程就已經被制定好了。智慧合約通常具有一個使用者介面,以供使用者與已制定的合約進行互動,這些互動行為都嚴格遵守此前制定的邏輯。得益於密碼學技術,這些互動行為能夠被嚴格地驗證,以確保合約能夠按照此前制定的規則順利執行,從而防止出現違約行為。

image.png

表 1: 傳統合約和智慧合約的比較

智慧合約是在傳統合約基礎上對安全性、唯一性進行改進的一種合約,用數字形式定義的承諾來保障合約參與者的協議安全可靠。

區塊鏈的智慧合約最早建立在以太坊,用一段程式碼來實現條款在處理硬體和軟體中的應用,這段程式碼執行在以太坊的虛擬機器中,按照特定程式執行操作,在相應的時間節點完成條款內容。

以太坊是一個開源的具有智慧合約功能的公共區塊鏈平臺,以太坊專案借鑑了比特幣區塊鏈的技術,對它的應用範圍進行了擴充套件。如果說比特幣是利用區塊鏈技術的專用計算器,那麼以太坊就是利用區塊鏈技術的通用計算機。簡單地講,以太坊 = 區塊鏈 + 智慧合約。

與比特幣相比,以太坊最大的不同點是:它可以支援更加強大的指令碼語言,即使用一套圖靈完備的指令碼語言來建立應用,允許開發者在上面開發任意應用,實現任意智慧合約,這也是以太坊的最強大之處。作為平臺,以太坊可以類比於蘋果的應用商店,任何開發者都可以在上面開發應用,並出售給使用者。

2 智慧合約型別

智慧合約分為廣義智慧合約和狹義智慧合約。廣義的智慧合約是指執行在區塊鏈上的計算機程式,適用範圍較廣。狹義的智慧合約是執行在區塊鏈基礎架構上,基於約定規則,由事件驅動、具有狀態、能夠儲存賬本上資產,利用程式程式碼來封裝和驗證複雜交易行為,實現資訊交換、價值轉移和資產管理,可自動執行的計算機程式 [9]。

2.1 指令碼型智慧合約

將比特幣中的智慧合約稱為指令碼型智慧合約。由於比特幣中的指令碼僅包含指令和資料兩部分,其中涉及到的指令碼指令只需要完成有限的交易邏輯,不需要複雜的迴圈、條件判斷和跳轉操作,功能有限但編寫較為容易,支援的指令不到 200 條。

2.2 圖靈完備型智慧合約

將主要執行在以太坊和超級賬本中的智慧合約稱為圖靈完備型智慧合約。指令碼語言被設計成為僅在有限範圍內執行有限功能的簡單執行語言,是非圖靈完備的語言。使用指令碼語言編寫的交易指令雖然能夠滿足比特幣應用,但無法適應以太坊平臺的開發需求。目前,以太坊主要使用 Solidity和 Serpent 兩種智慧合約開發語言。

2.3 可驗證合約型智慧合約

將正在研發中的 kadena 專案中的智慧合約稱為可驗證合約型智慧合約。可驗證語言的語法類似於 Lisp 語言,用於編寫執行在區塊鏈 Kadena 上的智慧合約,可實現合約的資料儲存和授權驗證等功能。為防止在複雜合約的程式設計過程中可能存在的安全漏洞以及因此而帶來的風險,可驗證合約型語言採用非圖靈完備設計,不支援迴圈和遞迴。該語言編寫的智慧合約程式碼可以直接嵌入在區塊鏈上執行,不需要事先編譯成為執行在特定環境(如以太坊 EVM)的機器程式碼。

3 智慧合約語言

3.1 Solidity

Solidity 可以用來開發合約並編譯成以太坊虛擬機器位元組程式碼,執行在 Etheream 虛擬機器(EVM)之上。是靜態型別語言,支援繼承、庫和複雜的使用者定義型別等特性。雖然 Solidity 語法與 Javascript 較為接近,是一種物件導向的語言,但是兩者又有許多不同:

  1. 由於語言內嵌框架是支援支付的,所以可以提供如 payable 之類的關鍵詞,實現在語言層面直接支援支付,更為簡便;
  2. 由於以太坊底層是基於賬戶而非 UTXO,故存在特殊型別 Address,可以用於定位使用者和合約,並定位合約的程式碼;
  3. 由於智慧合約是將原來的一個簡單函式呼叫變成了網路節點中的程式碼執行,故在去中心化的網路執行環境中,會更加強調合約或函式執行的呼叫方式;
  4. 由於為了保證合約執行的原子性,以避免中間狀態出現的資料不一致,Solidity 的異常機制一旦出現異常,所有執行都會被回撤。

常用的 Solidity 整合有 Remix、Visual studio Extension 等。以編譯器 Remix 為例,Remix 是基於瀏覽器的

IDE,整合了編譯器和 Solidity 執行時的環境,不需要額外的服務端元件。這裡用 Solidity 開發“Hello World”。可以看到,在 decoded output 中返回_HelloW_ orld ! 。

3.2 Serpent

Serpent 和 Python 類似,使用用 LLL 編譯,最終會被編譯為 EVM 位元組碼。可以用於開發合約編譯成以太坊虛擬機器位元組程式碼。Serpent 是一種分組加密演算法,更加簡潔,將低階語言在效率方面的優點和程式設計風格的操作簡易相結合,同時合約程式設計增加了獨特的領域特定功能。

3.3 Lisp Like Language

Lisp Like Language(LLL) 是和 Assembly 類似的低階語言。更為簡單,本質上只是直接對以太坊虛擬機器的一點包裝。是一門 Lisp 風格的底層程式語言,持續更新,並且與 Solidity 同屬一個資源庫。

4 智慧合約執行機制

以以太坊開發平臺為例,智慧合約執行機制主要包含及下階段:

  1. 生成程式碼:智慧合約一般具有值和狀態兩個屬性,程式碼中用 If-Then 和 What-If 語句預置了合約條款的相應觸發場景和響應規則,在合約各方面內容都達成一致的基礎上,評估確定該合同是否可以通過智慧合約實現,即“可程式設計”,然後由程式設計師利用合適的開發語言將以自然語言描述的合同內容翻譯為成為可執行的機器語言;
  2. 編譯:利用開發語言編寫的智慧合約程式碼一般不能直接在區塊鏈上執行,而需要在特定的環境(以太坊為 EVM, 超級賬本為 Docker 容器)中執行,所以在將合約檔案上傳到區塊鏈之前需要利用編譯器對原始碼進行編譯,生成符合環境執行要求的位元組碼。;
  3. 提交:智慧合約的提交和呼叫是通過“交易”完成,當使用者以交易形式發起提交合約檔案後,通過 P2P 網路進行全網廣播,各節點在進行驗證後儲存在區塊中;
  4. 確認:被驗證後的有效交易被打包進新區塊,通過共識機制達成一致後,新區塊新增到區塊鏈的主鏈。根據交易生成智慧合約的賬戶地址,之後可以利用該賬戶地址通過發起交易來呼叫合約,節點對經驗證有效的交易進行處理,被呼叫的合約在環境中執行。

5 智慧合約專案

最簡單的合約是:資訊上傳區塊鏈——雙方簽字確認——雙方達成共識——合約被儲存。

image.png

圖 2: 合約執行機制

image.png

圖 3: 合約基本模型

Language Language 是一種安全穩定的分散式語言,符合 Szabo 對智慧合約設計理念的特點,所有的遠端通訊會被加密。

Hawk Hawk 是一種去中心化的智慧合約系統,是一個用智慧合約構建隱私保護的框架 [2],在這個系統中不會以明確的方式將金融交易儲存在區塊鏈中,Hawk 編譯器負責將程式編譯為區塊鏈和使用者之間的加密協議。

OpenBazzar OpenBazzar 平臺是一家利用比特幣進行交易的去中心化電商平臺,是一個開源平臺,直接將使用者與使用者連線開展交易,實現點對點交易網路,買賣雙方可以直接進行交易,不需要藉助中心化平臺,保證了隱私。

Ethereum Ethereum 是具有圖靈完備程式語言的區塊鏈平臺,包含了公有鏈和私有鏈,可以建立任何應用。使用共識機制中的 PoW 機制,擁有更高的處理速度和精度,可以在沒有處理所有交易的情況下驗證應用狀態,目標成

為分散式應用平臺的脊樑。但區塊的構造時間受到交易處理速度的影響,建塊速度受到很大影響。

Codius Codius 是由 Ripple 實驗室釋出的智慧協議,具有去中心化、安全性高等特點,可以實現點對點交易網路, 是一種開源平臺,應用於 Ripple 平臺上,實現的功能是引導貨幣流通。

Hyperledger Hyperledger 是一種 Linux 基金會下的區塊鏈開源平臺,以容器的形式執行智慧合約,具有較高安全性。

6 智慧合約基本特點

6.1 優勢

可信性 智慧合約的承諾包含兩方面,一是自動,無需信任和公正地執行合約;二是直接,在合約執行的各個環節中取消中間人這一角色 [5]。智慧合約的所有條款和執行過程是提前制定好的,並由計算機絕對執行。因此所有執行的結果都是準確無誤的,不會出現不可預料的結果。

交易無需第三方 智慧合約不需要中心化的權威來仲裁合約是否按規定執行,合約的監督和仲裁都由計算機來完成 [1]。在一個區塊鏈網路中一般不存在一個絕對的權威來監督合約的執行,而是由共識機制來判斷合約是否按規定執行,監督方式通常由 PoW 或 PoS 技術實現。由於智慧合約的數字化特點,資料被儲存在區塊鏈中,使用加密程式碼強制執行協議,保證交易可追蹤和不可逆轉。

高效的實時更新 由於智慧合約的執行不需要人為的第三方權威或中心化代理服務的參與,其能夠在任何時候響應使用者的請求,大大提升了交易進行的效率。使用者只需通過網路對業務進行辦理,節省了人力、物力。

更低成本 智慧合約具有去人為干預的特點,其能夠大大減少合約履行、裁決和強制執行所產生的人力成本,要求合約制定人能夠將合約的各個細節在合約建立之初就確定下來。

6.2 目前存在的問題

不可撤銷性 智慧合約自動履行合約內容,但在現實生活中,合同可能會因為一些不可抗力、違法等原因解除。合同法中,對於合同的要求是避免律師預測和協商可能出現結果的靈活性。但由於區塊鏈的不可修改性,智慧合約一旦觸發就會自動履行,不可撤銷,具有一定的僵化特性。

法律效力 智慧合約的起草需要通過第三方計算機程式設計師,而在合約出現問題時若判定是第三方計算機程式設計師的責任,那麼對於錯誤的演算法應該如何追究責任。在法律管轄權問題上,智慧合約作為一種新興合約方式,哪些法院可以受理訴訟、現有的法律條款應該如何修改等問題都是亟待解決的。

安全漏洞 智慧合約的漏洞分為交易順序依賴漏洞、時間戳依賴漏洞、處理異常漏洞和可重入缺陷漏洞 [3],依賴性漏洞是由於智慧合約的執行正確與否與以太坊的狀態有關,而有效的交易可能會影響以太坊的狀態。當一個新的區塊含有兩筆交易時,交易的先後順序可能會引起以太坊的最終狀態不同,而交易的順序取決於礦工,從而導致智慧合約的執行依賴於礦工的操作 [8]。時間戳依賴漏洞是由於某些智慧合約是根據區塊中的時間戳所執行的,而時間戳是由礦工根據自身的時間所設定的,若時間被攻擊者所修改,可能會導致產生一定風險。在不同的智慧合約相互呼叫時可能出現處理異常漏洞,若被呼叫的合約產生錯誤返回值卻沒有被正確驗證時,可能會遭受到攻擊。若一個函式在執行完成前被呼叫了數次,導致發生意料不到的行為時,可重入漏洞就可能出現,可重入缺陷漏洞是指攻擊者可以利用呼叫了智慧合約而狀態未改變的中間狀態對合約進行反覆的呼叫。

7 智慧合約應用場景

7.1 法律方面

在法律層面,區塊鏈智慧合約可以被看作為智慧合同 [10],即運用區塊鏈技術來實現法律合同,將書面化的法律語言轉化為可被自動化執行的技術。

以數字版權保護為例,類似於自由文化影響下的知識共享協議的開放式版權協議不斷出現,如何保證版權的實用行為,是數字版權保護的核心問題。由於傳統的版權保護具有時間、空間的限制,在版權登記、監管機制等方面容易受到影響,而數字版權保護的出現極大改善了這一問題,更好適應了數字資產形式變化多樣、易傳播的特點。

在版權登記方面,利用區塊鏈技術原理中計算值的唯一性和不可篡改性,對不同的作品生成不同的計算值,將計算值視為作品的一種代表方式進行關聯,可以減少作品追溯和儲存的成本,簡化作品查詢流程。

在署名方式方面,使用數字身份對計算值對應的作品進行署名,使用加密技術對數字作品進行保護,保障作品不會被篡改。

根據合約程式碼和自然語言的比例,智慧合約有以下幾種表現形式:1、完全以程式碼形式編寫的合約;2、以程式碼和自然語言兩種形式書寫的合約。如果法律認為無論是以自然語言書寫還是以計算機語言編寫,都視為合同的書面形式, 法律效力是相同的,那麼兩種語言編寫的合約構成了完整的合同。

智慧合同可能面臨的問題有,第 2 種合同是以兩種語言表現的,如果這兩個版本合約內容上有衝突,以哪一個版本為準,無論是以自然語言版本為準還是以程式碼語言為準,都需要法律進一步明確並給出司法解釋。

7.2 金融方面

在金融層面,因為智慧合約可以在區塊鏈中運作,從而充當很多角色。智慧合約可以作為經濟參與者,接受資訊、儲存資訊,消除人工參與,降低成本,保證合約交易的高效。

以物聯網為例,當前社會物聯網包括數十億個通過網際網路共享資料的節點,通過物聯網、區塊鏈以及智慧合約技術的融合應用,物聯網支援的物理裝置或財產,如公寓、汽車、停車場、自行車等,都可以允許人們在沒有中間商的情況下出租、出售或共享 [7]。

當前租房市場在押金方面存在很多爭議,一些不良房東在收到押金後就卷錢跑路。將智慧合約引入到租房押金中, 在所有者設定出租房屋的金額後,使用者通過交易向區塊鏈支付押金,從而觸發許可,獲得房屋的智慧鎖許可權。與此同時,押金被鎖定在區塊鏈中,直到使用者決定向區塊鏈傳送另一個交易來返回虛擬金鑰(如支付租金),智慧合約自動執行,在扣除押金中的租金後將剩餘金額傳送給所有者,交易完成。這一過程將縮減不必要的時間,只需要通過手機進行操作,提高效率的同時降低風險。

但智慧合約可能會帶來新的金融犯罪行為和風險,例如機密資訊洩漏、加密金鑰被盜等犯罪行為,而當前的法院和監管機構暫時很難跟上這一技術的發展步伐,由於智慧合約具有一定的複雜性,在一些消費者眼裡是難以理解的, 這也是智慧合約實施中需要解決的問題之一。

image.png

圖 4: 子系統節點部署

7.3 公益慈善

在公益慈善層面,當前面臨的最大問題是資金流向不透明,導致很多人並不會使用眾籌平臺來進行慈善捐款。眾籌是一種通過網際網路方式釋出籌款專案並籌集資金的方式,眾籌更為開放,具有門檻低、依靠大眾力量等特點。如何

解決資金資訊公開透明,加強監管和監督,成為當前公益慈善的熱點討論之一。

區塊鏈是遺傳使用密碼學方法產生關聯的資料塊,每一個資料塊中都還喊了一定時間的交易資訊,每個資料塊都包含上一個塊的雜湊值,以用於驗證其資訊的有效性 [12]。智慧合約可以通過程式碼合約實現對眾籌系統價值流的控制, 將眾籌業務流轉換為智慧合約程式碼。區塊鏈的不可更改和共識機制保證了資料的真實和可靠性,可以提高眾籌平臺的公信力。

眾籌區塊鏈總體設計包含雙資料系統、雙私有鏈設計、高速與信譽機制、智慧合約設計、審計與監督設計、可擴充套件鏈式設計。

由於區塊鏈的分散式儲存架構,可以在不同使用者處放置不同許可權的節點,讓不同使用者參與到管理中,對於釋出的訊息實現可追蹤和不可修改。通過不斷互聯,使區塊鍊形成互聯鏈、鏈中鏈,按照統一標準進行管理監管,解決慈善公益的監管和監督問題。

參考文獻

[1] Bartoletti, M., and Zunino, R. Bitml: A calculus for bitcoin smart contracts. pp. 83–100.

[2] Kosba, A., Miller, A., Shi, E., Wen, Z., and Papamanthou, C. Hawk: The blockchain model of cryptography and privacy-preserving smart contracts. pp.839–858.

[3] Luu, L., Chu, D.-H., Olickel, H., Saxena, P., and Hobor, A. Making smart contracts smarter. pp. 254–269.

[4] Mourouzis, T., and Tandon, J. Introduction to decentralization and smart contracts, 03 2019.

[5] Pfitzmann, B., Schunter, M., and Waidner, M. Optimal efficiency of optimistic contract signing.

[6] V.Buterin. A next-generation smart contract and decentralized application platform. white paper (2014).

[7] 劉德林. 區塊鏈智慧合約技術在金融領域的研發應用現狀、問題及建議. 海南金融 _000_, 10 (2016), 27–31.

[8] 張傑. 區塊鏈安全綜述. 西安文理學院學報 (_自然科學版_) (2020), 42–55.

[9] 王群, 李馥娟, 王振力, 樑廣俊, and 徐傑. 區塊鏈原理及關鍵技術. 電腦科學與探索, 1–24.

[10] 賀小苗. 區塊鏈技術的應用: 智慧合約及法律問題前瞻. 現代商業 _000_, 16 (2018), 153–154.

[11] 賀海武, 延安, and 陳澤華. 基於區塊鏈的智慧合約技術與應用綜述. 計算機研究與發展 _55_, 11 (2018), 112–126.

[12] 黃潔華, 高靈超, and 許玉壯. 眾籌區塊鏈上的智慧合約設計. 資訊保安研究 (2017).

相關文章