首页
/ Bitcoin Core 26.0 发布深度解读:BIP324 v2 传输、AssumeUTXO 落地与全新 RPC 实战指南

Bitcoin Core 26.0 发布深度解读:BIP324 v2 传输、AssumeUTXO 落地与全新 RPC 实战指南

2026-09-06 18:58:57作者:翟江哲Frasier

本文是 Bitcoin Core 集成开发树 v26.0 版本的技术发布指南,围绕该版本在网络层(BIP324 v2 传输协议)、AssumeUTXO 加速同步、矿池/钱包 RPC、描述符与 GUI 等维度的关键变更展开,并结合当前仓库源码(如 src/rpc/blockchain.cppsrc/rpc/net.cpp)与测试用例(如 test/functional/feature_assumeutxo.py)进行验证与延伸。读完本文,你可以掌握 26.0 的新 RPC 用法、升级注意事项、参数兼容性处理,以及这些新能力在源码层面的实现脉络。

升级方式与兼容性说明

如何从旧版本升级

如果运行的是更早版本的 Bitcoin Core,升级流程为:先关闭正在运行的节点进程,等待其完全退出(在部分场景下可能需要几分钟),然后按平台安装新版本:

  • Windows:直接运行新版安装程序;
  • macOS:覆盖 /Applications/Bitcoin-Qt
  • Linux:覆盖 bitcoind / bitcoin-qt 可执行文件。

从已到达生命周期终点(EOL)的版本直接升级是可行的,但如果数据目录需要迁移,则可能花费较长时间。旧版本钱包格式总体仍被支持。

系统兼容性

Bitcoin Core 在以下平台经过广泛支持与测试:使用 Linux 内核的操作系统、macOS 11.0+、Windows 7 及更新版本。在大多数其他类 Unix 系统上通常也可运行,但测试频率较低。官方不建议在不支持的平台上使用。

P2P 与网络层的重要变更

BIP324 v2 传输协议的实验性支持

26.0 引入了 BIP324 所定义的 v2 传输协议的实验性支持(从源码看,具体实现在 src/bip324.cppsrc/net.cpp 中,前者包含椭曲线加密与密钥协商逻辑,后者负责连接的建立与选择)。要点如下:

  • 该协议默认关闭,需要通过启动参数 -v2transport 启用;
  • 启用后,v2 仅在双方都支持时按连接逐条协商(per-connection),对支持它的节点发起连接尝试;
  • 原有 v1 传输协议保持完整支持,不会因启用 v2 而失效。

在源码中,该启动参数定义于 src/init.cpp,其默认值由 DEFAULT_V2_TRANSPORT 常量控制(默认关闭),并归入 CONNECTION 选项类别。启用后,节点会在 nLocalServices 中对外广播 NODE_P2P_V2 服务位。

配套的 RPC 观测手段(详见下文"更新 RPC")

  • getpeerinfo 新增 transport_protocol_typev1/v2)与 session_id 字段,用于确认某条连接当前实际使用的传输协议;
  • addnode 新增 v2transport 布尔参数,指定对目标节点是否尝试 v2 连接。

多网络出站连接策略

从 26.0 开始,拥有多个可达网络的节点会主动尝试为每个网络至少维持一条出站连接(如 ipv4、ipv6、onion、i2p、cjdns)。这一改进提升了单个节点抵御隔离攻击(eclipse attack)的能力,也在网络层面提升了抵御分区攻击(partition attack)的能力。用户不再需要手动采取额外措施来保证连到多个已启用网络。

剪枝(Pruning)与 AssumeUTXO 的内存盘约束变化

当使用 assumeutxo 并配合 -prune 时需要注意:若剪枝预算设置低于 1100MB(即 MIN_DISK_SPACE_FOR_BLOCK_FILES * 2,其中 MIN_DISK_SPACE_FOR_BLOCK_FILESsrc/validation.h 中定义为 550 MiB),剪枝预算可能被超出

这是因为预算默认在每个链状态(chainstate)之间均分,除非均分后的结果低于 MIN_DISK_SPACE_FOR_BLOCK_FILES——此时取该常量为该链状态的实际预算。相关逻辑可以在 src/node/blockstorage.cppBlockManager::FindFilesToPrune 中看到:当存在历史链状态(HistoricalChainstate())用于重建索引与验证快照时,num_chainstates 为 2,每个链状态的目标为 max(MIN_DISK_SPACE_FOR_BLOCK_FILES, GetPruneTarget() / num_chainstates),即一半磁盘预算预留给历史链状态,另一半预留给工作量最大链状态。

