學(xué)習(xí)IBM關(guān)于Hyperledger Fabric的開源技術(shù)微講堂視頻總結(jié),視頻鏈接:https://developer.ibm.com/cn/os-academy-hyperledger-fabric/
Hyperledger (超級(jí)賬本)是 Linux 基金會(huì)旗下的區(qū)塊鏈開發(fā)平臺(tái)項(xiàng)目,致力于發(fā)展跨行業(yè)的商用區(qū)塊鏈平臺(tái)技術(shù) 。Hyperledger旗下由面向不同場(chǎng)景的子項(xiàng)目構(gòu)成:包括Fabric、Sawtooth、Iroha、BlockChain Explorer、Cello、indy、Composer、Burrow等8大頂級(jí)項(xiàng)目。其中的Hyperledger Fabric 子項(xiàng)目是是一個(gè)帶有準(zhǔn)入機(jī)制的企業(yè)級(jí)聯(lián)盟鏈項(xiàng)目,它的前身是IBM貢獻(xiàn)的OpenBlockchain。該項(xiàng)目的目標(biāo)是實(shí)現(xiàn)一個(gè)通用的許可區(qū)塊鏈(Permissioned Chain)的底層基礎(chǔ)框架,并克服了比特幣等公有鏈項(xiàng)目的缺陷,如吞吐量低、交易公開無隱私等問題,使得用戶能夠方便地開發(fā)商業(yè)應(yīng)用。
1、fabric網(wǎng)絡(luò)架構(gòu)

在fabric中,主要有以下幾種節(jié)點(diǎn):
1)客戶端或者應(yīng)用程序(Client Application)
由最終用戶操作的,它必須連接到某一個(gè)節(jié)點(diǎn)或者排序服務(wù)節(jié)點(diǎn)上與區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行通信 。
2)Peer 節(jié)點(diǎn)
在區(qū)塊鏈網(wǎng)絡(luò)中,所有的節(jié)點(diǎn)都是記賬節(jié)點(diǎn)(Committer),負(fù)責(zé)把一筆交易寫入賬本,它會(huì)在本地存儲(chǔ)這個(gè)數(shù)據(jù)庫賬本(Ledger)。 在這些記賬節(jié)點(diǎn)中,部分節(jié)點(diǎn)會(huì)執(zhí)行客戶端提交的交易提案并對(duì)執(zhí)行結(jié)果進(jìn)行簽名背書,充當(dāng)背書節(jié)點(diǎn)(Endorser)的角色。背書節(jié)點(diǎn)是動(dòng)態(tài)的角色,是與具體鏈碼(Chaincode)綁定的 。
3)排序服務(wù)節(jié)點(diǎn)(Ordering-Service)
排序服務(wù)節(jié)點(diǎn)接收包含背書簽名的交易,對(duì)未打包的交易進(jìn)行排序生成區(qū)塊,然后把這些區(qū)塊廣播給各個(gè)組織的主節(jié)點(diǎn)。
2、fabric的交易流程**

假設(shè)現(xiàn)在A要給B轉(zhuǎn)賬10塊錢:
1)Propose:這一步是client把一個(gè)交易,也就是一個(gè)proposal發(fā)送到endorsing peer,需要強(qiáng)調(diào)在fabric中,每一筆交易都是通過鏈碼也就是智能合約發(fā)起的,
2)Execute:endorsing peer 接收到交易的提案后,會(huì)把這個(gè)proposal放到智能合約里邊執(zhí)行,執(zhí)行的時(shí)候會(huì)看你這筆錢是否能轉(zhuǎn),余額是否夠等一些合約的業(yè)務(wù)邏輯判斷,執(zhí)行出來的結(jié)果是個(gè)讀寫集,什么是讀寫集呢,還是剛剛說的假設(shè)A給B轉(zhuǎn)賬10塊錢,那么在發(fā)送方,讀集就是發(fā)送方原本的賬戶余額,即<key=balance,value=100,version=0>,寫集就是把100改成90是<key=balance,value=90,version=1>,也就是在寫之后會(huì)把version加1;在接收方,讀集就是<key=balance,value=100,version=0>,寫集是<key=balance,value=110,version=1>。這個(gè)階段只是個(gè)仿真,并不會(huì)修改賬本。發(fā)給哪個(gè)背書節(jié)點(diǎn)是根據(jù)背書策略來的。
3)Response:之后背書節(jié)點(diǎn)就會(huì)對(duì)讀寫集進(jìn)行背書,也就是加密簽名,背書之后就會(huì)把背書后的結(jié)果返回給client端。Client端收集到這些簽名的結(jié)果后會(huì)把這些結(jié)果發(fā)送到orderer節(jié)點(diǎn),
4)Order Transaction:orderer節(jié)點(diǎn)會(huì)把來自各個(gè)client端的交易進(jìn)行全排序,然后把這些交易打包成塊,這里它只負(fù)責(zé)排序,并不會(huì)打開這些交易查看驗(yàn)證交易的內(nèi)容,
5)Deliver:排序節(jié)點(diǎn)把塊打包好后就會(huì)分發(fā)給記賬節(jié)點(diǎn),
6)Validate:記賬節(jié)點(diǎn)收到這些塊后就會(huì)把這些塊打開,再把里邊的交易打開,驗(yàn)證這些交易,驗(yàn)證的就是剛剛背書節(jié)點(diǎn)的背書,以及拿到的這些讀寫集是否依據(jù)一定的策略收集到了足夠的背書,然后會(huì)去驗(yàn)證讀寫集的版本號(hào),剛剛說讀集的version是0,寫集的version是1 ,記賬peer會(huì)去驗(yàn)證我現(xiàn)在看到的version狀態(tài)是否是0,是0,那說明這個(gè)version沒有更新過,那就這筆交易可以寫入賬本,也就是這筆交易驗(yàn)證通過了。
7)Notify:然后這些peer會(huì)通知client端,你的這筆交易是否成功
3、Fabric賬本

