标签:架构 强扩展性 模块设计
整体架构上,FISCO BCOS划分成基础层、核心层、管理层和接口层:
· 基础层:提供区块链的基础数据结构和算法库
· 核心层: 实现了区块链的核心逻辑,核心层分为两大部分:
· 管理层: 实现区块链的管理功能,包括参数配置、账本管理和AMOP
· 接口层: 面向区块链用户,提供多种协议的RPC接口、SDK和交互式控制台
FISCO BCOS基于多群组架构实现了强扩展性的群组多账本,基于清晰的模块设计,构建了稳定、健壮的区块系统。
本章重点介绍FISCO BCOS的群组架构和系统运行时的交易流(包括交易提交、打包、执行和上链)。
整体架构上,FISCO BCOS划分成基础层、核心层、管理层和接口层:
· 基础层:提供区块链的基础数据结构和算法库
· 核心层: 实现了区块链的核心逻辑,核心层分为两大部分:
· 管理层: 实现区块链的管理功能,包括参数配置、账本管理和AMOP
· 接口层: 面向区块链用户,提供多种协议的RPC接口、SDK和交互式控制台
FISCO BCOS基于多群组架构实现了强扩展性的群组多账本,基于清晰的模块设计,构建了稳定、健壮的区块系统。
本章重点介绍FISCO BCOS的群组架构和系统运行时的交易流(包括交易提交、打包、执行和上链)。
标签:群组架构 架构
考虑到真实的业务场景需求,FISCO BCOS引入多群组架构,支持区块链节点启动多个群组,群组间交易处理、数据存储、区块共识相互隔离,保障区块链系统隐私性的同时,降低了系统的运维复杂度。不同群组间的交易可并行执行,提升了性能。
注解
举个例子:
机构A、B、C所有节点构成一个区块链网络,运行业务1;一段时间后,机构A、B启动业务2,且不希望该业务相关数据、交易处理被机构C感知,有何解?
· 1.3系列FISCO BCOS系统 :机构A和机构B重新搭一条链运行业务2;运维管理员需要运维两条链,维护两套端口
· FISCO BCOS 2.0+ :机构A和机构B新建一个群组运行业务2;运维管理员仅需维护一条链
显然在达到相同隐私保护需求基础上,FISCO BCOS 2.0+具有更好的扩展性、可运维性和灵活性。
多群组架构中,群组间共享网络,通过网络准入和账本白名单实现各账本间网络消息隔离。
群组间数据隔离,每个群组独立运行各自的共识算法,不同群组可使用不同的共识算法。每个账本模块自底向上主要包括核心层、接口层和调度层三层,这三层相互协作,FISCO BCOS可保证单个群组独立健壮地运行。
核心层负责将群组的区块数据、区块信息、系统表以及区块执行结果写入底层数据库。
存储分为世界状态(State)和分布式存储(AMDB)两部分,世界状态包括MPTState和StorageState,负责存储交易执行的状态信息,StorageState性能高于MPTState,但不存储区块历史信息;AMDB则向外暴露简单的查询(select)、提交(commit)和更新(update)接口,负责操作合约表、系统表和用户表,具有可插拔特性,后端可支持多种数据库类型,目前支持RocksDB数据库和MySQLstorage。
接口层包括交易池(TxPool)、区块链(BlockChain)和区块执行器(BlockVerifier)三个模块。
· 交易池(TxPool): 与网络层以及调度层交互,负责缓存客户端或者其他节点广播的交易,调度层(主要是同步和共识模块)从交易池中取出交易进行广播或者区块打包;
· 区块链(BlockChain): 与核心层和调度层交互,是调度层访问底层存储的唯一入口,调度层(同步、共识模块)可通过区块链接口查询块高、获取指定区块、提交区块;
· 区块执行器(BlockVerifier): 与调度层交互,负责执行从调度层传入的区块,并将区块执行结果返回给调度层。
调度层包括共识模块(Consensus)和同步模块(Sync)。
· 共识模块:包括Sealer线程和Engine线程,分别负责打包交易、执行共识流程。Sealer线程从交易池(TxPool)取交易,并打包成新区块;Engine线程执行共识流程,共识过程会执行区块,共识成功后,将区块以及区块执行结果提交到区块链(BlockChain),区块链统一将这些信息写入底层存储,并触发交易池删除上链区块中包含的所有交易、将交易执行结果以回调的形式通知客户端,目前FISCO BCOS主要支持PBFT和Raft共识算法;
· 同步模块:负责广播交易和获取最新区块, 考虑到共识过程中,leader负责打包区块,而leader随时有可能切换,因此必须保证客户端的交易尽可能发送到每个区块链节点,节点收到新交易后,同步模块将这些新交易广播给所有其他节点;考虑到区块链网络中机器性能不一致或者新节点加入都会导致部分节点区块高度落后于其他节点,同步模块提供了区块同步功能,该模块向其他节点发送自己节点的最新块高,其他节点发现块高落后于其他节点后,会主动下载最新区块。
标签:交易流 架构
用户通过SDK或curl命令向节点发起RPC请求以发起交易,节点收到交易后将交易附加到交易池中,打包器不断从交易池中取出交易并通过一定条件触发将取出交易打包为区块。生成区块后,由共识引擎进行验证及共识,验证区块无误且节点间达成共识后,将区块上链。当节点通过同步模块从其他节点处下载缺失的区块时,会同样对区块进行执行及验证。
整体架构如下图所示:
Node:区块节点
TxPool:交易池,节点自身维护的、用于暂存收到的交易的内存区域
Sealer:打包器
Consensus Engine:共识引擎
BlockVerifier:区块验证器,用于验证一个区块的正确性
Executor:执行引擎,执行单个交易
BlockChain:区块链管理模块,是唯一有写权限的模块,提交区块接口需要同时传入区块数据和执行上下文数据,区块链管理将两种数据整合成一个事务提交到底层存储
Storage:底层存储
主要关系如下:
3.1 合约执行流程
执行引擎基于执行上下文(Executive Context)执行单个交易,其中执行上下文由区块验证器创建用于缓存暂存区块执行过程中执行引擎产生的所有数据,执行引擎同时支持EVM合约与预编译合约,其中EVM合约可以通过交易创建合约、合约创建合约两种方式来创建,其执行流程如下:
EVM合约创建后,保存到执行上下文的_sys_contracts_表中,EVM合约的地址在区块链全局状态内自增,从0x1000001开始(可定制),EVM合约执行过程中,Storage变量保存到执行上下文的c_(合约地址)表中。
预编译合约分永久和临时两种:(1) 永久预编译合约,整合在底层或插件中,合约地址固定;(2) 临时预编译合约,EVM合约或预编译合约执行时动态创建,合约地址在执行上下文内自增,从0x1000开始,至0x1000000截止,临时预编译合约仅在执行上下文内有效预编译合约没有Storage变量,只能操作表,其执行流程如下: