闪电公告不会自己找上门:gossip_timestamp_filter 的订阅窗口 图 1
闪电公告不会自己找上门:gossip_timestamp_filter 的订阅窗口 · 图 1

闪电公告的订阅过滤器

闪电节点的地图不是白送的。刚上线的节点要向对等节点索要全网通道和节点的快照,而之后的增量更新靠的也不是对方随意推送——gossip_timestamp_filter 这条消息决定了每个邻居会主动把哪些公告转发给你。理解它,才能理解为什么你的节点有时消息洪水、有时又静得像断网。

过滤器的三行参数

gossip_timestamp_filter 携带链哈希、起始时间戳和时间跨度三个字段,语义直白:对等节点只应转发公告时间落在起始时间戳之后、跨度区间内的通道公告、节点公告和通道更新,超出窗口的丢弃。对刚完成一次全图同步的节点,标准用法是从同步点开始设一个足够大的窗口保持接收;对只想做轻量对账的节点,则可以周期性地用窄窗口收最近变更。规范同时提醒:在公告被转发前,每条公告都要独立验签——区块头、通道出资输出和节点密钥的交叉校验,过滤器只是流量闸门,不是信任开关。

为什么默认什么都不发

更常见的误解是节点上线后为什么很久不收公告:闪电的公告转发默认是宽松的,但许多实现会在协商了查询类特性后等待客户端主动发过滤器;手机钱包一类轻量客户端通常根本不维持全图,由服务端代管。另一个容易忽略的机制是通道更新的时间戳纪律——为了抵抗两周左右的图修剪,相当比例的通道更新只是换时间戳的心跳,这也是公告流量里水分最大的一块,过滤器按时间筛选的同时也筛掉了一部分无意义的重复。

排障清单

节点图谱长期不更新时按这个顺序查:过滤器窗口是否设成了一条过去的时间带,导致新公告全被丢弃;对等节点是否只维持着查询用的临时连接;重启后是否忘了从上次同步点续订,直接用了默认起点。反过来,如果公告风暴耗尽带宽,收窄时间窗口和收紧连接数是第一步,而不是关掉验证。公告验证规则与消息定义以 BOLT 7 当前文本为准;本文只做机制解释,不构成任何路由服务或收益建议。

图谱新鲜度不是玄学

闪电的路由质量直接取决于你手里的图有多新:被删除的通道没从图上摘掉,支付就会沿死路撞墙;更新费用的通道没收新签名,路由费算错。规范里的默认沉默设计其实是在逼每个节点表态——你不订阅就什么都没有,这比默认洪水更省带宽也更公平。对运行自己的路由节点,务实节奏是:上线时完成一次全图同步,此后用一条起点设在同步时刻的过滤器长期保持增量;定期(比如每天)核对最近区块窗口内的公告量是否正常,长期为零就说明过滤器起点被设错或对等连接全是哑连接。

手机钱包和普通用户看到的世界

移动端通常把图谱完全交给远端节点,本地只保持几条通道,这类方案不自己跑 gossip 同步,也就天然避开了过滤器的坑,代价是信任外包。用户层面唯一要理解的区别是:网页钱包和远端节点看到的是同一张公共图,你无法通过任何钱包设置让自己看到更真实的通道状态;选择钱包时看它代管哪些信息,比纠结协议参数更有意义。消息定义与转发条件以 BOLT 7 官方文本为准,本文不涉及任何路由收益估计。