区块链研习社区块链大学

FISCO BCOS 介绍

2020-04-07  本文已影响0人  Kindey_S

平台介绍

FISCO BCOS是一个区块链底层平台,由金融区块链合作联盟(深圳)(以下简称:金链盟)开源工作组以金融业务实践为参考样本,在BCOS开源平台基础上进行模块升级与功能重塑。特点:深度定制的安全可控、适用于金融行业且完全开源。金链盟开源工作组的首批成员包括:微众银行、深证通、腾讯、华为、神州信息、四方精创、博彦科技、越秀金科、亦笔科技等9家单位。

FISCO BCOS 2.0

FISCO BCOS 2.0版本在原有基础上进行架构升级和优化,在可扩展性、性能、易用性等方面取得了重大突破,其中包括:

系统设计

整体架构

整体架构上,FISCO BCOS划分成基础层、核心层、管理层和接口层:

FISCO BCOS基于多群组架构实现了强扩展性的群组多账本,基于清晰的模块设计,构建了稳定、健壮的区块系统。
FISCO BCOS的群组架构和系统运行时的交易流(包括交易提交、打包、执行和上链)。

同步

同步基础流程

同步,是区块链节点非常重要的功能。它是共识的辅助,给共识提供必需的运行条件。同步分为交易的同步和状态的同步。交易的同步,确保了每笔交易能正确的到达每个节点上。状态的同步,能确保区块落后的节点能正确的回到最新的状态。只有持有最新区块状态的节点,才能参与到共识中去。

区块同步优化

为了增强区块链系统在网络带宽受限情况下的可扩展性,FISCO BCOS v2.2.0对区块同步进行了优化:

交易同步优化

区块链系统中,为了保障客户端发送的交易能到达所有节点,SDK直连的区块链节点需要将收到的交易广播给其他节点,如下图所示:

显然,SDK直连节点的出带宽与区块链节点总数成正比,随着区块链系统节点数的增加,该节点必然成为整个系统的瓶颈。

此外,为了保障节点网络断连的情况下,交易也能尽量到达所有节点,还引入了交易转发逻辑,节点收到其他节点广播过来的交易后,会随机选取25%的邻居节点转发收到的交易,在网络全连的情况下,这种交易转发策略无疑会带来巨大的带宽浪费,且节点数目越多,因交易转发带来的数据包冗余越多。

为降低SDK直连节点的出带宽、降低交易转发引起的大量冗余消息包,提升区块链系统的可扩展性,FISCO BCOS v2.2.0提出了交易广播优化策略和交易转发优化策略

共识算法

区块链系统通过共识算法保障系统一致性。 理论上,共识是对某个提案(proposal)达成一致意见的过程,分布式系统中提案的含义十分宽泛,包括事件发生顺序、谁是leader等。区块链系统中,共识是各个共识节点对交易执行结果达成一致的过程。

共识算法分类

根据是否容忍 拜占庭错误 ,共识算法可分为容错(Crash Fault Tolerance, CFT)类算法和拜占庭容错(Byzantine Fault Tolerance, BFT)类算法:

FISCO BCOS共识算法

FISCO BCOS基于多群组架构实现了插件化的共识算法,不同群组可运行不同的共识算法,组与组之间的共识过程互不影响,FISCO BCOS目前支持PBFT(Practical Byzantine Fault Tolerance)和Raft(Replication and Fault Tolerant)两种共识算法:

虚拟机与合约

交易的执行是区块链节点上的一个重要的功能。交易的执行,是把交易中的智能合约二进制代码取出来,用执行器(Executor)执行。共识模块(Consensus)把交易从交易池(TxPool)中取出,打包成区块,并调用执行器去执行区块中的交易。在交易的执行过程中,会对区块链的状态(State)进行修改,形成新区块的状态储存下来(Storage)。执行器在这个过程中,类似于一个黑盒,输入是智能合约代码,输出是状态的改变。

随着技术的发展,人们开始关注执行器的性能和易用性。一方面,人们希望智能合约在区块链上能有更快的执行速度,满足大规模交易的需求。另一方面,人们希望能用更熟悉更好用的语言进行开发。进而出现了一些替代传统的执行器(EVM)的方案,如:JIT、 WASM_甚至JVM。然而,传统的EVM是耦合在节点代码中的。首先要做的,是将执行器的接口抽象出来,兼容各种虚拟机的实现。因此,EVMC被设计出来。

EVMC (Ethereum Client-VM Connector API),是以太坊抽象出来的执行器的接口,旨在能够对接各种类型的执行器。FISCO BCOS目前采用了以太坊的智能合约语言Solidity,因此也沿用了以太坊对执行器接口的抽象。

