自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

區(qū)塊鏈技術(shù)的起源與沿革(下篇):Hyperledger Fabric與分布式聯(lián)盟數(shù)據(jù)庫

原創(chuàng)
區(qū)塊鏈 分布式
本文旨在于盡可能懸置那些游離于技術(shù)層面之外的價(jià)值判斷,將視角重新移回到區(qū)塊鏈技術(shù)本身,完整回溯區(qū)塊鏈1.0到3.0的技術(shù)原理和設(shè)計(jì)理念之沿革,為讀者揭開籠罩在區(qū)塊鏈之上那層神秘的面紗。

【51CTO.com原創(chuàng)稿件】前言

說起當(dāng)今最具代表性的數(shù)據(jù)通信技術(shù),區(qū)塊鏈無疑在列。作為當(dāng)下最受關(guān)注的次世代分布式系統(tǒng),區(qū)塊鏈可謂眾說紛紜,莫衷一是。有人視之為引爆下一次互聯(lián)網(wǎng)技術(shù)革命的突破口,也有人稱其為投機(jī)工具,驚世騙局。本文旨在于盡可能懸置那些游離于技術(shù)層面之外的價(jià)值判斷,將視角重新移回到區(qū)塊鏈技術(shù)本身,完整回溯區(qū)塊鏈1.0到3.0的技術(shù)原理和設(shè)計(jì)理念之沿革,為讀者揭開籠罩在區(qū)塊鏈之上那層神秘的面紗。

第二章 Hyperledger Fabric與分布式聯(lián)盟數(shù)據(jù)庫

上篇中已經(jīng)詳細(xì)介紹了基于區(qū)塊鏈1.0設(shè)計(jì)的比特幣電子記賬系統(tǒng)。不設(shè)準(zhǔn)入機(jī)制和POW算法使得比特幣兼具了網(wǎng)絡(luò)開放性和數(shù)據(jù)安全性。但是POW算法過高的算力開銷也極大限制了區(qū)塊鏈網(wǎng)絡(luò)的數(shù)據(jù)處理效率。區(qū)塊鏈技術(shù)不僅能夠應(yīng)用于電子記賬,還可以廣泛應(yīng)用于如金融,安保等對(duì)數(shù)據(jù)安全性敏感度較高的領(lǐng)域。在強(qiáng)大的技術(shù)需求驅(qū)動(dòng)下,一項(xiàng)專為企業(yè)機(jī)構(gòu)間信息共享而量身定做的區(qū)塊鏈項(xiàng)目應(yīng)運(yùn)而生,這就是Linux基金會(huì)旗下著名的Hyperledger Fabric項(xiàng)目。

一、Hyperledger Fabric的技術(shù)背景

Hyperledger Fabric是Linux基金會(huì)所主導(dǎo)的Hyperledger(超級(jí)賬本)項(xiàng)目之一。除Fabric外,Hyperledger生態(tài)下還包含了諸如Burrow,Sawtooth(以太坊拓展項(xiàng)目),Indy(數(shù)字身份平臺(tái))等專門化項(xiàng)目。不同于比特幣網(wǎng)絡(luò)的公鏈設(shè)計(jì),Hyperledger采用了內(nèi)外網(wǎng)隔離和業(yè)務(wù)準(zhǔn)入的聯(lián)盟鏈架構(gòu),在區(qū)塊鏈1.0網(wǎng)絡(luò)架構(gòu)的基礎(chǔ)上進(jìn)一步形成了節(jié)點(diǎn)角色的分化。這一設(shè)計(jì)規(guī)避了企業(yè)內(nèi)部數(shù)據(jù)外泄的風(fēng)險(xiǎn),同時(shí)也盡可能排除了潛在的安全隱患。

Hyperledger Fabric基于谷歌的gRPC框架開發(fā),實(shí)現(xiàn)了網(wǎng)絡(luò)內(nèi)任意節(jié)點(diǎn)的對(duì)等通信。同時(shí)使用Docker容器技術(shù)來托管構(gòu)成基本交互邏輯的智能合約。簡(jiǎn)而言之,Hyperledger Fabric是專門為企業(yè)和機(jī)構(gòu)設(shè)計(jì)的通用型業(yè)務(wù)系統(tǒng)。

二、Hyperledger Fabric的數(shù)據(jù)結(jié)構(gòu)

1. Hyperledger Fabric的區(qū)塊鏈結(jié)構(gòu)

圖十四:Hyperledger Fabric的區(qū)塊鏈結(jié)構(gòu)

Hyperledger Fabric的區(qū)塊鏈結(jié)構(gòu)與比特幣大體相同,每個(gè)區(qū)塊都由區(qū)塊頭和區(qū)塊體組成,并通過父區(qū)塊哈希編碼構(gòu)成唯一鏈接。不過Hyperledger Fabric在區(qū)塊鏈1.0的基礎(chǔ)上進(jìn)一步加入了一層狀態(tài)緩存設(shè)計(jì),用以提高讀寫性能。

