权限控制¶
1 权限控制介绍¶
与可自由加入退出、自由交易、自由检索的公有链相比,联盟链有准入许可、交易多样化、基于商业上隐私及安全考虑、高稳定性等要求。因此,联盟链在实践过程中需强调“权限”及“控制”的理念。
为体现“权限”及“控制”理念,FISCO BCOS平台基于分布式存储,提出分布式存储权限控制的机制,可以灵活,细粒度的方式进行有效的权限控制,为联盟链的治理提供重要的技术手段。分布式权限控制基于外部账户(tx.origin)的访问机制,对包括合约部署,表的创建,表的写操作(插入、更新和删除)进行权限控制,表的读操作不受权限控制。 在实际操作中,每个账号使用独立且唯一的公私钥对,发起交易时使用其私钥进行签名,接收方可通过公钥验签知道交易具体是由哪个账号发出,实现交易的可控及后续监管的追溯。
2 权限控制规则¶
权限控制规则如下:
- 权限控制的最小粒度为表,基于外部账号进行控制。
- 使用白名单机制,未配置权限的表,默认完全放开,即所有外部账户均有读写权限。
- 权限设置利用权限表(_sys_table_access_)。权限表中设置表名和外部账户地址,则表明该账户对该表有读写权限,设置之外的账户对该表仅有读权限。
3 权限控制分类¶
分布式存储权限控制分为对用户表和系统表的权限控制。用户表指用户合约所创建的表,用户表均可以设置权限。系统表指FISCO BCOS区块链网络内置的表,系统表的设计详见存储文档。系统表的权限控制如下所示:
针对操作的系统表,其逻辑性错误定义如下:其中code是返回码(code大于等于0表示操作成功,其code值为成功操作的记录数),msg是返回码的描述信息。
| table | code | msg |
|---|---|---|
| _sys_table_access_ | -30 | table name and address exist |
| _sys_table_access_ | -31 | table name and address does not exist |
| _sys_miners_ | -40 | invalid nodeID |
| _sys_miners_ | -41 | last miner cannot be removed |
| _sys_miners_ | -42 | nodeID is not in network |
| _sys_miners_ | -43 | nodeID is not in group peers |
| _sys_miners_ | -44 | nodeID is already in miner list |
| _sys_miners_ | -45 | nodeID is already in observer list |
| _sys_cns_ | -50 | address and version exist |
| _sys_config_ | -60 | set invalid configuration values |
无权限属于系统性错误,code定义-1,msg定义为“non-authorized”。
4 流程图¶
4.1 用户表权限控制流程¶
外部账户查询表不进行权限控制。当需要更新,增加或移除记录时,将通过查询权限表进行权限控制。流程如下图所示。
ac1.png
4.2 系统表权限控制流程¶
对于sdk层,用户合约不可以直接操作权限表,通过sdk的AuthorityService接口(详见sdk文档)和控制台(详见控制台文档)可以操作系统表。对于C++底层,当需要操作权限表时,通过AuthorityPreCompiled进行权限表的操作。其中查询权限表不需要检查权限,新增和移除权限表的记录需要检查权限。整个系统内权限相关的增删查将通过AuthorityPreCompiled进行维护。所有权限内容记录在区块链上。交易请求发起后,系统将访问_sys_table_access_表查询该交易发起方是否有对应的权限。如果具有权限,执行交易;如果不具备,则返回无权限操作提示。
ac2.png
注: _sys_miners_表(ConsensusPrecompiled),_sys_cns_表(CNSPrecompiled),_sys_config_表(SystemConfigPrecompiled)控制流程与对权限表的控制流程类似。