#有限域 #默克尔证明 #电路 #zk-SNARKs #数学 #默克尔树 #整数

无std ff-uint

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

11个版本

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日

#2064 in 密码学

Download history 30/week @ 2024-04-08 31/week @ 2024-04-15 31/week @ 2024-04-22 28/week @ 2024-04-29 35/week @ 2024-05-06 28/week @ 2024-05-13 37/week @ 2024-05-20 29/week @ 2024-05-27 35/week @ 2024-06-03 42/week @ 2024-06-10 20/week @ 2024-06-17 34/week @ 2024-06-24 32/week @ 2024-07-01 21/week @ 2024-07-08 34/week @ 2024-07-15 20/week @ 2024-07-22

113每月下载量
用于 9 个crate(2个直接使用)

MIT/Apache

89KB
2K SLoC

Fawkes-Crypto - zkSNARKs框架

摘要

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

该框架旨在使用 circom 和 sapling-crypto 的最佳实践来构建电路。

最终字段和电路数学被包装,并实现了操作符,所以,在大多数情况下,如果你想键入 a+b,你可以这样做。

示例

这里是一个 Merkle 树实现的示例。你还可以在这里查看 rollup 这里

#[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 是基于有序链表的输入的稀疏线性组合,因此我们使用 SignalU(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 proof 32 7328
poseidon eddsa 3860
rollup 1024 txs,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许可证下使用,您可选择。

依赖

~3–4.5MB
~76K SLoC