Hyperledger Fabric和比特幣網(wǎng)絡(luò)一樣,本質(zhì)上是一個(gè)分布式賬本(Hyperledger Fabric的賬本交互邏輯可以由使用者根據(jù)自身業(yè)務(wù)定制,在數(shù)據(jù)存儲(chǔ)的靈活性上要優(yōu)于區(qū)塊鏈1.0系統(tǒng))。在底層結(jié)構(gòu)中都是通過鍵值對(duì)的方式來存儲(chǔ)數(shù)據(jù)。而區(qū)塊鏈為了實(shí)現(xiàn)數(shù)據(jù)的時(shí)間可回溯性和數(shù)據(jù)防篡改機(jī)制,在鏈中并不保存數(shù)據(jù)的狀態(tài),而只保存對(duì)數(shù)據(jù)的變更。這就使得對(duì)某條數(shù)據(jù)的狀態(tài)查詢需要進(jìn)行全鏈遍歷,其查詢性能很難滿足一些企業(yè)級(jí)業(yè)務(wù)的性能需求,因此Hyperledger Fabric引入了“世界狀態(tài)(World State)”這一概念。當(dāng)區(qū)塊中保存某一條記錄時(shí),會(huì)同步更新對(duì)應(yīng)Key的世界狀態(tài)。當(dāng)需要查詢某個(gè)鍵值時(shí),只需要查詢對(duì)應(yīng)的世界狀態(tài)即可,而無需進(jìn)行全鏈遍歷。

需要強(qiáng)調(diào)的是,世界狀態(tài)是脫鏈保存在LevelDB/CouchDB結(jié)構(gòu)中的,是一種鏈外附加緩存機(jī)制,世界狀態(tài)的丟失并不會(huì)對(duì)區(qū)塊鏈中的數(shù)據(jù)產(chǎn)生影響。

2. Hyperledger Fabric的賬本結(jié)構(gòu)

當(dāng)網(wǎng)絡(luò)中的排序節(jié)點(diǎn)打包好最新區(qū)塊分發(fā)到每個(gè)記賬節(jié)點(diǎn)后,記賬節(jié)點(diǎn)會(huì)對(duì)本地的區(qū)塊鏈數(shù)據(jù)進(jìn)行更新,其賬本存儲(chǔ)結(jié)構(gòu)如下圖所示:

圖十五:Hyperledger Fabric的賬本結(jié)構(gòu)

首先每個(gè)記賬節(jié)點(diǎn)都保存了所有的歷史區(qū)塊信息,區(qū)塊以文件系統(tǒng)的形式存儲(chǔ),多個(gè)區(qū)塊以集合形式存儲(chǔ)在一個(gè)文件塊當(dāng)中。區(qū)塊鏈通過文件編號(hào),區(qū)塊編號(hào),偏移量來實(shí)現(xiàn)對(duì)某個(gè)歷史區(qū)塊的快速索引。

區(qū)塊鏈數(shù)據(jù)也是記賬節(jié)點(diǎn)中唯一的持久化數(shù)據(jù),永久保存且不可更改。某個(gè)區(qū)塊硬編碼為64M大小,以六位編碼區(qū)分,理論單鏈最多可以容納64*1000000M的數(shù)據(jù)量。當(dāng)一個(gè)新的區(qū)塊請(qǐng)求寫入時(shí),記賬節(jié)點(diǎn)首先會(huì)將新的區(qū)塊添加到本地區(qū)塊鏈中,然后將數(shù)據(jù)同步給狀態(tài)數(shù)據(jù)庫(世界狀態(tài)即目前數(shù)據(jù)的終態(tài),也就是原始狀態(tài)+區(qū)塊鏈中所有交易操作的疊加后的最終狀態(tài))。

當(dāng)每次節(jié)點(diǎn)啟動(dòng)時(shí),首先會(huì)校驗(yàn)區(qū)塊鏈,世界狀態(tài),鍵歷史索引中的數(shù)據(jù)是否一致,若不一致,則可以通過區(qū)塊鏈信息重構(gòu)狀態(tài)數(shù)據(jù)庫。當(dāng)然如果從創(chuàng)世區(qū)塊開始重構(gòu)世界狀態(tài)性能開銷往往很大,因此Hyperledger Fabric加入了額外的歷史狀態(tài)模塊,這一模塊記錄了對(duì)世界狀態(tài)中每一個(gè)鍵值對(duì)的操作(交易請(qǐng)求)的編碼,當(dāng)重構(gòu)某一鍵值對(duì)時(shí)只需要從區(qū)塊鏈中篩選出相應(yīng)的交易請(qǐng)求執(zhí)行即可,無需遍歷整個(gè)區(qū)塊鏈)。

3. Hyperledger Fabric的讀寫集機(jī)制

讀寫集是Hyperledger Fabric進(jìn)行數(shù)據(jù)更新時(shí)所依賴的核心技術(shù),當(dāng)背書節(jié)點(diǎn)進(jìn)行交易模擬時(shí)會(huì)對(duì)交易請(qǐng)求進(jìn)行驗(yàn)證。讀寫集分為讀集(讀已提交的狀態(tài)值)和寫集(將要更新的狀態(tài)鍵值對(duì),狀態(tài)鍵值對(duì)刪除標(biāo)記,若對(duì)同一鍵值對(duì)進(jìn)行多次更新則以最后一次為準(zhǔn))。執(zhí)行交易驗(yàn)證時(shí),對(duì)于某個(gè)更新操作,只有當(dāng)讀集版本號(hào)=世界狀態(tài)版本號(hào)時(shí),才會(huì)執(zhí)行寫集。寫集每更新一個(gè)鍵值對(duì),都會(huì)同時(shí)更新這一鍵值對(duì)的版本號(hào)。這一設(shè)計(jì)的目的在于保障同一區(qū)塊中的多筆交易不會(huì)對(duì)世界狀態(tài)產(chǎn)生重復(fù)操作(類似于Redis的樂觀鎖機(jī)制)。

