本周的周报总结了关于降低 Bitcoin Core 和其他节点的默认最低交易中继费率的讨论。此外还有我们的常规部分,其中包括 Bitcoin Core PR 审核俱乐部的摘要、新版本和候选版本的公告,以及流行的比特币基础设施软件的重大变更总结。

新闻

  • 降低默认的最低交易中继费率: Bitcoin Core 只中继那些按照每 vbyte 最少 1 satoshi 的费率(1 sat/vbyte)支付的单个未确认交易。如果一个节点的内存池中填满了最低费率为 1 sat/vbyte 的交易,则需要支付更高的费率。支付较低费率的交易仍然可以被矿工包含在区块中,并且这些区块将被转发。其他节点软件实施了类似的策略。

    过去曾讨论过降低默认最低费用(参见 Newsletter #3),但尚未合并到 Bitcoin Core。在过去的几周里,这个话题有了更多新的讨论

    • 单个变更的有效性:一些辩论单个节点运营商改变其策略的有效性如何。

    • 过去的失败:讨论提到之前降低默认费率的尝试曾被更低的费率所阻碍。低费率也降低了几次小规模拒绝服务 (DoS) 攻击的成本。

    • 备选的中继标准:建议违反某些默认标准(例如默认最低费率)的交易可以改为满足一些单独的、使 DoS 攻击成本变高标准——例如,将少量的 hashcash 式的工作量证明提交到待中继的交易上。

    在编写本文时,这些讨论还没有得出明确的结论。

Bitcoin Core PR 审核俱乐部

在这个每月一次的栏目中,我们会总结最近的一期 Bitcoin Core PR 审核俱乐部会议,提炼出一些重要的问题和答案。点击下方的问题描述,就可以看到来自会议的答案。

从 ArgsManager 解耦验证缓存的初始化是 Carl Dong 提交的一个 PR。它将节点配置逻辑与签名和脚本缓存的初始化分开,是 libbitcoinkernel 项目的一部分。

  • ArgsManager 是做什么的?它为什么应该或不应该属于在 src/kernelsrc/node

    ArgsManager 是一个用于处理配置选项(bitcoin.conf 和命令行参数)的全局数据结构。虽然共识引擎可能包含可参数化的值(即缓存的大小),但节点不需要保留此数据结构以达成共识。作为 Bitcoin Core 中特定的功能,处理这些配置选项的代码属于在 src/node。 

  • 什么是验证缓存?为什么它们属于 src/kernel 而不是 src/node

    当一个新块到达时,验证中计算成本最高的部分是对其交易的脚本(即签名)验证。由于拥有内存池的节点通常已经看到并验证了这些交易,因此通过缓存(成功)脚本和签名验证,可显着提高区块验证性能。这些缓存在逻辑上是共识引擎的一部分,因为对共识很关键的区块验证代码需要它们。因此,这些缓存属于 src/kernel。 

  • 一个事物是共识关键的但它本身并不是一个共识规则,这是什么意思?src/consensus 包含了所有对共识关键的代码么?

    参与者一致认为签名验证必须执行共识规则,而缓存不需要。但是,如果缓存代码中有 bug 导致存储了无效的签名,则节点将无法遵守共识规则。因此,签名缓存是被认为对共识关键的。共识代码实际上目前并不存在于 src/kernelsrc/consensus;许多共识规则和共识关键代码存在于 validation.cpp。 

  • 你会用什么工具来进行“代码考古”以理解一个值为什么会存在的背景?

    参与者列出了几个命令和工具,包括 git blamegit log、在拉取请求页面中输入提交哈希、查看文件时使用 Github 的 Blame 按钮以及使用 Github 搜索栏。 

  • 此 PR 将 signature_cache_bytesscript_execution_cache_bytes 的类型从 int64_t 修改为 size_tint64_tuint64_tsize_t 有哪些区别?为什么一个 size_t 类型的变量应当来保存这些值?

    int64_tuint64_t 类型在所有平台和编译器中都是 64 位的(分别为有符号和无符号)。size_t 类型是一种无符号整形,一定能保存内存中任何对象的长度(以字节为单位)数据;其大小取决于系统。因此,size_t 非常适合这些将缓存大小保存为字节数量的变量。 

软件的新版本和候选版本

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

重大代码及文档变更

本周内,Bitcoin CoreCore LightningEclairLDKLNDlibsecp256k1硬件钱包接口(HWI)Rust BitcoinBDKBitcoin Improvement Proposals (BIPs)Lightning BOLTs 出现的重大变更。

  • Bitcoin Core #25610 默认设置启动选项 -walletrbf 并为 createrawtransactioncreatepsbt RPC 默认使用 replaceable 选项。默认情况下,通过 GUI 创建的事务已经选用 RBF。这是在 Newsletter #208 中提到的更新之后,使节点运营商能够将其节点的交易替换行为从默认的选用 RBF (BIP125) 切换到完整的 RBF。在 2017 年,在 Bitcoin Core #9527 中有提出过默认选用 RPC。那时候主要的反对意见是当时太新、无法碰撞交易以及 GUI 没有禁用 RBF 的功能——这些在此之后都已得到解决。

  • Bitcoin Core #24584 修复选币算法以更倾向于由单一输出类型组成的输入集。这解决了混合类型输入集会揭示先前交易的输出变化的场景问题。它遵循了一个相关的隐私改进,以始终将零钱类型匹配到一个收款人的输出(请参阅 Newsletter #181)。

  • Core Lightning #5071 添加了一个记账插件,可通过运行该插件的节点提供对比特币移动的会计记录,还具有跟踪费用支出的能力。合并的 PR 包括几个新的 RPC 命令。

  • BDK #645 添加了一种方法来指定要签名的 taproot 花费路径。以前,BDK 会在可能的情况下为密钥路径的花费签名,并为它持有密钥的任何脚本路径的叶子节点签名。

  • BOLTs #911 为闪电网络节点增加了一个功能,可公告已解析为 IP 地址的 DNS 主机名。有关此想法的先前讨论在 Newsletter #167 中提到过。