談到區(qū)塊鏈,必然離不開“智能合約”這個(gè)詞。我們?cè)诒鞠盗械牡谝黄恼轮刑岬健爸悄芎霞s”(smart contract)是由多產(chǎn)的跨領(lǐng)域法律學(xué)者 Nick Szabo 在1995年提出來的,他的定義為:“一個(gè)智能合約是一套以數(shù)字形式定義的承諾,包括合約參與方可以在上面執(zhí)行這些承諾的協(xié)議。”那么,我們?cè)撊绾卫斫膺@段話呢?
回顧一下比特幣區(qū)塊鏈系統(tǒng)中的轉(zhuǎn)賬:
Alice 轉(zhuǎn)賬給 Bob 100比特幣,在比特幣區(qū)塊鏈系統(tǒng)中是這樣記錄的:
本質(zhì)上,這就是一個(gè)合同。這個(gè)合同里面規(guī)定了 Alice 要轉(zhuǎn)給 Bob 100比特幣,該合同立即生效。注意,里面有一個(gè)“解鎖信息”,這個(gè)“解鎖信息”本質(zhì)上就是 Alice 證明自己是 Alice 的地址持有者時(shí)需要提交的一個(gè)信息。
顯然,像比特幣區(qū)塊鏈系統(tǒng)里面,純UTXO模式的這種合同用處是很有限的。首先,比特幣是一個(gè)獨(dú)立運(yùn)行的封閉系統(tǒng),它的轉(zhuǎn)賬腳本沒有提供和外界進(jìn)行交互的接口。所有信息(這里主要是解鎖信息)只能在腳本提交到區(qū)塊鏈之前定死,之后就只能按照固定方式運(yùn)行。這對(duì)于“合同”來說是不符合實(shí)際應(yīng)用的。
在我們實(shí)際生活中,一個(gè)完整的合同制定——執(zhí)行流程是按照如下方式隨著時(shí)間流逝而進(jìn)行的:
其中,條件的達(dá)成通常是一個(gè)外部輸入的事件,這意味著,我們實(shí)際生活中的合同通常是“事件驅(qū)動(dòng)”型的。這個(gè)“事件”是否發(fā)生通常不是區(qū)塊鏈上的數(shù)據(jù)能夠判斷出來的,而是依靠事件發(fā)生的時(shí)間點(diǎn),通過鏈外輸入數(shù)據(jù)的方式實(shí)現(xiàn)。
以電子商務(wù)為例,Alice 在某寶的某個(gè)商家購買了一臺(tái)筆記本電腦,當(dāng) Alice下單成功的那一刻,實(shí)質(zhì)上就生成了一個(gè)合同。這個(gè)合同包含了 Alice 需要在多長時(shí)間內(nèi)付款到第三方平臺(tái)(事件1)。然后賣家看到 Alice 付款后需要發(fā)貨,當(dāng) Alice 收到貨以后需要點(diǎn)擊確認(rèn)收貨(事件2),完成整個(gè)合同(在不考慮售后的情況下)。
在這個(gè)合同的執(zhí)行過程中,事件1由于是一個(gè)純粹的金融活動(dòng),已經(jīng)高度的虛擬化,能夠?qū)崿F(xiàn)自動(dòng)發(fā)現(xiàn)事件自動(dòng)觸發(fā)。而事件2則是一個(gè)在現(xiàn)實(shí)世界中發(fā)生的活動(dòng),需要我們“點(diǎn)擊確認(rèn)收貨”來把這個(gè)事件的發(fā)生同步到虛擬世界中,這個(gè)“點(diǎn)擊確認(rèn)收貨”就是虛擬世界中的事件2。所以,對(duì)于某寶的購物合同而言,事件1實(shí)質(zhì)上是 Alice 是否轉(zhuǎn)賬到平臺(tái),事件2是 Alice 是否點(diǎn)擊確認(rèn)收貨。因此,在這個(gè)合同中,預(yù)留了一個(gè)和外部交互的接口——確認(rèn)收貨。
除了和外部的交互能力外,比特幣轉(zhuǎn)賬合同(腳本)的另一個(gè)重要缺陷是它不是圖靈完備的。這句話對(duì)于非計(jì)算機(jī)專業(yè)的人來說可能不太好理解,我們可以簡單的理解為它沒有循環(huán)能力和復(fù)雜的條件控制能力。
合同的循環(huán)能力在我們現(xiàn)實(shí)世界中是很常見的,例如我們和電信運(yùn)營商簽署的移動(dòng)電話服務(wù)合同,通常就是一個(gè)循環(huán)合同。這種合同以自然月為單位,每個(gè)月自動(dòng)循環(huán)執(zhí)行。還有類似的企業(yè)間簽訂的長期采購合同,都是一種不斷循環(huán)的合同。合同中規(guī)定的事件(或時(shí)間點(diǎn))全部達(dá)成以后,自動(dòng)循環(huán)回第一步,重新執(zhí)行。
而復(fù)雜的條件控制能力就更常見了——合同中的違約條款就是條件控制能力。事件達(dá)成怎樣,沒有達(dá)成如何執(zhí)行違約條款等,這些都需要合同擁有復(fù)雜的條件控制能力。
比特幣中的交易是使用比特幣區(qū)塊鏈底層平臺(tái)定義的一套腳本語言來寫的,由于當(dāng)初比特幣區(qū)塊鏈系統(tǒng)是按照一個(gè)數(shù)字貨幣的模型進(jìn)行設(shè)計(jì)的,因此它并不需要這些復(fù)雜的能力。但是如果我們需要區(qū)塊鏈技術(shù)在其他商業(yè)場(chǎng)合進(jìn)行應(yīng)用,很多時(shí)候就需要這些能力。比如我們利用以太坊平臺(tái)來實(shí)現(xiàn)某個(gè)業(yè)務(wù),那么整個(gè)流程是這樣子的:
目前,關(guān)于智能合約的爭議仍然是很多的。主要包含兩方面:
1 合同本身是否是雙方真實(shí)意思的表達(dá)
a)在現(xiàn)實(shí)世界中,我們撰寫的合同除了受合同細(xì)節(jié)的約束外,還受到了外部法律和行業(yè)慣例的約束。而在智能合約中,外部法律和行業(yè)慣例如果不能嚴(yán)格的體現(xiàn)在合同中,那么合同就不是雙方真實(shí)意思的表達(dá)了。
b)在現(xiàn)實(shí)世界中,我們撰寫的合同通常是由律師或者法律專家來幫我們完成的。不同水平的法律專家,其完成的合同嚴(yán)謹(jǐn)程度是不一樣的。同樣在智能合約中,我們撰寫的合同是由程序員幫我們完成的,程序員的水平?jīng)Q定了合同的嚴(yán)謹(jǐn)性。還有一點(diǎn),程序通常都會(huì)有bug,這些bug是否會(huì)導(dǎo)致嚴(yán)重的損失,然而在bug沒有被發(fā)現(xiàn)之前,都不得而知。
2 合同的仲裁機(jī)構(gòu)是誰
a)在現(xiàn)實(shí)世界中,我們通常都會(huì)在合同中約定一旦發(fā)生糾紛,請(qǐng)哪個(gè)仲裁機(jī)構(gòu)對(duì)合同進(jìn)行仲裁。而在區(qū)塊鏈中,尤其是公有鏈平臺(tái)上的智能合約,一旦我們認(rèn)為合同沒有表達(dá)雙方真實(shí)的意思,我們無法找到一個(gè)仲裁機(jī)構(gòu)對(duì)合同進(jìn)行仲裁。
b) 在聯(lián)盟鏈中,由于各方各個(gè)節(jié)點(diǎn)的身份都是已知的,現(xiàn)實(shí)世界中的司法機(jī)構(gòu)是可以介入智能合約糾紛的。但是這種介入有時(shí)候可能會(huì)影響整個(gè)聯(lián)盟鏈系統(tǒng)的穩(wěn)定性,這種情況下,怎樣介入是一個(gè)技術(shù)問題,而這個(gè)技術(shù)問題又可能會(huì)帶來新的bug。
作者簡介
敖萌,現(xiàn)就職于中國信息通信研究院北京泰爾英福網(wǎng)絡(luò)科技有限責(zé)任公司,主要研究模式識(shí)別和區(qū)塊鏈,聯(lián)系方式:aomeng@caict.ac.cn。