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开发系列目录 —- 编译者/作者:松果 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
【EOS源码分析】28 - eosio.system合约源码分析(eosio.system.hpp)
2020-06-08 松果 来源:区块链网络
LOADING...
相关阅读:
- 8.3证券日报:已有不少券商开始探索区块链赋能证券业务领域2020-08-03
- 币圈有道:(8-3)个体是渺小的比特币今日行情分析2020-08-03
- 千万别看轰动全球的ALOKEX交易所揭秘ALOKEX合约核心技术看完的人都疯了2020-08-03
- 社区生态?|P网Poloniex比特币永续合约模拟赛再次开战总奖池高达22,500US2020-08-03
- 8月3比特币以太坊柚子等行情分析操作建议2020-08-03