區塊鏈時代下的智能合約,你了解多少?

袁文澤博客 發佈 2024-01-10T18:32:04.872258+00:00

合約,又稱合同,指兩方或多方當事人之間達成的協議,約定在未來某個事件發生時或滿足某種條件時,各方如何履行各自的責任義務,享有各自的權益。買賣、租賃、借貸……大部分涉及當事人之間的協議合約,無不是一方付出金錢或等價物,另一方提供產品、服務或對方需要的東西,這樣的合約不勝枚舉。

合約,又稱合同,指兩方或多方當事人之間達成的協議,約定在未來某個事件發生時或滿足某種條件時,各方如何履行各自的責任義務,享有各自的權益。買賣、租賃、借貸……大部分涉及當事人之間的協議合約,無不是一方付出金錢或等價物,另一方提供產品、服務或對方需要的東西,這樣的合約不勝枚舉。

入職、買房、銀行開戶等,現實生活中我們經常和各種各樣的合約打交道。除了少數情況下我們需要從頭開始逐條協商合約條款,很多時候我們簽署執行的其實是「格式合同」,又稱「標準合同」,指合同當事人一方預先擬好合同條款,按照固定的模板填寫或更改具體條件和參數,另一方只能表示接受或不接受。對於非擬定條款的當事人一方而言,要訂立格式合同,就必須全部接受合同條件,否則就不訂立合同。格式合同的出現,一般是因為擬定條款的一方是處於賣方市場的供給方,而可以反覆使用的格式合同也為需求方提供了便利,車票、船票、機票、保險單等都是格式合同。

智能合約www.yuanwze.cn概念的出現最早可以追溯到1994年,尼克·紹博將其定義為「執行合同條款的計算機化交易協議」(見圖2)。智能合約設計的總體目標是滿足常見的合同條件(例如支付條款、留置權、保密性,甚至執行),最大限度地減少惡意和偶然異常的情況發生,並最大限度地減少對可信中介的需求。據說,尼克·紹博發明智能合約這個概念,是受到自動售貨機的啟發。智能合約誕生在區塊鏈之前,也就是說這個概念最初和區塊鏈並沒有必然的聯繫。

很多網際網路服務都已經有了智能合約的影子。例如,很多銀行提供了「自動還款」業務,用戶會把自己的電話費、家庭的水電氣費等公用事業費用與自己的銀行帳戶綁定,不同服務商按事先的「約定」,按期自動將款項從指定帳戶划走,這可以算是一種智能合約。

IFTTT是If This Then That(如果這個……則那個……)的縮寫,是一個流行且實用的網際網路服務,在移動網際網路和物聯網普及後更為流行。IFTTT定義如果「這個」網絡服務滿足條件,就會自動觸發「那個」網絡服務去執行下一個動作,且條件和動作都可以由用戶根據自身需求設置(見圖2)。IFTTT能將前後兩個不同的網絡服務連通,以實現各種各樣的功能,並且為用戶不間斷地工作。IFTTT的這種可視化的腳本編輯和自動執行,可以被認為是一種廣義的智能合約。

在過去很多年裡,這些網際網路上實現的智能合約已經在我們的生活中無處不在,只不過我們並沒有把這些功能稱為「智能合約」。另外,過去網際網路上的這些廣義的智能合約在形式上大多更接近于格式合同:用戶只需要選擇一些常用的既定模版,選擇一些需要的規則,填寫一些需要修改的參數即可。其實,這種做法最接近用戶的習慣,也比較容易理解,普通用戶不需要任何計算機知識也可以使用。

比特幣腳本

比特幣的核心是一個分布式帳本,按照我們直觀的想像,這個帳本進行轉帳的時候,比如A給B轉1枚比特幣,就是先在A的帳戶減少1枚比特幣,然後在B的帳戶加上1枚比特幣,作為用戶我們可以這麼去理解這一過程,但實際上比特幣的實現遠沒這麼簡單。比特幣採用比特幣腳本來實現這個過程,並通過腳本實現更多的功能,這也是為什麼比特幣被稱為一種「可編程的貨幣」。

為什麼比特幣要通過腳本來實現,而不是把功能邏輯直接實現在鏈的節點代理中?這主要是為了能實現一定程度的可擴展性,這樣鏈只需要實現最基礎的功能,而鏈的使用者可以通過腳本最大限度地在鏈的基礎功能上擴展更多的功能。從這個角度來看,不得不說中本聰在設計比特幣時非常具有前瞻性。

腳本語言是為了縮短傳統的編程過程而創建的一類語言,通常都有簡單、易學、易用的特性,目的就是快速完成工作。但比特幣腳本語言不支持循環、不支持複雜的流控制功能,也就是說,比特幣腳本語言不是圖靈完備的,這意味著其複雜性有限,交易可執行的次數可預知。由於比特幣腳本不是一種通用語言,它不會產生無限循環或其他類型的未知邏輯錯誤(有時被稱為「邏輯炸彈」),因此難以利用比特幣腳本的特性開展對系統的攻擊。

