<cite id="1ndtl"></cite>
<ruby id="1ndtl"></ruby>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"><dl id="1ndtl"><del id="1ndtl"></del></dl></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"></strike><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike><strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<th id="1ndtl"><noframes id="1ndtl"><span id="1ndtl"><video id="1ndtl"><strike id="1ndtl"></strike></video></span> <strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
  1. 首頁
  2. 區塊鏈智能合約是什么(區塊鏈的基本特性,共識算法,虛擬機,智能合約)

區塊鏈智能合約是什么(區塊鏈的基本特性,共識算法,虛擬機,智能合約)

#冬日生活打卡季#

基于區塊鏈的基本特性,區塊鏈通常是由若干個區塊構成。在這些區塊中分別記錄有與該區塊的創建時刻對應的時間戳,所有的區塊嚴格按照區塊中記錄的時間戳,構成一條在時間上有序的數據鏈條。

對于物理世界產生的真實數據,可以將其構建成區塊鏈所支持的標準的交易(transaction)格式,然后發布至區塊鏈,由區塊鏈中的節點設備對收到的交易進行共識處理,并在達成共識后,由區塊鏈中作為記賬節點的節點設備,將這筆交易打包進區塊,在區塊鏈中進行持久化存證。

其中,區塊鏈中支持的共識算法可以包括:

第一類共識算法,即節點設備需要爭奪每一輪的記賬周期的記賬權的共識算法;例如,工作量證明(Proof of Work,POW)、股權證明(Proof of Stake,POS)、委任權益證明(Delegated Proof of Stake,DPOS)等共識算法;

第二類共識算法,即預先為每一輪記賬周期選舉記賬節點(不需要爭奪記賬權)的共識算法;例如,實用拜占庭容錯(Practical Byzantine Fault Tolerance,PBFT)等共識算法。

在采用第一類共識算法的區塊鏈網絡中,爭奪記賬權的節點設備,都可以在接收到交易后執行該筆交易。爭奪記賬權的節點設備中可能有一個節點設備在本輪爭奪記賬權的過程中勝出,成為記賬節點。記賬節點可以將收到的交易與其它交易一起打包以生成最新區塊,并將生成的最新區塊或者該最新區塊的區塊頭發送至其它節點設備進行共識。

在采用第二類共識算法的區塊鏈網絡中,具有記賬權的節點設備在本輪記賬前已經商定好。因此,節點設備在接收到交易后,如果自身不是本輪的記賬節點,則可以將該交易發送至記賬節點。對于本輪的記賬節點,在將該交易與其它交易一起打包以生成最新區塊的過程中或者之前,可以執行該交易。記賬節點在生成最新區塊后,可以將該最新區塊或者該最新區塊的區塊頭發送至其它節點設備進行共識。

如上所述,無論區塊鏈采用以上示出的哪種共識算法,本輪的記賬節點都可以將接收到的交易打包以生成最新區塊,并將生成的最新區塊或者該最新區塊的區塊頭發送至其它節點設備進行共識驗證。如果其它節點設備接收到最新區塊或者該最新區塊的區塊頭后,經驗證沒有問題,可以將該最新區塊追加到原有的區塊鏈末尾,從而完成區塊鏈的記賬過程。其它節點驗證記賬節點發來的新的區塊或區塊頭的過程中,也可以執行該區塊中的包含的交易。

在實際應用中,不論是公有鏈、私有鏈還是聯盟鏈,都可能提供智能合約(smartcontract)的功能。區塊鏈上的智能合約是在區塊鏈上可以被交易觸發執行的合約。智能合約可以通過代碼的形式定義。

以以太坊為例,支持用戶在以太坊網絡中創建并調用一些復雜的邏輯。以太坊作為一個可編程區塊鏈,其核心是以太坊虛擬機(EVM),每個以太坊節點都可以運行EVM。EVM是一個圖靈完備的虛擬機,通過它可以實現各種復雜的邏輯。用戶在以太坊中發布和調用智能合約就是在EVM上運行的。實際上,EVM直接運行的是虛擬機代碼(虛擬機字節碼,下簡稱“字節碼”),所以部署在區塊鏈上的智能合約可以是字節碼。

