Bitcoin Core 0.13.2 发行说明精读:系统兼容策略、钱包内存池拒绝行为变更与完整修复清单
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 起不再支持
官方给出的理由链值得参考:
- 操作系统本身已 EOL:微软于 2014 年 4 月 8 日终止对 Windows XP 的支持,连关键安全更新都不再提供。发行说明认为在没有安全更新的环境下运行钱包“至少是不负责任的”。
- 上游库不再测试:0.12.x 时代已出现 Bitcoin Core 在 Windows XP 上随机崩溃的多种报告,崩溃根源不明确,但很可能是 Qt 等上游库已不再在 XP 上测试所致。
- 资源约束:项目没有时间也没有资源去支持一个 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 影响面的必要步骤。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00