Bitcoin Core 0.19.0.1 版本发布说明详解:BIP158 区块过滤器、avoid_reuse 隐私特性与 RPC/P2P 全面变更
【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin
本文基于 Bitcoin Core 仓库中的官方发布说明 release-notes-0.19.0.1.md,完整梳理 0.19.0.1 版本的新 RPC、新配置项、P2P 网络行为变更、钱包隐私改进与构建系统变化,并结合当前仓库源码指出每项特性的实现位置。读完本文,你能够掌握该版本升级的兼容性前提、getbalances/getblockfilter等新接口的用法、-blockfilterindex与whitelist权限的部署方式,以及 BIP37 默认禁用、两条纯块中继连接等底层网络变更对节点运维的实际影响。
版本背景:0.19.0 从未发布,0.19.0.1 才是实际版本
一个容易被忽略的事实:0.19.0 虽然打了 tag,但因最后一刻发现的问题(#17449)从未正式发布,用户实际获得的版本是 0.19.0.1。仓库中的 release-notes-0.19.0.md 仅用几行说明这一点,并将读者指向 0.19.0.1 的完整说明。因此本文所依据的 release-notes-0.19.0.1.md 是 0.19 系列唯一真实面向用户的发布文档,其内容涵盖新功能、缺陷修复、性能改进与更新后的翻译。
升级方式与系统兼容性
官方给出的升级路径是:先关闭旧版本,等待其完全退出(旧版本可能需要几分钟),然后安装新版本——Windows 上运行安装包,macOS 上覆盖/Applications/Bitcoin-Qt,Linux 上替换bitcoind或bitcoin-qt可执行文件。
从已到达维护期(EOL)的旧版本直接升级是可行的,但若数据目录(datadir)需要迁移可能耗时较长;旧版本创建的钱包文件通常仍受支持。
兼容性边界如下:
- 官方支持并充分测试的平台:Linux 内核系统、macOS 10.10+、Windows 7 及更高版本;
- 自 0.17.0 起,macOS 10.10 以下不再受支持——该版本改用 Qt 5.9.x 构建,而 Qt 5.9 已不支持更旧的 macOS;同时 Bitcoin Core 在当时尚未适配 macOS 的"深色模式"外观切换;
- 运行 macOS Catalina 的用户可能需要右键 .dmg 文件并选择"打开",这是 Apple 新的签名要求所致,而当时项目尚未完全遵循该要求;
- 其他 Unix 类系统上理论上可运行,但测试频率较低。
新增 RPC 接口
getbalances:余额接口的统一替代者
getbalances返回一个包含全部余额分类的对象:mine(属于钱包的确认余额)、untrusted_pending(未确认交易)与immature(未成熟的币基输出)。官方意图是用它逐步替代getbalance、getunconfirmedbalance以及getwalletinfo中的余额字段——这些旧调用与字段在后续版本中可能被移除(#15930、#16239)。
在当前仓库源码中,该 RPC 的实现可见于 src/wallet/rpc/wallet.cpp,而余额的底层计算逻辑位于 src/wallet/rpc/coins.cpp,这与发布说明中提到的"移除大量 Get*Balance 全局函数、将余额逻辑收拢进钱包模块"的重构方向一致。
setwalletflag:钱包级功能开关
setwalletflag用于设置或取消设置针对某个已存在钱包的功能标志,例如本文后面详述的avoid_reuse。其实现同样在 src/wallet/rpc/wallet.cpp(该文件中setwalletflag的 RPCMethod 定义约在 第 287 行)。(#13756)
getblockfilter:读取 BIP158 区块过滤器
getblockfilter用于获取指定区块的 BIP158 过滤器,帮助文本中的示例形如:
getblockfilter "00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09" "basic"前提是该过滤器已通过-blockfilterindex配置项创建;未启用时该 RPC 不可用(#14121)。在当前仓库中,其 RPC 定义位于 src/rpc/blockchain.cpp,而过滤器索引的核心实现在 src/index/blockfilterindex.cpp,对应的单元测试见 src/test/blockfilter_index_tests.cpp。
新增配置项:-blockfilterindex
-blockfilterindex开启后,节点会为整条区块链后台生成 BIP158 区块过滤器,大约占用 4 GiB 磁盘空间。需要注意:0.19.0.1不会通过 P2P 网络对外提供区块过滤器,本地用户只能借助getblockfilterRPC 获取。这意味着该配置的价值在于为轻量客户端(light client)铺路的本地能力储备,而非面向网络的过滤服务。
参数在初始化阶段的处理位于 src/init.cpp,网络侧的相关代码涉及 src/net_processing.cpp,与发布说明"本版本不提供过滤器中继"的表述相互印证。
更新配置项:whitelist/whitebind 权限与 dbcache
whitebind 与 whitelist 支持权限列表
0.19.0.1 中,whitebind和whitelist现在接受一个权限列表,用于规定通过指定接口或 IP/CIDR 连接的节点可以触发哪些行为。若未显式指定权限,则隐式默认权限与旧版本完全相同,保持向后兼容。可用权限详见bitcoind -help输出(#16248)。
这一变更与后文 P2P 部分 BIP37 默认禁用直接配合:不再全局开放 bloom 过滤的节点,可以只信任特定对等方开启bloomfilter权限,把过滤能力收缩到白名单范围内。
dbcache:同样数值,更少真实内存
设置了自定义dbcache的用户可以略微调高取值而不增加真实内存占用:本版本的链状态(chainstate)内存核算变得更准确(此前是低估),同时内存使用整体下降了约 9%。官方给出的例子:原来设450的用户现在可以设500,实际占用大致相当(#16957)。
更新后的 RPC 行为变更
以下 RPC 变更直接影响既有脚本与钱包集成,是发布说明中最密集的部分:
sendmany移除minconf参数:该参数定义模糊,即使钱包选币成功也会引发 RPC 错误。需要影响选币的用户应改用-spendzeroconfchange、-limitancestorcount、-limitdescendantcount、-walletrejectlongchains等配置(#15596)。avoid_reuse参数:getbalance、sendtoaddress以及新增的getbalances、createwallet接受avoid_reuse参数,控制是否纳入已使用地址。特别地,sendtoaddress在avoid_reuse启用时会避免部分花费(partial spend)——即使没有通过-avoidpartialspends全局开启也会如此,因为不这样做会冒用错"错误的 UTXO"的风险(#13756)。include_watchonly默认值变更:对 watch-only 钱包,getbalance、listreceivedbyaddress、listreceivedbylabel、listtransactions、listsinceblock、gettransaction、walletcreatefundedpsbt、fundrawtransaction的 watch-only 参数现在默认视为true(#16383)。listunspent新增reused字段:当钱包开启avoid_reuse标志时,每个输出会带一个reused布尔值(#13756)。getblockstats改用 BlockUndo 数据:不再依赖交易索引(-txindex),速度大幅提升,且对所有非裁剪区块可用(#14802)。utxoupdatepsbt支持descriptors参数:在已知描述符时填充输入/输出脚本与密钥;提供表明花费的是 segwit 输出的描述符时,P2SH-witness 输入可从 UTXO 集合中补全(#15427)。sendrawtransaction与testmempoolaccept的费用上限机制重做:不再接受allowhighfees参数。旧机制是当交易费用超过配置项-maxtxfee时拒绝;新机制改为硬编码的默认最高费率,可在调用两个 RPC 时通过maxfeerate参数调整(#15620)。- mempool 系列 RPC 用
vsize替换size:getmempoolancestors、getmempooldescendants、getmempoolentry、getrawmempool不再返回size字段(除非启用-deprecatedrpc=size),改为返回交易虚拟大小的vsize字段,与getrawtransaction等 RPC 保持一致(#15637)。 getwalletinfo新增scanning字段:为false表示未扫描;为对象时包含钱包重扫历史区块的时长与进度信息(#15730)。gettransaction新增第三个布尔参数verbose:为true时响应中新增decoded字段,内容等价于decoderawtransaction,或getrawtransaction传入verbose时的结果(#16185、#16866、#16873)。createwallet接受passphrase参数:设置即用该口令加密新钱包;不设置(默认)或空字符串则不加密(#16394)。getchaintxstats新增window_final_block_height键(#16695)。getmempoolentry新增 BIP141 定义的weight字段(#16647)。getnetworkinfo与getpeerinfo新增解码后的网络服务标志字段(#16786)。getdescriptorinfo新增checksum字段:返回用户提供的、未经规范化(normalize)描述的校验和(#15986)。joinpsbts打乱输入输出顺序:此前结果 PSBT 的输入输出按传入顺序追加,容易被关联输入与输出、造成隐私泄露;现在合并后打乱顺序(#16512)。walletcreatefundedpsbt遵循-walletrbf:当该配置为 true 时,生成的 PSBT 会带上 BIP125 替换费用信号(#15911)。
GUI 变更
- GUI 钱包默认生成 bech32 地址。用户在发票(请求收款)界面可通过开关临时切换地址类型;默认类型也可用
-addresstype配置项修改(#15711、#16497)。 - BIP70 支付请求支持在 0.18.0 引入构建开关时可禁用(默认启用),0.19.0 起默认禁用。如需在 GUI 中启用 BIP70,编译时向
./configure传--enable-bip70(#15584)。
弃用或移除的配置与 RPC
配置项方面:
-mempoolreplacement被移除,默认行为不变。该选项原本可阻止节点接受或中继 BIP125 交易替换。注意它与保留的-walletrbf是不同概念(#16171)。
RPC 方面:
bumpfee的totalFee参数弃用:除非指定配置参数deprecatedrpc=totalFee,否则不再接受;该参数将在后续版本彻底移除(#15996)。bumpfee新增fee_rate选项作为totalFee的替代(#16727)。generateRPC 移除:它在 0.18 已被弃用,应改用generatetoaddress(#15492)。
P2P 协议与网络变更
BIP61 reject 消息默认禁用
BIP 61 reject 消息在 v0.18 已被弃用,本版本起默认关闭,可用-enablebip61命令行选项重新启用,未来版本将完全移除(#14054)。
BIP37 bloom 过滤默认禁用(重要)
为消除已知拒绝服务攻击向量(尤其针对机械硬盘节点),-peerbloomfilters默认值改为false。其影响是节点将:不发送 BIP111 的NODE_BLOOM服务标志、不接受 BIP37 bloom 过滤、不提供 merkle 块或匹配 bloom 过滤的交易。仍想提供过滤能力的用户有两个选择:
- 将
-peerbloomfilters设为 true,同时重新启用 BIP111 与 BIP37; - 只利用上文更新的
-whitelist/-whitebind权限机制,为特定对等方开启 BIP37 支持。
官方同时提醒:短期内依赖公共 BIP111/BIP37 节点的轻量客户端仍可能连上旧版本或手动开启支持的节点,但此类软件的开发方应考虑迁移到专用 BIP37 节点或替代交易过滤体系(#16152)。
新增两条纯块中继出站连接
本版本默认建立额外两条仅用于区块中继的出站连接:这些连接上不处理任何交易与 addr 消息。设计上它们带来很少的额外内存与带宽开销,但能增加分区攻击的实施难度(#15759)。从源码结构看,这类连接的管理逻辑集中在 src/net_processing.cpp 与 src/net.cpp 的 P2P 核心中。
CLI 变更
bitcoin-cli -getinfo中的testnet字段更名为chain,现在返回按 BIP70 定义的网络名(main、test、regtest)(#15566)。
低层变更
RPC 低层变化
getblockchaininfo不再返回bip9_softforks对象,信息移入softforks对象,并新增type字段说明该软分叉的激活判定方式(如 BIP9 或 BIP34)(#16060)。getblocktemplate不再返回包含CSV和segwit(处于激活态的 BIP9 部署)的rules数组(#16060)。getrpcinfo新增logpath字段,指向debug.log路径(#15483)。
测试链(regtest)默认遵循标准策略
-regtest启用的回归测试链现在默认要求交易不违反标准策略,与主网默认行为一致,便于在 regtest 上测试主网行为。注意 testnet 默认仍允许非标准交易;两条测试链都可用-acceptnonstdtxn本地调整(#15891)。
配置文件解析更严格
- 只写在
[default]段、未写进具体网络段(如[testnet])的设置,在非主网网络下会直接报错阻止启动(而非旧版的警告),防止本意用于主网的设置被误施加到 testnet/regtest(#15629)。 - 支持
thread_local的平台上,日志行可加上产生该日志的线程名前缀,用-logthreadnames=1开启(#15849)。
网络低层行为
- 交易下载顺序随机化:旧版本按对等方宣告顺序依次尝试下载某笔被多方宣告的交易;本版本随机化跨对等方的抓取顺序,并优先向出站对等方发送下载请求。这修复了入站对等方可能阻塞节点获取交易的问题(#14897、#15834,修复在 #15834 中完成)。
- Tor 隐藏服务端口固定为 8333:即使 clearnet 连接配置了其他端口,使用 Tor 隐藏服务时 Bitcoin Core 也会绑定标准端口 8333,防止通过相同非默认端口号泄露节点身份(#15651)。
内存池与交易中继
- CPFP 包限额放宽一档:此前若内存池某交易有 25 个后代,或其与所有后代合计超过 101,000 vbytes,任何新的后代交易都会被忽略。现在允许多一个直接子交易(前提是该子交易为直接后代且大小不超过 10,000 vbytes)。这让闪电网络等双方合约协议可以给每个参与方一个可立即花费的输出用于 CPFP 提费,同时不允许可恶参与方填满整个包从而卡死对方(#15681)。
- 接受 v1~v16 未来见证版本输出:支付给未来 segwit 版本的输出现在可进入内存池、被中继和挖矿;花费这些输出仍被策略禁止("非标准")。该变更广泛部署后,钱包与服务可以放心接受任意合法 bech32 地址,而无须担心付款给未来 segwit 版本的交易卡在未确认状态(#15846)。
- BIP144 编码规则强制执行:不含 segwit 输入的传统交易必须使用传统编码格式发送(#14039)。
钱包低层行为
- 裁剪模式下 rescan 失败条件收窄:由
importwallet、importpubkey、importaddress、importprivkey触发的重扫,只在确实有区块被裁剪时才失败,而不再只要设置了-prune就失败。这使得把-prune设为较大值(如磁盘总大小)不再让导入 RPC 在第一个区块被裁剪前就报错(#15870)。 - 超过
-maxtxfee的交易直接失败:walletcreatefundedpsbt与fundrawtransaction在费用超过-maxtxfee(默认 0.1 BTC)时现在直接失败,而不再向下取整费用。注意feeRate参数单位是 BTC/1000 vbytes,不是 sat/vB(#16257)。 avoid_reuse钱包标志(默认关闭):启用后,钱包区分"已使用"与"未使用"地址,并在选币时默认避开前者。对已有钱包设置该标志时,必须重扫区块链才能正确标记此前已用过的收款地址。结合 v0.17.0 引入的"避免部分花费",可消除一个严重隐私问题——恶意方此前可以向已付过的地址发送小额付款,使其被包含进未来无关交易的输入中,从而跟踪花费(#13756)。
构建系统
- Python 最低版本要求提升至 3.5,覆盖构建系统、测试框架与 linter 全部环节;此前支持的 3.4 已于 2019 年 3 月 EOL(#14954)。
- miniUPnPc 最低 API 版本定为 10,保持与 Ubuntu 16.04 LTS 及 Debian 8 的
libminiupnpc-dev包兼容。发布说明同时提示:Debian 该包在 jessie 上仍存在 CVE-2017-8798 漏洞,在 jessie 与 stretch 上存在 CVE-2017-1000494 漏洞(#15993)。
变更日志概览与相关文档
发布说明附录了完整的 0.19.0 变更日志(按 Consensus、Policy、Block and transaction handling、P2P、Wallet、RPC、GUI、Build system、Tests and QA、Miscellaneous、Documentation 分类,条目总数数百),并致谢了 100 余位直接贡献者及翻译社区。对运维与开发者而言,几个值得单独记住的条目是:#14121 Index for BIP 157 block filters(BIP158 过滤器索引)、#13756 "avoid_reuse" wallet flag(隐私标志)、#16152 Disable bloom filtering by default(默认禁用 bloom)、#15759 Add 2 outbound block-relay-only connections(纯块中继连接)、#16957 9% less memory: make SaltedOutpointHasher noexcept(内存下降 9% 的来源)。
该版本新增的用户文档《Reduce memory》(对应条目 #16339)建议了低内存系统上运行 Bitcoin Core 的配置调整,当前仓库中仍可在 doc/reduce-memory.md 查阅。此外,发布说明中"Updated settings"一节提到的内存核算改进与 doc/developer-notes.md 中链状态内存的讨论可对照阅读,以理解dbcache与真实内存占用的关系。
适用前提与限制小结
- 本文所有行为描述以 0.19.0.1 发布说明为准;当前仓库 HEAD 已演进到更新版本,部分默认值(如 bloom 过滤、
generate移除后的替代接口)在后续版本中又有变化,引用源码路径时应注意其反映的是当前代码状态而非 0.19.0.1 发布时的快照。 -blockfilterindex的 4 GiB 空间估算与 BIP158 过滤器格式绑定,且本版本不提供 P2P 过滤器服务——部署前需按此评估磁盘与网络能力。- 直接升级自 EOL 旧版本可能触发耗时的数据目录迁移;涉及
avoid_reuse、watch-only 默认值、vsize字段变更的集成代码应先行回归测试。
【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考