学习一下治理投票的失效机制

在之前的帖子《HIVE硬分叉25(HardFork 25)要来啦 & 共识变化(Consensus changes)》,我曾提及,HIVE HF25一个重要的共识变化,就是治理投票的失效机制

image.png
(图源 :pixabay)

治理相关投票

再说具体的技术细节之前,我们先来说一下HIVE上都有哪些治理相关的投票:

  • 见证人投票
  • 见证人代理
  • 提案投票

治理投票的失效

当一个用户很久(365天)没有参加过治理投票,那么他之前所有和治理相关的投票都会被重置(即清零),这个是在database::remove_expired_governance_votes中实现的,每应用一个区块database::_apply_block都会进行一次检查。

这个函数代码如下:

Reveal spoiler

image.png

我们可以看出,当一个用户触发治理投票失效(acc_it->get_governance_vote_expiration_ts() <= now),就会:

  • 清空提案投票、清空代理票、清空见证人票
  • 清空代理,设置失效时间为永久(time_point_sec::maximum();

失效时间的更新

那么如何避免触发治理投票失效呢?简单来讲就是通过进行治理相关投票,来更新失效时间。也就是说,一年以内至少投一次见证人票(或者设置代理)或者提案投票。

代码实现,在account_witness_vote_evaluator::do_applyaccount_witness_proxy_evaluator::do_applyupdate_proposal_votes_evaluator::do_apply这三个操作中,都调用了如下语句:

_db.modify( account, [&]( account_object& a) { a.update_governance_vote_expiration_ts(_db.head_block_time()); });

而更新失效时间的函数如下:

Reveal spoiler

image.png

关于失效代码

上述的失效代码让我有些晕,尤其是这段里的逻辑:

Reveal spoiler

image.png

我原本理解,HF25之后,一年内没投治理票,治理票就在一年后失效;而HF25之前,一年内没更新治理票的,治理票在HF25发生时失效;HF25之前,一年内投治理票的,治理票失效时间为投票时间加上一年。

总之,治理票失效时间不应该超过1年以上。所以上述代码应该改成:

      void update_governance_vote_expiration_ts(const time_point_sec vote_time)
      {
        governance_vote_expiration_ts = vote_time + HIVE_GOVERNANCE_VOTE_EXPIRATION_PERIOD;
        if (governance_vote_expiration_ts < fc::time_point_sec(HIVE_HARDFORK_1_25_TIME))
        {
          governance_vote_expiration_ts = fc::time_point_sec(HIVE_HARDFORK_1_25_TIME);
        }
      }

类似这样才对呀?

唉,不过我相信肯定是我迷糊了,但是我实在理解不了我读自己账户治理票失效时间是如下值:

"governance_vote_expiration_ts": "2022-10-09T00:35:27",

唉,回头向大神们请教一下吧。😳估计是我哪块没想明白。

Sort:  

向大神请教的结论

其中:

const int64_t DIVIDER = HIVE_HARDFORK_1_25_MAX_OLD_GOVERNANCE_VOTE_EXPIRE_SHIFT.to_seconds();
governance_vote_expiration_ts = HARDFORK_1_25_FIRST_GOVERNANCE_VOTE_EXPIRE_TIMESTAMP + fc::seconds(governance_vote_expiration_ts.sec_since_epoch() % DIVIDER);

这个求余操作是为了避免到期时间集中,将其分散到一个时间窗内处理。这样做可以避免区块链性能受到影响。

唯独

#define HARDFORK_1_25_FIRST_GOVERNANCE_VOTE_EXPIRE_TIMESTAMP (fc::time_point_sec(HIVE_HARDFORK_1_25_TIME) + HIVE_GOVERNANCE_VOTE_EXPIRATION_PERIOD)

我们都觉得设置的有些不合理
改成如下代码就好了:

#define HARDFORK_1_25_FIRST_GOVERNANCE_VOTE_EXPIRE_TIMESTAMP (fc::time_point_sec(HIVE_HARDFORK_1_25_TIME) )

不过也没啥大不了的,一年后一切就都正常了
(感觉有点久远呢,唉)

另外还有就是:

#define HIVE_HARDFORK_1_25_MAX_OLD_GOVERNANCE_VOTE_EXPIRE_SHIFT (fc::microseconds(HIVE_GOVERNANCE_VOTE_EXPIRATION_PERIOD.count()/2))

这个值我个人觉得改成1个月就挺好,没必要用半年,毕竟一年以上没动治理票的其实应该不太多,就算有几十万个用户没动,1个月约有86W个区块产生,处理几十万用户绰绰有余了。

我坚信,HIVE会越来越好