Bitcoin Core 0.20.1 发布说明详解:Discouragement 节点机制、PSBT 双 utxo 兼容与 walletnotify 修复

发布时间:2026/9/7 4:39:29
Bitcoin Core 0.20.1 发布说明详解:Discouragement 节点机制、PSBT 双 utxo 兼容与 walletnotify 修复 Bitcoin Core 0.20.1 发布说明详解Discouragement 节点机制、PSBT 双 utxo 兼容与 walletnotify 修复【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoinBitcoin Core 0.20.1 是一次以缺陷修复与网络行为调整为核心的小版本发布。本篇基于仓库中收录的 0.20.1 发布说明 展开完整覆盖升级步骤、兼容性边界与源码 tarball 构建已知问题并深入剖析本版本三项标志性改动将自动封禁替换为discouragement降级/劝退机制、恢复因新块冲突被移出内存池的交易的-walletnotify通知以及 PSBT 对 segwit 输入同时携带non_witness_utxo与witness_utxo的兼容性修复。读完本文你可以安全地规划从旧版本到 0.20.1 的升级路径理解日志中 discouraged 与 banned 的区别并在自己的节点、矿机GBT与离线签名软件中正确使用相关 RPC 与 PSBT 字段。一、如何升级到 0.20.1发布说明给出了标准的升级流程适用于三个主要平台先完全停止正在运行的旧版本节点并等待其彻底退出某些情况下需要几分钟例如仍在落盘数据或关闭数据库Windows 用户直接运行安装程序macOS 用户覆盖/Applications/Bitcoin-QtLinux 用户覆盖bitcoind/bitcoin-qt二进制。升级路径上有两条重要说明可以直接从已达到 EOL停止支持的更老版本升级但如果数据目录需要迁移例如数据库格式迁移启动阶段可能明显变慢旧格式的钱包文件仍然受支持钱包数据不需要随节点升级而强制转换。二、兼容性说明Bitcoin Core 官方支持并做了充分测试的平台为使用 Linux 内核的系统macOS 10.12 及以上Windows 7 及更新的版本。其他类 Unix 系统通常也能运行但测试频率较低官方不建议在不受支持的平台上部署。0.20.0 起有两个明确的兼容性边界macOS 10.12 以下版本不再受支持自 0.20.0 开始激活 macOS 深色模式dark mode时Bitcoin Core 的界面外观暂不会随之改变。三、已知问题源码 tarball 构建回归0.20.1 为了让源码发布包更完整而修改了生成 tarball 的流程但引入了两个构建层面的回归。如果你是从官方下载的源码压缩包而非 git clone构建必须注意生成好的configure脚本缺失需要自行安装 autotoolsautoconf、automake等先运行./autogen.sh生成configure再执行./configure——这与从 git 检出源码后的行为一致不要直接运行裸make应当改用BITCOIN_GENBUILD_NO_GIT1 make以避免构建系统在无 git 元数据的打包环境中出错。对于通过安装器、macOS 磁盘映像或 Linux 包安装的用户这两个回归不影响使用只影响编译型用户。四、P2P 行为变化从自动封禁到Discouragement降级处理这是 0.20.1 最重要的行为变化。此前对发送无效块等恶意数据的对等节点peer日志和实现中都称其为 misbehaving且会触发自动封禁从 0.20.1 起这些节点被统一改称为discouraged nodes被降级的节点因为它们的实际待遇从来也依然不是严格意义上的封禁来自这些地址的入站连接仍然被允许但它们会成为优先被驱逐eviction的对象。对应实现为 #19219sipa它用劝退过滤器替换了原先的自动封禁逻辑。从当前仓库的源码结构看这一机制的脉络仍然延续PeerManagerImpl::Misbehaving()在检测到违规如无效的 compact block、mutated block、超大的 bloom filter 等时记录日志并触发降级处理见 src/net_processing.cpp其中的惩罚判定还会经由MaybePunishNodeForBlock按块验证结果分级例如BLOCK_MUTATED、BLOCK_INVALID_HEADER会直接降级对等节点见 src/net_processing.cpp。封禁状态的存储与列表则由 src/banman.cpp 负责listbanned/setbanRPC 的实现位于 src/rpc/net.cpp。0.20.1 对 discouraged 地址的处理还有四条具体规则运维人员必须知晓行为说明超时机制地址被降级不会在 24 小时或-bantime设置的时间后自动超时。降级状态何时失效取决于其他对等节点的流量时间不确定持久化降级状态不会在节点重启后保留重启即清除可查询性没有列出被降级地址的方法listbannedRPC 不返回它们同时该 RPC 也不再报告ban_reason字段因为manually added成为唯一剩余选项手动移除setban remove无法移除降级状态。确实需要清除时只能通过停止并重启节点来移除全部降级记录这四条规则意味着如果你发现某个对等节点被持续降级且无法通过 RPC 解除重启节点就是文档给出的唯一官方手段。五、-walletnotify恢复与新区块冲突而被移出内存池的交易0.20.1 修复了一个自 v0.19 起存在的回归上游 issue #18325当钱包交易因为与新区块冲突而内存池中移除时现在会重新触发-walletnotify外部通知。在 v0.19 之前这类通知是正常发送的v0.19 起被破坏本版本通过 #18982ryanofsky最小修复恢复了该行为。这对依赖外部脚本监听钱包事件如自动记账、支付网关的部署很关键以前这类被区块挤出的事务可能被静默忽略。从当前仓库源码结构看这条处理链落在钱包的transactionRemovedFromMempool回调中当移除原因为MemPoolRemovalReason::CONFLICT时代码会显式为这些交易触发外部-walletnotify通知并解释了为何先将状态置为 UNCONFIRMED 而非 CONFLICTED兼容性与历史同步实现的原因见 src/wallet/wallet.cpp。通知命令本身来自启动参数解析见 src/wallet/wallet.cpp。六、PSBT 变化segwit 输入同时携带non_witness_utxo与witness_utxo部分钱包软件开始要求对 segwit 输入提供完整的前序交易而此前 Bitcoin Core 的 PSBTPartially Signed Bitcoin Transaction部分签名交易只携带witness_utxo。0.20.1 起#19215achow101PSBT 中 segwit 输入将同时包含non_witness_utxo和witness_utxo以满足需要完整前序交易的软件保留witness_utxo是为了兼容那些依赖该字段存在与否来判断输入是否为 segwit 的既有软件。从当前仓库的 PSBT 实现可以看到这一设计的后续演进解析时会校验non_witness_utxo的哈希与prevout一致见 src/psbt.cpp 与 src/psbt.cppFinalize阶段还有能否丢弃non_witness_utxo的判定逻辑——仅当没有非 segwit 输入、不存在 segwit v0 输入且 sighash 类型不含SIGHASH_ANYONECANPAY时才允许丢弃见 src/psbt.cpp。理解这一点有助于排查跨软件互操作时 PSBT 字段冗余的问题。配套修复还包括decodepsbt中对输入值求和只按 UTXO 计一次的重复修复#19517、#19524。七、挖矿 GBT 修复rules键恢复!segwit与csv本版本的 Mining 类修复只有 1 条但非常实用#19019luke-jr恢复了getblocktemplate返回中rules键里的!segwit和csv标记供矿机/矿池声明其支持的规则集。从当前仓库的 GBT 实现结构看rules参数约定与默认规则集的处理仍集中在 src/rpc/mining.cpp例如getblocktemplate要求{rules: [segwit]}!segwit规则在 src/rpc/mining.cpp 处被加入升级前使用旧版客户端的矿池应当验证 0.20.1 的getblocktemplate输出与模板解析逻辑一致。八、0.20.1 完整变更日志以下为发布说明收录的完整 change log按模块分类便于按主题检索模块PR内容作者Mining#19019Fix GBT: Restore !segwit and csv to rules keyluke-jrP2P 协议与网络#19219Replace automatic bans with discouragement filtersipa钱包#19300Handle concurrent wallet loadingpromag钱包#18982Minimal fix to restore conflicted transaction notificationsryanofskyRPC 与其他 API#19524Increment input value sum only once per UTXO in decodepsbtfanquakeRPC 与其他 API#19517psbt: Increment input value sum only once per UTXO in decodepsbtachow101RPC 与其他 API#19215psbt: Include and allow both non_witness_utxo and witness_utxo for segwit inputsachow101GUI#19097Add missing QPainterPath includeachow101GUI#19059update Qt base translations for macOS releasefanquake构建系统#19152improve build OS configure outputskmcontrib构建系统#19536qt, build: Fix QFileDialog for static buildshebasto测试与 QA#19444Remove cached directories and associated script blocks from appveyor configsipsorcery测试与 QA#18640appveyor: Remove clcacheMarcoFalke其他#19194util: Dont reference errno when pthread failsmiztake其他#18700Fix locking on WSL using flock instead of fcntlmeshcollider其中与日常运维直接相关的值得单独点出#18700WSL 锁修复在 Windows Subsystem for Linux 下改用flock代替fcntl做文件锁修复了 WSL 环境中的锁问题——如果你在 WSL 里跑bitcoind这是升级的核心理由之一#19300并发钱包加载改进了多钱包并发加载的处理对运行多钱包的节点是稳定性改进#19097 / #19059GUI补齐 macOS 构建所需的QPainterPath头文件包含并更新 Qt 基础翻译。九、版本定位与文档脉络0.20.1 属于 0.20.x 维护系列中的 bugfix 小版本不含共识规则或协议版本变化升级风险主要集中在 P2P 降级语义的运维认知调整上。本仓库 doc/release-notes/ 目录下按时间线收录了从 0.3.x 一直到 31.x 的完整发布说明例如前一个版本 release-notes-0.20.0.md 与后续 release-notes-0.21.0.md可对照阅读理解 0.20.1 在整个版本演进中的位置。发布说明中引用的上游 issue/PR 编号如 #18325、#19219可直接用于检索对应社区的讨论与实现细节。升级决策建议运行 WSL 节点、依赖-walletnotify事件流的部署、以及通过 GBT 对接矿机的节点应优先升级到 0.20.1 获取对应修复若依赖 PSBT 与第三方钱包/冷签软件互操作升级后请重新校验双方对non_witness_utxo/witness_utxo字段的读写行为从 tarball 源码编译的用户务必按上文已知问题一节执行./autogen.sh与BITCOIN_GENBUILD_NO_GIT1 make升级后如有节点被持续降级而无法通过 RPC 解除重启节点即可清除全部降级状态这是文档给出的唯一手段。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考