Bitcoin Core v30.0 升级详解:新 bitcoin 命令、费率默认值重构与交易策略变更实战指南
本文以 Bitcoin Core v30.0 官方发布说明为主体,系统梳理该版本在交易策略(Policy)、P2P 网络、命令入口、钱包与 GUI 等层面的全部变更,并结合仓库源码给出可验证的实现依据。读者通过本文可以完整掌握从 v29.x 升级到 v30.0 需要了解的功能变化、参数迁移清单与潜在的运维注意事项,可作为直接参考的版本升级与配置迁移手册。
版本概况与升级方式
v30.0 是一个新特性版本,包含新特性、大量缺陷修复与性能改进,以及更新的翻译。全部变更的权威来源见 release-notes-30.0.md,本文涉及的策略默认值、启动参数与命令行为均以该文档及当前仓库源码为准。
升级方式非常简单:
- 若正在运行旧版本,先完整关闭节点(部分情况下完全退出可能需要几分钟);
- Windows 直接运行安装程序,macOS 覆盖拷贝
/Applications/Bitcoin-Qt,Linux 则用新版本替换bitcoind/bitcoin-qt可执行文件; - 从已达 EOL(生命周期结束)的旧版本直接升级也是允许的,但如果数据目录需要迁移(例如 coinstatsindex 从旧格式重建,见下文),首次启动可能耗时较长。
旧版钱包格式(BDB legacy)在 v30.0 中已无法加载,但可通过 migratewallet RPC 迁移到描述符钱包,因此“老版本钱包数据仍总体被支持”。
支持的操作系统
官方测试支持的操作系统为: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/vB | DEFAULT_BLOCK_MIN_TX_FEE{1}(1 sat/kvB) |
用于矿工对加入区块模板的 package 设定最低费率 |
-minrelaytxfee(最低中继费率) |
— | 0.1 sat/vB | DEFAULT_MIN_RELAY_TX_FEE{100}(100 sat/kvB) |
低于此值视为零费率,不中继不打包 |
-incrementalrelayfee(增量中继费率) |
— | 0.1 sat/vB | DEFAULT_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 引入,同时影响了下方 submitpackage RPC 的语义放宽。测试覆盖位于 policy/packages.h(含 MAX_PACKAGE_WEIGHT 与标准交易重量的静态断言)与 test 目录下的 package 相关测试。
交易孤儿池(orphanage)DoS 防护重构,-maxorphantx 失效
交易孤儿池用于暂存“缺少父交易输入”的交易,同时节点尝试向对端拉取其父交易。v30.0 将其容量控制从“唯一交易数量上限(默认 100,可用 -maxorphantx 配置)”改为双重限额(PR #31829):
- 评分上限:条目数(按 wtxid+peer 唯一计)加上每笔唯一交易输入数除以 10 后的累加值,不得超过 3000;
- 重量上限:全部唯一交易的重量总和不得超过 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 解析子命令后通过 ExecCommand 在 bin/、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_bitcoin从bin/移至libexec/;仍可直接执行,或通过新命令bitcoin test调用。libexec/中还新增了bitcoin-node与bitcoin-gui两个支持 IPC 的二进制,供bitcoin工具调用。- 仅源码构建(source build)时,
test_bitcoin-qt、bench_bitcoin、bitcoin-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 的 info、warning、error。v30.0 起,落盘的无条件日志被按“源位置(source location)”限速:每个源位置每小时配额 1 MiB(PR #32604)。逻辑在 logging.cpp 中实现(should_ratelimit、内部 limiter 与抑制状态跟踪,见 logging.cpp)。
只要存在至少一个正在被抑制的源位置,所有日志行都会带上 [*] 前缀(见 logging.cpp 附近注释与逻辑)。这使运维者能一眼看出“当前有日志被限速抑制”。
-logsourcelocations 输出完整函数签名
开启 -logsourcelocations 时,日志输出将包含完整的函数签名(而不只是函数名),便于在大规模代码库中精确定位日志来源。
RPC 变更盘点
废弃项:静态交易费率
-paytxfee 启动选项与 settxfee RPC 已被废弃,将在 Bitcoin Core 31.0 移除(PR #31278)。原因:设置固定费率可能导致超付或欠付。替代方案:
- 依赖费率估算(fee estimation);
- 或逐笔交易通过
fee_rate参数显式指定费率,涉及 RPC 包括fundrawtransaction、sendtoaddress、send、sendall、sendmany。
描述符白名单校验更严格
任何包含描述符参数的 RPC,若描述符中公钥片段首尾带空白(例如 pk( KEY) 或 pk(KEY )),将直接抛出错误(PR #31603)。
submitpackage 放宽:无需提供全部未确认父交易
submitpackage(提交“子交易及其父交易”包)不再要求所有未确认父交易都在包内;包中可同时含有已在 mempool 的其他祖先(PR #31385,与 1p1c 拓扑扩展同源)。
waitfor* 系列 RPC 取消隐藏并增强
waitfornewblock新增可选参数current_tip,且不再隐藏(hidden);waitforblock与waitforblockheight不再隐藏(PR #30635)。
手续费替换全面支持 full RBF
psbtbumpfee 与 bumpfee 允许在 fullrbf 条件下发起替换,不再要求 BIP-125 信号(PR #31953)。
脚本校验错误文案标准化
交易脚本校验错误的原因前缀由两套混乱的字符串统一为(PR #33183):
| 场景 | 旧前缀 | v30.0 新前缀 |
|---|---|---|
| 区块错误(共识级) | mandatory-script-verify-flag-failed |
block-script-verify-flag-failed |
| mempool 错误(标准性级) | non-mandatory-script-verify-flag |
mempool-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 MB 与 1 GiB(PR #32530),用于规避 32 位地址空间不足问题。
NAT-PMP 默认开启、UPnP 彻底移除
-natpmp默认值改为1(PR #33004)。这意味着默认监听(-listen默认开启)且位于防火墙/家用路由器后的节点,只要路由器支持PCP或NAT-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 被整体删除:
addmultisigaddress、dumpprivkey、dumpwallet、importaddress、importmulti、importprivkey、importpubkey、importwallet、newkeypool、sethdseed、upgradewallet(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)的交易:createrawtransaction、createpsbt、send、sendall、walletcreatefundedpsbt。
watchonly 相关清理
由于描述符钱包不允许混合 watchonly 与非 watchonly 描述符(PR #32618):
- 所有 RPC 的
include_watchonly选项(及其命名变体)被移除; - 返回
iswatchonly字段的 RPC 一律移除该字段。
若干 RPC 行为修正
unloadwallet:当 RPC wallet 端点和wallet_name参数都未指定时,现在返回RPC_INVALID_PARAMETER(此前是 JSON 解析错误,PR #32845);getdescriptoractivity:将blockhashes与scanobjects参数标记为必填,缺失时给出清晰帮助信息(同样来自 #32845);getwalletinfo:移除balance、immature_balance、unconfirmed_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 参数 |
settxfee RPC |
已废弃(31.0 移除) |
getunconfirmedbalance RPC |
已移除,改用 getbalances 的 mine.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。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00