系统合约

系统合约是FISCO BCOS区块链内置的智能合约。一条链对应唯一的系统合约。系统合约实现了对链的控制和管理。如节点注册,机构准入等等。

系统合约是一组合约的集合,包括:

  • 系统代理合约
  • 节点管理合约
  • 注销证书合约
  • 权限管理合约
  • 全网配置合约

节点相关

系统合约在创世节点生成时,脚本已自动将其部署到链上,并设置了节点config.json文件中的systemproxyaddress来指向系统合约的地址。重新更新systemproxyaddress的节点需重新启动才能生效。

操作相关

配置:在操作前,需用脚本set_proxy_address.sh配置需要操作的链。

操作目录:FISCO-BCOS/tools/systemcontract

系统代理合约

系统代理合约是系统合约的统一入口。

它提供了路由名称到合约地址的映射关系。

源码路径:systemcontract/SystemProxy.sol

接口说明

接口名 输入 输出 备注
获取路由信息 getRoute 路由名称 路由地址、缓存标志位、生效块号
注册路由信息setRoute 路由名称、路由地址、缓存标志位 若该路由名称已存在,则覆盖

web3调用示例如下(可参看systemcontract/deploy.js):

 console.log("register NodeAction.....");
 func = "setRoute(string,address,bool)";
 params = ["NodeAction", NodeAction.address, false];
 receipt = await web3sync.sendRawTransaction(config.account, config.privKey, SystemProxy.address, func, params);

工具使用方法

查看所有系统合约信息:

babel-node tool.js SystemProxy

示例输出如下:

{ HttpProvider: 'http://127.0.0.1:8701',
  Ouputpath: './output/',
  privKey: 'bcec428d5205abe0f0cc8a734083908d9eb8563e31f943d760786edf42ad67dd',
  account: '0x64fa644d2a694681bd6addd6c5e36cccd8dcdde3' }
Soc File :SystemProxy
Func :undefined
SystemProxy address 0x210a7d467c3c43307f11eda35f387be456334fed
-----------------SystemProxy route----------------------
0 )TransactionFilterChain=>0xea8425697a093606309eb85e4447d6f333cff2fe,false,395
1 )ConfigAction=>0x09e4f1b4fa1713339f5aa17b40fa6f9920c7b278,false,396
2 )NodeAction=>0xcc46c245e6cca918d43bf939bbb10a8c0988548f,false,397
3 )CAAction=>0x8ab1175c6e7edb40dd0ed2a52ceaa94afb135a64,false,398
4 )ContractAbiMgr=>0x707024221d2433067b768c4be3a005c5ece8df40,false,399
5 )ConsensusControlMgr=>0x007f2c2751bbcd6c9a630945a87a3bc2af38788c,false,400

输出中即是当前系统路由表的所有路由信息。

节点管理合约

节点管理合约主要功能是维护网络中节点列表。 网络中节点加入或退出都需要与节点管理合约进行交互。

源码路径:systemcontract/NodeAction.sol

接口说明

接口名 输入 输出 备注
节点入网 registerNode 节点ID, 节点名称 节点机构、证书序列号 布尔结果 若该节点ID已存在,则忽略
节点出网 cancelNode 节点ID 布尔结果 若路由名称不存在,则忽略

web3调用示例如下(可参看systemcontract/tool.js):

var instance=getAction("NodeAction");
var func = "registerNode(string,string,string,string)";
var params = [node.id,node.name,node.agency,node.caHash];
var receipt = web3sync.sendRawTransaction(config.account, config.privKey, instance.address, func, params);

工具使用方法

# 注册记账节点
#1. 进入脚本所在目录(设FISCO-BCOS源码位于/mydata/FISCO-BCOS目录, 注册的节点位于/mydata/node0目录)
$ cd /mydata/FISCO-BCOS/tools/scripts
#2. 调用register_node.sh注册记账节点
$ bash register_node.sh -d /mydata/node0

# 退出记账节点(设退出的节点位于/mydata/node0目录)
$bash remove_node.sh -d /mydata/node0 

证书黑名单合约

证书黑名单合约可将指定节点证书加入证书撤销列表,使其无法与其他节点建立连接,从而达到阻止作恶节点的目的。

源码路径:systemcontract/CAAction.sol

(1)接口说明

