首页
/ Bitcoin Core 0.21.1 版本说明详解:Taproot 软分叉激活参数、Bech32m 地址编码与完整变更清单

Bitcoin Core 0.21.1 版本说明详解:Taproot 软分叉激活参数、Bech32m 地址编码与完整变更清单

2026-09-06 16:41:13作者:柯茵沙

本文基于 Bitcoin Core 官方发布的 0.21.1 版本说明文档,系统梳理该小版本的核心内容:Taproot 软分叉(BIP341,配套 Schnorr 签名 BIP340 与 Tapscript BIP342)的引入与 Speedy Trial 激活机制、BIP350 Bech32m 编码带来的 RPC 行为变化、升级与兼容性注意事项,以及完整的变更日志。读完后,你可以清楚理解 0.21.1 为共识层埋下的关键伏笔、它对矿工信号行为的要求,以及如何对照当前仓库源码验证这些能力的实现。

一、版本概览与升级方式

Bitcoin Core 版本 0.21.1 是一个小版本(minor release),官方说明中对其定位非常明确:包含多项缺陷修复、性能改进以及更新的翻译。对于正在运行旧版本的用户,官方给出的升级步骤是:

  1. 先关闭正在运行的旧版本节点,并等待其完全退出(某些情况下可能需要几分钟);
  2. 在 Windows 上运行安装程序;在 macOS 上覆盖 /Applications/Bitcoin-Qt;在 Linux 上直接覆盖 bitcoindbitcoin-qt 可执行文件。

官方同时指出:从已经停止维护(EOL)的旧版本直接升级到 0.21.1 是可行的,但如果数据目录需要迁移,可能耗时较长;旧版本的钱包文件在一般场景下仍然受支持。

兼容性方面,0.21.1 官方支持并经过充分测试的环境为:使用 Linux 内核的系统、macOS 10.12+ 以及 Windows 7 及更新版本。Bitcoin Core 在其他类 Unix 系统上通常也能工作,但测试覆盖较少,官方不建议在不受支持的平台上使用。需要特别注意的是,自 0.20.0 起,macOS 10.12 以下版本已不再受支持;此外当时 Bitcoin Core 的 GUI 在 macOS 开启"深色模式"时界面尚不会随之改变外观。

二、核心变化:Taproot 软分叉进入协议

0.21.1 最重要的一笔是内置了 Taproot 软分叉的主网与测试网激活参数,并同步加入了对 Schnorr 签名(BIP340)和 Tapscript(BIP342)的支持。这是该版本说明中篇幅最大、也最值得展开的部分。

2.1 Taproot 带来的能力

按照官方说明,如果 Taproot 被激活,单签名脚本、多签名脚本以及复杂合约的使用者都可以使用外观完全一致的承诺(commitment),从而提升隐私性和比特币的可互换性(fungibility)。对支出方而言,许多多签脚本和复杂合约可以像单签用户一样,以相同的效率、更低的费用,并享有相同规模的匿名集来完成签名。对全节点而言,Taproot 与 Schnorr 还带来了验证效率上的改进,例如批量化签名验证(batch signature verification)。官方将其定位为为未来可能进一步提升效率、隐私与可互换性的升级奠定基础。

2.2 Speedy Trial 激活机制与关键参数

Taproot 的激活采用 BIP9 versionbits 的一个变体——Speedy Trial(在 BIP341 中定义),其关键参数如下:

  • Taproot 的 versionbit 是 bit 2
  • 节点从 2021 年 4 月 24 日(Taproot 起始日)之后第一个难度调整周期(retarget period)的起点开始统计哪些区块在信号支持 Taproot;
  • 如果在 2021 年 8 月 11 日之后的第一个 retarget 周期开始前,任意一个 2,016 个区块(约两周)的 retarget 周期内超过 90% 的区块信号支持 Taproot,软分叉即锁定(locked in),并从 区块高度 709632(官方预期在 11 月初或中旬)正式激活;
  • 若 Speedy Trial 未能成功锁定,官方预期会部署一个补充的激活机制,并对 Speedy Trial 失败的原因做出修正。

2.3 本版本中 Taproot 功能的能力边界

官方说明对 0.21.1 的能力边界表述得非常克制,值得逐条理解:

  • 本版本包含向 Taproot 地址付款的能力,但在 Taproot 激活之前,向此类地址的付款不受共识保护(即"不安全");
  • 本版本包含在 Taproot 激活后中继(relay)和挖出(mine)Taproot 交易的能力;
  • 除了上述两项基础能力外,0.21.1 不包含任何让普通用户直接使用 Taproot 的代码;钱包层面的 Taproot 相关功能预计在 Taproot 激活确定之后才会在后续版本中加入。

对全体用户、企业和矿工的建议是:除非明确反对 Taproot 激活,否则应升级到本版本或后续兼容版本。一旦 Taproot 锁定,强烈建议在区块 709632 之前完成升级,以协助执行 Taproot 的新规则,并规避极小概率出现的"虚假确认交易"(falsely confirmed transactions)问题。

2.4 矿工信号行为的两种路径

官方为矿工给出了两条明确的路径:

  1. 自动信号(推荐):希望激活 Taproot 的矿工应优先使用本版本控制自己的信号。getblocktemplate RPC 的返回结果会在到达相应起点后自动更新以进行信号,并持续信号直至超时或 Taproot 激活为止;
  2. 手动信号:矿工也可以在任意时刻手动开始对 bit 2 进行信号;但一旦 Taproot 激活,必须确保在区块 709632 之前更新节点,否则未升级的节点可能导致其挖在无效链上。

