Bitcoin Core 26.0 发布深度解读:BIP324 v2 传输、AssumeUTXO 落地与全新 RPC 实战指南
本文是 Bitcoin Core 集成开发树 v26.0 版本的技术发布指南,围绕该版本在网络层(BIP324 v2 传输协议)、AssumeUTXO 加速同步、矿池/钱包 RPC、描述符与 GUI 等维度的关键变更展开,并结合当前仓库源码(如 src/rpc/blockchain.cpp、src/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.cpp 与 src/net.cpp 中,前者包含椭曲线加密与密钥协商逻辑,后者负责连接的建立与选择)。要点如下:
- 该协议默认关闭,需要通过启动参数
-v2transport启用; - 启用后,v2 仅在双方都支持时按连接逐条协商(per-connection),对支持它的节点发起连接尝试;
- 原有 v1 传输协议保持完整支持,不会因启用 v2 而失效。
在源码中,该启动参数定义于 src/init.cpp,其默认值由 DEFAULT_V2_TRANSPORT 常量控制(默认关闭),并归入 CONNECTION 选项类别。启用后,节点会在 nLocalServices 中对外广播 NODE_P2P_V2 服务位。
配套的 RPC 观测手段(详见下文"更新 RPC"):
getpeerinfo新增transport_protocol_type(v1/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_FILES 在 src/validation.h 中定义为 550 MiB),剪枝预算可能被超出。
这是因为预算默认在每个链状态(chainstate)之间均分,除非均分后的结果低于 MIN_DISK_SPACE_FOR_BLOCK_FILES——此时取该常量为该链状态的实际预算。相关逻辑可以在 src/node/blockstorage.cpp 的 BlockManager::FindFilesToPrune 中看到:当存在历史链状态(HistoricalChainstate())用于重建索引与验证快照时,num_chainstates 为 2,每个链状态的目标为 max(MIN_DISK_SPACE_FOR_BLOCK_FILES, GetPruneTarget() / num_chainstates),即一半磁盘预算预留给历史链状态,另一半预留给工作量最大链状态。
因此在 26.0 使用 assumeutxo 场景下,若手工将剪枝预算设得低于约 1100MB,实际磁盘占用可能高于该预算,规划磁盘空间时务必注意。
新增 RPC:AssumeUTXO、交易包、地址簿与内存池导入
loadtxoutset 与 getchainstates:把同步时间从小时级降到分钟级
26.0 新增 loadtxoutset RPC,可以加载由 dumptxoutset 生成的 UTXO 快照(实现位于 src/rpc/blockchain.cpp,与 dumptxoutset 同文件,且其帮助文本中说明了可用于后续的 loadtxoutset 加载)。工作方式为:
- 节点启动后先用自身已有链状态进行初始区块下载(IBD);
- 调用
loadtxoutset加载快照,快照内容被反序列化到第二个链状态(chainstate)数据结构中,此后这个新链状态直接基于快照同步到网络最新区块; - 与此同时,原始链状态在后台继续完成初始区块下载,最终验证到快照所基于的那个区块;
- 结果是 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_priority、use_current_time、apply_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_3、muhash、none,默认即hash_serialized_3。
getpeerinfo 与 addnode 的 v2 传输配套
getpeerinfo新增字段transport_protocol_type与session_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)。addconnectionRPC 也新增了对应的v2transport参数。
Miniscript 进入 Taproot 描述符
Miniscript 表达式现在可用于所有与描述符相关的 RPC 的 Taproot 描述符中(PR #27255)。具体表现:
finalizepsbt现在能够完成花费 Miniscript 兼容 Taproot 叶子(leaves)的 PSBT 的 finalize;- 描述符钱包可在 Taproot 叶子中使用 Miniscript。
钱包相关 RPC 的变更详见下文"钱包变更"。
更新与新引入的设置
datadir 中 bitcoin.conf 被忽略时的启动报错
bitcoind 与 bitcoin-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字段补齐:gettransaction、listtransactions、listsinceblock现在对所有交易返回abandoned字段(此前仅发送交易返回,PR #25158);- 硬化派生标记统一为
h:listdescriptors、decodepsbt等 RPC 现在用h而非撇号(')表示硬化派生,私有参数场景除外。这便于直接复制粘贴描述符字符串而无需转义或手工把'换成h。注意这会改变描述符校验和。legacy 钱包的getaddressinfo中hdkeypath字段与钱包 dump 的序列化格式不变(PR #26076); lastprocessedblock返回值:getbalances、gettransaction、getwalletinfo均新增lastprocessedblockJSON 对象,包含计算该结果时钱包最后处理的区块哈希与高度。该结果不应被长期缓存,因为导入新 key 可能使其失效(PR #26094);- 考虑未确认低费率祖先的找零与建交易:硬币选择与交易构建现在会核算未确认的低费率祖先交易。当必须花费未确认输出时,钱包会追加费用,确保"新交易连同其祖先"能达到用户请求的费率对应的挖矿得分(PR #26152);
options命名参数扁平化:对接受options参数的 RPC(importmulti、listunspent、fundrawtransaction、bumpfee、send、sendall、walletcreatefundedpsbt、simulaterawtransaction),现在可以把选项直接作为命名参数传入,无需嵌套对象。
对比用法如下。旧写法:
src/bitcoin-cli -named bumpfee txid options='{"fee_rate": 100}'
新写法:
src/bitcoin-cli -named bumpfee txid fee_rate=100
deprecatedrpc=walletwarningfield移除:createwallet、loadwallet、restorewallet、unloadwallet不再返回字符串字段warning;相同信息由 v25.0 引入的warnings字段提供(JSON 字符串数组)。warning字段自 v25.0 起已被弃用(PR #27757);- sighashtype 错误码更精确:
signrawtransactionwithkey、signrawtransactionwithwallet、walletprocesspsbt、descriptorprocesspsbt在sighashtype参数非法时,现在返回更具体的RPC_INVALID_PARAMETER而非笼统的RPC_MISC_ERROR(PR #28113); - PSBT 处理结果返回
hex:walletprocesspsbt与descriptorprocesspsbt在交易完成后,返回对象新增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.cpp、src/net.cpp);二是 AssumeUTXO 通过 loadtxoutset/getchainstates 真正可落地,使新节点可在几分钟内追平链尖端(src/rpc/blockchain.cpp 与 doc/design/assumeutxo.md);三是内存池与钱包工具链的大幅补强——submitpackage、importmempool、getprioritisedtransactions 让运维与开发者的操作空间显著变大。
升级前请重点自查:剪枝配合 assumeutxo 时预留约 1100MB 以上的预算空间;-rpcserialversion=0 等已弃用选项需追加 -deprecatedrpc 前缀继续使用;涉及 legacy/BDB 钱包的创建路径需要显式声明 -deprecatedrpc=create_bdb;同时留意 listdescriptors 输出中硬化标记从 ' 到 h 的变更对描述符校验和的影响。按上述清单逐项核对,即可平滑迁移至 26.0。
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 StartedRust0623
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