智能合約初探:概念與演變 | FISCO BCOS超話區塊鏈專場(篇1)

 

 

前 言

自2009年比特幣開啓區塊鏈時代以來,近10年裏,隨着技術與生態的發展,基於區塊鏈的分佈式應用(dapp)呈現出井噴的趨勢,而支撐着dapp的底層技術就是“區塊鏈+智能合約”。

智能合約與區塊鏈的結合,普遍被認爲是區塊鏈世界中一次里程碑式的升級。第一個結合了區塊鏈與智能合約技術的平臺--以太坊的誕生,被認爲是開啓了"區塊鏈2.0"時代。
 

什麼是智能合約

1996年,Nick Szabo在文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合約的概念。

所謂“合約”,就是條文、合同一類的東西,裏面記錄了發生的條件與對應執行的條款,以支持確權等操作;所謂"智能",就意味着自動化、可編程。

所以,智能合約就是可編程的合同,也可以理解爲一段自動執行的條文合同,在計算機中,就是一段自動執行的程序片段。它更易於合約保存,並且由確定的算法運行,給定輸入,就得到對應的輸出,極大保障了合約的執行力。

以自動售貨機做類比,可以幫助我們更好地理解智能合約的核心特徵。

當使用者選擇好要購買的貨物並完成支付,出貨邏輯就會被觸發,用戶就能得到想要的貨物,而這個過程不需要人工介入,節省了售賣貨物的人力成本。如果要破壞這個合約,就得物理破壞售賣機。像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編寫、運行以及測試智能合約作深入介紹解析,敬請關注【FISCO BCOS開源社區】公衆號。
除了Solidity,WebAssembly、Libra的Move等一些智能合約語言也在發展中,可以保持關注。

 

智能合約運行分析

下面將分享一個基礎的智能合約:HelloWorld。

這段Solidity代碼的功能是存取_num字段。該字段被稱爲“狀態變量”,會由區塊鏈持久存儲。

用戶可以將這段代碼部署在以太坊或類似的區塊鏈上,部署成功就意味着該智能合約不可再被修改,只要底層區塊鏈不被銷燬,這段合約就一直存在。任何人都可通過“合約地址”來調用該合約接口,每次調用信息都會被記錄在鏈上。

在講解這段代碼如何運行之前,我們先回顧下傳統java程序的運行方式。

首先,用戶編譯完java代碼後,會以字節碼的形式保存在磁盤上;然後用戶會調用程序,這由JVM來託管執行;程序執行期間可能會通過日誌來記錄調用參數,也可能會和磁盤進行IO。

Solidity的執行與此類似。不同的是介質由硬盤換成了區塊鏈,由單機變爲分佈式。

代碼部署後,以字節碼的形式存儲在每一個節點上。當用戶要求調用某個函數時,調用請求將會被囊括在交易中,並被打包到某個區塊上,一旦全網對該區塊形成共識,就意味着調用是合法的。

接下來,EVM會來調用字節碼,它負責存取底層的狀態變量,好比傳統編程的IO。

光從代碼來看,合約開發似乎不過如此,單個合約只需要圍繞着字段進行操作,對於很多簡單業務而言,不過是CRUD而已。

但其複雜性也恰恰在於此,合約在區塊鏈環境上執行,是不可修改的。

所以如果出現了bug,就必須部署新的合約,這對於合約的可維護性提出了挑戰。並且,一旦業務複雜起來,容易出現安全漏洞,導致鏈上資產損失。同時,還要考慮完成代碼編寫、邏輯執行、數據存儲的成本問題

綜上所述,寫合約不難,但寫好合約,卻需要一定功底。

 

結 語

本文介紹了智能合約的概念與歷史演變。

智能合約是上世紀提出的技術,在區塊鏈浪潮下煥發出了新的生機。反之,智能合約廣泛的應用場景,又極大的促進了區塊鏈發展。

學習智能合約,推薦選擇Solidity語言,因爲其具備一些傳統語言的特徵,同時,執行環境完全基於區塊鏈,實際業務開發的體驗與以往的編程體驗會有所差別。

讀者可以嘗試基於FISCO BCOS快速搭建區塊鏈環境,部署一個最簡單的合約,熟悉部署、調用方式,再進一步走入Solidity的世界。

 

下期預告

 

 

我們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一起,會更了不起。多樣參與方式:

1、進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,

微信ID:FISCOBCOS010);

2、訂閱我們的公衆號:“FISCO BCOS開源社區”,我們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3、來Meetup與開發團隊面對面交流,FISCO BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4、參與代碼貢獻,您可以在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

 

代碼貢獻指引:

https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章