#math #seed #generate #object #merkle-proof #cs #framework

no-std seedbox

从种子生成数学对象的库

3 个不稳定版本

0.2.0 2021 年 11 月 22 日
0.1.1 2021 年 3 月 18 日
0.1.0 2020 年 10 月 20 日

#9 in #cs

Download history 34/week @ 2024-04-28 35/week @ 2024-05-05 30/week @ 2024-05-12 45/week @ 2024-05-19 44/week @ 2024-05-26 38/week @ 2024-06-02 39/week @ 2024-06-09 34/week @ 2024-06-16 32/week @ 2024-06-23 45/week @ 2024-06-30 21/week @ 2024-07-07 34/week @ 2024-07-14 32/week @ 2024-07-21 29/week @ 2024-07-28 30/week @ 2024-08-04 42/week @ 2024-08-11

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

MIT/Apache

4KB

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 hash(4,8,54) 255 0.33
jubjub oncurve+subgroup check 19
ecmul_const 254位 513 2.02
ecmul 254位 2296 9.04
poseidon merkle proof 32 7328
poseidon eddsa 3860
rollup 1024txs,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 许可证下使用,由您选择。

依赖项

约 2.2-3MB
约 42K SLoC