存储优化
随着 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 字节 Keccak256ExtHash:32 字节 Keccak256 + 7 字节序列索引
这样,只要三元组节点的内容发生变化,就可以认为该三元组节点已经过时。 Merkle 哈希值的计算方法与此相同,只是忽略了序列索引,使其在共识方面与非实时剪枝节点兼容。
阅读这篇博客文章,了解更多技术细节:利用 StateDB 实时剪枝高效管理区块链数据容量。
有关如何启用实时修剪,请参阅 Live Pruning Guide.