我們可以認為比特幣腳本是一種區塊鏈智能合約的雛形。究竟比特幣腳本能不能算是智能合約,有很多不同的看法,但基本上屬於「名詞之爭」。至少可以看到,在如何實現區塊鏈的可編程和可擴展方面,比特幣和以太坊走上了截然不同的道路:以太坊的智能合約語言強調圖靈完備,而比特幣腳本特意設計為非圖靈完備。

以太坊的智能合約

以太坊的成功真正讓智能合約成為顯學,而以太坊的成功本身也得益於智能合約。通過以太坊官網上的自我介紹——「以太坊是一個運行智能合約的分布式平台」可以看出這一點(見圖3)。智能合約運行在以太坊虛擬機上,以太坊是一個由所有運行乙太網節點的設備組成的分布式計算網絡。

以太坊的智能合約是通過以太坊虛擬機實現的。以太坊虛擬機是以太坊的基礎,它負責執行所有的交易,並且根據這些交易來維護整個以太坊的帳戶狀態。部署或者調用智能合約是交易的一種。智能合約是由虛擬機執行的代碼,目的是實現複雜的業務邏輯。

以太坊虛擬機被設計成一個相對封閉的環境,不支持對網絡API、文件系統等的直接訪問。以太坊虛擬機就是一個沙盒環境,只能處理區塊鏈內部的狀態。區塊鏈沒有主動獲取數據的能力,它能用的只有區塊鏈本身的數據。當智能合約互相調用時,以太坊虛擬機會在一個全新的環境中運行新合約,這樣即使出現問題也不會破壞原有執行環境,為智能合約的執行提供了一個沙盒環境。

以太坊的智能合約是通過虛擬機方式來運行的,這讓很多人誤以為要實現智能合約必須通過虛擬機來運行,以為以太坊的做法是實現智能合約的唯一方法,甚至形成了凡是公鏈必須支持智能合約、必須實現虛擬機的觀點。這樣的理解是不正確的。

以太坊的官網和官方文檔里沒有對智能合約的準確定義。在以太坊的概念里,「智能合約」和「程序」似乎等同,其本身除了名字之外和我們常規理解的「智能」(多指有更高級的智能邏輯,甚至人工智慧)以及「合約」並沒有直接的聯繫。從某種程度上可以說,以太坊對「智能合約」進行了一種曲解和誤導。2018年10月,以太坊創始人維塔利克·布特林在推特上表示,他對以太坊採用「智能合約」這個術語感到遺憾,認為應該稱其為「持久性腳本」之類的更專業的名詞。但無論如何,既然這已經約定俗成,我們也就只能將錯就錯了。

其他區塊鏈的智能合約實現

Hyperledger Fabric的鏈上代碼、Cosmos和Polkadot採用的WASM、ArcBlock採用的和節點相同的虛擬機方式,都可以被認為是在以太坊智能合約之外嘗試與疊代不同的實現方式,虛擬機並非執行智能合約的唯一方案(見圖4)。

(嵌入式運行指節點代碼直接負責腳本的解釋執行)

不採用虛擬機。在Tendermint中,並不存在虛擬機這一層,應用程式是一個標準的作業系統進程,採用不受任何限制與約束的方式實現智能合約。

WASM虛擬機。目前有不少區塊鏈採用基於WASM的虛擬機來實現智能合約,例如,EOS率先使用WASM,最近以太坊也計劃升級至2.0版,放棄以太坊虛擬機而轉投向WASM,Polkadot也選擇了WASM。

其他虛擬機。除WASM外,我們還看到少數項目採用了以現有硬體指令集為基礎的虛擬機,例如有項目使用RISC–V指令集。採用這些硬體指令集的虛擬機來實現區塊鏈,究竟利弊如何,是譁眾取寵還是確有其優勢,尚且需要時間來證明。

Docker容器環境。Hyperledger Fabric的鏈上代碼設計使用Docker容器技術作為智能合約的運行環境。其運行方式是在節點部署一個鏈上代碼後,所有相關節點均會啟動一個在Docker容器中獨立運行的鏈上代碼進程。鏈上代碼通過容器中對外的gRPC接口完成與節點的交互。目前對於鏈上代碼的運行,Hyperledger Fabric仍然採用一種較為手動和底層的方式來管理維護。因為是聯盟鏈的環境,相當於默認所有被許可加入網絡的節點均可以較為自覺地使用系統資源,即准入限制方式。但根據其開發計劃,未來版本將提供更去中心化的鏈上代碼管理能力。

採用和節點相同的虛擬機環境。ArcBlock採用和節點相同的虛擬機環境,讓區塊鏈框架更為靈活(見圖5)。ArcBlock的區塊鏈系統則完全搭建在Erlang虛擬機上,因此智能合約代碼在執行的時候,和系統本身是平級的。由於Erlang虛擬機有許多功能可以很好地支持分布式集群,在處理區塊鏈系統這種去中心化多節點的複雜活動時,Erlang虛擬機本身已經處理了許多常見問題。

註:圖中所示的是實現跨鏈的一個智能合約,交易雙方在對方的鏈上鎖定標的,然後完成交換。

關鍵字: