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