例如世界狀態(tài)中存在某一鍵值對(duì)(A,100,V1),此時(shí)兩筆時(shí)間相近的交易請(qǐng)求被打包進(jìn)了同一個(gè)區(qū)塊中執(zhí)行:

請(qǐng)求一:讀出A值為100后執(zhí)行扣減50操作;

請(qǐng)求二:讀出A值為100后執(zhí)行扣減20操作;

當(dāng)請(qǐng)求一執(zhí)行后世界狀態(tài)更新為(A,50,V2),此時(shí)如果請(qǐng)求二執(zhí)行,則仍然按照之前讀到的(A,100,V1)世界狀態(tài)進(jìn)行操作,操作后世界狀態(tài)更新為(A,80,V2),繼而抹除了請(qǐng)求一的操作,因此進(jìn)行版本驗(yàn)證的目的在于避免在高并發(fā)情況下出現(xiàn)數(shù)據(jù)丟失的情形。

三、實(shí)用拜占庭容錯(cuò)算法(Practical Byzantine Fault Tolerance)

1.PBFT的基礎(chǔ)模型

在前文中我們已經(jīng)介紹了分布式系統(tǒng)必然面臨的數(shù)據(jù)一致性問題——拜占庭將軍問題。區(qū)塊鏈1.0的網(wǎng)絡(luò)架構(gòu)主要通過POW算法實(shí)現(xiàn)全網(wǎng)共識(shí),以強(qiáng)制記賬節(jié)點(diǎn)用物理開銷來換取記賬權(quán)的方式規(guī)避作弊行為。但是POW算法的解謎設(shè)計(jì)也造成了很大的資源浪費(fèi),大量的算力被浪費(fèi)在了沒有實(shí)質(zhì)意義的數(shù)字謎題上。而Hyperledger Fabric作為聯(lián)盟鏈,其更偏重于滿足企業(yè)的分布式數(shù)據(jù)存儲(chǔ)和企業(yè)間的數(shù)據(jù)共享需求,因此性能成為了網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)層面不得不考慮的問題。Hyperledger Fabric在區(qū)塊鏈1.0的基礎(chǔ)上引入了網(wǎng)絡(luò)準(zhǔn)入機(jī)制,只有賦權(quán)節(jié)點(diǎn)才能訪問區(qū)塊鏈中的數(shù)據(jù),節(jié)點(diǎn)數(shù)目要遠(yuǎn)遠(yuǎn)小于公鏈系統(tǒng),POW已經(jīng)不再適合聯(lián)盟鏈系統(tǒng)的設(shè)計(jì)開發(fā)。因此,Hyperledger Fabric采用了成本開銷更低,性能更高的一種共識(shí)算法——“實(shí)用拜占庭容錯(cuò)算法(PBFT)”。

由萊斯利·蘭伯特所提出的BFT算法僅僅只是在理論上證明了拜占庭容錯(cuò)的可行性,但是在實(shí)際的分布式系統(tǒng)設(shè)計(jì)中,由于網(wǎng)絡(luò)阻滯等原因,BFT算法幾乎無法被應(yīng)用。因此在BFT的基礎(chǔ)上,卡斯特羅,米格爾,芭芭拉•利斯科夫等三位計(jì)算機(jī)科學(xué)家進(jìn)一步提出了能夠?qū)嶋H應(yīng)用的PBFT算法。

PBFT算法首先區(qū)分了分布式系統(tǒng)的三種基本模型:

強(qiáng)同步性(Synchrony)模型,任意一個(gè)節(jié)點(diǎn)發(fā)出的消息都能在確定的時(shí)間周期內(nèi)送達(dá)目標(biāo)節(jié)點(diǎn)。

強(qiáng)異步性(Asynchrony)模型,任意一個(gè)節(jié)點(diǎn)發(fā)出的消息都未必能到達(dá)目標(biāo)節(jié)點(diǎn)。

弱同步性(Partial Synchrony)模型,任意一個(gè)節(jié)點(diǎn)發(fā)出的消息在可能的延遲范圍內(nèi)最終會(huì)送達(dá)目標(biāo)節(jié)點(diǎn)。

強(qiáng)同步性與強(qiáng)異步性模型所設(shè)定的情況都過于極端,在實(shí)際的分布式系統(tǒng)中情況更加接近弱同步性模型。PBFT算法基于弱同步性模型設(shè)計(jì),即消息可能延遲,但不會(huì)無限延遲。

假設(shè)一個(gè)分布式網(wǎng)絡(luò)中故障/惡意節(jié)點(diǎn)為F個(gè),總節(jié)點(diǎn)數(shù)為N個(gè),在弱同步性模型中,PBFT需要確保兩點(diǎn):

當(dāng)某個(gè)節(jié)點(diǎn)收到一條消息時(shí),考慮到最多可能有F個(gè)節(jié)點(diǎn)保持靜默,因此當(dāng)收到N-F條消息時(shí)就要開始驗(yàn)證,而且N-F條消息中至少要有多于F條消息一致才能完成容錯(cuò)判定。因此N和F需要滿足:

N  -  F  >  F

