Bitcoin Core 0.20.0 发布说明详解:BIP61 移除、UTXO 快照与 asmap 等关键变更

发布时间:2026/9/7 4:41:53
Bitcoin Core 0.20.0 发布说明详解:BIP61 移除、UTXO 快照与 asmap 等关键变更 Bitcoin Core 0.20.0 发布说明详解BIP61 移除、UTXO 快照与 asmap 等关键变更【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoinBitcoin Core 0.20.0 是 2019 年发布的稳定版本其发布说明doc/release-notes/release-notes-0.20.0.md记录了一批对节点运营者、钱包开发者和构建者都有实际影响的变更彻底移除 BIP61 reject 消息、引入dumptxoutsetUTXO 快照导出、新增rpcwhitelistRPC 权限白名单与实验性的-asmapASN 分桶选项、钱包默认改用 bech32 地址以及构建系统告别 OpenSSL 等。本文以该发布说明为主线逐项展开并结合当前仓库源码标注这些特性在代码中的落点与验证方式帮助读者既了解 0.20.0 的历史变更全貌又掌握在当前代码树中定位对应实现与测试的方法。升级方式与兼容性如何升级到 0.20.0发布说明给出的升级步骤非常直接若正在运行旧版本先将其关闭并等待它完全退出某些情况下可能需要几分钟因为涉及数据库与网络套接字的收尾Windows 上运行安装程序macOS 上替换/Applications/Bitcoin-QtLinux 上覆盖bitcoind/bitcoin-qt可执行文件从已到达生命周期终点EOL的旧版本直接升级是可行的但如果数据目录需要迁移可能需要额外时间旧版本格式的数据钱包一般仍可被新版加载。操作系统支持矩阵0.20.0 对平台支持的边界做了明确收缩与声明受支持平台Linux 内核系统、macOS 10.12 及以上、Windows 7 及以上这些平台经过广泛测试macOS 10.12 成为最低要求从 0.20.0 起更早的 macOS 不再受支持。源码层面可以佐证这一点变更日志中的 PR #17550Set minimum supported macOS to 10.12与 PR #18364移除针对 macOS 10.12 的getentropy()回退实现都落在平台支持类别中暗色模式该版本在 macOS 开启 Dark Mode 时不会改变界面外观属于已知限制其他类 Unix 系统通常可以运行但测试频率较低官方不建议在不受支持的系统上部署。已知问题源码压缩包tarball的构建回归0.20.0 为让源码发布包更完整而改变了 tarball 生成流程但带来了两个已知回归构建用户需要特别注意缺少configure脚本发布包中没有预生成的configure需要先安装 autotools 并运行./autogen.sh才能执行./configure——这与直接从 git 检出的行为一致需要指定环境变量构建不能直接make应运行BITCOIN_GENBUILD_NO_GIT1 make对应的底层变更是 PR #18331Use git archive as source tarball源码压缩包不再包含任何 autotools 产物因此构建者本机必须安装 autotools 及其他必需依赖。P2P 与网络层BIP61 reject 消息的彻底移除这是 0.20.0 中最具代表性的协议层变更。-enablebip61命令行选项用于开启 BIP61 建议的 reject 网络消息被完全删除PR #17004。该功能自 0.18.0 起已默认关闭本次是移除最后的开关。移除的核心理由在发布说明中写得很清楚网络上的节点包括它们发送的 reject 消息本身通常不可信因此 reject 消息只应在连接可信节点的场景下使用。在当前的仓库源码中搜索enablebip61已无任何结果印证该选项在当前代码树中已彻底不存在。移除后的替代方案发布说明针对原先依赖 BIP61 的几类使用场景给出了明确的替代路径调试 P2P 协议实现改用近期版本 Bitcoin Core 的日志输出。Bitcoin Core 将调试消息-debugcategory输出到控制台流-printtoconsole或调试日志文件-debuglogfiledebug.log。校验区块有效性使用专用 RPCsubmitblock提交区块并触发本地校验getblocktemplate且mode设为proposal用于校验可能带有无效 POW 的区块。校验交易有效性sendrawtransaction广播并观察接受结果testmempoolaccept仅做内存池接受性测试而不广播。钱包侧的语义修正钱包不应因为“没有收到 reject 消息”就认为交易已传播到全网而应监听其他节点对该交易的广播announce钱包也不应以“没有 reject”推断手续费足够。正确做法是使用费率估算fee estimation设置手续费并在交易超时未确认时用 replace-by-feeRBF提高手续费。附带影响RPC 与日志中的 reject codeBIP61 支持移除还带来两个次级变化testmempoolaccept与sendrawtransaction在交易未被内存池接受时不再返回 P2P reject 数字错误码但仍返回文字形式的拒绝原因verbal reject reason日志中此前在交易被内存池拒绝时报告 reject code 的信息现在只报告拒绝原因不再报告 code。从源码结构看与这一改动相关的清理包括变更日志中的 “#17004 Remove REJECT code from CValidationState”从验证状态机中移除 REJECT 码以及 “#17399 Templatize ValidationState instead of subclassing”。新增 RPCdumptxoutset 与 generatetodescriptor0.20.0 引入两个新 RPC分别服务于全节点运维与回归测试两大场景。dumptxoutsetUTXO 集合快照导出dumptxoutset将当前 UTXO 集合序列化为快照文件输出。发布说明指出配套脚本位于contrib/devtools目录用于在指定区块高度生成快照。在当前仓库中该功能已经演进为一条完整的 UTXO 快照工具链RPC 实现位于 src/rpc/blockchain.cpp 中的dumptxoutset()方法帮助文本给出了典型用法例如-rpcclienttimeout0 dumptxoutset utxo.dat latest并支持rollbackheight参数回滚快照实现中还包含修剪prune保护逻辑在导出期间注册高度上的修剪锁防止快照过程中数据被修剪掉快照转 SQL 的辅助脚本现位于 contrib/utxo-tools/utxo_to_sqlite.py功能测试包括 test/functional/rpc_dumptxoutset.py 与 test/functional/tool_bitcoin_chainstate.py该快照机制是后来 assumeutxo 功能的基础相关设计可进一步参阅 doc/assumeutxo.md。generatetodescriptorregtest 定向挖矿generatetodescriptorPR #16943允许 regtest 模式的测试者生成挖出任意输出脚本描述符的区块例如把区块奖励支付给指定的 P2WPKH 描述符地址简化了测试中对特定类型 UTXO 的构造。其功能测试可在测试目录中按 RPC 名称检索到变更日志类别 “Tests and QA” 中列有 “#16943 Add generatetodescriptor RPC”。RPC 更新与描述符能力增强sortedmulti 描述符接受描述符的 RPC 从 0.20.0 起支持新的sortedmulti(...)描述符类型PR #17056它支持多签脚本且在最终脚本中将公钥按字典序排序使多方各自提供的公钥顺序不同也能得到同一脚本是多方协作生成同一多签地址的关键能力。当前仓库中sortedmulti含 P2TR 环境下的变体sortedmulti_a的解析与执行实现集中在 src/script/descriptor.cpp解析入口通过Func(sortedmulti, expr)识别语法MultisigDescriptor以sorted标志区分普通multi与排序版本并限制multi/sortedmulti只能出现在顶层、sh()或wsh()中。相关单元测试位于 src/test/descriptor_tests.cpp。PSBT 相关 RPC 的默认行为变化walletprocesspsbt与walletcreatefundedpsbt现在默认在公钥附带 BIP32 派生路径在已知派生信息时可用bip32derivs参数设为false关闭PR #17264。这让外部签名工具硬件钱包、HWI 等能直接从 PSBT 中读取派生路径来匹配密钥bumpfee对禁用私钥watch-only/外部签名钱包使用时会返回 PSBT 而非直接签名交易PR #16373与 GUI 侧剪贴板行为呼应见下文 GUI 章节bumpfee的参数totalFee曾在 0.19 被弃用本版本正式移除PR #18312。其他 RPC 变更getpeerinfo新增mapped_as字段显示用于多样化对等点选择的映射自治系统号对应下文-asmap选项PR #16702。当前仓库中该字段贯穿多个文件RPC 输出在 src/rpc/net.cpp网络核心在 src/net.cpp、src/netgroup.cpp 与 src/addrman.cppCLI 展示在 src/bitcoin-cli.cppGUI 展示在 src/qt/rpcconsole.cppcreatemultisig与addmultisigaddress现在会返回新创建地址的输出脚本描述符PR #18032便于以描述符形式继续管理多签地址verifychain的默认参数改为静态值不再受命令行选项或配置文件-checklevel、-checkblocks影响需要非默认行为时可显式传参PR #18541getblockchaininfo的verificationprogress字段不再报告大于 1 的值修复了偶尔“验证进度超过 100%”的问题PR #17328。新配置参数rpcwhitelist 与 asmaprpcwhitelist / rpcwhitelistdefault按用户划分 RPC 权限新增的rpcwhitelist与rpcwhitelistdefault配置参数允许为特定 RPC 用户授予仅能调用部分 RPC 的权限PR #12763基于更早的 #12248。当前仓库中这两个参数的定义位于 src/init.cpp帮助文本说明了语义-rpcwhitelistwhitelist格式为USERNAME:rpc 1,rpc 2,...,rpc n为某个用户设置 RPC 调用白名单同一用户设置多个白名单时取交集-rpcwhitelistdefault控制默认行为。除显式设为 0 外只要设置了任意-rpcwhitelistRPC 服务器就视所有用户都受“未显式指定即为空白名单”的约束若设为 1 且未设置任何-rpcwhitelist则所有用户的白名单默认为空。白名单的实际执行发生在 HTTP RPC 层src/httprpc.cpp 在启动时读取-rpcwhitelistdefault与全部-rpcwhitelist条目并建立用户名到白名单的映射供请求分发时做权限过滤。对应的功能测试为rpc_whitelist测试变更日志中列有 “#17806 Change filemode ofrpc_whitelist.py”。-asmap基于 ASN 的连接多样化实验性新增-asmap配置选项通过把 IP 地址映射到自治系统号ASN并限制连往单个 ASN 的连接数来多样化节点的网络连接。发布说明明确指出这是实验性选项未来版本可能移除或发生破坏性变更因此默认仍沿用传统的 /16 前缀 IP 映射。实现脉络见变更日志 P2P 类别PR #16702 将 asmap 引入 addrman 的 IP 分桶#15437 之外的核心 PR即 “Supply and use asmap to improve IP bucketing in addrman”PR #17812 补充了配置、网络层细化与功能测试PR #18023 修复若干 asmap 相关问题。从源码结构看asmap 加载与分桶逻辑落在 src/addrman.cpp、src/netgroup.cpp 一带与getpeerinfo的mapped_as字段见上文 RPC 章节共同构成该特性。配置项更新、移除与行为变化更新设置启动配置写入调试日志所有在 Bitcoin Core 启动时配置的自定义设置现在都会写入debug.log便于排障PR #16115变更日志 Miscellaneous 类别 “On bitcoind startup, write config args to debug.log”bootstrap.dat 不再默认导入启动时通过bootstrap.dat导入区块的行为被移除现在必须用-loadblockfile显式指定文件PR #17044。当前仓库中loadblock的处理逻辑分布在 src/init.cpp、src/validation.cpp 与 src/node/blockstorage.cpp-debugdb更名为-debugwalletdb为了与coindb区分钱包数据库日志类别改名-debugdb被弃用并在下一个大版本移除PR #17410-walletnotify支持%w替换参数中的%w会被替换为触发通知的钱包名称Windows 平台不支持PR #13339。移除设置-whitelistforcerelay被移除PR #17985调查发现该参数自 0.13 起就已失效实际上近四年都未被真正支持移除属于清理。测试与配置注意事项在 testnet/regtest 网络下配置文件中未限定网络的walletdirpath现在是错误必须写成chain.walletdirpath或放入对应的[chain]段PR #17447“Make -walletdir network only”-fallbackfee默认值统一为 0此前主链默认 0禁用、测试链默认 0.0002现在全链统一为 0。testnet/regtest 用户若希望维持旧行为需要在配置中显式添加fallbackfee0.0002PR #16524带网络前缀的命令行选项变为错误形如-main.port8333、-test.server1这类带主网/测试网/回归网前缀的选项此前被允许但静默忽略现在启动时直接报 “Invalid parameter” 错误PR #17482。构建系统移除 OpenSSL、BIP70 与 glibc 2.17OpenSSL 被移除PR #17265Bitcoin Core 不再依赖 OpenSSL密码学实现完全由内置组件承担。这一变更还带动了一批清理如 “#17151 Remove OpenSSL PRNG seeding (Windows, Qt only)”、MSVC 构建说明中移除 Qt OpenSSL 链接等BIP70 支持完全移除--enable-bip70选项虽保留但在 configure 阶段会直接报错PR #17165发布二进制要求 glibc 2.17以保持与 RHEL 7、CentOS 7、Debian 8、Ubuntu 14.04 LTS 的兼容PR #17538源码压缩包不含 autotools 产物如前文“已知问题”所述需先./autogen.shPR #18331Android NDK 构建支持PR #16110为基于 Android 原生开发工具链的构建提供了支持后续 PR #17365 更新了 README 中可工作的 Android 目标与 API 级别说明。构建与 CI 侧的其他值得注意的变更包括S390X 与 POWER 目标支持PR #17678、--enable-determinismconfigure 选项PR #18135、cov_fuzz目标PR #18107、leveldb 更新到 1.22PR #17398、libevent 提升到 2.1.11PR #17008。当前仓库中构建系统已转向 CMake参见根目录 CMakeLists.txt 与 cmake/ 目录0.20.0 时代的 autotools 细节仅作为历史背景参考。GUI 变更macOS 移除“登录时启动”选项PR #17567Peers 窗口新增 “Mapped AS” 字段显示对等点对应的映射 ASN与-asmap功能联动PR #18402修复 0.18 遗留的多钱包 Coin Control 冲突0.18 发布说明中报告的“同时使用多个钱包与 GUI coin control 时出错”的问题在本版本修复PR #18894watch-only 钱包的 PSBT 剪贴板工作流PR #16944、#17492对于 watch-only 钱包在 Send 界面创建新交易或在 Transactions 界面对现有交易做提额bump fee时会自动把部分签名交易PSBT复制到系统剪贴板可直接粘贴到外部签名程序如硬件钱包交互工具完成签名。在 GUI 支持 PSBT 的最终签名与广播之前可先用调试控制台的finalizepsbt与sendrawtransactionRPC 完成收尾。这条链路与上文bumpfee在禁用私钥钱包时返回 PSBT 的行为、以及 PSBT RPC 默认附带 BIP32 派生路径的改动共同构成 0.20.0 的“离线签名”能力拼图。钱包行为变化默认地址类型改为 bech32通过 RPC 创建地址时默认使用 bech32 地址找零输出默认使用原生 segwitPR #16884。这直接降低了后续交易的手续费也推动了大量 RPC 示例文档同步改为 bech32变更日志 Documentation 类别多条输出可信度output trust计算修复IsTrusted现在递归扫描父交易影响确认/未确认余额状态与选币PR #16766钱包交易 RPC 暴露所在区块高度gettransaction、listtransactions、listsinceblock的响应新增交易所在区块的高度如存在PR #17437getaddressinfo字段弃用label字段被弃用本版本可用-deprecatedrpclabel恢复旧行为labels字段从 JSON 对象数组改为标签名 JSON 数组可用-deprecatedrpclabelspurpose恢复旧行为。兼容性参数预计在 0.21 移除PR #17585、#17578。工具与命令行层面bitcoin-cli -getinfo字段调整新增headers字段最佳头链上已下载的区块头数量与blocks并列与verificationprogress字段估计本地节点已同步的链比例同时移除了protocolversion、walletversion、keypoololdest字段PR #17302、#17650-stdinwalletpassphrase新参数调用walletpassphrase与walletpassphrasechange时可从标准输入读取钱包密码且不回显降低屏幕窥视风险既有的-stdinrpcpass也同步更新为不回显密码PR #13716。变更日志速览按类别0.20.0 的完整变更日志覆盖了 300 余个 PR按类别归纳如下完整列表见原文档 doc/release-notes/release-notes-0.20.0.md类别代表性变更Mining#18742 修复 validationinterface 中的 stack-use-after-return区块与交易处理#16902OP_IF/NOTIF/ELSE/ENDIF的 O(1) 实现#16974 无效时沿pindexBestHeader回退到ChainActive().Tip()#18500 更新 assumed valid hashP2P 与网络#15437 移除 BIP61 reject 消息#16702 asmap 改进 addrman IP 分桶#17951 用近期区块交易的 rolling bloom filter 做AlreadyHave()判断#17754 禁止解析含嵌入式 NUL 的字符串并加测试钱包#16884 默认地址类型改为 bech32#17261 将 ScriptPubKeyMan 变为真正的接口并支持多实例#16766IsTrusted递归扫描父交易RPC 与其他 API#12763 RPC 白名单#16899dumptxoutset#18346 为所有 RPC 调用声明 RPCResult 并在编译期强制检查GUI#18894 多钱包 手动 coin control 修复#18402 Peers 窗口显示 mapped AS构建系统#17265 移除 OpenSSL#17538 发布二进制 glibc 最低 2.17#17678 S390X/POWER 支持#18331 git archive 作为源码包平台支持#16110 Android NDK#17550 macOS 最低 10.12#17916 Windows 启用堆损坏即终止测试与 QA大量 fuzzing harness 增加#17009 系列、ASan stack-use-after-return 检查、s390x 大端平台 CI#17591、非标准交易系列单测/功能测试杂项#16115 启动时把配置写入 debug.log#15600 lockedpool 尽量用 madvise 避免敏感数据进 core dump小结与适用前提0.20.0 的发布说明是一份典型的“面向运维与开发的变更契约”BIP61 移除改变了 P2P 调试与钱包确认判定的语义rpcwhitelist与asmap分别扩展了 RPC 权限管理与网络拓扑控制能力dumptxoutset为 UTXO 快照生态奠基bech32 默认化则统一了钱包地址策略。阅读此类发布说明时的适用前提其中的默认值如-fallbackfee0与弃用时间表如-debugdb、-deprecatedrpclabel均以 0.20.0 为基准后续版本当前仓库已演进至 30 版本可能再次调整验证具体行为时优先以当前仓库的源码与功能测试src/、test/functional/为准而非仅依赖历史发布说明。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考