讨厌的SBD零头不见啦——HF21/22中已经修复了SBD 发行率的BUG
在硬叉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!
Thank you so much for participating in the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.01% upvote! Together, let’s change the world!