此外N-F條消息中還有可能包含F(xiàn)個(gè)來自惡意節(jié)點(diǎn)的假消息,因此真消息的數(shù)目至少要多于F條才可以完成容錯(cuò)判定,故而N和F需要滿足:

N  -  F  -  F  >  F

綜上有:

故當(dāng)惡意/故障節(jié)點(diǎn)不超過總結(jié)點(diǎn)數(shù)1/3的情況下,PBFT算法能夠?qū)崿F(xiàn)全局一致性。

2.PBFT的網(wǎng)絡(luò)拓?fù)淠P?/strong>

圖十六:PBFT的網(wǎng)絡(luò)拓?fù)淠P?/p>

PBFT實(shí)現(xiàn)的分布式網(wǎng)絡(luò)需要滿足兩個(gè)條件:

  • 每個(gè)節(jié)點(diǎn)具有相同的起始狀態(tài);
  • 在相同的狀態(tài)下,同一操作產(chǎn)生的結(jié)果相同。

在一個(gè)PBFT算法實(shí)現(xiàn)的分布式網(wǎng)絡(luò)中,一組節(jié)點(diǎn)中選取一個(gè)節(jié)點(diǎn)作為主節(jié)點(diǎn)(Primary),其它節(jié)點(diǎn)作為備份節(jié)點(diǎn)(Backup)。選取某個(gè)節(jié)點(diǎn)擔(dān)任主節(jié)點(diǎn)的事態(tài)稱為系統(tǒng)的一個(gè)視圖(View)。當(dāng)主節(jié)點(diǎn)故障時(shí)將重新選取主節(jié)點(diǎn),主節(jié)點(diǎn)發(fā)生變化時(shí)視為系統(tǒng)的視圖發(fā)生了一次更新。假設(shè)在View1視圖下網(wǎng)絡(luò)對(duì)某條消息m的排序n達(dá)成一致,為Order⟨view1,m,n⟩,那么當(dāng)視圖更新后對(duì)m的排序仍然為Order⟨view2,m,n⟩,即視圖轉(zhuǎn)換前后消息排序不會(huì)發(fā)生改變。

3.PBFT的消息處理流程

圖十七:PBFT的消息處理流程

PBFT的消息處理流程大體上分為請(qǐng)求(Request),預(yù)處理(Pre-prepare),準(zhǔn)備(Prepare),提交(Commit),響應(yīng)(Reply)五個(gè)階段。我們通過一個(gè)四節(jié)點(diǎn),一個(gè)客戶端的簡(jiǎn)單網(wǎng)絡(luò)模型來對(duì)PBFT的信息傳輸校驗(yàn)流程加以說明:

在該網(wǎng)絡(luò)模型中,Primary節(jié)點(diǎn)和Backup1,Backup2節(jié)點(diǎn)為正常節(jié)點(diǎn),Backup3節(jié)點(diǎn)發(fā)生故障無法做出響應(yīng),符合N>3F要求。

首先在Request階段,Client向Primary發(fā)出一條請(qǐng)求,消息格式為:

其中o 表示操作請(qǐng)求內(nèi)容,t表示當(dāng)前時(shí)間戳,c表示Client節(jié)點(diǎn)。

當(dāng)Primary收到該消息并驗(yàn)證后,進(jìn)入Pre-prepare階段,Primary給予消息m一個(gè)序號(hào)n,向Backup1,Backup2,Backup3廣播預(yù)處理消息,消息格式為: 其中v表示當(dāng)前的系統(tǒng)視圖,n為消息排序,m為消息內(nèi)容,d為消息m的哈希值。

當(dāng)Backup1,Backup2節(jié)點(diǎn)接收到Primary節(jié)點(diǎn)的消息后,首先會(huì)驗(yàn)證系統(tǒng)視圖是否發(fā)生了更新,消息簽名是否合法,排序n是否處于當(dāng)前視圖高低水位之間(為了保證n不出現(xiàn)極大極小值,同一視圖下系統(tǒng)會(huì)對(duì)n的取值域進(jìn)行限制,使n∈(h,H)),以及是否收到過其它排序?yàn)閚的消息(確保不同的消息不會(huì)獲得相同的排序)。驗(yàn)證通過后,進(jìn)入PREPARE階段,該節(jié)點(diǎn)會(huì)向其它節(jié)點(diǎn)(包括Primary節(jié)點(diǎn))發(fā)送一條準(zhǔn)備消息并將該消息存入本地日志中,消息格式為: 其中i表示當(dāng)前節(jié)點(diǎn)。

當(dāng)其他節(jié)點(diǎn)收到該消息后,會(huì)進(jìn)行如下校驗(yàn)并將該消息存入本地日志:

第一步,校驗(yàn)本地日志中是否存在消息m。

第二步,校驗(yàn)本地日志中是否存在m的PRE-PREPARE消息。

第三步,校驗(yàn)本地日志中是否存在至少2F個(gè)關(guān)于m的PREPARE消息。

若校驗(yàn)通過,則稱本節(jié)點(diǎn)對(duì)消息m達(dá)成了PREPARED狀態(tài)。此時(shí)該節(jié)點(diǎn)會(huì)向其它節(jié)點(diǎn)廣播,消息格式為:

當(dāng)其它節(jié)點(diǎn)收到該條COMMIT消息時(shí),會(huì)進(jìn)行如下校驗(yàn)并將該消息存入本地日志:

