區塊鏈的「智能合約」是一個容易引起爭議的概念,Vitalik 也說後悔用智能合約(smart contract)這個名字了,不如當初叫「persistent scripts」。本文作者認爲,智能合約和 DApp 的發展大體上可以分爲兩個方向:關注合約的約束力,必要的計算和存儲只是實現約束力的基礎;關注計算或者存儲能力,約束力只是用戶信任硬件資源提供方的一種手段。

原文標題:《智能合約到底是什麼?》
文章來源:公衆號 Jolestar 的博客
作者:jolestar
鏈聞經公衆號「Jolestar 的博客」授權轉載

區塊鏈的「智能合約」是一個容易引起爭議的概念,一次 Vitalik 也說後悔用智能合約(smart contract)這個名字了,不如當初叫「persistent scripts」,大約是爲這個概念吵累了。有人也問這玩意就是一段程序腳本,哪裏智能了?但如果這樣說,大約現在命名爲「智能」的東西沒有一個配得上吧,智能手機大約可以叫做可以自由安裝軟件的手機?何況英文的 smart 和 intelligent 在中文中都翻譯成「智能」,這更是容易引起誤解。

所以那次爭論中,也有人建議叫做「stored procedures」,就是數據庫的存儲過程。如果把區塊鏈看做一個分佈式數據庫的話,從技術實現上來看,智能合約確實很像數據庫存儲過程。使用一種新的編程語言也不是更本區別,如果使用更通用的 VM,可以和其他的程序使用完全一樣的編程語言。另外大家常說的確定性(deterministic),實際上也是圖靈機本身具備的特性,只要不引入隨機機制,也很難寫出不 deterministic 的程序。那爲什麼新造出個詞彙呢?套用一句俗話,我們在談論『智能合約』的時候,到底指的是什麼?

如果從技術角度看不出太大區別,那我們再從法律「合約」的角度看看。按照維基百科的定義:

Contract: A contract is a legally-binding agreement which recognises and governs the rights and duties of the parties to the agreement.

合約是定義了各方權利和義務的,具有法律約束力的協議。也就是說,合約的表現形式實際上不重要,可以是文本的,也可以是口頭的,關鍵是要具有法律約束力。

那我們套用到「智能合約」上,也可以說智能合約的表現形態也不是關鍵,關鍵也在於「約束力」。這裏我們給出一個定義:

智能合約就是定義各方權利和義務的,具有「約束力」的計算機程序。

那計算機程序的「約束力」如何產生?

智能合約的約束力

分析智能合約的約束力之前,我們先來看看法律合約的約束力。法律約束力來自於兩方面,一方面是簽訂合約的參與方有明確的合約的意向表達,比如酒桌上吹牛的話就很難作爲合約,合約要和日常的談話和文本有明確區別,這也是書面合同在這方面更容易減少誤解的原因。另外一方面是公權力提供了這樣一套司法執行體系,當合約不能正常履行的時候,可以尋求公權力的裁決執行。

如果說一個國家的司法體系相當於一個通過自然語言定義規則的操作系統,合約就是在這個操作系統上用自然語言寫的程序。自然語言的解釋執行當然得人腦來做,但由於自然語言的不嚴謹,人與人的差異,如何保證執行的結果的確定性?如何防止執行者作弊?這兩個難題是司法體系千百年來一直探索的難題。

切換到智能合約上,由於圖靈機的特性,程序執行結果的確定性容易保證,關鍵難題就是如何防作弊了,怎麼證明程序執行出的結果沒有被篡改?

程序執行結果的可信性,取決於控制程序執行硬件的組織或者個人的可信性,當前軟件系統,比如銀行或者互聯網應用,用戶只能以信任組織的方式來信任程序運行結果,也就是說約束力是單方的,最終用戶受到程序約束,但服務提供方几乎不受程序約束。用戶如果對結果有異議,只能訴諸其他手段,比如司法,或者如前段時間某交易所用戶去公司門口拉橫幅抗議。

那如果程序可以在不同組織或個人掌握的硬件上重複驗證,是不是就可以去除這種信任依賴?同時實現對雙方的約束?這個在司法體系中也是如此,比如一審,二審,終審等機制,只是司法體系的執行成本太高了,有爭議後才重複驗證,次數也受限。但計算機程序這點上成本就低很多,所以可以大規模重複驗證。

如果只有驗證能力,實際上並不能產生約束力,還需要有強制執行能力。如果雙方爭議的標的可以直接由程序操作,也就可以實現驗證並執行。這點上,區塊鏈通過定義數字化的資產以及經濟體系,來保證執行能力。

重複驗證的瓶頸

