Bitcoin Core 0.13.0 版本发布笔记:Compact Blocks、HD 钱包、SegWit 准备与 dbcache 扩容深度解读

发布时间:2026/9/7 2:07:23
Bitcoin Core 0.13.0 版本发布笔记:Compact Blocks、HD 钱包、SegWit 准备与 dbcache 扩容深度解读 Bitcoin Core 0.13.0 版本发布笔记Compact Blocks、HD 钱包、SegWit 准备与 dbcache 扩容深度解读【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoinBitcoin Core 0.13.0 是该项目历史上的一个里程碑版本它引入了 BIP 152 Compact Blocks紧凑区块区块中继、BIP32 分层确定性HD钱包、Segregated Witness分离见证的 testnet 支持以及基于“子付父”CPFP的矿机交易选择算法同时把数据库缓存默认值从 100 MiB 提升到 300 MiB、移除了内部 CPU 挖矿器和 P2P alert 系统。读完本文你将理解 0.13.0 每一项关键变更的动机、对应的命令行/RPC 参数用法以及这些变更在当前代码库中的落地位置便于你在维护节点、编写挖矿逻辑或排查版本升级问题时快速对照。兼容性变化不再支持 Windows XP0.13.0 明确终止了对 Windows XP 的支持。原因有二微软已于 2014 年 4 月 8 日终止对 XP 的安全更新在该系统上运行钱包属于高风险行为0.12.x 时代有用户报告 Bitcoin Core 在 XP 上随机崩溃且原因不明很可能与 Qt 等上游库停止在 XP 上做测试有关。官方态度是不主动阻止你在 XP 上安装或运行但属于“自担风险”且不再受理 XP 相关问题报告。从源码结构看当前仓库的构建系统CMakeLists.txt 与 cmake/已全面转向现代工具链CMake C11 起、后续演进为 C20与当年 autotools 时代的 XP 支持早已不兼容这一点可以作为版本演进的历史佐证。数据库缓存内存扩容dbcache 100 → 300 MiB变更内容由于 UTXO 集持续增长100 MiB 的默认数据库缓存性能已明显下降0.13.0 将默认值改为300 MiB。在低内存机器上可改回在bitcoin.conf中添加dbcache100或在 GUI 的Options → Size of database cache中修改。官方特别提醒数据库缓存的性能影响主要集中在节点初始同步和宕机后追赶区块两个阶段。源码中的实现当年由 PR #8273 完成对应 changelog 中396f9d6Bump-dbcachedefault to 300MiB。在当前仓库中相关逻辑演进到了 src/node/caches.cppsrc/node/caches.cpp 中的GetDefaultDBCache()与CalculateDbCacheBytes()负责解析-dbcache参数并做上下限钳制MIN_DBCACHE_BYTES到MAX_DBCACHE_BYTES当前版本已进一步智能化在 64 位系统且检测到总内存 ≥ 4 GiB 时默认缓存提升到HIGH_DEFAULT_DBCACHE1 GiB这延续了 0.13.0 “按内存状况调整缓存”的治理思路参数定义在 src/init.cpp-dbcachen单位为 MiB并提示它与 mempool 共享未使用内存见-maxmempool若设置过大会触发警告见 src/node/caches.cpp 的LogOversizedDbCache。另外 changelog 中 GUI 侧的 PR #840745eba4bAdd dbcache migration path为已有用户提供了从 100 MiB 迁移到新默认值的平滑路径避免升级后节点因缓存变化产生意外行为。bitcoin-cli-stdin参数保护敏感信息变更内容bitcoin-cli新增-stdin参数从标准输入逐行读取额外参数直到 EOF/Ctrl-D$ src/bitcoin-cli -stdin walletpassphrase mysecretcode 120 ..... 按 Ctrl-D 结束输入 $官方推荐使用此方式传递钱包密码等敏感信息因为命令行参数通常可以被系统上任何用户通过进程表读取而标准输入不会出现在进程列表中。当前代码中的实现该功能源自 PR #75508b958abInput-from-stdin mode for bitcoin-cli由 Wladimir J. van der Laan 实现。在当前仓库 src/bitcoin-cli.cpp 中可以看到完整的参数族-stdin逐行读取额外 RPC 参数-stdinrpcpass从标准输入读取一行作为 RPC 密码-stdinwalletpassphrase从标准输入读取钱包密码并与-stdinrpcpass组合时有明确的行消费顺序密码行在前、钱包口令行在后。参数读取逻辑在 src/bitcoin-cli.cpp 附近实现。这套 stdin 参数族后来成为运维脚本如contrib/shell/git-utils.bash风格的自动化中传递凭据的标准做法。构建与运行环境变化C11代码库开始使用 C11构建要求 GCC ≥ 4.7 或 Clang ≥ 3.3。针对没有 C11 运行库的目标做交叉编译时官方给出的 configure 姿势是./configure --enable-glibc-back-compat ... LDFLAGS-static-libstdc对应 changelog 中的 PR #716506162f1build: Enable C11 in build, require C11 compiler及 #7302、#7322 等修复。从当前仓库的 cmake/CheckCXXFeatures.cmake 等构建脚本看C 标准检测机制一脉相承只是标准本身已随版本大幅前移。Python 3 功能测试运行qa/rpc-tests即今天 test/functional/ 目录下的功能测试从本版本起要求Python 3.4 或更高。changelog 中 #781477b637fSwitch to py3与 #775184370d5test_framework: python3.4 authproxy compat是核心提交。当前仓库的测试入口 test/functional/test_runner.py 等文件全部以 Python 3 编写与这一决定一致。Linux ARM 构建应社区需求0.13.0 开始在发布包中提供 Linux ARM 二进制对应 PR #81889201ce8Add armhf/aarch64 gitian buildsbitcoin-${VERSION}-arm-linux-gnueabihf.tar.gz面向 32 位 ARMv7-Abitcoin-${VERSION}-aarch64-linux-gnu.tar.gz面向 64 位 ARMv8-A。官方强调 ARM 构建仍属实验性质并给出架构兼容性判断示例树莓派 2 Model B / 3 Model B32 位执行态可以运行 ARMv7-A 目标二进制而树莓派 1 全系为 ARMv6两个二进制都无法运行。另外Android 不在此语境下的 ARM Linux官方不保证可直接运行。Compact BlocksBIP 152协议机制区块中继改用紧凑区块协议PR #8068TheBlueMatt 实现核心思想是发送方只发送区块头 少量预填交易 其余交易 ID 的短哈希接收方用自己 mempool 里的交易“补齐”区块只需向发送方getblocktxn请求缺失的那一小部分。主要收益是降低中继时刻的带宽尖峰很多情况下同时降低传播延迟。它在兼容节点之间自动启用无需额外配置。对挖矿策略的副作用值得矿工注意文档特别指出一个非显而易见的后果如果你的 mempool 与矿工的交易选择策略相似区块补全速度会更快反之矿工放入了大量被你节点视为“不鼓励”的交易时区块中继会变慢。整体上包含大量网络内普遍不鼓励交易的区块可能在“stale 竞赛”中落败因此矿工应让自己的节点参考主流中继策略。从当前源码结构看这一机制依然健在src/blockencodings.cpp 的PartiallyDownloadedBlock::InitData负责把cmpctblock区块头 短 ID 预填交易与本地 mempool 合并重建区块src/bench/blockencodings.cpp 则提供了对应基准测试。协议版本方面src/node/protocol_version.h 保留了版本阶梯SENDHEADERS_VERSION 70012、FEEFILTER_VERSION 70013、SHORT_IDS_BLOCKS_VERSION 70014Compact Blocks、WTXID_RELAY_VERSION 70016等清晰记录了 P2P 协议各特性引入的版本号。分层确定性密钥生成HD 钱包BIP 32这是 0.13.0 对钱包用户影响最深远的变更PR #8035jonasschnelli 实现新钱包按 BIP32 生成 HD 密钥密钥路径为m/0/0/k已有钱包保持传统随机密钥不变HD 钱包的备份任何时候都可以恢复出全部可能的私钥包括备份时尚未生成的那些——这是传统钱包备份做不到的重要警告加密钱包会生成新的 HD seed必须重新备份dumpwallet产生的 dump 文件将包含确定性 seed预期未来版本可直接导入 seed 恢复全部资金0.13.0 时尚未实现可用-usehd0关闭新创建钱包的 HD 功能但注意该开关只对新钱包生效一旦创建了 HD 钱包就无法再关闭本版本不区分内部找零地址与外部地址HD 钱包与 0.13 之前的版本不兼容changelog 中 #83673b38a6aEnsure 0.13 clients cant open HD wallets专门保证了旧客户端打开 HD 钱包文件时不会静默丢数据。相关 changelog 条目还包括#8206 将 HD xpriv 加入dumpwallet、#8323 在validateaddress中报告hdmasterkeyid/hdkeypath元数据、#8389c3c82c4Create a new HD seed after encrypting the wallet落实了“加密即换 seed”的行为、#8324 在salvagewallet时保留 HD seed、#8309 新增了wallet-hd功能测试。Segregated Witness 的代码准备0.13.0 完成了 BIP 141/143/144/145 描述的全部代码准备changelog 中 #8149d612837Testnet-only segregated witness但有两个关键限制BIP 141 当时尚未指定主网激活参数因此本版本不支持在主网上使用 segwit仅 testnet 可用即使未来 BIP 141 在网络中激活0.13.0 节点的行为仍与其他 pre-segwit 版本一致——无法在主网上发出激活信号、挖 segwit 块、完整验证/中继 segwit 块或在钱包中使用 segwit 交易。要使用主网 segwit 必须升级到实现激活参数的后续版本。这条注意事项对 0.13.0 时代长期运行的节点运维者尤其重要版本本身没有过期报错功能上却停留在激活前状态。挖矿交易选择Child Pays For ParentCPFP算法变更挖矿的交易选择算法被替换为按“含未确认祖先交易的综合费率”package feerate选择PR #760066db2d6Suhas Daftuar。含义是一笔低费率交易只要有一笔高费率交易花费了它的输出整包的综合费率就可能达标而被选中——这就是 CPFP 机制它让支付方可以“付费催促进祖交易”确认。命令行参数变化参数0.13.0 状态说明-blockminsize已移除不再提供最小区块大小限制-blockmaxsize保留限制生成区块的序列化字节数为满足该约束需额外计算仅指定它可能造成性能下降-blockmaxweight新增按 BIP 141 的“区块权重”限制生成区块官方建议矿工在命令行指定-blockmaxweight而不指定-blockmaxsize以获得最佳性能。主网上两者换算关系为-blockmaxweight≈ 4 × 期望的-blockmaxsize因为非见证数据按 4 倍权重计。文档同时说明本版本中 BIP 141 未在主网激活两种度量的实际差异尚不体现但在未来版本和 segwit 激活后将产生差别。当前仓库中可对照 src/init.cpp 的-blockmaxweight参数定义Set maximum BIP141 block weight (default: %d)与 src/policy/policy.h 的默认值DEFAULT_BLOCK_MAX_WEIGHT MAX_BLOCK_WEIGHT400 万以及 src/node/mining_args.cpp 的读取逻辑。重索引Reindex机制拆分早期版本的重索引是“边读盘上区块文件边验证”0.13.0 起两者被拆分第一阶段“Reindexing blocks on disk”——先让所有区块进入区块索引GUI 中显示该提示第二阶段“Processing blocks on disk”——索引完整后再开始验证较慢。拆分的原因是让正常同步可用的某些优化例如 Compact Blocks 相关的预取逻辑在重索引期间同样可用。新增命令行选项-reindex-chainstatePR #7917239d419Optimize reindex 的一部分只重建链状态UTXO 集而不重建区块索引。适用场景是“盘上区块可信、但 chainstate 损坏”也适合做基准测试。当前仓库 src/init.cpp 中该参数依然存在只是帮助文本已更新提示 prune 模式与其互斥等说明设计沿用至今。移除内部挖矿器CPU 挖矿早已无效本版本移除了内部挖矿器PR #750711c7699Remove internal minerLeviathn测试框架改用更简单的实现。对外的直接后果移除RPCsetgenerate、getgenerate与命令行选项-gen、-genproclimitgenerate调用保留可在测试中继续出块#7663 使其在非 regtest 也可工作新增generatetoaddressRPC#7671e2ebd25achow101向指定地址挖块钱包禁用状态下也可用这是后来功能测试框架见 test/functional/ 中大量generatetoaddress用例的标准出块手段。当前仓库中 src/bitcoin-cli.cpp 仍保留generatetoaddress的本地 RPC 处理实现印证其沿用至今。bytespersigop 过滤的新实现旧的 bytes-per-sigop 过滤逻辑有一个事故级 bug它实际上破坏了裸多签交易的处理本应由permitbaremultisig选项控制。原因是共识协议出于向后兼容始终把这些旧式交易按 20 个 sigop 计数。如果简单地“精确计数”来修 bug会重新引入一个历史漏洞。新实现PR #83643f65ba2sipa的思路是不再拒绝这类交易而是仅在费率计算时把它们视为“占满 20 sigop 的同等大小交易”即视为更大的交易从而拉低其费率竞争力。changelog 中 #836286edc20Scale legacy sigop count in CreateNewBlock 配合完成挖矿侧的同等处理。这个“把问题交易变大而不是拒绝它”的处理方式是政策层设计的一个经典案例。P2P 协议层变更0.13.0 的 P2P 层是一次系统性更新协议版本号提升到70013feefilter消息BIP 133收到对端的 feefilter 后节点不再向对端发送费率低于过滤值交易的 invPR #7542c946a15。当前代码中消息名常量在 src/protocol.hFEEFILTER{feefilter}版本常量FEEFILTER_VERSION 70013保留在 src/node/protocol_version.h。P2P alert 系统移除PR #769229b2be6alert消息不再支持网络公告职能移交其他渠道。交易中继机制重设计PR #78403b9a0bf、#808201d8359旧机制对 1/4 交易即时中继、其余批处理发送导致依赖链交易被乱序、系统性伤害中继质量。新机制始终批量发送 inv并按依赖顺序排序孤儿交易显著减少为补偿取消即时中继出站对端的批量发送频率翻倍。BIP35mempool命令自 #7840 起也进入批处理且当通过-peerbloomfilters0禁用NODE_BLOOM时不再处理非白名单对端的mempool请求#8078。孤儿交易上限提高PR #817994ab58b内存中保留的孤儿交易上限从 5000 字节提到99999 字节并增加三种回收条件——被区块包含、与区块冲突、20 分钟超时。getaddr 限流PR #7856每条连接生命周期内至多响应一次 getaddr。近期有效区块/交易提供者保护PR #8084最近向我们第一个提供有效新区块或交易的对端其连接受保护、不会被主动断开AttemptToEvictConnection逻辑的一部分。RPC 层变更新增 RPCgetmempoolentry/getmempoolancestors/getmempooldescendants查询 mempool 单条目的详细统计以及交易在 mempool 内的祖先/后代集合PR #72927ce9ac5generatetoaddress、importprunedfunds、removeprunedfunds、signmessagewithprivkeySegwit 相关createwitnessaddress、addwitnessaddress。行为变化gettxoutsetinfo的hash_serializedUTXO 集哈希发生变化修复了 32 位/64 位平台在大于 4 GB 数据上哈希的分歧且此前哈希数据漏掉了 txidPR #7756、#7848。如果你的工具依赖该哈希做链状态对比跨版本比较会不一致RPC 全面支持 UTF-8PR #78929c3d0fa钱包标签等非 ASCII 字符此前在 JSON 处理中一直是损坏的GUI 调试控制台同样受益脚本反汇编更名OP_NOP2显示为OP_CHECKLOCKTIMEVERIFYBIP 65、OP_NOP3显示为OP_CHECKSEQUENCEVERIFYBIP 112。受影响输出getrawtransactionverbose、decoderawtransaction、decodescript、REST/rest/tx/与/rest/block/JSON、bitcoin-tx -jsongetrawmempool输出的排序方式改变fundrawtransaction新增选项includeWatching、changeAddress、changePosition、feeRate费率单位 BTC/kB#7967、#8153移除setgenerate、getgenerate。ZMQ 变更通知序列号每条 ZMQ 通知现在携带一个递增序列号PR #7762a1eb344位于多部分消息的最后一部分因此向后兼容每种消息类型有独立计数器。监听端可以据此检测通知丢失。仓库中 src/zmq/ 与 doc/zmq.md 可继续查阅当前实现细节配套示例见 contrib/zmq/zmq_sub.py。0.13.0 变更日志要点按主题节选以下为原始发布笔记 changelog 的完整分类此处列出与行为直接相关的关键条目完整列表见原文档RPC 与 API#7550stdin 输入模式、#7726importaddress 帮助文本、#7774getblock/getblockheader增加versionHex、#7863getblockchaininfo的bip9_softforks改为对象、#7518fundrawtransaction多选项、#7756UTXO 集游标并用于gettxoutsetinfo、#7292ancestor/descendant 信息暴露到 RPC、#7892UTF-8、#7957sequence number 支持等 30 余项。区块与交易处理#8273dbcache 默认 300 MiB、#8149testnet-only segwit、#7997mapNextTx换成更省的setSpends、#8020非密码学哈希改用 SipHash-2-4、#8364高 sigop 交易“变大”而非拒绝、#8381witness v0 输出视为非标准等。P2P#8068Compact Blocks、#7692移除 alert、#7542feefilter、#7840/#8082inv/mempool 批处理与依赖排序、#8084近期提供者保护、#8179孤儿交易 99999 字节、#8408防 Compact Blocks 指纹/磁盘 DoS、#8312mempool 可篡改交易 DoS 修复等 40 余项。构建系统#7165强制 C11、#7911leveldb 纳入构建系统、#8188armhf/aarch64 gitian 构建、#8167发布带调试符号的 tarball/zip、#8210Qt 升至 5.6.1等。GUI#8073密码对话框确认后清空输入、#7707废弃交易 UI 支持、#8042启动/校验期间禁止打开调试窗口、#8407dbcache 迁移路径等 40 余项。钱包#8035BIP32/HD 密钥生成核心实现、#8389加密后生成新 HD seed、#8206dumpwallet含 HD xpriv、#8367阻止旧客户端打开 HD 钱包、#7891生成密钥总是要求 OS 随机源、#7689OpenSSL AES 换为 ctaes 实现等。挖矿#7507移除内部挖矿器、#7671generatetoaddress、#7935Versionbits GBT 支持、#7600含祖先费率交易选择、#8489segwit 激活前 GBT 使用 pre-BIP141 sigops。测试与 QA#7814测试框架切换 Python 3、#8309wallet-hd功能测试、#7849varints 位图测试、#8222单元测试启用 mempool 一致性检查等 80 余项。对升级者的检查清单综合本文从 0.12.x 升级到 0.13.0 时应确认Windows XP 用户准备迁移到新系统否则自担风险内存确认机器能容纳 300 MiB 默认 dbcache低内存机器在bitcoin.conf写回dbcache100矿工把-blockmaxsize迁移为-blockmaxweight主网按 4 倍换算删除-gen/-genproclimit/setgenerate相关配置改用generatetoaddress钱包用户新建钱包即为 HD 钱包——理解“备份可恢复全部未来私钥”“加密后必须重新备份”“不能与旧版本混用”三点脚本与监控gettxoutsetinfo.hash_serialized值变化、脚本反汇编中OP_NOP2/3命名变化、getrawmempool排序变化都需要同步修改下游解析逻辑ZMQ 消费者多部分消息末尾多了一个序列号字段按设计向后兼容但解析器应确认按“最后一部分”取值而非固定下标构建确认编译器支持 C11GCC ≥ 4.7 / Clang ≥ 3.3跑功能测试需 Python ≥ 3.4。0.13.0 的发布笔记完整地保留在当前仓库的 doc/release-notes/release-notes-0.13.0.md 中包含全部 200 余条 changelog 与完整贡献者名单文中提到的实现细节均可在 src/blockencodings.cpp、src/node/protocol_version.h、src/node/caches.cpp、src/bitcoin-cli.cpp、src/init.cpp 等文件中继续追踪验证。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考