第一步,檢驗(yàn)本節(jié)點(diǎn)是否對(duì)消息m達(dá)成PREPARED狀態(tài)。

第二步,校驗(yàn)本地日志中是否至少有2F條來自其它節(jié)點(diǎn)的關(guān)于m的COMMIT消息。

若校驗(yàn)通過,則說明對(duì)m的排序已經(jīng)達(dá)成了全局一致,此時(shí)稱該節(jié)點(diǎn)對(duì)消息m達(dá)成了COMMITTED-LOCAL(m,v,n,i)狀態(tài),可以直接返回給Client,消息格式為: 其中r和t相同,用于時(shí)間校驗(yàn),當(dāng)Client收到F+1個(gè)一致的REPLY消息時(shí),共識(shí)流程結(jié)束。

圖十八:節(jié)點(diǎn)本地日志庫狀態(tài)轉(zhuǎn)移圖

為了更直觀地理解這一流程,我們作出每個(gè)節(jié)點(diǎn)本地日志庫的狀態(tài)轉(zhuǎn)移圖。其中藍(lán)色標(biāo)識(shí)的消息為節(jié)點(diǎn)自己產(chǎn)生,綠色標(biāo)識(shí)的消息來自其它節(jié)點(diǎn)。

首先Client發(fā)出REQUEST消息,該消息被保存在Primary的日志庫中。然后Primary發(fā)送PRE-PREPARE消息給Backup1,Backup2,Backup3。Backup1,Backup2分別在日志庫中保存該條PRE-PREPARE消息。然后向其它節(jié)點(diǎn)發(fā)送PREPARE消息。

Primary收到來自Backup1,Backup2的兩條PREPARE消息并保存在日志庫中。而Backup1,Backup2除了一條自己產(chǎn)生的PREPARE消息外,還收到一條其它節(jié)點(diǎn)的PREPARE消息。此時(shí)三個(gè)正常節(jié)點(diǎn)日志庫均滿足:

  • 存在消息m的日志;
  • 存在消息m的PRE-PREPARE日志;
  • 存在消息m的2F個(gè)PREPARE日志。

此時(shí)三個(gè)節(jié)點(diǎn)均達(dá)成了關(guān)于m的PREPARED狀態(tài),繼而向其它節(jié)點(diǎn)發(fā)送COMMIT消息。

由圖可見,三個(gè)正常節(jié)點(diǎn)除了自身產(chǎn)生的一條COMMIT消息外,均收到了2條來自其它節(jié)點(diǎn)的COMMIT消息,均達(dá)成COMMITTED狀態(tài),返回REPLY消息給客戶端,完成共識(shí)流程。

4.PBFT的垃圾回收機(jī)制

PBFT算法對(duì)信息的階段性校驗(yàn)需要用到節(jié)點(diǎn)的日志庫,隨著信息的增加,日志庫中的冗余數(shù)據(jù)也會(huì)越來越多,因此PBFT會(huì)通過定期的垃圾回收來釋放內(nèi)存空間。PBFT的垃圾回收通過Checkpoint機(jī)制來完成。Checkpoint點(diǎn)的設(shè)置為某個(gè)常數(shù)K的整數(shù)倍。假設(shè)當(dāng)前消息排序值n取值的高低水位為h到H之間,當(dāng)被排序的消息數(shù)超過H時(shí),節(jié)點(diǎn)便會(huì)發(fā)送CHECKPOINT消息,消息格式為:

當(dāng)某個(gè)節(jié)點(diǎn)收到2F+1條CHECKPOINT消息后,便會(huì)將高低水位重新置為n∈(H,H+K),并刪除排序值小于H的消息日志,釋放內(nèi)存空間。

5.PBFT的視圖更新機(jī)制

因?yàn)镻BFT通過主節(jié)點(diǎn)完成對(duì)消息的排序,因此就存在主節(jié)點(diǎn)故障的風(fēng)險(xiǎn)。對(duì)此PBFT設(shè)計(jì)了一套對(duì)應(yīng)的視圖更新機(jī)制來保證主節(jié)點(diǎn)故障的情況下整個(gè)系統(tǒng)的可用性。

當(dāng)某個(gè)節(jié)點(diǎn)i監(jiān)測(cè)到主節(jié)點(diǎn)響應(yīng)超時(shí),便進(jìn)入視圖更新流程,并發(fā)送一條VIEWCHANGE消息,消息格式為:

其中n為最近一個(gè)Checkpoint的序號(hào),C為對(duì)應(yīng)的2F+1個(gè)CHECKPOINT消息集合。P為一個(gè)達(dá)成PREPARED狀態(tài)的消息集合:

Pm表示序號(hào)大于n且達(dá)成PREPARED狀態(tài)的消息m的至少1個(gè)PRE-PREPARE消息和至少2F個(gè)PREPARE消息的集合(也就是使消息m達(dá)成PREPARED狀態(tài)的所有預(yù)處理消息和準(zhǔn)備消息的總集)。

當(dāng)新的主節(jié)點(diǎn)Primaryv+1收到2F個(gè)有效的VIEWCHANGE消息后,會(huì)廣播一條新視圖消息,消息格式為:

