之前发了一个提案,但是对于提案获得的总HP是如何计算的有些不太确定。有人说就是按账户HP计算的,也有人说是和见证人投票一样规则是账户和见证人代理的和。
(图源 :pixabay)
尽管https://hivedao.com/ 的界面上是按账户+见证人代理
的总权重来排序的,但是万一界面就是仅仅这样显示而已呢?真要搞明白这个问题,还是要看代码。
好在这个代码还是很好找的,到database.cpp
中找到如下函数:
void database::_apply_block( const signed_block& next_block )
然后不难找到其中调用了process_proposals( note );
,我们再来看一下这个函数:
也就是说先创建一个sps_processor
类实例,然后在运行run
函数
我们可以在steem/chain/util/sps_processor.hpp
文件中找到类定义,并且在steem//libraries/chain/util/sps_processor.cpp
找到类的实现,而run
函数定义如下:
在make_payments()
函数中,我们会发现如下计算票数的语句:
而这个函数会去更新每个提案的票数:
更新单个提案的票数的计算函数如下:
而其中我用红框圈起来的地方,就是我们要找的答案了。其实注释写的挺明白了:
//If _voter has set proxy, then his votes aren’t taken into consideration
翻译过来就是:
如果投票者设置了代理(见证人票代理),那么他的票数不予考虑。
而后边的代码也证实了这样,就是没有设置投票代理的用户票数等同于投见证人的票数(权重)。
可能有点拗口,直白点说就是投提案和投见证人按一样的规则计算得票,这样说,大家应该都明白了吧。
当然了,对于就是想看提案总票数的我们来讲,没必要一个一个用户去计算然后再加到一起,直接调用API读取总票数就性了。比如我之前的提案:
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.list_proposals", "params":[["oflyhigh"], 1, "by_creator", "ascending", "all"], "id":1}' https://api.openhive.network
当前总得票数:"total_votes":"28438822824814612"
这个值是VESTS的整数表示,所以要先除了1000000
,然后在换算成HP,最终结果大致等于1400万HP左右,距离提案通过,还有一段不小的距离呢。
This page is synchronized from the post: ‘每天进步一点点:从代码中确认如何计算提案HP’