lncli listaliases 与 getchaninfo:通道别名映射表和图谱档案的一次交叉对账 图 1
lncli listaliases 与 getchaninfo:通道别名映射表和图谱档案的一次交叉对账 · 图 1

闪电通道的编号不只有一个。一条通道在链上的资金交易把它钉死在某个 txid 加输出序号上,Short Channel ID 把这对信息折成八个字节,而为了隐私与零确认场景,节点还会给通道发别名。LND v0.19.0-beta 提供了两个查询入口:ListAliases 列出别名与真实编号的映射表,GetChanInfo 查单条通道的图谱档案。对账、排障、审计时,这两个命令经常要连起来用。本文以该版本源码与接口定义为准。

别名从哪来

别名机制源自通道别名功能:付款路径上每一跳看到的通道编号都可以是本跳自己的别名,链上真实编号只有通道双方知道。非零确认通道里,真实编号就是确认后的 SCID;零确认通道在确认之前先用一个起始别名顶上,确认后编号还会变化,所以接口把起点叫 base SCID——ListAliases 返回的映射表就是若干组 base_scid 加 aliases 列表,非零确认通道里 base_scid 是确认后的 SCID,零确认通道里它是第一个分配的别名。

这个映射纯本地:别名叫什么、换不换,都是节点自己的事,不会有一份全网表。看到某条通道的别名和别人的列表对不上,不是谁错了,是各自记账。

lncli listaliases 与 getchaninfo:通道别名映射表和图谱档案的一次交叉对账 图 2
lncli listaliases 与 getchaninfo:通道别名映射表和图谱档案的一次交叉对账 · 图 2

用映射表排一笔错路由

典型场景:对端报来的失败或监控日志里出现一个编号,与本地 channels 列表对不上。顺序是:先 ListAliases 全量取表,把日志里的编号与每个 base_scid 与 aliases 列表比对;命中某个 base_scid,就找到了它对应的真实通道。对零确认通道尤其重要,因为它的付款方可能一路用别名点名。没命中再考虑是过期通道、对端别名或单纯的编号截断误读。

GetChanInfo 补的是图谱侧

ListAliases 管映射,GetChanInfo 按一个 SCID 返回图谱档案:两端节点、容量、两条方向各自的转发策略(基础费、比例费、时间锁步长、启用禁用位、HTLC 上下限)。它读的是从网络学来的公开信息,不是你的通道账本——一条你从不参与的通道同样能查,前提是它在公开图谱里发过公告。私有通道没有图谱记录,查不到不等于不存在。

两个命令的数据面因此是互补的:ListAliases 回答这条别名是不是我的通道,GetChanInfo 回答这条通道在网络地图上长什么样。

零确认通道下的编号漂移

值得单列一条纪律:零确认通道确认后,付款路径上的别名可以继续用,但链上终局以资金交易为准。如果外部系统按 SCID 存了通道标识,确认事件到达时要做一次映射刷新:取新 SCID,回 ListAliases 核对别名是否重新分配,历史日志里旧编号到真实通道的映射保留归档。跳过这步的账本,会在通道重开后把新旧两代记录叠在同一把钥匙上,事后对账成本极高。

实操顺序建议

巡检脚本可以按三步固定:ListAliases 拉表并按 base_scid 建索引;对本节点活动通道逐条用 GetChanInfo 比对图谱侧参数与本地策略,差异落日志;最后把映射表快照带时间戳存档。三步都不改任何状态,放心定时跑。

巡检脚本的固定三步

第一步拉表:ListAliases 全量取映射,按 base_scid 建索引;第二步比对:对本节点活动通道逐条核对图谱侧参数与本地策略,差异落日志;第三步存档:把映射表快照带时间戳写入归档。三步都不改任何状态,适合定时无脑跑,出问题当天的快照就是最可靠的现场。

一个易混点:别名不等于私有通道

别名解决的是编号在不同跳之间不一致的隐私问题,与通道是否出现在公开图谱是两回事。一条完全公开的通道照样使用别名,一条私有通道也有自己的真实编号。审计时不要从编号形态反推通道可见性,该看的是图谱侧有没有它的公告记录、本地通道列表里的私有标志,两个字段各说各的事。把这条分清,读路由日志时能少一半误判。

风险提示:本文描述的是节点软件行为,不构成任何投资建议;不同客户端对别名与编号的处理存在差异,以所用实现的版本为准。