因此在 26.0 使用 assumeutxo 场景下,若手工将剪枝预算设得低于约 1100MB,实际磁盘占用可能高于该预算,规划磁盘空间时务必注意。

新增 RPC:AssumeUTXO、交易包、地址簿与内存池导入

loadtxoutsetgetchainstates:把同步时间从小时级降到分钟级

26.0 新增 loadtxoutset RPC,可以加载由 dumptxoutset 生成的 UTXO 快照(实现位于 src/rpc/blockchain.cpp,与 dumptxoutset 同文件,且其帮助文本中说明了可用于后续的 loadtxoutset 加载)。工作方式为:

  1. 节点启动后先用自身已有链状态进行初始区块下载(IBD);
  2. 调用 loadtxoutset 加载快照,快照内容被反序列化到第二个链状态(chainstate)数据结构中,此后这个新链状态直接基于快照同步到网络最新区块;
  3. 与此同时,原始链状态在后台继续完成初始区块下载,最终验证到快照所基于的那个区块;
  4. 结果是 bitcoind 在**几分钟(而非数小时)**内即可提供一个与网络最新高度同步、可用的节点实例。

UTXO 快照通常从第三方渠道获取(HTTP、BT 下载等),因为其内容始终通过哈希校验,第三方来源是合理的。整体机制参见设计文档 doc/design/assumeutxo.md。用于监控该同步过程的配套 RPC 是 getchainstates

完整的端到端测试覆盖在 test/functional/feature_assumeutxo.py 中,测试既验证了损坏快照(错误魔数、错误版本、网络不匹配、头部未在头部链中)会被正确拒绝,也验证了正常快照加载后节点同步到最新高度的流程。

getprioritisedtransactions:查询用户设置的费率增量

此前用户通过 prioritisetransaction 设置的费率增量(fee delta)缺少统一的查询入口。26.0 新增 getprioritisedtransactions(实现在 src/rpc/mining.cpp),返回以 txid 为索引的所有由 prioritisetransaction 创建的费率增量映射,并标明每笔交易当前是否在内存池中。它与挖矿相关的 prioritisetransaction 位于同一 RPC 模块。

submitpackage:按"交易包"提交多个交易

新增 RPC submitpackage 用于将一组原始十六进制交易作为**一个包(package)**按共识与内存池策略规则进行评估并提交。关键能力与限制:

  • 支持包内 CPFP(Child-Pays-for-Parent):允许费率较高的子交易将低于内存池最小费率(min fee rate)的父交易拉高入池——注意此处指低于最低接受费率即可,并非必须高于最小中继费率;
  • 成功提交不保证交易会全网传播,因为包中继(package relay)目前不被支持;
  • 能力受限:包被限定为"一个子交易 + 它的全部未确认父交易";父交易之间不得相互花费对方的输出;包级 RBF(package RBF)不受支持
  • 该 RPC 属于实验性,接口未来可能变化。

更完整的包策略与限制请参考 doc/policy/packages.md。测试层面,test/functional/mempool_cluster.py 中可以看到同时提交父+子交易并通过 maxfeerate=0 校验包内联约束的用法示例。

getaddrmaninfo:查看地址簿分布

新增 getaddrmaninfo RPC(实现在 src/rpc/net.cpp),用于查看节点地址管理器(addrman)中 new 表与 tried 表在 ipv4、ipv6、onion、i2p、cjdns 各网络下的地址分布。它返回两个表中各自及合计的地址数量。函数式测试位于 test/functional/rpc_net.py,其中会与 getrawaddrman 交叉断言表中地址计数一致。

importmempool:运行时导入内存池数据

新增 importmempool RPC(实现在 src/rpc/mempool.cpp),加载有效的 mempool.dat 文件并尝试把其中内容加入内存池。这允许从另一节点导入内存池数据,而无需修改 datadir 内容或重启节点。使用注意:

  • 导入不可信文件是危险的,尤其是当文件中的元数据被采纳时;
  • 若想应用费率增量,官方建议改用 getprioritisedtransactions + prioritisetransaction 这对 RPC,而不要使用导入时的 apply_fee_delta_priority 选项,以避免对池中已优先级的交易重复计费。

