源代码解读 [EOS 源码分析] 31 - eosio.system 合约基类 & native.hpp 权限相关结构体

Admin · 2019年12月21日 · 24 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

接上篇,继续分析eosio.system.hpp头文件。

native.hpp

EOSIO的系统合约类是system_contract,声明在eosio.system.hpp头文件中,继承自native类。

native类定义在native.hpp(eosio.contracts/contracts/eosio.system/include/eosio.system/native.hpp)头文件中,下面从native.hpp的源码开始分析。

首先是两个用于节点升级EOSIO版本到v1.8.x时的共识协议升级的函数:

img

preactivate_feature、is_feature_activated,两个函数在wasm_interface中实现,分别用于激活协议特征和检查协议特征是否被激活。

native.hpp中权限相关的结构体

native.hpp然后定义了命名空间eosiosystem,内部定义了一系列权限、区块相关的结构体。

1、权限等级权重(代码中省略了序列化宏EOSLIB_SERIALIZE,下同):

struct permission_level_weight {
  permission_level  permission;
  uint16_t          weight;
};

2、公钥权重

struct key_weight {
  eosio::public_key  key;
  uint16_t           weight;
};

3、延时时间权重

struct wait_weight {
  uint32_t           wait_sec;
  uint16_t           weight;
};

一个EOS账户的权限由以上权重中的一种或多种组成,每种权重又可能有一个或多个,EOS权限有一个权重阈值,如果某个权重或几个权重之和达到阈值就可以执行相应的操作。

cleos get account命令为例:

img

alice账户的owner权限,阈值是1,只有一个key_weight类型的权重也是1,EOS6W8V9TguKRMWGrGKcfBPNAPSdk1asKL5QnwbFZV7fJyNMNRLN5这个公钥就可以执行alice账户的owner权限相关操作;

alice账户的active权限,阈值是1,有两个权重均为1,类型分别是key_weightpermission_level_weight,两个权重均能单独执行alice账户的active权限相关操作。

4、权力(authority)

struct authority {
  uint32_t                              threshold = 0;
  std::vector<key_weight>               keys;
  std::vector<permission_level_weight>  accounts;
  std::vector<wait_weight>              waits;
};

这里使用了authority这个词,注意和permission的区别,authority表示某种权力,permission表示对某种权力的授权或许可,permission的范围更大(permission > authority > weight)。

struct authority包含了一个阈值字段threshold,和3种权重的数组,使用cleos get account命令查询账户信息时添加 -j 选项以JSON格式展示信息,可以看到EOS账户的权限结构:

img

permissions字段下有两个permission类型的对象owner和active,后者的required_auth字段就是authority对象的JSON格式。

native.hpp中还定义和声明了更多结构体和类,下一篇文章继续介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 17:50
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册