源代码解读 [EOS 源码分析] 33 - eosio.system.hpp 合约类 system_contract 分析

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

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

img

上一篇文章介绍了eosio.system合约类system_contract的基类native所在的头文件native.hpp,这篇文章回到eosio.system.hpp,介绍其中声明的合约类system_contract。

system_contract

system_contract类继承自native类,是EOS系统合约的实现类,system_contract首先声明了一系列私有成员变量

img

都是前几篇文章介绍过的Multi-index表对象实例,只有rammarket还没有介绍过,它是exchange_state表结构的表名,exchange_state是使用Bancor算法的市场抽象,目前用于RAM交易市场,后续再细讲这部分内容。

然后是公有成员变量的定义和初始化:

img

static表示这些变量是类的成员变量,而不是属于某个具体对象;

constexpr类型便于编译器验证变量的值是否是一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。

这里定义的常量主要是一些EOS系统账户名和用于RAM交易市场和Bancor算法的代币符号,下面回顾一下EOS系统账户名的含义:

  • eosio(根账户,部署系统合约的账户)

  • eosio.token(管理EOS通证的账户)

  • eosio.ram(RAM交易管理账户)

  • eosio.ramfee(RAM交易手续费管理账户)

  • eosio.stake(抵押的EOS管理账户)

  • eosio.bpay(节点出块奖励的代管账户,EOS每年增发5%的20%的25%会先转到这个账户)

  • eosio.vpay(节点获得投票奖励的代管账户,EOS每年增发5%的20%的75%会先转到这个账户)

  • eosio.names(短账户名竞拍管理账户)

  • eosio.saving(增发EOS临时存放账户,EOS每年增发5%的80%放在此账户)

  • eosio.rex(CPU/NET资源交易所管理账户)

  • eosio.null(不需要权限的账户)

  • eosio.prods(自动管理的代表21个超级节点的账户)

  • eosio.msig(多重签名管理账户)

eosio.system Action

system_contract类中接下来声明了公有和私有的成员函数,这些公有的成员函数就是eosio.system合约的Action

img

REX资源交易所相关的Action在之前的几篇文章【EOSREX】源码分析【EOSREX】REX深入研究【EOSREX】REX的数据状态【EOSREX】REX相关的cleos命令中介绍过,点击链接可查看。

这里简要介绍其他Action的主要功能:

  • init:初始化EOSIO系统相关功能,主要是RAM市场和REX资源交易所,需要_self的操作权限,即只有系统账户才能调用此Action,普通用户无法调用;

  • onblock:更新区块生产信息和短账户名拍卖信息,在producer_pay.cpp中实现,同样需要_self的操作权限;

  • setalimits:设置账户的资源使用上限,包括RAM/CPU/NET,需要_self的操作权限;

  • setacctram:设置账户的RAM使用上限,需要_self的操作权限;

  • setacctnet:设置账户的网络资源使用上限,需要_self的操作权限;

  • setacctcpu:设置账户的计算资源使用上限,需要_self的操作权限;

  • activate:激活新的协议特征,用于EOSIO v1.8.x共识协议升级,需要_self的操作权限;

  • delegatebw:抵押EOS到CPU/NET资源;

  • undelegatebw:解抵押EOS到CPU/NET资源;

  • buyram:购买内存资源,单位是EOS;

  • buyrambytes:购买内存资源,单位是字节;

  • sellram:出售内存资源;

  • refund:解抵押CPU/NET资源的前置条件,即72小时后退还EOS的限制,和undelegatebw一起构成完整的解抵押流程;

  • regproducer:注册成为区块生产者;

  • unregprod:取消区块生产者的注册;

  • setram:设置EOS区块链的内存总量,只能增加,需要_self的操作权限(目前RAM总量133GB左右,合约代码支持扩展到1PB,即1048576GB);

  • setramrate:设置RAM总量线性扩容时每个区块的RAM增长量,需要_self的操作权限(目前每产生一个区块RAM总量增加1KB,通过微调实现每年64GB的扩容速度);

  • voteproducer:为区块生产者投票;

  • regproxy:注册成为投票代理;

  • setparams:设置EOS区块链的全局参数,需要_self的操作权限;

  • claimrewards:区块生产者领取出块奖励;

  • setpriv:设置账户是否为特权账户,需要_self的操作权限;

  • rmvproducer:移除无效的区块生产者,需要_self的操作权限;

  • updtrevision:更新全局参数revision,存于global2表中,需要_self的操作权限;

  • bidname:竞拍短账户名;

  • bidrefund:竞拍短账户名退款。

system_contract类中声明的私有成员函数的主要作用是被以上Action调用,后续介绍一些Action的业务实现细节时,再与其函数定义一起介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

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