計算機重複驗證的成本雖然比人肉低許多,但如果每個交易都需要重複驗證執行,成本就高了,這就是大家常說的區塊鏈的 TPS (每秒交易數) 問題。那法院執行效率這麼低,爲什麼沒有成現實社會交易的瓶頸?區塊鏈現在的做法相當於法院掌握了所有人的資產以及合約執行細節,每次合約執行都通過法院進行,當然會成爲瓶頸。

而現實中的情況是大多數合約並不產生分歧或者爭議,所以也不需要法院來裁決,法院也無需知道細節,只有產生爭議時,才需要法院裁決,這時候雙方提交相關證據即可。那這套機制能不能搬到鏈上來呢?這就是區塊鏈二層(Layer2)網絡試圖要實現的目標。那關鍵問題就是如果沒有了鏈上的重複驗證,鏈下的合約約束力如何產生?

以太坊社區將 \” 反事實 \” 概念引入區塊鏈,提出了反事實狀態通道(Counterfactual state channel),試圖總結出一種通用的區塊鏈二層設計原則。這裏的 \” 反事實 \” 和法律體系中的 \” 反事實 \” 含義類似。法律合約本身的約束力主要來自於這種反事實推理,如果合約一方違反合約,另外一方則可以通過司法機構來強制執行,交易雙方最佳的策略是忠實執行合約,所以合約有了約束力。同樣,如果一個智能合約雖然沒有在鏈上執行,但如果有分歧時,任何一方都可以讓它在鏈上執行,則也同樣產生了約束力。

理論上,通過這樣的方式可以支持無限的 TPS。

智能合約的另外一種形態

前面說的智能合約都是通過編程語言表達出來,在鏈上執行的程序,即便是放到鏈下,也需要保證可以在鏈上執行,否則就無法裁決。但既然我們關注的是約束力,重複驗證只是實現約束力的一種方式,那有沒有其他辦法實現約束力?比如法院裁判合約的時候,並不是重複執行一遍然後驗證,而是驗證雙方提交的執行結果證明,或者是對方認可結果的證明,比如簽字。

比特幣上的 \” 智能合約 \” 就和這種機制類似。比特幣的模型下,鎖定腳本相當於一個鎖,確定了交易輸出的 BTC 的歸屬權,算不得前面定義的合約,但它可以通過密碼學方式設置解鎖條件,來達到合約的效果,比如實現兩種數字資產的交換(相當於買賣合約)。具體的實現方式這裏不詳述,感興趣的可以看看原子交換,閃電網絡,以及基於 Schnorr 簽名的 Discreet Log Contracts 。

這種機制的思路是合約具體怎麼執行不重要,只要保證合約最後爭議的標的的歸屬權即可達到約束效果。當然,這種機制下,合約能表達的合約類型受限。

前一段時間我們也做了一個小實驗項目,試圖在閃電網絡上實現智能合約。參與方互相驗證合約,有爭議時通過仲裁服務節點仲裁,資產通過閃電網絡的 hash time lock 機制互相抵押,仲裁方可以決定押金的歸屬,但無法直接取走押金。雖然也有聯合作弊的可能,但聯合作弊也有信任成本,風險要小於押金託管。

至此,可以看出來。如果我們焦距於智能合約約束力的構建,合約的驗證,裁決,執行,實際上是可以拆解開的,不一定要在同一層實現。

智能合約未來的兩種路線

如果只追求約束力,對智能合約的發展並沒太大分歧,但智能合約同時也是一種程序,它具有程序的所有特徵,所以產生了分歧。

爲了能校驗合約,鏈上會保留智能合約的狀態以及輸入參數,也就是說提供了存儲能力,同時也提供了合約運行環境,提供了計算能力。有了這兩種能力後,理論上任何互聯網應用都可以搬到鏈上了,同時還具有了約束力。所以以太坊將自己定義爲世界計算機,EOS 將自己定義爲一種 OS,都是用來運行去中心化應用 DApp 的平臺。

然而 DApp 試驗幾年,還是沒有大的起色。開始大家認爲是 TPS 的限制,於是 EOS 通過 DPoS 的機制減少參與共識的節點,以達到更高的 TPS,理論上也可以運行一個小規模的互聯網應用了,但依然沒有太大起色。那問題到底出在哪裏了?

關鍵在於我們一直按照互聯網應用的模式在思考 DApp,互聯網應用的模式是提供一個系統給所有人用,應用本身所需要的狀態存儲和計算能力,和因爲需要實現約束而產生的狀態存儲以及計算能力混合在了一起,所以幾乎沒有一個互聯網應用的價值能撐得起區塊鏈這樣規模的副本和重複計算。

所以現在智能合約和 DApp 的發展大體上可以分爲兩個方向:

