ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Zcash 0.11.2.z4 版本技术解析:挖矿慢启动、Equihash 优化与 JoinSplit 签名加固

Zcash 0.11.2.z4 版本技术解析:挖矿慢启动、Equihash 优化与 JoinSplit 签名加固 Zcash 0.11.2.z4 版本技术解析挖矿慢启动、Equihash 优化与 JoinSplit 签名加固【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash导读本文基于 Zcashzcashd0.11.2.z4 版本的发布说明release-notes-0.11.2.z4.md系统梳理该版本在共识经济模型、工作量证明算法与交易安全三个方向的关键改动线性坡道的挖矿慢启动Mining Slow Start、基于索引截断与模板化的Equihash 求解器优化以及将 JoinSplit 交易绑定签名切换为Ed25519并加入防延展性校验。读者通过本文可以理解这些机制的设计动机、共识参数在源码中的落点以及测试与构建层面的配套加固为深入研读 Zcash 的货币发行曲线、PoW 求解器和交易校验逻辑提供完整入口。一、版本背景0.11.2.z4 在 Zcash 开发史中的位置0.11.2.z4 是 Zcash 主网上线前的早期版本0.11.2 系列的第 4 个 z 版本这一阶段仓库正处于从 Bitcoin Core 代码库向 Zcash 专用协议迁移的关键期。从提交内容看本版本集中解决了三类问题经济模型上线前必须确定初始区块奖励的释放曲线即挖矿慢启动PoW 性能Equihash 求解器是当时挖矿与验证的性能瓶颈需要系统化重构交易安全Sprout 时代的 JoinSplit 交易需要与 Ed25519 签名体系对齐并防止签名延展性攻击。同时本版本还完成了一批去 Bitcoin 化与工程质量工作移除 Bitcoin 种子节点、将版本字符串与帮助文本中的 Bitcoin 替换为 Zcash、对构建开启-Werror等。二、挖矿慢启动线性坡道的货币发行曲线2.1 设计动机为避免上线初期区块奖励骤增对代币分配与市场价格造成冲击Zcash 在主网上线时采用了慢启动机制初始区块补贴不直接达到满额而是随区块高度线性爬升逐步逼近完整补贴。在 0.11.2.z4 中该机制以线性坡道linear ramp形式落地并在 regtest 模式下被禁用便于测试工具快速出块验证逻辑。其核心共识参数与计算逻辑目前仍保留在源码中。2.2 共识参数慢启动区间主网与测试网的慢启动区间由 chainparams.cpp 中的nSubsidySlowStartInterval定义主网CChainParams主网分支nSubsidySlowStartInterval 20000测试网同样为20000回归测试网regtestnSubsidySlowStartInterval 0即完全关闭慢启动。对应的偏移量定义在 params.hint nSubsidySlowStartInterval; // Shift based on a linear ramp for slow start: // t_s nSubsidySlowStartInterval // t_r number of blocks between end of slow start and first halving // t_c SubsidySlowStartShift() int SubsidySlowStartShift() const { return nSubsidySlowStartInterval / 2; }即慢启动偏移量SlowStartShift SlowStartInterval / 2 10000个区块。2.3 补贴计算公式与源码实现区块补贴的完整计算位于 params.cpp 的Params::GetBlockSubsidyCAmount nSubsidy 12.5 * COIN; // Mining slow start // The subsidy is ramped up linearly, skipping the middle payout of // MAX_SUBSIDY/2 to keep the monetary curve consistent with no slow start. if (nHeight this-SubsidySlowStartShift()) { nSubsidy / this-nSubsidySlowStartInterval; nSubsidy * nHeight; return nSubsidy; } else if (nHeight this-nSubsidySlowStartInterval) { nSubsidy / this-nSubsidySlowStartInterval; nSubsidy * (nHeight1); return nSubsidy; } assert(nHeight this-SubsidySlowStartShift()); int halvings this-Halving(nHeight); ... // zip208 // BlockSubsidy(height) : // SlowStartRate · height, if height SlowStartInterval / 2 // SlowStartRate · (height 1), if SlowStartInterval / 2 ≤ height and height SlowStartInterval // floor(MaxBlockSubsidy / 2^Halving(height)), if SlowStartInterval ≤ height and not IsBlossomActivated(height)从中可以提炼出完整的经济曲线高度 0 9999height SlowStartInterval / 2BlockSubsidy SlowStartRate × height从 0 线性上升高度 10000 19999SlowStartInterval / 2 ≤ height SlowStartIntervalBlockSubsidy SlowStartRate × (height 1)继续线性上升并跳过中间点MAX_SUBSIDY/2的重复发放即不出现两次 6.25 ZEC 的补贴保证货币发行总量与无慢启动情形一致高度 ≥ 20000进入正常减半曲线floor(MaxBlockSubsidy / 2^Halving(height))。其中SlowStartRate 12.5 / 20000ZEC/块。慢启动结束后每 840,000 个区块减半约 4 年对应Halving()函数与nPreSubsidyHalvingInterval参数Blossom 升级ZIP208后减半逻辑引入了BLOSSOM_POW_TARGET_SPACING_RATIO缩放相关实现同样在 params.cpp。2.4 测试配套慢启动机制上线后测试同步更新补贴测试更新Update subsidy tests to account for mining slow start矿工测试更新Update miner tests to account for mining slow start、Fix failing miner test现有单元测试中test_foundersreward.cpp 的FoundersRewardTest.SlowStartSubsidy专门验证首次减半与慢启动偏移之后创始人奖励的 10% 足额发放。这类测试保证了经济模型重构过程中补贴金额、创始人奖励分配不出现回归。三、Equihash 求解器重构从 StepRow 重构到索引截断优化3.1 为何要重构求解器Equihash 是 Zcash 采用的抗 ASIC 工作量证明算法参数化求解当前主网使用 N200, K9。求解器在挖矿与基准测试中的内存占用和计算开销极大是早期版本的重点优化对象。0.11.2.z4 中 Jack Grigg 提交了 21 个补丁中的大部分围绕求解器做了一次系统化重构。3.2 StepRow 重构与数据布局优化StepRow是 Equihash 求解过程中用于承载部分解partial solution与索引的基本数据结构定义在 equihash.h将StepRow模板化templatesize_t WIDTH哈希以定宽数组unsigned char hash[WIDTH]存储引入FullStepRow存储完整索引与TruncatedStepRow存储截断索引两个子类排序改用比较器对象CompareSR通过memcmp直接比较哈希减少间接调用将截断索引与哈希存放在同一段char*内存Store truncated indices in the same char* as the hash随后又改为定宽数组方案Use fixed-width array for storing hash and indices减少指针解引用与内存碎片提升缓存局部性。提交说明中特别标注了索引截断优化的思想来源H/T tromp for the idea!这是对 John TrompEquihash 作者思路的直接借鉴。3.3 模板参数静态化与统一求解入口本版本将 Equihash 实例由运行时参数分发改为编译期模板实例化Use template parameters to statically initialise Equihash在 equihash.h 中表现为templateunsigned int N, unsigned int K class Equihash { ... }; static Equihash96,3 Eh96_3; static Equihash200,9 Eh200_9; static Equihash96,5 Eh96_5; static Equihash48,5 Eh48_5; #define EhInitialiseState(n, k) ... // 根据 (n,k) 分派到对应静态实例内部常量HashOutput、CollisionBitLength、SolutionWidth等全部由enum : size_t在编译期推导BasicSolve与OptimisedSolve两个求解路径以及各自的不可取消Uncancellable包装统一暴露求解器具备取消检查点机制EhSolverCancelCheck枚举覆盖ListGeneration、ListSorting、ListColliding等阶段矿工可在区块模板变化时及时中止无谓求解。OptimisedSolve使用截断索引的优化路径随后被应用到矿工与基准测试Use optimised Equihash solver for miner and benchmarks。此外Taylor Hornby 在 equihash 相关代码中改用左移代替浮点pow()Use left shift instead of floating-point pow() in equihash规避浮点舍入带来的平台不一致问题也省去浮点开销。3.4 求解器代码落点求解模板实现位于 equihash.tcc挖矿调用路径可追溯至 miner.cpp 与 pow 目录equihash_parameters_acceptable宏定义于 main.h用于校验网络允许的 (N, K) 参数组合。验证侧则使用 pow/tromp/equi.h 的独立验证实现。四、JoinSplit 交易签名Ed25519 绑定与防延展性加固4.1 从签名体系对齐到结构固定Sprout 时代的屏蔽交易通过 JoinSplitCPourTx转移资金需要一种能覆盖整笔交易、防止证明被重放的密码学绑定机制。0.11.2.z4 完成了多项结构性工作Ed25519 绑定Switch to Ed25519 for cryptographic binding of joinsplits to transactions——以 Ed25519 签名作为 JoinSplit 与整笔交易之间的密码学绑定证明与密钥二进制序列化Enable binary serializations of proofs and r1cs keys并将CPourTx的 proof 字段改为定长字段重排按协议规范spec重排CPourTx字段顺序签名类型统一定义joinsplit_sig_t并在更多位置复用Use joinsplit_sig_t in more places当前定义于 transaction.htypedef std::arrayunsigned char, 64 joinsplit_sig_t;4.2 防延展性强制 S 值小于群阶Ed25519 签名由(R, S)组成若不对 S 做规范化约束攻击者可将合法签名的 S 加上椭圆曲线群的阶构造出另一个同样通过校验的签名签名延展性这会破坏交易 ID 的唯一性、影响交易池与钱包的去重判断。本版本提交明确写道Enforce that theSvalue of the ed25519 signature is smaller than the group order to prevent malleability attacks.即签名校验时必须满足0 ≤ S LL 为 ed25519 曲线群阶从根源上消除这一类延展性向量。这一约束如今已成为 Zcash 全节点共识校验的一部分。4.3 CheckTransaction 中的签名验证本版本将 JoinSplit 签名验证接入交易校验流程Implement signature verification in CheckTransaction、Sign JoinSplit transactions。当前的实现位于 main.cpp 的ContextualCheckShieldedInputsif (!tx.vJoinSplit.empty()) { if (!ed25519::verify(tx.joinSplitPubKey, tx.joinSplitSig, {dataToBeSigned.begin(), 32})) { // 校验失败时回退用上一共识分支 ID 重新验证 // 若成功则提示节点 old-consensus-branch-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); } ... }这段代码揭示了三条关键信息签名覆盖的数据为整笔交易的签名字节SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL, 0, consensusBranchId, txdata)空输出脚本、NOT_AN_INPUT与SIGHASH_ALL的组合保证签名绑定所有交易字段签名内容绑定共识分支 IDconsensus branch ID因此网络升级后旧签名的交易会被精确识别为old-consensus-branch-id而非笼统的签名无效无效签名按REJECT_INVALID/bad-txns-invalid-joinsplit-signature拒绝并附带DoS惩罚防御恶意交易洪泛。对应的单元测试集中在 test_checktransaction.cpp其中CreateJoinSplitSignatureL66-L108构造合法签名用于覆盖无效签名、错误分支 ID 等路径。基准测试侧则刻意跳过签名创建/验证的计时We dont want to benchmark signature creation / verification避免因签名的随机性引入不可复现的基准噪声。五、代码库去 Bitcoin 化与工程质量加固5.1 品牌与命名统一版本字符串追加 Zcash 修订号Add Zcash revision to version strings版本与帮助文本中的Bitcoin全部替换为ZcashBitcoin - Zcash in version and help textCLI 版权声明加入 Zcash DevelopersAdd Zcash Developers to CLI copyright noticelibzerocash库更名为libzcashRename libzerocash to libzcash移除 Bitcoin 主网与测试网种子节点Remove Bitcoin mainnet seeds、Remove Bitcoin testnet seeds避免 zcashd 误连入 Bitcoin 网络。5.2 构建与开发工具链Taylor Hornby 在本版本集中处理了一批影响开发者体验的问题提交内容目的与效果Turn on -Werror for the Zcash build将警告升级为错误杜绝带警告合入Use HARDENED_CPPFLAGS in the Makefile consistently统一安全加固编译参数Fix FORTIFY_SOURCE build errors修复_FORTIFY_SOURCE缓冲区检查在旧版 glibc 上的构建失败Patch libsnark to build with my compiler. Upstream PR #35修复 libsnark 在特定编译器下的构建问题Hide new Boost warnings on GCC 6屏蔽 GCC 6 引入的 Boost 头文件新警告Pass -DPURIFY to OpenSSL/Enable -v for valgrind清理 valgrind 输出的 OpenSSL 伪告警并显示每类错误的计数Add ability to run things under valgrind支持在 valgrind 下运行以排查内存错误Fix build warnings in sighash tests消除 sighash 测试构建警告配套地sha256sum增加了 Mac OS X 支持add sha256sum support for Mac OS X保证 macOS 上的校验流程可用Nathan Wilcox 修复了测试目标命名 bug使make cov-zcash能正确执行zcash-gtest二进制并生成覆盖率报告Fixes #946。六、回归测试与可复现验证慢启动FoundersRewardTest.SlowStartSubsidy验证慢启动后创始人奖励足额test_miner相关用例保证慢启动下矿工构造的区块补贴正确JoinSplit 签名test_checktransaction.cpp中CreateJoinSplitSignature驱动的正反用例覆盖签名缺失、S 值非法延展性向量、错误共识分支 ID 等路径test_sighash修复构建警告后继续作为签名字节一致性基线Equihashtest_equihash与zcbenchmarks中的求解器基准用于验证重构前后求解正确性与性能不退化。若读者希望在本地复现上述行为可按 INSTALL 与 README.md 的指引编译 zcashd随后运行zcashd -regtest观察慢启动参数regtest 下nSubsidySlowStartInterval 0或通过make check/ gtest 二进制执行本版本涉及的单元测试。七、总结0.11.2.z4 为 Zcash 主网打下的三块基石经济基石线性坡道的慢启动让区块补贴在 20000 个区块内平滑爬升并在中途跳过MAX_SUBSIDY/2保持总发行量守恒这一设计至今仍体现在 params.cpp 中后续 Blossom、减半逻辑均在此基础上演进性能基石Equihash 求解器通过 StepRow 模板化、哈希与索引同段存储、索引截断、编译期参数实例化完成重构优化求解器进入矿工与基准测试路径为上线后的挖矿性能留出余量安全基石JoinSplit 交易改用 Ed25519 绑定整笔交易、强制 S 值规范化防延展性、按共识分支 ID 区分签名校验失败原因配合二进制序列化与定长 proof 字段使 Sprout 屏蔽交易的安全模型在协议层面落定。这三个方向的代码与测试至今仍是理解 Zcash 发行曲线、PoW 求解器与屏蔽交易校验机制的起点。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表