智能合約這個術語至少可以追溯到 1995 年,是由多產的跨領域法律學者尼克·薩博(Nick Szabo)提出來的。他在自己的網站上發表的幾篇文章中提到智能合約的理念。
其定義如下:一個智能合約是一套以數字形式定義的承諾(promises) ,包括合約參與方可以在上面執行這些承諾的協議。
一套承諾指的是合約參與方同意的(經常是相互的)權利和義務。這些承諾定義了合約的本質和目的。以一個銷售合約為典型例子。賣家承諾傳送貨物,買家承諾支付合理的貨款。
數字形式意味著合約不得不寫入電腦可讀的程式碼中。這是必須的,因為只要參與方達成協定,智能合約建立的權利和義務,是由一台電腦或者電腦網路執行的。更進一步:
智能合約的參與方什麼時候達成協定呢?答案取決於特定的智能合約實施。一般而言,當參與方通過在合約宿主平台上安裝合約,致力於合約的執行時,合約就被發現了。
“執行”的真正意思也依賴於實施。一般而言,執行意味著通過技術手段積極實施。
另外,合約需要的特定“數字形式”非常依賴於參與方同意使用的協議。
協議是技術實現(technical implementation),在這個基礎上,合約承諾被實現,或者合約承諾實現被記錄下來。選擇那個協議取決於許多因素,最重要的因素是在合約履行期間,被交易資產的本質。
再次以銷售合約為例。假設,參與方同意貨款以比特幣支付。選擇的協議很明顯將會是比特幣協議,在此協議上,智能合約被實施。因此,合約必須要用到的“數字形式”就是比特幣指令碼語言。比特幣指令碼語言是一種非圖靈完備的、命令式的、基於棧的程式語言,類似於 Forth。
作者尼克·薩博本人身兼電腦科學家、法學家、密碼學家等多重身份。在 1998 年,薩博設計了一套去中心化數字貨幣機制,把它叫做“數字黃金”。數字黃金沒有被應用,但是它被認為“比特幣架構的直接先驅”。
在薩博的位元黃金結構中,一個參與者將奉獻電腦算力去解決“加密難題”。在位元黃金中,解決“難題”採用了公共解決者註冊系統、公鑰簽名來實現 BFT 拜占庭容錯。每一個結果都會是下一個問題的一部分,從而建立一個不斷增長的具有新屬性的鏈。
智能合約與區塊鏈是兩種技術的有機結合,而非包含關係。
薩博的數字黃金沒有得到應用,主要是因為沒有一個可信的環境去執行智能合約的程式碼。直到區塊鏈的出現,才使得這一切變為可能。
我們知道,比特幣不支援智能合約。比特幣只有一個指令碼系統。
且在比特幣中沒有帳戶的概念,而是使用 UTXO(Unspent Transaction Output)來表示一筆比特幣資產。
每一筆比特幣資產在轉移時並非直接轉到對方的公鑰地址,而是輸出到一個指令碼中。
輸出的指令碼中,誰能提供一個簽名和公鑰,讓指令碼運行通過,誰就能花費這筆比特幣資產。
OP_DUP OP_HASH160 abcd1234...9876 OP_EQUALVERIFY OP_CHECKSIG
比特幣中每筆交易的輸出類似上述指令碼。其中,abcd1234...9876 是交易接收者的公鑰,誰能提供一個簽名和這個公鑰,誰就能花費該指令碼中的比特幣。而一旦提供了簽名和公鑰之後,又是另一筆交易的開始。
比特幣指令碼被設計成以棧來運行的虛擬機器指令,指令類型只有幾種,故意設計成沒有循環、沒有條件跳轉,因此不是圖靈完備的。
圖靈完備通俗解釋:一切可計算的問題都可以使用程式碼來計算。像“求從 1加到 1000 的和”這種問題在比特幣指令碼中就無法簡單實現。
直到以太坊的出現,才帶來了圖靈完備的智能合約系統。
以太坊有專門的智能合約開發語言 Solidity,智能合約運行在以太坊網路的虛擬機器 EVM 上,運行會受到 gas 的制約。
在 Solidity 的程式碼中,區分大小寫、有限的資料類型、內建對象,可執行判定分支、可循環。
合約需要編譯為 ABI(Application Binary Interface,應用二進制介面)後方可發佈到以太坊網路上,鏈外部程式碼通過 ABI 介面與智能合約互動。
同時,EVM 也對運行的智能合約做了一些限制:
除以太坊外,其它區塊鏈平台也會根據各自特性推出不一樣的智能合約系統。
例如:
Hyperledger Fabric 中用 Go 語言開發的智能合約,也稱鏈碼。
EOS 中用 C++開發的智能合約,需要編譯為 WebAssembly。
……
縱觀市面現有的智能合約系統,我總結了當下它們存在的一些短板:
所以智能合約系統未來的發展趨勢一定是:
最後,一張圖闡明智能合約與區塊鏈的關係:
(南國他鄉客)