接口名 输入 输出 备注
登记 add 证书序列号、证书公钥、节点名称 布尔结果 若该证书信息不存在,则新建
移除 remove 证书序列号 布尔结果 若该证书不存在,则忽略
查询证书信息
get
证书序列号 证书序列号、公钥 公钥,节点名称、块号

web3调用示例如下(可参看systemcontract/tool.js):

var instance=getAction("CAAction");
var func = "add(string,string,string)";
var params = [ca.serial,ca.pubkey,ca.name]; 
var receipt = web3sync.sendRawTransaction(config.account, config.privKey, instance.address, func, params);ig.account, config.privKey, instance.address, func, params);

工具使用方法

查看证书撤销列表信息

babel-node tool.js CAAction all

编写证书配置

编写文件:ca.json。将序列号填入hash字段。配置status,0表示不可用,1表示可用。其它字段默认即可。如下,让node2的证书可用。即status置1。详细介绍,请参考机构证书准入说明

{
    "hash":"8A4B2CDE94348D22",
    "status":1,
    "pubkey":"xxxx",
    "orgname":"xx银行",
    "notbefore":20170223,
    "notafter":20180223,
    "whitelist":"192.168.1.1;192.168.1.2;192.168.1.3",
    "blacklist":"192.168.1.11;192.168.1.12;192.168.1.13"
}

将指定节点证书添加到证书撤销列表

ca.json 中status置为1

babel-node tool.js CAAction add ca.json

从证书撤销列表删除指定节点证书

ca.json 中status置为0

babel-node tool.js CAAction remove ca.json

权限管理合约

权限管理合约是对区块链权限模型的实现。

一个外部账户只属于一个角色,一个角色拥有一个权限项列表。

一个权限项由合约地址加上合约接口来唯一标识。

源码路径:systemcontract/AuthorityFilter.sol 交易权限Filter

systemcontract/Group.sol

接口说明

合约 接口名 输入 输出 备注
角色 设置用户权限组 权限项 setPermission 合约地址、合约接口、权限标记
获取权限标记 getPermission 合约地址、合约接口 权限标记
交易权限Filter 设置用户所属角色 setUserGroup 用户外部账户、用户所属角色合约
交易权限检查 process
用户外部账户、交易发起账户、
合约地址、合约接口、交易数据

web3调用示例如下(可参看systemcontract/deploy.js):

var GroupReicpt= await web3sync.rawDeploy(config.account, config.privKey, "Group");
var Group=web3.eth.contract(getAbi("Group")).at(GroupReicpt.contractAddress);
#......省略若干行......
abi = getAbi0("Group");
params  = ["Group","Group","",abi,GroupReicpt.contractAddress];
receipt = await web3sync.sendRawTransaction(config.account, config.privKey, ContractAbiMgrReicpt.contractAddre
ss, func, params);

工具使用方法

检查用户外部账户权限

babel-node tool.js AuthorityFilter 用户外部账户、合约地址、合约接口

自主定制

继承TransactionFilterBase实现新的交易Filter合约。并通过addFilter接口将新Filter注册入TransactionFilterChain即可。

全网配置合约

全网配置合约维护了区块链中部分全网运行配置信息。

目标是为了通过交易的全网共识来达成全网配置的一致更新。

源码路径:systemcontract/ConfigAction.sol

全网配置项说明

配置项 说明 默认值 推荐值
intervalBlockTime 块间隔(ms) 1000 1000
maxBlockTranscations 块最大交易数 1000 1000
maxNonceCheckBlock 交易nonce检查最大块范围 1000 1000
maxBlockLimit blockLimit超过当前块号的偏移最大值 1000 1000
maxTranscationGas 交易的最大gas 30,000,000 30,000,000
CAVerify CA验证开关 false false

接口说明

接口名 输入 输出 备注
设置配置项 set 配置项、配置值 若配置表中已存在,则覆盖
查询配置值 get 配置项 配置值、块号

web3调用示例如下(可参看systemcontract/tool.js):

var func = "set(string,string)";
var params = [key,value];
var receipt = web3sync.sendRawTransaction(config.account, config.privKey, instance.address, func, params);
console.log("config :"+key+","+value);

使用方法

查询配置项

babel-node tool.js ConfigAction get 配置项

设置配置项

babel-node tool.js ConfigAction set 配置项 配置值