importmempool 的参数模式在 src/rpc/client.cpp 中有定义,支持 apply_fee_delta_priorityuse_current_timeapply_unbroadcast_set 等选项。

更新的 RPC

序列化版本与 UTXO 集合哈希的弃用处理

  • -rpcserialversion=0 已被弃用,未来版本将移除;当前仍可通过追加 -deprecatedrpc=serialversion 继续使用(PR #28448);
  • gettxoutsetinfo 移除了 hash_serialized_2:原算法存在缺陷,未涵盖全部数据,其功能由 hash_serialized_3 取代,后者提供相同功能但哈希计算正确(PR #28685)。从 src/rpc/blockchain.cpp 源码可以看到当前支持 hash_type 取值为 hash_serialized_3muhashnone,默认即 hash_serialized_3

getpeerinfoaddnode 的 v2 传输配套

  • getpeerinfo 新增字段 transport_protocol_typesession_id
    • transport_protocol_type 标明连接实际使用的传输协议类型(v1 或 v2,字段文档定义见 src/rpc/net.cpp);
    • session_id 仅对 v2 连接返回会话标识,v1 连接为空字符串;
  • addnode 新增参数 v2transport(布尔),指示是否对该节点尝试 v2 传输连接。若节点本机未启用 -v2transport,却又显式请求 v2 连接,RPC 会返回错误提示(源码中通过检查 GetLocalServices() & NODE_P2P_V2 判断并抛出 RPC_INVALID_PARAMETER)。addconnection RPC 也新增了对应的 v2transport 参数。

Miniscript 进入 Taproot 描述符

Miniscript 表达式现在可用于所有与描述符相关的 RPC 的 Taproot 描述符中(PR #27255)。具体表现:

  • finalizepsbt 现在能够完成花费 Miniscript 兼容 Taproot 叶子(leaves)的 PSBT 的 finalize;
  • 描述符钱包可在 Taproot 叶子中使用 Miniscript。

钱包相关 RPC 的变更详见下文"钱包变更"。

更新与新引入的设置

datadir 中 bitcoin.conf 被忽略时的启动报错

bitcoindbitcoin-qt 现在会在启动时报错:当所使用的 datadir 内部包含一个本会被忽略bitcoin.conf 时(典型场景是某个外层 bitcoin.conf 中使用了 datadir= 行把数据目录指到该位置)。该报错只是诊断性提示,用于防止误配置;可通过相应开关禁用,恢复"使用该 datadir 但忽略其中 bitcoin.conf"的旧行为(PR #27302)。

非法日志配置立即报错

传入非法的 -debug-debugexclude-loglevel 日志配置选项现在会直接报错,而不再只是记录一条容易被忽略的警告(PR #27632)。

libconsensus 库的新能力

26.0 的 libconsensus 新增两个接口:

  • bitcoinconsensus_verify_script_with_spent_outputs:可选地接收被验证交易的花费输出(spent outputs);
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT:新的脚本验证标志,用于以 Taproot 花费规则验证脚本。

钱包相关变更

  • 加载策略收紧:钱包加载行为改变。某些含损坏记录(此前可带警告加载)的钱包可能无法再加载,例如损坏的地址簿记录可能导致加载失败。如遇此情况,官方建议:在旧版 Bitcoin Core 中加载该钱包并将数据导入新钱包,同时报告问题以便改进健壮性(PR #24914);
  • legacy 钱包创建受限createwallet 在设置 descriptors=false 时,若未同时提供 -deprecatedrpc=create_bdb,将不再创建 legacy(BDB)钱包——legacy 钱包计划在未来版本移除(PR #28597);
  • abandoned 字段补齐gettransactionlisttransactionslistsinceblock 现在对所有交易返回 abandoned 字段(此前仅发送交易返回,PR #25158);
  • 硬化派生标记统一为 hlistdescriptorsdecodepsbt 等 RPC 现在用 h 而非撇号(')表示硬化派生,私有参数场景除外。这便于直接复制粘贴描述符字符串而无需转义或手工把 ' 换成 h。注意这会改变描述符校验和。legacy 钱包的 getaddressinfohdkeypath 字段与钱包 dump 的序列化格式不变(PR #26076);
  • lastprocessedblock 返回值getbalancesgettransactiongetwalletinfo 均新增 lastprocessedblock JSON 对象,包含计算该结果时钱包最后处理的区块哈希与高度。该结果不应被长期缓存,因为导入新 key 可能使其失效(PR #26094);
  • 考虑未确认低费率祖先的找零与建交易:硬币选择与交易构建现在会核算未确认的低费率祖先交易。当必须花费未确认输出时,钱包会追加费用,确保"新交易连同其祖先"能达到用户请求的费率对应的挖矿得分(PR #26152);
  • options 命名参数扁平化:对接受 options 参数的 RPC(importmultilistunspentfundrawtransactionbumpfeesendsendallwalletcreatefundedpsbtsimulaterawtransaction),现在可以把选项直接作为命名参数传入,无需嵌套对象。

对比用法如下。旧写法:

src/bitcoin-cli -named bumpfee txid options='{"fee_rate": 100}'

新写法:

src/bitcoin-cli -named bumpfee txid fee_rate=100
  • deprecatedrpc=walletwarningfield 移除createwalletloadwalletrestorewalletunloadwallet 不再返回字符串字段 warning;相同信息由 v25.0 引入的 warnings 字段提供(JSON 字符串数组)。warning 字段自 v25.0 起已被弃用(PR #27757);
  • sighashtype 错误码更精确signrawtransactionwithkeysignrawtransactionwithwalletwalletprocesspsbtdescriptorprocesspsbtsighashtype 参数非法时,现在返回更具体的 RPC_INVALID_PARAMETER 而非笼统的 RPC_MISC_ERROR(PR #28113);
  • PSBT 处理结果返回 hexwalletprocesspsbtdescriptorprocesspsbt 在交易完成后,返回对象新增 hex 字段(包含可直接交给 sendrawtransaction 的序列化交易)(PR #28414)。

输出描述符的兼容性变更

输出描述符中混合公钥(hybrid public keys)的使用已被移除。混合公钥是一种特殊的公钥编码,本就不被输出描述符规范(BIP380,详见 doc/descriptors.md)支持;此前 Bitcoin Core 会错误接受含此类 key 的描述符,26.0 起不再接受(PR #28587)。

GUI 变更

  • 交易列表不再提供"支付给自己"(payment to yourself)专门类别。同时影响钱包的输入与输出的交易,将分别按花费与接收两行显示(gui#119);
  • 新增菜单项,可把基于 BerkeleyDB(BDB)中 key 与隐含输出脚本类型的 legacy 钱包,迁移为使用 SQLite 中描述符的现代钱包(gui#738);
  • PSBT 操作对话框会把支付到自己钱包的输出标记为"own address"(gui#740);
  • 创建 legacy 钱包的能力正在被移除(gui#764)。

Contrib 与低层变更

Bash 补全文件重命名

Bash 补全文件由 bitcoin*.bash-completion 重命名为 bitcoin*.bash(仓库中即 contrib/completions/bash 下的若干 .bash 文件)。这样放入补全目录(可用 pkg-config --variable=completionsdir bash-completion 查询)后,即可按被调用命令名自动按需加载,无需再手工重命名(PR #28507)。

测试网络的策略变化

从 26.0 开始,testnet 默认禁用非标准交易(针对中继与内存池接受)。若需恢复旧行为,可设置 -acceptnonstdtxn=1(PR #28354)。这与 mainnet 长期以来的默认策略保持一致。

小结与升级建议

Bitcoin Core 26.0 的核心看点集中在三处:一是 BIP324 v2 传输协议由实验性选项 -v2transport 引入(src/bip324.cppsrc/net.cpp);二是 AssumeUTXO 通过 loadtxoutset/getchainstates 真正可落地,使新节点可在几分钟内追平链尖端(src/rpc/blockchain.cppdoc/design/assumeutxo.md);三是内存池与钱包工具链的大幅补强——submitpackageimportmempoolgetprioritisedtransactions 让运维与开发者的操作空间显著变大。

升级前请重点自查:剪枝配合 assumeutxo 时预留约 1100MB 以上的预算空间;-rpcserialversion=0 等已弃用选项需追加 -deprecatedrpc 前缀继续使用;涉及 legacy/BDB 钱包的创建路径需要显式声明 -deprecatedrpc=create_bdb;同时留意 listdescriptors 输出中硬化标记从 'h 的变更对描述符校验和的影响。按上述清单逐项核对,即可平滑迁移至 26.0。

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