一、關注合約的約束力,必要的計算和存儲只是實現約束力的基礎。這種思路下,開發者應該分析應用本身,拆解出需要約束的計算以及狀態,也就是代表應用方與用戶之間的合約的部分,然後構建證明和驗證機制,只把必要的數據提交到鏈上裁決,鏈並不需要重複執行應用,與合約無關的計算和存儲依然在鏈下。大多數二層網絡,以及多鏈,跨鏈系統的約束和仲裁機制,走的是這個方向。

這種路線下,最容易實現的是 DeFi 類的應用。因爲這類應用需要約束的狀態很明確,就是資產,通過智能合約的約束力解決資金託管難題。並且現實中的法律合約也大多實際和資產相關,如果能把現實中的法律合約遷移到鏈上執行或者仲裁,想象力空間是非常大的。這個路線面臨的最大的難題不在於技術,而在於和現實法律的衝突以及社會認知的變更。

二 .關注計算或者存儲能力,約束力只是用戶信任硬件資源提供方的一種手段。有了這種約束力,可以構建開放式的系統,吸納更多更廉價的硬件資源。如果只以保證必要的安全性爲目標,就可以減少重複驗證以及存儲副本,以期望給 DApp 提供比雲平臺更廉價的計算和存儲能力,至少成本上不要高太多,價格差可以通過開放性來彌補。比如 Filecoin,Truebit 等。這種路線下,短期看來,成本以及可靠性要超越雲平臺還是比較難的,技術難度要超過第一種路線,但好處是現實阻力沒那麼大。

當然,兩個方向各有各的難度,也不衝突,最好是兩個方向都成功了,就可以互相結合起來了。但如果試圖同時在同一層實現兩個方向,就會有衝突了,我個人認爲是不可能的。

對司法體系的啓示

既然智能合約可以通過區塊鏈進行裁決執行,那現實中的法律合約,是否也可以模擬出這樣的體系,來降低司法成本?那我們假設下,如果現實中的法律合約要通過計算機仲裁,需要哪些條件。比如一個借款合同,一方聲稱還錢了,有轉賬記錄爲證,另外一方認爲沒還,說這次轉賬不是還款,是另外一個原因。如何實現軟件程序裁決?

首先,有一種編程語言來表達這個合約。

其次,雙方必須有一套數字證書身份,都對這個智能合約進行簽名。

再次,銀行需要提供機制,轉賬時將轉賬記錄和合約關聯起來。同時提供給雙方一個數字憑證,和憑證的驗證接口。

最後,法院的裁決程序通過數字證書驗證雙方身份,通過銀行的數字憑證驗證還款交易,運行合約進行校驗,基本就可以進行裁決了,銀行收到裁決的結果後執行即可。

雖然這個過程有點簡化,但理論上是可行的,並且基本的技術也都具備了,只是當前不同的系統之間還是割裂的,無法提供數字證明機制,數字證書身份體系也還缺失。

所以,我一直建議法律人也可以關注下智能合約技術,雖然這個技術現在還沒到成熟階段,但它比法律合約的優勢非常明顯:

表達無歧義,執行結果明確。

跨自然語言,世界通用。

可計算機裁決,可預執行。

雖然還不敢說未來它的普及度有多大,但至少理論上,隨着未來資產的數字化,大多數和資產相關的合約都可以通過智能合約表達執行。

總結

區塊鏈領域有個說法叫 Code is law,代碼既法律,實際上我覺得應該反過來,說 Law is Code。區塊鏈以及智能合約就是想通過代碼構建出一套約束力體系,用代碼來描述這種規則(法律),將規則(法律)通過代碼表達並執行。

這套機制,如果從法律體系來看,是千年未有之大變革。它的意義堪比幾千年前人類把文本作爲法律刻在石頭上。如果試驗成功,就可能構建出獨立於國家主權的法律體系來。前兩天美國的開源基金會關於軟件出口的限制引起很大爭議,爲什麼開源基金會要註冊到某一個國家呢?因爲開源基金會也需要資金運作,需要銀行賬戶,萬一出現經濟糾紛,還需要依賴現有的司法體系來裁決。但區塊鏈已經造出了數字資產,有了組織定義能力,有了裁決體系,就有可能出現獨立於國家之外的開源組織。

當然有沒有可能完全替代現實中的法律體系呢?這也是不可能的。畢竟終極制裁是對人的肉體進行制裁,除非有一天,人類真把自己的大腦上傳到網上,現實中的肉體和資產對人來說完全失去了意義。不過也說不定呢?關於費米悖論的一個解釋就是,外星人覺得現實的宇宙太大太無聊,於是把自己上傳到了數字世界。