FISCO BCOS 2.0原理解析: 羣組架構的設計

clipboard.png

爲了方便企業、開發者更深刻理解FISCO BCOS 2.0諸多新特性,更快速地運用FISCO BCOS搭建聯盟鏈應用,咱們啓動了FISCO BCOS 2.0系列剖析的計劃。在後續的推送中,咱們將陸續推出《FISCO BCOS 2.0原理解析》、《FISCO BCOS 2.0使用教程》、《FISCO BCOS 2.0源碼分析》等文章系列,抽絲剝繭地將FISCO BCOS 2.0進行全面拆解。node

本文是原理解析系列第一篇,介紹FISCO BCOS 2.0衆多新特性中的主線——羣組架構。主要包括羣組架構的總體架構設計,羣組架構包括哪些組件,各組件的主要功能以及組件間的交互。git

設計目標

理解羣組架構的設計目標,能夠從人人都熟悉的羣聊模式提及。github

**靈活擴展:
保證業務接入和擴展像拉羣聊天同樣方便**算法

羣的創建很是靈活,幾我的就能夠快速拉個主題羣進行交流。同一我的能夠參與到本身感興趣的多個羣裏,並行地收發信息。現有的羣也能夠繼續增長成員。數據庫

看回羣組架構,採用羣組架構的網絡中,根據業務場景的不一樣,可存在多個不一樣的帳本,區塊鏈節點能夠根據業務關係選擇羣組加入,參與到對應帳本的數據共享和共識過程當中。羣組架構具備良好的擴展性,一個機構一旦參與到這樣的聯盟鏈裏,有機會靈活快速地豐富業務場景和擴大業務規模,而系統的運維複雜度和管理成本也線性降低。緩存

**隱私保護:
各羣組之間解除耦合獨立運做**微信

回想一下羣聊場景:羣聊用戶都在你的通訊錄中,都是通過驗證才添加的,且不在羣裏的用戶看不到羣聊信息。這與聯盟鏈准入機制不謀而合,全部參與者的機構身份可知。網絡

另外一方面,羣組架構中各羣組獨立執行共識流程,各組獨立維護本身的交易事務和數據,不受其餘羣組影響。這樣的好處是,可使得各羣組之間解除耦合獨立運做,從而達成更好的隱私隔離。在跨羣組之間的消息互通,則會帶上驗證信息,是可信和可追溯的。架構

架構設計

架構設計全景負載均衡

clipboard.png

如上圖所示,羣組架構自底向下主要劃分爲網絡層、羣組層,網絡層主要負責區塊鏈節點間通訊,羣組層主要負責處理羣組內交易,每一個羣組均運行着一個獨立的帳本。

網絡層

羣組架構中,全部羣組共享P2P網絡,羣組層傳遞給網絡層的數據包中含有羣組ID信息,接收節點根據數據包中的羣組ID,將收到的數據包傳遞給目標節點的相應羣組。

爲了作到羣組間通訊數據隔離,羣組架構引入了帳本白名單機制,下圖展現了羣組架構下羣組間收發消息的流程:

clipboard.png

帳本白名單

每一個羣組均持有一個帳本白名單,用於維護該羣組的節點列表。爲了保證帳本白名單羣組內一致性,僅可經過發交易共識的方式修改帳本白名單。

發包流程

以node0的第一組向node1的第一組發送消息packetA爲例:

(1) group1將消息packetA傳遞到網絡層;

(2) 網絡層模塊對packetA進行編碼,在packetA包頭加上本羣組ID,記爲{groupID(1) + packetA};

(3) 網絡層訪問帳本白名單,判斷node0是不是group1的節點,若非group1節點,則拒絕數據包;如果group1節點,則將編碼後的包發送給目標節點node1。

收包流程

node1接收到node0 group1的數據包{groupID(1) + packetA}後:

(1) 網絡層訪問帳本白名單,判斷源節點node0是不是group1節點,若非group1節點,則拒絕數據包,不然將數據包傳遞給解碼模塊;

(2) 解碼模塊從數據包中解碼出group ID=1和數據包packetA,將數據包packetA發送到group1。

經過帳本白名單,能夠有效地防止羣組節點獲取其餘羣組通訊消息,保障了羣組網絡通訊的隱私性。

羣組層

羣組層是羣組架構的核心。爲了實現羣組間帳本數據的隔離,每一個羣組持有單獨的帳本模塊。

羣組層自下向上一次分爲核心層、接口層和調度層:核心層提供底層存儲和交易執行接口;接口層是訪問核心層的接口;調度層包括同步和共識模塊,負責處理交易、同步交易和區塊。

核心層

