首页
/ Bitcoin Core 0.13.2 发行说明精读:系统兼容策略、钱包内存池拒绝行为变更与完整修复清单

Bitcoin Core 0.13.2 发行说明精读:系统兼容策略、钱包内存池拒绝行为变更与完整修复清单

2026-09-06 15:15:25作者:苗圣禹Peter

Bitcoin Core 0.13.2 是一个以缺陷修复与性能改进为主的次要版本,官方发行说明(doc/release-notes/release-notes-0.13.2.md)记录了它的重要决策:正式放弃 Windows XP 与 OS X 10.7 的支持、改变钱包交易被内存池拒绝时的处理方式,以及涵盖共识、RPC、P2P、构建系统等多个维度的修复清单。读完本文,你将理解 0.13.2 版本兼容性策略背后的工程权衡、abandontransaction 这类钱包 RPC 的语义边界,并掌握该版本全部行为级变更的检索入口(PR 编号与合并提交哈希)。

版本定位:bugfix 与性能改进的次要发布

发行说明开篇即明确 0.13.2 的性质:这是一个新的次要版本(minor version release),包含各类缺陷修复、性能改进和更新的翻译。发布说明同时给出了三条官方协作渠道的惯例指向——通过 Bitcointalk 风格的 issue tracker 报告缺陷、订阅官方公告邮件列表获取安全与更新通知、从官方网站下载对应平台的二进制包。对于以二进制分发的节点软件而言,这类发行说明是运维人员核对补丁覆盖范围的第一手依据。

兼容性策略:为什么放弃 Windows XP 与 OS X 10.7

0.13.2 发行说明中最有决策参考价值的部分是“Compatibility”章节,它记录了两条兼容性边界。

Windows XP:自 0.13.0 起不再支持

官方给出的理由链值得参考:

  1. 操作系统本身已 EOL:微软于 2014 年 4 月 8 日终止对 Windows XP 的支持,连关键安全更新都不再提供。发行说明认为在没有安全更新的环境下运行钱包“至少是不负责任的”。
  2. 上游库不再测试:0.12.x 时代已出现 Bitcoin Core 在 Windows XP 上随机崩溃的多种报告,崩溃根源不明确,但很可能是 Qt 等上游库已不再在 XP 上测试所致。
  3. 资源约束:项目没有时间也没有资源去支持一个 EOL 操作系统。

官方同时明确了责任边界:不采取任何措施阻止软件在 XP 上安装或运行,用户可自行承担风险继续运行,但不应期望其正常工作,也不应将 XP 相关问题提交到 issue tracker。这种“声明不支持但不硬性拦截”的做法,是处理遗留操作系统支持时的一种务实模式。

OS X:自 0.13.1 起要求 10.8+

发行说明指出,0.13.0 原本目标是支持 10.7 及以上,但 10.7.x 上 libc++ 版本的严重问题导致其无法可靠运行。因此 0.13.1 起将最低要求提高到 OS X 10.8,并且向 10.7 用户明确告知不兼容,而不是让其遭遇意外崩溃。这个细节体现了发行说明一贯的工程态度:与其静默失败,不如在启动阶段就向用户报错。

显著变更:钱包对内存池拒绝的处理方式

这是 0.13.2 唯一单列的 Notable change,也是运维和开发者最该理解的行为变更。

旧行为:RPC 报错但交易仍滞留钱包

在 0.13.2 之前,当一笔新创建的交易因为“未确认交易链”(chains of unconfirmed transactions)的数量限制而无法进入内存池时,发送该交易的 RPC 调用会返回错误。但交易实际上仍然留在钱包中,要等到部分父交易确认、并且软件重启之后才会被广播。也就是说:RPC 语义上失败,钱包行为上却延迟成功,两个层面相互矛盾。

新行为:返回成功并在重新广播时机自动重试

0.13.2 将行为改为:RPC 返回成功,并在每次尝试重新广播(transaction rebroadcast)时同步重试内存池插入,从而避免了需要重启才能完成广播的问题。

