【精】EOS智能合约:system系统合约源码分析 (6)

下面继续介绍system合约的成员函数内容,
成员 | 权属 | 解释
--- | --- | ---
update_elected_producers | 私有函数 | 只有一个参数是时间戳,按照时间戳更新已入选的生产节点名单。
update_votes | 私有函数 | 更新投票信息。包含参数有投票者、代理、生产者投票内容,以及支持或反对的标识。
changebw | 私有函数 | 更改某账户的资源量,包含出资者、接收者、cpu资源量、net资源量,以及是否以转账的形式更改。即抵押资源量的token也属于接收者了。
get_default_parameters | 私有函数 | 获得默认参数
get_core_symbol | 私有函数 | 通过内存账户的token符号获得链上主币符号。
current_time_point | 私有函数 | 获得当前时间点time_point类型。
current_block_time | 私有函数 | 获得当前区块时间block_timestamp类型。
update_producer_votepay_share | 私有函数 | 更新生产者投票支付份额
update_total_votepay_share | 私有函数 | 更新总投票支付份额
propagate_weight_change | 私有函数 | 代理权重更改,传入投票者账户。

下面分析system合约的公共成员函数,
成员 | 权属 | 解释
--- | --- | ---
onblock | 公共函数 | 在producer_pay.cpp中实现,是由eosio创世账户发起,用于更新生产者生产区块信息以及上链的账号名称拍卖信息。传入时间戳和生产者
delegatebw | 公共函数 | 与私有函数changebw的参数完全相同,用于抵押资源的主要方法。
undelegatebw | 公共函数 | 与抵押函数相反,是用来解除抵押的方法。
buyram | 公共函数 | 为账户购买内存资源。有出资方
buyrambytes | 公共函数 | 上面是以token的方式购买内存资源,这一个是以内存量字节的方式购买。
sellram | 公共函数 | 卖出内存资源。
refund | 公共函数 | 在抵押动作未完成时,发起退款
regproducer | 公共函数 | 注册成为备用生产者。
unregprod | 公共函数 | 解除备用生产者的注册
setram | 公共函数 | 设置最大内存量,为链增加内存容量,注意只能增加不能降低。
voteproducer | 公共函数 | 为生产者投票,校验投票者签名,然后调用了私有函数update_votes函数。
regproxy | 公共函数 | 注册成为代理
setparams | 公共函数 | 设置链参数eosio::blockchain_parameters
claimrewards | 公共函数 | 生产者认领出块奖励
setpriv | 公共函数 | 设置账户是否为特权账户
rmvproducer | 公共函数 | 移除失效生产者并标记
bidname | 公共函数 | 拍卖账户名称

六、cpp实现精选 更新已入选生产节点

该功能是通过system合约的私有函数update_elected_producers实现。在voting.cpp中被定义实现。

1. /** 2. * @brief 更新已入选生产节点 3. * 4. * @param block_time 区块时间 5. */ 6. void system_contract::update_elected_producers( block_timestamp block_time ) { 7. _gstate.last_producer_schedule_update = block_time; // 将参数区块时间赋值给全局状态变量:最后计划出块更新时间 8. 9. auto idx = _producers.get_index<N(prototalvote)>(); // 获得producers表的索引prototalvote,该索引能够给producers表按照投票总数排序,详细分析见下一个部分。 10. 11. std::vector< std::pair<eosio::producer_key,uint16_t> > top_producers; // 声明有效出块节点集合。 12. top_producers.reserve(21); // 定义有效出块节点集合的数量为21。 13. // 从prototalvote索引结果集中筛选出21个插入top_producers集合。这些生产者要满足是active的同时总票数大于0(最基本的校验)。 14. for ( auto it = idx.cbegin(); it != idx.cend() && top_producers.size() < 21 && 0 < it->total_votes && it->active(); ++it ) { 15. top_producers.emplace_back( std::pair<eosio::producer_key,uint16_t>({{it->owner, it->producer_key}, it->location}) ); 16. } 17. // 如果有效出块集合的数量小于全局标志位:最后计划生产者数量(见下方),则中断返回。(适用于总数不足21个节点的情况) 18. if ( top_producers.size() < _gstate.last_producer_schedule_size ) { 19. return; 20. } 21. // 根据名称为top_producers排序。 22. std::sort( top_producers.begin(), top_producers.end() ); 23. // 新建producers集合,copy一份top_producers 24. std::vector<eosio::producer_key> producers; // 声明生产者集合 25. producers.reserve(top_producers.size()); // 将producers设置为与top_producers一样大小。 26. for( const auto& item : top_producers ) // 遍历copy元素 27. producers.push_back(item.first); 28. 29. bytes packed_schedule = pack(producers); // 将超级节点集合打包成字节 30. 31. if( set_proposed_producers( packed_schedule.data(), packed_schedule.size() ) >= 0 ) { // 设置计划生产者,更新最后计划生产者数量 32. _gstate.last_producer_schedule_size = static_cast<decltype(_gstate.last_producer_schedule_size)>( top_producers.size() ); 33. } 34. } 二级索引排序

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsspgz.html