系统合约

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

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

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

节点相关

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

操作相关

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

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

系统代理合约

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

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

源码路径:systemcontract/SystemProxy.sol

接口说明

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

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

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

工具使用方法

查看所有系统合约信息:

  1. babel-node tool.js SystemProxy

示例输出如下:

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

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

节点管理合约

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

源码路径:systemcontract/NodeAction.sol

接口说明

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

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

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

工具使用方法

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

证书黑名单合约

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

源码路径:systemcontract/CAAction.sol

(1)接口说明

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

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

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

工具使用方法

查看证书撤销列表信息

  1. babel-node tool.js CAAction all

编写证书配置

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

  1. {
  2. "hash":"8A4B2CDE94348D22",
  3. "status":1,
  4. "pubkey":"xxxx",
  5. "orgname":"xx银行",
  6. "notbefore":20170223,
  7. "notafter":20180223,
  8. "whitelist":"192.168.1.1;192.168.1.2;192.168.1.3",
  9. "blacklist":"192.168.1.11;192.168.1.12;192.168.1.13"
  10. }

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

ca.json 中status置为1

  1. babel-node tool.js CAAction add ca.json

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

ca.json 中status置为0

  1. babel-node tool.js CAAction remove ca.json

权限管理合约

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

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

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

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

systemcontract/Group.sol

接口说明

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

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

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

工具使用方法

检查用户外部账户权限

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

自主定制

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

全网配置合约

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

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

源码路径:systemcontract/ConfigAction.sol

全网配置项说明

配置项说明默认值推荐值
intervalBlockTime块间隔(ms)10001000
maxBlockTranscations块最大交易数10001000
maxNonceCheckBlock交易nonce检查最大块范围10001000
maxBlockLimitblockLimit超过当前块号的偏移最大值10001000
maxTranscationGas交易的最大gas30,000,00030,000,000
CAVerifyCA验证开关falsefalse

接口说明

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

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

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

使用方法

查询配置项

  1. babel-node tool.js ConfigAction get 配置项

设置配置项

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