作者:Namcios

来源:https://bitcoinmagazine.com/technical/bitcoin-core-24-0-released-what-is-new

最早由中本聪在 2009 年发布的软件,现在发布了一个新版本。

Bitcoin Core 24.0 由 112 名开发者,耗时约 7 个月开发而成,给 Bitcoin Core 的钱包模块、点对点(P2P)通信、图形用户界面等等,带来了可观的提升。

本文介绍了一些重要的变更。

钱包模块升级

初步的 Miniscript 支持

Bitcoin Core 24.0 通过拓展 wsh() 输出操作符,引入了对 Miniscript 的支持。虽然这还是初步的集成,但也为在比特币上更简单、更安全地部署更复杂的脚本提供了帮助。

Miniscript 可以被认为是 Bitcoin Script(比特币的原生编程语言)的一种框架(或者说模板)。Bitcoin Script 负责支持比特币可用的所有编程功能,其中就包括(举个例子)可能是最简单的一种程序(脚本):决定谁可以花费某一笔资金。对每一笔比特币交易,发送者都要请求接收者的地址,并使用这一信息构造一个脚本,将支付的数额锁定,使得只有接收者可以花费它。虽然用 Bitcoin Script 可以很容易构造这样的简单脚本,但更复杂的脚本就有更大概率遇上人力出错。这就是为什么我们需要 Miniscript。

Miniscript 允许我们以 结构化 的方式编写 Bitcoin Script 的子集。它支持分析、组合、通用签名,等等,让开发者可以更安全地编写更高级的脚本。换句话来说,Miniscript 将预定义的 Bitcoin Script 的一些功能模块 “装载” 到了一套符合预期的行为模式中,从而限制了最终的风险,因为尽可能地减少了意外的行为。在实践中,它为开发者修补和创建更高级、更复杂的比特币脚本提供了一个 “工具箱”,而不是只能手动操作 Bitcoin Script。

从 Bitcoin Core 24.0 开始,用户将可以创建包含一段 Miniscript 脚本的钱包、为之创建地址并充值资金。但 Bitcoin Core 的钱包模块还不支持从这些地址中花费,意思是就当下而言,Bitcoin Core 中启用了 Miniscript 的钱包只能用作观察。

不设找零的交易

Bitcoin Core 24.0 引入了一种新的 RPC, sendall ,允许用户完全花费掉特定的 UTXO。这个 RPC 将把指定 UTXO 中的价值完全转移到一个或多个接收者处,而不会产生找零。(默认情况下, sendall 会花掉钱包中的所有 UTXO。)

这种行为在一些情况下是有用的。第一种自然是用户想要清空自己的钱包的时候。调用这个新的 PRC,仅使用默认的配置,就可以轻松完成清空钱包的操作。其次,客户可能希望通过放弃找零来提高隐私性。

找零地址是很棘手的,因为用户经常不知道它们是怎么来的,而且用可能会在未来的交易中跟其他 UTXO 一起作为输入;这会因为 “输入所有权同一启发法” 导致隐私性风险 —— 这是一种在区块链分析中常用的工具,它假设一笔交易的所有输入都来自于同一个用户。如果找零输出跟别的输出混在一起,用户就会制造出这种关联,产生让自己的多笔资金去匿名化的风险,因为分析师会将这多个地址都归类为同一个钱包。

不设找零的支付,通过创建完全花费选定的 UTXO 的交易,解决了这个问题。因为没有找零,用户就不会犯上面提到的错误。而且,无找零的支付给区块链分析带来了一个合理的疑难:新输出到底是由发起支付的人自己拥有的(即只是转移了资金到新的地址)呢,还是变换了所有者。

(译者注:作者这里的推理是不成立的。因为找零地址跟普通收款地址没有任何区别,找零输出不是因为其地址上的特征而被辨认为找零的;而找零输出之所以要跟收款输出混用,是因为其面额不足。所以,就算不使用找零地址,也一样会有被辨认为找零的输出(除非输入的面额刚刚好);而这样的输出一旦面额不足以支付,一样会跟别的输出混用,从而被启发式分析捕捉。事实上,这个功能只有管理上的便利 —— 用户可以手动避免使用 “找零地址”,也即跟收款地址的推导路径不一样的地址 —— 但不可能因此就不再产生找零输出。)