在节点上,共识模块会调用EVMC,将打包好的交易交由执行器执行。执行器执行时,对状态进行的读写,会通过EVMC的回调反过来操作节点上的状态数据。

经过EVMC一层的抽象,FISCO BCOS能够对接今后出现的更高效、易用性更强的执行器。目前,FISCO BCOS采用的是传统的EVM根据EVMC抽象出来的执行器—Interpreter。因此能够支持基于Solidity语言的智能合约。目前其他类型的执行器发展尚未成熟,后续将持续跟进。

存储模块

FISCO BCOS继承以太坊存储的同时,引入了高扩展性、高吞吐量、高可用、高性能的分布式存储。存储模块主要包括两部分:

世界状态: 可进一步划分成 MPTStateStorageState

分布式存储(Advanced Mass Database,AMDB): 通过抽象表结构,实现了SQL和NOSQL的统一,通过实现对应的存储驱动,可以支持各类数据库,目前已经支持LevelDB和MySQL。

安全控制

为了保障节点间通信安全性,以及对节点数据访问的安全性,FISCO BCOS引入了节点准入机制、CA黑名单和权限控制三种机制,在网络和存储层面上做了严格的安全控制。

网络层面安全控制

存储层面安全控制

基于分布式存储,提出分布式存储权限控制的机制,以灵活、细粒度的方式进行有效的权限控制,设计并实现了权限控制机制限制外部账户(tx.origin)对存储的访问,权限控制范围包括合约部署、表的创建、表的写操作。

P2P网络

设计目标

FISCO BCOS P2P模块提供高效、通用和安全的网络通信基础功能,支持区块链消息的单播、组播和广播,支持区块链节点状态同步,支持多种协议。

P2P主要功能

区块链节点标识

区块链节点标识由ECC算法的公钥生成,每个区块链节点必须有唯一的ECC密钥对,区块链节点标识在区块链网络中唯一标识一个区块链节点

通常情况下,一个节点要加入区块链网络,至少要准备三个文件:

区块链节点除了有唯一区块链节点标识,还能关注Topic,供寻址使用

区块链节点寻址:

管理网络连接

区块链节点间,会自动发起和维持TCP长连接,在系统故障、网络异常时,主动发起重连

区块链节点间建立连接时,会使用CA证书进行认证

区块链节点间消息支持单播、组播和广播

单播流程 组播流程 广播流程

状态同步

每个节点会维护自身的状态,并将状态的Seq在全网定时广播,与其它节点同步

RPC

RPC(Remote Procedure Call,远程过程调用)是客户端与区块链系统交互的一套协议和接口。用户通过RPC接口可查询区块链相关信息(如块高、区块、节点连接等)和发送交易。

名词解释

JSON(JavaScript Object Notation):一种轻量级的数据交换格式。它可以表示数字、字符串、有序序列和键值对。
JSON-RPC:一种无状态、轻量级的远程过程调用协议。 该规范主要定义了几个数据结构及其处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。它使用JSON (RFC 4627)作为数据格式。FISCO BCOS采用JSON-RPC 2.0协议。

模块架构

RPC模块负责提供FISCO BCOS的外部接口,客户端通过RPC发送请求,RPC通过调用账本管理模块和p2p模块获取相关响应,并将响应返回给客户端。其中账本管理模块通过多账本机制管理区块链底层的相关模块,具体包括共识模块,同步模块,区块管理模块,交易池模块以及区块验证模块。

数据定义

客户端请求

客户端请求发送至区块链节点会触发RPC调用,客户端请求包括下列数据成员:

RPC请求包格式示例:

{"jsonrpc": "2.0", "method": "getBlockNumber", "params": [1], "id": 1}

服务端响应

当发起一个RPC调用时,除通知之外,区块链节点都必须回复响应。响应表示为一个JSON对象,使用以下成员:

RPC响应包格式示例:

{"jsonrpc": "2.0", "result": "0x1", "id": 1}

: 服务端响应必须包含result或error成员,但两个成员不能同时包含。

错误对象

当一个RPC调用遇到错误时,返回的响应对象必须包含error错误结果字段,相关的描述和错误码.

RPC接口的设计

FISCO BCOS提供丰富的RPC接口供客户端调用。其中分为3类:

数据结构与编码协议

交易结构及其RLP编码描述

FISCO BCOS的交易结构在原以太坊的交易结构的基础上,有所增减字段。FISCO BCOS 2.0+的交易结构字段如下:

