Fabric 架構和概念
2018-8-5 08:05
來源:
Uni-times
本文基于fabric 1.0.4版本,如果相關概念有所改動,請以官方文檔為準。
fabric構建的區塊鏈網絡是一個分布式系統,包含了一些邏輯節點,這些邏輯節點各司其職,完整的執行著交易的發起,驗證,賬本狀態更新,一致性等功能。
chaincode是一個按照一定規范實現的應用程序,運行于容器中,chaincode可以被安裝到peer上,應用程序(客戶端)通過發起交易請求,endsorer peer執行chaincode并進行簽名,經過orderer的驗證后,下發到對應的channel中,對賬本進行更新。
fabric中的交易分為兩種,一是發布chaincode到peer的deploy transaction,二是chaincode的執行,稱為invoke transaction;其實還可能存在query transaction(v1版本加入)和cross-chaincode transaction(v1之后的版本會加入),不過不在本文討論范圍內。
Membership Service Provider
由于fabric提供了權限控制,因此,對于peer和client來說,對于交易的結果和交易本身,都需要進行授權,這個組件是一個抽象的接口,它定義了提供權限控制的一系列標準,對于不同的網絡,可以通過注入不同的實現來實現自己的認證授權機制。
member是fabric中最粗的邏輯單位,一個member可以類比于一個參與該交易網絡的組織,例如在電商網絡中,京東,淘寶都是一個member,這個member包含自己的root CA ,自己的集群用于維護賬本。
整個區塊鏈的狀態可以看作是一個 versioned KVS(帶有版本的 key-value store,類似于git倉庫),這些kv通過chaincode(智能合約)進行更新,它只提供了put和get方法,所有的狀態變更都有日志記錄。
如上所述,區塊鏈的賬本,其實就是其 KVS模型的當前狀態。并且賬本會記錄所有的成功或失敗的交易請求。賬本的修改都來自于orderer下發的事件,其中包含了打包好的block,這些block中,既包含成功的交易,也包含失敗的交易,經過排序后形成一個順序存儲的結構保存在block中,而賬本(區塊鏈)就是這樣一個一個block首尾相連所形成的數據集合。
前文提到了,所有的node上,都會存在一個當前賬本(或子集)的副本,是否是子集,取決于該節點所在的組織(organization)是否能看到所有的交易信息。而最全的賬本,是在orderer node上,稱之為orderer ledger,而存在于peer node上的賬本,則稱之為peerledger,peer還在本地維護了一個bitmap,用于標記ledger中哪些交易是invalid的,而ordererledger則主要作為(peerledger的)容錯和高可用而存在。
fabric 1.0中,定義了三種node,分別是:
client
peer
orderer
client模擬的是交易網絡中的普通用戶,普通用戶連接到某個peer上,調用注冊在該peer上的某個chaincode,從而完成對賬本的更新
peer node通過channel和orderer node建立了一種 發布/訂閱的關系,orderer service會把其關心的息發通過channel發送給peer node,peer接收到這些交易后,就會更新本地賬本(peerledger)的狀態,peer可以說是fabric網絡中最基本的節點,所有的賬本和智能合約都存儲在其中,同時,anchor peer負責某個org在某個網絡中的代表,而lead peer則是本org的所有peer的首腦,order通過peer將數據的更新擴散到org。
由于fabric是一個分布式系統,因此每個node上都存儲著一個賬本,而當各個節點要對賬本狀態的修改時,必須有一個機制保證所有的這些CUDR操作的一致性,這就是orderer service,orderer service由一些orderer node組成,將所有提交的交易進行排序,驗證,然后分發給對這個交易感興趣(訂閱了某個channel)的member(organization),使副本和原始賬本保持一致。
broadcast(blob): 客戶端使用這個API來發起一次提交請求,該消息blob會被endsor,然后將其結果發送給orderer deliver(seqno, prevhash, blob):當orderer service驗證了某個交易是有效性的(valid)后,會使用該API分發消息到對應的channel,所有訂閱了這個channel的peer都會收到這個deliver消息,消息包含一個正整數序列號(seqno),前一個blob的hash值和blob消息體的。
一言以蔽之,orderer有如下幾個特性:
一致性:經過orderer deliver的交易,seqno一定時,blob和prevhash都一樣;
hash鏈的完整性:對于deliver(seqno, hash0, blob0)和deliver(seqno-1, hash1, blob1),HASH(seqno-1, hash1, blob1) == hash0;
不會憑空創造交易:每一次deliver,都是由于一次boardcast產生的;
不會缺失交易:如果一個deliver(seqno, hash, blob)已經發生,那么一定有deliver(seqno-1, hash0, blob0) ... deliver(0, default-hash, blob);
不會重復交易:如果產生了兩次 boardcast(blob),boardcast(blob1),則deliver(seqno1, hash, blob1)和deliver(seqno, hash0, blob)中,seqno1==seqno,hash==hash0,blob==blob1。
channel可以理解為一個獨立的交易網絡,每一個channel都維護著自己的賬本,也可以理解為,一個賬本對應了一個channel,這個channel中的賬本的狀態由所有訂閱了該channel的member(organization)維護。
更多概念可以參考 glossary

版權申明:本內容來自于互聯網,屬第三方匯集推薦平臺。本文的版權歸原作者所有,文章言論不代表鏈門戶的觀點,鏈門戶不承擔任何法律責任。如有侵權請聯系QQ:3341927519進行反饋。