Bitcoin Core 28.3 发布技术解读:默认费率系统下探、重组期 TRUC 规则与构建测试链改进
【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin
Bitcoin Core 28.3 是面向网络运营者与开发者的维护型版本,核心看点是 Mempool 与 Policy 相关三项默认费率被大幅调低(-blockmintxfee、-minrelaytxfee、-incrementalrelayfee),同时针对 TRUC 交易重组场景、洋葱路由入站白名单、Guix 可复现构建等做了若干修正。本文以 doc/release-notes/release-notes-28.3.md 为骨架,结合仓库源码剖析每个变更的实现位置与含义,帮助你评估升级影响、配置新费率默认值并理解底层行为变化。
版本概要:升级方式与兼容性
28.3 属于补丁级(patch)发布,不引入新的共识规则与网络激活,主要内容为 bug 修复、性能改进与翻译更新。二进制的获取以 Bitcoin Core 官方发布渠道为准(仓库发布说明中标注的下载入口为 bitcoincore.org 的 bitcoin-core-28.3 目录),并建议通过官方公告邮件订阅安全与更新通知。
如何升级
如果你正在运行旧版本,升级流程为:
- 关闭节点:先停止正在运行的 bitcoind / Bitcoin-Qt 进程;
- 等待完全退出:在某些情况下完全关闭可能需要数分钟,请勿在数据目录尚未安全落盘前强制替换程序;
- 替换二进制文件:
- Windows:运行新版安装程序;
- macOS:覆盖
/Applications/Bitcoin-Qt; - Linux:覆盖
bitcoind/bitcoin-qt可执行文件。
发布说明同时指出,从已经到达生命周期终点(EOL)的版本直接升级也是可行的,但若数据目录需要迁移,可能需要更长时间;旧版本钱包格式总体仍然受支持。
兼容的操作系统范围
官方支持且经充分测试的操作系统为:Linux Kernel 3.17 及以上、macOS 11.0 及以上、Windows 7 及以上。Bitcoin Core 也能在大多数其他类 UNIX 系统上运行,但测试频率较低,不建议在不支持的平台上运行正式节点。
核心变更:Mempool 与 Policy 的默认费率下探
28.3 最重要的行为变化来自 PR #33106(policy: lower the default blockmintxfee, incrementalrelayfee, minrelaytxfee)——三项默认费率被系统性调低。调整后默认值与含义如下:
| 配置参数 | 新默认值 | 等价费率 | 用途 | 默认常量所在源码 |
|---|---|---|---|---|
-blockmintxfee | 1 satoshi/kvB | 0.001 sat/vB | 区块打包(挖矿)纳入交易的最低费率 | src/policy/policy.hDEFAULT_BLOCK_MIN_TX_FEE{1} |
-minrelaytxfee | 100 satoshis/kvB | 0.1 sat/vB | 中继、打包与交易创建的最低费率 | src/policy/policy.hDEFAULT_MIN_RELAY_TX_FEE{100} |
-incrementalrelayfee | 100 satoshis/kvB | 0.1 sat/vB | 内存池限额与 RBF 替换策略的最低增量费率 | src/policy/policy.hDEFAULT_INCREMENTAL_RELAY_FEE{100} |
单位说明:上述参数在配置文件与 RPC 中以 BTC/kvB 计价(如
FormatMoney(100)即0.00000100)。1 sat/kvB 意味着一个 1 000 vB 的交易理论上仅需 1 satoshi 即达到打包门槛。
三项参数仍可通过各自的配置选项显式覆盖。发布说明特别提示:如果决定自定义覆盖,建议将-minrelaytxfee与-incrementalrelayfee成对修改。代码层面也通过编译期断言强制了两者的默认一致:
// src/node/mempool_args.cpp static_assert(DEFAULT_MIN_RELAY_TX_FEE == DEFAULT_INCREMENTAL_RELAY_FEE);参数解析与生效路径
在 src/init.cpp 中-minrelaytxfee被声明为 NODE_RELAY 类选项;-blockmintxfee(src/init.cpp)属于 BLOCK_CREATION 类。这些默认值最终汇聚到 kernel 层的选项结构体MemPoolOptions(src/kernel/mempool_options.h),其中min_relay_feerate、incremental_relay_feerate、dust_relay_feerate等成员直接以对应默认常量初始化,供CTxMemPool构造使用。
-minrelaytxfee在 src/node/mempool_args.cpp 中被解析为CFeeRate;源码注释“High fee check is done afterward in CWallet::Create()”表明,过高的自设值会在钱包创建交易时才做校验。
-blockmintxfee则由 src/node/mining_args.cpp 的ReadMiningArgs()读取并填充为block_min_fee_rate。值得注意的细节是 src/node/mining_types.h 中的BlockCreateOptions::block_min_fee_rate为可选值——调用getblocktemplate等挖矿 RPC 的客户端可以在请求中显式提供一个费率来覆盖启动参数。getblocktemplate的结果对象中也会回显当前生效的blockmintxfee(单位为 BTC/kvB),见 src/rpc/mining.cpp。
保持不变的费率边界
此次下调是“精准外科手术”,发布说明明确下列费率不随默认值调整:
- dust 费率:用于界定粉尘输出价值的
DUST_RELAY_TX_FEE仍为3000(3 000 sat/kvB),见 src/policy/policy.h; - 费率估算器返回的最小值:
MIN_BUCKET_FEERATE被硬编码为100,见 src/policy/fees/block_policy_estimator.h。源码注释专门说明该值历史上继承自DEFAULT_MIN_RELAY_TX_FEE,硬编码是为了避免每次调整都作废已落盘的费率估算文件(CURRENT_FEES_FILE_VERSION); - 钱包使用的一揽子费率保持不变,钱包侧还通过编译期断言保证自身默认费率不低于节点中继/增量默认值(src/wallet/test/wallet_tests.cpp)。
此外,内存池的动态最低费率机制不受影响:当网络高吞吐(大量交易被淘汰)时,CTxMemPool会依据滚动半衰期算法临时抬高GetMinFee()。这一点在单元测试 src/test/mempool_tests.cpp 中有非常直观的刻画——被驱逐交易费率越高,内存池临时最低费率越高,并随半衰期指数衰减,最终回落到DEFAULT_INCREMENTAL_RELAY_FEE,再继续衰减归零。
实操注意:低费率交易不保证传播与确认
发布说明给出了一条面向网络运营者的重要现实提示:除非这些更低的新默认值在整个网络被广泛采纳,否则以更低费率创建的交易并不保证能够被传播或确认。对使用钱包创建低费率交易的场景,钱包费率并不随本次调整而改变,需要先显式设置钱包的-mintxfee,才能让钱包按低于原有门槛的费率出账。
在bitcoin.conf中显式声明新的低费率默认值(便于审计与版本间保持一致)示例如下:
# Bitcoin Core 28.3 中继/打包费率配置示例(单位为 BTC/kvB) blockmintxfee=0.00000001 # 1 sat/kvB(0.001 sat/vB),区块打包最低费率 minrelaytxfee=0.00000100 # 100 sat/kvB(0.1 sat/vB),交易中继最低费率 incrementalrelayfee=0.00000100 # 100 sat/kvB,RBF 替换与内存池限额的最低增量费率重组期间不再强制执行 TRUC 规则(#33504)
PR #33504(mempool: Do not enforce TRUC checks on reorg)修正了重组(reorg)场景下 TRUC 规则被过度执行的问题。
TRUC 背景
TRUC(Topologically Restricted Until Confirmed,即 BIP 431 描述的 v3 交易类型)用更严格的拓扑限制换取更稳健的 RBF 能力。依据 src/policy/truc_policy.h:
version=3的交易即被视为 TRUC(TRUC_VERSION{3});- 未确认状态下只允许 1 父 1 子:后代集合与祖先集合上限均为 2;
- TRUC 交易自身 sigop-adjusted 虚拟大小上限 10 000 vB,其未确认子交易上限 1 000 vB。
为什么重组时需要特殊处理
正常情况下,内存池接受交易时会执行完整的 TRUC 校验:SingleTRUCChecks()与PackageTRUCChecks()在 src/validation.cpp(单笔)与 src/validation.cpp(包式提交)中被调用,任何违反继承性或拓扑限制的提交都会被拒绝。
但重组的语义不同:重组发生时,原本已确认的交易被回退到“未确认”状态,其进入内存池的次序与父子关系由链重组后的历史决定,并不受提交者控制。源码在重组淘汰谓词filter_final_and_mature处明确注释(src/validation.cpp):
TRUC rules are not applied here, so reorgs may cause violations of TRUC inheritance or topology restrictions.
即:在重组清理(removeForReorg)与回退入池的过程中刻意不施加 TRUC 继承性/拓扑限制,避免节点因为一次外部重组就把本可正常延续的 v3 交易链从内存池中错误剔除。这是对“规则边界”的一次精细校正——TRUC 限制约束的是新交易如何进入内存池,而不是链重组带来的意外状态。
P2P 改进:白名单权限不再作用于洋葱入站连接(#33395)
PR #33395(net: do not apply whitelist permissions to onion inbounds)修正了 P2P 层的权限授予问题。
节点的-whitelist/-whitebind机制依据网络网段(subnet)为对端授予一组权限(如免限速中继、forcerelay、免惩罚等),其权限叠加逻辑实现在CConnman::AddWhitelistPermissionFlags()(src/net.cpp),即遍历配置的vWhitelistedRangeIncoming,当对端地址命中m_subnet.Match(addr)时叠加对应NetPermissionFlags。
问题在于洋葱(onion)入站连接:此类连接的对端以洋葱地址形态出现,并不具备与白名单网段相匹配的常规地址语义,却可能在旧的匹配逻辑下被间接命中而意外获得本不该拥有的白名单权限。28.3 的修正确保白名单权限不再被授予洋葱入站连接,从而收紧了对经 Tor 隐藏服务进入的节点的权限边界,降低被利用作特权通道的风险。权限模型与默认开关的完整定义可参考 src/net_permissions.h 与 src/net.h 中入站/出站白名单网段的结构。
测试、构建、文档与杂项改进
Test:功能测试健壮性提升
本版包含一批功能/单元测试修正,目的在于消除偶发(flaky)失败并增强测试工具能力:
- #32765:修复
feature_bip68_sequence.py中的列表索引越界错误; - #33001:功能测试在出现未处理异常(unhandled exceptions)时不再误判为通过;
- #30125:改进测试框架的 BDB 解析器,支持 internal/overflow 页面与全尺寸页面,提高钱包测试对 Berkeley DB 文件的还原与校验能力;
- #30948:为测试辅助函数
fill_mempool()(位于 test/functional/test_framework/mempool_util.py)补充缺失的sync_mempools()调用,确保多节点场景下各节点内存池状态一致后再断言,减少竞态导致的假阴性; - #30784:为交易工具的单测新增
BulkTransaction批量构造辅助函数。
Build / Guix:可复现构建加固
Guix 可复现构建体系在 28.3 中有两处 SOURCE_DATE_EPOCH 相关的修正:
- #32678:
guix-build在检测到环境中已设置SOURCE_DATE_EPOCH时输出警告并中止。这一逻辑位于 contrib/guix/libexec/prelude.bash,提示信息说明该环境变量“可能破坏可复现性”,并指引先unset SOURCE_DATE_EPOCH再重建;guix-build自身随后会用 git 提交时间作为参考时间戳(contrib/guix/guix-build); - #33073:
guix-codesign(代码签名流程)同样增加对SOURCE_DATE_EPOCH被设置的警告(contrib/guix/guix-codesign)。
其余构建相关改动包括:#32943在 depends 中强制CMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE(避免 CMake 包注册表污染构建环境);#33563修复 depends 中 Qt 下载链接;#33581在 CI 的DEPENDS_HASH中正确纳入$FILE_ENV。
Doc:文档勘误与链接修复
- #32776:澄清 taproot 自 v24.0 起始终激活的文档描述;
- #32777:修复 Transifex 翻译平台相关的失效链接(404);
- #33070:修正 doc/zmq.md 中 UNIX socket 路径的示例;
- #33133:修正
getpeerinfoRPC 中 ping 时延字段的单位说明(相关实现见 src/rpc/net.cpp); - #33236:移除一处错误且冗余的 doxygen 标签。
Misc:其他修正
- #33340:修复基准(benchmark)框架的 CSV 输出格式;
- #33482:修复 macOS 部署脚本在没有翻译文件时的失败问题(相关工具链见 contrib/macdeploy)。
贡献者与升级建议
本版发布汇集了社区多位开发者的贡献(0xB10C、Ava Chow、fanquake、glozow、Hennadii Stepanov、MarcoFalke、Martin Zumsande、theStack、Vasil Dimov、willcl-ark 等),以及 Transifex 平台上大量翻译志愿者的工作。
综合来看,28.3 对普通全节点运营者的主要影响集中在费率策略:建议在升级后确认自己的bitcoin.conf没有残留旧的高费率硬编码,并评估是否需要跟随新默认值;对运行 v3(TRUC)交易业务或通过 Tor 提供服务的中继节点,本版的重组策略与白名单修正也值得重点关注。以上所有默认值均可随时通过对应配置选项显式覆盖,可结合 share/examples/bitcoin.conf 的注释风格组织自己的节点配置。
【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考