找零输出随机化,以避免留下痕迹

如上所述,找零输出可能会泄露隐私。虽然 sendall 可以减少对找零地址的使用,但在现实中,很少时候用户会刚好持有跟支付数目相等的面额的 UTXO。保证观察者无法辨认哪个输出是找零可以帮助用户获得少许隐私性,因为将难以把新创建的输出(找零输出)跟现在被花费的输入关联起来。

通常,当没有一个 UTXO 的面额恰好相当于支付的需要事,大部分钱包和用户会按直觉选择面额最接近于支付需求的 UTXO。结果是,观察者可以很清楚的看出哪个输出是支付(通常是更大的那个)、哪个输出是找零(更小的那个)。这带来了上面提到的许多风险。

为了降低观察者分辨出找零输出并归集用户地址的可能性,Bitcoin Core 现在会随机化找零输出的面额。

从 Bitcoin Core 24.0 开始,钱包模块将在支付数额与支付数额的三倍值之间选出一个随机数。这个数字将为 UTXO 选择提供指引。本质上,这意味着有时候宣发会选出一个 UTXO,其面额跟支付额是很接近的,但有时候,它会选出一个 UTXO,其面额会跟支付额的三倍更接近。前者会产生一般化的、找零输出面额低于支付输出的交易;而后者会产生相反的情形,找零输出会大于支付输出。因为区块链观察者无法辨别一笔交易到底是哪一种情形,用户自然就获得了更好的隐私性保证。

升级 “手续费替换(RBF)”

在比特币用户将交易发送到网络中时,RBF 给用户提供了选择权。通常,用户不想给矿工太多手续费,因此在手续费和区块确认速度之间选择一个平衡点。但是,如果用户选择的手续费数值太低,或者说交易池正在拥堵,那么交易可能要花很长时间才能得到确认(甚至会卡在交易池里面)。RBF 让用户可以追加手续费,通常都能更快处理。

从原理上来说,RBF 并没有 “追加” 手续费,只是软件会广播一笔 的交易,使用跟原版交易同样的输入以及大部分相同的输出(一些输出的面额改变了,因此手续费的数值自然也改变了)。

在以前,节点只会转发它们见到的交易的第一个版本。而有了 RBF 之后,就出现了一种机制(译者注:即 BIP125),让用户可以自己用标签表示发起的这笔交易是否能被追加手续费,也即被带有更高手续费的版本替换。这是对节点的提醒,让他们知道可能后面会出现同一笔交易的更高手续费的版本,而且他们也应该转发。更高手续费的替换版本有概率会被矿工认为有吸引力,因此打包到下一个区块。替换版本得到确认之后,更低手续费的版本就会从节点的交易池中剔除,因为它们变成了重复花费的交易。

Bitcoin Core 24.0 给 RBF 模块引入了两种更新。

首先,它让用户可以配置节点,转发一切交易的替换版本,不论 交易本身是否使用了 RBF 标签。这可以通过新的 mempoolfullrbf 选项来配置。这个选项默认是 关闭 的,但有兴趣的人可以打开它。

其次,RBF 现在变成了 Bitcoin Core 钱包模块的标准,交易会默认使用 RBF 标签,而且 -walletrbf 选项默开启。用户可以在交易构建流程中改变 RBF 选项,也可以将 -walletrbf 启动选项设为关闭。

描述符钱包迁移

Bitcoin Core 23.0 让描述符钱包变成了标准。描述符可以帮助用户以标准化的格式备份钱包以及恢复备份。

在描述符出现之前,用户需要知道自己的钱包的派生路径,这个路径指明了钱包的主私钥如何推导出地址,用户接收和发送比特币。因为钱包可以有不同的推导路径,所以光备份种子词已经不足以保证能恢复钱包了。有时候用户比较幸运,新钱包软件跟老钱包软件恰好使用了相同的派生路径,所以种子词备份能顺利复原钱包;但也有小概率用户无法顺利恢复,因此出现了一个网站专门帮助用户搞清楚不同软件所用的派生路径。

