1 概述

1.1 单链多账本

区块链技术是一种去中心化、公开透明的分布式数据存储技术,能够降低信任成本,实现安全可靠的数据交互。然而区块链的交易数据面临着隐私泄露威胁:

  • 对于公有链,一节点可任意加入网络,从全局账本中获得所有数据;
  • 对于联盟链,虽有网络准入机制,但节点加入区块链后即可获取全局账本的数据。

作为联盟链的FISCO BCOS,对链上隐私这一问题,提出了单链多账本的解决方案。FISCO BCOS通过引入群组概念,使联盟链从原有一链一账本的存储/执行机制扩展为一链多账本的存储/执行机制,基于群组维度实现同一条链上的数据隔离和保密。

../../../_images/multi_ledger.png多账本.png

如上图所示,节点ABC加入蓝色群组,并共同维护蓝色账本; 节点B和C加入橙色群组并维护橙色账本; 节点A和B加入绿色群组并维护绿色账本。三个群组间共享公共的网络服务,但各群组有各自私有的账本存储及交易执行环境。客户端将交易发到节点所属的某个群组上,该群组内部对交易及数据进行共识并存储,其他群组对该交易无感知不可见。

1.2 节点准入机制

基于群组概念的引入,节点准入管理可分为网络准入机制群组准入机制。准入机制的规则记录在配置中,节点启动后将读取配置信息实现网络及群组的准入判断。

2 名词解释

2.1 节点类型

本文档所讨论的节点为已完成网络准入可进行P2P通信的节点。网络准入过程涉及P2P节点连接列表添加和证书验证。

  • 群组节点:完成网络准入并加入群组的节点。群组节点只能是记账节点和观察节点两者之一。其中记账节点参与共识出块和交易/区块同步,观察节点只参与区块同步。群组节点准入过程涉及动态增删节点的交易发送。
  • 游离节点:完成网络准入但没有加入群组的节点。游离节点尚未通过群组准入,不参与共识和同步。

节点关系如下:

../../../_images/node_relationship.png节点关系.png

2.2 配置类型

划分维度 配置类型
说明
影响范围 网络配置全局性质的配置,节点的配置影响该节点所在的整个网络,节点对整个网络使用同一份配置,
文件名为config.*
群组配置节点的配置影响该节点所在的单个群组,每个群组各有一份配置,
文件名为group.X.*,其中X为群组号
是否可改固定配置只使用首次配置内容,后续对配置的修改无效,
文件后缀为.genesis
可改配置配置后续可改动,节点重启生效,
文件后缀为.ini
存放位置本地存储配置存放在本地文件,用户可直接修改,
用户修改文件能重启生效的配置项
链上存储配置存放在区块链上,对其修改需群组共识,目前没有需全网共识的内容,
需新链重置或通过交易修改生效的配置项

2.3 节点准入配置项

涉及节点转入管理相关的配置项有:P2P节点连接列表节点证书CA黑名单群组节点初始列表群组节点系统表

| 配置项 | 作用 | 影响范围 | 是否可改 | 存放位置 | | ————- | ——————————— | —— | ——- | ——- | | P2P节点连接列表 | 记录本节点期望与哪些节点建立网络通信 | 网络配置 | 可改配置 | 本地存储 | | 节点证书 | 证明自己是由可信第三方许可的节点 | 网络配置 | 可改配置 | 本地存储 | | CA黑名单 | 记录本节点禁止与哪些节点建立网络通信 | 网络配置 | 可改配置 | 本地存储 | | 群组节点初始列表 | 记录创世块阶段参与共识/同步的节点列表 | 群组配置 | 固定配置 | 本地存储 | | 群组节点系统表 | 记录当前参与一群组共识/同步的节点列表 | 群组配置 | 可改配置 | 链上存储 |

3 模块架构

../../../_images/architecture4.png模块架构.png

配置项及系统模块关系图如上,箭头方向A->B表示B模块依赖A模块的数据,同时B模块晚于A模块初始化。

4 核心流程

4.1 一般初始化流程

../../../_images/first_initialization.png一般初始化流程.png

4.2 首次初始化流程

节点在首次启动时,对其所属的各个群组,以群组为单位将固定配置文件的内容写入第0块并直接提交上链。初始化的具体逻辑为:

../../../_images/initialization.png首次初始化流程.png

这一阶段需写入的与节点准入管理相关的配置内容有:群组节点初始列表->群组节点系统表

说明:

  • 同一账本的所有节点的第0块需一致,即固定配置文件均一致;
  • 节点后续的每次启动均检查第0块信息是否与固定配置文件一致。如果固定配置文件被修改,节点再次启动将输出告警信息,但不会影响群组正常运作。

