尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Zcash 2.0.2-rc1 发布要点解读:Sapling 钱包能力深化与交易过期 DoS 缓解

Zcash 2.0.2-rc1 发布要点解读:Sapling 钱包能力深化与交易过期 DoS 缓解 Zcash 2.0.2-rc1 发布要点解读Sapling 钱包能力深化与交易过期 DoS 缓解【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcashZcash 2.0.2-rc1 是 Zcash 在 Sapling 网络升级落地后发布的一个重要候选版本主线工作围绕两条展开一是把 Sapling 深度整合进钱包与交易构建流程如z_mergetoaddress支持 Sapling、z_getnewaddress默认返回 Sapling 地址、Sapling 默认 memo 规范二是针对 ZEC-013 安全公告从 P2P 传播与 RPC 入口两层缓解交易即将过期expiring soon带来的拒绝服务DoS攻击向量。阅读本篇文章后你可以掌握该版本的升级注意事项、核心 RPC 行为变化以及从源码层面理解交易过期机制与缓解策略的实现原理。版本概览2.0.2-rc1 的定位本版本以候选发布release candidate形式提供从 doc/release-notes/release-notes-2.0.2-rc1.md 的 Changelog 看该版本汇集了来自 Zcash 核心团队及社区Jack Grigg、Simon Liu、Larry Ruane、Eirik Ogilvie-Wigley、Suhas Daftuar 等的大量改动主要涉及钱包/交易层z_mergetoaddress支持 Sapling 池、z_getnewaddress默认地址类型切换、Sapling 默认 memo安全层面ZEC-013 交易过期 DoS 缓解网络层修剪模式下的区块中继改进基础设施librustzcash 迁移、Sapling 价值池记账、基准测试与测试框架加固。由于是 RC 版本其主要目标是收集回归测试与社区反馈为正式版 2.0.2 铺路。升级注意Debian 升级时遇到的吊销密钥错误该版本发布说明中专门记录了一个影响 Debian 系用户的升级问题在通过 apt 更新到新版 zcashd 时可能遇到如下签名校验错误The following signatures were invalid: REVKEYSIG AEFD26F966E279CD这表示本地 apt 信任链中仍持有已被吊销的旧签名密钥。发布说明给出的处理流程分三步删除被标记为吊销的密钥sudo apt-key del AEFD26F966E279CD重新获取更新后的密钥并导入wget -qO - https://apt.z.cash/zcash.asc | sudo apt-key add -更新软件包列表并继续升级sudo apt-get update需要说明的是该操作是针对当时 Debian/Ubuntu 发行版 apt 生态的修复路径对应上游 issue #3612在现代较新的发行版中apt-key已逐步弃用建议结合你所使用发行版的密钥管理方式如/etc/apt/trusted.gpg.d/下的 gpg 文件来更新 Zcash 软件源签名。无论采用哪种方式核心要点是先清除吊销密钥再导入新密钥最后刷新软件包列表否则 apt 会持续拒绝签名校验而无法升级。钱包功能深化z_mergetoaddress 全面支持 Sapling2.0.2-rc1 中最重要的钱包能力变化是z_mergetoaddressRPC 从仅支持 Sprout 扩展到同时支持 Sapling 池使用户可以把多个来源地址含 Sapling 地址的零钱合并到目标地址用于整理碎片、控制 note 数量。背后的重构工作Changelog 显示为支撑这一功能Eirik Ogilvie-Wigley 做了一组配套重构将GenerateNewZKey重命名为GenerateNewSproutZKey明确其职责范围仅限 Sprout 池并可返回SproutPaymentAddress移除GetUnspentFilteredNotes把按过滤条件取未花费 note的能力并入GetFilteredNotes避免两套逻辑重复维护为 Sapling note 增加加锁locking支持保证在读取/合并 note 时的线程安全补充了大量z_mergetoaddress参数测试与断言并扩展了 RPC 测试使同一套测试同时覆盖 Sprout 与 Sapling 两条路径。RPC 使用方式在 src/wallet/rpcwallet.cpp 中z_mergetoaddress的签名形如z_mergetoaddress [fromaddress, ... ] toaddress ( fee ) ( transparent_limit ) ( shielded_limit ) ( memo ) ( privacyPolicy )一个典型的命令行用法是zcash-cli z_mergetoaddress [ANY_SAPLING, t1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd] ztestsapling...其中来源地址支持ANY_SAPLING、ANY_SPROUT、ANY_TADDR这样的通配选择器也可以显式列出具体地址。需要特别注意的是从源码实现看同一笔z_mergetoaddress不允许同时从 Sprout 与 Sapling 地址发送资金代码中直接抛错 Cannot send from both Sprout and Sapling addresses using z_mergetoaddress这是当时实现的明确限制规划合并操作时需按池分开执行。RPC 行为变更z_getnewaddress 默认返回 Sapling 地址另一个直接影响日常操作的变化是z_getnewaddress的默认地址类型从 Sprout 切换为 Sapling。在 src/wallet/rpcwallet.cpp 中可以看到std::string defaultType ADDR_TYPE_SAPLING;即不传参数调用时默认生成 Sapling 支付地址也可以显式传sapling或sprout。源码同时体现了两个约束Canopy 激活后禁止再生成 Sprout 地址若当前链高度已激活UPGRADE_CANOPY传入sprout会抛出RPC_INVALID_PARAMETER初始区块下载IBD期间不支持创建 Sprout 地址。在更现代的 Zcash 版本中该 RPC 已进一步被z_getnewaccount与z_getaddressforaccount取代源码中标注了 Deprecated 提示统一账户/UA 模型成为钱包标准但 2.0.2-rc1 中默认 Sapling这一变更仍是钱包默认行为迁移的关键一步。安全修复ZEC-013 交易过期 DoS 缓解本版本最值得关注的安全工作是对ZEC-013的缓解攻击者可能利用即将过期expiring soon的交易大量占用节点资源如通过 P2P 消息反复广播、诱导节点长时间缓存形成拒绝服务向量。2.0.2-rc1 从三个层面收紧P2P 层不再传播即将过期的交易节点在通过inv/mempool 请求向对等节点转发交易前会跳过那些即将过期的交易RPC 层拒绝即将过期的交易createrawtransaction与sendrawtransaction在交易即将过期时直接返回错误从源头阻断恶意构造测试同步更新同步修正了被新阈值破坏的 QA 测试。源码层的实现细节交易是否即将过期由 src/main.cpp 中的两个函数判定bool IsExpiredTx(const CTransaction tx, int nBlockHeight) { if (tx.nExpiryHeight 0 || tx.IsCoinBase()) { return false; } return static_castuint32_t(nBlockHeight) tx.nExpiryHeight; } bool IsExpiringSoonTx(const CTransaction tx, int nNextBlockHeight) { return IsExpiredTx(tx, nNextBlockHeight TX_EXPIRING_SOON_THRESHOLD); }其中阈值定义在 src/main.hstatic const unsigned int DEFAULT_PRE_BLOSSOM_TX_EXPIRY_DELTA 20; static const unsigned int DEFAULT_POST_BLOSSOM_TX_EXPIRY_DELTA DEFAULT_PRE_BLOSSOM_TX_EXPIRY_DELTA * Consensus::BLOSSOM_POW_TARGET_SPACING_RATIO; static constexpr uint32_t TX_EXPIRING_SOON_THRESHOLD 3;也就是说交易默认在创建后约 20 个区块Blossom 之后按出块间隔比例放大过期当交易离过期高度不足 3 个区块时即被视为expiring soon不再参与中继与广播。另外 src/consensus/consensus.h 定义了TX_EXPIRY_HEIGHT_THRESHOLD 500000000用于区分正常过期高度与永不过期的特殊取值。createrawtransaction对expiryheight参数的校验可以在 src/rpc/rawtransaction.cpp 看到非法值负数或 ≥ 阈值会直接抛出RPC_INVALID_PARAMETER。相应的单元测试见 src/gtest/test_mempool.cpp 中的Mempool.ExpiringSoonTxRejection。其他值得关注的变化除上述主线外2.0.2-rc1 还包含一批对稳定性和正确性有意义的改动Sapling 默认 memo 规范z_sendmany在未显式提供 memo 时默认写入0xf6后跟全零的 512 字节 memo对应 src/zcash/memo.h 中static constexpr const Bytes noMemo{0xf6}的no memo定义memo 总长为 512 字节。这一约定让收方可区分无 memo与有 memo是后续 ZIP 302 memo 规范的基础TransactionBuilder 版本检查构建器在添加 Sapling spends/outputs 之前先校验交易版本与版本组 ID防止在 Overwinter 交易上错误拼接 Sapling 部件Sapling 价值池记账从磁盘加载区块索引时在内存中正确设置nSaplingValue并配套Sapling 价值池记账测试为链上总供应量的可审计性提供保障加载旧区块不再误封禁对等节点修复了加载 Sapling/Blossom 之前的区块时可能错误 ban 对等节点的问题修剪模式下启用区块中继允许在 pruning 节点上中继区块同时避免对旧区块或缺失区块发送inv测试基础设施加固TestingSetup构造/析构时保存并恢复current_pathBasicTestingSetup增加SetupNetworking调用保证测试之间不互相污染工作目录与网络环境文档与文案修正明确sendmany/z_sendmany的金额参数不是浮点数amount 以 zatoshis 整数表达并修正了误称金额为 double 精度及 ZC/ZEC 混用的表述性能基准新增 Sapling spends 与 outputs 的基准测试见 src/bench 与 src/zcbenchmarks.cpp用于跟踪 Sapling 交易性能回归。小结Zcash 2.0.2-rc1 是一个承前启后的版本它完成了 Sapling 在钱包工作流中的深度接入合并、默认地址、默认 memo同时针对 ZEC-013 从传播与交易入口两个层面落实了过期交易的 DoS 缓解。对于运维者核心动作是处理 Debian 升级时的吊销密钥问题对于开发者IsExpiringSoonTx、TX_EXPIRING_SOON_THRESHOLD、z_getnewaddress默认类型等源码细节都是理解 Zcash 交易过期模型与钱包地址策略演进的直接入口。后续的正式发布与更新记录可继续在 doc/release-notes 目录下追踪。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表