其中V是Primaryv+1收到的所有VIEWCHANGE消息的集合,O為以新視圖構(gòu)造的PRE-PREPARE消息的集合,至此視圖更新流程結(jié)束。這一機(jī)制有效確保了系統(tǒng)在視圖更新前后達(dá)成PREPARED狀態(tài)的消息排序不變。

四、Hyperledger Fabric的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)與共識(shí)機(jī)制

Hyperledger Fabric使用PBFT作為其共識(shí)算法的底層實(shí)現(xiàn)。對(duì)于分布式系統(tǒng)而言,數(shù)據(jù)一致性策略可分為強(qiáng)一致性策略和最終一致性策略。所謂強(qiáng)一致性策略是指系統(tǒng)能夠?qū)崿F(xiàn)在極端條件下的數(shù)據(jù)一致性,其涉及到復(fù)雜的數(shù)據(jù)交互,且對(duì)系統(tǒng)壓力較大,并不適合商業(yè)級(jí)數(shù)據(jù)存儲(chǔ)。因此Hyperledger Fabric采用了最終一致性策略,所謂最終一致性是指系統(tǒng)可以容忍在短時(shí)間內(nèi)不同節(jié)點(diǎn)數(shù)據(jù)不一致的情形,整個(gè)區(qū)塊鏈網(wǎng)絡(luò)只需要保證在一定時(shí)間周期內(nèi)達(dá)成一致即可。

圖十九:Hyperledger Fabric的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)

如圖所示,Hyperledger Fabric采用多中心的網(wǎng)絡(luò)架構(gòu)模式,由獨(dú)立的排序節(jié)點(diǎn)對(duì)來自不同終端的交易請(qǐng)求進(jìn)行規(guī)整處理,封裝成區(qū)塊后再下發(fā)到整個(gè)區(qū)塊鏈網(wǎng)絡(luò)。

Hyperledger Fabric網(wǎng)絡(luò)下主要有四種類型的節(jié)點(diǎn):

  • Client節(jié)點(diǎn)(客戶端節(jié)點(diǎn)),這一節(jié)點(diǎn)主要用于提供應(yīng)用訪問區(qū)塊鏈網(wǎng)絡(luò)的入口,負(fù)責(zé)系統(tǒng)與區(qū)塊鏈之間的數(shù)據(jù)交互。
  • Peer節(jié)點(diǎn),包含了Anchor節(jié)點(diǎn)(錨節(jié)點(diǎn)),Endorser節(jié)點(diǎn)(背書節(jié)點(diǎn))和Committer節(jié)點(diǎn)(記賬節(jié)點(diǎn))。其中錨節(jié)點(diǎn)每個(gè)組織中至多只有一個(gè),負(fù)責(zé)和其他組織以及order節(jié)點(diǎn)交互,組織網(wǎng)絡(luò)中的非錨節(jié)點(diǎn)不直接參與和外部網(wǎng)絡(luò)的信息交換。背書節(jié)點(diǎn)負(fù)責(zé)模擬執(zhí)行來自用戶的交易請(qǐng)求,并對(duì)請(qǐng)求進(jìn)行驗(yàn)證和簽名。記賬節(jié)點(diǎn)負(fù)責(zé)保存區(qū)塊鏈信息,更新世界狀態(tài)等。需要強(qiáng)調(diào)的是這三種角色之間并非互斥關(guān)系,一個(gè)Peer節(jié)點(diǎn)可能同時(shí)兼有背書節(jié)點(diǎn),記賬節(jié)點(diǎn)等多種角色,而且所有的Peer節(jié)點(diǎn)都是記賬節(jié)點(diǎn)。
  • Order節(jié)點(diǎn),共識(shí)機(jī)制的核心節(jié)點(diǎn),負(fù)責(zé)對(duì)來自用戶的交易請(qǐng)求進(jìn)行排序,打包成區(qū)塊后分發(fā)給其它組織的錨節(jié)點(diǎn)。
  • CA節(jié)點(diǎn)(鑒權(quán)節(jié)點(diǎn)),非必要節(jié)點(diǎn),主要負(fù)責(zé)證書的頒發(fā),身份驗(yàn)證及用戶鑒權(quán)等。也可通過第三方證書鑒權(quán)機(jī)構(gòu)實(shí)現(xiàn)。

就Hyperledger Fabric的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)而言,其并不同于如比特幣,以太坊等常見公鏈的網(wǎng)狀拓?fù)浣Y(jié)構(gòu),而是更接近于具備一定層級(jí)關(guān)系的樹狀拓?fù)浣Y(jié)構(gòu)(就此而言,Hyperledger Fabric并非是一個(gè)去中心網(wǎng)絡(luò),而是一個(gè)多中心網(wǎng)絡(luò))。

不同的組織分屬于不同的網(wǎng)域,每個(gè)組織結(jié)構(gòu)下只暴露一個(gè)錨節(jié)點(diǎn)作為與其它組織交互的接口。這一設(shè)計(jì)主要是出于部分企業(yè)的數(shù)據(jù)安全性考慮。很多企業(yè)核心數(shù)據(jù)往往不便于直接暴露在公網(wǎng)中,內(nèi)外網(wǎng)隔離的設(shè)計(jì)可以充分確保敏感數(shù)據(jù)的安全性。

