ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Bitcoin Core 费率估算升级:estimatesmartfee 双估算器机制与 mempool 费率估算器详解

2026/9/7 7:49:25 拓冰建站 浏览量
Bitcoin Core 费率估算升级:estimatesmartfee 双估算器机制与 mempool 费率估算器详解 Bitcoin Core 费率估算升级estimatesmartfee 双估算器机制与 mempool 费率估算器详解【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoinBitcoin Core 的estimatesmartfeeRPC 在本版本对应发布说明 doc/release-notes-34075.md中完成了一次重要的费率估算架构升级它不再只依赖历史上的块策略block policy费率估算器而是引入了一个全新的内存池mempool费率估算器并将二者结果组合取低。读完本文你可以掌握estimatesmartfee新增的options参数、响应字段的变化、费率数据文件的迁移规则以及钱包费率选择中fee_reason语义调整背后的源码实现。变更总览本次变更由 doc/release-notes-34075.md 描述核心要点如下estimatesmartfee现在组合两个费率估算器原有的块策略估算器和新增的内存池估算器新的内存池估算器基于当前内存池内容产生 conservative保守和 economical经济两种费率估算只有当最近区块显示内存池健康时才产出估算内存池过于稀疏时退化为最低中继费率与当前内存池最低费率中的较高者其统计信息持久化到fees/mempool_policy_estimator.dat并在启动时重新加载estimatesmartfee返回两个估算器结果中的较低者即内存池估算器只能调低而不能调高块策略的估算组合估算要求两个估算器都成功。若内存池估算器无法产出估算例如内存池仍在加载、观察到的近期区块过少、或怀疑内存池不健康RPC 直接返回错误而不是静默回退到块策略估算estimatesmartfee新增options对象包含fee_rate_estimator与verbosity两个参数块策略估算器的数据文件迁移到fees/block_policy_estimates.dat旧的fee_estimates.dat在启动时自动迁移或删除钱包的费率估算使用默认的组合估算钱包交易创建 RPC 返回的fee_reason字段语义调整见后文。两个费率估算器及其分工块策略估算器原有原有的CBlockPolicyEstimator基于历史确认数据哪些费率档位的交易在多少个区块内被确认做统计推断支持 1–1008 个区块的确认目标。实现位于 src/policy/fees/block_policy_estimator.h。内存池估算器新增新增的MemPoolFeeRateEstimator定义在 src/policy/fees/mempool_estimator.h其工作原理从源码注释可以直接读出它调用 Bitcoin Core 的区块构建算法从当前内存池生成分块chunk形式的块模板然后对选中 chunk 的费率计算分位数75 分位数作为 economical 估算50 分位数作为 conservative 估算见 src/policy/fees/mempool_estimator.h#L80-L94 的类注释由于内存池状况变化快它只对较短的确认目标可靠MaximumTarget()固定返回MEMPOOL_FEE_ESTIMATOR_MAX_TARGET{2}见 src/policy/fees/mempool_estimator.h#L31-L33因此该估算器的blocks字段恒为 2估算结果带 7 秒的进程内缓存CACHE_LIFE{7}仅当链尖未变化且缓存未过期时复用避免高频调用重复构建块模板内存池健康检查估算器会追踪最近MEMPOOL_HEALTH_WINDOW_BLOCKS 6个已挖区块的重量统计MinedBlockStats包含区块高度、区块内非 coinbase 交易总权重、为这些区块从内存池移除的交易总权重并以MEMPOOL_REPRESENTATION_THRESHOLD 0.75作为内存池代表度阈值见 src/policy/fees/mempool_estimator.h#L36-L48。从源码结构看只有当被挖区块的内容能较好代表当前内存池时内存池估算才可信否则按发布说明的约定返回最低中继费率与内存池最低费率中的较高者或干脆报错。组合逻辑取低值且不容错两个估算器由FeeRateEstimatorManager统一管理实现见 src/policy/fees/estimator_man.cpp// estimator_man.cpp 中 GetFeeRateEstimate 的核心逻辑 auto block_policy_estimate m_block_policy_estimator-EstimateFeeRate(target, conservative); if (!block_policy_estimate) { ...; return block_policy_estimate; } auto mempool_estimate m_mempool_estimator-EstimateFeeRate(conservative); if (!mempool_estimate) { // A failed mempool estimate is surfaced as a warning rather than silently returning the // block policy estimate, which callers can still request explicitly. return mempool_estimate; } auto selected_estimate std::min(*block_policy_estimate, *mempool_estimate);见 src/policy/fees/estimator_man.cpp#L25-L44这里有两点值得注意std::min决定了只降不升的语义默认组合估算只会选出两者中较低的费率这正是发布说明中the mempool fee rate estimator can only lower the block policy fee rate estimate的实现依据内存池估算失败即整体失败源码注释明确说明内存池估算失败不会静默回退到块策略结果而是把错误暴露给调用方——调用者此时可显式改用block_policy取值。这与发布说明中If the mempool fee rate estimator cannot produce an estimate ... an error is returned完全一致。estimatesmartfee参数与响应字段RPC 的完整定义在 src/rpc/fees.cpp#L33-L142参数签名为estimatesmartfee conf_target estimate_mode optionsconf_target必填确认目标单位区块数1 - 1008estimate_mode默认economicaleconomical或conservative与 BIP 125 RBF 场景相关options可选对象新增两个键键类型 / 默认值说明fee_rate_estimator字符串默认nonenone组合行为返回两个估算器中的较低值若内存池估算不可用则直接报错。block_policy仅使用块策略估算器即旧版本行为。mempool_policy仅使用内存池估算器。未知取值一律按none处理verbosity数字默认11只返回 feerate 或错误2额外返回mempool_health_statistics参数解析处的对应实现见 src/rpc/fees.cpp#L100-L112未知取值按none处理由FeeRateEstimatorTypeFromString保证。响应字段成功时fee_rate_estimator为none字段说明feerate估算费率BTC/kvB按 BIP 141 虚拟大小折算。注意 RPC 层还会再做一次抬升feerate max(估算值, 内存池当前最低费率, 最低中继费率)见 src/rpc/fees.cpp#L113-L117estimator标识本次结果由哪个估算器产出仅在fee_rate_estimator为none且估算成功时出现blocks估算所对应的确认目标。块策略估算器返回实际找到估算的目标至少 2、至多估算器可用最大目标内存池估算器恒为 2mempool_health_statistics仅verbosity 2时出现最近被挖区块的健康统计数组每项含block_height、block_weight、mempool_txs_weight数据来源为MempoolPolicyEstimatorBlocksStats()见 src/rpc/fees.cpp#L127-L138失败时返回errors数组。调用示例# 默认组合估算可能返回错误而不是回退 bitcoin-cli estimatesmartfee 6 # 显式使用块策略估算器旧行为 bitcoin-cli estimatesmartfee 6 economical {fee_rate_estimator:block_policy} # 仅使用内存池估算器并查看健康统计 bitcoin-cli estimatesmartfee 6 economical {fee_rate_estimator:mempool_policy,verbosity:2}fee_rate_estimator帮助文本与发布说明措辞一一对应见 src/rpc/fees.cpp#L47-L54。数据文件迁移到 fees/ 子目录并清理旧文件费率估算器的持久化路径与旧文件迁移逻辑实现在 src/policy/fees/estimator_args.cpp块策略估算器数据数据目录/chain/fees/block_policy_estimates.dat内存池估算器统计数据目录/chain/fees/mempool_policy_estimator.dat旧文件数据目录/chain/fee_estimates.dat。迁移函数MaybeMigrateLegacyFeeEstimates见 src/policy/fees/estimator_args.cpp#L24-L50的三条分支与发布说明完全吻合旧文件不存在不做任何事新文件不存在把旧fee_estimates.dat移动rename到fees/block_policy_estimates.dat并先确保fees/目录存在两个文件都存在直接删除旧文件删除失败仅记录警告并继续运行。数据文件布局与 doc/files.md 中的数据目录清单一致fees/目录下存放block_policy_estimates.dat和mempool_policy_estimator.dat用于存储块策略与内存池策略估算器数据。对运维的含义是升级后首次启动会在fees/目录下看到这两个.dat文件根目录下不再新增fee_estimates.dat两个文件每 1 小时刷盘一次FEE_FLUSH_INTERVAL见 src/policy/fees/estimator_man.h#L24-L25关机时也会强制刷盘。钱包侧影响fee_reason 语义调整钱包构造交易时的默认费率链路在 src/wallet/fees.cpp 的GetMinimumFeeRate中见 src/wallet/fees.cpp#L32-L88。参数优先级为coin_control.m_feeratecoin_control.m_confirm_target 钱包的m_confirm_target当未显式指定费率时钱包通过wallet.chain().getFeeRateEstimate(target, conservative_estimate)取估算——这正是发布说明中Wallet fee rate estimation uses the default combined estimate的实现路径即钱包默认享受组合取低估算。同时返回给 RPC 的fee_reason字段不再透出块策略估算器内部的阈值细节如 HALF_ESTIMATE/FULL_ESTIMATE/DOUBLE_ESTIMATE/CONSERVATIVE 这类内部原因而是报告钱包为何选中该费率的宏观原因fee_reason触发条件对应源码费率估算器FEE_RATE_ESTIMATOR估算成功且未被后续规则改写src/wallet/fees.cpp#L64fallback估算不可用费率为 0时使用wallet.m_fallback_feesrc/wallet/fees.cpp#L67-L74mempool minimum估算/fallback 费率低于当前内存池最低费率被抬升到内存池最低值src/wallet/fees.cpp#L76-L82minimum required仍低于节点强制的最低要求费率时抬升至该值src/wallet/fees.cpp#L84-L85这些内部阈值细节在调试时仍可从块策略估算器的 debug 日志中获得启用ESTIMATEFEE日志类别即可组合估算的选择过程也会记录BCLog::ESTIMATEFEE级别的 debug 日志见 src/policy/fees/estimator_man.cpp#L40-L42。测试与验证路径改动配套的功能测试与单元测试可用于验证行为test/functional/feature_fee_estimation.py费率估算功能级测试覆盖双估算器组合与数据文件迁移含mempool_policy_estimator相关断言test/functional/rpc_estimatefee.py针对estimatesmartfee/estimaterawfee的fee_rate_estimator参数取值与错误路径的测试src/test/mempool_fee_estimator_tests.cpp内存池估算器的单元测试src/test/fees_util_tests.cpp估算器类型字符串解析等工具函数测试src/test/fuzz/fees.cpp对FeeReason等枚举字符串化的模糊测试。小结这次变更让estimatesmartfee在保留历史统计估算能力的同时能够利用如果现在挖区块实际会选哪些交易这一更强的即时信号默认取两者较低值以给出更经济的费率同时通过两者都成功才成功的严格契约避免在不健康的内存池状态下给出误导性估算而fee_rate_estimator选项和mempool_health_statistics调试输出则为依赖旧行为或需要排障的调用方提供了显式的逃生通道与可观测性。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考