在區塊鏈的相關討論中,“智能合約”是一個出現頻率極高的詞匯。“智能合約”是區塊鏈技術的重要組成部分,也是區塊鏈技術實現核心價值“信用”的重要環節之一。然而人們往往通過“智能合約”的字面意思對其做出簡單的解讀,將之描繪為一種能夠在未來取代“合約”和“公證”的技術。在各類媒體報道文章中,“智能合約”被大量的曲解和誤讀著。筆者特在此圍繞“智能合約”概念對以下問題逐一展開解讀:“智能合約”到底是什么?“智能合約”和傳統意義上的合約有什么區別?“智能合約”到底能否取代法律概念上的“合約”和“公證”?
“智能合約”到底是什么?
對于“智能合約”的定義是各種各樣的。有的文件將“智能合約”定義為“一種用計算機語言取代法律語言去記錄條款的合約”。作為法律從業人員而言,這種定義方法是完全錯誤的。
還有文件將“智能合約”定義為“基于區塊鏈的圖靈完備的編程腳本語言,適合各種區塊鏈數據結構和共識協議”。這種定義方法也不準確。比特幣所采用的語言是“圖靈不完備”的,但是比特幣語言中同樣植入了“智能合約”。
中國電子技術標準化研究院聯合數十家單位于2017年5月16日發布的《中國區塊鏈技術和產業發展論壇標準 CBD-Forum-001-2017》中,將智能合約(smart contract)定義為“以數字形式定義的能夠自動執行條款的合約 ”,“注:在區塊鏈技術領域,智能合約是指基于預定事件觸發、不可篡改、自動執行的計算機程序。”
備注里的這句話揭示了“智能合約”的本質。“智能合約”本質上是一種“計算機程序”,而不是“合約”。不要通過“合約”的基本特征去理解“智能合約”,而要通過“計算機程序”的基本特征去理解“智能合約”。
不過這種定義仍然沒有清楚的解釋“智能合約”到底是什么。
要理解“智能合約”,得從中本聰設計比特幣的轉賬功能說起。
假如你是2009年的中本聰,你已經找到了解決雙重支付的方法,現在要設計比特幣的轉賬功能了。你會怎么做呢?通常的設計方案會是這樣:
發送方向比特幣網絡發一份廣播,其內容是這樣的:“從A地址轉賬1 BTC給B地址。同時附上A地址私鑰的簽名”。網絡各節點收到廣播,校驗簽名合法。于是從A地址扣掉1 BTC,給B地址加上1 BTC。
簡潔明了對不對?但是如果是這樣的設計,我們就無法看到今天區塊鏈技術在各領域的落地扎根、欣欣向榮。中本聰的設計方案是這樣的:
發送方向比特幣網絡發一份廣播,其內容是這樣的:“我要轉賬1 BTC,并且我提供了一段腳本,這段腳本作為鑰匙可以打開這1 BTC上的鎖;同時,我根據接收方的要求為這1 BTC加個新的鎖”。
網絡各節點收到廣播,運行腳本,發現確實能“開鎖”,于是根據發送方的指令給這筆比特幣換上一把“新鎖”,這筆比特幣也就有了新的主人。當接收方想使用這1 BTC時,只要能提供一段新的腳本作為鑰匙打得開這把新鎖就行。
乍一看,中本聰的設計似乎非常繁瑣和反直覺,然而這樣的設計卻另辟蹊徑,打開了一個全新的天地。腳本是一種簡單的計算機語言,比如Java就是一種腳本。比特幣的腳本可以表述的內容非常靈活,遠遠超出了一對一轉賬的范疇。例如:A可以按照約定加鎖,設置必須由收款人B和擔保人C同時簽名才能支配某筆比特幣(擔保交易),也可以設置B、C、D中任意兩人簽名就能支配(聯名賬戶);也可以設置B必須在一年后才能動用某筆比特幣(延時支付),也可以設置任何人都能支配(撒錢)或者都不能支配(燒錢)。通過這套內置的腳本編程語言,你可以靈活地編寫出各種各樣的約定——而這其實就是“智能合約”的來源。用比特幣腳本編寫的合約系統,使得比特幣成為了人類歷史上第一種可編程的貨幣。
注意,中本聰這種設計思路和傳統方式最大的變化就是,貨幣移交的重心不在于從一方轉移到另一方,而是在權屬變化的同時預設了“開啟條件”。這個“開啟條件”的預設思路是根植于區塊鏈技術的本身設計思想的。因為區塊鏈去中心化,分布式存儲,所有數據每個參與節點都有相同的一份,那么大家擁有同樣的數據,怎么才能分清各自的權益呢?方法就是給所有的數據都加上對應的“鎖”,某個人或某組人用自己的專屬鑰匙才能開啟對應的“鎖”,從而獲得對自己權益的處分權。傳統貨幣動用前也會驗證簽名和密碼,但是驗證的目的僅僅在于校驗身份。比特幣則不僅僅是校驗身份,而且還校驗是否符合“開啟條件”。這個預設的“開啟條件”就是區塊鏈所說的“智能合約”。
對于區塊鏈技術應用的其他領域,此處的比特幣轉賬替換成價值的傳遞、轉移、交換即可