除了不同的組織外,區(qū)塊鏈網(wǎng)絡(luò)中還存在由Order節(jié)點(diǎn)組成的排序網(wǎng)絡(luò),Order節(jié)點(diǎn)有Solo和Kafka兩種運(yùn)行模式。Solo模式由單個(gè)Order節(jié)點(diǎn)提供排序服務(wù),往往只是用于網(wǎng)絡(luò)測(cè)試和節(jié)點(diǎn)數(shù)較少的場(chǎng)景。商業(yè)應(yīng)用中一般采用Kafka模式,Order節(jié)點(diǎn)將接收到的交易請(qǐng)求發(fā)送給Kafka集群,由Kafka集群排序后再返回給Order節(jié)點(diǎn),這一設(shè)計(jì)大大提升了Order集群的排序分發(fā)效率。

圖二十:Hyperledger Fabric的多通道排序機(jī)制

在企業(yè)應(yīng)用場(chǎng)景中可能存在一個(gè)區(qū)塊鏈網(wǎng)絡(luò)需要承接多種業(yè)務(wù)的情形,因此Hyperledger Fabric采用了多通道設(shè)計(jì)。所謂通道指的是一個(gè)封閉的業(yè)務(wù)群,一個(gè)Hyperledger Fabric網(wǎng)絡(luò)中可能存在多個(gè)業(yè)務(wù)群處理不同的業(yè)務(wù),彼此之間在邏輯和物理上均相互隔離。有幾個(gè)業(yè)務(wù)群就會(huì)存在幾條不同的區(qū)塊鏈,每個(gè)節(jié)點(diǎn)都只會(huì)保存自己加入的通道的區(qū)塊鏈數(shù)據(jù),進(jìn)而杜絕了多業(yè)務(wù)交叉場(chǎng)景下數(shù)據(jù)外泄的風(fēng)險(xiǎn)。而排序節(jié)點(diǎn)也會(huì)根據(jù)通道的不同將交易請(qǐng)求分發(fā)給不同的Kafka隊(duì)列,實(shí)現(xiàn)業(yè)務(wù)間的鏈級(jí)隔離。

Hyperledger Fabric網(wǎng)絡(luò)中一個(gè)完整的交易流程為:

客戶端首先提交交易提案發(fā)送給背書節(jié)點(diǎn)(至少兩個(gè),具體可在背書策略中設(shè)置,用戶可指定要使用的背書節(jié)點(diǎn)),背書節(jié)點(diǎn)收到交易提案后啟動(dòng)鏈碼(運(yùn)行在一個(gè)隔離的安全容器中,無法被人為干預(yù))模擬交易(僅僅是模擬,并不會(huì)更新到區(qū)塊鏈網(wǎng)絡(luò)中)。鑒權(quán)驗(yàn)證通過后背書節(jié)點(diǎn)會(huì)添加數(shù)字簽名并返回給客戶端(理論上多個(gè)背書節(jié)點(diǎn)返回的執(zhí)行結(jié)果應(yīng)當(dāng)一致)??蛻舳藢⒑灻蟮慕灰渍?qǐng)求發(fā)送給Order節(jié)點(diǎn),Order節(jié)點(diǎn)進(jìn)行排序后打包成區(qū)塊分發(fā)給各組織錨節(jié)點(diǎn)。錨節(jié)點(diǎn)分發(fā)給組織內(nèi)記賬節(jié)點(diǎn),記賬節(jié)點(diǎn)驗(yàn)證完成后將最新的區(qū)塊添加到本地區(qū)塊鏈中,并更新世界狀態(tài)。

五、智能合約

圖二十一:發(fā)起交易和智能合約調(diào)用流程

智能合約(鏈碼)是Hyperledger Fabric用于應(yīng)用和區(qū)塊鏈網(wǎng)絡(luò)之間交互的媒介。鏈碼部署在獨(dú)立且隔離的Docker容器中,無法被外界干預(yù)和篡改,通過gRPC與背書節(jié)點(diǎn)通信。背書節(jié)點(diǎn)將交易請(qǐng)求發(fā)送給鏈碼容器后,鏈碼容器返回給背書節(jié)點(diǎn)該筆交易的執(zhí)行結(jié)果。

智能合約類似于應(yīng)用系統(tǒng)中的對(duì)外接口,而交易就是對(duì)接口的一次調(diào)用。鏈碼中對(duì)外接口只提供兩個(gè)方法,Init方法和Invoke方法。Init方法只會(huì)在區(qū)塊鏈網(wǎng)絡(luò)啟動(dòng)時(shí)在任意一個(gè)節(jié)點(diǎn)執(zhí)行一次,Invoke方法則用于應(yīng)用和區(qū)塊鏈網(wǎng)絡(luò)之間具體的交互。

鏈碼存在五個(gè)生命周期,打包(鏈碼的編譯),安裝(上傳到背書節(jié)點(diǎn)),實(shí)例化(執(zhí)行Init方法),升級(jí)(鏈碼中的功能拓展和Bug修復(fù)),交互(應(yīng)用調(diào)用)。

企業(yè)用戶可以根據(jù)自身業(yè)務(wù)場(chǎng)景編寫不同功能的智能合約來實(shí)現(xiàn)應(yīng)用和區(qū)塊鏈網(wǎng)絡(luò)之間的數(shù)據(jù)交互。

六、Hyperledger Fabric的業(yè)務(wù)應(yīng)用

