一、 智能合約的出現
智能合約的出現,使區塊鏈不僅能處理簡單的轉賬功能,還能實作復雜的業務邏輯,極大地推動了區塊鏈技術發展,加速應用落地,
通過智能合約語言Solidity,實作了共識邏輯的自定義,基于區塊鏈的分布式應用(dapp)的底層技術就是“區塊鏈+智能合約”,第一個結合了區塊鏈與智能合約技術的平臺--以太坊的誕生,被認為是開啟了"區塊鏈2.0"時代,
二、智能合約的全鏈路
開發、編譯、部署、呼叫
三、智能合約的分類
- Solidity合約
- Precompiled合約
四、Solidity合約代碼結構
-
狀態變數:狀態變數是永久存盤在合約中的值
-
建構式:用于部署并初始化合約
-
事件:事件是能方便地呼叫以太坊虛擬機日志功能的介面
-
修飾器:函式修飾器可以用來改變函式的行為,比如自動檢查,類似Spring的AOP
-
函式:函式是合約中代碼的可執行單元
五、CRUD合約
基于預編譯合約和分布式存盤設計的CRUD合約介面,
用戶可以直接在合約中參考CRUD介面檔案Table.sol,并在Solidity合約中呼叫CRUD介面,CRUD合約的開發完全遵從資料庫的操作習慣,更容易理解和上手,
六、Solidity和Java的全鏈路對比

Solidity與Java的不同之處在于,Solidity是服務于區塊鏈的語言,代碼在區塊鏈上執行,EVM是區塊鏈上的一個執行器,每個區塊鏈節點都有一個EVM,Solidity在EVM中被執行后,EVM對區塊鏈的資料進行了改變,這些資料的改變交由共識演算法去共識,同時,Solidity的操作僅限于EVM內部,不能訪問外部不確定系統或資料,如系統時鐘,網路檔案系統等,
Solidity的設計目的,是給區塊鏈提供一套統一的邏輯,讓相同的代碼跑在區塊鏈的每個節點上,借助共識演算法,讓區塊鏈的資料以統一的方式進行改變,達到全域一致的結果,
七、Solidity的運行細節
以此處的Demo合約為例,合約中有一個全域變數m,并有一個函式add(),實作給全域變數m增加x數值的功能,

在合約二進制被部署到區塊鏈上后,通過發送交易呼叫合約里的方法,節點根據交易將合約代碼裝載入EVM中,并根據交易的傳參執行合約上相應的函式add(),
EVM執行合約代碼,從區塊鏈上讀入當前區塊的資料,進行相加操作,并將結果寫入下一個區塊(等待共識的區塊)對應的狀態資料中,
此后,共識演算法將待執行的區塊共識落盤,區塊高度增加,區塊鏈上的資料完成更新,

這段Solidity代碼的功能是存取_num欄位,該欄位被稱為“狀態變數”,會由區塊鏈持久存盤,
用戶可以將這段代碼部署在以太坊或類似的區塊鏈上,部署成功就意味著該智能合約不可再被修改,只要底層區塊鏈不被銷毀,這段合約就一直存在,任何人都可通過“合約地址”來呼叫該合約介面,每次呼叫資訊都會被記錄在鏈上,
在講解這段代碼如何運行之前,我們先回顧下傳統java程式的運行方式,
首先,用戶編譯完java代碼后,會以位元組碼的形式保存在磁盤上;然后用戶會呼叫程式,這由JVM來托管執行;程式執行期間可能會通過日志來記錄呼叫引數,也可能會和磁盤進行IO,
Solidity的執行與此類似,不同的是介質由硬碟換成了區塊鏈,由單機變為分布式,
代碼部署后,以位元組碼的形式存盤在每一個節點上,當用戶要求呼叫某個函式時,呼叫請求將會被囊括在交易中,并被打包到某個區塊上,一旦全網對該區塊形成共識,就意味著呼叫是合法的,
接下來,EVM會來呼叫位元組碼,它負責存取底層的狀態變數,好比傳統編程的IO,

光從代碼來看,合約開發似乎不過如此,單個合約只需要圍繞著欄位進行操作,對于很多簡單業務而言,不過是CRUD而已,
但其復雜性也恰恰在于此,合約在區塊鏈環境上執行,是不可修改的,
所以如果出現了bug,就必須部署新的合約,這對于合約的可維護性提出了挑戰,并且,一旦業務復雜起來,容易出現安全漏洞,導致鏈上資產損失,同時,還要考慮完成代碼撰寫、邏輯執行、資料存盤的成本問題,
綜上所述,寫合約不難,但寫好合約,卻需要一定功底,
八、智能合約的本質
所謂“合約”,就是條文、合同一類的東西,里面記錄了發生的條件與對應執行的條款,以支持確權等操作;所謂"智能",就意味著自動化、可編程,
所以,智能合約就是可編程的合同,也可以理解為一段自動執行的條文合同,在計算機中,就是一段自動執行的程式片段,它更易于合約保存,并且由確定的演算法運行,給定輸入,就得到對應的輸出,極大保障了合約的執行力,
以自動售歡訓做類比,可以幫助我們更好地理解智能合約的核心特征,
當使用者選擇好要購買的貨物并完成支付,出貨邏輯就會被觸發,用戶就能得到想要的貨物,而這個程序不需要人工介入,節省了售賣貨物的人力成本,如果要破壞這個合約,就得物理破壞售賣機,像POS刷卡機、EDI(電子資料交換)等,也可作此種類比,
九、智能合約與區塊鏈
智能合約在上世紀被提出,而區塊鏈2009年才誕生,就定義而言,智能合約與區塊鏈關系不大,
那為什么在這10年中,智能合約與區塊鏈卻產生了如此緊密的關聯?因為區塊鏈可以保證智能合約的不可篡改,不僅合約內容不可篡改,每次呼叫記錄亦不可篡改,
智能合約產生價值的最基本前提是有一個強有力的底層介質用于儲存,讓其不可被物理破壞,
然而,智能合約的本體是一份代碼,非常容易被篡改,如何為其提供強力的存盤介質就成了問題,這正好是區塊鏈擅長解決的——通過位元幣的實踐,證明了區塊鏈可以在分布式環境下讓電子記錄不可被篡改,
與此同時,智能合約也在反哺著區塊鏈,它極大地擴展了區塊鏈的業務場景,
與智能合約結合后,區塊鏈不再服務于單一的貨幣支付,可以延申到生活中的方方面面,豐富的應用場景也對區塊鏈的能力產生了新的挑戰,
十、不同平臺的智能合約
公有鏈

聯盟鏈
采用chaincode的Fabric,大部分平臺都采用Solidity作為智能合約語言,
除了Solidity,WebAssembly、Libra的Move等一些智能合約語言也在發展中,可以保持關注,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/299240.html
標籤:區塊鏈
