區(qū)塊鏈的智能合約是如何定義的
區(qū)塊鏈的智能合約是一個容易引起爭議的概念,一次 Vitalik 也說后悔用智能合約(smart contract)這個名字了,不如當初叫 “persistent scripts”,大約是為這個概念吵累了。有人也問這玩意就一是一段程序腳本,哪里智能了?但如果這樣說,大約現(xiàn)在命名為智能的東西沒有一個配得上吧,智能手機大約可以叫做可以自由安裝軟件的手機?何況英文的 smart 和 intelligent 在中文中都翻譯成智能,這更是容易引起誤解。
所以那次爭論中,也有人建議叫做 “stored procedures”,就是數(shù)據(jù)庫的存儲過程。如果把區(qū)塊鏈看做一個分布式數(shù)據(jù)庫的話,從技術實現(xiàn)上來看,智能合約確實很像數(shù)據(jù)庫存儲過程。使用一種新的編程語言也不是更本區(qū)別,如果使用更通用的 VM,可以和其他的程序使用完全一樣的編程語言。另外大家常說的確定性(deterministic),實際上也是圖靈機本身具備的特性,只要不引入隨機機制,也很難寫出不 determinisTIc 的程序。那為什么新造出個詞匯呢?套用一句俗話,我們在談論『智能合約』的時候,到底指的是什么?
如果從技術角度看不出太大區(qū)別,那我們再從法律『合約』的角度看看。按照維基百科的定義:
Contract: A contract is a legally-binding agreement which recognises and governs the rights and duTIes of the parTIes to the agreement.
合約是定義了各方權利和義務的,具有法律約束力的協(xié)議。也就是說,合約的表現(xiàn)形式實際上不重要,可以是文本的,也可以是口頭的,關鍵是要具有法律約束力。
那我們套用到『智能合約』上,也可以說智能合約的表現(xiàn)形態(tài)也不是關鍵,關鍵也在于『約束力』。這里我們給出一個定義:
智能合約就是定義各方權利和義務的,具有『約束力』的計算機程序。
那計算機程序的『約束力』如何產(chǎn)生?
智能合約的約束力
分析智能合約的約束力之前,我們先來看看法律合約的約束力。法律約束力來自于兩方面,一方面是簽訂合約的參與方有明確的合約的意向表達,比如酒桌上吹牛的話就很難作為合約,合約要和日常的談話和文本有明確區(qū)別,這也是書面合同在這方面更容易減少誤解的原因。另外一方面是公權力提供了這樣一套司法執(zhí)行體系,當合約不能正常履行的時候,可以尋求公權力的裁決執(zhí)行。
如果說一個國家的司法體系相當于一個通過自然語言定義規(guī)則的操作系統(tǒng),合約就是在這個操作系統(tǒng)上用自然語言寫的程序。自然語言的解釋執(zhí)行當然得人腦來做,但由于自然語言的不嚴謹,人與人的差異,如何保證執(zhí)行的結果的確定性?如何防止執(zhí)行者作弊?這兩個難題是司法體系千百年來一直探索的難題。
切換到智能合約上,由于圖靈機的特性,程序執(zhí)行結果的確定性容易保證,關鍵難題就是如何防作弊了,怎么證明程序執(zhí)行出的結果沒有被篡改?
程序執(zhí)行結果的可信性,取決于控制程序執(zhí)行硬件的組織或者個人的可信性,當前軟件系統(tǒng),比如銀行或者互聯(lián)網(wǎng)應用,用戶只能以信任組織的方式來信任程序運行結果,也就是說約束力是單方的,最終用戶受到程序約束,但服務提供方幾乎不受程序約束。用戶如果對結果有異議,只能訴諸其他手段,比如司法,或者如前段時間某交易所用戶去公司門口拉橫幅抗議。
那如果程序可以在不同組織或個人掌握的硬件上重復驗證,是不是就可以去除這種信任依賴?同時實現(xiàn)對雙方的約束?這個在司法體系中也是如此,比如一審,二審,終審等機制,只是司法體系的執(zhí)行成本太高了,有爭議后才重復驗證,次數(shù)也受限。但計算機程序這點上成本就低很多,所以可以大規(guī)模重復驗證。
如果只有驗證能力,實際上并不能產(chǎn)生約束力,還需要有強制執(zhí)行能力。如果雙方爭議的標的可以直接由程序操作,也就可以實現(xiàn)驗證并執(zhí)行。這點上,區(qū)塊鏈通過定義數(shù)字化的資產(chǎn)以及經(jīng)濟體系,來保證執(zhí)行能力。
重復驗證的瓶頸
計算機重復驗證的成本雖然比人肉低許多,但如果每個交易都需要重復驗證執(zhí)行,成本就高了,這就是大家常說的區(qū)塊鏈的 TPS (每秒交易數(shù)) 問題。那法院執(zhí)行效率這么低,為什么沒有成現(xiàn)實社會交易的瓶頸?區(qū)塊鏈現(xiàn)在的做法相當于法院掌握了所有人的資產(chǎn)以及合約執(zhí)行細節(jié),每次合約執(zhí)行都通過法院進行,當然會成為瓶頸。
而現(xiàn)實中的情況是大多數(shù)合約并不產(chǎn)生分歧或者爭議,所以也不需要法院來裁決,法院也無需知道細節(jié),只有產(chǎn)生爭議時,才需要法院裁決,這時候雙方提交相關證據(jù)即可。那這套機制能不能搬到鏈上來呢?這就是區(qū)塊鏈二層(Layer2)網(wǎng)絡試圖要實現(xiàn)的目標。那關鍵問題就是如果沒有了鏈上的重復驗證,鏈下的合約約束力如何產(chǎn)生?
以太坊社區(qū)將“反事實”概念引入?yún)^(qū)塊鏈,提出了反事實狀態(tài)通道(Counterfactual state channel),試圖總結出一種通用的區(qū)塊鏈二層設計原則。這里的“反事實”和法律體系中的“反事實”含義類似。法律合約本身的約束力主要來自于這種反事實推理,如果合約一方違反合約,另外一方則可以通過司法機構來強制執(zhí)行,交易雙方最佳的策略是忠實執(zhí)行合約,所以合約有了約束力。同樣,如果一個智能合約雖然沒有在鏈上執(zhí)行,但如果有分歧時,任何一方都可以讓它在鏈上執(zhí)行,則也同樣產(chǎn)生了約束力。
理論上,通過這樣的方式可以支持無限的 TPS。
智能合約的另外一種形態(tài)
前面說的智能合約都是通過編程語言表達出來,在鏈上執(zhí)行的程序,即便是放到鏈下,也需要保證可以在鏈上執(zhí)行,否則就無法裁決。但既然我們關注的是約束力,重復驗證只是實現(xiàn)約束力的一種方式,那有沒有其他辦法實現(xiàn)約束力?比如法院裁判合約的時候,并不是重復執(zhí)行一遍然后驗證,而是驗證雙方提交的執(zhí)行結果證明,或者是對方認可結果的證明,比如簽字。
比特幣上的“智能合約”就和這種機制類似。比特幣的模型下,鎖定腳本相當于一個鎖,確定了交易輸出的 BTC 的歸屬權,算不得前面定義的合約,但它可以通過密碼學方式設置解鎖條件,來達到合約的效果,比如實現(xiàn)兩種數(shù)字資產(chǎn)的交換(相當于買賣合約)。具體的實現(xiàn)方式這里不詳述,感興趣的可以看看原子交換,閃電網(wǎng)絡,以及基于 Schnorr 簽名的 Discreet Log Contracts 。
這種機制的思路是合約具體怎么執(zhí)行不重要,只要保證合約最后爭議的標的的歸屬權即可達到約束效果。當然,這種機制下,合約能表達的合約類型受限。
前一段時間我們也做了一個小實驗項目,試圖在閃電網(wǎng)絡上實現(xiàn)智能合約。參與方互相驗證合約,有爭議時通過仲裁服務節(jié)點仲裁,資產(chǎn)通過閃電網(wǎng)絡的 hash TIme lock 機制互相抵押,仲裁方可以決定押金的歸屬,但無法直接取走押金。雖然也有聯(lián)合作弊的可能,但聯(lián)合作弊也有信任成本,風險要小于押金托管。
至此,可以看出來。如果我們焦距于智能合約約束力的構建,合約的驗證,裁決,執(zhí)行,實際上是可以拆解開的,不一定要在同一層實現(xiàn)。
智能合約未來的兩種路線
如果只追求約束力,對智能合約的發(fā)展并沒太大分歧,但智能合約同時也是一種程序,它具有程序的所有特征,所以產(chǎn)生了分歧。
為了能校驗合約,鏈上會保留智能合約的狀態(tài)以及輸入?yún)?shù),也就是說提供了存儲能力,同時也提供了合約運行環(huán)境,提供了計算能力。有了這兩種能力后,理論上任何互聯(lián)網(wǎng)應用都可以搬到鏈上了,同時還具有了約束力。所以以太坊將自己定義為世界計算機,EOS 將自己定義為一種 OS,都是用來運行去中心化應用 DApp 的平臺。
然而 DApp 試驗幾年,還是沒有大的起色。開始大家認為是 TPS 的限制,于是 EOS 通過 DPoS 的機制減少參與共識的節(jié)點,以達到更高的 TPS,理論上也可以運行一個小規(guī)模的互聯(lián)網(wǎng)應用了,但依然沒有太大起色。那問題到底出在哪里了?
關鍵在于我們一直按照互聯(lián)網(wǎng)應用的模式在思考 DApp,互聯(lián)網(wǎng)應用的模式是提供一個系統(tǒng)給所有人用,應用本身所需要的狀態(tài)存儲和計算能力,和因為需要實現(xiàn)約束而產(chǎn)生的狀態(tài)存儲以及計算能力混合在了一起,所以幾乎沒有一個互聯(lián)網(wǎng)應用的價值能撐得起區(qū)塊鏈這樣規(guī)模的副本和重復計算。
所以現(xiàn)在智能合約和 DApp 的發(fā)展大體上可以分為兩個方向:
一。 關注合約的約束力,必要的計算和存儲只是實現(xiàn)約束力的基礎。這種思路下,開發(fā)者應該分析應用本身,拆解出需要約束的計算以及狀態(tài),也就是代表應用方與用戶之間的合約的部分,然后構建證明和驗證機制,只把必要的數(shù)據(jù)提交到鏈上裁決,鏈并不需要重復執(zhí)行應用,與合約無關的計算和存儲依然在鏈下。大多數(shù)二層網(wǎng)絡,以及多鏈,跨鏈系統(tǒng)的約束和仲裁機制,走的是這個方向。
這種路線下,最容易實現(xiàn)的是 DeFi 類的應用。因為這類應用需要約束的狀態(tài)很明確,就是資產(chǎn),通過智能合約的約束力解決資金托管難題。并且現(xiàn)實中的法律合約也大多實際和資產(chǎn)相關,如果能把現(xiàn)實中的法律合約遷移到鏈上執(zhí)行或者仲裁,想象力空間是非常大的。這個路線面臨的最大的難題不在于技術,而在于和現(xiàn)實法律的沖突以及社會認知的變更。
二。 關注計算或者存儲能力,約束力只是用戶信任硬件資源提供方的一種手段。有了這種約束力,可以構建開放式的系統(tǒng),吸納更多更廉價的硬件資源。如果只以保證必要的安全性為目標,就可以減少重復驗證以及存儲副本,以期望給 DApp 提供比云平臺更廉價的計算和存儲能力,至少成本上不要高太多,價格差可以通過開放性來彌補。比如 Filecoin,Truebit 等。這種路線下,短期看來,成本以及可靠性要超越云平臺還是比較難的,技術難度要超過第一種路線,但好處是現(xiàn)實阻力沒那么大。
當然,兩個方向各有各的難度,也不沖突,最好是兩個方向都成功了,就可以互相結合起來了。但如果試圖同時在同一層實現(xiàn)兩個方向,就會有沖突了,我個人認為是不可能的。
對司法體系的啟示
既然智能合約可以通過區(qū)塊鏈進行裁決執(zhí)行,那現(xiàn)實中的法律合約,是否也可以模擬出這樣的體系,來降低司法成本?那我們假設下,如果現(xiàn)實中的法律合約要通過計算機仲裁,需要哪些條件。比如一個借款合同,一方聲稱還錢了,有轉賬記錄為證,另外一方認為沒還,說這次轉賬不是還款,是另外一個原因。如何實現(xiàn)軟件程序裁決?
首先,有一種編程語言來表達這個合約。
其次,雙方必須有一套數(shù)字證書身份,都對這個智能合約進行簽名。
再次,銀行需要提供機制,轉賬時將轉賬記錄和合約關聯(lián)起來。同時提供給雙方一個數(shù)字憑證,和憑證的驗證接口。
最后,法院的裁決程序通過數(shù)字證書驗證雙方身份,通過銀行的數(shù)字憑證驗證還款交易,運行合約進行校驗,基本就可以進行裁決了,銀行收到裁決的結果后執(zhí)行即可。
雖然這個過程有點簡化,但理論上是可行的,并且基本的技術也都具備了,只是當前不同的系統(tǒng)之間還是割裂的,無法提供數(shù)字證明機制,數(shù)字證書身份體系也還缺失。
所以,我一直建議法律人也可以關注下智能合約技術,雖然這個技術現(xiàn)在還沒到成熟階段,但它比法律合約的優(yōu)勢非常明顯:
1. 表達無歧義,執(zhí)行結果明確。
2. 跨自然語言,世界通用。
3. 可計算機裁決,可預執(zhí)行。
雖然還不敢說未來它的普及度有多大,但至少理論上,隨著未來資產(chǎn)的數(shù)字化,大多數(shù)和資產(chǎn)相關的合約都可以通過智能合約表達執(zhí)行。
總結
區(qū)塊鏈領域有個說法叫 Code is law,代碼既法律,實際上我覺得應該反過來,說 Law is Code。區(qū)塊鏈以及智能合約就是想通過代碼構建出一套約束力體系,用代碼來描述這種規(guī)則(法律),將規(guī)則(法律)通過代碼表達并執(zhí)行。
這套機制,如果從法律體系來看,是千年未有之大變革。它的意義堪比幾千年前人類把文本作為法律刻在石頭上。如果試驗成功,就可能構建出獨立于國家主權的法律體系來。前兩天美國的開源基金會關于軟件出口的限制引起很大爭議,為什么開源基金會要注冊到某一個國家呢?因為開源基金會也需要資金運作,需要銀行賬戶,萬一出現(xiàn)經(jīng)濟糾紛,還需要依賴現(xiàn)有的司法體系來裁決。但區(qū)塊鏈已經(jīng)造出了數(shù)字資產(chǎn),有了組織定義能力,有了裁決體系,就有可能出現(xiàn)獨立于國家之外的開源組織。
當然有沒有可能完全替代現(xiàn)實中的法律體系呢?這也是不可能的。畢竟終極制裁是對人的肉體進行制裁,除非有一天,人類真把自己的大腦上傳到網(wǎng)上,現(xiàn)實中的肉體和資產(chǎn)對人來說完全失去了意義。不過也說不定呢?關于費米悖論的一個解釋就是,外星人覺得現(xiàn)實的宇宙太大太無聊,于是把自己上傳到了數(shù)字世界。