如圖1所示,Bob將一筆包含創建智能合約信息的交易(transaction)發送到以太坊網絡后,各節點均可以在EVM中執行這筆交易。其中,圖1中交易的From字段用于記錄發起創建智能合約的賬戶的地址,交易的Data字段的字段值保存的合約代碼可以是字節碼,交易的To字段的字段值為一個null(空)的賬戶。當節點間通過共識機制達成一致后,這個智能合約成功創建,后續用戶可以調用這個智能合約。

智能合約創建后,區塊鏈上出現一個與該智能合約對應的合約賬戶,并擁有一個特定的地址;比如,圖1中各節點中的“0x68e12cf284…”就代表了創建的這個合約賬戶的地址;合約代碼(Code)和賬戶存儲(Storage)將保存在該合約賬戶的賬戶存儲中。智能合約的行為由合約代碼控制,而智能合約的賬戶存儲則保存了合約的狀態。換句話說,智能合約使得區塊鏈上產生包含合約代碼和賬戶存儲的虛擬賬戶。

前述提到,包含創建智能合約的交易的Data字段保存的可以是該智能合約的字節碼。字節碼由一連串的字節組成,每一字節可以標識一個操作。基于開發效率、可讀性等多方面考慮,開發者可以不直接書寫字節碼,而是選擇一門高級語言編寫智能合約代碼。例如,高級語言可以采用諸如Solidity、Serpent、LLL語言等。對于采用高級語言編寫的智能合約代碼,可以經過編譯器編譯,生成可以部署到區塊鏈上的字節碼。

以Solidity語言為例,用其編寫的合約代碼與面向對象編程語言中的類(Class)很相似,在一個合約中可以聲明多種成員,包括狀態變量、函數、函數修改器、事件等。狀態變量是永久存儲在智能合約的賬戶存儲(Storage)字段中的值,用于保存合約的狀態。

如圖2所示,仍以以太坊為例,Bob將一筆包含調用智能合約信息的交易發送到以太坊網絡后,各節點均可以在EVM中執行這筆交易。其中,圖2中交易的From字段用于記錄發起調用智能合約的賬戶的地址,To字段用于記錄被調用的智能合約的地址,交易的Data字段用于記錄調用智能合約的方法和參數。調用智能合約后,合約賬戶的賬戶狀態可能改變。后續,某個客戶端可以通過接入的區塊鏈節點(例如圖2中的節點1)查看合約賬戶的賬戶狀態。

智能合約可以以規定的方式在區塊鏈網絡中每個節點獨立的執行,所有執行記錄和數據都保存在區塊鏈上,所以當這樣的交易執行完畢后,區塊鏈上就保存了無法篡改、不會丟失的交易憑證。

創建智能合約和調用智能合約的示意圖如圖3所示。以太坊中要創建一個智能合約,需要經過編寫智能合約、變成字節碼、部署到區塊鏈等過程。以太坊中調用智能合約,是發起一筆指向智能合約地址的交易,各個節點的EVM可以分別執行該交易,將智能合約代碼分布式的運行在以太坊網絡中每個節點的虛擬機中。

智能合約的事件機制,是智能合約與鏈外實體進行交互的一種方式。對于區塊鏈上部署的智能合約來說,通常無法直接與鏈外實體進行交互;例如,智能合約在調用完成后,通常無法將智能合約的調用結果,點對點的發送給智能合約的調用發起方。

智能合約在調用的過程中產生的調用結果(包括中間結果和最終的調用結果),通常都會以事件(event)的形式,記錄到調用該智能合約的那筆交易的交易日志(transaction logs),在節點設備的存儲空間中進行存儲。而需要與智能合約進行交互的鏈外實體,則可以通過監聽節點設備的存儲空間中存儲的上述交易日志的方式,來獲取智能合約的調用結果;

例如,以以太坊為例,交易日志最終會作為調用該智能合約的那筆交易筆交易的收據(receipt)的一部分內容,存儲在以上描述的MPT收據樹中。而與智能合約進行交互的鏈外實體,可以監聽節點設備的存儲空間中存儲的MPT收據樹上的交易收據,并從監聽到的交易收據中,來獲取智能合約生成的事件。

在跨鏈場景下,多個區塊鏈可以通過跨鏈中繼實現跨鏈對接。

