前言
irita版本:irita/master,依赖库:github.com/bianjieai/iritamod v0.0.0-20210113080132-1a1b006c7f97
本文只做功能描述,API描述在此处 -> irita/docs/API,irita联盟链有以下功能:
- 准入控制
- 权限管理
- 节点管理
- 参数管理
- 系统运维
一. 准入控制
控制项 | 描述 | |
---|---|---|
节点证书 | 证明自己是由可信第三方许可的节点 | |
P2P节点连接列表 | 记录本节点期望与哪些节点建立网络通信 | |
节点黑名单 | 记录本节点禁止与哪些节点建立网络通信 | 基于irita框架,仅此项需要开发,其他项可直接用 |
二. 权限管理(x/admin)
- 权限枚举,见代码 iritamod/modules/admin/types/admin.pb.go,此go代码是有proto文件生成的
const (
// 初始化系统,添加Perm权限,不能被赋予其他权限
RoleRootAdmin Role = 0
// 添加、删除权限
RolePermAdmin Role = 1
// 冻结、解冻账号
RoleBlacklistAdmin Role = 2
// 节点模块,slashing模块,系统升级模块
RoleNodeAdmin Role = 3
// 参数模块
RoleParamAdmin Role = 4
// oracle模块、发行Token、发行token单位、定义服务、绑定服务
RolePowerUser Role = 5
// 目前没有用到,猜测是用来控制relayer的
RoleRelayerUser Role = 6
// 创建身份
RoleIDAdmin Role = 7
)
-
权限控制交易,见代码 iritamod/modules/admin/keeper/ante.go
// AnteHandle returns an AnteHandler that checks the auth to send msg func (ad AuthDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { for _, msg := range tx.GetMsgs() { for _, signer := range msg.GetSigners() { // 判断交易发起者是否冻结 if ad.k.GetBlockAccount(ctx, signer) { return ctx, sdkerrors.Wrapf(types.ErrUnauthorizedOperation, "The sender %s has been blocked", signer) } // 判断交易发起者是否拥有合法权限发送消息 if auth, ok := ad.k.AuthMap[msg.Type()]; ok { if err := ad.k.Access(ctx, signer, auth); err != nil { return ctx, err } continue } // 判断交易发起者是否拥有合法权限操作模块 if auth, ok := ad.k.AuthMap[msg.Route()]; ok { if err := ad.k.Access(ctx, signer, auth); err != nil { return ctx, err } } } } // continue return next(ctx, tx, simulate) }
-
权限初始化,见代码:irita/app/ante.go -> RegisterAccessControl()
func RegisterAccessControl(adminKeeper admin.Keeper) admin.Keeper { // permission auth adminKeeper.RegisterMsgAuth(&admin.MsgAddRoles{}, admin.RoleRootAdmin, admin.RolePermAdmin) adminKeeper.RegisterMsgAuth(&admin.MsgRemoveRoles{}, admin.RoleRootAdmin, admin.RolePermAdmin) // .....省略部分代码 // power user auth adminKeeper.RegisterMsgAuth(&tokentypes.MsgIssueToken{}, admin.RoleRootAdmin, admin.RolePowerUser) adminKeeper.RegisterMsgAuth(&nfttypes.MsgIssueDenom{}, admin.RoleRootAdmin, admin.RolePowerUser) adminKeeper.RegisterMsgAuth(&servicetypes.MsgDefineService{}, admin.RoleRootAdmin, admin.RolePowerUser) adminKeeper.RegisterMsgAuth(&servicetypes.MsgBindService{}, admin.RoleRootAdmin, admin.RolePowerUser) // upgrade auth adminKeeper.RegisterModuleAuth(upgradetypes.ModuleName, admin.RoleRootAdmin, admin.RoleNodeAdmin) return adminKeeper }
-
权限管理提供的功能
1). 添加权限:root权限不能再添加其他权限;只有root权限才能添加Perm权限;root权限不能通过此接口添加,只能初始化;通过
位运算
操作后存储权限;2). 删除权限:root权限不能被删除;只有root权限才能删除Perm权限;
3). 冻结账号:root权限的账号不能冻结;不能重复冻结账号;
4). 解冻账号:只有被冻结的账号才可以解冻;
三. 节点管理(x/node)
节点管理共有五个功能:
- 创建验证节点:验证节点凭证;以验证节点地址为key存储节点公钥;以验证节点的名字作为key存储节点Id;抽象了一个队列存储节点的创建,出块结束时更新验证节点;定义了一个钩子函数用于slashing模块;
- 更新验证节点:验证节点凭证;替换旧节点公钥;替换旧节点ID;替换队列中的旧节点,出块结束时更新验证节点;
- 删除验证节点:删除节点公钥、ID;删除队列中的节点,出块结束时更新验证节点;定义了一个钩子函数用于slashing模块;
- 添加观察节点:添加一个普通节点的交易(实际添加还有其他步骤),仅仅用来同步交易,不参与共识;
- 删除观察节点:删除普通节点的交易(若网络没有删除此普通节点,任然可同步交易);
四. 参数管理(x/params)
路径参数管理,也就是管理模块的,仅提供了一个功能用来更新模块路径名;
想要通过接口修改 minimum-gas-prices等参数,需自行实现接口,若想更改参数及时生效,需自行实行abci的 BeginBlocker 或 EndBlocker 接口
五. 系统运维(x/upgrade)
系统运维提供两个功能:
- 升级:只能通过设置某个时间点或者区块高度进行升级(会调用 cosmos-sdk 的 x/upgrade 模块:在已有升级计划时不能再次提交升级,除非取消原有升级;时间点和区块高度必须是未来的;x/upgrade 本身不触发任何事件,所有与提议相关的事件都通过x/gov模块发出。)
- 取消升级
六. 其他
6.1 积分制(Token)
irita实现了发行、增发、燃烧Token的功能,但是仅仅针对发行功能做了权限控制,其他功能的权限控制需自行实现
6.2 国密算法
国密算法(此功能是基于原生代码进行开发的)有两处地方需要用到:
- 交易签名,实现见:cosmos-sdk(replaced)/crypto/keys/sm2,
- 对数据做哈希,没有实现,交易签名时对msg进行哈希使用的是sha256算法
6.3 版本改动
来看看irita
基于原生cosmos-sdk
做了那些改动及优化,针对 v0.42.3-irita-210413 版本:
- 增加SM2国密算法和测试用例,但是在模拟计算签名消耗gas时,若没有传公钥,默认是以SM2算法的公钥计算的 <9eba0ad09d0930d0c357569ec6ae757d627ba322>
- 通过nodeId过滤peer <9f414689145bdde1a7e3ce5e6c420b102d746606>
再看 irita
基于原生tendermint
做了那些改动及优化,针对 v0.34.8-irita-210413 版本:
- 增加对SM2算法的公钥解析 <5319fafbb7962ec07eb0fe17d34f74e2ad312e68>