跳至主要内容
本页面使用机器翻译自英语,可能包含错误或不清楚的语言。如需最准确的信息,请参阅英文原文。由于更新频繁,部分内容可能与英文原文有出入。请加入我们在 Crowdin 上的努力,帮助我们改进本页面的翻译。 (Crowdin translation page, Contributing guide)

存储优化

随着 Kaia 区块链的增长,存储区块链数据所需的存储空间也在增长。 Kaia 采用两种主要技术来管理这种不断增长的存储需求:

状态批量修剪(状态迁移)

状态迁移是一种批量剪枝功能,可在不中断运行节点的情况下应用于现有节点。

动机

区块状态或 StateDB 将链上账户和合约存储在一个 trie 数据结构中。 trie 数据结构可存储过时和最新状态,以便使用梅克尔散列进行验证。 随着事务执行状态更改,状态三元组会无限增长。 截至发稿时(2024 年 8 月),Kaia 主网存档节点大小超过 20TB,甚至完整节点也超过 10TB。

概念

状态迁移会删除处理新区块时不需要的旧区块状态。 它将状态 trie 从 "旧 "复制到 "新"。 并非所有三元组节点都会被复制。 从选择性区块的状态根可到达的区块被复制。 复制完成后,旧目录将被删除,因此只剩下所选区块的状态。

阅读这些博客文章,了解更多技术细节: 状态迁移:节省节点存储, Kaia 状态迁移:减少区块链数据的有效方法

有关如何执行批量修剪,请参阅《状态迁移指南》(../../misc/operation/node-pruning.md#how-to-perform-batch-pruning)。

国家现场修剪

状态实时剪枝是解决状态数据库规模不断扩大问题的一种新方案。 与批量剪枝(状态迁移)不同,实时剪枝会在节点进程阻塞时自动一点一点地删除旧状态。

动机

区块状态或 StateDB 将链上账户和合约存储在一个 trie 数据结构中。 trie 数据结构可存储过时和最新状态,以便使用梅克尔散列进行验证。 随着事务执行状态更改,状态三元组会无限增长。 截至发稿时(2024 年 8 月),Kaia 主网存档节点大小超过 20TB,甚至完整节点也超过 10TB。

在此之前,"状态迁移 "通过有选择性地复制最近的状态并删除其余状态来删除旧状态,从而缓解了这一问题。 这样可以将整个节点的大小减小到 5TB 以下。

然而,国家移民也有其自身的缺点。 它的缺点是需要花几天时间遍历整个州的 Trie,开销很大。 此外,状态迁移必须手动触发。 为了克服这些限制,引入了实时修剪技术。

概念

三元组修剪很难,因为三元组节点是否过时并不确定。 在原始状态三元组结构中,一个三元组节点可以是多个尝试的一部分,每个尝试构成一个不同的区块。 即使三元组节点(如账户余额)更新为另一个值,也不能删除该三元组节点,因为其他父节点可能仍然需要它。 这个问题被称为哈希重复问题。

实时剪枝会有意重复具有相同内容的三元组节点。 在 "实时剪枝 "模式下,一个三元组节点不会被哈希值引用,而是被 ExtHash 引用。 ExtHash 是内容的 32 字节哈希值加上 7 字节序列索引。 序列索引是单调递增的,因此每个三角形节点都是唯一的。


哈希:32 字节 Keccak256
ExtHash:32 字节 Keccak256 + 7 字节序列索引

这样,只要三元组节点的内容发生变化,就可以认为该三元组节点已经过时。 Merkle 哈希值的计算方法与此相同,只是忽略了序列索引,使其在共识方面与非实时剪枝节点兼容。

阅读这篇博客文章,了解更多技术细节:利用 StateDB 实时剪枝高效管理区块链数据容量

有关如何启用实时修剪,请参阅 Live Pruning Guide.

让这个页面变得更好