每天进步一点点:从代码中确认如何计算提案HP

in #cn4 years ago

之前发了一个提案,但是对于提案获得的总HP是如何计算的有些不太确定。有人说就是按账户HP计算的,也有人说是和见证人投票一样规则是账户和见证人代理的和。

image.png
(图源 :pixabay)

尽管https://hivedao.com/ 的界面上是按账户+见证人代理的总权重来排序的,但是万一界面就是仅仅这样显示而已呢?真要搞明白这个问题,还是要看代码。

好在这个代码还是很好找的,到database.cpp中找到如下函数:

void database::_apply_block( const signed_block& next_block )

然后不难找到其中调用了process_proposals( note );,我们再来看一下这个函数:

image.png

也就是说先创建一个sps_processor类实例,然后在运行run函数

我们可以在steem/chain/util/sps_processor.hpp文件中找到类定义,并且在steem//libraries/chain/util/sps_processor.cpp找到类的实现,而run函数定义如下:

image.png

make_payments()函数中,我们会发现如下计算票数的语句:

image.png

而这个函数会去更新每个提案的票数:

image.png

更新单个提案的票数的计算函数如下:

image.png

而其中我用红框圈起来的地方,就是我们要找的答案了。其实注释写的挺明白了:

//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左右,距离提案通过,还有一段不小的距离呢。

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.033
BTC 63732.43
ETH 3135.73
USDT 1.00
SBD 3.83