ARTICLE DETAIL

建站实战干货

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

Zcash 1.0.0-rc1 发布说明解读:共识规则收紧、见证缓存加固与 RPC 账户体系重构

2026/9/17 17:06:17 拓冰建站 浏览量
Zcash 1.0.0-rc1 发布说明解读:共识规则收紧、见证缓存加固与 RPC 账户体系重构 Zcash 1.0.0-rc1 发布说明解读共识规则收紧、见证缓存加固与 RPC 账户体系重构【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcashZcash 1.0.0-rc1 是 Zcash 迈向 1.0.0 正式版主网发布前的首个候选版本本篇文章以该版本的官方发布说明doc/release-notes/release-notes-1.0.0-rc1.md为骨架逐项梳理其在共识、钱包、RPC、构建与文档层面的变更并结合当前仓库源码给出可验证的实现证据。读完本文你将掌握 1.0.0-rc1 的完整变更脉络、关键规则在 src/consensus/consensus.h 与 src/wallet/wallet.cpp 中的落点以及这些早期设计在后续版本中的演变。一、版本概览主网发布前的最后一个候选版本系列1.0.0-rc1 是 Zcash 主网上线前的里程碑式预发布版本其发布说明以提交日志的形式记录了从 beta 到候选版本阶段的安全加固、钱包稳定性修复与发行准备工程。从提交列表可以统计出该版本的贡献分布贡献者提交数主要工作方向Jack Grigg25见证缓存Witness Cache修复、账户弃用、RPC 测试Kevin Gallagher24Debian 打包、Gitian 描述文件、发行清单EXTRA_DISTJay Graber17文档重构、Tor 连接说明、移除 Bitcoin 专属文档Simon11RPC 修正z_* 系列、客户端标识重命名、测试修复Cory Fields7符号/安全检查、glibc 向后兼容、Gitian 确定性构建Daira Hopwood6RPC 测试修复、见证缓存断言Wladimir J. van der Laan6Gitian 构建、Windows 确定性构建MarcoFalke3Gitian 参考时间戳处理4ZEC / Sean Bowe各 1行交换修正 / 100KB 交易大小限制共识化这份提交清单本身即说明了 rc1 阶段的三大主题共识规则定稿、钱包数据完整性修复、发行与打包工程化。下面逐一展开。二、共识层变更100KB 交易大小限制从标准规则升级为共识规则Sean Bowe 在本版本提交了关键变更Make 100KB transaction size limit a consensus rule, rather than a standard rule.即将 100KB 的交易大小限制从标准规则standard rule提升为共识规则consensus rule。这一改动意味着任何节点在验证区块时必须强制执行该限制而非仅由节点本地策略决定是否接受从而防止超大交易进入区块链。该规则在当前仓库源码中仍然清晰可见/** The maximum allowed size for a serialized block, in bytes (network rule) */ static const unsigned int MAX_BLOCK_SIZE 2000000; /** The maximum size of a transaction (network rule) */ static const unsigned int MAX_TX_SIZE_BEFORE_SAPLING 100000; static const unsigned int MAX_TX_SIZE_AFTER_SAPLING MAX_BLOCK_SIZE;从源码结构看该共识检查被实现于ContextualCheckTransaction()中src/main.cpp属于带链上上下文的交易检查contextual check并携带REJECT_INVALID拒绝原因static_assert(MAX_BLOCK_SIZE MAX_TX_SIZE_BEFORE_SAPLING); // sanity if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) MAX_TX_SIZE_BEFORE_SAPLING) return state.DoS( dosLevelPotentiallyRelaxing, error(ContextualCheckTransaction(): size limits failed), REJECT_INVALID, bad-txns-oversize);值得注意的是该规则的后续演变在 Sapling 升级之后交易大小上限被放宽为整个区块大小MAX_TX_SIZE_AFTER_SAPLING MAX_BLOCK_SIZE即 2,000,000 字节而 Sapling 之前仍保持 100,000 字节的收紧限制。这一预 Sapling 严格、Sapling 后放宽的设计在 src/gtest/test_checktransaction.cpp 中有专门的边界测试恰好等于MAX_TX_SIZE_AFTER_SAPLING - 1、等于上限、超过上限1三种情形。这也提醒读者1.0.0-rc1 时代确定的 100KB 共识上限在后续网络升级中是被有条件地演进而非永久冻结。三、钱包见证缓存Witness Cache修复数据完整性加固的经典案例1.0.0-rc1 中 Jack Grigg 贡献了最密集的一组钱包修复核心对象是见证缓存witness cache。见证witness是屏蔽交易shielded transaction中用于证明某枚 note 存在于 Merkle 树的证据钱包在扫描链上交易时必须持续维护自己的 note 见证一旦缓存损坏后续花费spend将无法构造有效的 JoinSplit / Sapling 证明。rc1 中的修复可归纳为四条主线1. 缓存计数增量位置修正Move the increment of nWitnessCacheSize to make the later assertions correct. Add another assertion to narrow down where the bug occurs. Add another assertion about the witness cache.Daira Hopwood 与 Jack Grigg 通过移动nWitnessCacheSize的增量位置并补充断言定位并修复了缓存大小与实际见证数量不一致的缺陷。在当前代码中缓存大小以最近重组深度 1为上限int64_t nPrevWitnessCacheSize nWitnessCacheSize; nWitnessCacheSize std::min(nWitnessCacheSize 1, (int64_t) WITNESS_CACHE_SIZE);其中WITNESS_CACHE_SIZE MAX_REORG_LENGTH 1src/wallet/wallet.h即缓存容量刚好覆盖一次最大重组回滚所需的见证数量。2. WriteWitnessCache 失败即中止交易WriteWitnessCache: Catch errors and abort transaction Add unit tests for WriteWitnessCache见证缓存的持久化被纳入**数据库事务transaction**语义任一写入步骤失败如TxnBegin失败、WriteTx失败/抛异常、WriteOrchardWitnesses失败/抛异常、WriteWitnessCacheSize失败/抛异常都会触发TxnAbort()保证缓存状态不会半途落盘。这些路径在 src/wallet/gtest/test_wallet.cpp 的WalletTests.WriteWitnessCache测试中被逐一覆盖// WriteWitnessCacheSize fails EXPECT_CALL(walletdb, WriteWitnessCacheSize(0)) .WillOnce(Return(false)); EXPECT_CALL(walletdb, TxnAbort()) .Times(1); wallet.SetBestChain(walletdb, loc);3. 钱包锁定时延迟 nullifier 缓存Delay caching of nullifiers when wallet is locked Add unit test that fails when calling FindMyNotes on a locked wallet Add RPC test showing correct handling of JS txns from blockchain Break the RPC test by encrypting the mirroring wallet当钱包被加密锁定walletpassphrase未解锁时nullifier 无法从私钥计算因此 rc1 改为延迟缓存——直到钱包解锁后再补齐。这一设计直接影响z_importkey、z_sendmany等屏蔽操作的可用性也是后续版本中扫描屏蔽交易需要在解锁状态行为的基础。4. 重扫描时增量更新见证Increment witnesses for new transactions on rescan Set CBlockIndex.hashAnchor correctly in ConnectBlock修复了钱包重扫描rescan过程中新交易未同步更新见证的问题并修正ConnectBlock中hashAnchorJoinSplit 锚点的设置确保链重组后见证与区块头锚点一致。SetBestChain作为缓存落盘入口src/wallet/wallet.cpp至今仍承担将最佳链状态连同见证缓存写入CWalletDB的职责。四、RPC 与钱包接口账户体系弃用与 z_* 系列规范化1.0.0-rc1 对 RPC 层做了一次断舍离式的清理其中最重要的方向是逐步淘汰多账户模型。1. 账户accounts体系弃用Throw an RPC error for all accounts except the default Update tests for account deprecation Deprecated - Unsupported in RPC error除默认账户外所有涉及账户名的 RPC 调用开始返回错误且错误文案从 Deprecated 改为 Unsupported语义更明确。这是 Zcash 历史上逐步剥离 Bitcoin 遗留的accounts抽象、转向label/地址模型的早期一步。配套地Daira Hopwood 提交了 Fix RPC tests to not rely on accounts从测试层面摘除对账户的依赖。2. gettransaction 输出新增 vjoinsplit 字段Add vjoinsplit to JSON output of RPC call gettransactiongettransaction的 JSON 返回中新增了vjoinsplit数组用于展示交易中的 JoinSplit 描述符。该字段在当前代码中依然存在entry.pushKV(vjoinsplit, TxJoinSplitToJSON(wtx));从源码结构看这一字段如今已被标记为DEPRECATEDsrc/wallet/rpcwallet.cpp并且需要显式启用-allowdeprecatedwallettxvjoinsplit才会输出src/deprecation.cpp。这正体现了 1.0.0-rc1 时代先加入、后按弃用周期移除的接口治理路径在 Sapling/Orchard 屏蔽池逐步取代 Sprout JoinSplit 后vjoinsplit相关字段进入了弃用通道。3. z_* 屏蔽 RPC 的规范化Simon 在本版本集中修复了屏蔽类 RPC 的若干边界问题参数数量校验修复z_getnewaddress参数数量检查不正确的缺陷#1491 还修正了z_importkey的帮助文本并新增测试验证所有z_*RPC 调用在传入过多参数时必须返回错误独立调试类别-debugzrpc为z_*RPC 引入专用日志类别#1504。这一类别在当前 init.cpp 中仍然保留并且扩展出了zrpcunsafe隐式包含zrpcrand, receiveunsafe, reindex, rpc, selectcoins, tor, valuepool, zmq, zrpc, zrpcunsafe (implies zrpc)其中zrpc记录不泄露敏感信息的常规日志zrpcunsafe才输出金额、地址等敏感数据见 src/wallet/asyncrpcoperation_sendmany.cpp 的LogAcceptCategory(zrpcunsafe)分支这一安全分层至今沿用。花费 Coinbase 币的错误提示针对 #1373 改进错误消息。这对应Coinbase 成熟期100 个区块见 src/consensus/consensus.h 的COINBASE_MATURITY不保护 JoinSplit这一文档说明——即屏蔽交易无法依赖 coinbase 成熟期规则防止双重花费必须给出明确报错而非静默失败。4. RPC 客户端标识与测试基建Satoshi→MagicBean客户端标识subversion 字符串中的名称从 Bitcoin 遗留的 Satoshi 重命名为 MagicBean#1481。该标识在当前代码中依然生效const std::string CLIENT_NAME(MagicBean)并反映在 RPC 返回的subversion字段如/MagicBean:x.y.z[-v]/见 src/rpc/net.cpp。修复钱包测试的-datadir环境设置#1478确保加密钱包测试输出到正确的测试数据目录。重排zcash-gtest测试顺序保证确定性执行。五、发行工程Debian 打包、Gitian 确定性构建与符号/安全检查rc1 阶段投入了大量发行准备工作这决定了它能否真正成为可发布、可验证的候选版本。1. Gitian 确定性构建参考时间戳处理MarcoFalke将 Gitian 构建的参考日期默认设为提交作者日期并硬编码 depends 构建时间保证不同机器产出完全一致的二进制Windows/OSX 构建Wladimir使用 trusty 环境、为 Windows 构建添加--disable-bench、使 Windows 构建确定性化Linux 描述文件适配 ZcashKevin Gallaghertrusty - jessie、加入distro: debian、引入faketime构建依赖、为 LXC 构建添加ca-certificates和python移除发行包中不必要的可执行文件。2. 符号与安全检查Cory Fields 为本版本引入了两条重要的发行质量保障线release: add check-symbols and check-security make targets release: add security/symbol checks to gitian即新增check-symbols与check-security两个 Make 目标对应 contrib/devtools/symbol-check.py 与 contrib/devtools/security-check.py并在 Gitian 构建流程中强制执行同时为 Linux/Windows 创建调试包debug packages。配套改动还包括为 glibc 向后兼容构建始终链接librt、在忽略导出清单中加入_IO_stdin_used。3. depends 系统与 CONFIG_SITEdepends: allow for CONFIG_SITE to be used rather than stealing prefix gitian: use CONFIG_SITE rather than hijacking the prefix重构 depends 构建系统允许通过CONFIG_SITE机制注入配置而不是劫持安装前缀——这是可复现构建与交叉编译正确性的重要基础设施改进直接影响 depends/config.site.in 的使用方式。4. Debian 打包与发行清单Kevin Gallagher 在本版本完成了 Debian 打包的初版工作将zcash-fetch-params安装到/usr/bin恢复 Debian 包的 copyright 文件并补全各库的许可证文本含修正 Google 许可证中空行格式从EXTRA_DIST中移除 Windows/OSX 打包项将V1与NO_QT1移入MAKEOPTS补齐发行 tarball 的源文件清单crypto/equihash.tcc、zcash/Zcash.h、zcash/Proof.hpp、alertkeys.h、src/zcash/circuit、zcbenchmarks.h、json_test_vectors.h等使make dist可以正常运行对应 Jack Grigg 的 Fix Makefiles so make dist will run更新 Debian 版权文本中的开发者署名Zcash Core developers → Zcash developers。5. 其他构建与依赖修复configure.ac 完整版本渲染修复版本号完整输出问题对应 configure.ac 的版本宏体系libsnark 确定性修复更新 libsnark 以引入确定性修复消除证明生成中的非确定性因素参数下载重试zcash-fetch-params设置 wget 重试选项、超时 30 秒、重试前等待 3 秒提升大体积参数文件下载的健壮性。六、文档体系重构与网络说明更新Jay Graber 在本版本完成了一次大规模文档清理方向是让 Zcash 文档脱离 Bitcoin 遗留内容、聚焦自身特性删除 Bitcoin 专属文档移除build-unix.md等构建说明统一收口到 Zcash wiki对应 INSTALL 中的指引将 Bitcoin 发布说明移到独立目录移除已禁用的 REST 接口文档更新翻译策略文档以注明该文档尚未针对 Zcash 更新。支付 API 文档在 doc/payment-api.md 中补充z_importkey触发的**钱包重新索引reindex**说明以及Coinbase 成熟期不保护 JoinSplit的注意事项。移除 beta 1 关于加密钱包的发布说明该能力在 rc1 已不再是预告而是既定功能。Tor 隐藏服务说明新增 Zcash 隐藏服务地址、区分连接 1 个 Tor 节点与连接多个 Tor 节点两种场景改进 doc/reduce-traffic.mdtor.md中连接隐藏服务器的指引。RPC 测试清洁修正版权文本空行、DEBIAN/copyright许可证文本等细节。七、从 rc1 回望这些设计在今天的仓库中留下了什么用当前仓库回看 1.0.0-rc1可以清晰地看到三条遗产线共识规则的延续与演进100KB 限制作为共识规则写入 src/consensus/consensus.h 并保留至今只是在 Sapling 后放宽为区块级上限COINBASE_MATURITY 100的不保护 JoinSplit语义也延续至今。钱包见证缓存的健壮性模型WriteWitnessCache的失败即中止事务语义、nWitnessCacheSize的断言与WITNESS_CACHE_SIZE MAX_REORG_LENGTH 1的容量设计仍是 src/wallet/wallet.cpp 中钱包状态持久化的核心保证。RPC 接口治理的起点账户弃用、vjoinsplit字段加入后进入弃用通道、zrpc/zrpcunsafe日志分层、MagicBean客户端标识共同奠定了 Zcash 屏蔽钱包 RPC 的演进基线。对于想要理解 Zcash 主网上线前最后一步工程形态的读者1.0.0-rc1 发布说明配合上述源码路径是一份发行候选版该做什么的完整范本共识定稿、钱包数据完整性加固、RPC 边界清理、可复现构建与打包工程化缺一不可。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考