Hyperledger Fabric是一套專門為機(jī)構(gòu)和企業(yè)設(shè)計(jì)的通用型業(yè)務(wù)方案。其相比于區(qū)塊鏈1.0和2.0,可以靈活的根據(jù)用戶業(yè)務(wù)進(jìn)行定制。而模塊化和插件式的服務(wù)模式也大大降低了用戶的組網(wǎng)成本。非常適用于金融,支付等高敏感性業(yè)務(wù)場(chǎng)景。而Hyperledger Fabric底層的鍵值對(duì)存儲(chǔ)結(jié)構(gòu)也具有很強(qiáng)的擴(kuò)展性。傳統(tǒng)數(shù)據(jù)庫能夠存儲(chǔ)的數(shù)據(jù),理論上Hyperledger Fabric都可以存儲(chǔ)。其多通道設(shè)計(jì)可以實(shí)現(xiàn)物理級(jí)別的業(yè)務(wù)解耦,多種業(yè)務(wù)都可以無干擾地掛載在同一區(qū)塊鏈網(wǎng)絡(luò)下。實(shí)現(xiàn)資源復(fù)用的同時(shí)又避免了機(jī)構(gòu)之間業(yè)務(wù)交叉產(chǎn)生的數(shù)據(jù)外泄風(fēng)險(xiǎn)。

Hyperledger Fabric的另一大優(yōu)勢(shì)在于用戶可以根據(jù)自身業(yè)務(wù)編寫智能合約,定制應(yīng)用系統(tǒng)和區(qū)塊鏈網(wǎng)絡(luò)的數(shù)據(jù)交互模式。這就為復(fù)雜業(yè)務(wù)場(chǎng)景和區(qū)塊鏈技術(shù)的縫合提供了便利,使得“區(qū)塊鏈+”得以真正進(jìn)入企業(yè)級(jí)應(yīng)用之中。

結(jié)語

區(qū)塊鏈技術(shù)問世以來,十?dāng)?shù)年間歷經(jīng)三次迭代,其間或譽(yù)或諑,不絕于耳。唯有撥開籠罩在區(qū)塊鏈上的那層神秘面紗,深究其技術(shù)原理,方能得見其真容。單純作為一種技術(shù)而言,區(qū)塊鏈本身是價(jià)值無涉的。工具能釋放出怎樣的社會(huì)價(jià)值,終究取決于其使用者。我們也許驚嘆于設(shè)計(jì)者的曠世奇思,但絕無必要為其賦予太多超脫于技術(shù)之外的神秘色彩。區(qū)塊鏈也許是通往未來的一個(gè)入口,但任何技術(shù)奇點(diǎn)的引爆都并非來自于某個(gè)單點(diǎn)技術(shù)突破,而是醞釀?dòng)诤穹e薄發(fā)的逐步嬗變。勤懇與踏實(shí)才是推動(dòng)社會(huì)進(jìn)步的最終驅(qū)力,在技術(shù)瞬息萬變,發(fā)展一日千里的當(dāng)下,我們更當(dāng)持守此心。

參考文獻(xiàn)

[1] Satoshi Nakamoto: Bitcoin:A Peer-to-Peer Electronic Cash System[EB/OL]

[2] Castro,Miguel,Barbara Liskov: Practical Byzantine fault tolerance.OSDI.Vol.99.1999

[3] Kwon,Jae: Tendermint:Consensus without mining.Draft v.0.6,fall(2014)

作者簡(jiǎn)介:

王翔,畢業(yè)于安徽大學(xué)2018屆電子信息工程專業(yè),現(xiàn)就職于某知名世界五百強(qiáng)互聯(lián)網(wǎng)企業(yè)。致力于服務(wù)端系統(tǒng)的架構(gòu)設(shè)計(jì),多活部署,性能優(yōu)化,業(yè)務(wù)開發(fā)等工作。

【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】

 

責(zé)任編輯:龐桂玉 來源: 51CTO
相關(guān)推薦

2020-04-08 09:00:00

數(shù)字貨幣區(qū)塊鏈區(qū)塊鏈技術(shù)

2018-05-03 20:55:47

區(qū)塊鏈分布式數(shù)據(jù)庫

2023-12-14 14:49:05

SQL數(shù)據(jù)庫分布式 SQL

2024-01-08 08:05:08

分開部署數(shù)據(jù)體系系統(tǒng)拆分

2020-01-10 07:20:52

區(qū)塊鏈起源與發(fā)展

2019-07-05 15:01:32

區(qū)塊鏈系統(tǒng)分布式存儲(chǔ)

2023-11-27 08:33:42

2021-10-04 11:13:59

區(qū)塊鏈DLT技術(shù)

2019-06-10 14:31:24

MySQL存儲(chǔ)數(shù)據(jù)庫

2022-02-22 08:30:12

Husky代碼工作流

2022-07-12 10:13:12

數(shù)據(jù)庫DBA

2019-10-12 10:40:32

區(qū)塊鏈數(shù)字貨幣比特幣

2023-09-03 14:10:17

2010-06-29 16:41:24

SQL Server分

2019-05-31 09:25:56

2021-04-15 22:02:53

區(qū)塊鏈金融比特幣

2022-01-21 14:52:12

區(qū)塊鏈加密貨幣金融

2019-05-30 08:31:39

數(shù)據(jù)庫QTSDB分布式

2017-05-02 21:05:01

分布式數(shù)據(jù)庫細(xì)說

2022-09-01 07:23:53

云原生數(shù)據(jù)庫Aurora
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)