ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Zcash zcashd 特性弃用流程全解析:`-allowdeprecated` 三阶段机制与源码实现

Zcash zcashd 特性弃用流程全解析:`-allowdeprecated` 三阶段机制与源码实现 Zcash zcashd 特性弃用流程全解析-allowdeprecated三阶段机制与源码实现【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash本文以 zcashd 的《Deprecation Procedure》开发文档为主线系统讲解zcashd如何通过-allowdeprecatedfeature参数对已弃用特性进行显式启停深入剖析弃用的三阶段流程、时间线约束、当前弃用特性清单并结合 src/deprecation.h、src/deprecation.cpp 及 src/gtest/test_deprecation.cpp 等源码与测试还原从宣布弃用到彻底移除的完整工程实践。读完本文你将掌握如何识别、启用、禁用 zcashd 中处于弃用期的功能并理解节点级 End-of-Service 强制停机机制的底层原理。重要背景提示zcashd本身已被官方宣布弃用且不再支持 NU6.3。其自动 End-of-Support 停机已于 2026 年 7 月 18 日在区块高度 3417100 触发所有zcashd6.20.0 节点现已全部停机NU6.3 主网激活大约在 7 月 28 日之后。本文所介绍的弃用机制正是这一节点级强制退役流程赖以运行的实现基础。一、为什么需要特性弃用流程为了支持zcashd的持续演进当某些功能已被更新的实现取代或不再有用时它们会被定期弃用并最终移除。这种先弃用、后移除的渐进式策略避免了功能被突然删除给用户和下游应用带来的破坏性影响。弃用机制的核心是一个统一的命令行参数-allowdeprecatedfeature通过该参数处于弃用期的特性可以被显式地开启或关闭。zcashd内部在 src/deprecation.h 中维护了两套弃用特性标志的默认集合集合含义代码位置DEFAULT_ALLOW_DEPRECATED已弃用但默认仍然可用的特性集合无需额外指定-allowdeprecated即可使用src/deprecation.hDEFAULT_DENY_DEPRECATED已弃用且默认被禁用的特性集合必须显式通过-allowdeprecated才能重新启用src/deprecation.h从当前源码看这两套集合的内容如下DEFAULT_ALLOW_DEPRECATED节点级createrawtransaction、signrawtransaction、getnetworkhashps钱包级#ifdef ENABLE_WALLETz_gettotalbalance、fundrawtransaction、keypoolrefill、settxfee。DEFAULT_DENY_DEPRECATED节点级gbt_oldhashes、deprecationinfo_deprecationheight、addrtype钱包级getnewaddress、getrawchangeaddress、z_getnewaddress、z_getbalance、z_listaddresses、legacy_privacy、wallettxvjoinsplit。每个特性对应一个全局布尔标志如fEnableCreateRawTransaction、fEnableGetNewAddress这些标志在 src/deprecation.cpp 中默认初始化为true随后由LoadAllowedDeprecatedFeatures()根据命令行配置统一覆盖。二、三阶段弃用流程详解特性弃用遵循一个严格的 3 步流程见 doc/book/src/dev/deprecation.mdStage 1宣布弃用仍默认可用为特性选定一个弃用标志并加入DEFAULT_ALLOW_DEPRECATED。弃用事实会在发布说明release notes中宣布取代该特性的新功能如有也会一并说明。同时面向用户的 API 文档和 CLI 帮助文本中会加入DEPRECATED字样。在此阶段特性照常工作用户可通过-allowdeprecatednone主动禁用。Stage 2默认禁用将弃用标志从DEFAULT_ALLOW_DEPRECATED移除加入DEFAULT_DENY_DEPRECATED。特性默认不可用但可通过-allowdeprecatedfeature重新启用。Stage 3彻底移除特性被完整删除其弃用标志也随之移除。弃用时间线约束进入 Stage 1 的特性至少在 3 个更新了 minor 版本号的发布之后才会被默认禁用特性的彻底移除必须在累计经历6 个 minor 版本更新之后zcashd的发布计划为每 6 周产出一个更新 minor 版本的发布因此弃用特性默认可用期约为18 周从首次弃用算起预计不早于 36 周后移除。每个新弃用特性的时间线都应记录在 doc/book/src/user/deprecation.md 中实际弃用/移除时间也可能视用户需求逐案延长。三、当前弃用特性清单截至本文档维护的版本用户文档 doc/book/src/user/deprecation.md 记录了完整的当前弃用清单下面完整列出。Stage 1已弃用但默认可用以下特性已弃用但仍默认启用。启动节点时在 CLI 参数中加入-allowdeprecatednone或在zcash.conf中加入allowdeprecatednone行即可禁用它们。feature弃用起始版本功能说明z_gettotalbalance5.0.0z_gettotalbalanceRPC 方法createrawtransaction6.2.0createrawtransactionRPC 方法fundrawtransaction6.2.0fundrawtransactionRPC 方法signrawtransaction6.2.0signrawtransactionsRPC 方法keypoolrefill6.2.0keypoolrefillRPC 方法settxfee6.2.0settxfeeRPC 方法其中createrawtransaction、fundrawtransaction、signrawtransaction三个 RPC 方法计划由 Zallet 中基于 PCZT 的功能取代。此外实验性 RPC 方法z_getpaymentdisclosure与z_validatepaymentdisclosure仅支持 Sprout同样处于弃用状态。Stage 2默认禁用需显式启用表中的每个特性都可通过在 CLI 参数中添加-allowdeprecatedfeature或在zcash.conf中添加allowdeprecatedfeature行来重新启用。feature弃用起始版本默认禁用版本功能说明legacy_privacy5.0.05.4.0z_sendmany默认的 legacy 隐私策略已被FullPrivacy指令取代getnewaddress5.0.05.4.0getnewaddressRPC 方法getrawchangeaddress5.0.05.4.0getrawchangeaddressRPC 方法z_getnewaddress5.0.05.4.0z_getnewaddressRPC 方法z_listaddresses5.0.05.4.0z_listaddressesRPC 方法addrtype5.0.05.4.0*返回地址元数据的 RPC 结果中的type属性已被弃用建议改用pool或address_type属性wallettxvjoinsplit5.1.05.4.0gettransactionRPC 返回的vjoinsplit属性z_getbalance5.0.06.2.0z_getbalanceRPC 方法gbt_oldhashes5.4.06.2.0getblocktemplate输出中的finalsaplingroothash、lightclientroothash、blockcommitmentshash字段已由defaultroots字段取代deprecationinfo_deprecationheight5.5.06.2.0getdeprecationinfoRPC 返回的deprecationheight字段已由end_of_service对象取代getnetworkhashps6.2.06.2.0getnetworkhashpsRPC 方法改用getnetworksolps*自 6.2.0 起即使zcashd在未编译ENABLE_WALLET标志的情况下addrtype也会默认禁用。四、实战操作如何控制弃用特性方式一命令行参数zcashd -allowdeprecatednone # 禁用全部 Stage 1 弃用特性 zcashd -allowdeprecatedgetnewaddress # 重新启用某个 Stage 2 特性 zcashd -allowdeprecatedz_getbalance -allowdeprecatedz_listaddresses # 同时启用多个特性方式二配置文件zcash.conf在配置文件中以每行一个参数的形式书写效果与命令行等价# 禁用全部 Stage 1 弃用特性 allowdeprecatednone # 或显式重新启用指定特性 allowdeprecatedgetnewaddress allowdeprecatedz_getbalance参数校验与互斥规则LoadAllowedDeprecatedFeatures()src/deprecation.cpp负责解析并校验这些参数其核心逻辑为通过GetMultiArg(-allowdeprecated)收集所有参数值因此允许多次指定若包含none不允许再提供其他任何值否则返回错误When using -allowdeprecatednone no other values may be provided for -allowdeprecated.none会使集合清空相当于禁用全部 Stage 1 特性否则自动将DEFAULT_ALLOW_DEPRECATED中的特性合并进允许集合保证 Stage 1 特性默认可用逐个校验集合中的每个值是否属于DEFAULT_ALLOW_DEPRECATED或DEFAULT_DENY_DEPRECATED出现未知值时返回错误并列出所有合法取值错误消息由GetAllowableDeprecatedFeatures()生成src/deprecation.cpp校验通过后为每个fEnable*全局标志赋值。该函数在启动早期被调用失败时节点拒绝启动见 src/bitcoind.cpp。-allowdeprecated的合法取值集合会直接出现在zcashd --help的帮助文本中src/init.cppnone加上述两套集合的全部特性名。弃用 RPC 的帮助文本样式被弃用 RPC 的帮助文本由Deprecated(enabled, method, instead)函数生成src/deprecation.cpp。当特性被禁用时调用对应 RPC 会看到类似如下的错误提示并附上重新启用的命令z_getnewaddress is DISABLED and will be removed in a future release. Please use z_getnewaccount and z_getaddressforaccount instead. You can restart the node with -allowdeprecatedz_getnewaddress to re-enable this method during its deprecation period.以z_getnewaddress为例其实现src/wallet/rpcwallet.cpp在入口处即检查fEnableZGetNewAddress被禁用时直接抛出上述错误启用时则正常返回新的 Sapling 地址。同样的模式贯穿于getnewaddress、getrawchangeaddress、z_getbalance、z_listaddresses、z_gettotalbalance、keypoolrefill、settxfee、fundrawtransaction、createrawtransaction、signrawtransactionsrc/rpc/rawtransaction.cpp、src/rpc/rawtransaction.cpp以及getnetworkhashpssrc/rpc/mining.cpp等 RPC。五、查询弃用状态getdeprecationinfoRPCgetdeprecationinfoRPCsrc/rpc/net.cpp允许用户实时查询当前版本与弃用相关的全部状态其输出结构为{ version: 6200000, subversion: /MagicBean:x.y.z/, deprecationheight: 3417100, // 仅 mainnet受 deprecationinfo_deprecationheight 标志控制 end_of_service: { // 仅 mainnet/testnet 之外的节点不含此对象 block_height: 3417100, estimated_time: 1780000000 // 秒级 epoch 时间仅作参考 }, deprecated_features: [createrawtransaction, signrawtransaction, ...], disabled_features: [gbt_oldhashes, getnewaddress, ...] }deprecated_features直接来自DEFAULT_ALLOW_DEPRECATEDStage 1 特性disabled_features直接来自DEFAULT_DENY_DEPRECATEDStage 2 特性其帮助文本提示可用-allowdeprecated重新启用当deprecationinfo_deprecationheight被禁用时deprecationheight字段不再输出仅保留end_of_service对象含block_height与estimated_time。estimated_time由EstimatedNodeDeprecationTime()src/deprecation.cpp基于当前高度与剩余区块数估算得出由于区块时间存在波动该值可能偏差数小时乃至数天仅作参考。六、节点级弃用End-of-Service 强制停机机制除了特性级弃用zcashd还有一套节点级弃用机制由 src/deprecation.h 中的常量驱动常量值含义APPROX_RELEASE_HEIGHT3360652本版本估算的发布区块高度RELEASE_TO_DEPRECATION_WEEKS7发布后到弃用停机之间的周数EXPECTED_BLOCKS_PER_HOUR48基于POST_BLOSSOM_POW_TARGET_SPACING推导由static_assert保证为 48DEPRECATION_HEIGHT3417100自动停机高度本仓库 6.20.0 版本DEPRECATION_WARN_LIMIT16128停机前预警窗口对应的区块数14 天 × 24 小时 × 48 区块/小时EnforceNodeDeprecation()src/deprecation.cpp在每个新区块到达src/main.cpp及节点启动时src/main.cpp被调用行为如下仅 mainnet 生效testnet 与 regtest 直接返回不做任何处理到达或超过DEPRECATION_HEIGHT记录错误日志、调用-alertnotify若配置、弹出错误对话框并调用StartShutdown()强制停机消息为This version has been deprecated as of block height %d. You should upgrade to the latest version of Zcash.进入 14 天预警窗口剩余区块数 ≤DEPRECATION_WARN_LIMIT发出警告消息This version will be deprecated at block height %d, and will automatically shut down...但不停机。该警告在进入窗口的临界点或节点启动时forceLoggingtrue各记录一次避免刷屏。src/gtest/test_deprecation.cpp中的测试用例完整覆盖了这些行为NonDeprecatedNodeKeepsRunning窗口外不停机、NodeNearDeprecationIsWarned进入窗口发出 MSG_WARNING、NodeNearDeprecationWarningIsNotDuplicated警告不重复、DeprecatedNodeShutsDown到达高度触发停机、DeprecatedNodeIgnoredOnRegtest/DeprecatedNodeIgnoredOnTestnet非 mainnet 忽略以及AlertNotify验证-alertnotify命令被正确触发且消息经过安全字符过滤。七、与 End-of-Life 的关系弃用机制的最终形态本文档所在仓库中zcashd的弃用流程最终走向了整体弃用据 doc/book/src/user/end-of-life.md 记载由于 2026 年 6 月 1 日披露的 Orchard 漏洞及其 C 代码库带来的风险zcashd被强制加速弃用。其 6.20.0 版本的DEPRECATION_HEIGHT3417100已于 2026 年 7 月 18 日被主网达到所有未升级节点按上述机制自动停机且拒绝重启从而确保在 7 月 28 日前后 NU6.3 主网激活前网络已完全由 Zebra 节点构成。这正是本文所介绍的节点级弃用机制在真实网络中的一次完整执行。需要钱包功能的用户应尽快将wallet.dat迁移至 Zallet不需要钱包的节点用户则应迁移至 Zebra。这也意味着上文提到的所有-allowdeprecated特性启停操作仅适用于 6.20.0 及其之前的zcashd版本。总结zcashd的弃用流程是一套严谨的工程化机制通过DEFAULT_ALLOW_DEPRECATED/DEFAULT_DENY_DEPRECATED两套默认集合与-allowdeprecated参数的配合实现了宣布弃用 → 默认禁用 → 彻底移除的三阶段过渡通过3 个 minor 版本后禁用、6 个 minor 版本后移除的时间线约束为下游用户留出了充足的迁移窗口而EnforceNodeDeprecation与DEPRECATION_HEIGHT则保证了过期节点在指定高度被强制停机。对于运行旧版zcashd的节点理解这套机制是判断哪些 RPC 还能用、何时会被移除、如何临时重开的关键而在当前背景下更直接的意义是帮助运维人员识别zcashd的 End-of-Service 状态并完成向 Zebra / Zallet 的迁移。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表