十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Bitcoin Core 27.0 版本发布技术全解析:BIP324 默认启用、mempool.dat v2、TRUC 政策与 CoinGrinder 算法

Bitcoin Core 27.0 版本发布技术全解析:BIP324 默认启用、mempool.dat v2、TRUC 政策与 CoinGrinder 算法 Bitcoin Core 27.0 版本发布技术全解析BIP324 默认启用、mempool.dat v2、TRUC 政策与 CoinGrinder 算法【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin本文基于本仓库 doc/release-notes/release-notes-27.0.md 展开系统梳理 Bitcoin Core 27.0 版本在传输层、交易政策、内存池持久化、钱包选币与共识安全方面的核心变更。读者将了解新版对节点运营者与钱包用户的实际影响掌握诸如-v2transport、-persistmempoolv1、-consolidatefeerate、-acceptnonstdtxn等关键启动参数的用法与升级注意事项。升级方式与兼容性如何升级如果正在运行旧版本需要先完全关闭节点某些情况下关闭可能需要数分钟随后执行安装程序Windows或直接替换可执行文件macOS覆盖/Applications/Bitcoin-QtLinux覆盖bitcoind或bitcoin-qt从已经到达生命周期终点EOL的版本直接升级是可行的但如果数据目录需要迁移启动过程可能耗时较长。旧版钱包在较新版本 Bitcoin Core 中通常仍然受到支持。操作系统支持范围Bitcoin Core 支持并在以下系统上经过广泛测试Linux Kernel 3.17macOS 11.0Windows 7 及以上在大多数其他类 Unix 系统上通常也能运行但测试频度较低。官方不建议在不支持的平台上运行 Bitcoin Core。网络传输层BIP324 v2 传输协议默认启用27.0 中最具里程碑意义的 P2P 变更是 BIP324 v2 传输协议v2 transport正式默认开启。变更内容v2 transport 现已默认启用可通过-v2transport0显式关闭。手动连接类选项-connect、-addnode、-seednode现在同样遵循-v2transport默认以 v2 发起连接若 v2 连接失败会自动回退并重试 v1。在 src/init.cpp 中可以看到该参数的注册argsman.AddArg(-v2transport, strprintf(Support v2 transport (default: %u), DEFAULT_V2_TRANSPORT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);默认值常量定义在 src/net.hinline constexpr bool DEFAULT_V2_TRANSPORT{true};并在 src/init.cpp 通过GetBoolArg(-v2transport, DEFAULT_V2_TRANSPORT)读入节点启动流程。底层实现V2Transportv2 传输的握手与加密逻辑封装在V2Transport类中src/net.cpp 起定义其构造会生成本地椭圆曲线密钥与一次性随机 garbage 数据并经历椭圆曲线密钥交换、garbage 认证等握手阶段。每个出站/入站连接是否启用 v2最终在MakeTransport中决定src/net.cppstatic std::unique_ptrTransport MakeTransport(NodeId id, bool use_v2transport, bool inbound) noexcept { if (use_v2transport) { return std::make_uniqueV2Transport(id, /*initiating*/!inbound); } ... }v2 连接在ProtocolVersion、服务能力位NODE_P2P_V2与握手过程中的加密能力方面与 v1 兼容衔接旧节点仍可通过 v1 与 v2 节点互通。addnode RPC 的对应调整addnodeRPC 现在默认跟随全局-v2transport选项发起连接与命令行参数保持一致。调用时仍可通过新增的布尔参数v2transport手动指定传输类型。在 src/rpc/net.cpp 中可以看到其默认取值逻辑bool node_v2transport connman.GetLocalServices() NODE_P2P_V2; bool use_v2transport self.MaybeArgbool(v2transport).value_or(node_v2transport);即未显式传参时跟随节点自身是否启用 v2 服务。若显式请求 v2 但节点未以-v2transport启动RPC 会返回明确错误见同文件 src/rpc/net.cpp。调用示例bitcoin-cli addnode 192.168.0.6:8333 onetry true内存池持久化mempool.dat 新格式与降级开关新格式做了什么27.0 起由-persistmempool或savemempoolRPC 生成的mempool.dat文件采用新格式version 2。新格式对交易内容进行了XOR 异或混淆处理用于缓解外部程序如杀毒软件尝试解析并可能篡改该文件而引发的干扰。这与 Bitcoin Core 在链状态数据库中使用的“obfuscation”机制同源Obfuscation工具类src/util/obfuscation.h基于旋转密钥对目标字节流逐块执行 XORXorWord在 src/dbwrapper.cpp 中链状态数据库同样会为新库生成并持久化一把混淆密钥。关键限制无法被旧版本读取新格式无法被旧版本软件读取。如果关闭钱包/节点后想回退到旧版本会造成mempool.dat无法解析。为此27.0 引入了一个临时设置-persistmempoolv1启用后回退写入遗留的 v1 格式。该参数在 src/init.cpp 中注册说明文字明确指出这是 v1/v2 双格式的临时开关、未来将被移除argsman.AddArg(-persistmempoolv1, strprintf(Whether a mempool.dat file created by -persistmempool or the savemempool RPC will be written in the legacy format (version 1) or the current format (version 2). This temporary option will be removed in the future. (default: %u), DEFAULT_PERSIST_V1_DAT), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);默认值由DEFAULT_PERSIST_V1_DAT常量决定默认不启用即默认写 v2参数解析发生在 src/node/mempool_args.cppmempool_opts.persist_v1_dat argsman.GetBoolArg(-persistmempoolv1, mempool_opts.persist_v1_dat);落盘时的版本选择写入mempool.dat的核心实现在 src/node/mempool_persist.cppconst uint64_t version{pool.m_opts.persist_v1_dat ? MEMPOOL_DUMP_VERSION_NO_XOR_KEY : MEMPOOL_DUMP_VERSION}; if (!pool.m_opts.persist_v1_dat) { // 写入 XOR 混淆密钥version 2 }与之配套的加载/导出接口还包括importmempoolRPC将指定mempool.dat文件内容导入内存池src/rpc/mempool.cpp节点启动时由LoadMempool在 src/init.cpp 读取位于数据目录网络子目录下的mempool.dat路径由 src/node/mempool_persist_args.cpp 计算GetDataDirNet() / mempool.dat。实战建议若仅计划在 27.0 内运行无需改动若你的工作流需要在 27.0 与旧版本之间来回切换如调试链上回放可临时以-persistmempoolv11启动直到确认不再降级。共识与时间同步移除网络校正时间27.0 将网络校正时间network-adjusted time从共识代码中移除代之以未校正的系统时间。动机与影响此前实现隐式假设“大部分出站节点时间诚实”以网络中位数时间校正本地时钟后参与共识判定。移除该机制后时间偏移量的中位数告警偏移达到70 分钟或以上时给出警告仍然保留用于提示运维人员检查时钟节点运营者必须保证系统时间正确且持续准确否则节点可能脱离网络共识例如区块时间戳校验、交易时间锁定等判定都会依赖本地时间。从代码结构看该 PR#28956主要将原来共识层对校正时间的依赖改到系统时间路径上同时把对时偏移的观测与告警保留在监测层面彻底消除“必须依赖诚实多数出站对端”这一安全假设。部署在云主机、容器或虚拟机中的节点应配置 NTP/chrony 等时间同步服务。内存池政策引入 TRUCv3 交易测试网策略TRUC 是什么TRUCTopologically Restricted Until Confirmation拓扑受限直至确认交易即v3 交易政策当交易版本号设置为3时该交易请求对其未确认输出被花费的行为施加额外限制使接受或替换 TRUC 交易的“激励兼容性”更易于评估从而保证任何替换行为对节点都更有利可图、费用追加fee-bumping更可靠。激活方式与标准性状态TRUC 交易目前属于非标准交易只能在放宽或禁用标准性规则standardness rules的测试网络中使用例如以-acceptnonstdtxn1启动节点bitcoind -testnet -acceptnonstdtxn1对应的政策实现位于 src/policy/truc_policy.cpp其中SingleTRUCCheckssrc/policy/truc_policy.cpp与PackageTRUCCheckssrc/policy/truc_policy.cpp分别对单笔交易与包级交易执行 TRUC 规则校验。具体限制参数关键常量统一定义于 src/policy/truc_policy.h可用下表概括常量值含义TRUC_VERSION3TRUC 交易要求版本号为 3TRUC_ANCESTOR_LIMIT2一个 TRUC 交易的祖先集合含自身上限为 2 个成员TRUC_DESCENDANT_LIMIT2一个 TRUC 交易的后代集合含自身上限为 2 个成员TRUC_MAX_VSIZE10000TRUC 交易自身 vSize 上限约 10 kvB权重为 vSize×4TRUC_CHILD_MAX_VSIZE1000TRUC 交易的非 TRUC 子交易若其未确认输出被花费的 vSize 上限限制效果概括如下TRUC 父交易的未确认输出只能被一个子交易花费该子交易若自身非 TRUC其 vSize 不得超过TRUC_CHILD_MAX_VSIZETRUC 交易不可作为其他非 TRUC 交易的未确认父交易且其子孙数量被严格限制在 mempool 中所有 TRUC 祖先必须已确认即父确认前不得继续下钻从而为 CPFP 式费用追加提供确定性拓扑。在代码中这些限制以static_assert(TRUC_ANCESTOR_LIMIT 2)、static_assert(TRUC_DESCENDANT_LIMIT 2)固化在政策源码中src/policy/truc_policy.cpp说明该拓扑限制是协议设计上的硬约束。钱包CoinGrinder 选币算法与规则调整新增 CoinGrinder在高费率下降低交易成本27.0 在钱包引入CoinGrinder硬币选择算法用于缓解不必要的大输入集并降低高费率feerate场景下的交易成本。CoinGrinder 以最小权重为目标搜索输入集合其求解结果会产生一笔找零输出。算法说明集中在 src/wallet/coinselection.cppCoinGrinder 可被理解为一种在图二叉树上行走的算法——对每个候选 UTXO 尝试“包含/排除”两条分支采用深度优先搜索先探索包含分支、再探索省略分支并基于当前最优解进行剪枝从而具备分支定界branch-and-bound特性它搜索的是能以最低权重凑出足够金额的输入集。激活条件CoinGrinder 仅在升高费率下激活默认阈值约为30 sat/vB即-consolidatefeerate的 3 倍。对应参数在 src/wallet/init.cpp 注册argsman.AddArg(-consolidatefeerateamt, The maximum feerate (in BTC/kvB) at which transaction building may use more inputs than strictly necessary so that the wallets UTXO pool can be reduced (default: ...), ..., OptionsCategory::WALLET);钱包构建交易时读取该参数src/wallet/wallet.cpp。若当前估算费率高于该阈值CoinGrinder 生效尽量以最少输入完成支付从而压低高费率时期的手续费。Branch And BoundBnB在 subtract fee 场景下停用当使用subtract fee from outputs从输出中扣除手续费功能时27.0 会停用 Branch And Bound 选币算法。原因在于扣除手续费需要精确的金额匹配而 BnB 的“无找零精确匹配”搜索在该模式下容易因金额变动产生不可行或次优结果#28994停用后由其它算法兜底确保找零金额正确、交易不被超额扣费。描述符出生时间的自动回退校正如果钱包中某个描述符descriptor的出生时间birth time被检测到晚于该描述符第一笔相关交易的时间钱包会自动把出生时间重置到更早的那个时间点#28920。这样可以避免钱包在回扫历史时因为出生时间过晚而遗漏早期地址相关交易提升恢复扫描的完整性。外部签名支持Windows 平台暂停27.0禁用了 Windows 上的外部签名external signing支持这是出于底层依赖的考虑当托管该能力所依赖的库Boost.Process被替换为其它实现后会重新启用该功能#28967。运行于 Windows 且依赖 HWI/外部签名设备的用户需要注意此变更Linux/macOS 上的外部签名不受影响。构建与低层系统变更构建系统C20 编译器成为强制要求从 27.0 开始编译 Bitcoin Core 需要支持 C20 的工具链#28349。macOS 发行版本改用hardened runtime 库进行签名配置以符合 Apple 对公证与运行安全的更严格约束#29127。Pruning修剪模式加速在初始区块下载IBD期间修剪的节点每次 flush 会一次性修剪更多区块从而加快此类节点的同步速度#20827。该优化针对磁盘容量受限、一边下载一边删除老区块的节点场景。初始化健壮性修复修复了多实例场景下后续启动的 Bitcoin Core 实例可能删除正在被既有实例占用的文件的问题#28784、#28946。改进了对空settings.json文件的处理#29144。settings.json是 Bitcoin Core 运行时写入的动态设置文件路径位于数据目录src/init.cpp 中注册-settingsfile时默认名称为settings.json空文件或损坏格式现在都能被稳健地识别而不至于中断启动。libbitcoinconsensus 弃用预告27.0 正式将libbitcoinconsensus标记为弃用deprecated并计划在v28 移除。弃用理由包括该库已存在近十年却鲜有实际使用与影响力反而成为持续的维护负担。需要注意的要点底层共识功能在各版本之间并不变化因此任何已使用该库的项目都可以无限期继续使用最终版本需清楚的是Taproot 是该库接收的最后一次共识更新未来新增的共识逻辑不会合入该库。未来将由libbitcoinkernel提供更有价值的 API——该接口能够感知UTXO 集合因此可以完整校验交易与区块从根本上取代 libbitcoinconsensus 的能力边界#29189。小结Bitcoin Core 27.0 的变更可归纳为四个方向网络层迈向加密化默认BIP324 v2 transport 默认开启手动连接与addnodeRPC 同步跟随并用-v2transport0保留回退通道内存池文件格式演进mempool.dat升级为带 XOR 混淆的 v2 格式-persistmempoolv1提供降级临时开关安全模型收紧移除网络校正时间节点时钟准确性成为运维责任TRUCv3政策在测试网先行验证为后续版本费用追加与替换经济性奠定基础钱包与构建现代化引入 CoinGrinder 高费率选币、描述符出生时间自动校正同时强制 C20 工具链。对节点运营者而言最需要行动的三件事是确认系统时间同步正常、理解mempool.dat新格式的降级约束、以及在需要时通过-v2transport0或-persistmempoolv1控制新特性的启用范围。以上变更细节对应的上游合并请求编号#29189、#28207、#29347、#29058、#28956、#28948、#28967、#29239、#28349、#29127、#27877、#28994、#28920、#20827、#28784、#28946、#29144均可在本仓库提交历史与 doc/release-notes/ 目录下的其它版本发布说明中交叉核对。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表