尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Zcash 4.2.0 技术解析:ed25519-zebra 共识签名、ZIP-313 默认费率与 getblocktemplate 挖矿优化
Zcash 4.2.0 技术解析ed25519-zebra 共识签名、ZIP-313 默认费率与 getblocktemplate 挖矿优化【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash本文围绕 Zcash 4.2.0 版本的核心变更见 doc/release-notes/release-notes-4.2.0.md展开共识层 Ed25519 签名校验正式切换到 Rust 实现 ed25519-zebra、按 ZIP-313 将默认交易费率降至 0.00001 ZEC、getblocktemplate 通过预计算模板大幅缩短矿工等待时间以及 RPC 测试框架全面迁移到 Python 实现。读完本文你将掌握这些变更背后的共识规则细节、源码调用链与配套测试/构建验证方法可直接用于节点运维、矿池对接与二次开发场景。一、版本定位4.2.0 在 Zcash 发展时间线中的位置Zcash 4.2.0 是一个收尾型 性能型版本。它在 Canopy 升级ZIP-2512020 年 11 月激活之后发布主要做三件事把此前由 libsodium 承担的 Ed25519 共识签名校验正式替换为 Rust 实现、落实 ZIP-313 的低费率规则、优化矿工出块模板生成路径同时把 RPC 测试体系与上游 Bitcoin 对齐。该版本的变更日志共收录了约 40 位贡献者的提交其中 Jack Grigg、Marco Falke、Kris Nuttycombe、Daira Hopwood 等人的工作占比最高覆盖共识、钱包、网络、构建与测试框架多个层面。二、共识签名校验切换到 ed25519-zebra2.1 变更动机从 libsodium 到 Rust4.2.0 最核心的共识层变更是移除 zcashd 对 libsodium 中 ed25519 签名校验的依赖改用 Rust 实现的 ed25519-zebraed25519-zebra 4。release notes 明确指出ed25519-zebra 自 Canopy 升级以来就一直用于 Zcash 的签名验证路径4.2.0 只是把它正式确立为唯一实现从而彻底解除对 libsodium 的依赖。这一演进的源头可以追溯到更早的版本4.0.0 的发布说明中已经出现 Replace libsodiums crypto_sign with ed25519-zebra 的提交见 doc/release-notes/release-notes-4.0.0.md3.1.0 系列则完成了 ed25519-zebra 对 ZIP-215 规则的适配并引入 vendored 依赖管理。到 4.2.0这条替换链路最终闭合在共识校验主路径上。2.2 ZIP-215 共识属性为什么不能直接用 RFC 8032Zcash 的 Ed25519 校验规则并非标准的 RFC 8032而是由协议规范 §5.4.5 与 ZIP-215 单独定义的。在 src/rust/src/ed25519.rs 的文档注释中共识属性被完整列出验证公钥A_bytes与签名中的R_bytes必须是 twisted Edwards 形式 Curve25519 上点的编码且必须接受非规范编码non-canonical encodingss_bytes必须表示小于曲线素数阶子群阶l的整数必须满足验证方程[8][s]B [8]R [8][k]A即强制进行余因子 8 的协同乘运算禁止使用 RFC 8032 允许的替代方程[s]B R [k]A。这套规则正是 ed25519-zebra 与通用 Ed25519 库的关键差异点也是当年 libsodium 的crypto_sign校验行为与 Zcash 共识存在分歧、最终被替换的根本原因背景可参考 release notes 中引用的 hdevalence 博客文章。2.3 源码调用链JoinSplit 签名的验证路径ed25519-zebra 通过 cxx FFI 桥接暴露给 C 侧三个函数generate_keypair、sign、verify见 src/rust/src/ed25519.rs。FFI 层定义了SigningKey32 字节、VerificationKey32 字节、Signature64 字节三种结构。共识主路径的调用点位于 src/main.cpp 的ContextualCheckShieldedInputs()if (!tx.vJoinSplit.empty()) { if (!ed25519::verify(tx.joinSplitPubKey, tx.joinSplitSig, {dataToBeSigned.begin(), 32})) { // 若用上一 epoch 的 consensusBranchId 可以验签成功说明签名是用旧分支 ID 生成的 if (ed25519::verify(tx.joinSplitPubKey, tx.joinSplitSig, {prevDataToBeSigned.begin(), 32})) { return state.DoS(..., old-consensus-branch-id (Expected %s, found %s), ...); } return state.DoS(..., bad-txns-invalid-joinsplit-signature); } }这段逻辑说明两点JoinSplit 的签名数据是 32 字节的SignatureHash结果当主分支验签失败时节点还会尝试用上一共识分支 ID 再验一次以区分真签名错误与旧分支 ID 签名后者会以old-consensus-branch-id拒绝并提示升级。在交易构建侧src/transaction_builder.cpp 与 src/transaction_builder.cpp 分别调用generate_keypair/sign生成 JoinSplit 密钥与签名并在生成后立即verify自检。2.4 测试与基准覆盖单元测试src/gtest/test_consensus.cpp 用ed25519::verify直接构造共识级验签用例覆盖 ZIP-215 边界条件交易校验测试src/gtest/test_checktransaction.cpp 生成密钥对并对 JoinSplit 签名基准测试src/bench/verification.cpp 对验签路径做性能基准可用于对比新旧实现的吞吐。三、ZIP-313默认费率降至 0.00001 ZEC3.1 新费率与源码常量ZIP-313 将默认交易费率降为0.00001 ZEC 1000 zatoshis。在 src/amount.h 中对应常量static const CAmount LEGACY_DEFAULT_FEE 1000;这里的LEGACY_DEFAULT_FEE命名说明它代表 ZIP-313 落地后的遗留默认费率后续版本由 ZIP-317 的按 action 计费模型conventional fee取代。4.2.0 中该值被用于多个路径z_*系列屏蔽交易操作的默认手续费如 src/wallet/asyncrpcoperation_saplingmigration.cpp 中迁移交易的输出金额计算屏蔽交易构建器的默认费率src/transaction_builder.hmempool 限制中的 low fee penalty低费惩罚阈值同步下调到 1000 zatoshisDaira Hopwood 的提交同时修正了 src/gtest/test_mempoollimit.cpp 中与此阈值相关的断言。3.2 无论交易大小均可中继的实现机制release notes 强调的第二点是只要交易支付的费用不低于新最低费率就满足中继阈值与交易大小无关。这意味着必须废弃按字节费率 × 大小的旧中继判定。src/policy/policy.h 的注释完整记录了这段费率政策演进史上线初期minRelayTxFee为 5000 zats/1000 bytesv1.0.7-1#2141将其降为 1000 zats/1000 bytes屏蔽交易的体积问题#1969推动了后续调整本版本引入CFeeRate::GetFeeForRelay#4916确保支付LEGACY_DEFAULT_FEE的交易总是能被中继同时将默认费率定为 1000 zats。在 mempool 接受路径 src/main.cpp 中AcceptToMemoryPoolWorker的检查改为// No transactions are allowed with modified fee below the minimum relay fee, // except from disconnected blocks. The minimum relay fee will never be more // than LEGACY_DEFAULT_FEE zatoshis. CAmount minRelayFee ::minRelayTxFee.GetFeeForRelay(nSize); if (fLimitFree nModifiedFees minRelayFee) { // ... min relay fee not met }GetFeeForRelay的设计保证其返回值有上限不超过LEGACY_DEFAULT_FEE因此大体积屏蔽交易只要支付 1000 zatoshis 就能进入内存池并被广播——这正是费率与大小解耦的落地实现。值得注意的是本版本尚未引入 ZIP-317 的 unpaid action 限制该机制在后续版本生效见同文件中对-txunpaidactionlimit的引用注释所以 4.2.0 的规则仍是固定绝对金额模式。四、getblocktemplate 性能优化预计算模板与 10 秒等待4.1 问题背景Zcash 目标出块间隔为 75 秒约为比特币的 10 分钟的 1/8。上游 Bitcoin 代码为 getblocktemplate 设计了 1 分钟的新交易纳入等待窗口这个数值直接继承到 Zcash 后显得过长区块到达后矿工需要等待模板重新生成白白损失挖矿时间。4.2 两项关键改动Larry Ruane 提交预计算未来区块模板在新区块到达前就预先构建好下一高度可用的空块模板含屏蔽 coinbase 所需的所有根承诺区块一旦到达矿工可以立即在新链顶端开始工作无需等待模板生成纳入新交易等待窗口从 1 分钟缩短到 10 秒新的GENERATE_IMMEDIATELY级联逻辑确保 mempool 中的交易能在 10 秒内进入模板适配 Zcash 的区块节奏。4.3 源码证据src/miner.cpp 的CreateNewBlock是模板生成的入口负责填充 coinbase、计算hashChainHistoryRoot、hashAuthDataRoot等屏蔽 coinbase 必需字段对 Sapling/Orchard 出块至关重要src/rpc/mining.cpp 处理使用预计算 coinbase空块的分支即当模板请求方只需空块时直接复用预计算结果避免重复执行完整模板构建Rust 侧 src/rust/src/transaction_ffi.rs 提供zcash_transaction_precomputed_init配合 src/rust/include/rust/transaction.h 的PrecomputedTxParts管理预计算交易部件的生命周期。该优化的收益在于屏蔽 coinbase 的模板构建涉及多个树的根计算成本高于普通模板预计算把这部分开销从出块关键路径中剥离让矿工在 75 秒出块节奏下最大化有效算力时间。五、RPC 测试框架从 rpc-tests.sh 迁移到 rpc-tests.py5.1 统一与简化的测试体系4.2.0 将rpc-tests.sh迁移到rpc-tests.pyptschip、Marco Falke、John Newbery 等共同完成与上游 Bitcoin 的做法对齐。迁移包含对 qa/pull-tester/rpc-tests.py 的大量重构使用argparse与configparser替代手写参数解析对应配置模板 qa/pull-tester/tests_config.ini.in支持并行运行多个测试脚本默认 4 个作业并将耗时的屏蔽交易类测试排在前面、串行执行避免资源竞争引入--portseed随机端口偏移、每节点独立 RPC 认证对防止并行实例间端口/认证冲突增加基础覆盖率报告--coverage。5.2 命令行参数速查迁移后的rpc-tests.py支持以下关键参数来自 qa/pull-tester/rpc-tests.py参数简写默认值说明--coverage—关生成 RPC 接口的基础覆盖率报告--deterministic-d关让输出更接近确定性便于对比多次运行--exclude-x—指定逗号分隔的脚本列表不含.py后缀以排除--extended—关在基础测试之外运行扩展测试套件--force-f关在默认禁用测试的平台如 Windows上强制运行--jobs-j4并行运行的测试脚本数量--machines-m-1将测试分片到多少台机器-1 表示不分片--rpcgroup-r-1当前机器分片索引须与-m搭配使用--nozmq—关不运行 zmq 相关测试该测试框架在 qa/zcash/full_test_suite.py 中被集成作为完整测试套件的一部分执行4.2.0 还新增了p2p-fullblocktest.pyCasey Rodarmor用于全块级 P2P 测试。执行方式示例构建完成后# 在 qa/pull-tester 目录下运行基础 RPC 测试4 个并行作业 python3 rpc-tests.py -j4 # 排除特定脚本并启用覆盖率 python3 rpc-tests.py --coverage --exclude wallet_z_sendmany六、本次版本中值得关注的工程级清理除上述四大主题外4.2.0 还包含一批影响面广的工程清理理解它们有助于阅读后续版本代码Boost 依赖削减Jack Grigg 将boost::variant全面迁移到std::variant、boost::optional迁移到std::optional并从 lint 允许头文件清单中移除相关 Boost 头Jorge Timón 移除了BOOST_FOREACH、PAIRTYPE、boost::foreach.hppJohn Newbery 用std::function替换boost::signals2钱包 UTXO 过滤重构furszy为AvailableCoins引入fOnlySpendable、nMinDepth、按目标地址过滤等标志并接入sendmany异步操作同时移除SendManyInputUTXO类消除多处冗余循环与重复加锁RPC 信息增强getinfo增加更多版本信息getblock的 verbose 输出包含交易 hexJosh Ellithorpez_importviewingkey错误信息补充地址Alfredo Garcia共识参数Eric Lombrozo 在Consensus::Params中新增fPowNoRetargeting字段用于禁用 nBits 重算regtest 场景src/consensus/consensus.h构建与平台最低支持 macOS 提升到 10.14、Boost 升级到 1.75、Windows 交叉构建忽略/清理.lib文件Dimitris Apostolou 修复了readelf相关构建配置该工具仅限 Linux 使用。七、如何在本地验证这些变更仓库为只读源码你可以在本地构建后验证构建参考 INSTALL 与 README.md通过./zcutil/build.sh或标准的./autogen.sh ./configure make流程构建zcashd与zcash-cli验证共识签名切换运行单元测试确认 Ed25519 路径通过如make check中的test_consensus、test_checktransaction它们直接覆盖 src/rust/src/ed25519.rs 的 verify 行为src/bench/verification基准可对比验签吞吐验证费率在 regtest 模式下用zcash-cli settxfee观察默认费率并构造小额屏蔽交易检查是否满足LEGACY_DEFAULT_FEE1000 zatoshis中继阈值验证挖矿模板调用getblocktemplate观察新块到达后模板返回延迟配合矿池软件对比 4.2.0 与旧版本在新交易纳入10 秒与空块预计算上的差异运行 RPC 测试按第五节参数表执行rpc-tests.py验证并行测试与覆盖率功能。八、结语Zcash 4.2.0 是共识安全与挖矿效率双重改进的代表版本ed25519-zebra 的全面接管消除了对 libsodium 的外部依赖并严格固化了 ZIP-215 的签名语义ZIP-313 将默认费率降至 0.00001 ZEC 并解耦中继阈值与交易大小getblocktemplate 预计算让矿工在 75 秒出块节奏下不再空等。这些改动既有清晰的共识规则支撑ZIP-215 / ZIP-313也有完整的源码与测试证据可循是理解 Zcash 后续费率模型ZIP-317与挖矿架构演进的重要参照点。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

OpenProject 项目生命周期(Project Life Cycle)配置与自动排程完全指南

OpenProject 项目生命周期(Project Life Cycle)配置与自动排程完全指南

OpenProject 项目生命周期(Project Life Cycle)配置与自动排程完全指南 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternati…

📅 2026/9/18 20:21:28
WeChatMsg 如何导出微信聊天记录为 HTML、Word、CSV 并生成年度报告

WeChatMsg 如何导出微信聊天记录为 HTML、Word、CSV 并生成年度报告

WeChatMsg 如何导出微信聊天记录为 HTML、Word、CSV 并生成年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…

📅 2026/9/18 20:21:28
DX12实战指南:从Device到带贴图三角形完整渲染管线

DX12实战指南:从Device到带贴图三角形完整渲染管线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/18 20:21:28
MORE NEWS

更多资讯

📰

反射式DLL注入原理与工程实践:PE内存加载全解析

1. 这不是“黑科技”,而是一种内存加载的底层工程实践反射式DLL注入(Reflective DLL Injection)这个词,近几年在安全研究、红蓝对抗、软件加固、逆向分析等技术圈里反复被提起,但绝大多数人听到它,第一反应…

📰

Terraform AWS Provider 数据源 aws_datazone_domain 完整指南:按名称或 ID 查询 Amazon DataZone 域

Terraform AWS Provider 数据源 aws_datazone_domain 完整指南:按名称或 ID 查询 Amazon DataZone 域 【免费下载链接】terraform-provider-aws The AWS Provider enables Terraform to manage AWS resources. 项目地址: https://gitcode.com/GitHub_Trending/te/…

📰

Navicat Premium 15深度适配SQLite单文件数据库实战指南

1. 为什么选Navicat Premium 15而不是免费工具?——从SQLite单文件特性说起你手头有一份.db后缀的文件,双击打不开,用记事本打开全是乱码;你写了个Python脚本往里面插数据,但INSERT INTO users(name) VALUES(张三)执行…

📰

CANN Runtime 同步 H2D 内存复制实战:基于 aclrtMemcpy 的 Host 到 Device 数据传输样例解析

CANN Runtime 同步 H2D 内存复制实战:基于 aclrtMemcpy 的 Host 到 Device 数据传输样例解析 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 本技术指南以 1_h2d_sync_memory_copy 样例为核…

📰

HBase Java API 创建表实战:列族配置与报错排查

头歌平台上这套 HBase 开发实训,第一关的题目就叫"创建表"。很多同学看到这四个字第一反应是"就这?"——建个表而已,MySQL 里一句CREATE TABLE的事。但真动手写Java代码去操作HBase的时候,卡住的人远比想象中…

📰

Ant Design Slider 组件 `tipFormatter` 详解:自定义 Tooltip 提示内容与隐藏技巧

Ant Design Slider 组件 tipFormatter 详解:自定义 Tooltip 提示内容与隐藏技巧 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/gh_mirrors/antde/ant-design 导读 tipFormatter…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