#r1cs #finite-fields #prime-field #nonnative

无 std ark-nonnative-field

非原生域设备约束

2个不稳定版本

0.3.0 2021年6月6日
0.2.0 2021年3月25日

#9 in #r1cs

Download history 724/week @ 2024-03-15 632/week @ 2024-03-22 496/week @ 2024-03-29 599/week @ 2024-04-05 627/week @ 2024-04-12 642/week @ 2024-04-19 510/week @ 2024-04-26 625/week @ 2024-05-03 851/week @ 2024-05-10 430/week @ 2024-05-17 338/week @ 2024-05-24 375/week @ 2024-05-31 323/week @ 2024-06-07 324/week @ 2024-06-14 341/week @ 2024-06-21 206/week @ 2024-06-28

1,250 每月下载量
24 个crate(3个直接) 中使用

MIT/Apache

91KB
2K SLoC

非原生域设备

nonnative 库提供了一种在证明系统中检查非原生域上计算的R1CS约束。

该库基于约束编写框架 arkworks-rs,并使用MIT许可证和Apache v2许可证发布(见许可证)。

警告:这是一个学术性的概念原型;特别是,它尚未经过仔细的代码审查。此实现尚未准备好用于生产。

概述

该库实现了在另一个素域 Fq 上定义的素域 Fp 的域设备。

在编写许多密码证明的约束系统时,我们受限于原生域(例如,配对友好曲线的标量域)。这可能不方便;例如,通过曲线循环的递归组合证明需要验证者在非原生域上计算。

该库使得能够在与原生域相同的方式下编写非原生域上的计算。这自然引入了额外的开销,我们通过各种优化来最小化这些开销。

用法

因为非原生域在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)?;

高级优化

在每个乘法之后,我们的库内部执行一个 reduce 操作,将中间类型 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;

这总共进行了两次 reduce 操作,每个乘法一次。


我们可以通过使用 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()?;

它只执行一个 reduce 操作,比第一个实现快大约 2 倍。

灵感和基本设计

该库采用使用多个 limbs 来表示目标字段元素的常规想法。例如,TargetField 中的一个元素可能由三个 BaseField 元素表示(即 limbs)。

TargetField -> limb 1, limb 2, and limb 3 (each is a BaseField element)

经过一些计算后,limbs 变得过多,需要 reduced,以便进行更多计算。

我们大量使用了 [KPS18][OWWB20] 中的优化技术。这两项工作都有自己的开源库:xJsnarkbellman-bignat。与它们相比,此库与 arkworks 环境一起工作,并且也针对密度进行了优化,而不是约束的数量,这对于像 Marlin 这样的全息零知识证明很有用。

许可证

根据您的意愿,该库受以下任一许可证的许可。

除非您明确声明,否则您提交给此库的任何贡献都应双重许可,如上所述(如 Apache v2 许可证中定义),而不附加任何其他条款或条件。

参考文献

[KPS18]: A. E. Kosba, C. Papamanthou, 和 E. Shi. "xJsnark: 一个高效的验证计算框架," 在 第 39 届安全与隐私研讨会,S&P '18,2018 年,第 944-961 页。

[OWWB20]: A. Ozdemir, R. S. Wahby, B. Whitehat 和 D. Boneh. "使用有效的集合累积器扩展验证计算," 在 第 29 届 USENIX 安全研讨会,Security '20,2020 年。

依赖项

~5MB
~102K SLoC