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

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

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Hi! Did you know that steemit.com is now censoring users and posts based on their opinions?
All the posts of these users are gone!
https://github.com/steemit/condenser/commit/3394af78127bdd8d037c2d49983b7b9491397296

Here's a list of some banned users:
'roelandp', 'blocktrades', 'anyx', 'ausbitbank', 'gtg', 'themarkymark', 'lukestokes.mhth', 'netuoso', 'innerhive'
See anyone you recognize? There could be more, they also have a remote IP ban list.

Will you be censored next?