LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 【EOS源码分析】28 - eosio.system合约源码分析(eosio.system.hpp)

【EOS源码分析】28 - eosio.system合约源码分析(eosio.system.hpp)

2020-06-08 松果 来源:区块链网络


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),包含了如下其他头文件:


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

接下来是一个宏定义:


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

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

name_bid

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


使用了[[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表中的数据:


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


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


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


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

bid_refund

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


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

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

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

目前没有数据记录:


系统全局状态参数

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


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

EOSIO v1.1.0和v1.3版本又扩展了两次全局参数,分别保存在eosio_global_state2和eosio_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命令可以查询这些系统全局参数:


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

更多内容

币圈信息站开发目录

EOS开发系列目录

—-

编译者/作者:松果

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...