术语表 /闪电网络与 Layer 2
Gossip 协议
- Gossip 协议是什么?
- Gossip 协议是闪电网络节点之间相互泛洪传播已签名的通道和节点公告的方式,使每个节点无需向服务器查询,就能构建自己的网络地图。
闪电网络没有目录,因此节点相互告知哪些通道和节点存在,每个节点各自保存一份副本。BOLT 7为此定义了三种消息,接收节点应忽略其注资输出的确认数少于6个的通道。您的钱包之所以能找到路由,是因为它自己或它信任的某个节点事先接收了这些消息。
运作方式
Gossip 协议传递三种消息,每一种都必须先通过链上数据或签名证明某件事,对等节点才会转发。
channel_announcement(类型256)声明一个通道存在。接收节点会在区块链上查找注资输出:输出不是预期的 P2WSH 脚本或已被花费的消息必须忽略;输出的确认数少于6个的消息应当忽略,除非差距很小,节点可能只是区块尚未同步到最新。因此,公告一个通道需要一笔真实的链上交易,这正是整个防垃圾设计的核心所在:没有人能免费伪造上千个通道。
node_announcement(类型257)携带运营者自身的信息。与已知通道没有关联的节点会被忽略,"to avoid trivial denial of service attacks",因此没有任何投入的运营者永远进不了任何人的地图。
channel_update(类型258)携带价格,每个方向各一份,也是真正会变动的消息。手续费和过期增量都在这里;运营者上调手续费时,规范建议该运营者在至少10分钟内继续接受旧参数,因为新参数需要时间传播。
传播有意放缓。节点存储收到的内容,替换来自同一来源的较旧更新,并每隔60秒发出一批;规范称之为错开广播,它能阻止某一个繁忙的运营者占满所有人的带宽。
遗忘同样有规定。通道的注资输出一旦被花费,节点会等待72个区块确认后再删除该通道,使拼接(splice)有时间自行公告,而不是看起来像关闭通道。另外,如果任一方向上最新的 channel_update 已超过两周(1,209,600秒),节点可以直接修剪该通道。
在哪里会遇到它
刚启动的闪电网络节点会有一段时间无法使用,随后又突然可用,原因就是 gossip。
连接之后,节点会请求自己缺少的内容:用 query_channel_range(类型263)了解某一段区块范围内存在哪些通道,用 query_short_channel_ids(261)拉取它从未见过的具体通道,用 gossip_timestamp_filter(265)为之后发送的所有内容设置时间窗口。最后这条消息是开关而不是偏好设置:在您发送它之前,对等节点不会向您转发任何不是它自己生成的内容,小型设备正是这样保持轻量的。
其影响会以手续费的形式传到您的钱包。路由报价由您的钱包恰好持有的 channel_update 消息拼装而成,因此过时的视图会导致尝试失败,以及价格与向您展示的不符。手机钱包依赖他人的地图:Phoenix 在手机上运行真正的自托管节点,但通过 ACINQ 自己的节点连接,代价是本站评测所记录的:ACINQ 知道您支付的目的地和金额。托管型账户完全跳过 gossip,因为由公司替您路由。
Gossip 协议 vs P2P 消息
Gossip 协议运行在闪电网络节点之间;比特币的 P2P 消息运行在比特币节点之间,两者除了都采用泛洪的做法之外没有任何共同之处。
比特币节点用 inv、getdata 和 tx 等命令转发交易和区块,对任何人的通道一无所知。闪电网络的 gossip 是另一套独立的通信,承载类型256至265的消息,只在核实所公告的注资输出真实存在且未被花费时才涉及区块链。支付本身从不通过 gossip 传播:金额和目的地封装在洋葱数据包内,中间节点无法读取,因此公开地图只显示通道在哪里,从不显示经由通道转移了什么。