ZooBC 维基
数据与存储

归档与读取过去

普通的 ZooBC 节点只保留近期历史:30 到 60 天的区块和它们最新的三份快照。对于久远过去的问题,例如某个账户三年前的余额,由归档来解答:自区块 0 以来的每一份快照,分散保存在去中心化存储中,而不是保存在一台机器上,并且可以对照脊链逐字节核对。

每个节点保留什么

在 mainnet 上,每 172,800 个区块(约 30 天),每个节点都会写一份快照:链的完整状态,包括每一个余额、注册表席位和记录,以该高度以下 760 个区块处为准。各节点会把这项工作错开,但每个节点的字节完全相同。快照是一个 CBOR 文档,被切成 102,400 字节的分块,每个分块以其 SHA3-256 哈希命名。它的清单包含整个文件的哈希、每个分块的哈希和参考高度,发布在脊链的一个区块中;脊链是一条每天一个区块的慢速链,由三分之二的已注册席位联署。

快照中没有任何内容是签名的。它的权威来自指定它的、经过联署的脊链区块,因此无论由谁提供,只要快照的字节与清单中的哈希相符,它就是真实的。新节点也是借助快照快速加入的(快照与快速同步)。

每个节点只在自己的磁盘上保留最新的三代快照。这就是节点帮助其他节点加入所需的全部内容;而如果每个节点都保留历来生成的每一份快照,每个运营者每个月都要付出更多的磁盘空间。旧区块也会被修剪(历史修剪)。

归档

从 0.5.8 版本起,保存从区块 0 起每一份快照的,是去中心化存储,而不是每个节点。与任何存储文件的分片一样,每份快照的分块由抽签选出的五个已注册节点持有(storage_replication)(去中心化存储池)。每个节点只保留自己最近的三份快照;没有哪个节点保存全部快照。

没有任何一台机器持有全部历史,因此没有任何一个运营者能够丢失或扣留它。由单一组织(即使是 ZooBC Foundation)运营的归档服务器,恰恰就会成为这样的单点。也没有任何东西被丢弃:归档一直追溯到最早的第一份快照。

持有归档分块是已注册节点存储职责的一部分。每个存储纪元,长效池的 10% 平均支付给证明了被抽样分块的节点(资金池)。

单个节点保留它最近的三份快照;归档保存自区块 0 以来的每一份快照,每个分块存放在抽签选出的五个节点上。
单个节点保留它最近的三份快照;归档保存自区块 0 以来的每一份快照,每个分块存放在抽签选出的五个节点上。

读取过去

想要获取过去某一时刻状态的读取者,沿着脊链回溯到在那一时刻生成的快照,并读取它的清单。它从持有者处获取该快照的分块,并将每个分块与清单中对应的哈希核对,因此持有者无法塞入伪造的分块。然后它重新组装快照,校验整体的哈希,并重建该高度的状态:那一时刻的每一个余额、席位和记录。没有任何单个节点持有全部历史,也不需要归档节点。

沿脊链回溯,读取清单,获取并核对分块,重建状态。
沿脊链回溯,读取清单,获取并核对分块,重建状态。

这些核对无需信任持有者:脊链由席位联署,其清单确定了每个分块的哈希,因此伪造的分块会立即暴露。

查看过去的其他途径

  • 存续押金让一笔选定的交易及其所在区块保存在每个节点上,只要押金还在就一直保存(付费保存数据(存续))。
  • 运营者可以用 keep_all_history 在自己的节点上保留全部历史;这是本地选择,而不是默认设置。
  • 归档节点在节点旁运行一项索引服务,为区块浏览器提供搜索和统计(区块浏览器与归档节点)。

另见