区块浏览器与归档节点
ZooBC 区块浏览器让任何人都能浏览区块、交易、账户和节点,搜索旧的交易消息,并查看每日统计数据。其中大部分内容并非来自普通节点,而是来自归档服务:一个在已注册节点旁边运行、为链的历史维护可搜索索引的独立程序。
普通节点保存什么
普通节点保存当前状态(余额、记录、注册表)和最近一段区块窗口:一到两个快照周期,在 mainnet 上即 30 到 60 天。这足以验证链,并帮助新节点从快照加入(快照与快速同步)。更早的区块、交易和回执会被修剪(历史修剪),从而让节点保持轻量。想在本地保留被修剪历史的运营者,可以在 node.conf 中设置 keep_all_history。
其结果是,单靠一个节点既无法回答“自区块 0 以来的每一笔交易”,也无法对消息进行全文搜索。
归档服务
归档服务 zoobc-archival-api 填补了这一空缺。运营者设置了 archival_node = true 的节点会启动并监管它。该服务读取节点自己的 SQLite 数据库,并在 MySQL 存储中维护区块和交易的索引,因此能够回答有关历史记录、账户时间线、统计数据的查询以及搜索。除了普通路由的归档形式之外,它还提供自己的路由:
| 路由 | 回答的内容 | |
|---|---|---|
/search/transactions | 对交易(包括其消息)的搜索 | |
/stats/… | 网络统计数据 | |
/spine/blocks | [[spine-chain | 脊链]]的区块 |
/network/map | 网络地图 | |
/archive/stats | 关于归档本身的统计数据 |
对比较两边答案的开发者来说,有一个细节很重要:归档服务用大写字母书写十六进制值,而节点用小写字母。
在链上声明
已注册节点的所有者用 RegisterArchival(类型 46)声明归档服务。其中指明的节点密钥必须属于发送方所拥有的一个已注册节点。不锁定任何质押,UnregisterArchival(类型 47)可撤回该条目。任何人都可以在 GET /api/v1/registry/archivals 列出已声明的服务,网页钱包在其网关失效时会读取这份列表。
区块浏览器
区块浏览器是由网关提供的网页。它建立在归档路由之上:区块、交易、账户、节点、脊链、统计和搜索。网关把每个 API 读取请求先发给它的归档服务,对于归档服务缺少的路由则回落到节点。区块浏览器还显示每个节点的软件版本,让运营者和观察者都能看到谁已经更新(发布版本与更新)。
这些都是公开的链上数据:在链上执行操作需要密钥,查看它则从不需要(节点 API)。
读取过去的途径不止这一种
归档服务是一种便利,而不是链的记忆。
保存自区块 0 以来每一份快照的,是去中心化存储,而不是每个节点,因此任何人都可以沿着脊链回溯到某一时刻的快照,重建当时的状态,而无需依赖任何归档节点(归档与读取过去)。
归档服务不做的事:它们不产出区块,出块只由已注册节点完成;也不存在节点向其报告的 ZooBC Foundation 中央数据库。中继在钱包之间传送的是通话,不是交易(中继)。