从当前仓库的源码结构看,这条修复链的落点在钱包的 RelayWalletTransaction 路径(0.13.2 changelog 中对应 #9290 "Make RelayWalletTransaction attempt to AcceptToMemoryPool" 与 #9302 "Return txid even if ATMP fails for new transaction"):即使交易当时无法进入内存池(ATMP 失败),发送类 RPC 也会返回 txid,钱包会在后续时机持续重试。内存池准入的祖先/后代链限制(limitancestorcount 等参数)本身的语义说明,可参考当前的 mempool 设计文档

兜底手段:abandontransaction

发行说明特别提示:对于无法被内存池接受的钱包交易,可以用既有 RPC abandontransaction(或在 GUI 中通过交易右键上下文菜单)将其标记为废弃。该 RPC 的现行实现位于 src/wallet/rpc/transactions.cpp,其帮助文本完整描述了语义边界,可作为理解 0.13.2 行为的佐证:

  • 会将该交易及钱包内所有其后代交易标记为 abandoned,从而允许其输入被重新花费;
  • 适用于“卡住”或被逐出(evicted)的交易;
  • 仅对未包含在任何区块中且当前不在内存池的交易生效;
  • 对已废弃的交易无效果;
  • 实现上校验 txid 必须属于当前钱包(否则报 Invalid or non-wallet transaction id),且交易必须满足废弃资格(否则报 Transaction not eligible for abandonment)。

这套“发送成功 + 自动重试 + 可手动废弃”的三段式处理,是排查钱包交易长期处于“未确认”状态时的标准排查路径:先确认祖先链深度是否触发准入限制,再决定等待确认还是主动废弃。

0.13.2 变更清单逐类解读

以下完整继承发行说明的 Detailed release notes(含 PR 编号与合并提交短哈希,便于在代码库中定位对应变更与讨论),并按类别补充解读。

Consensus(共识)

PR 合并提交 内容
#9293 e591c10 [0.13 Backport #9053] IBD 使用 chainwork 而非高度判断,且不使用 header 时间戳(gmaxwell)
#9053 5b93eee IBD 使用 chainwork 而非高度、不使用 header 时间戳(gmaxwell)

这一条是共识相关变更:初始区块下载(IBD)期间判断某条分叉是否为最有利链,改为以**累计工作量(chainwork)**为准而不是区块高度,并且不再依赖(不受信)的区块头时间戳。以工作量作为分叉选择依据是共识正确性的核心原则,#9293 是该修复向 0.13 分支的回移。当前仓库中 chainwork 依然是链上数据结构的一部分,可在此版本之后各系列的共识代码中继续追踪。

RPC and other APIs

PR 合并提交 内容
#8845 1d048b9 不再返回 P2SH 套 P2SH 的地址(jnewbery)
#9041 87fbced keypoololdest 表示 Unix epoch 秒而非 GMT(s-matthew-english)
#9122 f82c81b 修正 getnettotals RPC 中 timemillis 的描述(visvirial)
#9042 5bcb05d ParseHash:长度不是 64 时直接失败(MarcoFalke)
#9194 f26dab7 RPC 增加返回非 segwit 序列化的选项(instagibbs)
#9347 b711390 [0.13.2] wallet/rpc 回移批次(MarcoFalke)
#9292 c365556 指定未知 rpcserialversion 时报错(sipa)
#9322 49a612f [qa] 测试中不再设置未知 rpcserialversion(MarcoFalke)

值得留意的两点:其一,#9041 是典型的“字段语义修正”——keypoololdest 从时间上改为自 Unix epoch 起的秒数,与 keypoololdest 相关字段(如 keypoololdest 对应时间戳)的脚本兼容性需要一并核对;其二,#9292 体现了 RPC 序列化版本协商的严谨化:客户端若声明服务端不认识的 rpcserialversion,服务端会明确报错而不是静默降级,配套的 #9322 则修正了 QA 测试自身的不当用法。ParseHash 的长度校验(#9042)则是哈希解析入口的防御性加固,当前仓库中同类哈希参数解析仍遵循“非法长度立即失败”的原则。

Block and transaction handling

PR 合并提交 内容
#8357 ce0d817 [mempool] 修复 relaypriority 计算错误(maiiz)
#9267 0a4aa87 [0.13 backport #9239] 禁用“1 个区块确认”目标的费率估算(morcos)
#9196 0c09d9f invalidateblock 时发送 tip change 通知(ryanofsky)

其中 #9267 对应 estimatesmartfee 等费率估算 RPC 的边界修正:对 confirm target 为 1 的查询返回无估算结果而非可疑数值,避免脚本依据无效费率构造交易。#9196 则打通了 invalidateblock 与 tip 变更通知链(GUI、ZMQ 等依赖 tip 变更回调的组件能即时感知无效化结果)。

P2P protocol and network code

PR 合并提交 内容
#8995 9ef3875 ::GETBLOCKTXN 处理补上缺失的 cs_main 锁(TheBlueMatt)
#9234 94531b5 torcontrol:显式请求 RSA1024 私钥(laanwj)
#8637 2cad5db Compact Block 调整(#8235 的 rebase)(sipa)
#9058 286e548 修复 p2p-compactblocks.py 在 travis 上的测试超时(ryanofsky)
#8865 4c71fc4 将 peer 处理逻辑与区块连接逻辑解耦(TheBlueMatt)
#9117 6fe3981 版本握手完成前不发送 feefilter 消息(theuni)
#9188 ca1fd75 孤立交易父交易抓取改为请求 witness(gmaxwell)
#9052 3a3bcbf AttemptToEvict 使用 RelevantServices 替代 node_network(gmaxwell)
#9048 9460771 [0.13 backport #9026] 修复无效 compact block 的处理(sdaftuar)
#9357 03b6f62 [0.13 backport #9352] 从所有 compact block 广播中尝试重建(sdaftuar)
#9189 b96a8f7 支持 GBT 客户端时始终添加 default_witness_commitment(sipa)
#9253 28d0f22 修复需绑定 socket 数量计算(TheBlueMatt)
#9199 da5a16b 新增 HB peer 时始终剔除偏好最低者(gmaxwell)

这一类修复集中在 compact blocks(BIP 152 系列)与协议状态安全上:#8995 是典型的并发锁遗漏修复(GETBLOCKTXN 处理需要持 cs_main);#9117 保证 feefilter 消息不会在版本握手完成前发出,避免对旧式节点发送无法理解的消息;#9357/#9048/#8637 三条共同强化了“从多个 compact block 广播中尝试重建、并正确处理无效 compact block”的健壮性;#9189 保证挖矿侧(GBT 客户端)在 segwit 激活后始终携带默认 witness 提交。另外,#9234 的 Tor 控制通道显式请求 RSA1024 私钥的修复,在当前仓库的 Tor 控制测试 src/test/torcontrol_tests.cpp 中仍有对应断言(期望返回形如 PrivateKey=RSA1024:BLOB 的解析结果),说明这一行为契约延续到了后续版本。

Build system

PR 合并提交 内容
#9169 d1b4da9 修复 macOS 下 qt5.7 构建(theuni)
#9326 a0f7ece 适配 OpenSSL 1.1 API(gmaxwell)
#9224 396c405 防止 OpenBSD 上 FD_SETSIZE 构建错误(ivdsangen)

#9326 对当时正在普及的 OpenSSL 1.1 API 做了兼容处理,属于构建侧的前瞻性适配。

GUI

PR 合并提交 内容
#8972 6f86b53 警告标签可选择(可复制)(jonasschnelli)(MarcoFalke)
#9185 6d70a73 修复 coincontrol 排序问题(jonasschnelli)
#9094 5f3a12c 使用正确的转换函数处理 boost::path 的 datadir(laanwj)
#8908 4a974b2 更新 bitcoin-qt.desktop(s-matthew-english)
#9190 dc46b10 修复多处内存泄漏(laanwj)

Wallet

PR 合并提交 内容
#9290 35174a0 让 RelayWalletTransaction 尝试 AcceptToMemoryPool(gmaxwell)
#9295 43bcfca 修复 fundrawtransaction:keypool 为空时不再终止(jonasschnelli)
#9302 f5d606e 新交易 ATMP 失败时仍返回 txid(sipa)
#9262 fe39f26 优先选择祖先更少的币、ATMP 前做合理性检查(instagibbs)

这四条即上文“显著变更”一节对应的钱包侧修复组合:#9290 + #9302 构成“发送即成功、后续重试”的新语义,#9262 在选币阶段就规避深祖先链导致的 ATMP 失败,#9295 修复 keypool 耗尽时 fundrawtransaction 直接终止进程的崩溃。

Tests and QA

PR 合并提交 内容
#9159 eca9b46 p2p-compactblocks 改为等待特定区块广播(ryanofsky)
#9186 dccdc3a 修复 scheduler 测试中的 use-after-free(laanwj)
#9168 3107280 新增 assert_raises_message 以断言具体错误信息(mrbandrews)
#9191 29435db 0.13.2 测试回移批次(MarcoFalke)
#9077 1d4c884 增大 wallet-dump RPC 超时(ryanofsky)
#9098 ecd7db5 处理僵尸进程与残留临时目录(MarcoFalke)
#8927 387ec9d 为 segwit 前后脚本的 FindAndDelete 增加脚本测试(jl2012)
#9200 eebc699 bench:修复迭代计数重新缩放时的细微计数问题(laanwj)

其中 #9159 与 P2P 类中的 #9058 呼应:compact blocks 的 QA 测试从“易超时”改造为等待明确的区块公告,属于测试稳定性工程,而非产品行为变化。

Miscellaneous

PR 合并提交 内容
#8838 094848b CreateNewBlock() 中正确计算区块大小与权重(jnewbery)
#8920 40169dc 最低 Boost 版本要求设为 1.47.0(fanquake)
#9251 a710a43 改进命令行参数 'whitelist' 的文档(wodry)
#8932 106da69 允许 bitcoin-tx 创建 v2 交易(btcdrak)
#8929 12428b4 增加 software-properties-common 依赖(sigwo)
#9120 08d1c90 修复 #9067 重构中遗漏的一处 "return false"(UdjinM6)
#9067 f85ee01 修复退出码(UdjinM6)
#9340 fb987b3 [0.13] 更新 secp256k1 子树(MarcoFalke)
#9229 b172377 移除对 getaddrinfo_a 的调用(TheBlueMatt)

#8932 允许 bitcoin-tx 生成 version 2(segwit 格式)交易,是离线构造 segwit 交易工具链补齐的一环;#9340 的 secp256k1 子树更新则属于安全相关依赖的例行同步;#8920 明确了最低 Boost 版本,对 0.13.2 时代使用 autotools 构建的开发者是直接约束(当前仓库已切换为 CMake 构建体系,见根目录 CMakeLists.txt)。

贡献者致谢

发行说明感谢了直接参与本次发布的贡献者:

  • Alex Morcos
  • BtcDrak
  • Cory Fields
  • fanquake
  • Gregory Maxwell
  • Gregory Sanders
  • instagibbs
  • Ivo van der Sangen
  • jnewbery
  • Johnson Lau
  • Jonas Schnelli
  • Luke Dashjr
  • maiiz
  • MarcoFalke
  • Masahiko Hyuga
  • Matt Corallo
  • matthias
  • mrbandrews
  • Pavel Janík
  • Pieter Wuille
  • randy-waterhouse
  • Russell Yanofsky
  • S. Matthew English
  • Steven
  • Suhas Daftuar
  • UdjinM6
  • Wladimir J. van der Laan
  • wodry

以及所有参与翻译的志愿者。

小结:从一份发行说明能读到的工程信息

0.13.2 的发行说明虽然篇幅不长,却展示了三个可复用的工程实践:兼容性边界要写明理由与责任归属(XP/10.7 的处理方式);行为变更要单列 Notable change 并给出兜底手段(内存池拒绝处理 + abandontransaction);变更清单保留 PR 编号与合并哈希以便逐条追溯。对维护脚本、钱包工具或依赖特定 RPC 字段语义的下游项目而言,核对这份清单(尤其是 #9041 的 keypoololdest 语义修正与 #9194 新增的非 segwit 序列化选项)是评估从 0.13.1 升级到 0.13.2 影响面的必要步骤。

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