本周周报介绍了一项研究:使用 fountain code 让已剪枝节点也能参与初始区块下载(IBD)。此外还包括我们的常规栏目:宣布新版本与候选版本,并总结流行比特币基础设施软件的重要代码变更。

新闻

  • 使用 fountain code 实现 IBD: Lucas Lima 在 Delving Bitcoin 上发帖,介绍他最新的研究:使用 fountain code,让已剪枝节点也能为初始区块下载(IBD)提供帮助,同时不会显著增加它们的存储需求。

    Lima 还专门写了一篇博文,解释这一方案如何实现:将整条区块链划分为多个 epoch,每个 epoch 都是由 k 个区块组成的定长分块;再用 fountain code 对这些 epoch 编码,并把得到的编码结果(称为 droplets)连同区块头一起发送给那些需要重建区块链的节点。 接收节点(文中称为 bucket node)需要收集并解码某个 epoch 的足够多 droplets,才能重建出这 k 个区块。随后再用区块头验证收到的数据是否有效,从而防止恶意节点污染重建出的区块链。

    讨论中也提出了一些关键问题。尤其是,开发者强调:要成功重建区块链,节点需要连接大量对等节点;IBD 速度会更慢;存在节点指纹识别风险;而且还可能扩大 DoS 攻击面。

版本和候选版本

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

  • Bitcoin Core 31.1 是这一主流全节点实现的维护版本。它修复了 -privatebroadcast 中的一个 IP 地址泄漏问题;该问题可能削弱交易来源隐私(见周报 #409)。它还修复了 chainstate 数据库压缩、钱包迁移、输入大小估算、MuSig2 密钥聚合,以及在 v2 P2P 传输重新连接期间的代理处理等问题。详见其发布说明

  • LND v0.20.2-beta 是这一流行 LN 节点实现的维护版本。它修复了 DNS 回退时的 panic,以及一个链上 forward-interceptor 结算漏洞,并加入了上周介绍过的、针对最终一跳 HTLC 的 CLTV 到期高度验证(见周报 #412)。

重大的代码和文档变更

以下是来自 Bitcoin CoreCore LightningEclairLDKLNDlibsecp256k1硬件钱包接口(HWI)Rust BitcoinBTCPay ServerBDK比特币改进提案(BIPs)Lightning BOLTsLightning BLIPsBitcoin InquisitionBINANAs 的近期重大变更。

  • Bitcoin Core #32489 增加了一个 exportwatchonlywallet RPC,用来把当前已加载钱包导出为一个仅供观察的钱包文件;该文件可在另一台节点上通过 restorewallet RPC 加载(见周报 #366)。导出的钱包包含原钱包的公开描述符、交易记录、标签和其他元数据,但不包含私钥。此前,用户必须通过导入公开描述符的方式手动构造这样的钱包。

  • Bitcoin Core #32606 更新了致密区块中继逻辑:如果某个对等节点没有通过 sendcmpct 协商支持、没有被本节点选为使用 sendcmpct(1) 接收高带宽区块公告的对等节点,或者本地节点运行在 -blocksonly 模式下,那么来自该对等节点的致密区块消息都会被忽略。由于致密区块需要使用接收方交易池中的交易来重建,处理这些消息会泄露接收方缺少哪些交易、或者已经拥有哪些交易。对仅区块模式的节点来说,这一点尤其不理想,因为它们交易池中的交易更可能源自本地。

  • Bitcoin Core #34020 为 Mining IPC 接口增加了 getTransactionsByTxID()getTransactionsByWitnessID() 两个方法(见周报 #310周报 #323)。每个方法都接收一组 txid 或 wtxid,并返回节点交易池中对应的序列化交易;对于节点并不了解的交易,则返回空元素。这对 Stratum v2 的自定义作业声明很有用:矿池可能只想从矿工提出的区块模板中,请求那些自己尚未持有的交易。

  • Core Lightning #9104#9292option_simple_close 合作关闭协议加入了实验性支持(见周报 #342)。传统的合作关闭要求双方就唯一一笔关闭交易及其手续费达成一致;如果双方意见不合,关闭流程就可能卡住。simple close 通过允许每一方各自提出一笔有效的关闭交易来避免这个问题,并由各自从自己的输出中扣除自己选择的手续费。双方版本的交易都可以被签名并广播,而最先确认的那笔冲突交易会关闭该通道。CLN 在新的 simpleclosed 子守护进程中实现了这一流程;如果对方版本支付的手续费更高,它会延迟广播自己的版本。#9292 修复了一个边缘情形:此前,如果一笔已签名的 simple-close 交易把关闭方不合算的输出替换成一个被允许的零值 OP_RETURN,CLN 会拒绝该交易,从而导致强制关闭。

  • Eclair #3323 会使那些 CLTV 到期高度距离当前超过 2016 个区块(约两周)的入站 HTLC 失败。这将 Eclair 现有的、针对出站 HTLC 的最大到期高度策略扩展到了入站 HTLC,可降低资金长期锁定的风险,并让通道阻塞攻击更难奏效。Eclair 会先临时接收这类违规 HTLC 进入通道承诺交易,然后再让它失败,因为如果直接拒绝,就会导致强制关闭通道。

  • LND #10832 延续了 LND 对 BOLT12 要约的实现,为 InvoiceRequest 消息增加支持(见周报 #410)。新代码增加了 TLV 编码、解码和结构校验,同时将签名验证以及与对应要约的交叉检查,留待后续 PR 完成。