4.3 基于CA黑名单的节点建连流程

SSL认证用于确定节点之间是否许可加入某条链。一条链上的节点均信任可信的第三方(节点证书的颁发者)。

FISCO BCOS要求实现SSL双向认证。节点在handshake过程中,从对方节点提供的证书中获取对方节点的nodeID,检查该nodeID是否在自身的CA黑名单。如存在,关闭该connect,如不在,建立session。

CA黑名单机制也支持SSL单向认证的场景,作用时机是:节点在session建立后,可从session中获取对方节点的nodeID进行判断,如果nodeID在自身的CA黑名单中,将已建立的session断连。

4.4 节点相关类型及其转换操作

三种节点类型(记账节点+观察节点+游离节点)可通过相关接口进行如下转换:

../../../_images/type_and_conversion_of_nodes.png共识节点相关类型及其转换操作.png

5 接口及配置描述

5.1 节点配置文件层级

../../../_images/config_file_organization.png配置文件的层级关系.png

配置文件的组织规则为:各群组的配置独立固定配置和可改配置相独立。目前使用的文件有网络可改配置文件config.ini群组固定配置文件group.N.genesis群组可改配置文件group.N.ini,其中N为节点所在的群组号。对于网络/群组可改配置文件,如果文件中没有显式定义一配置项的值,程序将使用该配置项的默认值。

5.2 配置文件示例

对于网络可改配置文件config.ini,节点准入管理涉及P2P节点连接列表[p2p]节点证书[secure]CA黑名单[crl][crl]可缺省。配置项举例如下:

[p2p]
    ;p2p listen ip
    listen_ip=0.0.0.0
    ;p2p listen port
    listen_port=30300
    ;nodes to connect
    node.0=10.107.105.138:30300
    node.1=10.107.105.138:30303
    node.2=10.107.105.138:30306
    node.3=10.107.105.138:30309
    
;certificate rejected list
[crl]
    ;crl.0=4d9752efbb1de1253d1d463a934d34230398e787b3112805728525ed5b9d2ba29e4ad92c6fcde5156ede8baa5aca372a209f94dc8f283c8a4fa63e3787c338a4

;certificate configuration
[secure]
    ;directory the certificates located in
    data_path=conf/
    ;the node private key file
    key=node.key
    ;the node certificate file
    cert=node.crt
    ;the ca certificate file
    ca_cert=ca.crt

对于群组固定配置文件group.N.genesis,节点准入管理涉及群组节点初始列表[consensus]。配置项举例如下:

;consensus configuration
[consensus]
    ;consensus algorithm type, now support PBFT(consensus_type=pbft) and Raft(consensus_type=raft)
    consensus_type=pbft
    ;the max number of transactions of a block
    max_trans_num=1000
    ;the ttl of broadcasted pbft message
    ;ttl=2
    ;the node id of leaders
    node.0=79d3d4d78a747b1b9e59a3eb248281ee286d49614e3ca5b2ce3697be2da72cfa82dcd314c0f04e1f590da8db0b97de466bd08e27eaa13f85df9b60e54d6a1ec8
    node.1=da527a4b2aeae1d354102c6c3ffdfb54922a092cc9acbdd555858ef89032d7be1be499b6cf9a703e546462529ed9ea26f5dd847110ff3887137541bc651f1c32
    node.2=160ba08898e1e25b31e24c2c4e3c75eed996ec56bda96043aa8f27723889ab774b60e969d9bd25d70ea8bb8779b7070521d9bd775dc7636f4b2b800d2fc8c7dd
    node.3=a968f1e148e4b51926c5354e424acf932d61f67419cf7c5c00c7cb926057c323bee839d27fe9ad6c75386df52ae2b30b2e7ba152b0023979d25dee25b20c627f

5.3 群组节点系统表定义

5.4 群组系统表接口定义

群组系统表实现群组层的白名单机制(对比CA黑名单实现网络的黑名单机制)。群组系统表提供的接口有:

contract ConsensusSystemTable
{
    // 修改一节点为记账节点
    function addMiner(string nodeID) public returns(int256);
    // 修改一节点为观察节点
    function addObserver(string nodeID) public returns(int256);
    // 把该节点从群组系统表中移除
    function remove(string nodeID) public returns(int256);
}

6 功能展望

  • 可改配置目前为修改后重启生效,后续可实现动态加载,修改实时生效;
  • CA黑名单目前实现了基于节点的黑名单,后续可考虑基于机构的黑名单。

7 FAQ