#fields #framework #derive #zk-snarks #interfacing #integer #fawkes-crypto

ff-uint_derive

用于构建和与固定大小的整数和有限域交互的库

10 个版本

0.2.4 2022 年 3 月 10 日
0.2.2 2022 年 1 月 23 日
0.2.0 2021 年 11 月 22 日
0.1.7 2021 年 7 月 28 日
0.1.1 2020 年 9 月 23 日

#38 in #integers

Download history 40/week @ 2024-03-24 73/week @ 2024-03-31 36/week @ 2024-04-07 43/week @ 2024-04-14 45/week @ 2024-04-21 34/week @ 2024-04-28 34/week @ 2024-05-05 27/week @ 2024-05-12 43/week @ 2024-05-19 35/week @ 2024-05-26 39/week @ 2024-06-02 36/week @ 2024-06-09 32/week @ 2024-06-16 28/week @ 2024-06-23 19/week @ 2024-06-30 53/week @ 2024-07-07

每月下载量 134 次
10 个 crate 中使用(通过 ff-uint

MIT/Apache 许可

34KB
764

Fawkes-Crypto - zkSNARKs 框架

摘要

Fawkes-Crypto 是一个轻量级的框架,用于在 bellman 中构建电路,使用 groth16 证明系统和 BN254 曲线。

该框架旨在使用从 circom 和 sapling-crypto 中获得的最佳实践进行电路构建。

最终域和电路数学被封装,并实现了运算符,因此,在大多数情况下,如果您想键入 a+b,您就可以这样做。

示例

以下是一个 Merkle 树实现的示例。您还可以在此处检查 rollup here

#[derive(Clone, Signal)]
#[Value="MerkleProof<CS::F, L>"]
pub struct CMerkleProof<'a, CS: ConstraintSystem, const L: usize> {
    pub sibling: SizedVec<CNum<'a, CS>, L>,
    pub path: SizedVec<CBool<'a, CS>, L>
}


pub fn c_poseidon_merkle_proof_root<'a, CS: ConstraintSystem, const L: usize>(
    leaf:  &CNum<'a, CS>, 
    proof: &CMerkleProof<'a, CS, L>,
    params: &PoseidonParams<CS::F>
) -> CNum<'a, CS> {
    let mut root = leaf.clone();
    for (p, s) in proof.path.iter().zip(proof.sibling.iter()) {
        let first = s.switch(p, &root); 
        let second = &root + s - &first;
        root = c_poseidon( [first, second].as_ref(), params);
    }
    root
}

Signal 是基于有序链表的输入的稀疏线性组合,所以我们使用 Signal 进行运算,其复杂度为 U(N)。使用 Signal,bellman 只在您真正需要时才会分配额外的输入(例如,在您乘以两个非常数 Signal 的情况下)。如果您使用常数或零 Signal 进行乘法,则不会分配额外的输入。

基准测试

电路 约束 每位
poseidon 哈希(4,8,54) 255 0.33
jubjub 在线+子群检查 19
ecmul_const 254 位 513 2.02
ecmul 254 位 2296 9.04
poseidon merkle 证明 32 7328
poseidon eddsa 3860
rollup 1024 交易,2^32 集合 35695616

在 i9-9900K 上,rollup 被证明需要 628 秒。

rollup 的源代码可在 https://github.com/snjax/fawkes-rollup 获取。

电路改进

  • 我们使用不确定子群检查,将大部分计算作为见证-only执行,并在电路中进行配子乘法。
  • ecmul和ecmul_cost操作假设基点位于子群中。这允许我们使用Montgomery(0, 0)点作为加法器初始状态。然后加法器永远不会达到零点和子群点,因为(0, 0)不在子群中,我们可以安全地使用便宜montgomery_add电路。
  • 改进的compconstant电路。同样的PR已提交到circomlib 在此处

更多信息请参阅ethresear.ch 此处.

作者

Igor Gulamov

免责声明

Fawkes-Crypto已审计,但处于实验性,提供原样,使用风险自负。

许可证

Fawkes-Crypto可在Apache License 2.0许可证或MIT许可证下使用,任选其一。

依赖关系

约2.5MB
约55K SLoC