闪电网络的地图有多大、从 A 点到 B 点有几条路,lncli 的 describegraph 一条命令就能把整张公开通道图导出成结构化数据。它也是很多区块浏览器、路由可视化项目背后的数据来源。但”整张图”意味着不小的体积和一组需要理解的编号规则。本文按 LND v0.19.0-beta 的接口定义核对。
一、返回的两段结构:点与边
输出就两个数组。nodes 数组里每个元素是一台公开过自己的节点:公钥、别名、颜色、监听地址列表。只有对外广播过公告的节点才会出现——开了私有通道但从不公告的机器在这张图上是隐形的。edges 数组每条元素是一条通道的”边”:通道编号、资金输出点、容量,以及按编号规则能从通道编号里解出的位置信息。通道编号的设计值得多说一句:高四十字节是资金交易的区块高度与位置,低两字节是输出序号,所以一个纯数字能反推出”哪块哪笔第几个输出”。节点间的边天然有两条吗?不——图里一条通道一条边,两个方向的报价挂在 edge 上的一对 policy 字段里。
二、policy 才是路由的行情牌
每条边挂 node1 policy 与 node2 policy 两份报价,方向由边的 advertising node 字段定。每份 policy 里:fee base msat 是每笔固定费(毫聪),fee rate milli msat 是按金额比例的费率,time lock delta 是过路要求的时间锁增量,min htlc 与 max htlc msat 划出这笔钱能不能借道的大小窗口,disabled 位表示这个方向暂时不收客。路由算法读的就是这十来个数字。排障时常见”图上明明有路、付款就是失败”:先查 policy 的 disabled 和 max htlc——容量大的通道可能把单笔 HTLC 上限设得很小,你的付款金额够不上窗口。
三、include_unannounced 与图的边界
默认输出只含公告过的通道。参数 include unannounced 打开后,把本节点自己的私有通道与尚未公告的公开通道也拼进来——注意只有”你的”私有通道,别人的私有边全网谁都无法看见,这是协议隐私设计,不是数据没同步。换句话说 describegraph 给你的是”公开图加自家暗管”,它永远不是全网真实流动性图,大量真实容量藏在私有边里。用图数据做分析时把这个系统性盲区写进结论里。
四、体量与用法建议
全图的节点与边各以万计,JSON 全量拉取一次可达数百兆量级,别塞进高频轮询。合理姿势有三种:做分析就离线拉一次、落盘、按块高做增量对账;做可视化就先聚合出统计再展示;做路由调试则跳过全图,直接用 queryroutes 按目的地要一条现成路径更省。订阅通道图变化事件(gossip 流)能把”全量拉”降级成”增量补”,属于进阶玩法。
五、和 listchannels 的分界
listchannels 看”我自己的通道”——本地视角、含余额与在途;describegraph 看”世界的通道”——全局公告视角、不含任何人的余额。一个管自家账本,一个管公共地图,两个视角拼起来才是路由节点对网络的全部认知。
六、读图时最容易犯的三个错
第一错是把别名当身份:别名谁都能设、随时能改,两万台机器可以都叫同一个名字,身份永远只认公钥。拿别名做跨数据源拼接的分析,结论可以在两篇”同名节点”文章之间毫无愧色地乱跳。第二错是把公告当实况:policy 里的 disabled 位与限额都是历史快照,一条昨天还接单的边今天可能已经关门,你的图上它还在,真实付款撞上去才发现——所以图适合做候选集裁剪,不适合做最终裁决,裁决交给实际路由尝试。第三错是忽略编号里的地理信息:通道编号高位就写着资金交易在哪个块、块内第几笔、哪个输出,把大批边按区块高度切片,能直接看出一条时间轴——哪些时期开的通道还活跃在网络里、哪个年代的资金交易是开道高峰,这是任何第三方仪表盘都给不了的免费视角,成本只是你对编号做一次移位与拆分。
风险提示:图数据只反映公告状态,不代表通道真实可用性与容量健康度;本文不构成任何投资或组网建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。