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

Bitcoin Core 26.0 发布深度解读:BIP324 v2 传输、AssumeUTXO 落地与全新 RPC 实战指南 Bitcoin Core 26.0 发布深度解读BIP324 v2 传输、AssumeUTXO 落地与全新 RPC 实战指南【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin本文是 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-QtLinux覆盖bitcoind/bitcoin-qt可执行文件。从已到达生命周期终点EOL的版本直接升级是可行的但如果数据目录需要迁移则可能花费较长时间。旧版本钱包格式总体仍被支持。系统兼容性Bitcoin Core 在以下平台经过广泛支持与测试使用 Linux 内核的操作系统、macOS 11.0、Windows 7 及更新版本。在大多数其他类 Unix 系统上通常也可运行但测试频率较低。官方不建议在不支持的平台上使用。P2P 与网络层的重要变更BIP324 v2 传输协议的实验性支持26.0 引入了 BIP324 与 src/net.cpp 中前者包含椭曲线加密与密钥协商逻辑后者负责连接的建立与选择。要点如下该协议默认关闭需要通过启动参数-v2transport启用启用后v2 仅在双方都支持时按连接逐条协商per-connection对支持它的节点发起连接尝试原有 v1 传输协议保持完整支持不会因启用 v2 而失效。在源码中该启动参数定义于 src/init.cpp其默认值由DEFAULT_V2_TRANSPORT常量控制默认关闭并归入CONNECTION选项类别。启用后节点会在nLocalServices中对外广播NODE_P2P_V2服务位。配套的 RPC 观测手段详见下文更新 RPCgetpeerinfo新增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_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实际磁盘占用可能高于该预算规划磁盘空间时务必注意。新增 RPCAssumeUTXO、交易包、地址簿与内存池导入loadtxoutset与getchainstates把同步时间从小时级降到分钟级26.0 新增loadtxoutsetRPC可以加载由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按交易包提交多个交易新增 RPCsubmitpackage用于将一组原始十六进制交易作为**一个包package**按共识与内存池策略规则进行评估并提交。关键能力与限制支持包内 CPFPChild-Pays-for-Parent允许费率较高的子交易将低于内存池最小费率min fee rate的父交易拉高入池——注意此处指低于最低接受费率即可并非必须高于最小中继费率成功提交不保证交易会全网传播因为包中继package relay目前不被支持能力受限包被限定为一个子交易 它的全部未确认父交易父交易之间不得相互花费对方的输出包级 RBFpackage RBF不受支持该 RPC 属于实验性接口未来可能变化。更完整的包策略与限制请参考 doc/policy/packages.md。测试层面test/functional/mempool_cluster.py 中可以看到同时提交父子交易并通过maxfeerate0校验包内联约束的用法示例。getaddrmaninfo查看地址簿分布新增getaddrmaninfoRPC实现在 src/rpc/net.cpp用于查看节点地址管理器addrman中new 表与 tried 表在 ipv4、ipv6、onion、i2p、cjdns 各网络下的地址分布。它返回两个表中各自及合计的地址数量。函数式测试位于 test/functional/rpc_net.py其中会与getrawaddrman交叉断言表中地址计数一致。importmempool运行时导入内存池数据新增importmempoolRPC实现在 src/rpc/mempool.cpp加载有效的mempool.dat文件并尝试把其中内容加入内存池。这允许从另一节点导入内存池数据而无需修改 datadir 内容或重启节点。使用注意导入不可信文件是危险的尤其是当文件中的元数据被采纳时若想应用费率增量官方建议改用getprioritisedtransactionsprioritisetransaction这对 RPC而不要使用导入时的apply_fee_delta_priority选项以避免对池中已优先级的交易重复计费。importmempool的参数模式在 src/rpc/client.cpp 中有定义支持apply_fee_delta_priority、use_current_time、apply_unbroadcast_set等选项。更新的 RPC序列化版本与 UTXO 集合哈希的弃用处理-rpcserialversion0已被弃用未来版本将移除当前仍可通过追加-deprecatedrpcserialversion继续使用PR #28448gettxoutsetinfo移除了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_idtransport_protocol_type标明连接实际使用的传输协议类型v1 或 v2字段文档定义见 src/rpc/net.cppsession_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 outputsbitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT新的脚本验证标志用于以 Taproot 花费规则验证脚本。钱包相关变更加载策略收紧钱包加载行为改变。某些含损坏记录此前可带警告加载的钱包可能无法再加载例如损坏的地址簿记录可能导致加载失败。如遇此情况官方建议在旧版 Bitcoin Core 中加载该钱包并将数据导入新钱包同时报告问题以便改进健壮性PR #24914legacy 钱包创建受限createwallet在设置descriptorsfalse时若未同时提供-deprecatedrpccreate_bdb将不再创建 legacyBDB钱包——legacy 钱包计划在未来版本移除PR #28597abandoned字段补齐gettransaction、listtransactions、listsinceblock现在对所有交易返回abandoned字段此前仅发送交易返回PR #25158硬化派生标记统一为hlistdescriptors、decodepsbt等 RPC 现在用h而非撇号表示硬化派生私有参数场景除外。这便于直接复制粘贴描述符字符串而无需转义或手工把换成h。注意这会改变描述符校验和。legacy 钱包的getaddressinfo中hdkeypath字段与钱包 dump 的序列化格式不变PR #26076lastprocessedblock返回值getbalances、gettransaction、getwalletinfo均新增lastprocessedblockJSON 对象包含计算该结果时钱包最后处理的区块哈希与高度。该结果不应被长期缓存因为导入新 key 可能使其失效PR #26094考虑未确认低费率祖先的找零与建交易硬币选择与交易构建现在会核算未确认的低费率祖先交易。当必须花费未确认输出时钱包会追加费用确保新交易连同其祖先能达到用户请求的费率对应的挖矿得分PR #26152options命名参数扁平化对接受options参数的 RPCimportmulti、listunspent、fundrawtransaction、bumpfee、send、sendall、walletcreatefundedpsbt、simulaterawtransaction现在可以把选项直接作为命名参数传入无需嵌套对象。对比用法如下。旧写法src/bitcoin-cli -named bumpfee txid options{fee_rate: 100}新写法src/bitcoin-cli -named bumpfee txid fee_rate100deprecatedrpcwalletwarningfield移除createwallet、loadwallet、restorewallet、unloadwallet不再返回字符串字段warning相同信息由 v25.0 引入的warnings字段提供JSON 字符串数组。warning字段自 v25.0 起已被弃用PR #27757sighashtype 错误码更精确signrawtransactionwithkey、signrawtransactionwithwallet、walletprocesspsbt、descriptorprocesspsbt在sighashtype参数非法时现在返回更具体的RPC_INVALID_PARAMETER而非笼统的RPC_MISC_ERRORPR #28113PSBT 处理结果返回hexwalletprocesspsbt与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新增菜单项可把基于 BerkeleyDBBDB中 key 与隐含输出脚本类型的 legacy 钱包迁移为使用 SQLite 中描述符的现代钱包gui#738PSBT 操作对话框会把支付到自己钱包的输出标记为own addressgui#740创建 legacy 钱包的能力正在被移除gui#764。Contrib 与低层变更Bash 补全文件重命名Bash 补全文件由bitcoin*.bash-completion重命名为bitcoin*.bash仓库中即 contrib/completions/bash 下的若干.bash文件。这样放入补全目录可用pkg-config --variablecompletionsdir bash-completion查询后即可按被调用命令名自动按需加载无需再手工重命名PR #28507。测试网络的策略变化从 26.0 开始testnet 默认禁用非标准交易针对中继与内存池接受。若需恢复旧行为可设置-acceptnonstdtxn1PR #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 以上的预算空间-rpcserialversion0等已弃用选项需追加-deprecatedrpc前缀继续使用涉及 legacy/BDB 钱包的创建路径需要显式声明-deprecatedrpccreate_bdb同时留意listdescriptors输出中硬化标记从到h的变更对描述符校验和的影响。按上述清单逐项核对即可平滑迁移至 26.0。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考