持久状态
节点定期存储区块链状态的快照。每个状态都在某个主链区块创建,并且具有一定的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 | 过期时间 |
---|---|---|---|
8930706 | 2022-02-07 01:31:53 | 777天 | 2024-03-24 18:52:57 |
27747086 | 2022-03-27 14:36:58 | 97天 | 2022-07-02 16:47:06 |
32638387 | 2022-05-14 20:00:00 | 194天 | 2022-11-24 23:00:00 |
34835953 | 2022-07-02 09:00:00 | 97天 | 2022-10-07 10:00:00 |
35893070 | 2022-08-19 22:00:00 | 388天 | 2023-09-12 06:00:00 |
36907647 | 2022-10-07 11:00:00 | 97天 | 2023-01-12 12:00:00 |
当节点第一次启动时,它必须下载一个持久状态。这在validator/manager-init.cpp中实现。
从初始化区块开始,节点下载所有更新的关键区块。它选择最近的具有仍然存在的持久状态的关键区块(使用上述公式),然后下载相应的主链状态和所有分片的状态(或仅下载此节点所需的分片)。