
Zcash 5.5.0 核心变更深度解析ZIP 317 手续费体系、RPC 演进与优先级机制移除【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcashZcash 5.5.0发布候选 rc3 版本是一版以经济模型与交易策略重构为核心的里程碑式更新它将 ZIP 317 定义的常规手续费conventional fee确立为钱包与矿工区块构造的默认策略同时系统性地移除了延续自比特币时代的币龄优先级coin age priority体系并大幅增强了getdeprecationinfo等 RPC 的运维可观测性。阅读本文后你将掌握新版手续费计算与区块模板构造算法的实现细节、受影响 RPC 的新参数与迁移方式以及废弃特性与端到端服务End-of-Service停摆机制的准确用法。本文内容以 release-notes-5.5.0-rc3.md 为主体并结合 src/zip317.h、src/zip317.cpp、src/deprecation.cpp、src/rpc/net.cpp、src/miner.cpp 等源码与测试用例交叉印证。RPC 变更总览5.5.0-rc3 对 RPC 层做了三类调整信息增强getdeprecationinfo、行为迁移异步化失败、以及功能移除estimatepriority。下面逐项展开。getdeprecationinfo新增端到端服务End-of-Service信息getdeprecationinfo是节点运维人员判断当前版本还能运行多久的关键 RPC本次更新包含三项变化返回更多废弃特性信息结果中新增deprecated_features当前已废弃但尚未禁用的特性数组与disabled_features已废弃且默认被禁用的特性数组。从源码看这两个数组分别来自DEFAULT_ALLOW_DEPRECATED与DEFAULT_DENY_DEPRECATED集合见 src/rpc/net.cpp 与 src/deprecation.cpp。新增end_of_service对象包含block_height端到端服务停摆高度与estimated_time预计停摆时刻Unix 秒。该时间仅是估算——它由当前区块高度线性外推得到而区块出块时间存在波动因此文档明确提示实际停摆时间可能相差数小时甚至数天该值仅供参考。其计算逻辑为当前时间 剩余区块数 × POST_BLOSSOM_POW_TARGET_SPACING见 src/deprecation.cpp 中的EstimatedNodeDeprecationTime。end_of_service对象旨在取代deprecationheight字段。可用性扩展到 testnet 与 regtest此前该方法仅对主网节点可用现在 testnet 与 regtest 节点也可以调用但由于这两个网络没有端到端服务停摆机制调用时不会返回end_of_service对象。对应判断逻辑为chainparams.NetworkIDString() main见 src/rpc/net.cpp。一个典型的主网调用结果形如{ version: 5050000, subversion: /MagicBean:5.5.0/, deprecationheight: 2400000, end_of_service: { block_height: 2400000, estimated_time: 1735689600 }, deprecated_features: [...], disabled_features: [...] }注意deprecationheight字段本身已被列入废弃名单见下文废弃特性一节当以-allowdeprecatednone运行时会从结果中消失但end_of_service对象始终存在。异步失败z_sendmany / z_shieldcoinbase / z_mergetoaddress这三个转账类 RPC 的部分失败场景从同步抛错迁移为异步返回错误。具体来说此前某些参数错误或资金不足会在调用时立即抛出异常现在则可能先返回一个opid操作 ID随后通过z_getoperationstatus/z_getoperationresult查询到失败状态。从源码结构与 changelogHave z_shieldcoinbase use WalletTxBuilder、Update z_mergetoaddress to use WalletTxBuilder可以推断这一变化源于钱包层引入了统一的WalletTxBuilder交易构建器见 src/wallet/rpcwallet.cpp 中三个 RPC 的实现交易构造、余额校验与找零地址选择等步骤被搬入异步操作管线。对调用方而言始终检查异步操作状态这一最佳实践变得比以往更重要——现在有更多失败会发生在该阶段。隐私策略Privacy Policy与透明找零的约束收紧AllowRevealedRecipients成为透明找零的硬性要求当钱包无法在不从透明池transparent pool选取资金的情况下构造交易时必须选择透明找零地址此时要求隐私策略包含AllowRevealedRecipients。实际影响是此类交易必须显式指定AllowFullyTransparent该策略包含所有 reveal 权限。这是对隐式削弱隐私策略的修复changelog 中对应的提交为 Fix weakened privacy policy for transparent change 与 RequireAllowRevealedRecipientsfor t-change。z_shieldcoinbase新增可选memo参数可将一段十六进制编码的 memo 写入新生成的屏蔽 note。该参数被解析为libzcash::Memo上限 512 字节见 src/wallet/rpcwallet.cpp 与ParseMemo实现。z_shieldcoinbase与z_mergetoaddress新增可选隐私策略参数z_shieldcoinbase的默认策略为AllowRevealedSendersz_mergetoaddress的默认策略为LegacyCompat。z_mergetoaddress能力扩展现在可以将资金合并到统一地址UAUnified Address并且在指定AllowRevealedAmounts的情况下可以跨屏蔽池转账例如 Sapling 与 Orchard 之间。参数签名相应扩展为z_mergetoaddress [fromaddress,...] toaddress (fee) (transparent_limit) (shielded_limit) (memo) (privacyPolicy)。被移除与降级的 RPCestimatepriority已移除该调用用于估算交易在目标块数内被打包所需的优先级。prioritisetransaction的priority_delta参数失效必须传入占位值0 或 null不再有任何实际效果。对应帮助文档明确写着Not supported, so must be zero or null见 src/rpc/mining.cpp。changelog 中 RPC/Mining: Restore API compatibility for prioritisetransaction 表明这是为了保持 API 兼容而保留的参数外壳。交易手续费选择全面切换到 ZIP 317 常规手续费这是本版本最核心的经济模型变更zcashd 钱包默认使用 ZIP 317 定义的常规手续费。该费用会作为默认值被采用除非RPC 调用中显式指定了fee参数或使用遗留交易创建 APIsendtoaddress、sendmany、fundrawtransaction且设置了-paytxfee选项。常规手续费的计算公式ZIP 317 的常规手续费由逻辑动作数logical action count决定其核心公式见 src/zip317.cppconventional fee MARGINAL_FEE × max(GRACE_ACTIONS, logicalActionCount)其中常量定义在 src/zip317.h常量值含义MARGINAL_FEE5000zatoshis每个逻辑动作的边际费用GRACE_ACTIONS2最小动作数即最低手续费为 10000 zatoshisP2PKH_STANDARD_INPUT_SIZE150 字节标准 P2PKH 输入大小用于折算逻辑动作P2PKH_STANDARD_OUTPUT_SIZE34 字节标准 P2PKH 输出大小用于折算逻辑动作逻辑动作数的计算src/zip317.cpp为logicalActionCount max( ceil(输入总序列化大小 / 150), ceil(输出总序列化大小 / 34) ) 2 × JoinSplit 数 max(Sapling Spend 数, Sapling Output 数) Orchard Action 数被移除的遗留选项-mintxfee此前指示遗留交易创建 API 将手续费抬高至该下限已移除。-sendfreetransactions此前允许小额且花费旧输入的交易使用零手续费已移除对应提交 wallet: Remove sendfree。这两个选项现在若被使用节点启动时会产生警告。建议使用这些选项的部署在升级前清理zcash.conf与启动脚本。区块模板构造基于 ZIP 317 的新算法5.5.0 采用 ZIP 317 推荐的区块模板构造算法见 ZIP 317 文档。该算法的核心变化是不再优待因花费更旧输入而被视为高优先级的交易。对应的实现位于 src/miner.cpp 的BlockAssembler中其中使用了GetUnpaidActionCount与GetWeightRatio两个新函数来计算交易的权重并控制未付动作unpaid action的数量。移除的配置项-blockprioritysize此前用于配置为高优先级交易保留的区块空间已移除非零值会在启动时告警。-blockminsize此前配置无论费用或优先级都强制填充的区块空间大小已移除使用会产生警告。新增的配置项-blockunpaidactionlimit-blockunpaidactionlimitn控制区块内接受未付动作的数量上限——即那些支付的费用低于 ZIP 317 常规手续费的交易。默认值为 50定义于 src/zip317.h 的DEFAULT_BLOCK_UNPAID_ACTION_LIMIT在 src/miner.cpp 中被读取并在 src/miner.cpp 的区块构造循环中用于约束累计未付动作数。该选项不能配置为负值否则节点会以-blockunpaidactionlimit cannot be configured with a negative value.拒绝启动见 src/init.cpp。注意区块级默认值 50 与内存池级的DEFAULT_TX_UNPAID_ACTION_LIMIT同样定义于 src/zip317.h相互独立后者约束单笔交易允许携带的未付动作数。交易中继策略取消免费交易内存池接受与交易中继中的免费交易free transaction宽限已被移除。所有交易必须至少支付最低中继阈值才能被接受与广播当前网络默认阈值如下费率下限100 zatoshis / 1000 bytes费率上限1000 zatoshis即单笔费用封顶这一阈值在 src/policy/policy.h 中有完整历史注释Zcash 启动时minRelayTxFee为 5000 zats/1000 bytesv1.0.3 降至 1000后又降至 100而单笔费用上限 1000 zatoshis 来自 ZIP 313。尘埃dust阈值则按该费率的 3 倍计算即 300 zats/1000 bytes 的表述方式changelog 中特别纠正了这一措辞我们以3 × 100 zats/1000 bytes表达而非300 zats/1000 bytes因为阈值总是先取整再乘以 3。单个节点可通过-minrelaytxfee调整该值但网络默认值在实践中必须被遵守否则交易将无法被其他节点中继。该策略仍在评审中未来可能进一步收紧即便收紧ZIP 317 常规手续费仍然足以满足内存池接受与中继的要求因为常规手续费下限 10000 zatoshis 远高于 1000 zatoshis 的中继上限。优先级估算体系的整体移除本次更新彻底移除了优先级priority概念涉及面包括estimatepriorityRPC已删除。fee_estimates.dat格式变更不再保存优先级估算数据文件会自动转换为新格式且新格式无法被旧版本软件读取——升级后如回滚到 5.5.0 之前的版本该文件将无法使用。-txconfirmtarget配置项已过时并被移除使用会产生警告。内存池 RPC 返回结果中的优先级信息、sendrawtransaction绕过minRelayTxFee的行为、基于币龄的优先级计算coin age priority等均被清理对应 changelog 中的一系列提交[rpc] Remove priority information from mempool RPC calls、[cleanup] Remove coin age priority completely 等。调试方面-printpriority输出被重写为记录修改后费用modified fee、常规手续费、交易大小、逻辑动作数与未付动作数以配合新的区块构造算法弱化对费率的强调。废弃特性Deprecations与端到端服务管理本版本废弃了以下特性但默认仍可用废弃标记内容deprecationinfo_deprecationheightgetdeprecationinfo中的deprecationheight字段已被end_of_service对象取代管理方式立即禁用全部已废弃特性设置-allowdeprecatednone。注意该值不可与其他值混用否则节点会报错 When using -allowdeprecatednone no other values may be provided见 src/deprecation.cpp。时间线本版本发布18 周后这些特性将默认禁用届时需要显式传入对应标记才能继续使用即-allowdeprecateddeprecationinfo_deprecationheight。从 src/deprecation.cpp 的LoadAllowedDeprecatedFeatures可以看到-allowdeprecated是一个可重复参数GetMultiArg节点启动时会将其与DEFAULT_ALLOW_DEPRECATED默认允许的废弃特性和DEFAULT_DENY_DEPRECATED默认禁用的废弃特性两个集合比对未识别的值会触发启动错误并列出所有合法取值。端到端服务停摆End-of-Service Haltgetdeprecationinfo中end_of_service对象的存在与节点自身的强制停摆机制直接对应。EnforceNodeDeprecationsrc/deprecation.cpp的行为如下仅对主网生效testnet/regtest 直接返回当到达DEPRECATION_HEIGHT时节点记录日志并触发AlertNotify与 UI 弹窗随后调用StartShutdown()自动停止当距离停摆高度 ≤DEPRECATION_WARN_LIMIT时会先输出警告消息提示升级。因此运维团队应定期调用getdeprecationinfo并结合estimated_time即便只是近似值制定升级计划避免节点在停摆高度处被强制下线。运维迁移清单综合以上变更升级到 5.5.0-rc3 时建议按如下清单核对清理配置从zcash.conf移除或确认不再使用-mintxfee、-sendfreetransactions、-blockprioritysize、-blockminsize、-txconfirmtarget按需新增-blockunpaidactionlimit默认 50。检查 RPC 脚本删除对estimatepriority的调用将prioritisetransaction的priority_delta改为 0 或 null。适配转账 RPC 新参数z_shieldcoinbase的 memo 与隐私策略参数、z_mergetoaddress的跨池合并与 UA 目标涉及透明找零的交易需指定AllowFullyTransparent。强化异步处理对z_sendmany、z_shieldcoinbase、z_mergetoaddress统一通过z_getoperationstatus/z_getoperationresult检查结果不再假设同步返回错误。规划升级窗口fee_estimates.dat新格式不可被旧版本读取回滚前需备份同时关注end_of_service高度在停摆前完成版本升级。仓库中的 RPC 测试如 qa/rpc-tests/prioritisetransaction.py、qa/rpc-tests/wallet_z_sendmany.py、qa/rpc-tests/mergetoaddress_helper.py与smoke_tests.pychangelog 显示其已针对 5.5.0 更新为使用allowdeprecated与更严格的隐私策略覆盖了上述大部分行为可作为验证节点行为的参考。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考