#更新 #八卦 #节点ID #同步 #快速 #数据 #通道

无 std lightning-rapid-gossip-sync

处理从快速八卦同步服务器获取的八卦路由数据的实用工具

26 个版本

0.0.124-beta 2024年8月20日
0.0.123 2024年5月9日
0.0.123-beta2024年4月19日
0.0.121 2024年1月23日
0.0.110 2022年7月26日

#492 in 魔法豆

Download history 2415/week @ 2024-05-05 2684/week @ 2024-05-12 1968/week @ 2024-05-19 3019/week @ 2024-05-26 2135/week @ 2024-06-02 2876/week @ 2024-06-09 2531/week @ 2024-06-16 2514/week @ 2024-06-23 2292/week @ 2024-06-30 2326/week @ 2024-07-07 2501/week @ 2024-07-14 3098/week @ 2024-07-21 2295/week @ 2024-07-28 3028/week @ 2024-08-04 2728/week @ 2024-08-11 2411/week @ 2024-08-18

10,605 每月下载量
用于 6 个 crate (5 直接)

MIT/Apache

7MB
114K SLoC

lightning-rapid-gossip-sync

此 crate 提供了快速八卦图同步的功能,主要针对移动客户端。其服务器端对应的是 rapid-gossip-sync-server 仓库。

机制

(假定) 服务器发送一个包含八卦数据的压缩八卦响应。八卦数据格式紧凑,省略了签名,并在已知先前通道更新时采取增量。

基本上,序列化结构如下

  1. 固定前缀字节 76, 68, 75 (前三个字节是 ASCII 的 LDK)
    • 此前缀的目的是为了在将来出现其他快速八卦同步格式时识别序列化格式
  2. 版本字节
    • 当前支持的版本为 1 和 2
  3. 链哈希 (32 字节)
  4. 最新看到的时间戳 (u32)
  5. 仅版本 2
    • 表示默认节点特性的字节数
    • 节点特性数组
  6. 一个无符号整型,表示后续跟随着的节点ID数量
  7. 一个压缩的节点ID公钥数组(所有公钥都假定为标准的33字节序列化)
    • 仅限版本2:每个公钥后面可以跟随着补充功能或地址信息。
  8. 一个无符号整型,表示后续跟随着的频道公告消息数量
  9. 一个经过大量简化定制的频道公告数组
  10. 一个无符号整型,表示后续跟随着的频道更新消息数量
  11. 一系列用于非增量频道更新的默认值
    • 值如下定义
      1. default_cltv_expiry_delta
      2. default_htlc_minimum_msat
      3. default_fee_base_msat
      4. default_fee_proportional_millionths
      5. default_htlc_maximum_msat (u64,如果默认值为无最大值,则u64::MAX)
    • 默认值由服务器根据给定delta集中非增量更新的频率计算得出
  12. 一个自定义频道更新数组

您还会注意到,由于节点ID可以从频道公告和更新中隐式提取,因此完全省略了NodeAnnouncement消息。

然后将数据应用于当前网络图,人为地将日期设定为最新看到的消息的时间戳减去一周,无论它是公告还是更新,从服务器的角度来看。网络图应该在图同步完成之前不应被修剪。

自定义节点公告(仅限版本2)

在RGS协议的版本2中,节点ID后面可以跟随着补充功能和套接字地址数据。这些额外字段的存在的指示是通过利用33字节公钥校验和字节中的未使用位来实现的,如下所示

128 64 32 16 8 4 2 1
附加数据 提醒 功能数据 功能数据 功能数据 地址数据 始终设置 奇数y坐标

请注意,位索引3-5都表示功能数据。具体来说,如果没有设置任何位,则表示没有跟在公钥后面的功能数据。如果设置了其中的一组位,则将位三元组解释为默认节点功能的索引(减一),该默认节点功能是在之前提供的。如果所有三位都设置,则发送自定义功能组合。

如果没有对节点进行任何更改,位索引6可以设置以在没有地址或功能数据的情况下充当提醒。

最后,位索引7表示存在附加数据,这将允许向前兼容。

自定义频道公告

为了达到紧凑性和避免数据重复,我们发送了一个大大简化的频道公告消息版本,它只包含以下数据

  1. channel_featuresu16 + n,其中n是第一个u16指示的字节数
  2. short_channel_idCompactSize(从0开始的增量CompactSize delta)
  3. node_id_1_indexCompactSize(节点id在之前发送序列中的索引)
  4. node_id_2_indexCompactSize(节点id在之前发送序列中的索引)

自定义频道更新

为了快速同步,我们显著偏离了BOLT 7中指定的频道更新格式。我们的自定义频道更新结构如下

  1. short_channel_idCompactSize(从0开始的增量CompactSize delta)
  2. custom_channel_flagsu8
  3. update_data

具体来说,我们的自定义通道标志如下所示

128 64 32 16 8 4 2 1
增量更新? 禁用通道? 方向

如果最高有效位设置为 1,表示增量更新,中间位标志的以下含义

64 32 16 8 4
cltv_expiry_delta 已更改 htlc_minimum_msat 已更改 fee_base_msat 已更改 fee_proportional_millionths 已更改 htlc_maximum_msat 已更改

如果最高有效位设置为 0,其意义几乎相同,只是现在标志表示与更新序列开始时发送的默认值的不同。

在这两种情况下,update_data 仅包含通道标志指示的为非默认或已更改的字段。

增量计算

服务器计算这种快速八卦同步数据的方式是取最新更改时间,无论是一次公告还是一次更新。该时间戳包含在每个快速同步消息中,因此客户端只需要缓存一个变量。

如果某个特定通道更新之前从未发生,则发送完整更新。如果通道在提供的时间戳之前已有更新,则取时间戳之前最新的更新作为参考,并对此计算增量。

根据快速同步消息是实时计算还是返回快照版,在客户端看到的最新更新和网络广播的最新更新之间可能需要考虑中间的变化来计算增量。

性能

鉴于此工具的主要目的是更快地同步图,我们认为提供各种增量集的示例可能有所帮助。这些示例是在2022年5月19日计算的,网络图由80,000个通道公告和160,000个定向通道更新组成。

完整同步
消息长度 4.7 MB
gzip压缩后的消息长度 2.0 MB
客户端处理时间 1.4 s
一周前的同步
消息长度 2.7 MB
gzip压缩后的消息长度 862 kB
客户端处理时间 907 ms
一天前的同步
消息长度 191 kB
gzip压缩后的消息长度 92.8 kB
客户端处理时间 196 ms

依赖关系

~7-16MB
~150K SLoC