两种追赶,问的是不同问题
新节点要加入一条链,通常有两条路。一条是区块同步:从创世块开始把每一个区块下载回来、逐块验证、重放执行,最后站到链尖。另一条是状态同步:不追历史,只把与链头(或者离链头不远)的那个位置相关的数据拿下来,验证这份数据确实属于这条链,然后直接以”最近某高度的完整状态”开工。CometBFT 官方文档对后者的承诺写得很直白:加入网络所需的时间会被大幅缩短。
但要留意文档里那句提醒——先确认你在跑的那个应用支持它。状态同步不是共识层的独角戏,它依赖应用愿意把自己的状态做成可导出的快照。
快照是应用做的,节点只是搬运工
CometBFT 把这件事设计成一组 ABCI 接口。节点向应用问一句”你有哪些快照”,应用回一份列表;节点把某个快照的元数据推荐给应用,问”这份你接不接受”;随后按分片向应用要某一块数据、或者把收到的数据交给应用去落盘。整套流程里,节点并不理解状态内容——快照格式、内容切法、能不能装回同一个应用版本,全是应用自己的决定。
对等网络层为此准备了四条独立通道:快照通道、分片通道、区块(轻块)通道和参数通道,各有一个编号。流程大致是:新节点起手先问它遇到的每个对等节点”你手上有没有快照”;对方去问本地应用,把最多十个最近快照的元数据发回来,包括这份快照是在哪个高度做的、用什么格式、被切成几片、一份哈希,以及一段应用自定义的元数据,整个响应被限制在四兆字节以内。节点把这些快照推荐给本地应用,一旦被接受,就朝持有该快照的对等节点要具体的分片;对方从本地应用取出那片数据回话,单次响应上限十六兆字节。文档也点出一个坑:分片的格式与那段元数据可能是非确定的,也就是说不能想当然地拿它们做跨节点的字节级比对。

谁来证明”这确实是这条链”
拿到一份能装回状态机的快照,只解决了”我有状态”,没解决”这个状态是对的”。信任锚来自轻客户端。配置里必须给出两个以上的 RPC 服务地址,官方文档解释得很清楚:状态同步要用轻客户端做验证,所以需要 RPC 服务,多给几个总是有帮助。另外三项是信任的落点:可信高度,也就是节点打算从哪个高度开始信任这条链;可信哈希,即那个高度对应的区块标识;可信周期,指在这个时间窗口内的区块头才允许被轻客户端方式验证。文档对最后一项专门加了警示——这个值应当显著小于解绑周期,否则轻客户端验证所依赖的”同一高度不可能有两个合法提交”这一前提就可能失效。
这些数字不必靠猜:公开的 RPC 上查一次提交信息,就能同时拿到高度与哈希,文档给的示例就是请求提交接口再把签名头里的高度和区块标识哈希取出来。装回快照、按可信高度验到链头之后,节点再切回常规的区块同步继续往前跑——状态同步负责让你快速站到接近链尖的位置,之后每一块仍由共识与验证规则把关。
服务端太少这件事,与带外快照
理想中,新节点随便找几个对等节点就能要到快照。现实里,官方架构记录文档 ADR 104 把痛点写得很坦白:给别人提供快照是耗带宽的活,而且节点运营者几乎拿不到什么激励,于是生产网络里真正开着状态同步服务端的节点数量很有限;从新节点的角度看,服务因此变得脆弱——很难找到一份”好”快照,同步过程经常卡住。
给出的解法是把快照这条路从”只在网络里传”扩展成”也可以带外递到手”:应用把状态做成可导出的格式,运营者自行下载,放到那台要起步的新节点本地,节点于是可以在完全不通过 P2P 传快照的情况下完成本地引导。这份记录同时保留了原来的一个硬要求——状态同步必须从一套空白的 CometBFT 实例开始跑,因为负责验证应用状态、顺手把区块存储与状态存储引导起来的正是轻客户端这一子系统。围绕这条路径,节点还配了一组命令行入口用来列出本地快照、把快照导成可搬运的归档、导入导出与删除。
边界与取舍
状态同步换来的代价也值得摆清楚。第一,它信任的是”可信高度上那份提交被轻客户端验证通过”,而不是一份从创世开始的重放证明;信任的起点从”我算过所有历史”变成”我验过从可信高度到链头这段”。第二,快照必须由应用侧支持,不同应用的格式互不相通,装不上就是装不上。第三,谁做快照仍然是个运维问题——带外分发绕开了 P2P 带宽,却也把”从哪个来源拿这份快照”的判断交给了运营者自己,下载来的快照损坏、版本对不上,都要在恢复阶段才暴露。第四,它不是备份方案:快照服务端的可用性、可信周期与解绑周期的相对关系、以及应用快照格式随版本的演进,都是长期运维要盯的东西。
具体参数(分片大小、请求并发、可用快照高度)随版本与网络而变,以上机制以官方文档为准;把某个网络的真实数值当作事实之前,应该去它的节点文档与公开 RPC 上核一遍。本文只做机制解释,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。