FISCO BCOS 2.0原理解析: 群组架构的设计

2023-11-06

为了方便企业、开发者更深入理解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/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

了解更多干货内容,请关注FISCO BCOS开源社区公众号,访问FISCO BCOS代码仓库可下载项目所有源代码:https://github.com/FISCO-BCOS/FISCO-BCOS,欢迎点击页面右上角star收藏,获取最新版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FISCO BCOS 2.0原理解析: 群组架构的设计 的相关文章

  • Tkinter 组件详解(一):Label

    Tkinter 组件详解之Label Label 标签 组件用于在屏幕上显示文本或图像 Label 组件仅能显示单一字体的文本 但文本可以跨越多行 另外 还可以为其中的个别字符加上下划线 例如用于表示键盘快捷键 何时使用 Label 组件

随机推荐

  • Linux驱动之input输入子系统

    目录 前言 介绍 input dev结构体 输入子系统的使用流程 实例测试 前言 输入子系统用于实现Linux系统输入设备 鼠标 键盘 触摸屏 游戏杆 驱动的一种框架 Linux内核将其中的固定部分放入内核 驱动开发时只需要实现其中的不固定
  • Web自动化测试从基础到项目实战之一启动不同的浏览器及配置

    在web自动化中目前selenium作为底层的自动化测试是目前运用最广的 但是各个公司都会在这个基础之上进行修改 首先当我们测试环境有了之后我们需要做得就是去配置我们的driver 这里的driver你可以理解为就是我们脚本和浏览器之间的桥
  • inuxCentos7.5安装jdk1.8(勿继续踩坑)

    LinuxCentos7 5安装jdk1 8 场景 错误出现 下面到了安装步骤 场景 首先我是一名后端 其实这种工作并不应该由我来干 先甩一下锅哈哈 由于我们公司没有真正的运维 所以什么事都需要我们后端来亲力亲为 一次偶然的机遇就把我派到了
  • Vue 代码检测(ESLint)

    每个人编码的习惯不一样 或美观或不美观 或者在编码的过程中会有些疏漏未曾发现 为提高代码美观度 提高代码审阅效率 使得多人协作时代码风格统一 规定一套编码规则并在编写的过程中遵守该规则变得很有必要 在一些比较正式的大公司 公司也会有一套自己
  • SSR是什么?Vue中怎么实现?

    一 是什么 Server Side Rendering 称其为SSR 意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术 发送到浏览器 然后为其绑定状态与事件 成为完全可交互页面的过程 先来看看Web3个阶段的发展史 传
  • SpringBoot--将微服务注册到Eureka Server上

    这节课我们一起来学习一下如何将微服务注册到Eureka Server上 关于如何操作Eureka 我们可以参考spring cloud的官方文档 我们先访问spring cloud的官网主页 如下图所示 目前官网Spring Cloud的最
  • pycharm专业版安装方法

    1 去官网下载安装包 有专业版 有社区版 专业版需要破解 社区版不要破解 2 打开pycharm应用程序安装64 bit 需要等待几秒 3 记住安装包解压位置 打开jetbrains 找到bin文件夹 D Program Files Jet
  • Java数据结构之优先级队列(堆)

    文章目录 一 优先级队列 一 概念 二 优先级队列的模拟实现 一 堆的概念 二 堆的存储结构 三 堆的创建 1 堆的创建和向下调整 2 堆的创建和向上调整 四 堆的插入和删除 1 堆的插入 堆的创建和向上调整 续 2 堆的删除 五 用堆模拟
  • Cadence 背景颜色设置

    目录 概述 一 Allegro PCB Designer 二 OrCAD Capture 三 总结 概述 有位粉丝问我 关于背景颜色设置问题 这里我写一篇文章吧 尽自己微薄之力帮助更多的人 加油 一 Allegro PCB Designer
  • 2.22笔记:linux命令不同颜色命令

    浅蓝色 表示软链接 灰色 表示其他文件 绿色 表示可执行文件 红色 表示压缩文件 蓝色 表示目录 红色闪烁 表示链接的文件有问题了 黄色 表示设备文件 包括block char fifo 管道文件 粉色 网络文件
  • bochs+gdb联调linux-0.11内核

    终于把bochs和gdb连起来了 下面描述下步骤以作记录 1 安装bochs 前面有篇文章介绍了bochs源码编译安装过程 这里安装也非常相似 只是命令稍微有些不同 configure enable gdb stub make make i
  • Java语言连接数据库时间读取错误的问题

    连接时候的数据库相关配置
  • pcie inbound和outbound关系

    Inbound PCI域訪问存储器域 Outbound 存储器域訪问PCI域 RC訪问EP RC存储器域 gt outbound gt RC PCI域 gt EP PCI域 gt inbound gt EP存储器域 EP訪问RC EP存储器
  • Jenkins插件下载失败两种处理办法

    持续集成 自动化部署 弹性伸缩教程 http edu csdn net course detail 6452 大家在使用jenkins安装插件的时候经常遇到一下问题 就是插件由于网络或者墙的原因无法直接下载 出现下面截图的问题 处理办法有两
  • flume采集log4j日志到kafka

    简单测试项目 1 新建Java项目结构如下 测试类FlumeTest代码如下 package com demo flume import org apache log4j Logger public class FlumeTest priv
  • 芯片电源引脚为什么要加一个100nF电容

    在设计电路的时候 常常会在芯片的每个电源引脚就近的放一个100nF的贴片电容 这电容有什么作用呢 今天就来和大家分享一下这个电容的作用以及为什么是100nF 首先这个芯片电源引脚的100nF的电容一般我们称为旁路电容 也有叫去耦电容的 因为
  • Oracle 行转列 动态出转换的列

    10月的第二天 前天写了个Oracle中行转列的pivot的基本使用方法 然后 因为pivot的用法中 正常情况下 我们需要转出多少个列 都得在我们的sql中完完整整地写出 而不能直接在里面写个查询来动态转换 然后 趁着祖国母亲的生日 这几
  • 漫谈设计模式之建造者模式(Builder)

    建造者模式 Builder 又叫生成器模式 属于对象创建型模式 建造者模式的目的是要将一个复杂对象的构建与它的表示分离 使得同样的构建过程可以创建不同的表示 产品 说得通俗点就是一个产品 表示 的构建 生产 过程是一样的 但是同样的生产过程
  • hdu 1465不容易系列之一

    http acm hdu edu cn showproblem php pid 1465 这是一道排错问题 用排错公式 排错公式推导 当n个编号元素放在n个编号位置 元素编号与位置编号各不对应的方法数用D n 表示 那么D n 1 就表示n
  • FISCO BCOS 2.0原理解析: 群组架构的设计

    为了方便企业 开发者更深入理解FISCO BCOS 2 0诸多新特性 更快速地运用FISCO BCOS搭建联盟链应用 我们启动了FISCO BCOS 2 0系列剖析的计划 在后续的推送中 我们将陆续推出 FISCO BCOS 2 0原理解析