
Bitcoin Core 0.17.0 发布说明详解PSBT、动态钱包与账户 API 废弃全解析【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin本文基于 Bitcoin Core 官方发布说明 release-notes-0.17.0.md 整理聚焦 0.17.0 这一里程碑版本的核心变更BIP 174 部分签名交易PSBT支持、运行时动态加载/创建/卸载钱包、账户accountAPI 向标签labelAPI 的迁移、-includeconf配置包含、独立构建的交易索引txindex等。读完本文你将掌握 0.17.0 的升级注意事项、新 RPC 的工作流与参数细节并能在当前代码库中定位每项特性的实现位置如 src/rpc/rawtransaction.cpp、src/wallet/rpc/wallet.cpp、src/common/args.cpp。版本定位与升级路径0.17.0 是一个包含新特性、缺陷修复与性能改进的主要版本。官方发布说明给出了明确的升级步骤运行旧版本时先完整关闭旧版本关闭可能需要几分钟然后在 Windows 上运行安装器或在 Mac 上覆盖/Applications/Bitcoin-Qt、在 Linux 上覆盖bitcoind/bitcoin-qt。txindex 数据库迁移如果节点开启了 txindex首次运行 0.17.0 或更高版本时会迁移 txindex 数据库可能耗时数小时迁移完成前节点不可用。chainstate 格式转换首次运行 0.15.0 或更高版本时chainstate 数据库会转换为新格式耗时几分钟到半小时不等。区块数据库格式在 0.8.0 时已变更没有从 0.7.x 及更早版本直接升级到 0.15.0 的自动升级代码旧钱包格式仍受支持。降级警告0.15 之后的 chainstate 数据库与更早版本不兼容。若从 0.15 回退到旧版本需用-reindex-chainstate重建旧格式的 chainstate 数据结构若开启了裁剪pruning则意味着需要重新下载并处理整个区块链。兼容性与已知问题受充分测试的平台为 Linux 内核系统、macOS 10.10 与 Windows 7 及以上不支持 Windows XP0.17.0 起不再支持 macOS 10.10 以下系统因为 0.17.0 使用 Qt 5.9.x 构建而 Qt 5.9 不支持更旧的 macOS。从 0.13.0 或更早版本升级时回滚到 SegWit 激活点会导致内存暴涨需要执行完整的-reindex。GUI 在 macOS 新黑暗模式下存在视觉缺陷Qt 主题处理问题0.17.1 预期修复。配置选项变更-includeconffile包含外部配置文件0.17.0 新增-includeconffile可在主配置文件中包含其他配置文件支持包含多个文件也可用-noincludeconf从命令行禁用。两条关键限制值得注意只能在bitcoin.conf中使用被包含的文件内不能再用命令行也不能直接使用该选项。多参数选项的覆盖语义后出现的-includeconf会覆盖前面出现的-noincludeconf。例如如下配置noincludeconf1 includeconfrelative.confbitcoin.conf仍然会包含relative.conf。从当前代码库的源码结构看这一行为在 src/common/args.cpp 中得到了印证参数管理器明确禁止从命令行传入includeconf只允许通过-noincludeconf关闭// we do not allow -includeconf from command line, only -noincludeconf if (auto* includes common::FindKey(m_settings.command_line_options, includeconf)) { ... error -includeconf cannot be used from commandline; -includeconf values.begin()-write();测试网与回归网的配置节Configuration sections0.17.0 起单个配置文件可以为不同网络设置不同选项支持两种方式以网络名作前缀或使用节section。发布说明给出的完整示例main.uacommentbitcoin test.uacommentbitcoin-testnet regtest.uacommentregtest [main] mempoolsize300 [test] mempoolsize100 [regtest] mempoolsize20两条规则必须遵守以下选项若未放在节内仅对主网生效addnode、connect、port、bind、rpcport、rpcbind与wallet。选择网络的选项regtest与testnet必须在节之外指定。钱包变更外部钱包文件与动态钱包外部钱包文件-walletpath选项从 0.17.0 起接受完整路径不再要求钱包必须位于-walletdir目录内。新创建钱包的目录格式当-walletpath指向一个不存在的路径时现在会在该位置创建一个钱包目录包含wallet.dat数据文件、db.log文件与database/log.??????????日志文件而不是像以前那样只在该路径创建数据文件、把日志文件存到父目录。这样备份钱包时直接归档指定路径即可无需再去父目录寻找交易日志文件明显简化了备份流程。出于向后兼容指向-walletdir内已存在数据文件名称的路径仍按旧方式解释。运行时动态加载与创建钱包此前钱包只能在启动时通过-wallet参数加载或创建。0.17.0 起可在运行时动态操作loadwallet加载已存在的钱包可指定walletdir内的文件/目录基名或文件/目录的绝对路径。createwallet创建并加载新钱包提供的名称不得与walletdir内的钱包文件重名也不得与当前已加载钱包重名。unloadwallet卸载已加载的钱包。该特性当时仅通过 RPC 接口提供。在当前仓库中这三个 RPC 仍保留在 src/wallet/rpc/wallet.cpp 中loadwallet见约 L222、createwallet见约 L355、unloadwallet见约 L443且当前版本还扩展了带描述符选项的createwallet调用形式可见 0.17.0 引入的动态钱包管理已成为后续版本的钱包基础设施。硬币选择Coin Selection避免部分花费当同一地址被多次打款时来自这些独立支付的币本可以分开花费这会因关联本应相互隔离的地址而损害隐私。0.17.0 新增-avoidpartialspends选项默认false启用后钱包总是把发送到同一地址的既有 UTXO 一起花费即使这意味着更高的手续费。注意如果某地址被使用过之后又收到了新币这些新币仍会包含在后续的硬币选择中。当前代码库中该逻辑位于钱包的支出模块如 src/wallet/spend.cpp 与 src/wallet/coincontrol.cpp选项定义见 src/wallet/init.cpp说明这一 0.17.0 特性至今仍是钱包硬币选择策略的一部分。账户 API 废弃label 取代 account0.17.0 为钱包引入了 label API作为已废弃 account API 的替代。在 0.17 中仍可通过-deprecatedrpcaccounts启动 bitcoind 继续使用 account APIaccount API 将在 0.18 中完全移除。label 与 account 的功能差异标签可设置在任意地址上而不仅是接收地址此功能此前只在 GUI 中可用。可用setlabel把某标签下的所有地址重新分配到其他标签来删除该标签。不支持从某个标签发起交易也无法判断某笔交易是从哪个标签发出的。标签没有余额概念。RPC 方法映射发布说明完整表格废弃方法新方法说明getaccountgetaddressinfogetaddressinfo返回包含地址信息的 JSON 对象而非仅账户名字符串。getaccountaddress无标签没有关联的接收地址因此无替代方法。getaddressesbyaccountgetaddressesbylabel以地址为键的 JSON 对象而非字符串列表。getreceivedbyaccountgetreceivedbylabel行为不变。listaccountslistlabels不返回余额也不接受minconf与watchonly参数。listreceivedbyaccountlistreceivedbylabel两者都返回新的label字段同时保留account字段以便向后兼容。move无无替代。sendfrom无无替代。setaccountsetlabel两者现在都允许把标签分配给任意地址而非对非接收地址报错当最后一个使用该标签的地址被重新分配时删除原标签而不是隐式调用getaccountaddress确保旧标签仍有接收地址。参数改名的方法变更方法说明addmultisigaddress命名参数account改名为label带-deprecatedrpcaccounts运行时仍接受account。getnewaddress命名参数account改名为label向后兼容同上。listunspent返回新的label字段带-deprecatedrpcaccounts运行时仍返回account字段。sendmany命名参数account改名为dummy提供时必须为空字符串除非带-deprecatedrpcaccounts。listtransactions命名参数account改名为dummy提供时必须为字符串*除非带-deprecatedrpcaccounts。getbalanceaccount、minconf与include_watchonly参数被废弃仅带-deprecatedrpcaccounts时可用。BIP 174 部分签名比特币交易PSBTPSBT 是一种面向尚未完全签名的比特币交易的交换格式附带帮助各方推进签名的相关元数据。它旨在简化多个参与方需要协作生成交易的工作流典型场景包括硬件钱包、多重签名设置与 CoinJoin 交易。整体工作流完整签名交易的构建经过以下步骤**Creator创建者**提出待创建的交易构造一个只包含特定输入与输出、不含其他元数据的 PSBT。对每个输入**Updater更新者**把该交易花费的 UTXO 信息加入 PSBT。可能由另一个 Updater 为每个输入以及可能的输出添加相关脚本与公钥信息。**Signer签名者**检查交易及其元数据决定是否同意该交易可用 UTXO 中的金额信息评估价值与手续费。同意后为其持有相关密钥的输入生成部分签名。对每个输入运行Finalizer终结者把部分签名和可能的脚本信息转换为最终的scriptSig与/或scriptWitness。**Extractor提取者**从所有输入均已终结的 PSBT 生成有效的比特币交易网络格式。除 Creator 与 Extractor 外上述每个角色通常只是向同一个 PSBT 追加越来越多的数据。朴素的工作流中它们必须串行传递 PSBT直到 Extractor 能转换为真实交易为了允许并行操作可以引入Combiner合并者把同一笔未签名交易的不同 PSBT 中的元数据合并起来。以上粗体名称是 BIP 174 定义的角色理解底层步骤时有用但实际的软件与硬件实现通常同时承担多个角色。PSBT 相关 RPCconverttopsbtCreator工具 RPC把未签名的原始交易转换为 PSBT 格式忽略已有签名。createpsbtCreator工具 RPC接受输入/输出列表并转换为不含附加信息的 PSBT等价于依次调用createrawtransaction与converttopsbt。walletcreatefundedpsbtCreator、Updater钱包 RPC按指定输入/输出创建 PSBT、补入额外输入与找平币使其平衡并添加相关元数据。对钱包知晓的输入计入常规或只读余额的会加入 UTXO 信息对已有 UTXO 信息的输入和输出会加入钱包知晓的密钥与脚本信息。等价于运行createrawtransaction、fundrawtransaction、converttopsbt三步。walletprocesspsbtUpdater、Signer、Finalizer钱包 RPC输入一个 PSBT为缺失数据的输入/输出补充 UTXO、密钥与脚本数据可选地签名输入并尽可能终结部分签名。finalizepsbtFinalizer、Extractor工具 RPC终结所有部分签名若所有输入均已终结则转换为可广播的完整签名交易可用sendrawtransaction广播。combinepsbtCombiner工具 RPC实现 Combiner 角色可在工作流任意时点合并同一 PSBT 不同版本中加入的信息特别适合合并多个 Updater 或 Signer 的输出。decodepsbt诊断工具 RPC以人类可读形式展示 PSBT 中的全部信息并在费用可知时计算其最终手续费。当前仓库中这些 PSBT 工具类 RPCcreatepsbt、converttopsbt、finalizepsbt、combinepsbt、decodepsbt等的实现位于 src/rpc/rawtransaction.cpp钱包侧的walletcreatefundedpsbt与walletprocesspsbt位于 src/wallet/rpc/spend.cppPSBT 的数据结构与序列化逻辑在 src/psbt.cpp。发布说明的变更日志也记录了该特性的落地过程包括 #13557 BIP 174 PSBT Serializations and RPCs、#13721 Bugfixes for BIP 174 combining and deserialization、#13960 Fix PSBT deserialization of 0-input transactions 等条目。钱包升级非 HD 钱包升级与 HD 主密钥轮换非 HD 钱包升级为 HD 钱包自 Bitcoin Core 0.13.0 起支持创建 BIP 32 层次确定性HD钱包但旧的非 HD 钱包无法升级。0.17.0 起可用-upgradewallet命令行选项完成升级效果是密钥池keypool中的所有密钥被标记为已使用并生成新密钥池。执行此升级时必须创建新的备份。-upgradewallet还可用于从不拆分 HD 链所有密钥由m/0/0/i生成升级为拆分 HD 链接收密钥来自m/0/0/i找平密钥来自m/0/1/i。升级发生时密钥池中已有的密钥会保留在池中直到升级前的密钥全部用完——这是为了避免备份与降级时出现部分密钥来自找平密钥池的问题。用户可用newkeypoolRPC 把密钥池中所有密钥标记为已使用从而开始使用来自拆分 HD 链的新密钥池。HD 主密钥轮换新增 RPCsethdseed允许用户设置新的 HD 种子或指定自己的 HD 种子。设置新 HD 种子时必须创建新的备份。其他底层 RPC 与 API 变更0.17.0 的低层 RPC 变更要点完整继承发布说明新 RPCscantxoutset可扫描 UTXO 集中匹配特定输出描述符的条目详见输出描述符参考文档。它类似listununsafe的正确写法应为listunspent但不依赖钱包因此钱包可在编译期或运行期禁用。该调用是实验性的未来可能变更或移除。createrawtransaction的outputs参数现在接受数组或字典为兼容性保留客户端可指定交易输出的顺序。fundrawtransaction拒绝此前已废弃的reserveChangeKey选项。sendmany现在会打乱输出顺序以提升隐私任何依赖输出顺序的既有行为都不可再依赖。新 RPCtestmempoolaccept可在不实际加入内存池的情况下测试交易是否会被接受。JSON 交易分解新增weight字段提供交易的精确权重REST 的/rest/tx/与/rest/block/端点json 模式以及getblockverbosity2、listsinceblock、listtransactions、getrawtransactionRPC 均包含该字段。getrawmempool、getmempoolancestors、getmempooldescendants、getmempoolentry在 verbosity 为true时新增fees字段含ancestor、base、modified、descendant子字段以 BTC 计该字段废弃了fee、modifiedfee、ancestorfee、descendantfee等旧费用字段。新 RPCgetzmqnotifications返回当前激活的 ZMQ 通知信息。未指定任何-walletpath启动时getwalletinfo与listwallets返回的默认钱包名由wallet.dat变为空字符串指定了-wallet时行为不变任何钱包的名称即其path字符串。向getnewaddress、getrawchangeaddress、addmultisigaddress、fundrawtransaction传入空字符串作为address_type现在是错误此前会回退到默认地址类型传null或不设置参数仍使用默认地址类型。指向自己密钥的裸多签名bare multisig输出不再自动视为收款此类输出除非显式监控用importaddress或带 hex script 参数的importmulti否则不会出现在listtransactions、listunspent中也不计入余额signrawtransaction*对它们仍可用。getwalletinfo与getaddressinfo现在返回hdseedid值与命名不当的hdmasterkeyid值始终相同hdmasterkeyid将在 0.18 移除。validateaddress的部分功能被废弃并迁移到getaddressinfo客户端必须在升级到 0.18 前迁移。以下字段仅在带-deprecatedrpcvalidateaddress时展示ismine、iswatchonly、script、hex、pubkeys、sigsrequired、pubkey、addresses、embedded、iscompressed、account、timestamp、hdkeypath、hdmasterkeyid。signrawtransaction被废弃并将在 0.18 完全移除0.17 中使用时需以-deprecatedrpcsignrawtransaction重启 bitcoind。项目应迁移到signrawtransactionwithkey与signrawtransactionwithwallet。其他 API 变更dumpwallet输出中的inactivehdmaster属性已修正为inactivehdseed。日志变更日志时间戳格式改为 ISO 8601如2018-02-28T12:34:56Z。bitcoind 以-debug但无-daemon运行时默认向 stdout 输出日志设置-printtoconsole1不再隐式禁用 debug.log 文件日志禁用文件日志需显式设置-debuglogfile0。交易索引txindex变更交易索引现在独立于主节点流程构建意味着-txindex可以开关而无需完整 reindex。在已部分或完全同步且无 txindex的节点上以-txindex启动 bitcoind 时交易索引会在后台构建追上后立即可用。从启用-txindex切换到不启用时交易索引数据库不会被自动删除之后可随时重新启用而无需完整重新同步。当前仓库中独立索引基础设施位于src/index/目录通用索引基类见 src/index/base.h 与 src/index/base.cpp交易索引实现见 src/index/txindex.cpp 与 src/index/txindex.h发布说明变更日志中 #13033 Build txindex in parallel with validationjimpo与 #13243 Make reusable base class for auxiliary indicesjimpo正是这一架构的两块基石。挖矿相关变更挖矿者用于限制区块大小的-blockmaxsize选项在 0.15.1 中已被废弃0.17.0 中正式移除。矿工如需限制区块大小应改用-blockmaxweight选项限制区块权重。Python 支持与 GUI 变更所有测试文件与工具不再支持 Python 2。GUI 方面主选项卡的偏好设置中可限制区块存储空间Undoing 该设置需重新下载完整区块链该模式与-txindex、-rescan不兼容。变更日志速览按模块精选0.17.0 的完整变更日志很长此处按模块列出发布说明中的代表性条目便于检索共识与策略#122043fa24bb修复过于积极的 BIP30 旁路morcos#12568ed6ae80允许将 dustrelayfee 设为零luke-jr#13120ca2a233视为 SegWit 始终激活MarcoFalke#13096062738c修复MAX_STANDARD_TX_WEIGHT检查jl2012区块与交易处理#13033a07e8ca与校验并行构建 txindexjimpo#1256124133b1在ConnectBlock()中检查区块损坏sdaftuar#131910de7cc8针对 64 字节输入的 SSE4.1 与 AVX2 专用双 SHA256sipa#133863a3eabe基于 Intel SHA 扩展的 SHA256 实现sipa#117390a8b7b4从创世起强制SCRIPT_VERIFY_P2SH与SCRIPT_VERIFY_WITNESSsdaftuarP2P 协议与网络#131517f4db9a尽可能直接从磁盘提供区块laanwj#1313470d3541新增-enablebip61选项以配置 BIP61 通知的发送laanwj#9037a36834f为 addrman 增加先测后逐纪律EthanHeilman#1390748bf8ff为定位器locator引入最大尺寸gmaxwell钱包#10637e057589Murch 算法硬币选择achow101, Xekyo#128929b3370d引入钱包 label APIjnewbery#107404cfe17cloadwalletRPC——运行时加载钱包jnewbery#13058343d4e4createwalletRPC——运行时创建钱包jnewbery#13111000abbb新增unloadwalletRPCpromag#1168798bc27f外部钱包文件ryanofsky#12560e03c0db非 HD 钱包升级为 HD 的路径achow101#96626b6e854createwallet增加 disableprivatekeys 选项只读钱包的合理模式jonasschnelliRPC 与其他 API#102677b966d9新增-includeconf参数以包含外部配置文件kallewoof#1174218815b4新增testmempoolacceptMarcoFalke#121968fceae0新增scantxoutsetRPC 方法jonasschnelli#13557b654723BIP 174 PSBT 序列化与 RPCachow101#127913a8a4dc通过 RPC 暴露交易权重TheBlueMatt#124090cc45ed拒绝fundrawtransaction中已废弃的 reserveChangeKeyMarcoFalkeGUI#130436e249e4OptionsDialog 增加 prune 设置Sjors#1261025cf18fGUI 支持多钱包jonasschnelli#13458dc53f7f移除 Qt4 支持laanwj构建系统摘录Qt 升级到 5.9.6#12971、移除 Python2 依赖#13133、新增 RISC-V 支持#13543、macOS 要求 10.10#13617、RISC-V 与 aarch64 交叉编译支持等。其他工具与基础设施日志时间戳 ISO 8601#12567、未知配置项从报错改为警告并忽略#13799、循环依赖检测脚本#13228等。安全致谢与翻译0.17.0 还特别感谢了安全报告者awemanyCVE-2018-17144此前以匿名报告者身份致谢以及所有在 Transifex 上参与翻译的贡献者。完整的贡献者名单见 release-notes-0.17.0.md 文末。总结0.17.0 是 Bitcoin Core 钱包与工具链演进的关键节点它确立了多钱包运行时管理、PSBT 标准化交换格式、label 取代 account 的方向并把 txindex 重构为可独立开关的辅助索引。这些特性在后续版本中持续演化——在当前仓库中动态钱包 RPCsrc/wallet/rpc/wallet.cpp、PSBT 工具src/rpc/rawtransaction.cpp、src/psbt.cpp、-includeconf参数处理src/common/args.cpp与独立索引框架src/index/txindex.cpp均能找到 0.17.0 引入的架构痕迹。对于正在维护旧节点或研读版本演进的开发者的这份发布说明及其对应源码是理解 Bitcoin Core 从单钱包工具走向多钱包、标准化工具链的重要一手材料。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考