我的网站cutehive.com,一个最主要的功能就是见证人列表,相比于其它HIVE上的见证人列表,我这个多了很多特色,比如说见证人收益的估算功能。
(图源 :pixabay)
我没事就刷刷这个见证人列表,看看自己的见证人收益能不能够得上VPS的成本,哈哈。
前晚硬分叉(HF28)时,我一直在刷新着网站cutehive.com的见证人列表,这次倒不是为了看收益,而是为了看分叉后各个见证人有没有正常出块。
好在TOP20全部出块正常,大部分备选节点也都在升级后的链上正常出块——包括我自己。只有小部分见证人没能及时升级hived,那就意味着它们的节点没法在升级后的主网上出块。
我曾在HF28前两三天联系了一些备选节点的主人,告诉了它们关于硬分叉的消息,以及如果没能在HF28前升级到新版hived,将会无法在升级后的主网出块的事实。但是HF28后,我看我联系的这些见证人,还是在运行着旧版本,那就没办法了,毕竟个人有各自的选择。
升级后我还注意到一个问题,那就是我引以为傲的见证人收益估算,和见证人实际收益,完全不相符。
分叉前,我每出一次块,可以得到1.864 HP的奖励
分叉后,我每出一次块,可以得到1.381 HP的奖励
由于HF28中共识变化之一就是将Treasury中的HBD从通胀计算中移除,而无论作者(点赞)奖励,还是见证人奖励都是从系统通胀中来的,所以见证人出块奖励变低是正常也是期望中的变化。
但是我刷新了一下我的见证人列表,怎么收益和分叉前,没什么区别呢?
分叉前截图
分叉后截图
而分叉后,计算出来的我和其它见证人的出块奖励,明显和区块链浏览器中看到的出块实际奖励大相径庭!
我也是用程序计算出来的,不是缓存值也不是读那个数据库读出来的数据,那不应该和实际数据有太大的差异呀?哪里出了问题呢?
这时正好看到见证人频道的一些成员在讨论HF28后的各种变化,包括将Treasury中的HBD从通胀计算中移除。
这下一下子就明白了,因为我就是使用的从区块链上读出来的virtual_supply,现在问题是virtual_supply的数值还包含DHF中的HBD,而计算奖励时,却把DHF中的HBD刨除在外,这样分叉后依旧用virtual_supply来计算见证人出块奖励当然会出错啦。
知道了问题所在,改起来就简单啦。
这次我采取的方式是不直接使用读出来的virtual_supply,而是通过读出current_supply、current_hbd_supply、median_price,以及treasury_hbd,通过如下公式计算发放奖励时的总供应量:
supply = current_supply + (current_hbd_supply - treasury_hbd) / median_price
没错,HF28之后,用这个数值替代之前的virtual_supply,再进行计算就OK啦。
更新一下修改后的TOP20见证人的预估收益,嗯,这就和实际奖励几乎一致了。
其实不止是见证人列表计算出块奖励出了问题,分叉后,网站cutehive.com好几处功能出BUG了(比如有些节点分叉后彻底DOWN掉无法使用等),好在我都及时发现及时修复了。
感慨一下,其实这些事情应该在分叉前提前去做,比如搞清楚分叉都有哪些共识变化,会对程序产生那样的影响,而不是向救火队员那样,着火了才来处理。
不过转念一下,Cloudflare那么大体量的公司也没做到事先就排查、预判式解决各种问题,何况我这个小站乎?更何况我可是在分叉当晚就把问题都搞定了呢,比Cloudflare的工程师高效多得多呢。😀