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

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

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

img

eosio.system合约是EOS的系统合约,在EOS区块链启动之初就被部署,提供很多系统级别的功能,包括资源抵押和购买RAM、投票、注册区块生产者和领取奖励、短账户名拍卖、REX市场等。这篇文章开始分析eosio.system合约的源码,了解这些功能的实现细节。

eosio.system.hpp

首先来看eosio.system合约的主要头文件eosio.system.hpp(eosio.contracts/contracts/eosio.system/include/eosio.system/eosio.system.hpp),包含了如下其他头文件:

img

EOS智能合约开发基于eosio.cdteosiolib库,这里使用include包含了很多eosiolib库的头文件,同时还包含了一些C++标准库头文件。

接下来是一个宏定义:

img

CHANNEL_RAM_AND_NAMEBID_FEES_TO_REX宏是一个通道,确定是否将ramfee(RAM交易手续费)和namebid(短账户名竞拍)产生的收益引流到REX pool,默认值是1,表示允许;将该宏的值设置为0会关闭通道。

接下来是eosio.system.hpp的主体部分,类、函数和常量声明在eosiosystem命名空间中。

name_bid

name_bid结构体用于保存短账户名竞拍记录:

img

使用了[[eosio::table]]属性,表示它是一张Multi-index数据表,每个字段含义如下:

  • newname:待竞拍的账户名;

  • high_bidder:目前出价最高的竞拍者账户名;

  • high_bid:目前竞拍价格;

  • last_bid_time:最近出价时间。

通过primary_key函数定义了主键newname,因为主键只能使用uint64_t类型,所以primary_key函数返回的值是newname.value;

还定义了二级索引by_high_bid,可以按出价高低进行排序。

使用cleos get table命令可以获取到链上Multi-index表中的数据:

img

要注意这里定义结构体使用的类名是name_bid,但使用cleos命令查询数据时使用的表名是namebids,这是因为ABItables中定义的表名是namebids。

img

注意eosio.system.abi中name和type字段是不同的值,表名在定义Multi-index表时指定:

img

自己编写合约时这两个字段一般使用相同的值:

img

上图是币圈信息站项目的智能合约使用Multi-index表。

bid_refund

bid_refund表用来保存竞拍退款记录,数据结构如下:

img

两个字段bidderamount,分别表示竞拍人和退款金额。

这张Multi-index表也被重命名了:

typedef eosio::multi_index< "bidrefunds"_n, bid_refund > bid_refund_table;

目前没有数据记录:

img

系统全局状态参数

EOS系统全局状态参数使用eosio_global_state、eosio_global_state2、eosio_global_state3三张表来保存,以eosio_global_state为例,定义如下:

img

eosio_global_state继承自eosio::blockchain_parameters,后者定义在eosiolib库的privileged.hpp中,保存EOS区块链全局参数,eosio_global_state扩展了这些参数;

EOSIO v1.1.0和v1.3版本又扩展了两次全局参数,分别保存在eosio_global_state2eosio_global_state3中。

这三张全局表都是使用eosio::singleton定义的单例表:

/**
 * Global state singleton added in version 1.0
 */
typedef eosio::singleton< "global"_n, eosio_global_state >   global_state_singleton;
/**
 * Global state singleton added in version 1.1.0
 */
typedef eosio::singleton< "global2"_n, eosio_global_state2 > global_state2_singleton;
/**
 * Global state singleton added in version 1.3
 */
typedef eosio::singleton< "global3"_n, eosio_global_state3 > global_state3_singleton;

单例表只保存一条数据,这条数据本身可以看做是一个键值对Map。

使用cleos命令可以查询这些系统全局参数:

img

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

更多内容

币圈信息站开发目录

EOS开发系列目录

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