在之前的帖子《HIVE硬分叉25(HardFork 25)要来啦 & 共识变化(Consensus changes)》,我曾提及,HIVE HF25一个重要的共识变化,就是治理投票的失效机制。
(图源 :pixabay)
治理相关投票
再说具体的技术细节之前,我们先来说一下HIVE上都有哪些治理相关的投票:
- 见证人投票
- 见证人代理
- 提案投票
治理投票的失效
当一个用户很久(365天)没有参加过治理投票,那么他之前所有和治理相关的投票都会被重置(即清零),这个是在database::remove_expired_governance_votes
中实现的,每应用一个区块database::_apply_block
都会进行一次检查。
这个函数代码如下:
Reveal spoiler
我们可以看出,当一个用户触发治理投票失效(acc_it->get_governance_vote_expiration_ts() <= now
),就会:
- 清空提案投票、清空代理票、清空见证人票
- 清空代理,设置失效时间为永久(
time_point_sec::maximum();
)
失效时间的更新
那么如何避免触发治理投票失效呢?简单来讲就是通过进行治理相关投票,来更新失效时间。也就是说,一年以内至少投一次见证人票(或者设置代理)或者提案投票。
代码实现,在account_witness_vote_evaluator::do_apply
、account_witness_proxy_evaluator::do_apply
、update_proposal_votes_evaluator::do_apply
这三个操作中,都调用了如下语句:
_db.modify( account, [&]( account_object& a) { a.update_governance_vote_expiration_ts(_db.head_block_time()); });
而更新失效时间的函数如下:
Reveal spoiler
关于失效代码
上述的失效代码让我有些晕,尤其是这段里的逻辑:
Reveal spoiler
我原本理解,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",
唉,回头向大神们请教一下吧。😳估计是我哪块没想明白。
向大神请教的结论
其中:
这个求余操作是为了避免到期时间集中,将其分散到一个时间窗内处理。这样做可以避免区块链性能受到影响。
唯独
我们都觉得设置的有些不合理
改成如下代码就好了:
不过也没啥大不了的,一年后一切就都正常了
(感觉有点久远呢,唉)
另外还有就是:
这个值我个人觉得改成1个月就挺好,没必要用半年,毕竟一年以上没动治理票的其实应该不太多,就算有几十万个用户没动,1个月约有86W个区块产生,处理几十万用户绰绰有余了。
我坚信,HIVE会越来越好