ZooBC 维基
数据与存储

历史修剪

一条永久保存每个区块的链,会让每个节点都为存储它的全部历史付出代价。ZooBC 节点则进行修剪:在一条与快照挂钩的界限以下,它们会删除旧的区块、交易、账本行、回执以及记录中已被取代的旧版本。当前状态,例如余额、注册表席位和数据集行,不会以这种方式被修剪;被修剪的只有旧历史。mainnet 上运行中的节点保存 30 到 60 天的区块。

修剪界限

在 mainnet 上,每 172,800 个区块(约 30 天),每个节点都会写一份状态快照(快照与快速同步)。修剪界限是最近两份快照的参考高度中较早的那个。如果只有一份快照,界限就是该高度减去一个间隔;在快照清单存在之前,什么都不会被修剪。从 0.5.8 版本起,界限永远不能超前于所有节点共用的一个纯公式:

horizon(h) = floor(h ÷ interval) × interval − interval

间隔为 172,800 个区块时,界限落后链顶一到两个间隔。例如在高度 500,000,界限至多为 172,800,因此节点至少保留最新的 327,200 个区块,约 57 天。在下一份快照(位于 518,400)之后,界限上移一个间隔,剩下约 30 天。

另有两项限制让修剪变得平缓。无论界限如何,最新的 1,440 个区块(6 小时)永远不会被修剪;而且节点每个区块每张表最多删除 500 行,因此这项工作是分散进行的。

界限以下保留的内容

有些区块无论多旧都会保留:

  • 区块 0;
  • 每一个包含某笔交易、且该交易的存续记录仍持有资金的区块,与该交易一起保留;
  • 截至最新一份快照时有资金支持的交易,它们会多保留一个间隔,以便快照能够携带它们。

快照携带这些有资金支持的交易及其所在区块的区块头,因此从快照加入的节点也会持有它们。

保留的内容:最近 30 到 60 天、最新的 1,440 个区块、区块 0 以及每一笔有资金支持的交易。
保留的内容:最近 30 到 60 天、最新的 1,440 个区块、区块 0 以及每一笔有资金支持的交易。

其他时限

修剪并不是唯一涉及时间跨度的规则,这些数字很容易混淆:

内容时长(mainnet)
运行中节点上的区块30 到 60 天(一到两个快照间隔)
永不修剪的区块最新的 1,440 个(6 小时)
回执518,400 个区块,约 90 天(回执与网络拓扑)
交易 id至少 25 小时,比最长一天的有效期窗口更长(有效期与时间戳)
回滚上限720 个区块,3 小时(最终性与回滚)

回滚上限说明的是链最多可以往回重组多远;它不删除任何东西。

保存更多

  • 运营者可以在 node.conf 中设置 keep_all_history,在本地保留被修剪的历史。这是本地选择,而不是默认设置。
  • 任何人都可以用一笔存续押金付费保存一笔交易。
  • 归档节点在节点旁运行一项索引服务,并为区块浏览器提供数据(区块浏览器与归档节点)。
  • 去中心化存储保存自区块 0 以来的每一份快照,每份快照的分块存放在抽签选出的五个已注册节点上,这样无需任何节点保存全部区块,也能重建过去任意一份快照时的状态(归档与读取过去)。

状态由租金精简

历史修剪不会触及当前状态。状态以另一种方式缩减,那就是租金。无力支付账户租金的账户会被清理,租金未付的数据集行会被停用,押金耗尽的存储文件会被修剪。在每种情况下,剩余的资金都进入长效池,不会损失任何 ZBC。

另见