其中,跨鏈中繼,可以通過橋接接口與多個區塊鏈分別進行對接,并基于實現的數據搬運邏輯,完成該多個區塊鏈之間的跨鏈數據同步。

在實現上述跨鏈中繼時所采用的跨鏈技術,在本說明書中不進行特別限定;例如,在實際應用中,可以通過側鏈技術、公證人技術等跨鏈機制,將多個區塊鏈連接起來。

當多個區塊鏈通過跨鏈中繼實現對接之后,區塊鏈之間就可以去讀取并認證其它區塊鏈上的數據,也可以通過跨鏈中繼去調用其它區塊鏈上部署的智能合約。

需要說明的是,跨鏈中繼僅用于多個區塊鏈之間搬運數據,并不需要對搬運的數據進行持久化存儲,也不需要維護所搬運的數據的數據狀態。在實際應用中,跨鏈中繼可以配置在其所連接的多個區塊鏈之外的設備、節點或平臺等處,也可以配置在其所連接的多個區塊鏈的節點設備上,在本說明書中不進行特別限定。

區塊鏈上部署的智能合約,通常只能引用區塊鏈上存儲的數據內容;而在實際應用中,對基于智能合約技術實現的一些復雜的業務場景,智能合約可能還需要引用一些鏈外的數據實體上的外部數據。

在這種場景下,區塊鏈上部署的智能合約,可以通過Oracle預言機,來引用鏈外的數據實體上的數據,進而實現智能合約與真實世界的數據實體之間的數據交互。其中,鏈外的數據實體,可以包括諸如部署在鏈外的中心化的服務器或者數據中心,等等。

需要說明的是,跨鏈中繼用于連接兩個區塊鏈,而Oracle預言機用于連接區塊鏈與鏈外的數據實體,實現區塊鏈與真實世界的數據交互。

在實際應用中,在為區塊鏈上的智能合約部署預言機時,可以先在區塊鏈上部署一個與預言機對應的預言機智能合約;其中,該預言機智能合約用于維護預言機發給區塊鏈上的智能合約的外部數據;例如,預言機發給區塊鏈上的智能合約的外部數據,可以存儲在預言機智能合約的賬戶存儲空間中。

當區塊鏈上的目標智能合約被調用時,可以從該預言機智能合約的賬戶存儲空間中,來讀取該目標智能合約所需的外部數據,來完成智能合約的調用過程。

需要說明的是,預言機在向區塊鏈上的智能合約發送外部數據時,可以采用主動發送的方式,也可以采用被動發送的方式。

在一種實現方式中,鏈外的數據實體可以將需要提供給目標智能合約的外部數據,利用預言機的私鑰進行簽名后,發送給上述預言機智能合約;例如,在時間時,可以采用周期性發送的方式,將簽名后的上述外部數據發送給上述預言機智能合約;

而在上述預言機智能合約可以維護預言機的CA證書,在收到鏈外的數據實體發送的外部數據后,可以使用該CA證書中維護的該預言機的公鑰,對該外部數據的簽名進行驗證,并在驗證通過后,將鏈外的數據實體發送的外部數據在該預言機智能合約的賬戶存儲空間中進行存儲。

在另一種實現方式中,當區塊鏈上的目標智能合約被調用時,如果從該預言機智能合約的賬戶存儲空間中,并未讀取到該目標智能合約所需的外部數據,此時該預言機智能合約,可以利用智能合約的事件機制,與上述預言機進行交互,并由上述預言機將該目標智能合約所需的外部數據,發送至該預言機智能合約的賬戶存儲空間中。

例如,當區塊鏈上的目標智能合約被調用時,如果從該預言機智能合約的賬戶存儲空間中,并未讀取到該目標智能合約所需的外部數據,此時該預言機智能合約,可以生成一個外部數據獲取事件,并將該外部數據獲取事件記錄到調用該智能合約的那筆交易的交易日志中,并將該交易日志存儲到節點設備的存儲空間;而上述預言機可以監聽節點設備的存儲空間中存儲的該預言機智能合約產生的交易日志,并在監聽到交易日志中的外部數據獲取事件后,響應監聽到的該外部數據獲取事件,將上述目標智能合約所需的外部數據,發送給上述預言機智能合約。

相關文章
美女网站色