BCOS系统合约介绍
- BCOS系统合约介绍
- 设计概述
- 实现概述
- 系统代理合约
- 节点管理合约
- 机构证书合约
- 权限管理合约
- 全网配置合约
- 自定义扩展
- 示例1-自定义业务配置合约
- 示例2-自定义业务权限Filter合约
设计概述
BCOS区块链为了满足准入控制、身份认证、配置管理、权限管理等需求,在网络启动之初,会部署一套功能强大、结构灵活且支持自定义扩展的智能合约,统称系统合约。
系统合约原则上由区块链管理员在网络启动之初部署全网生效。若是在网络运行期间重新部署变更升级,则需要在全网所有节点许可的情况下由区块链管理员来执行操作。
当前BCOS系统合约主要有五个模块,系统代理模块、节点管理模块、机构证书模块、权限管理模块、全网配置模块。系统合约模块可以根据需要自定义扩展,它既可以供区块链核心调用也可以对DAPP提供服务。每个模块由一个或多个智能合约来实现。模块结构图如下:
实现概述
当前BCOS对系统代理模块、节点管理模块、机构证书模块、权限管理模块、全网配置模块都做了对应的合约实现。合约源代码目录为systemcontractv2/。下面依次介绍各个合约实现的接口与逻辑。
系统代理合约
SystemProxy.sol是系统代理模块的实现合约。它实现了路由到合约地址的命名服务,提供了系统合约的统一入口。内部实现中是通过mapping类型成员变量_routes来维护所有的路由表信息。路由表信息项的数据结构主要是:
struct SystemContract {address _addr; #合约地址bool _cache; #缓存标志位uint _blocknumber; #生效区块高度}
主要接口如下:
接口 | 输入参数 | 输出参数 | 说明 |
---|---|---|---|
getRoute | string key#路由名称 | address, bool,uint # 合约地址,缓存标志位,生效区块高度 | 获取路由信息 |
setRoute | string key, address addr, bool cache# 路由名称,合约地址,缓存标志位,生效区块高度 | 无 | 设置路由信息,若该路由名称已存在,则覆盖 |
节点管理合约
NodeAction.sol是节点管理模块的实现合约。它实现了对网络中所有节点列表信息的登记、管理、维护功能。每当网络中有节点加入或退出都必须与节点管理合约进行交互。
在BCOS中节点分为三种类型:核心节点、全节点、轻节点。
enum NodeType{None,Core, //核心 Full, //全节点 Light //轻节点 }
节点信息的数据结构是:
struct NodeInfo{string id; #节点身份ID string ip; #机器IP uint port; #机器端口NodeType category; #节点类型string desc; #节点描述 string CAhash; #节点机构证书哈希string agencyinfo; #节点其他信息uint idx; #节点序号uint blocknumber;#区块高度}
主要接口如下:
接口 | 输入参数 | 输出参数 | 说明 |
---|---|---|---|
registerNode | string _id,string _ip,uint _port,NodeType _category,string _desc,string _CAhash,string _agencyinfo,uint _idx #节点身份ID、IP、端口、节点类型、节点描述、节点CA哈希、节点agency、节点序号 | bool #注册结果 | 注册节点 ,若该节点信息已存在,则忽略 |
cancelNode | string _id #节点身份ID | bool #注册结果 | 注销节点,若该节点信息不存在,则忽略 |
机构证书合约
CAAction.sol是机构证书模块的实现合约。它实现了对网络中所有节点的机构证书信息的登记、管理、维护功能。当网络启用机构证书验证功能的情况下,网络中节点加入或退出都需要与机构证书合约进行交互。
机构证书的数据结构是:
struct CaInfo{string hash; #节点机构证书哈希string pubkey; #证书公钥string orgname; #机构名称uint notbefore; #证书启用日期uint notafter; #证书失效时间CaStatus status; #证书状态string whitelist;#IP白名单string blacklist;#IP黑名单uint blocknumber;#生效区块高度}
主要接口如下:
接口 | 输入参数 | 输出参数 | 说明 |
---|---|---|---|
update | string _hash,string _pubkey,string _orgname,uint _notbefore,uint _notafter,CaStatus _status,string _whitelist,string _blacklist # 证书哈希、证书公钥、机构名称、 证书启用日期、 证书失效时间、证书状态、IP白名单、IP黑名单 | bool #更新结果 | 更新证书信息, 若该证书信息不存在,则新建证书记录 |
get | string _hash#证书哈希 | string,string,string,uint,uint,CaStatus,uint# 证书哈希、证书公钥、机构名称、证书启用日期、证书失效时间、证书状态、生效区块块号 | 查询证书信息 |
权限管理合约
BCOS基于角色的身份权限设计有三要点:一个外部账户只属于一个角色;一个角色拥有一个权限项列表; 一个权限项由合约地址加上合约接口来唯一标识。
当前BCOS权限管理模块主要由TransactionFilterChain.sol、TransactionFilterBase.sol、AuthorityFilter.sol、Group.sol四个合约来实现。
TransactionFilterChain是对Filter模型的实现框架。它在内部维护了一个实现继承于TransactionFilterBase的Filter合约地址列表。它对区块链核心提供了统一的权限检查接口process。process执行过程中会对Filter合约地址列表中的所有Filter依次执行process函数,以完成所有需要的权限检查。
TransactionFilterBase是Filter的基类合约。所有Filter必须要实现它的process接口。AuthorityFilter是继承于TransactionFilterBase的角色权限Filter实现。它的process接口实现了对用户所属角色组的权限项进行检查逻辑。
Group是对角色的实现。它内部维护了该角色的所有权限项的mapping标志位。
主要接口如下:
合约 | 接口 | 输入参数 | 输出参数 | 说明 |
---|---|---|---|---|
TransactionFilterBase | process | address origin, address from, address to, string func, string input# 用户外部账户、交易发起账户、合约地址、合约接口、交易输入数据 | bool#处理结果 | 权限检查 |
Group | setPermission | address to, string func, bool perrmission# 合约地址、合约接口、权限标记 | bool#处理结果 | 设置角色权限项 |
全网配置合约
ConfigAction.sol是全网配置模块的实现合约。它维护了BCOS区块链中全网运行的可配置信息。 配置信息可以通过交易广播上链来达到全网配置的一致性更新。原则上只能由区块链管理员来发出全网配置更新交易。
ConfigAction.sol的内部实现中维护了配置项信息的mapping 成员变量。
主要接口如下:
接口 | 输入参数 | 输出参数 | 说明 |
---|---|---|---|
set | string key, string value# 配置项、配置值 | 无 | 设置配置项 |
get | string key #配置项 | string, uint# 配置值、生效区块高度 | 查询配置值 |
当前BCOS主要有以下全网配置项:
配置项 | 说明 | 默认值 | 推荐值 |
---|---|---|---|
maxBlockHeadGas | 块最大GAS (16进制) | 200000000 | 20000000000 |
intervalBlockTime | 块间隔(ms) (16进制) | 1000 | 1000 |
maxBlockTranscations | 块最大交易数(16进制) | 1000 | 1000 |
maxNonceCheckBlock | 交易nonce检查最大块范围(16进制) | 1000 | 1000 |
maxBlockLimit | blockLimit超过当前块号的偏移最大值(16进制) | 1000 | 1000 |
maxTranscationGas | 交易的最大gas(16进制) | 20000000 | 20000000 |
CAVerify | CA验证开关 | FALSE | FALSE |
自定义扩展
示例1-自定义业务配置合约
假设业务需要利用系统合约框架,自定义业务配置合约以对业务相关合约提供配置服务。大体可以参考以下步骤来扩展:
- 根据业务合约需求,实现业务配置合约的设置配置项接口set和查询配置值接口get。
- 部署业务配置合约,获得业务配置合约链上地址。
- 调用系统代理合约SystemProxy的setRoute接口,将业务配置合约地址注册到路由表中。
- 至此,业务配置合约已经完成在系统代理合约的路由注册,已可在业务交易中调用。
业务配置合约的使用方法:
- 调用SystemProxy的getRoute接口运行时获得业务配置合约地址。
- 通过业务配置合约地址调用查询配置值接口get获得配置值。
示例2-自定义业务权限Filter合约
假设业务需要增加业务权限校验逻辑,则可以利用权限管理合约的Filter机制来无缝扩展。大体可以参考以下步骤来扩展:
- 继承于TransactionFilterBase实现一个业务权限Filter合约,业务权限Filter合约根据业务需要的权限校验逻辑实现process接口。
- 部署业务权限Filter合约,获得对应的合约地址。
- 调用系统代理合约SystemProxy的getRoute接口,获得TransactionFilterChain合约地址。
- 调用TransactionFilterChain合约的addFilter接口,将业务权限Filter合约地址注册到Filter合约列表中。
- 至此,业务权限Filter合约已经启用。
https://github.com/toxotguo/BCOS-Development-Guide/blob/master/BCOS%E7%B3%BB%E7%BB%9F%E5%90%88%E7%BA%A6%E4%BB%8B%E7%BB%8D.md
BCOS系统合约介绍相关推荐
- 【eos系列】eos系统合约介绍 — 发币合约eosio.token
简介 本章将深入源码,为大家分析eos的系统合约eosio.token的实现细节.eosio.token是eos的发币合约,这个合约主要实现了EOS代币的创建.发行.转账等功能. 主要合约方法 eos ...
- EOS智能合约:system系统合约源码分析
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. eosio.system 概览 笔者使用的IDE是VScode,首先来看eosio.system的源码结构.如下图所示. ...
- 【精】EOS智能合约:system系统合约源码分析
系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.syst ...
- 智能合约:BUMO 智能合约介绍
BUMO 智能合约介绍 合约定义 注意:推荐使用 新的智能合约接口 开发. 合约是一段JavaScript代码,标准(ECMAScript as specified in ECMA-262).合约的初 ...
- 系统SDK介绍-02
系统SDK介绍 打开相册选择图片 打开相册选择视频 打开相机拍摄图片 打开相机拍摄视频 配置权限: 在info.plist文件中添加需要的权限 相机权限:Privacy - Camera Usage ...
- windows7、windows 2008和windows 2008 R2 的系统封装介绍
windows7.windows 2008和windows 2008 R2 的系统封装介绍 第一步: windows7.windows2008和windows 2008R2 中的sysprep.exe ...
- Mint系统使用介绍,Mint系统安装,在Mint系统上搭建GPU环境,在Mint系统上安装Pycharm、Anaconda等软件,在Mint系统上安装cuda和cudnn
欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 Mint系统使用介绍,Mint系统安装,在Mint系统上搭建GPU环境,在Mint系统上安装Pycharm.Anacon ...
- Laravel核心代码学习--用户认证系统(基础介绍)
用户认证系统(基础介绍) 使用过Laravel的开发者都知道,Laravel自带了一个认证系统来提供基本的用户注册.登录.认证.找回密码,如果Auth系统里提供的基础功能不满足需求还可以很方便的在这些 ...
- 室内空气流动原理图_新风系统原理图—新风系统原理介绍
如今我们在进行新家的装修的时候,不少人为了家人的健康着想,都在选购家电的同时会选择安装一款新风系统.但是尽管如此,大家对新风系统原理其实并不了解,更不要提新风系统各部分的原理了,下面小编就结合新风系统 ...
最新文章
- hadoop和python的关系_Python 的 map 和 reduce 和 Hadoop 的 MapReduce 有什么关系?
- Android改变移动网络ip地址,Android之获取移动网络ip
- 将本地win10作为web服务器
- ubuntu9.10回收站目录
- C#进行Visio二次开发之Shape的Data1、Data2、Data3的用处
- 显示ip地址及包含采集功能的全套函数源代码
- linux环境变量自动配置,Linux进入系统时自动配置
环境变量的要领
- 国密算法SM3-java实现
- 【EOJ Monthly 2019.02 - B】解题(思维,抽屉原理,暴力,模运算,优化,tricks)
- 手机电脑壁纸!让你的桌面变得超酷
- ORACLE expdp/impdp导出实例
- db2 删除索引_程序员必须了解的知识点——你搞懂mysql索引机制了吗?
- mysql批量执行语句_mysql批量执行sql语句
- linux c实现通用hash表
- 我与计算机的不解之缘
- 13个测试网站访问速度的服务网站
- 条件欧几里得聚类实验数据集Statues_4.pcd下载
- 子空间的投影矩阵推导过程及其性质
- 天眼查python_GitHub - wagaman/Python-Tianyancha: 天眼查爬虫
- 致爱丽丝 之MY收藏
热门文章
- UML大战需求分析--阅读笔记02
- 《第一行代码》学习笔记40-网络(1)
- notepad++中的unexpected indent
- 命令行下django-admin.py参数不起作用的问题解决
- HDOJ 2015 偶数求和 解题报告
- Android中添加背景音乐的两种方法
- netfilter/iptables全攻略
- 二十万字C/C++、嵌入式软开面试题全集宝典二
- 最长重复子串(Rabin-Karp算法)
- matlab错误:Variable 'a' cannot be saved to a MAT-file whose version is older than 7.3.