在硬叉20(HF20)时,关于SBD_PRINT_RATE
有一个小BUG,导致无论SBD的占比有多高,SBD_PRINT_RATE
也不会到达0%,当SBD占比无限趋于10%时,SBD_PRINT_RATE
值为1%。
(图源 :pexels.com)
虽然这个小BUG无伤大雅,但是当发放文章奖励时,看着那个0.00x SBD的零头被每天发放,对强迫症而言还是比较闹心的。
好消息是,HF21/HF22之后,尽管SBD的占比还是无限趋近10%,但是SBD_PRINT_RATE
已经变成了0,所以我们的文章奖励中看不到那些SBD零头啦。
代码
那么这个小BUG是如何被修复的呢?我特意去查了一下代码:
计算SBD_PRINT_RATE
的关键,在于计算SBD的占比,HF21/22中,计算SBD的代码如下:
percent_sbd = uint16_t( ( ( fc::uint128_t( ( dgp.current_sbd_supply * get_feed_history().current_median_history ).amount.value ) * STEEM_100_PERCENT + dgp.virtual_supply.amount.value/2 ) / dgp.virtual_supply.amount.value ).to_uint64() );
逻辑差异
代码看起来有点乱,我抽取主要逻辑简化描述一下,HF21/22中,逻辑如下:
percent_sbd = int((sbd_steem*STEEM_100_PERCENT + virtual_supply/2)/ virtual_supply)
而在之前硬分叉版本中(HF20等),逻辑如下:
percent_sbd = int((sbd_steem*STEEM_100_PERCENT)/ virtual_supply)
其中STEEM_100_PERCENT
的值为10000
#define STEEM_100_PERCENT 10000
也就是说,SBD的占比计算:
- HF21之前是折算成STEEM的SBD占总供应量的比例乘以10000
- 现在则是在上述数值基础上加上0.5
按照之前的计算方式,尽管实际比例无限趋近于10%(1000),但是由于喂价机制以及取整的缘故,这个值都不可能等于10%(1000),所以导致了SBD_PRINT_RATE
最低值只能是1%,而不可能是0%。
而现在,当实际比例趋近于10%(9.995%)时,因为加上了0.005%(0.5/10000),所以计算出来percent_sbd
为10%,就保证了SBD_PRINT_RATE
为零。
模拟验证
让我们模拟HF20以及HF21/22的机制分别实际计算一下SBD的占比。
HF20
HF21/22
可见按照新机制计算的结果会去掉SBD_PRINT_RATE
中的毛刺,对用户更加友好。更多详情,请参考文末链接吧。
相关链接
- https://github.com/steemit/steem/blob/v0.22.1/libraries/chain/database.cpp
- Fix sbd print rate #3415
sbd_print_rate
is 1% in the haircut #3409- 1% SBD print rate despite the haircut #3184
https://steemit.com/~witnesses type in
oflyhigh
and click VOTE
Vote @oflyhigh via Steemconnect
Thank you!
This page is synchronized from the post: ‘讨厌的SBD零头不见啦——HF21/22中已经修复了SBD 发行率的BUG’