|
| 1 | + |
| 2 | + |
| 3 | +# BCOS系统合约介绍 |
| 4 | +<!-- TOC --> |
| 5 | + |
| 6 | +- [BCOS系统合约介绍](#bcos系统合约介绍) |
| 7 | + - [设计概述](#设计概述) |
| 8 | + - [实现概述](#实现概述) |
| 9 | + - [系统代理合约](#系统代理合约) |
| 10 | + - [节点管理合约](#节点管理合约) |
| 11 | + - [机构证书合约](#机构证书合约) |
| 12 | + - [权限管理合约](#权限管理合约) |
| 13 | + - [全网配置合约](#全网配置合约) |
| 14 | + - [自定义扩展](#自定义扩展) |
| 15 | + - [示例1-自定义业务配置合约](#示例1-自定义业务配置合约) |
| 16 | + - [示例2-自定义业务权限Filter合约](#示例2-自定义业务权限filter合约) |
| 17 | + |
| 18 | +<!-- /TOC --> |
| 19 | + |
| 20 | +## 设计概述 |
| 21 | + |
| 22 | +BCOS区块链为了满足准入控制、身份认证、配置管理、权限管理等需求,在网络启动之初,会部署一套功能强大、结构灵活且支持自定义扩展的智能合约,统称系统合约。 |
| 23 | + |
| 24 | +系统合约原则上由区块链管理员在网络启动之初部署全网生效。若是在网络运行期间重新部署变更升级,则需要在全网所有节点许可的情况下由区块链管理员来执行操作。 |
| 25 | + |
| 26 | +当前BCOS系统合约主要有五个模块,系统代理模块、节点管理模块、机构证书模块、权限管理模块、全网配置模块。系统合约模块可以根据需要自定义扩展,它既可以供区块链核心调用也可以对DAPP提供服务。每个模块由一个或多个智能合约来实现。模块结构图如下: |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +## 实现概述 |
| 31 | + |
| 32 | +当前BCOS对系统代理模块、节点管理模块、机构证书模块、权限管理模块、全网配置模块都做了对应的合约实现。合约源代码目录为systemcontractv2/。下面依次介绍各个合约实现的接口与逻辑。 |
| 33 | + |
| 34 | +### 系统代理合约 |
| 35 | + |
| 36 | +SystemProxy.sol是系统代理模块的实现合约。它实现了路由到合约地址的命名服务,提供了系统合约的统一入口。内部实现中是通过mapping类型成员变量_routes来维护所有的路由表信息。路由表信息项的数据结构主要是: |
| 37 | + |
| 38 | +``` |
| 39 | +struct SystemContract { |
| 40 | + address _addr; #合约地址 |
| 41 | + bool _cache; #缓存标志位 |
| 42 | + uint _blocknumber; #生效区块高度 |
| 43 | + } |
| 44 | +``` |
| 45 | + |
| 46 | +主要接口如下: |
| 47 | + |
| 48 | +| 接口 | 输入参数 | 输出参数 | 说明 | |
| 49 | +| -------- | :--------------------------------------- | -------------------------------------- | -------------------- | |
| 50 | +| getRoute | string key#路由名称 | address, bool,uint # 合约地址,缓存标志位,生效区块高度 | 获取路由信息 | |
| 51 | +| setRoute | string key, address addr, bool cache# 路由名称,合约地址,缓存标志位,生效区块高度 | 无 | 设置路由信息,若该路由名称已存在,则覆盖 | |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | +### 节点管理合约 |
| 56 | + |
| 57 | +NodeAction.sol是节点管理模块的实现合约。它实现了对网络中所有节点列表信息的登记、管理、维护功能。每当网络中有节点加入或退出都必须与节点管理合约进行交互。 |
| 58 | + |
| 59 | +在BCOS中节点分为三种类型:核心节点、全节点、轻节点。 |
| 60 | + |
| 61 | +``` |
| 62 | +enum NodeType{ |
| 63 | + None, |
| 64 | + Core, //核心 |
| 65 | + Full, //全节点 |
| 66 | + Light //轻节点 |
| 67 | + } |
| 68 | +``` |
| 69 | + |
| 70 | +节点信息的数据结构是: |
| 71 | + |
| 72 | +``` |
| 73 | +struct NodeInfo{ |
| 74 | + string id; #节点身份ID |
| 75 | + string ip; #机器IP |
| 76 | + uint port; #机器端口 |
| 77 | + NodeType category; #节点类型 |
| 78 | + string desc; #节点描述 |
| 79 | + string CAhash; #节点机构证书哈希 |
| 80 | + string agencyinfo; #节点其他信息 |
| 81 | + uint idx; #节点序号 |
| 82 | + uint blocknumber;#区块高度 |
| 83 | + } |
| 84 | +``` |
| 85 | + |
| 86 | +主要接口如下: |
| 87 | + |
| 88 | +| 接口 | 输入参数 | 输出参数 | 说明 | |
| 89 | +| ------------ | :--------------------------------------- | ---------- | ------------------- | |
| 90 | +| registerNode | string _id,string _ip,uint _port,NodeType _category,string _desc,string _CAhash,string _agencyinfo,uint _idx #节点身份ID、IP、端口、节点类型、节点描述、节点CA哈希、节点agency、节点序号 | bool #注册结果 | 注册节点 ,若该节点信息已存在,则忽略 | |
| 91 | +| cancelNode | string _id #节点身份ID | bool #注册结果 | 注销节点,若该节点信息不存在,则忽略 | |
| 92 | + |
| 93 | + |
| 94 | + |
| 95 | +### 机构证书合约 |
| 96 | + |
| 97 | +CAAction.sol是机构证书模块的实现合约。它实现了对网络中所有节点的机构证书信息的登记、管理、维护功能。当网络启用机构证书验证功能的情况下,网络中节点加入或退出都需要与机构证书合约进行交互。 |
| 98 | + |
| 99 | +机构证书的数据结构是: |
| 100 | + |
| 101 | +``` |
| 102 | +struct CaInfo{ |
| 103 | + string hash; #节点机构证书哈希 |
| 104 | + string pubkey; #证书公钥 |
| 105 | + string orgname; #机构名称 |
| 106 | + uint notbefore; #证书启用日期 |
| 107 | + uint notafter; #证书失效时间 |
| 108 | + CaStatus status; #证书状态 |
| 109 | + string whitelist;#IP白名单 |
| 110 | + string blacklist;#IP黑名单 |
| 111 | + uint blocknumber;#生效区块高度 |
| 112 | + } |
| 113 | +``` |
| 114 | + |
| 115 | +主要接口如下: |
| 116 | + |
| 117 | +| 接口 | 输入参数 | 输出参数 | 说明 | |
| 118 | +| ------ | ---------------------------------------- | ---------------------------------------- | ------------------------- | |
| 119 | +| update | string _hash,string _pubkey,string _orgname,uint _notbefore,uint _notafter,CaStatus _status,string _whitelist,string _blacklist # 证书哈希、证书公钥、机构名称、 证书启用日期、 证书失效时间、证书状态、IP白名单、IP黑名单 | bool #更新结果 | 更新证书信息, 若该证书信息不存在,则新建证书记录 | |
| 120 | +| get | string _hash#证书哈希 | string,string,string,uint,uint,CaStatus,uint# 证书哈希、证书公钥、机构名称、证书启用日期、证书失效时间、证书状态、生效区块块号 | 查询证书信息 | |
| 121 | + |
| 122 | + |
| 123 | + |
| 124 | +### 权限管理合约 |
| 125 | + |
| 126 | +BCOS基于角色的身份权限设计有三要点:一个外部账户只属于一个角色;一个角色拥有一个权限项列表; 一个权限项由合约地址加上合约接口来唯一标识。 |
| 127 | + |
| 128 | +当前BCOS权限管理模块主要由TransactionFilterChain.sol、TransactionFilterBase.sol、AuthorityFilter.sol、Group.sol四个合约来实现。 |
| 129 | + |
| 130 | +TransactionFilterChain是对Filter模型的实现框架。它在内部维护了一个实现继承于TransactionFilterBase的Filter合约地址列表。它对区块链核心提供了统一的权限检查接口process。process执行过程中会对Filter合约地址列表中的所有Filter依次执行process函数,以完成所有需要的权限检查。 |
| 131 | + |
| 132 | +TransactionFilterBase是Filter的基类合约。所有Filter必须要实现它的process接口。AuthorityFilter是继承于TransactionFilterBase的角色权限Filter实现。它的process接口实现了对用户所属角色组的权限项进行检查逻辑。 |
| 133 | + |
| 134 | +Group是对角色的实现。它内部维护了该角色的所有权限项的mapping标志位。 |
| 135 | + |
| 136 | +主要接口如下: |
| 137 | + |
| 138 | +| 合约 | 接口 | 输入参数 | 输出参数 | 说明 | |
| 139 | +| --------------------- | ------------- | ---------------------------------------- | --------- | ------- | |
| 140 | +| TransactionFilterBase | process | address origin, address from, address to, string func, string input# 用户外部账户、交易发起账户、合约地址、合约接口、交易输入数据 | bool#处理结果 | 权限检查 | |
| 141 | +| Group | setPermission | address to, string func, bool perrmission# 合约地址、合约接口、权限标记 | bool#处理结果 | 设置角色权限项 | |
| 142 | + |
| 143 | + |
| 144 | + |
| 145 | +### 全网配置合约 |
| 146 | + |
| 147 | +ConfigAction.sol是全网配置模块的实现合约。它维护了BCOS区块链中全网运行的可配置信息。 配置信息可以通过交易广播上链来达到全网配置的一致性更新。原则上只能由区块链管理员来发出全网配置更新交易。 |
| 148 | + |
| 149 | +ConfigAction.sol的内部实现中维护了配置项信息的mapping 成员变量。 |
| 150 | + |
| 151 | +主要接口如下: |
| 152 | + |
| 153 | +| 接口 | 输入参数 | 输出参数 | 说明 | |
| 154 | +| ---- | --------------------------------- | ------------------------ | ----- | |
| 155 | +| set | string key, string value# 配置项、配置值 | 无 | 设置配置项 | |
| 156 | +| get | string key #配置项 | string, uint# 配置值、生效区块高度 | 查询配置值 | |
| 157 | + |
| 158 | +当前BCOS主要有以下全网配置项: |
| 159 | + |
| 160 | +| 配置项 | 说明 | 默认值 | 推荐值 | |
| 161 | +| -------------------- | ---------------------------- | --------- | ----------- | |
| 162 | +| maxBlockHeadGas | 块最大GAS (16进制) | 200000000 | 20000000000 | |
| 163 | +| intervalBlockTime | 块间隔(ms) (16进制) | 1000 | 1000 | |
| 164 | +| maxBlockTranscations | 块最大交易数(16进制) | 1000 | 1000 | |
| 165 | +| maxNonceCheckBlock | 交易nonce检查最大块范围(16进制) | 1000 | 1000 | |
| 166 | +| maxBlockLimit | blockLimit超过当前块号的偏移最大值(16进制) | 1000 | 1000 | |
| 167 | +| maxTranscationGas | 交易的最大gas(16进制) | 20000000 | 20000000 | |
| 168 | +| CAVerify | CA验证开关 | FALSE | FALSE | |
| 169 | + |
| 170 | +## 自定义扩展 |
| 171 | + |
| 172 | +### 示例1-自定义业务配置合约 |
| 173 | + |
| 174 | +假设业务需要利用系统合约框架,自定义业务配置合约以对业务相关合约提供配置服务。大体可以参考以下步骤来扩展: |
| 175 | + |
| 176 | +1. 根据业务合约需求,实现业务配置合约的设置配置项接口set和查询配置值接口get。 |
| 177 | +2. 部署业务配置合约,获得业务配置合约链上地址。 |
| 178 | +3. 调用系统代理合约SystemProxy的setRoute接口,将业务配置合约地址注册到路由表中。 |
| 179 | +4. 至此,业务配置合约已经完成在系统代理合约的路由注册,已可在业务交易中调用。 |
| 180 | + |
| 181 | +业务配置合约的使用方法: |
| 182 | + |
| 183 | +1. 调用SystemProxy的getRoute接口运行时获得业务配置合约地址。 |
| 184 | +2. 通过业务配置合约地址调用查询配置值接口get获得配置值。 |
| 185 | + |
| 186 | +### 示例2-自定义业务权限Filter合约 |
| 187 | + |
| 188 | +假设业务需要增加业务权限校验逻辑,则可以利用权限管理合约的Filter机制来无缝扩展。大体可以参考以下步骤来扩展: |
| 189 | + |
| 190 | +1. 继承于TransactionFilterBase实现一个业务权限Filter合约,业务权限Filter合约根据业务需要的权限校验逻辑实现process接口。 |
| 191 | +2. 部署业务权限Filter合约,获得对应的合约地址。 |
| 192 | +3. 调用系统代理合约SystemProxy的getRoute接口,获得TransactionFilterChain合约地址。 |
| 193 | +4. 调用TransactionFilterChain合约的addFilter接口,将业务权限Filter合约地址注册到Filter合约列表中。 |
| 194 | +5. 至此,业务权限Filter合约已经启用。 |
| 195 | + |
| 196 | + |
0 commit comments