十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Zcash 5.3.0-rc1 版本亮点解析:钱包批量扫描内存优化与 Orchard 根字节序修复

Zcash 5.3.0-rc1 版本亮点解析:钱包批量扫描内存优化与 Orchard 根字节序修复 Zcash 5.3.0-rc1 版本亮点解析钱包批量扫描内存优化与 Orchard 根字节序修复【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash本指南基于当前仓库 release-notes-5.3.0-rc1.md 展开聚焦该候选版本中两个直接影响钱包与 RPC 用户的 Notable changes批量试解密batch trial decryption扫描器的内存优化与指标化以及finalorchardroot/finalRoot字段字节序byte ordering的一致性修复。阅读本文后你将理解 zcashd 钱包扫描的内存模型与 100 MiB 限制的实现机理、四个新增 Prometheus 指标的含义与观测方式以及 Orchard 根哈希字段字节序修复的前因后果并能对照源码与测试用例自行验证。版本背景与变更总览zcashd 5.3.0-rc1 是 5.3.0 版本的第一个候选发布版release candidate其 Notable changes 全部集中在钱包与 RPC 层面不涉及共识规则变更。整个版本的主要工作可分为两条主线钱包性能续篇5.2.0 引入的“多线程批量 Sapling 输出试解密”带来了性能提升但也暴露出内存占用持续增长、最终触发 OOM abort 的问题。5.3.0-rc1 定位并修复了增长根因为批量扫描器加上 100 MiB 内存上限并新增 4 个可观测指标。RPC 输出一致性修复getblock的finalorchardroot与z_gettreestate的orchard.commitments.finalRoot此前与getrawtransaction的orchard.anchor在字节序上不一致本次统一了内部表示的字节序。Changelog 部分完整收录了自 5.2.0 以来的全部提交记录176 条署名记录涉及约 30 位贡献者涵盖依赖升级Rust 1.62.1 → 1.64.0、Clang/libcxx LLVM 14.0.6、Boost 1.80.0、libsecp256k1 子树更新等、构建系统调整、测试框架改进与文档迁移等常规维护内容。钱包批量扫描从 OOM 隐患到 100 MiB 内存上限问题的由来多线程批处理的内存失控zcashd 5.2.0 将 Sapling 输出的试解密trial decryption改为多线程批量执行通过批处理摊销椭圆曲线运算、显著加快钱包同步时的扫描速度。然而部分节点在长期运行后出现内存持续增长最终导致 OOMout-of-memoryabort。根本原因并不在于试解密计算本身而在于批量任务batch task的生命周期管理任务被提交到 rayon 线程池rayon::spawn_fifo后其持有的大量输出数据、解密结果通道crossbeam channel中的待回收项等堆内存没有及时、准确地被释放加之对tags向量等内部数据结构的堆占用估计缺失使得内存占用随扫描持续推进而单调递增。源码中的修复落地修复工作主要体现在 src/rust/src/wallet_scanner.rs可以拆解为三层1. 动态内存占用跟踪DynamicUsage批量扫描器为堆内存建立统一的度量口径。Batch结构体的dynamic_usage()对tags、ivks、outputs、repliers四个字段分别求和其中tags向量的内存占用是本次修复中明确补上的关键一项对应提交记录 Include memory usage of thetagsvectorimplA, D, Output DynamicUsage for BatchA, D, Output { fn dynamic_usage(self) - usize { self.tags.dynamic_usage() self.ivks.dynamic_usage() self.outputs.dynamic_usage() self.repliers.dynamic_usage() } }// src/rust/src/wallet_scanner.rs 中相关字段定义 struct BatchA, D: BatchDomain, Output: ShieldedOutputD, ENC_CIPHERTEXT_SIZE { tags: VecA, ivks: VecD::IncomingViewingKey, outputs: Vec(D, Output), repliers: VecOutputReplierA, D, }2. 任务级堆占用上报与回收记账WithUsage与WithUsageTask配合实现“任务完成即释放”的记账逻辑每个任务创建时记录自身堆占用own_usage通过ArcAtomicUsize共享的running_usage计数器累加任务执行完成后fetch_sub减去对应占用从而让整体“正在运行任务的内存占用”实时回落见 src/rust/src/wallet_scanner.rs 第 185–207 行附近。3. 只保留成功解密的输出此前扫描器会为批中每个输出都保存一份结果占位即使解密失败输出并不属于本钱包。本次改为仅存储试解密成功的DecryptedNote含ivk_tag、recipient、note、memo失败项直接丢弃对应的 channelreplier显著减少常驻内存。此外还改进了对 rayon 生成任务大小的估算并引入 cxx 桥接在 C 侧管理 Sapling proving context。100 MiB 内存上限的执行机制批量扫描器现在具有 100 MiB 的硬性内存上限。其执行逻辑是BatchRunner在向 rayon 线程池派发新批次前会读取running_usage正在运行任务的堆占用并与其自身累积的动态占用求和当总占用超过限制时暂停派发新任务等待现有任务完成并回收内存后再继续。BatchRunner自身的DynamicUsage实现把累积任务占用与运行中任务占用合并计算为限流决策提供统一依据let running_usage self.running_tasks.dynamic_usage(); // 以 running_usage 与累积动态占用之和作为限流判断依据对普通用户而言这一上限意味着即使链上活动频繁、输出数量巨大批量扫描器的常驻堆内存也不会无界增长从而消除了此前可能出现的 OOM abort 隐患。新增 Prometheus 指标把扫描器看到什么告诉运维当通过-prometheusport启动节点指标服务时该参数在 src/init.cpp 中注册格式为-prometheusportport用于以 Prometheus exposition 格式暴露节点指标5.3.0-rc1 新增以下 4 个指标指标名类型含义zcashd.wallet.batchscanner.outputs.scannedcounter批量扫描器已试解密的输出总数带kind标签如saplingzcashd.wallet.batchscanner.size.transactionsgauge批量扫描器当前持有的交易数zcashd.wallet.batchscanner.usage.bytesgauge批量扫描器当前动态堆内存占用字节zcashd.wallet.synced.block.heightgauge钱包已同步到的区块高度前三个指标的定义位于 src/rust/src/wallet_scanner.rsconst METRIC_OUTPUTS_SCANNED: str zcashd.wallet.batchscanner.outputs.scanned; const METRIC_SIZE_TXS: str zcashd.wallet.batchscanner.size.transactions;outputs.scanned在每个批处理任务执行完batch::try_note_decryption后按kind标签累加计数usage.bytes与size.transactions由BatchRunner的DynamicUsage计算。zcashd.wallet.synced.block.height则定义在 src/validationinterface.cpp由CWallet::ChainTip回调在钱包处理完新链尖后更新。这四个指标组合起来可以让运维人员直接回答三个问题扫描进度outputs.scanned的增量与synced.block.height是否跟上链尖、当前内存压力usage.bytes是否逼近 100 MiB 上限、批队列规模size.transactions。配合 contrib/metrics/prometheus.yaml 等监控配置即可对钱包同步进行实时告警。RPC 字段字节序统一finalorchardroot / finalRoot / orchard.anchor不一致的由来Orchard 是 Zcash 的屏蔽支付协议其承诺树commitment tree的根哈希在 zcashd 内部存在两种表示链上/区块头中使用的规范字节序以及zcashd内部实现中因数据布局而产生的字节翻转byte-flipped表示。此前getblock返回的finalorchardroot字段z_gettreestate返回的orchard.commitments.finalRoot字段直接输出了内部字节翻转后的哈希而getrawtransaction的orchard.anchor字段输出的是规范字节序导致同一根哈希在不同 RPC 接口中呈现出不同的 hex 字符串给脚本化校验和跨接口比对造成困扰。修复后的行为5.3.0-rc1 将前两个字段改为与orchard.anchor一致的字节序。对应实现位于 src/rpc/blockchain.cpp// getblock 中 finalorchardroot 的输出 result.pushKV(finalorchardroot, HexStr(finalOrchardRootBytes.begin(), finalOrchardRootBytes.end())); // z_gettreestate 中 orchard.commitments.finalRoot 的输出 orchard_commitments.pushKV(finalRoot, HexStr(finalOrchardRootBytes.begin(), finalOrchardRootBytes.end()));两者均改为直接以规范字节序序列化因此现在可以从任意接口取到一致的根哈希值。注意这是字节序展示修复而非树状态变更不涉及共识已有区块数据无需重新同步。测试验证该修复配套了专门的 RPC 测试 qa/rpc-tests/finalorchardroot.py测试覆盖了在创世块及无 Orchard 交易的区块中finalorchardroot应为空 Orchard 根ORCHARD_TREE_EMPTY_ROOT或缺失、挖出 Orchard 交易后根值正确更新、以及不同高度下getblock返回的finalorchardroot与内部树状态保持一致等场景。另外 qa/rpc-tests/feature_zip221.py 也通过getblock(...)[finalorchardroot]校验该字段。orchard_reorg.py测试还验证了没有 Orchard 交易的区块中finalorchardroot保持不变印证了该字段语义的稳定性。Changelog 要点速览完整 Changelog共 176 条可从 release-notes-5.3.0-rc1.md 查阅与 Notable changes 直接相关的提交包括Jack Grigg52 条本版主力实现批量扫描器动态内存跟踪、100 MiB 内存上限、仅保存成功解密输出、新增outputs.scanned指标、wallet.synced.block.height指标同时完成 Rust 依赖升级与zcash-inspect二进制工具支持交易数据、P2PKH 签名、地址、助记词短语、屏蔽签名哈希等检视能力。Greg Pfeil11 条新增finalorchardrootRPC 测试并修复其序列化即本版字节序修复的直接作者另将部分用户路径规范化、新增rpc-testsmake target。Daira Hopwood8 条包含 Include memory usage of thetagsvector 这一关键内存修复、librustzcash 提交跟进适配DiversifierKey变更、试解密改用预计算的 epk/ivk。Kris Nuttycombe7 条更新z_sendmany帮助文档说明从统一地址发送时的行为、将文档迁移回 zcashd book。依赖与构建leveldb 与 crc32c 子树同步、Rust 1.62.1 → 1.64.0、LLVM 14.0.6、Boost 1.80.0、libsecp256k1 两次子树更新并禁用其 OpenSSL 测试、ShellCheck 代码风格检查全面接入 CI。其他miner: fix MAXSOLS挖矿常量修复、qos.sh 增加 IPv6 支持、genbuild.sh 的 git 仓库检测修复等。升级与观测建议运行 5.2.x 且遭遇钱包同步期内存增长或 OOM 的节点升级到 5.3.0-rc1 后批量扫描器将受 100 MiB 内存上限约束无需额外配置即可获得该保护可通过usage.bytes指标持续确认占用水平。若需观测上述指标使用-prometheusportport启动 zcashd参数说明见 src/init.cpp即可通过 Prometheus 抓取zcashd.wallet.batchscanner.*与zcashd.wallet.synced.block.height。依赖finalorchardroot/finalRoot做链上状态校验的脚本请重新比对期望值——修复后其与orchard.anchor字节序一致旧脚本中若手工做过字节翻转需移除对应逻辑。5.3.0-rc1 为候选发布版升级生产节点前建议结合 doc/release-notes/release-notes-5.3.0-rc1.md 的完整 Changelog 与 SECURITY.md 评估正式版本发布后请以正式版为准。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表