a) 業慣例的約束。而在智慧合約中,外部法律和行業慣例如果不能嚴格的體現在合同本身中,那麼合同就不是雙方真實意思的表達了。
b) 在現實世界中,我們撰寫的合同通常是由律師或者法律專家來幫我們完成的。不同水平的法律專家,其完成的合同嚴謹程度是不一樣的。同樣在智慧合約中,我們撰寫的合同是由程式設計師幫我們完成的,程式設計師的水平決定了合同的嚴謹性。還有一點,程式通常都會有bug,這些bug是否會導致嚴重的損失,在bug沒有被發現之前,都不得而知。
二、合同的仲裁機構是誰
a) 在現實世界中,我們通常都會在合同中約定一旦發生糾紛,請哪個仲裁機構對合同進行仲裁。而在區塊鏈中,尤其是公有鏈的平臺上的智慧合約,一旦我們認為合同沒有表達雙方真實的意思,我們無法找到一個仲裁機構對合同進行仲裁。
b) 在聯盟鏈中,由於各方各個節點的身份都是已知的,現實世界中的司法機構是可以介入智慧合約糾紛的。但是這種介入有時候可能會影響整個聯盟鏈系統的穩定性,這種情況下,怎樣介入是一個技術問題,而這個技術問題又可能會帶來新的bug。
談到區塊鏈,必然離不開“智慧合約”這個詞。我們在本系列的第一篇文章中就提到“智慧合約”(smart contract)是由多產的跨領域法律學者Nick Szabo 於1995 年提出來的,他的定義為:“一個智慧合約是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協議。”那麼,我們該如何理解這段話呢?
首先回顧一下比特幣區塊鏈系統中的轉賬:
Alice轉賬給Bob 100比特幣,在比特幣區塊鏈系統中是這樣記錄的:
本質上,這就是一個合同。這個合同裡面規定了Alice要轉給Bob 100比特幣,該合同立即生效。注意,裡面有一個“解鎖資訊”,這個解鎖資訊本質上就是Alice證明自己是Alice的地址持有者時需要提交的一個資訊。
顯然,像比特幣區塊鏈系統裡面,純UTXO模式的這種合同用處是很有限的。首先,比特幣是一個獨立執行的封閉系統,它的轉賬指令碼沒有提供和外界進行互動的介面。所有資訊(這裡主要是解鎖資訊)只能在指令碼提交到區塊鏈之前定死,之後就只能按照固定方式執行。這對於“合同”來說是不符合實際應用的。
在我們實際生活中,一個完整的合同制定到執行的流程是按照如下方式隨著時間流逝而進行的:
其中,條件的達成通常是一個外部輸入的事件,這意味著,我們實際生活中的合同通常是“事件驅動”型的。這個“事件”是否發生通常不是區塊鏈上的資料能夠判斷出來的,而是要依靠在事件發生的時間點,透過鏈外輸入資料的方式實現。
以電子商務為例,Alice在某寶的某個商家購買了一臺膝上型電腦,當Alice下單成功的那一刻,實質上就生成了一個合同。這個合同包含了Alice需要在多長時間內付款到第三方平臺——事件1
在這個合同的執行過程中,事件1由於是一個純粹的金融活動,已經高度的虛擬化了,能夠實現自動發現事件自動觸發。而事件2則是一個在現實世界中發生的活動,需要我們點選確認收貨來把這個事件的發生同步到虛擬世界中,這個“點選確認收貨”就是虛擬世界中的事件2。所以,對於某寶的購物合同而言,事件1實質上是Alice是否轉賬到平臺,事件2是Alice是否點選確認收貨。因此,在這個合同中,預留了一個和外部互動的介面——確認收貨。
除了和外部的互動能力外,比特幣轉賬合同(指令碼)的另一個重要缺陷是它不是圖靈完備的。這句話對於非計算機專業的人來說可能不太好理解,我們可以簡單的理解為它沒有迴圈能力和複雜的條件控制能力。
合同的迴圈能力在我們現實世界中是很常見的,例如我們和電信運營商簽署的行動電話服務合同,通常就是一個迴圈合同。這種合同以自然月為單位,每個月自動迴圈執行。還有類似的企業間簽訂的長期採購合同,都是一種不斷迴圈的合同。合同中的規定的事件(或時間點)全部達成以後,自動迴圈回第一步,重新執行。
而複雜的條件控制能力就更常見了——合同中的違約條款就是條件控制能力。事件達成怎樣,沒有達成如何執行違約條款等,這些都需要合同擁有複雜的條件控制能力。
比特幣中的交易是使用比特幣區塊鏈底層平臺定義的一套指令碼語言來寫的,由於當初比特幣區塊鏈系統是按照一個數字貨幣的模型進行設計的,因此它並不需要這些複雜的能力。但是如果我們需要區塊鏈技術在其他商業場合進行應用,很多時候就需要這些能力了。比如我們利用以太坊平臺來實現某個業務,那麼整個流程是這樣子的:
目前,關於智慧合約的爭議仍然是很多的。主要包含兩方面:
一、合同本身是否是雙方真實意思的表達。
a) 業慣例的約束。而在智慧合約中,外部法律和行業慣例如果不能嚴格的體現在合同本身中,那麼合同就不是雙方真實意思的表達了。
b) 在現實世界中,我們撰寫的合同通常是由律師或者法律專家來幫我們完成的。不同水平的法律專家,其完成的合同嚴謹程度是不一樣的。同樣在智慧合約中,我們撰寫的合同是由程式設計師幫我們完成的,程式設計師的水平決定了合同的嚴謹性。還有一點,程式通常都會有bug,這些bug是否會導致嚴重的損失,在bug沒有被發現之前,都不得而知。
二、合同的仲裁機構是誰
a) 在現實世界中,我們通常都會在合同中約定一旦發生糾紛,請哪個仲裁機構對合同進行仲裁。而在區塊鏈中,尤其是公有鏈的平臺上的智慧合約,一旦我們認為合同沒有表達雙方真實的意思,我們無法找到一個仲裁機構對合同進行仲裁。
b) 在聯盟鏈中,由於各方各個節點的身份都是已知的,現實世界中的司法機構是可以介入智慧合約糾紛的。但是這種介入有時候可能會影響整個聯盟鏈系統的穩定性,這種情況下,怎樣介入是一個技術問題,而這個技術問題又可能會帶來新的bug。