ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Zcash 1.0.13-rc2 变更解析:libsnark 构建集成、z_shieldcoinbase 转正与节点生命周期治理

2026/9/18 16:21:28 拓冰建站 浏览量
Zcash 1.0.13-rc2 变更解析:libsnark 构建集成、z_shieldcoinbase 转正与节点生命周期治理 Zcash 1.0.13-rc2 变更解析libsnark 构建集成、z_shieldcoinbase 转正与节点生命周期治理【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash本指南以 Zcash 官方仓库 release-notes-1.0.13-rc2.md 为主线系统梳理该候选版本在构建系统、钱包功能、HTTP 服务与节点生命周期管理上的核心变更。读者可以从中掌握 libsnark 如何从依赖系统迁移进主构建体系、z_shieldcoinbase从实验特性转正后的完整 RPC 用法、-allowdeprecated机制的工作方式以及 1.0.13 系列将“自动衰老auto-senescence周期调整为 16 周”这一关键运维信号。1.0.13-rc2 是 Zcash 1.0.13 发布流程中的第二个候选版本Release Candidate。与其说它是一次功能大爆发不如说它是一个典型的“工程整合型”里程碑零知识证明基础设施 libsnark 的构建方式被彻底重构、钱包侧z_shieldcoinbase正式脱离实验状态、HTTP 服务器的关闭流程被显著加固同时节点的自动衰老策略也发生了变更。下文逐一展开并附上当前仓库中对应的源码证据。版本背景与变更全景一个候选版本在做什么在 Zcash 的发布流程中-rc1、-rc2这样的候选版本承担两类职责收拢此前合并的功能通过完整测试套件验证整体稳定性修复测试暴露的问题为正式版铺路。从 make-release.py 的变更记录看1.0.13-rc2 的版本号与 manpages 更新均由该脚本自动完成说明候选版本流程高度自动化。rc2 相对 rc1 的增量集中在libsnark 构建的收尾、测试框架 MiniNode 的完善、以及若干稳定性修复。提交者与主题分布该 Changelog 共收录 8 位开发者含两处署名变体的 60 次提交主题高度集中主题主要贡献者提交数libsnark 构建系统集成Sean Bowe、Jack Grigg20测试框架MiniNode、full_test_suite.pyJack Grigg15钱包与 RPCz_shieldcoinbase、payment disclosureSimon Liu7HTTP 服务优雅关闭Wladimir J. van der Laan、Cory Fields、João Barbosa6命名与文档清理bitcoin → Zcash多人若干自动衰老周期调整Jack Grigg1libsnark 构建系统集成从 depends 到主构建变更动机rc1 到 rc2 期间最重的工程动作是把 libsnarkZcash 早期 Sapling 之前使用的零知识证明库从 depends 系统剥离纳入主构建系统。Sean Bowe 的提交“Remove libsnark from depends system and integrate it into build system”是这一工作的起点。此前 libsnark 作为依赖包被单独下载、编译这带来两个问题依赖链复杂、且与主构建的编译选项如编译器、优化级别可能不一致。集成进主构建后头文件与库的生成顺序可控避免“先有鸡还是先有蛋”的构建顺序问题make clean、make check等目标对 libsnark 一视同仁Gitian 构建与本地build.sh都能拿到正确的依赖路径。源码中的落地证据当前仓库中虽然 libsnark 已随后续版本从src/snark迁出但构建系统的处理方式仍保留了清晰的痕迹src/Makefile.am 中libsnark相关的构建目标、make libsnark-tests目标Jack Grigg 的“Add libsnark to make clean”“Ensure that libsnark is built first, so its headers are available”等提交说明其在构建顺序上的特殊地位“Add the tar-pax option to automake”修复了归档打包兼容性问题保证分发 tar 包可复现构建。对构建者而言1.0.13 系列起编译 Zcash 不再需要单独预处理 libsnark 依赖主configure make流程即可覆盖这也是候选版本周期内最值得关注的构建体验变化。z_shieldcoinbase 转正官方屏蔽矿工收益入口从实验到正式Simon Liu 的两条提交直接改变了z_shieldcoinbase的地位“Closes #2639. z_shieldcoinbase is now supported, no longer experimental.”“Closes #2639. Adds optional limit parameter with a default value of 50.”在此之前屏蔽 coinbase 收益需要依赖实验性参数或手工拼装交易转正之后该 RPC 成为钱包内置的标准能力且默认单次最多选取 50 个 coinbase UTXOSHIELD_COINBASE_DEFAULT_LIMIT定义于 src/wallet/asyncrpcoperation_shieldcoinbase.h。完整 RPC 用法在钱包已解锁的前提下标准调用形式为zcash-cli z_shieldcoinbase fromaddress tozaddress ( fee ) ( limit ) ( memo ) ( privacyPolicy )参数类型必填/默认说明fromaddressstring必填来源透明地址 taddr或*表示钱包内全部 taddrtoaddressstring必填目标屏蔽地址 zaddrSapling 生效后才能使用feenumeric可选默认按 ZIP 317 计算交易手续费ZEClimitnumeric可选默认 50单次最多屏蔽的 UTXO 数设为 0 表示“能塞多少塞多少”memostring可选十六进制编码的备注写入新 note 的 memo 字段privacyPolicystring可选默认AllowRevealedSenders信息泄露策略取值同 z_sendmany但仅AllowRevealedSenders与AllowLinkingAccountAddresses有实际意义返回结果{ remainingUTXOs: 0, remainingValue: 0, shieldingUTXOs: 50, shieldingValue: 500000000, opid: opid-... }opid用于配合z_getoperationstatus查询异步操作进度。由于交易构造与证明生成耗时较长该 RPC 是异步的选中的 UTXO 会被锁定出错时自动解锁可用listlockunspent查看被锁定的 UTXO。CLI 与 RPC 两种调用示例来自 src/wallet/rpcwallet.cppzcash-cli z_shieldcoinbase t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf{ method: z_shieldcoinbase, params: [t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd, ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf] }底层实现要点该 RPC 注册于 src/wallet/rpcwallet.cpp实际工作委托给AsyncRPCOperation_shieldcoinbasesrc/wallet/asyncrpcoperation_shieldcoinbase.cppSapling 前置条件源码中在构造前显式检查consensus.NetworkUpgradeActive(nextBlockHeight, Consensus::UPGRADE_SAPLING)Sapling 未激活时直接报错“Cannot create shielded transactions before Sapling has activated”UTXO 数量估算头文件中给出了硬编码的估算常量——典型 P2PKH 花费 ≥148 字节、3-of-3 多签 P2SH 约 400 字节、Orchard 接收者 9165 字节据此在不超过交易大小上限Sapling 前为MAX_TX_SIZE_BEFORE_SAPLINGSapling 后为MAX_TX_SIZE_AFTER_SAPLING的前提下决定选取多少 UTXO异步状态机操作经历初始化 → 执行EXECUTING→ 成功/失败SUCCESS/FAILED任何异常都会被捕获并写入错误码与错误消息测试覆盖单元测试位于 src/wallet/test/rpc_wallet_tests.cpp测试直接构造AsyncRPCOperation_shieldcoinbase其testmode标志可禁用真实交易发送与证明生成便于快速回归RPC 集成测试见 qa/rpc-tests/wallet_shieldcoinbase.py。另外本次同时引入了“payment disclosure as experimental feature”即在转账场景中可选地公开交易收款信息用于合规审计场景。HTTP 服务器优雅关闭与工作线程治理变更内容Wladimir J. van der Laan 的 4 条提交与 Cory Fields、João Barbosa 的提交共同目标一致让 HTTP RPC 服务的关闭过程可预测、不泄漏线程。“Make HTTP server shutdown more graceful”“http: Wait for worker threads to exit”“http: Force-exit event loop after predefined time”“http: speed up shutdown”Cory Fields “httpserver: explicitly detach worker threads”João Barbosa “Improve shutdown process”源码现状印证在 src/httpserver.cpp 中可以看到完整的线程治理结构WorkQueueHTTPClosure负责承载待处理的 HTTP 请求闭包HTTPWorkQueueRun是每个工作线程的入口线程名zc-http-worker从队列取任务执行关闭流程中会先停止接收新请求再等待所有 worker 线程退出并join最后强制结束事件循环。这套机制的价值在于关闭节点时不再出现“请求还在飞、进程已退出”的竞态RPC 客户端也不会在关停瞬间收到莫名中断。节点自动衰老周期从 12 周调整为 16 周变更含义Jack Grigg 的“Change auto-senescence cycle to 16 weeks”把节点“自动衰老”周期从 12 周延长到 16 周。自动衰老auto-senescence见 ZIP 200 思想是指运行旧版本的全节点在到达某个区块高度后会强制关闭以此鼓励全网尽快升级避免老版本因共识规则分歧而分叉。当前仓库中的实现src/deprecation.h 完整呈现了该策略的工程实现static const int APPROX_RELEASE_HEIGHT 3360652; static const int RELEASE_TO_DEPRECATION_WEEKS 7; static const int EXPECTED_BLOCKS_PER_HOUR 3600 / Consensus::POST_BLOSSOM_POW_TARGET_SPACING; // static_assert(EXPECTED_BLOCKS_PER_HOUR 48) static const int ACTIVATION_TO_DEPRECATION_BLOCKS (RELEASE_TO_DEPRECATION_WEEKS * 7 * 24 * EXPECTED_BLOCKS_PER_HOUR); static const int DEPRECATION_HEIGHT APPROX_RELEASE_HEIGHT ACTIVATION_TO_DEPRECATION_BLOCKS; static const int DEPRECATION_WARN_LIMIT 14 * 24 * EXPECTED_BLOCKS_PER_HOUR;DEPRECATION_HEIGHT由发布估算高度加上 7 周按 48 块/小时折算的区块数得到在距关闭还有约 14 天区块量时DEPRECATION_WARN_LIMIT节点开始向调试日志、metrics UI 及-alertnotify发出警告到达DEPRECATION_HEIGHT后EnforceNodeDeprecation 会在主网强制触发StartShutdown()并输出“This version has been deprecated as of block height %d”的提示regtest 与 testnet 不执行该强制逻辑。需要注意当前仓库此后多年演进中RELEASE_TO_DEPRECATION_WEEKS已调整为 7与 1.0.13 时代的“16 周”属于同一套策略的不同历史取值——这正是本次变更留下的延续性痕迹。运维者应把“自动关闭”视为确定性事件提前规划升级窗口。与 -allowdeprecated 的关系与自动衰老配套的是-allowdeprecated机制src/deprecation.h、src/deprecation.cpp节点默认允许部分旧功能如createrawtransaction、signrawtransaction、getnetworkhashps等默认禁用另一些如getnewaddress、z_getbalance、legacy_privacy等。在相应功能的弃用期内可通过启动参数重新启用zcashd -allowdeprecatedz_getbalance若传入了非法取值节点会在启动时报错并列出全部合法取值GetAllowableDeprecatedFeatures。这一机制保证了“旧 RPC 被标记 DEPRECATED/DISABLED”与“节点自动衰老”两条升级路径协同工作。命名统一与杂项修复候选版本还包含大量低风险但重要的清理工作文案统一将 RPC 帮助、文档、代码注释中的 “bitcoin address” 统一为 “zcash address”Simon Liu将 “bitcoin” 替换为 “Zcash”Jason Davies、Bruno Arueira大小写规范为 “Zcash”Jay Graber构建工具修复Jonathan “Duke” Leto 修复了performance-measurements.sh在无参数时硬失败hard fail的 bugqa/zcash/performance-measurements.sh测试基础设施Jack Grigg 重构出新的测试套件驱动脚本full_test_suite.py将ensure-no-dot-so-in-depends.py、check-security-hardening.sh、bitcoin-util-test.py、libsnark 测试等统一纳入并新增--list-stages参数同时 MiniNode 实现了完整的 Zcash 区块、v2 CTransaction、JSDescription 解析与 Zcash PoWBIP65/BIP66 测试随之修复稳定性修复Simon Liu 修复了wallet_shieldcoinbase测试可能挂起的问题以及管道破裂broken pipe错误João Barbosa 优化了整体关闭流程依赖清理移除 libsnark 的 OpenSSL 链接库迁移 libsnark 测试代码到 Google Test并新增make libsnark-tests目标。对运维与开发者的行动建议升级路径若运行在 1.0.12 及更早版本应关注 1.0.13 正式版的自动衰老高度在节点强制关闭前完成升级屏蔽收益矿池或自持矿工可使用z_shieldcoinbase将 coinbase 收益转入屏蔽地址注意 Sapling 激活后才能使用且默认单次上限 50 个 UTXO可配合limit0尽量塞满一笔交易关停演练1.0.13 的 HTTP 优雅关闭改善了 RPC 节点的停启体验运维脚本可更安全地在关闭前等待在途请求完成构建验证使用 1.0.13 源码包重新构建时libsnark 已并入主构建流程请确认make libsnark-tests通过后再进入生产部署。延伸阅读release-notes-1.0.13-rc1.mdrc1 的完整变更清单与本篇 rc2 增量互为补充release-notes-1.0.13.md该系列正式版发布说明src/deprecation.h自动衰老与弃用功能策略的权威定义src/wallet/asyncrpcoperation_shieldcoinbase.h屏蔽 coinbase 操作的 UTXO 估算与常量定义qa/rpc-tests/wallet_shieldcoinbase.pyz_shieldcoinbase的端到端测试qa/zcash/full_test_suite.py本次重构出的统一测试套件驱动。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考