智能合約初探:概念與演變
智能合約與區塊鏈的結合,普遍被認為是區塊鏈世界中一次里程碑式的升級。第一個結合了區塊鏈與智能合約技術的平台--以太坊的誕生,被認為是開啟了"區塊鏈 2.0"時代。
https://mp.weixin.qq.com/s/J0ctKQmbIRf3OKg3Y0Lhmg
作者:儲雨知
前言
自 2009 年比特幣開啟區塊鏈時代以來,近 10 年裡,隨著技術與生態的發展,基於區塊鏈的分散式應用(dapp)呈現出井噴的趨勢,而支撐著 dapp 的底層技術就是「區塊鏈 智能合約」。
智能合約與區塊鏈的結合,普遍被認為是區塊鏈世界中一次里程碑式的升級。第一個結合了區塊鏈與智能合約技術的平台--以太坊的誕生,被認為是開啟了"區塊鏈 2.0"時代。
什麼是智能合約
1996 年,Nick Szabo 在文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合約的概念。
所謂「合約(Contract)」,就是條文、合同一類的東西,裡面記錄了發生的條件與對應執行的條款,以支持確權等操作;所謂「智能(Smart)」,就意味著自動化、可編程。
所以,智能合約就是可編程的合同,也可以理解為一段自動執行的條文合同,在計算機中,就是一段自動執行的程序片段。它更易於合約保存,並且由確定的演算法運行,給定輸入,就得到對應的輸出,極大保障了合約的執行力。
以自動售貨機做類比,可以幫助我們更好地理解智能合約的核心特徵。
當使用者選擇好要購買的貨物並完成支付,出貨邏輯就會被觸發,用戶就能得到想要的貨物,而這個過程不需要人工介入,節省了售賣貨物的人力成本。如果要破壞這個合約,就得物理破壞售賣機。像 POS 刷卡機、EDI(電子數據交換)等,也可作此種類比。
智能合約與區塊鏈
智能合約在上世紀被提出,而區塊鏈 2009 年才誕生,就定義而言,智能合約與區塊鏈關係不大。
那為什麼在這 10 年中,智能合約與區塊鏈卻產生了如此緊密的關聯?因為區塊鏈可以保證智能合約的不可篡改,不僅合約內容不可篡改,每次調用記錄亦不可篡改。
智能合約產生價值的最基本前提是有一個強有力的底層介質用於儲存,讓其不可被物理破壞。
然而,智能合約的本體是一份代碼,非常容易被篡改,如何為其提供強力的存儲介質就成了問題。這正好是區塊鏈擅長解決的——通過比特幣的實踐,證明了區塊鏈可以在分散式環境下讓電子記錄不可被篡改。
與此同時,智能合約也在反哺著區塊鏈,它極大地擴展了區塊鏈的業務場景。
與智能合約結合後,區塊鏈不再服務於單一的貨幣支付,可以延申到生活中的方方面面。豐富的應用場景也對區塊鏈的能力產生了新的挑戰。
區塊鏈 2.0:以太坊的誕生
2009 年誕生的比特幣,運用區塊鏈等技術來保證生態,開創了區塊鏈 1.0 時代。
用戶可以通過腳本代碼來定製一些內容,例如如何解鎖一筆資金。這些腳本代碼會隨著交易一起保存,從而享有不可篡改的特質,並且是確定性的。所以從某種角度來說,這些腳本也可看作智能合約。可是它們並不好用。
首先,這些腳本代碼不是圖靈完備的,這限制了實現的功能;其次,開發門檻較高,編寫複雜邏輯的體驗會很差,好比用 JVM 位元組碼來寫程序。
2013 年,一個青年 V 神提出了以太坊,其核心是通過世界狀態對區塊鏈數據進行更新和驗證。以太坊與比特幣最大的不同在於可通過智能合約執行複雜的邏輯操作。
在以太坊上,智能合約的語言是 Solidity,它是圖靈完備且較為上層的語言,極大地擴展了智能合約的能力範疇,降低了智能合約編寫難度。
正因為此,以太坊的誕生,也標誌著區塊鏈2.0時代開啟。隨後,智能合約技術逐步滲透了溯源、存證、供應鏈等多個業務場景。
智能合約的現狀與前景
從編程角度而言,智能合約就是一段代碼。相比常規代碼,智能合約具有許多差別與限制,例如:
??單線程執行
??代碼執行會消耗資源,不能超出資源限制
??目前難以獲取鏈外數據,例如取得天氣信息、比賽結果等
??其他限制,如 TPS
這些特點使得目前智能合約生態以鏈上資源的治理為核心。就像以太坊上各式各樣的 ERC 標準與治理方案;EOS上有各種資源模型,比如 CPU、RAM、Rex、Bancor 協議等
顯然,就目前的生態而言,智能合約對現實世界的影響力有限。
但事物總是在發展的。目前,已有許多致力於突破這些限制的研究,典型的有 Oracle(諭言機,但常被稱為預言機),它允許智能合約和鏈外進行交互,這樣就能大大提高智能合約的使用場景,彷佛一台電腦通上了網;再比如那些突破鏈自身性能瓶頸的嘗試,例如支付通道、跨鏈、plasma、rollup,它們都從不同角度打破安全與性能的枷鎖。
毋庸置疑,智能合約將扮演著越來越重要的角色,將來隨著以太坊 2.0 的落地,也許會開啟新一個區塊鏈時代。
智能合約技術
以太坊採用了 Solidity 作為智能合約語言,Solidity 是一門為實現智能合約而創建的高級編程語言,能在允許以太坊程序的節點上運行。該語言吸收了 C 、JavaScript 的一些特性,例如它是靜態類型語言,支持繼承、庫等。
除了 Solidity,每個平台的智能合約技術也有所不同,接下來將從公有鏈、聯盟鏈作為切入,介紹其他平台所採用的技術。
公有鏈
首先,不妨先認識三大公鏈的智能合約技術。
聯盟鏈
除了公鏈,聯盟鏈也是重要的區塊鏈類型。比之公鏈,聯盟鏈共識的複雜度被大大縮減,因此具有更高的執行效率。
聯盟鏈受企業級機構青睞,一般而言,相關機構之間會形成聯盟,通過聯盟鏈來共享數據。聯盟鏈可覆蓋供應鏈金融、司法存證、溯源等多種場景,未來還會與 IOT、AI 等技術結合。
在當今聯盟鏈生態中,除去採用 chaincode 的 Fabric,大部分平台都採用 Solidity 作為智能合約語言,FISCO BCOS 即是如此。
時下,Solidity 可謂佔據了智能合約的 C 位,掌握 Solidity 是學習智能合約和區塊鏈的重要一環。後面系列也將對如何用 Solidity 編寫、運行以及測試智能合約作深入介紹解析,敬請關注。
除了 Solidity、WebAssembly、Libra 的 Move 等一些智能合約語言也在發展中,可以保持關注。
智能合約運行分析
下面將分享一個基礎的智能合約:HelloWorld。
pragma solidity 0.4.22;
contract HelloWorld{
uint private _num;
function store(uint256 num) public {
_num = num;
}
function get() public view returns (uint256){
return _num;
}
}
這段 Solidity 代碼的功能是存取_num欄位。該欄位被稱為「狀態變數」,會由區塊鏈持久存儲。
用戶可以將這段代碼部署在以太坊或類似的區塊鏈上,部署成功就意味著該智能合約不可再被修改,只要底層區塊鏈不被銷毀,這段合約就一直存在。任何人都可通過「合約地址」來調用該合約介面,每次調用信息都會被記錄在鏈上。
在講解這段代碼如何運行之前,我們先回顧下傳統 Java 程序的運行方式。
首先,用戶編譯完 Java 代碼後,會以位元組碼的形式保存在磁碟上;然後用戶會調用程序,這由 JVM 來託管執行;程序執行期間可能會通過日誌來記錄調用參數,也可能會和磁碟進行 IO。
Solidity 的執行與此類似。不同的是介質由硬碟換成了區塊鏈,由單機變為分散式。
代碼部署後,以位元組碼的形式存儲在每一個節點上。當用戶要求調用某個函數時,調用請求將會被囊括在交易中,並被打包到某個區塊上,一旦全網對該區塊形成共識,就意味著調用是合法的。
接下來,EVM 會來調用位元組碼,它負責存取底層的狀態變數,好比傳統編程的 IO。
光從代碼來看,合約開發似乎不過如此,單個合約只需要圍繞著欄位進行操作,對於很多簡單業務而言,不過是 CRUD 而已。
但其複雜性也恰恰在於此,合約在區塊鏈環境上執行,是不可修改的。
所以如果出現了 bug,就必須部署新的合約,這對於合約的可維護性提出了挑戰。並且,一旦業務複雜起來,容易出現安全漏洞,導致鏈上資產損失。同時,還要考慮完成代碼編寫、邏輯執行、數據存儲的成本問題。
綜上所述,寫合約不難,但寫好合約,卻需要一定功底。
結 語
本文介紹了智能合約的概念與歷史演變。
智能合約是上世紀提出的技術,在區塊鏈浪潮下煥發出了新的生機。反之,智能合約廣泛的應用場景,又極大的促進了區塊鏈發展。
學習智能合約,推薦選擇 Solidity 語言,因為其具備一些傳統語言的特徵,同時,執行環境完全基於區塊鏈,實際業務開發的體驗與以往的編程體驗會有所差別。
讀者可以嘗試基於 FISCO BCOS 快速搭建區塊鏈環境,部署一個最簡單的合約,熟悉部署、調用方式,再進一步走入 Solidity 的世界。