主要包括存儲(AMDB/storage/state)和執行(EVM)兩大模塊。存儲負責從底層數據庫中存儲或讀取羣組帳本的區塊數據、區塊執行結果、區塊信息以及系統表等。執行(EVM)模塊主要負責執行交易。

接口層

接口層包括交易池(TxPool)、區塊鏈(BlockChain)和區塊執行器(BlockVerifier)三個模塊。

模塊1:交易池(TxPool)

交易池是客戶端與調度層交互的接口,負責從客戶端或者其餘節點收到的新交易,共識模塊會從中取出交易打包處理,同步模塊從中取出新交易進行廣播。

模塊2:區塊鏈(BlockChain)

區塊鏈模塊是核心層與調度層交互的接口,是調度層訪問底層存儲和執行模塊的惟一入口,調度層可經過該模塊提交新區塊和區塊執行結果,查詢歷史區塊等信息。

區塊鏈模塊也是RPC模塊與核心層的接口,RPC模塊經過區塊鏈模塊可獲取區塊、塊高以及交易執行結果等信息。

模塊3:區塊執行器(BlockVerifier)

與調度層交互,負責執行從調度層傳入的區塊,並將區塊執行結果返回給調度層。

調度層

調度層包括共識模塊(Consensus)和同步模塊(Sync)。

模塊1:共識(Consensus)模塊

共識模塊主要負責執行客戶端提交的交易,並對交易執行結果達成共識。

以下圖,共識模塊包括打包(Sealer)線程和共識(Engine)線程,Sealer線程負責從交易池獲取未執行交易,並將交易打包成區塊;Engine線程負責對區塊執行結果進行共識,目前主要支持PBFT和Raft共識算法。

clipboard.png

共識模塊主要流程包括:

(1) 客戶端提交的交易緩存到TxPool後,會喚醒共識節點的Sealer線程,Sealer線程從交易池中獲取最新交易,並基於當前最高區塊,打包產生一個新區塊blockI;

(2) Sealer線程將打包產生的新區塊blockI傳遞到Engine線程,用於共識;

(3) Engine線程收到新區塊blockI後,啓動共識流程,共識過程當中,會調用區塊執行器BlockVerifier執行區塊blockI內的每筆交易,並對執行結果達成一致共識;

(4) 若共識成功,則調用BlockChain將新區塊blockI以及區塊執行結果等提交到底層數據庫;

(5) 新區塊blockI上鍊成功後,觸發交易池刪除以上鍊的全部交易,並將交易執行結果以回調的形式推送到客戶端。

模塊2:同步(Sync)模塊

考慮到共識過程當中,須要儘量保證每一個羣組節點擁有全量的交易,FISCO BCOS 2.0引入了同步模塊來保證客戶端的交易儘量發送到每一個共識節點。

同步模塊主要包括交易同步和區塊同步:

交易同步

客戶端經過RPC向指定羣組交易池提交新交易時,會喚醒相應羣組同步模塊的交易同步線程,該線程將全部新收到的交易廣播到其餘羣組節點,其餘羣組節點將最新交易插入到交易池,保證每一個羣組節點擁有全量的交易。

以下圖,客戶端將交易tx_j發送到group1, tx_i發送到group2後,交易同步線程會將tx_j廣播到全部羣組節點的group1,將tx_i廣播到全部羣組節點的group2。

clipboard.png

區塊同步

考慮到區塊鏈網絡中機器性能不一致或者新節點加入都會致使部分節點區塊高度落後於其餘節點,同步模塊提供了區塊同步功能,該模塊向其餘節點發送本身節點的最新塊高,其餘節點發現塊高落後於其餘節點後,會主動下載最新區塊。

以三節點區塊鏈系統爲例,區塊同步流程以下圖:

clipboard.png

(1) Node0, Node1和Node2的區塊同步線程按期廣播最新區塊高度信息;

(2) Node1收到Node0和Node2的最新區塊高度後,發現自身塊高3低於Node0和Node2最新快高6;

(3)本着負載均衡的原則, Node1向Node2請求第4個區塊,向Node0請求區塊5和區塊6;

(4) Node0和Node2接收到Node1的區塊請求後,分別將第{5,6}和第{4}個區塊返回給Node1;

(5) Node1按照區塊高度執行第四、五、6個區塊,並將最新區塊按次序提交到底層存儲。


咱們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一塊兒,會更了不得。多樣參與方式:

1 進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,微信ID:fiscobcosfan);

2 訂閱咱們的公衆號:「FISCO BCOS開源社區」,咱們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3 來Meetup與開發團隊面對面交流,FISCO
BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4 參與代碼貢獻,您能夠在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull
Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

代碼貢獻指引:

https://github.com/FISCO-BCOS...
相關文章
相關標籤/搜索