Bitcoin Core v30.0 升级详解:新 bitcoin 命令、费率默认值重构与交易策略变更实战指南
2026/9/7 5:31:36 网站建设 项目流程

Bitcoin Core v30.0 升级详解:新 bitcoin 命令、费率默认值重构与交易策略变更实战指南

【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin

本文以 Bitcoin Core v30.0 官方发布说明为主体,系统梳理该版本在交易策略(Policy)、P2P 网络、命令入口、钱包与 GUI 等层面的全部变更,并结合仓库源码给出可验证的实现依据。读者通过本文可以完整掌握从 v29.x 升级到 v30.0 需要了解的功能变化、参数迁移清单与潜在的运维注意事项,可作为直接参考的版本升级与配置迁移手册。

版本概况与升级方式

v30.0 是一个新特性版本,包含新特性、大量缺陷修复与性能改进,以及更新的翻译。全部变更的权威来源见 release-notes-30.0.md,本文涉及的策略默认值、启动参数与命令行为均以该文档及当前仓库源码为准。

升级方式非常简单:

  1. 若正在运行旧版本,先完整关闭节点(部分情况下完全退出可能需要几分钟);
  2. Windows 直接运行安装程序,macOS 覆盖拷贝/Applications/Bitcoin-Qt,Linux 则用新版本替换bitcoind/bitcoin-qt可执行文件;
  3. 从已达 EOL(生命周期结束)的旧版本直接升级也是允许的,但如果数据目录需要迁移(例如 coinstatsindex 从旧格式重建,见下文),首次启动可能耗时较长。

旧版钱包格式(BDB legacy)在 v30.0 中已无法加载,但可通过migratewalletRPC 迁移到描述符钱包,因此“老版本钱包数据仍总体被支持”。

支持的操作系统

官方测试支持的操作系统为:Linux Kernel 3.17+、macOS 13+、Windows 10+。绝大多数其他类 Unix 系统也能运行,但测试频率较低,不建议在不受支持的系统上使用 Bitcoin Core。

交易策略(Policy)变更

v30.0 在“何种交易被视为标准交易并允许转发/打包”这一层面做了多项重要调整,全部体现在 policy.cpp 与 policy.h 中。

每笔标准交易的 legacy 签名操作数上限收紧为 2500

此前对标准交易内签章操作(sigops)数量的限制方式存在边界:区块级 sigops 限制只统计“区块中实际存在的”脚本,而 v30.0 新增了对单笔标准交易中潜在执行 legacy 签名操作的全局上限MAX_TX_LEGACY_SIGOPS = 2500,定义于 policy.h。

其计数规则(见 policy.cpp 的CheckSigopsBIP54)为:逐一累加

  • 所有输入 scriptsig 自身的 sigops;
  • 所有被花费的前序输出 scriptPubKey 中的 sigops(含 bare 与 P2SH 两类);
  • 所有 P2SH redeem script 中的 sigops。

