智能合約初探:概念與演變
前言
自 2009 年比特幣開啟區(qū)塊鏈時(shí)代以來,近 10 年里,隨著技術(shù)與生態(tài)的發(fā)展,基于區(qū)塊鏈的分布式應(yīng)用(dapp)呈現(xiàn)出井噴的趨勢(shì),而支撐著 dapp 的底層技術(shù)就是“區(qū)塊鏈+智能合約”。
智能合約與區(qū)塊鏈的結(jié)合,普遍被認(rèn)為是區(qū)塊鏈?zhǔn)澜缰幸淮卫锍瘫降纳?jí)。第一個(gè)結(jié)合了區(qū)塊鏈與智能合約技術(shù)的平臺(tái)--以太坊的誕生,被認(rèn)為是開啟了"區(qū)塊鏈 2.0"時(shí)代。
什么是智能合約
1996 年,Nick Szabo 在文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合約的概念。
所謂“合約”,就是條文、合同一類的東西,里面記錄了發(fā)生的條件與對(duì)應(yīng)執(zhí)行的條款,以支持確權(quán)等操作;所謂“智能”,就意味著自動(dòng)化、可編程。
所以,智能合約就是可編程的合同,也可以理解為一段自動(dòng)執(zhí)行的條文合同,在計(jì)算機(jī)中,就是一段自動(dòng)執(zhí)行的程序片段。它更易于合約保存,并且由確定的算法運(yùn)行,給定輸入,就得到對(duì)應(yīng)的輸出,極大保障了合約的執(zhí)行力。
以自動(dòng)售貨機(jī)做類比,可以幫助我們更好地理解智能合約的核心特征。
當(dāng)使用者選擇好要購(gòu)買的貨物并完成支付,出貨邏輯就會(huì)被觸發(fā),用戶就能得到想要的貨物,而這個(gè)過程不需要人工介入,節(jié)省了售賣貨物的人力成本。如果要破壞這個(gè)合約,就得物理破壞售賣機(jī)。像 POS 刷卡機(jī)、EDI(電子數(shù)據(jù)交換)等,也可作此種類比。
智能合約與區(qū)塊鏈
智能合約在上世紀(jì)被提出,而區(qū)塊鏈 2009 年才誕生,就定義而言,智能合約與區(qū)塊鏈關(guān)系不大。
那為什么在這 10 年中,智能合約與區(qū)塊鏈卻產(chǎn)生了如此緊密的關(guān)聯(lián)?因?yàn)閰^(qū)塊鏈可以保證智能合約的不可篡改,不僅合約內(nèi)容不可篡改,每次調(diào)用記錄亦不可篡改。
智能合約產(chǎn)生價(jià)值的最基本前提是有一個(gè)強(qiáng)有力的底層介質(zhì)用于儲(chǔ)存,讓其不可被物理破壞。
然而,智能合約的本體是一份代碼,非常容易被篡改,如何為其提供強(qiáng)力的存儲(chǔ)介質(zhì)就成了問題。這正好是區(qū)塊鏈擅長(zhǎng)解決的——通過比特幣的實(shí)踐,證明了區(qū)塊鏈可以在分布式環(huán)境下讓電子記錄不可被篡改。
與此同時(shí),智能合約也在反哺著區(qū)塊鏈,它極大地?cái)U(kuò)展了區(qū)塊鏈的業(yè)務(wù)場(chǎng)景。
與智能合約結(jié)合后,區(qū)塊鏈不再服務(wù)于單一的貨幣支付,可以延申到生活中的方方面面。豐富的應(yīng)用場(chǎng)景也對(duì)區(qū)塊鏈的能力產(chǎn)生了新的挑戰(zhàn)。
區(qū)塊鏈 2.0:以太坊的誕生
2009 年誕生的比特幣,運(yùn)用區(qū)塊鏈等技術(shù)來保證生態(tài),開創(chuàng)了區(qū)塊鏈 1.0 時(shí)代。
用戶可以通過腳本代碼來定制一些內(nèi)容,例如如何解鎖一筆資金。這些腳本代碼會(huì)隨著交易一起保存,從而享有不可篡改的特質(zhì),并且是確定性的。所以從某種角度來說,這些腳本也可看作智能合約。可是它們并不好用。
首先,這些腳本代碼不是圖靈完備的,這限制了實(shí)現(xiàn)的功能;其次,開發(fā)門檻較高,編寫復(fù)雜邏輯的體驗(yàn)會(huì)很差,好比用 JVM 字節(jié)碼來寫程序。
2013 年,一個(gè)青年 V 神提出了以太坊,其核心是通過世界狀態(tài)對(duì)區(qū)塊鏈數(shù)據(jù)進(jìn)行更新和驗(yàn)證。以太坊與比特幣最大的不同在于可通過智能合約執(zhí)行復(fù)雜的邏輯操作。
在以太坊上,智能合約的語言是 Solidity,它是圖靈完備且較為上層的語言,極大地?cái)U(kuò)展了智能合約的能力范疇,降低了智能合約編寫難度。
正因?yàn)榇?,以太坊的誕生,也標(biāo)志著區(qū)塊鏈2.0時(shí)代開啟。隨后,智能合約技術(shù)逐步滲透了溯源、存證、供應(yīng)鏈等多個(gè)業(yè)務(wù)場(chǎng)景。
智能合約的現(xiàn)狀與前景
從編程角度而言,智能合約就是一段代碼。相比常規(guī)代碼,智能合約具有許多差別與限制,例如:
- 單線程執(zhí)行
- 代碼執(zhí)行會(huì)消耗資源,不能超出資源限制
- 目前難以獲取鏈外數(shù)據(jù),例如取得天氣信息、比賽結(jié)果等
- 其他限制,如 TPS
這些特點(diǎn)使得目前智能合約生態(tài)以鏈上資源的治理為核心。就像以太坊上各式各樣的 ERC 標(biāo)準(zhǔn)與治理方案;EOS上有各種資源模型,比如 CPU、RAM、Rex、Bancor 協(xié)議等
顯然,就目前的生態(tài)而言,智能合約對(duì)現(xiàn)實(shí)世界的影響力有限。
但事物總是在發(fā)展的。目前,已有許多致力于突破這些限制的研究,典型的有 Oracle(諭言機(jī),但常被稱為預(yù)言機(jī)),它允許智能合約和鏈外進(jìn)行交互,這樣就能大大提高智能合約的使用場(chǎng)景,彷佛一臺(tái)電腦通上了網(wǎng);再比如那些突破鏈自身性能瓶頸的嘗試,例如支付通道、跨鏈、plasma、rollup,它們都從不同角度打破安全與性能的枷鎖。
毋庸置疑,智能合約將扮演著越來越重要的角色,將來隨著以太坊 2.0 的落地,也許會(huì)開啟新一個(gè)區(qū)塊鏈時(shí)代。
智能合約技術(shù)
以太坊采用了 Solidity 作為智能合約語言,Solidity 是一門為實(shí)現(xiàn)智能合約而創(chuàng)建的高級(jí)編程語言,能在允許以太坊程序的節(jié)點(diǎn)上運(yùn)行。該語言吸收了 C++、JavaScript 的一些特性,例如它是靜態(tài)類型語言,支持繼承、庫(kù)等。
除了 Solidity,每個(gè)平臺(tái)的智能合約技術(shù)也有所不同,接下來將從公有鏈、聯(lián)盟鏈作為切入,介紹其他平臺(tái)所采用的技術(shù)。
公有鏈
首先,不妨先認(rèn)識(shí)三大公鏈的智能合約技術(shù)。
聯(lián)盟鏈
除了公鏈,聯(lián)盟鏈也是重要的區(qū)塊鏈類型。比之公鏈,聯(lián)盟鏈共識(shí)的復(fù)雜度被大大縮減,因此具有更高的執(zhí)行效率。
聯(lián)盟鏈?zhǔn)芷髽I(yè)級(jí)機(jī)構(gòu)青睞,一般而言,相關(guān)機(jī)構(gòu)之間會(huì)形成聯(lián)盟,通過聯(lián)盟鏈來共享數(shù)據(jù)。聯(lián)盟鏈可覆蓋供應(yīng)鏈金融、司法存證、溯源等多種場(chǎng)景,未來還會(huì)與 IOT、AI 等技術(shù)結(jié)合。
在當(dāng)今聯(lián)盟鏈生態(tài)中,除去采用 chaincode 的 Fabric,大部分平臺(tái)都采用 Solidity 作為智能合約語言,F(xiàn)ISCO BCOS 即是如此。
時(shí)下,Solidity 可謂占據(jù)了智能合約的 C 位,掌握 Solidity 是學(xué)習(xí)智能合約和區(qū)塊鏈的重要一環(huán)。后面系列也將對(duì)如何用 Solidity 編寫、運(yùn)行以及測(cè)試智能合約作深入介紹解析,敬請(qǐng)關(guān)注。
除了 Solidity、WebAssembly、Libra 的 Move 等一些智能合約語言也在發(fā)展中,可以保持關(guān)注。
智能合約運(yùn)行分析
下面將分享一個(gè)基礎(chǔ)的智能合約: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
字段。該字段被稱為“狀態(tài)變量”,會(huì)由區(qū)塊鏈持久存儲(chǔ)。
用戶可以將這段代碼部署在以太坊或類似的區(qū)塊鏈上,部署成功就意味著該智能合約不可再被修改,只要底層區(qū)塊鏈不被銷毀,這段合約就一直存在。任何人都可通過“合約地址”來調(diào)用該合約接口,每次調(diào)用信息都會(huì)被記錄在鏈上。
在講解這段代碼如何運(yùn)行之前,我們先回顧下傳統(tǒng) Java 程序的運(yùn)行方式。
首先,用戶編譯完 Java 代碼后,會(huì)以字節(jié)碼的形式保存在磁盤上;然后用戶會(huì)調(diào)用程序,這由 JVM 來托管執(zhí)行;程序執(zhí)行期間可能會(huì)通過日志來記錄調(diào)用參數(shù),也可能會(huì)和磁盤進(jìn)行 IO。
Solidity 的執(zhí)行與此類似。不同的是介質(zhì)由硬盤換成了區(qū)塊鏈,由單機(jī)變?yōu)榉植际健?/p>
代碼部署后,以字節(jié)碼的形式存儲(chǔ)在每一個(gè)節(jié)點(diǎn)上。當(dāng)用戶要求調(diào)用某個(gè)函數(shù)時(shí),調(diào)用請(qǐng)求將會(huì)被囊括在交易中,并被打包到某個(gè)區(qū)塊上,一旦全網(wǎng)對(duì)該區(qū)塊形成共識(shí),就意味著調(diào)用是合法的。
接下來,EVM 會(huì)來調(diào)用字節(jié)碼,它負(fù)責(zé)存取底層的狀態(tài)變量,好比傳統(tǒng)編程的 IO。
光從代碼來看,合約開發(fā)似乎不過如此,單個(gè)合約只需要圍繞著字段進(jìn)行操作,對(duì)于很多簡(jiǎn)單業(yè)務(wù)而言,不過是 CRUD 而已。
但其復(fù)雜性也恰恰在于此,合約在區(qū)塊鏈環(huán)境上執(zhí)行,是不可修改的。
所以如果出現(xiàn)了 bug,就必須部署新的合約,這對(duì)于合約的可維護(hù)性提出了挑戰(zhàn)。并且,一旦業(yè)務(wù)復(fù)雜起來,容易出現(xiàn)安全漏洞,導(dǎo)致鏈上資產(chǎn)損失。同時(shí),還要考慮完成代碼編寫、邏輯執(zhí)行、數(shù)據(jù)存儲(chǔ)的成本問題。
綜上所述,寫合約不難,但寫好合約,卻需要一定功底。
結(jié) 語
本文介紹了智能合約的概念與歷史演變。
智能合約是上世紀(jì)提出的技術(shù),在區(qū)塊鏈浪潮下煥發(fā)出了新的生機(jī)。反之,智能合約廣泛的應(yīng)用場(chǎng)景,又極大的促進(jìn)了區(qū)塊鏈發(fā)展。
學(xué)習(xí)智能合約,推薦選擇 Solidity 語言,因?yàn)槠渚邆湟恍﹤鹘y(tǒng)語言的特征,同時(shí),執(zhí)行環(huán)境完全基于區(qū)塊鏈,實(shí)際業(yè)務(wù)開發(fā)的體驗(yàn)與以往的編程體驗(yàn)會(huì)有所差別。
讀者可以嘗試基于 FISCO BCOS 快速搭建區(qū)塊鏈環(huán)境,部署一個(gè)最簡(jiǎn)單的合約,熟悉部署、調(diào)用方式,再進(jìn)一步走入 Solidity 的世界。