談到區(qū)塊鏈,必然離不開“智能合約”這個詞。我們在本系列的第一篇文章中提到“智能合約”(smart contract)是由多產的跨領域法律學者 Nick Szabo 在1995年提出來的,他的定義為:“一個智能合約是一套以數(shù)字形式定義的承諾,包括合約參與方可以在上面執(zhí)行這些承諾的協(xié)議。”那么,我們該如何理解這段話呢?
回顧一下比特幣區(qū)塊鏈系統(tǒng)中的轉賬:
Alice 轉賬給 Bob 100比特幣,在比特幣區(qū)塊鏈系統(tǒng)中是這樣記錄的:

本質上,這就是一個合同。這個合同里面規(guī)定了 Alice 要轉給 Bob 100比特幣,該合同立即生效。注意,里面有一個“解鎖信息”,這個“解鎖信息”本質上就是 Alice 證明自己是 Alice 的地址持有者時需要提交的一個信息。
顯然,像比特幣區(qū)塊鏈系統(tǒng)里面,純UTXO模式的這種合同用處是很有限的。首先,比特幣是一個獨立運行的封閉系統(tǒng),它的轉賬腳本沒有提供和外界進行交互的接口。所有信息(這里主要是解鎖信息)只能在腳本提交到區(qū)塊鏈之前定死,之后就只能按照固定方式運行。這對于“合同”來說是不符合實際應用的。
在我們實際生活中,一個完整的合同制定——執(zhí)行流程是按照如下方式隨著時間流逝而進行的:

其中,條件的達成通常是一個外部輸入的事件,這意味著,我們實際生活中的合同通常是“事件驅動”型的。這個“事件”是否發(fā)生通常不是區(qū)塊鏈上的數(shù)據能夠判斷出來的,而是依靠事件發(fā)生的時間點,通過鏈外輸入數(shù)據的方式實現(xiàn)。
以電子商務為例,Alice 在某寶的某個商家購買了一臺筆記本電腦,當 Alice下單成功的那一刻,實質上就生成了一個合同。這個合同包含了 Alice 需要在多長時間內付款到第三方平臺(事件1)。然后賣家看到 Alice 付款后需要發(fā)貨,當 Alice 收到貨以后需要點擊確認收貨(事件2),完成整個合同(在不考慮售后的情況下)。
在這個合同的執(zhí)行過程中,事件1由于是一個純粹的金融活動,已經高度的虛擬化,能夠實現(xiàn)自動發(fā)現(xiàn)事件自動觸發(fā)。而事件2則是一個在現(xiàn)實世界中發(fā)生的活動,需要我們“點擊確認收貨”來把這個事件的發(fā)生同步到虛擬世界中,這個“點擊確認收貨”就是虛擬世界中的事件2。所以,對于某寶的購物合同而言,事件1實質上是 Alice 是否轉賬到平臺,事件2是 Alice 是否點擊確認收貨。因此,在這個合同中,預留了一個和外部交互的接口——確認收貨。
除了和外部的交互能力外,比特幣轉賬合同(腳本)的另一個重要缺陷是它不是圖靈完備的。這句話對于非計算機專業(yè)的人來說可能不太好理解,我們可以簡單的理解為它沒有循環(huán)能力和復雜的條件控制能力。
合同的循環(huán)能力在我們現(xiàn)實世界中是很常見的,例如我們和電信運營商簽署的移動電話服務合同,通常就是一個循環(huán)合同。這種合同以自然月為單位,每個月自動循環(huán)執(zhí)行。還有類似的企業(yè)間簽訂的長期采購合同,都是一種不斷循環(huán)的合同。合同中規(guī)定的事件(或時間點)全部達成以后,自動循環(huán)回第一步,重新執(zhí)行。
而復雜的條件控制能力就更常見了——合同中的違約條款就是條件控制能力。事件達成怎樣,沒有達成如何執(zhí)行違約條款等,這些都需要合同擁有復雜的條件控制能力。
比特幣中的交易是使用比特幣區(qū)塊鏈底層平臺定義的一套腳本語言來寫的,由于當初比特幣區(qū)塊鏈系統(tǒng)是按照一個數(shù)字貨幣的模型進行設計的,因此它并不需要這些復雜的能力。但是如果我們需要區(qū)塊鏈技術在其他商業(yè)場合進行應用,很多時候就需要這些能力。比如我們利用以太坊平臺來實現(xiàn)某個業(yè)務,那么整個流程是這樣子的:

目前,關于智能合約的爭議仍然是很多的。主要包含兩方面:
1 合同本身是否是雙方真實意思的表達
a)在現(xiàn)實世界中,我們撰寫的合同除了受合同細節(jié)的約束外,還受到了外部法律和行業(yè)慣例的約束。而在智能合約中,外部法律和行業(yè)慣例如果不能嚴格的體現(xiàn)在合同中,那么合同就不是雙方真實意思的表達了。
b)在現(xiàn)實世界中,我們撰寫的合同通常是由律師或者法律專家來幫我們完成的。不同水平的法律專家,其完成的合同嚴謹程度是不一樣的。同樣在智能合約中,我們撰寫的合同是由程序員幫我們完成的,程序員的水平決定了合同的嚴謹性。還有一點,程序通常都會有bug,這些bug是否會導致嚴重的損失,然而在bug沒有被發(fā)現(xiàn)之前,都不得而知。
2 合同的仲裁機構是誰
a)在現(xiàn)實世界中,我們通常都會在合同中約定一旦發(fā)生糾紛,請哪個仲裁機構對合同進行仲裁。而在區(qū)塊鏈中,尤其是公有鏈平臺上的智能合約,一旦我們認為合同沒有表達雙方真實的意思,我們無法找到一個仲裁機構對合同進行仲裁。
b) 在聯(lián)盟鏈中,由于各方各個節(jié)點的身份都是已知的,現(xiàn)實世界中的司法機構是可以介入智能合約糾紛的。但是這種介入有時候可能會影響整個聯(lián)盟鏈系統(tǒng)的穩(wěn)定性,這種情況下,怎樣介入是一個技術問題,而這個技術問題又可能會帶來新的bug。
作者簡介
敖萌,現(xiàn)就職于中國信息通信研究院北京泰爾英福網絡科技有限責任公司,主要研究模式識別和區(qū)塊鏈,聯(lián)系方式:aomeng@caict.ac.cn。