本周的周报宣布了影响旧版本 LND 的漏洞披露,并总结了关于 PSBT 用于静默支付的持续讨论。此外还包括我们的常规部分:其中包括服务和客户端软件的最新变更,新版本和候选版本的公告,以及对热门比特币基础设施项目的重大变更介绍。

新闻

  • 影响旧版本 LND 的漏洞纰漏: Matt Morehouse 在 Delving Bitcoin 上发布了一则关于影响 LND 0.17.0 之前版本的漏洞披露。LN 通过洋葱加密的包传递支付指令和洋葱消息,这些包包含多个加密的有效负载。每个有效负载以其长度为前缀,自 2019 年以来,支付的有效负载[允许]的大小最大为 1300 字节。后来引入的洋葱消息,最大可以达到 32,768 字节。然而,有效负载大小前缀使用的数据类型允许指示的大小最大为 264 字节。

    LND 接受的有效负载指示大小最大为 4GB,并在进一步处理有效负载之前分配相应的内存。这足以耗尽某些 LND 节点的内存,导致它们崩溃或被操作系统终止,并且可以通过发送多个这种方式构造的洋葱包来使得具有更多内存的节点崩溃。崩溃的 LN 节点无法发送可能必要的、用于保护其资金的时间敏感型交易,因此可能导致资金被盗。

    该漏洞通过将最大内存分配减少到 65,536 字节得以修复。

    运行 LND 节点的任何人都应该升级到 0.17.0 或以上版本。始终建议升级到最新版本(撰写本文时为0.18.0)。

  • 关于静默支付的 PSBT 的持续讨论: 一些开发者一直在讨论使用 [PSBT] 协调发送静默支付 的支持。自我们上次总结以来,讨论集中在使用一种技术上,其中每个签名者生成一个 ECDH 份额 和一个紧凑的证明,证明他们正确生成了他们的份额。这些份额被添加到 PSBT 的输入部分。当收到所有签名者的份额时,它们与接收者的静默支付扫描密钥结合,生成放在输出脚本中的实际密钥(如果在同一交易中进行多次静默支付,则生成多个输出脚本中的多个密钥)。

    在知道交易的输出脚本后,每个签名者重新处理 PSBT 以添加他们的签名。这导致了完整的 PSBT 签名需要两轮(除了其他协议如 MuSig2所需的任何其他轮次)。但是,如果整个交易只有一个签名者(例如,PSBT 被发送到一个单一的硬件签名设备),签名过程可以在一轮内完成。

    在撰写本文时,所有活跃参与讨论的人似乎大致同意这种方法,尽管关于边缘情况的讨论仍在继续。

服务和客户端软件变更

在这个月度栏目中,我们会标出比特币钱包和服务的有趣更新。

版本和候选版本

热门的比特币基础设施项目的新版本和候选版本。请考虑升级到新版本或帮助测试候选版本。

重大的代码和文档变更

本周的重大变更有:Bitcoin CoreCore LightningEclairLDKLNDlibsecp256k1Hardware Wallet Interface (HWI)Rust BitcoinBTCPay ServerBDKBitcoin Improvement Proposals (BIPs)Lightning BOLTsLightning BLIPsBitcoin InquisitionBINANAs

  • Bitcoin Core #29325 开始将交易版本存储为无符号整数。自比特币 0.1 的原始版本以来,它们一直存储为有符号整数。BIP68 软分叉开始将其视为无符号整数,但至少一个公开的比特币重新实现无法产生相同的动作,产生了共识故障的可能(见周报 #286)。通过始终以无符号整数存储和使用交易版本,希望基于阅读 Bitcoin Core 代码的任何未来比特币实现都能使用正确的类型。

  • Eclair #2867 定义了一种新的 EncodedNodeId 类型,用于盲化路径中的移动钱包。这允许钱包提供商收到通知,下一个节点是移动设备,从而使他们能够考虑特定于移动设备的条件。

  • LND #8730 引入了一个 RPC 命令 lncli wallet estimatefee ,它接收以确认目标作为输入,并返回链上交易的费用估算,以 sat/kw(sats/每千单位重量)和 sat/vbyte 为单位。

  • LDK #3098 更新了 LDK 的快速 Gossip 同步(RGS)到 v2,v2 通过增加了序列化结构中的附加字段扩展了 v1。这些新字段包括一个字节,以指示默认节点特征的数量、节点特征数组以及在每个节点公钥之后的补充特征或套接字地址信息。此更新与提议的 BOLT7 gossip 更新(同样称为 gossip v2)不同。

  • LDK #3078 添加了对 BOLT12 发票异步支付的支持:一旦设置了配置选项 manually_handle_bolt12_invoices,则在接收发票时生成 InvoiceReceived 事件。在 ChannelManager 上公开一个新命令 send_payment_for_bolt12_invoice 以支付发票。这可以允许代码在决定是付款还是拒绝发票之前评估发票。

  • LDK #3082 通过添加编码和解析接口以及构建方法来构建 BOLT12 静态发票以响应来自要约(offer)InvoiceRequest,来支持 BOLT12 静态发票(可复用支付请求)。

  • LDK #3103 开始在基准测试中使用基于实际支付路径频繁探测的性能评分器。希望这能导致更现实的测试基准。

  • LDK #3037 开始强制关闭其费率陈旧且过低的通道。LDK 持续跟踪其估算器在过去一天内返回的最低可接受费率。在每个区块,LDK 将关闭任何支付的费率低于过去一天最低费率的通道。目标是“确保通道费率始终足以在需要强制关闭时确认我们的承诺交易。”