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

资讯详情

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

dusk-plonk椭圆曲线Gadget详解:JubJub点运算与固定基标量乘的完整指南

dusk-plonk椭圆曲线Gadget详解:JubJub点运算与固定基标量乘的完整指南 dusk-plonk椭圆曲线Gadget详解JubJub点运算与固定基标量乘的完整指南【免费下载链接】plonkPure Rust implementation of the PLONK ZKProof System done by the Dusk team项目地址: https://gitcode.com/gh_mirrors/plo/plonkdusk-plonk 是 Dusk 团队用纯 Rust 实现的 PLONK 零知识证明系统基于 BLS12-381 曲线。对要在电路内证明我对椭圆曲线做过某种运算的场景来说理解它的椭圆曲线 Gadget 是关键一步。本文带你从零搞懂两件事JubJub 曲线的点加法门以及固定基标量乘component_mul_generator背后的 wNAF 符号位实现原理 。一、为什么零知识电路需要椭圆曲线 Gadget在 PLONK 这类证明系统中电路里所有计算都必须拆解为多项式约束。普通整数加减只需一两个门但椭圆曲线点运算涉及除法——而除法不能直接写成低次多项式。dusk-plonk 的做法是预计算在电路编译阶段用原生电路外的曲线运算算出中间值写入 witness约束验证用专门的选择器如group_add_variable_base、group_add_fixed_base约束 witness 确实对应一次正确的点运算。这套算一遍、证一遍的模式贯穿所有 Gadget核心源码集中在src/composer/point.rs与src/composer/fixed_base.rs。二、WitnessPoint 与 TorsionFree 边界规则曲线上的点进入电路后表示为两个 witness 坐标(x, y)即WitnessPoint定义于src/composer/constraint_system/ecc.rs。但 JubJub 曲线存在 8 阶挠cofactor 8直接加一个曲线外或不在素数阶子群的点会导致证明失效。因此 dusk-plonk 设计了严格的边界规则——每个进入电路的点必须先建立子群成员资格点来源建立方式成本私有/证明者控制点assert_torsion_free_point电路内约束12 个门常量点append_constant_point编译期原生校验0 门公开点验证者协议电路外校验或用new_unchecked包装0 门assert_torsion_free_point的技巧很优雅约束一个辅助点Q满足曲线方程-u² v² 1 d·u²·v²再通过 3 次受约束的点自加证明point [8]·Q——乘以 8 的像恰好就是素数阶子群。一旦成员资格建立TorsionFreeWitnessPoint类型保证后续加法、取负、标量乘永远不会逃出子群群的封闭性因此算术门无需重复检查类型系统直接承担了安全性责任 。三、点加法2 个门完成扭曲 Edwards 曲线加法component_add_pointsrc/composer/point.rs只需2 个门就能约束一次完整的点加。关键设计降次。扭曲 Edwards 加法公式x₃ (x₁y₂ y₁x₂) / (1 d·x₁y₂·y₁x₂)直接展开会使多项式次数爆炸。dusk-plonk 引入一个辅助 witnessx1_y2 x₁·y₂把四次项压平使每个门的次数不超过 4PLONK 支持的上限。验证端对应的约束见src/proof_system/widget/ecc/curve_addition/proverkey.rs分三步一致性x₁·y₂ x1_y2x₃ 检查(x1_y2 y₁x₂) - x₃·(1 d·x1_y2·y₁x₂)y₃ 检查(y₁y₂ x₁x₂) - y₃·(1 - d·x1_y2·y₁x₂)。各项乘以分离挑战值kappa及其平方后求和再乘以选择器q_variable_group_add保证不同门之间不会互相串通伪造。变量基标量乘component_mul_point则更朴素把标量分解为 252 位逐位执行双倍 条件加每轮复用上面的加法门——简单但门数随位数线性增长约需 1000 门以上。这正是需要固定基优化的原因 ⚡。四、固定基标量乘wNAF 符号位与 256 行 Horner 循环component_mul_generatorsrc/composer/fixed_base.rs计算jubjub · G其中基点G是编译期常量。它比变量基方案快得多原理是预计算表 符号数字wNAFwNAF 分解把 252 位标量写成宽度 2 的 wNAF每个位取值为-1 / 0 / 1稀疏度更高实际点加次数减半原生预计算编译阶段算出[2ⁱ]·Gi 0…255整张表作为常量写进电路运行时只做查表Horner 累加从最高位向低位逐行执行acc 2·acc digitᵢ·Pᵢ共 256 行移位线shifted wire相邻两行共享 accumulator 坐标——下一行的a_w/b_w/d_w就是当前行的a/b/d用一行门的成本把双倍隐式完成。每行的约束见src/proof_system/widget/ecc/scalar_mul/fixed_base/proverkey.rs包括bit 一致性累加器差分必须是{-1, 0, 1}xy 一致性xy_alpha与当前 digit 匹配x/y accumulator 一致性x_alpha digit·x_beta、y_alpha digit²·(y_beta - 1) 1再套 Edwards 加法公式校验累加。安全性亮点防取模回绕伪造这是固定基 Gadget 最精妙的部分 ️。如果只做标量累加器 输入标量mod q检查恶意证明者可以在 256 个符号位里编码一个 BLS 模数q标量累加器在模 q 意义下闭合为 0而点累加器却停在非零的[q]·G。dusk-plonk 用双重范围限制封死这条路assert_canonical_jubjub_scalar两次range_check把输入限制在规范区间[0, r)先证scalar 2²⁵²再证(r-1) - scalar 2²⁵²利用模大数域下溢原理3 行前导零256 行中最高 3 行的 digit 强制为 0有效位宽只剩 253——任何由这些符号位构成的整数绝对值小于2²⁵⁴ q闭合等式从模等式变成整数等式伪造直接编译不过。代码中甚至用const _: () assert!(...)在编译期断言宽度永不越界。每次调用固定基 Gadget 增加70 个门比变量基方案节省大量资源。五、上手与延伸阅读完整示例电路examples/circuit.rs展示了append_point、assert_equal_point等 API 的真实用法集成测试tests/ecc.rs、tests/select_point.rs覆盖点运算的端到端证明深度测试含恶意 witness 注入的可靠性验证src/composer/tests/soundness/fixed_base.rs与src/composer/tests/soundness/point.rs官方规范文档PDFdocs/dusk-plonk-specs.pdf包含每个门的完整数学定义门定义与选择器src/composer/constraint_system/constraint.rs可查group_add_fixed_base/group_add_variable_base的选择器设置。六、小结Gadget门数适用场景点加法component_add_point2 门/次所有点运算的基础构件子群检查assert_torsion_free_point12 门私有点入电路的入口变量基标量乘component_mul_point~1000 门基点是秘密 witness 时固定基标量乘component_mul_generator~70 门基点为常量时提交、签名验证dusk-plonk 的椭圆曲线 Gadget 展示了 PLONK 工程的精髓用类型系统管理安全性边界、用辅助 witness 压低多项式次数、用移位线摊薄门成本、用位宽分析杜绝取模伪造。理解了这套思路你就能读懂绝大多数 PLONK 变体中的 ECC 约束设计 ✅。【免费下载链接】plonkPure Rust implementation of the PLONK ZKProof System done by the Dusk team项目地址: https://gitcode.com/gh_mirrors/plo/plonk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表