源代码解读 [EOS 源码分析] 29 - eosio.system 合约源码分析 (eosio.system.hpp)(2)

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

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

img

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

producer_info

producer_info表保存已注册的区块生产者(出块节点)信息,定义如下:

img

字段含义如下:

  • owner:拥有该节点的EOS账户名;

  • total_votes:获得的投票数,是根据算法计算出的投票数,不是EOS数量;

  • producer_key:区块生产者公钥,注意不是owner账户的公钥;

  • is_active:是否活跃;

  • url:节点的主页地址;

  • unpaid_blocks:未支付的区块数,节点通过claim获取出块奖励,这也是EOS通证的增发方式;

  • last_claim_time:上次领取出块奖励的时间;

  • location:节点位置代号。

使用cleos查询Multi-index表数据时,使用的表名是producers

typedef eosio::multi_index< "producers"_n, producer_info,
                           indexed_by<"prototalvote"_n, const_mem_fun<producer_info, double, &producer_info::by_votes>  >
                         > producers_table;

producer_info2

producer_info2表是producer_info表的扩展,用于记录EOS节点的投票奖励权重,增加了两个字段:

  • votepay_share:投票奖励权重;

  • last_votepay_share_update:上次更新时间。

producer_info2表的表名被指定为producers2

typedef eosio::multi_index< "producers2"_n, producer_info2 > producers_table2;

使用cleos查询producers2表的示例如下:

img

到这里发现了一个规律,包括上一篇文章介绍的global、global2、global3表,和这里的producers、producers2表,每当原数据表需要扩展新字段时,都是新建一张表,而不是在原表上增加。

这是因为,如果EOS合约的Multi-index表中已经有数据了,想要再向其中添加新字段只能先清空表中的数据,为了不影响链上已经运行的数据,这里采用了新增一张数据表的方式;

还有一种方法理论上可以解决这个问题,就是把旧表中的数据同步到新增了字段的新表中,但要求同步时旧表中的数据是相对稳定的,即停机维护,而这在已经处于运行状态的智能合约上不太可行,除非在同步数据期间没有人调用此合约而产生新数据。

voter_info

voter_info表保存投票者和投票信息,定义如下:

img

字段含义如下:

  • owner:投票者;

  • proxy:owner的投票代理者;

  • producers:已投的节点列表,投票方式选择代理或直接投节点二选一,即proxy和producers同时只会有一个字段有值;

  • staked:抵押的EOS数量(带精度);

  • last_vote_weight:上次投票权重,如果一段时间内不重新投票,投票权重会按照算法逐渐衰减;

  • proxied_vote_weight:代理投票权重(投票代理此值才会大于0);

  • is_proxy:owner是否是投票代理;

  • flags1:标识位,可以设置为这3个枚举值之一:ram_managed、net_managed、cpu_managed。

使用的查询表名是voters

typedef eosio::multi_index< "voters"_n, voter_info >  voters_table;

使用cleos查询voters表的示例如下:

img

eosio.system.hpp中还声明和定义了很多内容,下一篇文章继续介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

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