在当前仓库的源码树中,可以印证这条演进脉络:共识部署的 bit 分配定义在 链参数实现 中(例如 DEPLOYMENT_TESTDUMMY 占据 bit 28,与 Taproot 的 bit 2 互不冲突);脚本验证标志位中将 btck_ScriptVerificationFlags_TAPROOT 定义为 1U << 17,注释明确标注"enable TAPROOT (BIPs 341 & 342)",见 内核接口头文件;而针对 BIPs 340-342 的完整功能测试 feature_taproot.py 覆盖了签名、叶脚本、annex、P2SH 包装、激活前后行为等大量场景,其中的 TaprootTest 测试类(约 第 1417 行)是验证该软分叉行为的直接依据。

三、RPC 行为变化:BIP350 与 Bech32m 编码

0.21.1 的另一个重要变化是实现 BIP350,它改变了所有接受地址的 RPC 在处理原生 witness version 1(或更高版本)地址时的行为:

  • 传入 witness v1+ 的地址时,现在要求使用 Bech32m 编码而不是原来的 Bech32 编码;
  • 此类地址在 RPC 输出中也将使用 Bech32m 编码;
  • 在主网上,在共识规则赋予 witness v1 地址含义之前(例如通过 BIP341),不应创建 witness v1 地址;一旦那发生,Bech32m 将成为预期编码;
  • 该变化不应影响任何生产系统(主网尚无 v1 地址语义),但已在其他网络(如 signet)观察到此类地址有意义的场景会感知到这一变化。

当前仓库源码直接印证了这一实现:编码类型枚举中定义了 BECH32M 并注明"Bech32m encoding as defined in BIP350",见 bech32 头文件;地址编解码逻辑中, witness v1 的地址统一走 bech32::Encode(bech32::Encoding::BECH32M, ...) 路径(key_io.cpp 第 66、78 行),并且解码时强制要求 version 非 0 的地址必须是 BECH32M 编码key_io.cpp 第 148 行),否则视为无效地址。BIP 实现状态可进一步参考仓库中的 BIP 实现表

四、0.21.1 完整变更清单

以下是官方变更日志的完整继承,按类别组织:

共识(Consensus)

  • #21377 versionbits 的 Speedy Trial 支持(ajtowns)
  • #21686 Taproot 的 Speedy Trial 激活参数(achow101)

P2P 协议与网络代码

  • #20852 允许非 IP 网络的 CSubNet(vasild)
  • #21043 规避 ProcessMessage(…) 中的 UBSan 警告(practicalswift)

钱包(Wallet)

  • #21166 引入 DeferredSignatureChecker,并让 SignatureExtractorClass 继承它(achow101)
  • #21083 避免在选币(coin selection)过程中多次请求费率(achow101)

RPC 与其他 API

  • #21201 在私钥被禁用时禁止 sendtoaddress 和 sendmany(achow101)

构建系统(Build system)

  • #21486 在 *ifaddrs 需要时链接 -lsocket(fanquake)
  • #20983 修复 gui#176 之后的 MSVC 构建(hebasto)

测试与 QA

  • #21380 为 versionbits 添加模糊测试(fuzzing)测试器(ajtowns)
  • #20812 / #20740 / #21397 多次更新 FuzzedDataProvider.h(MarcoFalke、practicalswift、MarcoFalke)
  • #21446 更新 vcpkg 检出提交(sipsorcery)
  • #21081 修复 feature_taproot 测试中的不可达代码(brunoerg)
  • #20562 测试已完全签名的交易传给 signrawtx 后保持不变(achow101)
  • #21571 确保非 IP 的对等节点被劝退并断开(vasild、MarcoFalke)
  • #21489 versionbits 模糊测试器的清理(ajtowns)

其他(Miscellaneous)

  • #20861 BIP350:实现 Bech32m 并用于 witness v1+ 地址(sipa)

文档(Documentation)

  • #21384 在 bitcoin.conf 文档中补充 signet 说明(jonatack)
  • #21342 移除过时注释(hebasto)

五、贡献者与致谢

0.21.1 版本直接贡献者包括:Aaron Clauson、Andrew Chow、Anthony Towns、Bruno Garcia、Fabian Jahr、fanquake、Hennadii Stepanov、Jon Atack、Luke Dashjr、MarcoFalke、Pieter Wuille、practicalswift、randymcmillan、Sjors Provoost、Vasil Dimov、W. J. van der Laan,以及所有参与翻译工作的社区成员。

六、小结

Bitcoin Core 0.21.1 是一个"为共识升级铺路"的版本:它以 Speedy Trial 参数(bit 2、90%/2,016 区块、区块 709632)把 Taproot 软分叉正式写入节点行为,同时用 BIP350 Bech32m 为 witness v1+ 地址确立了新的地址编码标准,并通过 feature_taproot.pykey_io.cpp 等源码与测试保证了这些能力可被验证。理解这份版本说明,是把握 Bitcoin 从 BIP300 系列之后又一次重大协议演进——Taproot 上线过程——的关键起点。

登录后查看全文
热门项目推荐
相关项目推荐