nonnative
库提供 R1CS 约束,用于检查证明系统中非本地字段的计算。
该库基于约束编写框架 arkworks-rs,并根据 MIT 许可证和 Apache v2 许可证发布(请参阅许可证)。
警告:这是一个学术概念验证原型;特别是,它没有经过仔细的代码审查。此实现尚未准备好用于生产使用。
该库为素数域Fp
实现了另一个素数域Fq
的域小工具,其中p != q
。
当为许多密码证明编写约束系统时,我们仅限于本地字段(例如,配对友好曲线的标量字段)。这可能会带来不便;例如,通过曲线循环的证明的递归组合要求验证者在非本地字段上进行计算。
该库使得在非本机字段上编写计算成为可能,就像在本机字段上编写计算一样。这自然会带来额外的开销,我们通过各种优化将其最小化。
因为非原生字段在 arkworks 中实现了FieldVar
特性,所以我们可以将其视为原生字段变量 ( FpVar
)。
我们可以进行标准的字段操作,例如+
、 -
和*
。请参见以下示例:
let a = NonNativeFieldVar :: < Fr , Fq > :: new_witness ( ns ! ( cs, "a" ) , || Ok ( a_value ) ) ? ;
let b = NonNativeFieldVar :: < Fr , Fq > :: new_witness ( ns ! ( cs, "b" ) , || Ok ( b_value ) ) ? ;
// add
let a_plus_b = & a + & b ;
// sub
let a_minus_b = & a - & b ;
// multiply
let a_times_b = & a * $b ;
// enforce equality
a . enforce_equal ( & b ) ? ;
每次乘法之后,我们的库在内部执行归约操作,将中间类型NonNativeFieldMulResultVar
归约为规范化类型NonNativeFieldVar
。这使用户能够无缝地执行一系列操作,而无需担心底层细节。
然而,这种手术成本高昂,而且有时是可以避免的。我们可以通过使用这种只支持添加的中间类型来减少约束的数量。要相乘,必须将其还原为NonNativeFieldVar
。请参阅下面的骨架示例。
要计算a * b + c * d
,简单(但更昂贵)的实现如下:
let a_times_b = &a * &b;
let c_times_d = &c * &d;
let res = &a_times_b + &c_times_d;
这总共执行两次归约操作,每个乘法执行一次。
我们可以使用NonNativeFieldMulResultGadget
节省一项缩减,如下所示:
let a_times_b = a.mul_without_reduce(&b)?;
let c_times_d = c.mul_without_reduce(&d)?;
let res = (&a_times_b + &c_times_d)?.reduce()?;
它仅执行一次归约操作,并且比第一个实现快大约 2 倍。
该库采用了使用多个肢体来表示目标字段的元素的标准思想。例如,TargetField 中的元素可以由三个 BaseField 元素(即肢体)表示。
TargetField -> limb 1, limb 2, and limb 3 (each is a BaseField element)
经过一些计算后,肢体变得不堪重负,需要缩小,以便进行更多的计算。
我们大量使用 [KPS18] 和 [OWWB20] 中的优化技术。这两部作品都有自己的开源库:xJsnark 和bellman-bignat。与它们相比,这个库适用于 arkworks 环境,并且还针对密度而不是约束数量进行了优化,这对于像 Marlin 这样的全息零知识证明很有用。
该库根据以下任一许可证获得许可,具体由您自行决定。
除非您另有明确说明,否则您提交的包含在本库中的任何贡献均应获得上述双重许可(如 Apache v2 许可证中所定义),没有任何附加条款或条件。
[KPS18]:AE Kosba、C. Papamanthou 和 E. Shi。 “xJsnark:高效可验证计算框架”,第 39 届安全与隐私研讨会论文集,ser。标准普尔 '18,2018 年,第 944–961 页。
[OWWB20]:A. Ozdemir、RS Wahby、B. Whitehat 和 D. Boneh。 “使用高效集合累加器扩展可验证计算”,第 29 届 USENIX 安全研讨会论文集,ser。安全 '20, 2020。