只要累计值超过 2500,交易即被判为bad-txns-nonstandard-inputs: non-witness sigops exceed bip54 limit。该改动用于为未来可能的 BIP54 部署做铺垫(PR #32521),官方评估认为该上限不会影响任何常见的标准交易形态。

-datacarriersize默认值增至 100,000,等价于不再单独限制

v30.0 把-datacarriersize(OP_RETURN 数据载体输出的大小上限)的默认值提高到 100,000,即MAX_OP_RETURN_RELAY = MAX_STANDARD_TX_WEIGHT / WITNESS_SCALE_FACTOR = 400,000 / 4(见 policy.h)。由于单笔交易重量上限 400,000 Wu 会先被触发,这一默认值实质上等于“取消”了单独的数据载体大小限制。如果需要恢复历史行为,可显式配置:

bitcoind -datacarriersize=83

单笔交易允许多个 OP_RETURN 输出(按聚合大小计费)

与上一条配套:交易中现在可以包含多个data carrier(OP_RETURN)输出用于转发与挖矿。检查逻辑在 policy.cpp 的IsStandardTx中:逐输出检查,凡属于NULL_DATA类型即消耗剩余额度,即

-datacarriersize限制的是该交易内所有 OP_RETURN 输出scriptPubKey 大小的总和,且每个 scriptPubKey 自身不算入消耗。

具体地,代码用datacarrier_bytes_left随每个 NULL_DATA 输出递减,任一个输出超过剩余额度即判为不标准(reason 为datacarrier)。同时新增单笔交易最多 1 个临时粉尘输出(ephemeral dust)等配套规则在 policy.h 给出MAX_DUST_OUTPUTS_PER_TX = 1

对应单元测试见 transaction_tests.cpp,其中验证了“多 OP_RETURN 输出的总大小等于额度即标准、小 1 字节即不标准”的边界行为。

手续费默认值全面下调(矿工与中继层面)

v30.0 一次下调了三个费用默认值(PR #33106):

参数v29 行为v30.0 默认值源码常量(policy.h)单位换算
-blockmintxfee(打包最低费率)0.001 sat/vBDEFAULT_BLOCK_MIN_TX_FEE{1}(1 sat/kvB)用于矿工对加入区块模板的 package 设定最低费率
-minrelaytxfee(最低中继费率)0.1 sat/vBDEFAULT_MIN_RELAY_TX_FEE{100}(100 sat/kvB)低于此值视为零费率,不中继不打包
-incrementalrelayfee(增量中继费率)0.1 sat/vBDEFAULT_INCREMENTAL_RELAY_FEE{100}(100 sat/kvB)用于 mempool 限额与替换(RBF)策略

它们仍可通过对应配置项自行覆盖;但官方建议:若要修改,应将-minrelaytxfee-incrementalrelayfee一起修改(二者逻辑上关联)。参数注册位置见 init.cpp。

需要注意以下几点边界:

  • 其余费率不受影响:粉尘费率(dust feerate)、费率估算器返回的最低费率、以及钱包使用的全部费率均保持不变;mempool 最低费率仍会随高流量(区块拥堵)动态上调。
  • 网络采用是前提:除非全网广泛采用这些更低默认值,否则以低费率创建的交易并不保证能被转发或确认。
  • 钱包需要显式设置-mintxfee:钱包费率并未改变;若想用钱包创建低于旧默认值的交易,必须先配置-mintxfee

P2P 与网络层变更

1p1c(一父一子)package relay 的拓扑扩展

v30.0 增强了机会性 1-parent-1-child 包中继,使其能够处理“子交易在 mempool 中已有未确认父交易”的情况。这意味着 1p1c 包即便附着在更复杂的拓扑上也能被接受并传播,例如:

  • 多父一子(multi-parent-1-child):仅 1 个父交易需要费用追加(fee-bumping);
  • 祖父-父-子(grandparent-parent-child):仅父交易需要费用追加等场景。

实现由 PR #31385 引入,同时影响了下方submitpackageRPC 的语义放宽。测试覆盖位于 policy/packages.h(含MAX_PACKAGE_WEIGHT与标准交易重量的静态断言)与 test 目录下的 package 相关测试。

交易孤儿池(orphanage)DoS 防护重构,-maxorphantx失效

交易孤儿池用于暂存“缺少父交易输入”的交易,同时节点尝试向对端拉取其父交易。v30.0 将其容量控制从“唯一交易数量上限(默认 100,可用-maxorphantx配置)”改为双重限额(PR #31829):

  1. 评分上限:条目数(按 wtxid+peer 唯一计)加上每笔唯一交易输入数除以 10 后的累加值,不得超过3000
  2. 重量上限:全部唯一交易的重量总和不得超过404,000 Wu × 对端数量

这两个常量在源码中分别对应 txorphanage.h 的DEFAULT_RESERVED_ORPHAN_WEIGHT_PER_PEER{404'000}DEFAULT_MAX_ORPHANAGE_LATENCY_SCORE{3000},实测(如 bench/txorphanage.cpp)围绕这两个上限验证驱逐(eviction)逻辑的正确性。

对运维者的直接影响:-maxorphantx选项已不再产生任何效果(孤儿池不再以唯一交易数量为限)。若配置文件里还在使用它,应尽快移除,因为未来版本不再识别该参数时会导致启动报错。

新命令入口:bitcoin

v30.0 新增了统一的bitcoin命令行工具,目的是让各功能更易发现、更易使用。它本身只是“调用其他可执行文件”的分发器,不实现任何自身功能。其完整实现见 bitcoin.cpp:main解析子命令后通过ExecCommandbin/libexec/、Windows 安装目录daemon/或系统 PATH 中依次查找目标可执行文件并exec

命令与现有可执行文件的对应关系(源码 bitcoin.cpp):

bitcoin子命令等价调用
bitcoin node [ARGS]bitcoind [ARGS](或在-m多进程模式下为bitcoin-node
bitcoin gui [ARGS]bitcoin-qt [ARGS](或bitcoin-gui
bitcoin rpc [ARGS]bitcoin-cli -named [ARGS]
bitcoin wallet [ARGS]bitcoin-wallet [ARGS]
bitcoin tx [ARGS]bitcoin-tx [ARGS]
bitcoin help输出完整帮助
其他(bench/chainstate/test/test-gui/util详见bitcoin help完整输出

其中bitcoin rpc之所以默认启用-named(命名参数),是考虑到该新接口不需要向后兼容,便于调用方混用命名/位置参数(见源码注释,bitcoin.cpp)。

bitcoin还支持三个顶层开关(bitcoin.cpp):

bitcoin -m, --multiprocess # 运行多进程二进制 bitcoin-node / bitcoin-gui bitcoin -M, --monolithic # 运行单体二进制 bitcoind / bitcoin-qt(默认) bitcoin -v, --version # 版本信息 bitcoin -h, --help # 完整帮助

一个值得一提的自动决策逻辑(bitcoin.cpp 的UseMultiprocess):若未显式传-m/-M,只要命令行或配置文件里设置了任何-ipcbind/-ipcconnect/-ipcfd参数,bitcoin就会自动选用多进程二进制,因为只有它们具备 IPC 能力。

新工具是既有命令的“替代入口”,并不会取代既有命令,官方也没有废弃现有命令的计划。

外部签名与 IPC 挖矿接口

Windows 外部签名重新启用

此前在某些平台受限的外部签名(external signer,如硬件钱包)支持在 Windows 上被重新启用(PR #29868)。

实验性 IPC Mining 接口

bitcoin命令支持的唯一“全新功能”是实验性的 IPC Mining 接口(PR #31098),允许节点与 Stratum v2 或其他挖矿客户端协同工作。用法如下:

bitcoin -m node -ipcbind=unix

该命令以多进程模式(-m)启动内部二进制bitcoin-node(代替bitcoind),并在 unix socket 上监听 IPC 客户端连接,允许客户端请求区块模板(block template)并提交挖出的区块。其中-m目前是必需的,未来(配合 #33229)将变为可选。

IPC 连通性引入了新依赖(详见 multiprocess.md 与 design/multiprocess.md)。若不打算使用 IPC,可在构建时关闭:

cmake -DENABLE_IPC=OFF

(对应 PR #31802;默认开启。)

安装布局变更

v30.0 对安装后二进制布局做了调整(PR #31679),全部变更源于 “libexec/存放被调用组件、bin/存放用户入口” 的设计:

  • test_bitcoinbin/移至libexec/;仍可直接执行,或通过新命令bitcoin test调用。
  • libexec/中还新增了bitcoin-nodebitcoin-gui两个支持 IPC 的二进制,供bitcoin工具调用。
  • 仅源码构建(source build)时,test_bitcoin-qtbench_bitcoinbitcoin-chainstate也会安装到libexec/,并可通过bitcoin命令访问;细节见bitcoin help输出。

Windows 安装器相关变更(针对 PR #32132、#33422):开始菜单条目不再附带 “(64-bit)” 后缀;升级时会自动移除过时(obsolete)残留文件。

索引(Indexes):coinstatsindex 溢出修复与重建

coinstatsindex 的实现被修改,以修复一个已能在默认 Signet 网络上观察到的溢出 bug(PR #30469)。升级后首次启动新版本节点时,新版本索引需要从头同步。

目录路径变化如下:

版本存储路径(相对于数据目录)
旧版本(v29 及更早)/indexes/coinstats/
v30.0(新版本)/indexes/coinstatsindex/

实现见 coinstatsindex.cpp:新版本构造函数以"coinstatsindex"/"coinstatsidx"命名并在indexes/coinstatsindex目录读写;启动时若发现旧版目录会打印日志提示该目录“在不需要降级时可安全删除”。

重要运维提示:

  • 升级节点不会自动删除旧版/indexes/coinstats/,以便用户在必要时降级节点;
  • 若确定不会降级,可自行删除/indexes/coinstats/以释放磁盘;未来某版本可能自动清理旧版索引。

日志系统变更

无条件日志按源位置限速

所谓“无条件日志”指日志级别高于 debug 的infowarningerror。v30.0 起,落盘的无条件日志被按“源位置(source location)”限速:每个源位置每小时配额 1 MiB(PR #32604)。逻辑在 logging.cpp 中实现(should_ratelimit、内部 limiter 与抑制状态跟踪,见 logging.cpp)。

只要存在至少一个正在被抑制的源位置,所有日志行都会带上[*]前缀(见 logging.cpp 附近注释与逻辑)。这使运维者能一眼看出“当前有日志被限速抑制”。

-logsourcelocations输出完整函数签名

开启-logsourcelocations时,日志输出将包含完整的函数签名(而不只是函数名),便于在大规模代码库中精确定位日志来源。

RPC 变更盘点

废弃项:静态交易费率

-paytxfee启动选项与settxfeeRPC 已被废弃,将在 Bitcoin Core 31.0 移除(PR #31278)。原因:设置固定费率可能导致超付或欠付。替代方案:

  • 依赖费率估算(fee estimation);
  • 或逐笔交易通过fee_rate参数显式指定费率,涉及 RPC 包括fundrawtransactionsendtoaddresssendsendallsendmany

描述符白名单校验更严格

任何包含描述符参数的 RPC,若描述符中公钥片段首尾带空白(例如pk( KEY)pk(KEY )),将直接抛出错误(PR #31603)。

submitpackage放宽:无需提供全部未确认父交易

submitpackage(提交“子交易及其父交易”包)不再要求所有未确认父交易都在包内;包中可同时含有已在 mempool 的其他祖先(PR #31385,与 1p1c 拓扑扩展同源)。

waitfor*系列 RPC 取消隐藏并增强

  • waitfornewblock新增可选参数current_tip,且不再隐藏(hidden);
  • waitforblockwaitforblockheight不再隐藏(PR #30635)。

手续费替换全面支持 full RBF

psbtbumpfeebumpfee允许在 fullrbf 条件下发起替换,不再要求 BIP-125 信号(PR #31953)。

脚本校验错误文案标准化

交易脚本校验错误的原因前缀由两套混乱的字符串统一为(PR #33183):

场景旧前缀v30.0 新前缀
区块错误(共识级)mandatory-script-verify-flag-failedblock-script-verify-flag-failed
mempool 错误(标准性级)non-mandatory-script-verify-flagmempool-script-verify-flag-failed

结果字段扩充

  • getmininginfo新增"blockmintxfee"字段,返回-blockmintxfee配置值(PR #33189);
  • getmempoolinfo新增"permitbaremultisig""maxdatacarriersize"字段,分别反映-permitbaremultisig-datacarriersize配置(PR #29954,实现见 rpc/mempool.cpp)。

钱包相关 RPC 汇总(详见下文 Wallet 一节)

新 REST 端点:/rest/spenttxouts/BLOCKHASH

新增 REST API 端点/rest/spenttxouts/BLOCKHASH,用于借助区块的 undo 数据高效获取已花费交易输出(PR #32540)。路由与 URI 解析位于 rest.cpp,格式为/rest/spenttxouts/<hash>.<ext>

启动参数与默认设置变更(Updated settings)

32 位系统上的资源上限

-maxmempool-dbcache在 32 位系统上分别被限制上限为500 MB1 GiB(PR #32530),用于规避 32 位地址空间不足问题。

NAT-PMP 默认开启、UPnP 彻底移除

  • -natpmp默认值改为1(PR #33004)。这意味着默认监听(-listen默认开启)且位于防火墙/家用路由器后的节点,只要路由器支持PCPNAT-PMP协议,即可对外可达。
  • -upnp已被彻底移除(PR #32500),请改用-natpmp。参数注册与“设置了 proxy 则自动关闭 natpmp”的联动逻辑见 init.cpp。

-proxy支持按网络细分

-proxy原本是所有网络共享的代理设置(I2P 例外,走-i2psam),且只有 Tor 可单独用-onion覆盖。v30.0 扩展了-proxy语法(PR #32425),可按网络分别指定代理,方法是在代理地址后追加=<网络名>

# 仅对 IPv6 使用该代理 -proxy=127.0.0.1:5555=ipv6 # 多个网络分别代理 -proxy=127.0.0.1:4444=ipv4 -proxy=10.0.0.1:6666=ipv6 # 先用全局代理,再针对 CJDNS 撤销(走直连) -proxy=127.0.0.1:5555 -proxy=0=cjdns

规则要点:-proxy可多次使用,为不同网络(IPv4、IPv6、Tor、CJDNS)定义不同代理;同一网络后出现的设置覆盖先前的;利用该覆盖规则可以把早先的“全网络代理”替换为“某网络直连”。

-blockmaxweight降级为 debug-only

-blockmaxweight变为调试专用选项:仍可使用,但不再出现在默认-help文本中,仅在-help-debug中显示(PR #32654)。

钱包(Wallet)变更

Legacy 钱包彻底移除

  • BDB legacy 钱包无法再创建或加载,只能迁移到新版描述符(descriptor)钱包,迁移走migratewalletRPC;
  • bitcoin-wallet工具中冗余选项-withinternalbdb-legacy-descriptors被移除(PR #32944 等);
  • 仅 legacy 钱包可用的 RPC 被整体删除:addmultisigaddressdumpprivkeydumpwalletimportaddressimportmultiimportprivkeyimportpubkeyimportwalletnewkeypoolsethdseedupgradewallet(PR #28710、#32438、#31250 等)。

支持 TRUC 交易

钱包新增对 TRUC(Topologically Restricted Until Confirmed,v3 交易)的支持,包括花费收到的 TRUC 交易与创建 TRUC 交易(PR #32896),具体约束:

  • 钱包确保满足 TRUC 策略规则;
  • 若用户试图用其他版本 UTXO 混合花费 TRUC UTXO 会报错;
  • 未确认的 TRUC 兄弟交易被视为 mempool 冲突;
  • 钱包会确保花费 TRUC UTXO 的交易满足尺寸限制。

配套地,以下 RPC 新增version参数以创建任意标准版本号(1-3)的交易:createrawtransactioncreatepsbtsendsendallwalletcreatefundedpsbt

watchonly 相关清理

由于描述符钱包不允许混合 watchonly 与非 watchonly 描述符(PR #32618):

  • 所有 RPC 的include_watchonly选项(及其命名变体)被移除;
  • 返回iswatchonly字段的 RPC 一律移除该字段。

若干 RPC 行为修正

  • unloadwallet:当 RPC wallet 端点和wallet_name参数都未指定时,现在返回RPC_INVALID_PARAMETER(此前是 JSON 解析错误,PR #32845);
  • getdescriptoractivity:将blockhashesscanobjects参数标记为必填,缺失时给出清晰帮助信息(同样来自 #32845);
  • getwalletinfo:移除balanceimmature_balanceunconfirmed_balance字段(PR #32721);
  • getunconfirmedbalance整个 RPC 被移除,请改用getbalances并读取 JSON 响应中的["mine"]["untrusted_pending"]条目。

GUI 变更

  • GUI 从 Qt 5 迁移至Qt 6(PR #30997);Windows 上支持深色模式,macOS 改用Metal后端;
  • 交易费用提升(fee bump)在 full RBF 下被允许,不再要求 BIP-125 信号(PR #31953);
  • Transactions 页签的自定义列宽因 legacy 钱包移除被重置(PR #32459)。

底层变更与其他

  • 日志现在会记录是哪个对端发来的区块头,同时减少了冗余的区块头日志;副作用是少数非常规场景(例如收到携带此前未知区块头的直接BLOCK消息、或调用submitheaderRPC)不再打印新区块头日志(PR #27826);
  • 构建系统(Build System)相关改动见 v30.0 文档说明与仓库 CI 配置。

升级前配置迁移速查清单

针对 v30.0,建议所有节点运维者在升级前检查并修改以下配置(官方建议,均以 v30.0 文档为准):

旧用法v30.0 处理方式
-maxorphantx=N不再生效,请删除该配置(未来版本会因未知参数报错)
-upnp=1选项已移除,改用-natpmp=1(且其默认值已为开)
-paytxfee=...已废弃(31.0 移除),改用逐笔fee_rate参数
settxfeeRPC已废弃(31.0 移除)
getunconfirmedbalanceRPC已移除,改用getbalancesmine.untrusted_pending
依赖/indexes/coinstats/coinstatsindex 改用/indexes/coinstatsindex/并需重建
legacy/BDB 钱包无法创建/加载,请用migratewallet迁移为描述符钱包
import*dumpprivkey等 legacy RPC已移除
设置静态钱包费率需在钱包层面配置-mintxfee,并理解-minrelaytxfee/-incrementalrelayfee默认已降至 0.1 sat/vB
想维持旧版 83 字节数据载体上限显式加-datacarriersize=83

总结

Bitcoin Core v30.0 的核心主题可概括为:以更灵活也更安全的交易策略(2500 legacy sigops 上限、100,000 数据载体、0.1 sat/vB 中继费率默认值)、全新的bitcoin统一命令入口实验性 IPC 挖矿接口、以及legacy 钱包与 UPnP 等历史包袱的彻底清理为三大主线。升级操作并不复杂,但涉及若干配置项迁移与一次 coinstatsindex 的自动重建;建议对照本文速查清单逐项检查配置文件后,再进行停机升级与首次启动验证。需要阅读更完整变更上下文时,可直接查阅官方发布说明原文 release-notes-30.0.md。

【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询