一、說明
區(qū)塊鏈?zhǔn)且粋€透明的器一,基于不可變模式的去中心化系統(tǒng)课锌,核心就是一個分布式賬本,記錄網(wǎng)絡(luò)上發(fā)生的所有交易祈秕。
區(qū)塊鏈網(wǎng)絡(luò)主要有三種類型:公共區(qū)塊鏈渺贤、聯(lián)盟區(qū)塊鏈,以及私有區(qū)塊鏈请毛;我們熟知的比特幣志鞍、以太坊這些數(shù)字貨幣其實就是屬于公共區(qū)塊鏈平臺;
而今天要介紹的 Fabric
則是屬于聯(lián)盟鏈類型的获印;Fabric是一個企業(yè)級的分布式賬本技術(shù)平臺述雾,也是目前應(yīng)用最廣泛的區(qū)塊鏈項目。
本文將梳理區(qū)塊鏈技術(shù)平臺 Fabric
的核心概念與關(guān)鍵功能兼丰。
?
二玻孟、特點
Fabric與其他區(qū)塊鏈平臺對比有以下幾個特點:
開源:它是Linux基金會旗下的一個重量級區(qū)塊鏈平臺。
身份管理:fabric和其他區(qū)塊鏈系統(tǒng)的不同之處在于它是私有的鳍征,有準(zhǔn)入資格授權(quán)的黍翎,并非一個公開的允許不明身份參與者進(jìn)入網(wǎng)絡(luò)的系統(tǒng);它提供了一個成員身份服務(wù)艳丛,用于管理網(wǎng)絡(luò)上的所有參與者和權(quán)限匣掸。
隱私和保密:有一個通道的概念提供了交易隱私和機(jī)密性,一個Fabric的網(wǎng)絡(luò)可以創(chuàng)建多個通道氮双,任何未正式授權(quán)的網(wǎng)絡(luò)成員都沒辦法看到或者訪問通道上的任何數(shù)據(jù)碰酝;可以理解為就是支持多租戶,通道與通道之間的數(shù)據(jù)都是隔離的戴差。
鏈碼功能:智能合約在Fabric 中稱之為鏈碼送爸,用于對賬本的訪問,例如寫入交易信息,查詢數(shù)據(jù)等等袭厂。
模塊化設(shè)計:Fabric實現(xiàn)了模塊化架構(gòu)墨吓,例如身份、排序纹磺、鏈碼等服務(wù)和功能帖烘,都是可選的可插拔的非常靈活。
?
三橄杨、系統(tǒng)功能
Fabric的一個功能架構(gòu)圖:
- 身份管理功能是通過PKI體系和CA模塊來實現(xiàn)成員秘症、權(quán)限還有證書的管理。
- 分布式賬本就是區(qū)塊鏈網(wǎng)絡(luò)的核心功能讥珍,記錄著所有的交易信息历极。
- 排序服務(wù),類似一個裁判的角色衷佃,因為不同的交易順序?qū)ψ罱K的交易結(jié)果是有很大的影響的趟卸,所以這個排序服務(wù)主要是為了讓所有的節(jié)點達(dá)成統(tǒng)一的共識,最終實現(xiàn)數(shù)據(jù)的一致性氏义。
- 網(wǎng)絡(luò)通信方面锄列,節(jié)點與節(jié)點之間的點對點通信是基于grpc協(xié)議,然后再通過gossip算法來實現(xiàn)去中心化的廣播邻邮,意思就是不需要中心節(jié)點,通過任意一個節(jié)點以一傳十克婶,十傳百的方式來把消息散播到全網(wǎng)筒严。
- 背書驗證指的是背書策略,背書策略有很多種情萤,例如我指定策略為大多數(shù)節(jié)點同意鸭蛙,意思就是一筆交易必需超過半數(shù)的節(jié)點都認(rèn)證通過了,才能完成筋岛,這樣就能有效的防御一些惡意的交易娶视。
- 鏈碼服務(wù)是一個獨立的應(yīng)用程序,運(yùn)行在隔離的Docker容器中睁宰,在鏈碼部署的時候會自動生成鏈碼的Docker鏡像肪获。
?
四、組件邏輯關(guān)系
- 圖中的淺藍(lán)色方塊
N
代表整個區(qū)塊鏈網(wǎng)絡(luò)柒傻; - 網(wǎng)絡(luò)底部的
C
為通道
相當(dāng)于是一個子鏈孝赫,一個區(qū)塊鏈網(wǎng)絡(luò)可以創(chuàng)建多個通道,通道與通道之間是數(shù)據(jù)隔離的红符,可以理解為是一個多租戶系統(tǒng)青柄; - 一個通道上面可以部署多個
Peer 節(jié)
點為圖中藍(lán)色方塊P1
和P2
劫映,區(qū)塊鏈網(wǎng)絡(luò)主要由Peer 節(jié)
點組成; - 每個
Peer 節(jié)
點上都有一份賬本
的全量副本為紅色的L1
刹前,然后智能合約
是部署在每個節(jié)點上的為黃色S1
,一個節(jié)點可以部署多個智能合約
雌桑; - 最后區(qū)塊鏈網(wǎng)絡(luò)外面的白色方塊A指的是訪問區(qū)塊鏈的
應(yīng)用
喇喉,應(yīng)用是通過通道來與節(jié)點上的賬本進(jìn)行交易的。
?
五校坑、賬本
賬本是 Hyperledger Fabric 中的一個重要概念拣技,它存儲了有關(guān)業(yè)務(wù)對象的重要事實信息,其中既包括對象屬性的當(dāng)前值耍目,也包括產(chǎn)生這些當(dāng)前值的交易的歷史膏斤。
賬本由一個區(qū)塊鏈(鏈)構(gòu)成,并將不可變的邪驮、有序的記錄存放在區(qū)塊中莫辨;同時包含一個狀態(tài)數(shù)據(jù)庫來記錄當(dāng)前的Fabric狀態(tài)。每個 通道
中各有 一個賬本
毅访。各個節(jié)點對于它所屬的每個通道沮榜,都會保存一份該通道的 賬本副本
。
如下圖所示喻粹,Hyperledger Fabric 中的賬本由“世界狀態(tài)“和”區(qū)塊鏈“這兩部分組成:
世界狀態(tài):世界狀態(tài)是以數(shù)據(jù)庫的形式實現(xiàn)蟆融,默認(rèn)使用的是LevelDB,這是一個KeyValue數(shù)據(jù)庫守呜;里面記錄的是業(yè)務(wù)對象的最新值型酥;智能合約主要與賬本中的世界狀態(tài)進(jìn)行交互。
區(qū)塊鏈:以文件形式實現(xiàn)的查乒,記錄交易日志明細(xì)弥喉,相當(dāng)于是一個交易的臺賬表。
例如有一個銀行賬戶侣颂,發(fā)生一次存款和三次取款操作档桃,則最終區(qū)塊鏈里面會記錄四條記錄的日志,而世界狀態(tài)則只記錄一條記錄憔晒,就是當(dāng)前賬戶最新的余額藻肄。
?
六、智能合約
智能合約
是一個運(yùn)行在賬本上的應(yīng)用程序拒担,它可以對資產(chǎn)進(jìn)行編碼嘹屯,其中的交易指令(或者叫業(yè)務(wù)邏輯)也可以用來修改資產(chǎn)。
在 Fabric2.0
以后引入了新的生命周期來管理合約:
- 首先第一步開發(fā)合約:需要依賴原生的合約 sdk从撼,支持包括 Java州弟、js 和 Golang 三種開發(fā)語言钧栖。
- 開完合約后,管理員可以使用 package 子命令來打包合約婆翔,并生成打包文件拯杠。打包命令默認(rèn)程序是 golang 語言,可以使用 -l 參數(shù)來指定其他語言啃奴。
- 一次打包可以多次安裝潭陪,然后接著使用 install 命令在指定的 peer 節(jié)點上安裝合約。
- 安裝成功后最蕾,接著使用 approveformyorg 命令代表所在機(jī)構(gòu)審批合約依溯,并且指定背書策略。
- 最后使用 commit 命令向指定的通道提交合約定義瘟则,執(zhí)行完這一步智能合約就部署成功黎炉,正式生效了。
- 接下來我們就可以編寫應(yīng)用程序來與區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行交易了醋拧,F(xiàn)abric 封裝了一套網(wǎng)關(guān) SDK 給應(yīng)用程序使用慷嗜,通過一系列的簡單 API 就實現(xiàn)和區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行交互。
關(guān)于 Java 智能合約的開發(fā)可以看我之前的文章《Hyperledger Fabric 2.x 自定義智能合約》
?
七丹壕、交易流程
- 首先區(qū)塊鏈應(yīng)用發(fā)起一筆交易洪添;
- 然后
背書節(jié)點
對交易進(jìn)行簽名驗證,返回驗證結(jié)果雀费; - 客戶端將背書結(jié)果封裝發(fā)給 Peer 節(jié)點干奢,然后再提交給 Order 節(jié)點進(jìn)行數(shù)據(jù)同步;
- Order 節(jié)點按順序把交易信息同步給其他的 Peer 節(jié)點進(jìn)行驗證和提交盏袄;
- 最后賬本更新忿峻,完成整個交易。