为了方便企业、开发者更深入理解 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 进行全面拆解。
本文是原理解析系列第一篇,介绍 FISCO BCOS 2.0 众多新特性中的主线——群组架构。主要包括群组架构的整体架构设计,群组架构包括哪些组件,各组件的主要功能以及组件间的交互。
设计目标
理解群组架构的设计目标,可以从人人都熟悉的群聊模式说起。
** 灵活扩展:
保证业务接入和扩展像拉群聊天一样方便 **
群的建立非常灵活,几个人就可以快速拉个主题群进行交流。同一个人可以参与到自己感兴趣的多个群里,并行地收发信息。现有的群也可以继续增加成员。
看回群组架构,采用群组架构的网络中,根据业务场景的不同,可存在多个不同的账本,区块链节点可以根据业务关系选择群组加入,参与到对应账本的数据共享和共识过程中。群组架构具有良好的扩展性,一个机构一旦参与到这样的联盟链里,有机会灵活快速地丰富业务场景和扩大业务规模,而系统的运维复杂度和管理成本也线性下降。
** 隐私保护:
各群组之间解除耦合独立运作 **
回想一下群聊场景:群聊用户都在你的通信录中,都是经过验证才添加的,且不在群里的用户看不到群聊信息。这与联盟链准入机制不谋而合,所有参与者的机构身份可知。
另一方面,群组架构中各群组独立执行共识流程,各组独立维护自己的交易事务和数据,不受其他群组影响。这样的好处是,可以使得各群组之间解除耦合独立运作,从而达成更好的隐私隔离。在跨群组之间的消息互通,则会带上验证信息,是可信和可追溯的。
架构设计
架构设计全景
如上图所示,群组架构自底向下主要划分为网络层、群组层,网络层主要负责区块链节点间通信,群组层主要负责处理群组内交易,每个群组均运行着一个独立的账本。
网络层
群组架构中,所有群组共享 P2P 网络,群组层传递给网络层的数据包中含有群组 ID 信息,接收节点根据数据包中的群组 ID,将收到的数据包传递给目标节点的相应群组。
为了做到群组间通信数据隔离,群组架构引入了账本白名单机制,下图展示了群组架构下群组间收发消息的流程:
账本白名单
每个群组均持有一个账本白名单,用于维护该群组的节点列表。为了保证账本白名单群组内一致性,仅可通过发交易共识的方式修改账本白名单。
发包流程
以 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 共识算法。
共识模块主要流程包括:
(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。
区块同步
考虑到区块链网络中机器性能不一致或者新节点加入都会导致部分节点区块高度落后于其他节点,同步模块提供了区块同步功能,该模块向其他节点发送自己节点的最新块高,其他节点发现块高落后于其他节点后,会主动下载最新区块。
以三节点区块链系统为例,区块同步流程如下图:
(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 按照区块高度执行第 4、5、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…