39个稳定版本 (4个主要版本)

4.4.0 2022年5月5日
4.3.3 2022年1月23日
4.3.2 2021年12月21日
4.3.0 2021年11月22日
0.2.3 2020年3月26日

#2987 in 魔法豆

每月下载量22次
用于 4 个crate(3个直接使用)

MIT/Apache

220KB
6K SLoC

Fawkes-Crypto - zkSNARKs框架

摘要

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

该框架旨在采用从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是输入的稀疏线性组合,基于有序链表,因此我们使用U(N)复杂度进行Signal算术。使用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 获取。

电路改进

  • 我们使用不确定子群检查,大部分计算只作为见证执行,并在电路中进行配因子乘法。
  • 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 许可证下使用,由您选择。

依赖项

~13MB
~385K SLoC