闪电网络节点为何只与同一对端保持一条连接,多条通道的消息如何区分
同一个闪电网络节点与同一对端之间只保留一条连接,这是 BOLT-1 的明确要求:实现必须对每个对端使用单一连接,所有通道消息都在这条连接上多路复用。也就是说,节点不会为每条通道单独开一条 TCP 连接,而是把属于不同通道的消息汇入同一条连接传输。读者问的“多条通道怎么区分”,答案不在连接层,而在消息自身携带的通道标识。
BOLT-1 是闪电网络基础消息规范,其中“连接处理与多路复用”一节写明:实现必须对每个对端使用单一连接;通道消息包含通道 ID,并通过这一条连接进行多路复用。这个要求针对节点与对端之间的消息传输,不涉及传输层加密的具体做法——那属于 BOLT-8 的范围。据 BOLT-8,其定义了闪电网络使用的规范传输层,同时允许任何满足相应保证的传输方式替代。按原文口径,默认 TCP 端口随网络不同:比特币主网为 9735(十六进制 0x2607),测试网为 19735(0x4D17),signet 为 39735(0x9B37)。
单连接的前提确定后,区分通道靠的是消息格式。BOLT-1 规定,解密后的闪电消息由三部分组成:2 字节大端序的 type 字段,表示消息类型;可变长度的 payload,其格式与 type 对应;可选的 TLV 扩展流。type 字段决定如何解释 payload。消息按类型分组,例如 32–127 属于通道类消息,用于建立和关闭微支付通道;128–255 属于承诺类消息,涉及更新承诺交易、添加或撤销 HTLC、结算 HTLC、调整费用和交换签名。通道消息中包含通道 ID,接收方据此判断这条消息属于哪条通道。
这里可以做一个明确标注的假设案例:某节点与同一对端之间存在两条通道 A 和 B,二者共用一条连接。当对端发来一条通道类消息时,节点先读 type 字段确认消息类别,再在 payload 中读取通道 ID,从而把消息归入 A 或 B。连接只有一条,通道却可以有多条,区分发生在消息解析阶段,而不是连接建立阶段。需要说明的是,通道 ID 字段的具体字节位置依各消息类型定义,并非固定不变;这个案例只用于说明消息字段的作用,不代表任何实际节点配置。
还需要注意 type 字段的“奇数类型可发送”规则:节点可以发送奇数编号的类型,而不必先确认接收方是否理解。这说明消息类型空间本身允许扩展,但通道消息的归属仍由通道 ID 决定。BOLT-1 同时说明,除特别指明外,所有数据字段均为无符号大端序。上述规则适用于遵循 BOLT-1 的闪电网络节点实现;传输层加密细节不在 BOLT-1 的讨论范围内,应查阅 BOLT-8。