Fabric賬本由區(qū)塊鏈和狀態(tài)數(shù)據(jù)庫兩部分組成:
Blockchain –?是一組不可更改的有序的區(qū)塊,記錄著全部交易的日志。
在區(qū)塊鏈中,一般初始區(qū)塊存的是一些配置信息,之后就是歷史交易信息了。在區(qū)塊鏈中,一個(gè)區(qū)塊分成三部分,區(qū)塊頭,區(qū)塊內(nèi)容,和區(qū)塊的metadata;Metadata主要存的就是這個(gè)區(qū)塊的寫入時(shí)間、寫入的人以及簽名;區(qū)塊頭存到就是當(dāng)前區(qū)塊的區(qū)塊ID,所有交易的hash值,上一個(gè)區(qū)塊的區(qū)塊hash值等
World state –?記錄了賬本中所有鍵值對(duì)的當(dāng)前值,相當(dāng)于對(duì)blockchain做了索引。
因?yàn)楸硶?jié)點(diǎn)執(zhí)行交易的時(shí)候需要讀取賬本的當(dāng)前狀態(tài),如果去遍歷整個(gè)區(qū)塊鏈中相關(guān)的交易的話,效率非常低,因此,fabric維護(hù)了一個(gè)這樣的狀態(tài)數(shù)據(jù)庫,通過這個(gè)狀態(tài)數(shù)據(jù)庫可以快速定位和訪問某個(gè)鍵值的方法從狀態(tài)數(shù)據(jù)庫可以迅速獲取鍵值的最新狀態(tài)數(shù)據(jù)值。
World state存儲(chǔ)的格式是上面我們提到的這種讀寫集,也就是<key value version>格式,如果修改了的話version就會(huì)加1。另外,因?yàn)闋顟B(tài)數(shù)據(jù)庫就是對(duì)blockchain的一個(gè)索引,所以當(dāng)狀態(tài)數(shù)據(jù)庫出現(xiàn)故障的時(shí)候,可以通過遍歷blockchain重新生成。
4、多鏈多通道的fabric網(wǎng)絡(luò)

因?yàn)閒abric是一個(gè)面向企業(yè)級(jí)的區(qū)塊鏈平臺(tái),所以為了保護(hù)數(shù)據(jù)隱私,fabric使用channel對(duì)數(shù)據(jù)進(jìn)行隔離。在fabric啟動(dòng)時(shí)就有一個(gè)內(nèi)置的channel,是系統(tǒng)channel,對(duì)用戶和開發(fā)人員是不可見的。創(chuàng)建應(yīng)用channel是對(duì)系統(tǒng)channel發(fā)起交易,這個(gè)交易里包含了你要?jiǎng)?chuàng)建的channel的一些屬性,當(dāng)這個(gè)交易共識(shí)之后,就會(huì)創(chuàng)建一個(gè)新的channel。
在fabric中,部署智能合約,是在每個(gè)channel里部署智能合約,也就是上面講到的交易流程是針對(duì)一個(gè)channel來說的。一個(gè)channel可以部署多個(gè)智能合約,在同一個(gè)channel里的智能合約可以互相調(diào)用,不同的也可以互相調(diào)用,但是跨channel暫時(shí)只是可以讀數(shù)據(jù)但是不可以寫數(shù)據(jù)。
在上圖中有4個(gè)organization,每個(gè)organization都要安裝自己的CA,organization 4提供的是排序服務(wù),然后organization 1提供的節(jié)點(diǎn)是P1,organization2提供的節(jié)點(diǎn)是P2,organization3提供的節(jié)點(diǎn)是p3,P1和P2節(jié)點(diǎn)在一個(gè)channel里,在這個(gè)channel里安裝的chaincode是cc1,安裝的智能合約時(shí)S5,他倆維護(hù)著同一套賬本L1;p2和p3在一個(gè)channel里,在這個(gè)channel里安裝的chaincode是cc2,這兩個(gè)組織維護(hù)著同一套賬本L1??梢钥吹絇2節(jié)點(diǎn)安裝在兩個(gè)通道里,維護(hù)著兩套賬本;組織A1 A2可以訪問channel c1的數(shù)據(jù),A2和A3可以訪問channel C2的數(shù)據(jù)。
三、自己的認(rèn)識(shí)和體會(huì)
1、這個(gè)fabric是面向企業(yè)級(jí)應(yīng)用的區(qū)塊鏈平臺(tái),是個(gè)多鏈多通道的架構(gòu),我覺得這個(gè)架構(gòu)特別好,因?yàn)樗颜麄€(gè)區(qū)塊鏈大網(wǎng)絡(luò)利用通道劃分成了不同的子網(wǎng),每個(gè)子網(wǎng)只需要維護(hù)子網(wǎng)成員的交易日志就可以;
2、fabric每個(gè)通道內(nèi)的賬本雖然對(duì)通道外的組織是不可見的,但是對(duì)通道內(nèi)的成員是公開的,所以在Fabric通道內(nèi)部的數(shù)據(jù)不具有隱私性。