描述符通过 描述 备份所用的派生路径,解决了这个问题、显著优化了用户体验。它背后的理念是,一个描述符钱包备份,自身就包含了让任意的软件正确恢复钱包的所有必要信息(只要这个软件支持描述符)。

现在,Bitcoin Core 24.0 引入了一种新工具,将传统的钱包迁移成描述符钱包,让用户能够利用这种新兴的标准,更好地保护用户的珍贵的比特币。虽然它还是一个实验性的功能,它也有一种新的 RPC( migratewallet )。这份文档提供了更多细节。

图形用户界面(GUI)变更

众所周知,Bitcoin Core GUI 没能提供媲美远程过程调用(PRC)和命令行工具的功能。Bitcoin Core 24.0 为此采取了一些措施。

Bitcoin Core 24.0 给 GUI 带来了一个新的菜单,让用户可以从备份中恢复一个钱包,因此不懂技术的用户也更容易复原钱包了。以前,这个功能还只存在于命令行中。

与 RPC 接口相比,GUI 的另一个缺点是 Bitcoin Core 客户端的设定。以前, bitcoin.conf 文件可以说是 Bitcoin Core 配置的圣杯,但它也主要是通过命令行来调整的。GUI 中也存在一个调整设定的选项,但一个警告明确指出,如果文件和 GUI 尝试设置同一项设定,文件的优先级高于 GUI。因此,虽然 GUI 提供了改变设定的简单选项,但配置文件依然是定制化你的 Bitcoin Core 客户端的最可靠的方法。

Bitcoin Core 24.0 改变了这一点。这次的更新将 GUI 的设定页与 bitcoin.conf 文件统一了起来。现在,当用户在 GUI 打开客户端设置时,其中的内容是从配置文件中拉取过来的。类似地,GUI 中作出的配置变更,也会反映在 bitcoin.conf 里面。(值得一提的是,两者的关系是间接的,因为 GUI 作出的变更会写在 settings.json 文件里面,这个文件优先于 bitcoin.conf 。)

P2P 通信的变更

下载区块头的新逻辑

Bitcoin Core 24.0 为节点在网络中捕捉区块链顶端的方式带来一种升级;不论节点是第一次加入网络,还是因长时间离开网络而必须捕捉最新区块。

在本次更新以前,刚加入比特币网络的新节点要先寻找对等节点,然后从对等节点开始下载区块头。这些新节点一开始不会下载完整的区块,因为节点被引导在下载一条链的区块之前先检查这条链是不是最值得信任的一条。不然,节点就会承担下载错误链上的区块、从而浪费资源的风险。

虽然下载区块头的目的是节约时间和资源,依然有可能出现一种资源耗尽攻击,就是恶意的对等节点发送大量的假区块头给请求区块头的节点。因为节点需要下载和保存区块头在硬盘上,大量的数据可能导致节点的硬件过载。

为了缓解这种威胁,Bitcoin Core 在几年前引入了 “检查点” 的概念。检查点决定了一条链 必须 包含 某一些区块,才是有效的。但是,这种解决方案会带来一种新问题 —— 检查点可能被滥用,导致实质上的最长链被否定。这种可能性在比特币中是不受欢迎的,所以我们必须提出另一种解决方案。这就是这次的升级。

在 Bitcoin Core 24.0 中,节点会下载区块头两次。在第一轮中,节点只会下载,但随后就抛弃掉(不会保存在硬盘中),知道发现足够多的工作量证明 —— 表明这条链是对的那一条。这时候,节点就会重新开始下载区块头,但这一次,节点会将区块头保存在硬盘中。先确保自己所下载的区块头是具有足够多的工作量证明的链的一部分、再保存区块头到硬盘上,节点避免了在可能的攻击(例如资源耗竭攻击)中花费大量存储资源。这也移除了设置检查点的需要,而且可以说是一种更优雅的解决方案,因为它不依赖人力输入来决定链的有效性。

感谢 Aaron van Wirdum 的反馈。

要了解更多细节和其它变更,请看 Bitcoin Core 24.0 更新说明。要下载 Bitcoin Core 24.0,请到这个网页。关于 Bitcoin Core 24.0 的细节,也在 Bitcoin, Explained 播客的第 65 期有解释。

(完)