每天进步一点点:学习一下HF25后HBD利息发放相关内容

在之前的帖子《HIVE硬分叉25(HardFork 25)要来啦 & 共识变化(Consensus changes)》,我曾提及,HIVE HF25一个重要的共识变化,就是仅对存款账户中的HBD发放利息

image.png
(图源 :pixabay)

而这这之前,HBD的持有者,无论是将HBD放到余额账户中还是将HBD转到存款账户中,都是可以得到HBD利息的。

那么HBD的利息是如何发放的呢?在HF25之前,HBD利息的发放有两种方式,一种是针对余额账户;一种是针对存款账户。

针对余额账户

针对HBD余额的利息发放是在database::modify_balance中实现的,每次涉及到需要调整账户余额时(database::adjust_balance),database::modify_balance都会被调用。

database::modify_balance可以调整三类资产的余额,分别是:

  • HIVE
  • HBD
  • VESTS (HIVE POWER)

在HF25之前,修改账户HBD余额时,就会处理利息的发放。

大致的流程是:根据余额账户的HBD金额以及持有时间(当前时间-上次发放利息的时间)计算累积持有时间(可以理解成余额和时间的累积值)以及当前利率计算出应得利息,加到账户中。

而我们写文章获取奖励、转账、内部市场交易等都会触发余额变动,所以都会触发这个利息计算过程,当然了,为了效率,如果距离上次触发不足30天,那么只累积计算累积持有时间并不直接发放利息。

这个间隔时间在这里定义:

#define HIVE_HBD_INTEREST_COMPOUND_INTERVAL_SEC (60*60*24*30)

而HF 25,在处理HBD余额利息发放/计算累积时间时,增加了一个判断,将:

if(a.hbd_seconds_last_update != head_block_time() )

修改为:

if( has_hardfork(HIVE_HARDFORK_1_25) == false && a.hbd_seconds_last_update != head_block_time() )

所以,在HF 25之后,HBD余额将不再计算利息了。如果你在HF之前有HBD利息尚未发放,那么很遗憾,这部分利息将再也不会发放了。

我看了一下我的账户:

image.png

唉,如果能挨到7月5号以后硬分叉,我就可以拿到一笔余额利息了,好大一笔啊,心疼ing。

针对存款账户

好了,余额账户的HBD没有利息可赚了,我们来看看存款账户吧。存款账户只有两种资产:

  • HIVE
  • HBD

而HIVE是没有利息的。存款账户HBD的利息计算和余额账户利息计算大同小异,在database::adjust_savings_balance中计算&发放。

判断的第一个条件:

if( a.savings_hbd_seconds_last_update != head_block_time() )

好像除非一个块中做了N个同样的操作,否则这个条件是不是可以忽略呢?好吧,先不管这个。接下来同样是计算累积时间:

acnt.savings_hbd_seconds += fc::uint128_t(a.get_hbd_savings().amount.value) * (head_block_time() - a.savings_hbd_seconds_last_update).to_seconds();
acnt.savings_hbd_seconds_last_update = head_block_time();

也就是说这个累积时间是余额和时间的累积值。然后同样是判断距离上次发放时间是达到一个月,这个时间间隔的定义上边已经说啦,就是HIVE_HBD_INTEREST_COMPOUND_INTERVAL_SEC

如果符合条件(累积值大于0,时间达到一个月以上),那么按当前利率计算利息并发放到账户中。

除了上述内容以外,HBD存款账户的利息发放的触发与HBD余额利息发放的触发大不相同。HBD存款账户的利息发放将由以瞎方式触发:

将HBD转入存款账户: transfer_to_savings_evaluator::do_apply
从存款账户转出HBD: transfer_from_savings_evaluator::do_apply
取消从存款账户转出HBD: cancel_transfer_from_savings_evaluator::do_apply

所以,原则上,我们可以控制存款账户的利息何时发放,这多少会给我们留下一点想象力空间,你想到了什么吗?😏

命令行钱包相关操作

因为HBD只在存款账户才有利息,所以如果有不打算变现或者动用的HBD,放入存款账户会更加合算一些。

命令行钱包中相关操作如下:

transfer_to_savings(const string & from, const string & to, const condenser_api::legacy_asset & amount, const string & memo, bool broadcast)

以我的账户为例:

transfer_to_savings oflyhigh oflyhigh "1.000 HBD" "" true

上述指令将会把1 HBD存入存款账户,然后就可以等着吃利息啦。如果HBD兑美元保持稳定的话,7%的年化(以后可能会调整),还真是一个不错的选择呢!

相关链接

H2
H3
H4
3 columns
2 columns
1 column
12 Comments
Ecency