公告之前先体检:闪电通道登上网络地图的条件 图 1
公告之前先体检:闪电通道登上网络地图的条件 · 图 1

一、上地图不是一条消息的事

闪电网络要找路,靠每个节点手里一份公开图谱。开通道交易落链只是第一步——地图上浮现这条边,按 BOLT 7 要走完一条条件链。

公告之前先体检:闪电通道登上网络地图的条件 图 2
公告之前先体检:闪电通道登上网络地图的条件 · 图 2

二、意愿先于一切

公不公开,从开通道那一刻就表过态:open_channel 消息的 channel_flags 里有一个 announce_channel 位。两位都愿意,才有资格发公告;任何一方没置位或撤回意愿,节点不得发送 announcement_signatures,这条通道就作为私有边存在——两端能用,地图上看不到。

三、签名互换

公告不是一方拍板。双方靠 announcement_signatures 消息完成 opt-in:发方构造出对应资金交易的 channel_announcement 消息,用自己的身份私钥与出资私钥各签一份,把签名递给对面。收方要验两份签名:身份签名对不上节点公钥、出资签名对不上资金输出的脚本,都可以直接翻脸断开。凑齐两份签名的公告才是完整版——单边版本在 gossip 网络里活不过校验。

四、确认数与时机

发公告还有时序要求:channel_ready 一来一回之后、资金交易攒够不被重组的确认数之后,才该发 announcement_signatures;规范要求队列发布 channel_announcement 前资金交易至少有六个确认——资金交易若被重组,以它推导的 short_channel_id 就作废,提前公告等于给全网点了一道会消失的菜。

五、公告全家福

公开的通道靠一组消息拼完整:channel_announcement 声明这条边存在及其出资,两份 channel_update 各自声明一边的路由参数——费率、时间锁增量、尘埃线与容量,规范要求至少能看到两条 update;node_announcement 是节点的身份证,别名、颜色与可连地址,每个地址还要单独的签名,名片上没有一个字段可以随口填。缺任何一环,这条边在多数实现看来不完整,付款找不到路,或找到路被中途的规则挡回。

出资校验把”通道真实存在”钉死在链上:读 gossip 的节点拿公告里的出资公钥去链上对答案——这对公钥是否真写在那笔资金交易的输出脚本里、输出是否尚未花费。验不过,公告作废,gossip 网络还会把嫌疑公告的来源拉黑一段,伪造公告讨不到便宜。

六、公告没生效的排障清单

通道开了但图谱搜不到,逐条过:announce_channel 位是否两边都置了;announcement_signatures 是否一来一回、有没有卡在单边;channel_ready 是否完成;资金交易确认数够不够六个;出资脚本与公钥链上核对是否通过;channel_update 是否至少两边各一条;实现是否把通道设为私有。任何一环断,边就半透明或不透明。

单边卡住的典型形态是地图上有边却没有路由参数:公告凑齐了、两边至少一边忘了发 update,付款方算路时要么看不见这条边,要么走到半路发现下一跳的参数没着落而报错。另一个隐蔽形态是名片过期:node_announcement 长期不更新,部分实现按时间戳衰减处理,节点身份在查询里渐渐淡出,通道边虽在但入口信息残缺。

七、公告之后

图谱只认最新有效版本:update 随经营参数变化而发,节点重启后靠 gossip 查询补课——订阅窗口内的公告流按时间戳增量拉取,离线一周回来的节点要补的就是这段日记。资金交易被花掉的那条边按规则遗忘,公告与 update 从新节点的视角里消失。用拼接(splice)改容量的通道,每次拼接落链都要重走一轮公告流程:规范要求双方各自发出 splice_locked 之后,为匹配的拼接交易再发一次公告,让网络知道换的是配置不是关门——否则旁观者只看到出资交易被花掉,第一反应是这条边退了场。

私有通道是图谱的暗面:两端之间的资金照常流动,地图上一个字节都不多。运营者由此在路由成功率与隐私暴露面之间反复权衡——上地图意味着进入更多付款方的候选集,也意味着出资关系、经营参数随公告永久公开;不上地图则把生意限定在直接邻居的半径里。公告条件不是关卡,更像一份明码标价的挂牌契约:要享受全网路由的流量,先让全网验证你这条边的真实性。

风险提示:本文仅为技术机制科普,不构成任何投资建议。