跳到主要内容

持久状态

节点定期存储区块链状态的快照。每个状态都在某个主链区块创建,并且具有一定的TTL(生存时间)。区块和TTL的选择使用以下算法:

只有关键区块可以被选择。一个区块有一个时间戳ts。时间段的长度为2^17秒(大约1.5天)。时间戳ts的区块的时间段为x = floor(ts / 2^17)。每个时间段的第一个关键区块被选择用来创建持久状态。

时间段x的状态的TTL等于2^(18 + ctz(x)),其中ctz(x)x的二进制表示中的尾随零的数量(即最大的y使得x可以被2^y整除)。

这意味着每1.5天会创建一个持久状态,其中一半的状态具有2^18秒(3天)的TTL,剩余状态的一半具有2^19秒(6天)的TTL,依此类推。

2022年有以下长期(至少3个月)的持久状态(未来的时间是大致的):

区块序列号区块时间TTL过期时间
89307062022-02-07 01:31:53777天2024-03-24 18:52:57
277470862022-03-27 14:36:5897天2022-07-02 16:47:06
326383872022-05-14 20:00:00194天2022-11-24 23:00:00
348359532022-07-02 09:00:0097天2022-10-07 10:00:00
358930702022-08-19 22:00:00388天2023-09-12 06:00:00
369076472022-10-07 11:00:0097天2023-01-12 12:00:00

当节点第一次启动时,它必须下载一个持久状态。这在validator/manager-init.cpp中实现。

从初始化区块开始,节点下载所有更新的关键区块。它选择最近的具有仍然存在的持久状态的关键区块(使用上述公式),然后下载相应的主链状态和所有分片的状态(或仅下载此节点所需的分片)。