name type description RLP index RC1 RLP index RC2
type enum 交易类型,表明该交易是创建合约还是调用合约交易,初始为空合约 - -
nonce u256 消息发送方提供的随机数,用于唯一标识交易 0 0
value u256 转账数额,目前去币化的FISCO BCOS不使用该字段 5 5
receiveAddress h160 交易接收方地址,type为创建合约时该地址为0x0 4 4
gasPrice u256 本次交易的gas的单价,FISCO BCOS中为固定值300000000 1 1
gas u256 本次交易允许最多消耗的gas数量,FISCO BCOS可配置该值 2 2
data vector< byte > 与交易相关的数据,或者是创建合约时的初始化参数 6 6
chainId u256 记录本次交易所属的链信息/业务信息 - 7
groupId u256 记录本次交易所属的群组 - 8
extraData vector< byte > 预留字段,记录交易信息,内部使用“#”分割信息 - 9
vrs SignatureStruct 交易发送方对交易7字段RLP编码后的哈希值签名生成的数据 7,8,9 10,11,12
hashWith h256 交易结构所有字段(含签名信息)RLP编码后的哈希值 - -
sender h160 交易发送方地址,基于vrs生成 - -
blockLimit u256 交易生命周期,该交易最晚被处理的块高,FISCO BCOS新增字段 3 3
importTime u256 交易进入交易池的unix时间戳,FISCO BCOS新增字段 - -
rpcCallback function 交易出块后RPC回调,FISCO BCOS新增字段 - -

RC1的hashWith字段(也称交易hash/交易唯一标识)的生成流程如下:

RC2的生成流程也类似,只是在第一步rlp+hash的transaction结构体中增加chainId、groupId和extraData三个字段。

区块结构及其RLP编码描述

FISCO BCOS的区块由以下五部分组成

rc1版本

name description RLP index
blockHeader 区块头RLP编码 0
transactions 交易列表RLP编码 1
transactionReceipts 交易回执列表RLP编码 2
hash 区块头RLP编码后的哈希值 3
sigList PBFT共识落盘阶段收集到的节点签名信息,Raft不使用 4

rc2、rc3、2.0及以上版本

name description RLP index
blockHeader 区块头RLP编码 0
transactions 交易列表RLP编码 1
hash 区块头RLP编码后的哈希值 2
sigList PBFT共识落盘阶段收集到的节点签名信息,Raft不使用 3
transactionReceipts 交易回执列表RLP编码 4

FISCO BCOS的区块头中每个字段意义如下:

name type description RLP index
parentHash h256 父区块的哈希值 0
stateRoot h256 状态树的根哈希值 1
transactionsRoot h256 交易树的根哈希值 2
receiptsRoot h256 收据树的根哈希值 3
dbHash h256 分布式存储通过计算哈希值来记录一区块中写入的数据,FISCO BCOS新增字段 4
logBloom LogBloom 交易收据日志组成的Bloom过滤器,FISCO BCOS目前尚未使用 5
number int64_t 本区块的块号,块号从0号开始计算 6
gasLimit u256 本区块中所有交易消耗的Gas上限 7
gasUsed u256 本区块中所有交易使用的Gas之和 8
timestamp int64_t 打包区块的unix时间戳 9
extraData vector 区块的附加数据,FISCO BCOS目前只用于在第0块中记录群组genesis文件信息 10
sealer u256 打包区块的节点在共识节点列表中的索引,FISCO BCOS新增字段 11
sealerList vector 区块的共识节点列表(不含观察节点),FISCO BCOS新增字段 12
hash h256 区块头前13个字段RLP编码后的哈希值,FISCO BCOS新增字段 -

交易收据

name type description RLP index
stateRoot h256 区块状态根 0
gasUsed u256 交易消耗的gas 1
contractAddress Address 部署合约的地址 2
bloom h2048 布隆滤波器 3
status h256 交易执行结果的状态码 4
output LogBloom 交易返回值 5
logs LogEntry[] event logs 6

网络传输协议

FISCO BCOS 目前有两类数据包格式,节点与节点间通信的数据包为P2PMessage格式,节点与SDK间通信的数据包为ChannelMessage格式。

交易并行

名词解释

模块架构

其中主要流程包括:

  1. 用户直接或间接通过SDK发起交易。交易可以是能够并行执行的交易和不能并行执行的交易;
  2. 交易进入节点的交易池中,等待打包;
  3. 交易被Sealer打包为区块,经过共识后,发送至BlockVerifier进行验证;
  4. BlockVerifier根据区块中的交易列表生成交易DAG;
  5. BlockVerifier构造执行上下文,并行执行交易DAG;
  6. 区块验证通过后,区块上链。
上一篇 下一篇

猜你喜欢

热点阅读