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个直接使用)
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