Zcash 2.0.5-rc1 版本解析:Sprout 到 Sapling 自动迁移、ZIP 209 与区块浏览器索引

发布时间:2026/9/18 22:04:36
Zcash 2.0.5-rc1 版本解析:Sprout 到 Sapling 自动迁移、ZIP 209 与区块浏览器索引 Zcash 2.0.5-rc1 版本解析Sprout 到 Sapling 自动迁移、ZIP 209 与区块浏览器索引【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash导读本文基于 Zcash 全节点实现zcashd的doc/release-notes/release-notes-2.0.5-rc1.md版本变更日志深入解析 2.0.5-rc1 版本带来的核心功能变化。该版本是 Zcash 发展历程中的关键节点它首次将Sprout 到 Sapling 资金自动迁移作为完整的 RPC 功能落地在主网启用了ZIP 209turnstile 检查与对应的 Sprout 池余额 fallback 机制并为 Bitcore Insight 风格区块浏览器引入了-addressindex、-spentindex、-timestampindex三个索引选项。读完本文你将掌握迁移功能的配置与查询命令、开发者实验开关的用法以及这些特性在源码中的实现位置与调用关系。版本背景与变更总览2.0.5-rc1 是 Zcash 2.0.x 系列的一个候选发布版本其变更日志按贡献者罗列了共 40 余个提交。按技术主题归类主要变更集中在以下四个方面主题主要贡献者变更要点Sprout 到 Sapling 自动迁移Eirik0新增z_setmigration、z_getmigrationstatusRPC迁移逻辑移至 ChainTip新增-migrationdestaddress配置项ZIP 209 与开发者实验开关Simon Liu主网启用 ZIP 209 并设置 fallback Sprout 池余额新增-developersetpoolsizezero实验功能区块浏览器索引Larry Ruane新增-addressindex、-spentindex、-timestampindex修复 enable-debug 构建问题基础设施与构建Jack Grigg 等TransactionBuilder 增加 Sprout 支持、Blossom 升级、HD seed 修复、Boost 1.69 → 1.70下文将围绕这四个主题逐一展开并结合仓库源码给出实现层面的佐证。Sprout 到 Sapling 自动迁移完整的 RPC 功能落地Sprout 是 Zcash 第一代屏蔽交易协议其密码学原语基于 SHA-256 压缩函数的零知识证明相对脆弱Sapling 则引入了更高效的证明系统。为了让仍持有 Sprout 资金的用户平滑过渡Zcash 设计了自动迁移机制当区块链高度满足特定条件时节点会自动构造将 Sprout 资金转入 Sapling 地址的交易。2.0.5-rc1 通过多个提交完善了这一机制。迁移开关z_setmigration变更日志中的 Add rpc to enable and disable Sprout to Sapling migration 对应了钱包 RPCz_setmigration。其实现位于 src/wallet/rpcwallet.cppUniValue z_setmigration(const UniValue params, bool fHelp) { ... z_setmigration enabled\n When enabled the Sprout to Sapling migration will attempt to migrate all funds from this wallets\n Sprout addresses to either the address for Sapling account 0 or the address specified by the parameter\n -migrationdestaddress.\n ... LOCK(pwalletMain-cs_wallet); pwalletMain-fSaplingMigrationEnabled params[0].get_bool(); return NullUniValue; }该 RPC 只接受一个布尔参数enabled设置为true时启用迁移false时关闭。调用后会写入钱包对象的fSaplingMigrationEnabled字段声明于 src/wallet/wallet.h。值得注意的是该开关也可以通过配置文件中的-migration布尔参数在启动时直接设定见 src/wallet/wallet.cpp。对参数类型的校验在测试中有明确覆盖src/wallet/test/rpc_wallet_tests.cpp 验证了z_setmigration true/false正常返回、缺少参数抛runtime_error、非布尔字符串如nonboolean、1也会被拒绝。迁移状态查询z_getmigrationstatus变更日志中的 Add rpc to get Sprout to Sapling migration status 对应z_getmigrationstatus实现同样位于 src/wallet/rpcwallet.cpp。其返回结构完整定义在帮助文本中{ enabled: true|false, (boolean) 迁移是否启用 destination_address: zaddr, (string) 接收 Sprout 资金的 Sapling 地址 unmigrated_amount: nnn.n, (numeric) 未迁移的总金额ZEC unfinalized_migrated_amount: nnn.n, (numeric) 未最终确认的已迁移金额 finalized_migrated_amount: nnn.n, (numeric) 已最终确认的已迁移金额 finalized_migration_transactions: nnn, (numeric) 涉及本钱包的已最终确认迁移交易数 time_started: ttt, (numeric, 可选) 首笔迁移交易的区块时间Unix 时间戳 migration_txids: [txids] (json 数组) 所有涉及本钱包的迁移交易 ID }实现细节可以印证变更日志中的多项提交Do not look at vin/vout when determining migration txs and other cleanup判定一笔交易是否为迁移交易只看其是否满足三个条件——包含一个或多个vpub_new非零的 Sprout JoinSplit、不含 Sapling Spends、含一个或多个 Sapling Outputssrc/wallet/rpcwallet.cpp。Calculate the number of confimations in the canonical way交易最终确认的标准是主链深度达到 10 个确认tx.GetDepthInMainChain(asOfHeight) 10。use -valueBalance rather than vpub_new to calculate migrated amount已迁移金额通过GetValueBalanceSapling()计算而非直接累加vpub_new。Refactor wait_and_assert_operationid_status to allow returning the result与Check for full failure message in test case则服务于测试框架对迁移流程的断言。此外unmigrated_amount的计算会包含锁定中或仅存在于 mempool 的 Sprout 笔记GetFilteredNotes调用传入0, INT_MAX深度范围见 src/wallet/rpcwallet.cpp确保查询结果反映真实可迁移余额。迁移调度与金额选择算法迁移并不是立即一次性完成的而是遵循一个节流策略这在z_setmigration的帮助文本中有明确描述src/wallet/rpcwallet.cpp每次区块链高度达到99 modulo 100时触发一轮迁移每轮最多构造 5 笔交易交易金额按照 ZIP 308 规定的随机分布选取迁移在钱包 Sprout 余额低于 0.01 ZECCENT时结束。金额选择算法实现在 src/wallet/asyncrpcoperation_saplingmigration.cpp指数在 6~8慢档或 8~10快档当可用资金超过 1 ZEC 时之间均匀选取尾数在 1~99 之间均匀选取最终金额为mantissa * 10^exponentzatoshi若超过剩余可迁移金额则重新取样。迁移目标地址与 HD Seed迁移目标地址的确定逻辑src/wallet/asyncrpcoperation_saplingmigration.cpp为若启动参数-migrationdestaddresszaddr已设置则使用该 Sapling 地址该参数的合法性在 src/wallet/wallet.cpp 启动时校验非法地址会直接报错退出否则使用钱包为 Sapling 账户 0 派生的默认地址派生路径为m/32/coin_type/0x7FFFFFFF/0。变更日志中的 Create method for getting HD seed in RPCs 与 Do not throw an exception if HD Seed is not found when exporting wallet 两项提交为上述地址派生GetHDSeedForRPC与钱包导出流程提供了基础设施。ZIP 209 与开发者实验功能 -developersetpoolsizezeroZIP 209 定义了屏蔽池的 turnstile 检查规则防止资金在屏蔽池间流转时出现守恒违规。2.0.5-rc1 中的 Enable ZIP209 on mainnet and set fallback Sprout pool balance 提交标志着该共识规则正式在主网生效。主网 fallback 池余额由于部分节点未在监控功能引入时执行 reindex无法自行计算历史 Sprout 池余额因此代码中硬编码了一个 fallback 值见 src/chainparams.cpp// Hardcoded fallback value for the Sprout shielded value pool balance // for nodes that have not reindexed since the introduction of monitoring // in #2795. nSproutValuePoolCheckpointHeight 520633; nSproutValuePoolCheckpointBalance 22145062442933; fZIP209Enabled true; hashSproutValuePoolCheckpointBlock uint256S(0000000000c7b46b6bc04b4cbf87d8bb08722aebd51232619b214f7273f8460e);即以 520633 高度的区块作为 Sprout 池余额检查点fallback 余额为 22145062442933 zatoshi同时将fZIP209Enabled置为truetestnet 的对应配置见同文件 src/chainparams.cpp。开发者实验开关 -developersetpoolsizezero对于 regtest/testnet 测试而言严格启用 turnstile 检查会阻碍构造违反守恒规则的测试链。为此 2.0.5-rc1 引入了实验功能-developersetpoolsizezero变更日志 Add testnet and regtest experimental feature。该开关在 src/experimental_features.cpp 中解析fExperimentalDeveloperSetPoolSizeZero GetBoolArg(-developersetpoolsizezero, false);在 src/chainparams.cpp 中当网络为 regtest 且设置了该参数时会调用SetRegTestZIP209Enabled()启用 ZIP 209从而允许开发者/测试用例验证 turnstile 违规场景。chainparams.h的注释src/chainparams.h明确指出主网和 testnet 上 ZIP 209 是始终强制执行的共识规则而 regtest 默认关闭只有设置了-developersetpoolsizezero才启用。从源码结构看-developersetpoolsizezero的实验性还体现在 src/main.cpp 与 src/main.cpp 中启用该选项时共识校验不再依赖 fallback 余额相关分支用于构造并验证 turnstile 违例场景。需要特别说明的是该参数当前仍需配合-experimentalfeatures使用experimentalfeatures列表注册见 src/experimental_features.cpp且仅面向开发与测试用途。面向区块浏览器的索引选项-addressindex / -spentindex / -timestampindex变更日志中 Larry Ruane 的三条提交add -addressindex changes、add -spentindex changes、add -timestampindex for bitcore insight block explorer为 zcashd 引入了三个与 Bitcore Insight 区块浏览器兼容的索引开关。这些索引允许节点额外维护地址索引-addressindex记录每个地址相关的交易支撑getaddresstxids等查询花费索引-spentindex记录 UTXO 花费关系支撑getspentinfo查询时间戳索引-timestampindex按时间范围检索交易支撑按时间过滤的交易查询。对应的索引接口声明可以在 src/addressindex.h、src/spentindex.h、src/timestampindex.h 中找到。从代码结构可以推断这些索引在启动时通过布尔参数启用启用后会在交易写入区块数据库时同步维护索引表供 RPC 层读取。同样属于该版本相关工作的还有 Adding addressindex.h to Makefile.am 提交src/Makefile.am确保头文件被正确纳入构建。其余关键变更与修复除上述三大主题外2.0.5-rc1 还包含一批值得关注的改动TransactionBuilder 增加 Sprout 支持Jack Grigg扩展 src/transaction_builder.cpp使统一的交易构造器可以同时处理 Sprout 与 Sapling 屏蔽输入输出为迁移等跨池交易提供基础。Blossom 升级注册Add Blossom to upgrade list 将 Blossom 网络升级加入共识升级列表对应consensus/upgrades相关配置为后续区块时间缩短与目标出块间隔调整铺路。HD seed 生成修复Jack Grigginit: Fix new HD seed generation for previously-encrypted wallets 修复了已加密钱包首次解锁时可能无法正确生成新 HD seed 的问题。依赖与构建更新Boost 从 v1.69.0 升级到 v1.70.0对应 GitHub issue #3947修复-enable-debug构建下DB_COINS未定义的问题depends 系统为 aarch64 Linux 添加 rust-std 哈希、bdb 以--disable-atomics编译libsnark 的 OPTFLAGS 改为根据目标架构自动推断-march而非硬编码。测试与文档为IsPayToPublicKeyHash方法新增单元测试迁移测试拆分为多个部分并支持通过参数与默认 Sapling 地址两种方式运行文档清理与拼写修正。测试覆盖与 QA 实践变更日志体现出该版本对测试的重视。除IsPayToPublicKeyHash单元测试外迁移 RPC 的参数校验测试src/wallet/test/rpc_wallet_tests.cpp覆盖了合法布尔值、缺失参数与非布尔输入变更日志 Test migration using both the parameter and the default Sapling address 表明迁移功能在测试中同时验证了-migrationdestaddress参数路径与默认地址路径Split test in to multiple parts 将原先过大的迁移测试拆分为多个独立用例降低单用例失败时的定位成本Add qa test for experimental feature: -developersetpoolsizezero 为开发者实验开关补充了 Python 层 QA 测试。这些测试文件如 src/wallet/test/rpc_wallet_tests.cpp 与 qa/rpc-tests 目录是理解迁移与索引功能行为边界的最佳入口。如何验证本文所述功能若要实际体验 2.0.5-rc1 及后续版本中的这些功能可以在 regtest 模式下按以下方式操作启用迁移zcash-cli z_setmigration true zcash-cli z_getmigrationstatus如需指定目标地址启动节点时添加-migrationdestaddresssapling_zaddr或在配置文件中设置migrationdestaddresssapling_zaddr、migration1。启用开发者实验开关仅 regtest/testnet需同时开启实验功能zcashd -regtest -experimentalfeatures1 -developersetpoolsizezero1启用区块浏览器索引zcashd -addressindex1 -spentindex1 -timestampindex1注意开启索引后首次同步会额外消耗磁盘空间并可能延长启动/同步时间。需要说明的是当前仓库更高版本中相关 RPC 与参数仍然保留但部分默认值与共识参数会随网络升级演进实操时请以当前版本zcashd --help与文档为准。总结Zcash 2.0.5-rc1 是一个承上启下的版本它把 Sprout 到 Sapling 自动迁移从构想变成了一套完整可用的 RPC 体系z_setmigration/z_getmigrationstatus-migrationdestaddress在主网落地下沉了 ZIP 209 共识检查并为开发者提供了-developersetpoolsizezero这一测试利器同时通过地址/花费/时间戳三类索引增强了节点对区块浏览器的支撑能力。围绕这些变更本文给出的源码路径——src/wallet/rpcwallet.cpp、src/wallet/asyncrpcoperation_saplingmigration.cpp、src/chainparams.cpp、src/experimental_features.cpp——可以继续作为深入研读该版本实现细节的入口。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询