1个不稳定版本

0.0.1 2023年11月5日

#46 in #plonk


用于 zkrollup

MPL-2.0 许可证

170KB
3K SLoC

PLONK

Build Status Repository Documentation

这是BLS12-381上的PLONK证明系统的纯Rust实现

此库包含了一个模块化的KZG10实现,作为默认的多项式承诺方案。

免责声明:此库目前不稳定,并且还需要进行彻底的安全分析。使用风险自负。

使用方法

use zero_plonk::prelude::*;
use rand_core::OsRng;

// Implement a circuit that checks:
// 1) a + b = c where C is a PI
// 2) a <= 2^6
// 3) b <= 2^5
// 4) a * b = d where D is a PI
// 5) JubJub::GENERATOR * e(JubJubScalar) = f where F is a Public Input
#[derive(Debug, Default)]
pub struct TestCircuit {
    a: BlsScalar,
    b: BlsScalar,
    c: BlsScalar,
    d: BlsScalar,
    e: JubJubScalar,
    f: JubJubAffine,
}

impl Circuit for TestCircuit {
    fn circuit<C>(&self, composer: &mut C) -> Result<(), Error>
    where
        C: Composer,
    {
        let a = composer.append_witness(self.a);
        let b = composer.append_witness(self.b);

        // Make first constraint a + b = c
        let constraint =
            Constraint::new().left(1).right(1).public(-self.c).a(a).b(b);

        composer.append_gate(constraint);

        // Check that a and b are in range
        composer.component_range(a, 1 << 6);
        composer.component_range(b, 1 << 5);

        // Make second constraint a * b = d
        let constraint =
            Constraint::new().mult(1).public(-self.d).a(a).b(b);

        composer.append_gate(constraint);

        let e = composer.append_witness(self.e);
        let scalar_mul_result = composer
            .component_mul_generator(e, jub_jub::GENERATOR_EXTENDED)?;

        // Apply the constraint
        composer.assert_equal_public_point(scalar_mul_result, self.f);

        Ok(())
    }
}

let label = b"transcript-arguments";
let pp = PublicParameters::setup(1 << 12, &mut OsRng)
    .expect("failed to setup");

let (prover, verifier) = Compiler::compile::<TestCircuit>(&pp, label)
    .expect("failed to compile circuit");

// Generate the proof and its public inputs
let (proof, public_inputs) = prover
    .create_proof(&mut OsRng, &TestCircuit::default())
    .expect("failed to prove");

// Verify the generated proof
verifier
    .verify(&proof, &public_inputs)
    .expect("failed to verify proof");

特性

此crate包含多种特性,以下将简要介绍

  • alloc:启用分配器的使用以及执行Proof构造和验证的能力。没有此特性,将无法进行任何证明或验证。其缺失仅使dusk-plonk导出某些固定大小的数据结构,如Proof,这在没有分配器的no_std环境中可能很有用。
  • std:启用std的使用以及某些证明和验证操作中的rayon并行化。它还使用椭圆曲线依赖项的std版本,利用了dusk-bls12-381parallel特性。默认情况下,这是crate中启用的高级功能。
  • debug:启用运行时调试后端。将输出CDF文件到在CDF_OUTPUT环境变量中定义的路径。如果使用,则必须使用debug = true进行编译。有关更多信息,请参阅cargo book推荐的方法是导出std输出和std错误,并将它们放置在文本文件中,以便有效地分析门。
  • canon:启用特定数据结构的规范序列化,这对于在Dusk堆栈的其余部分中集成此库非常有用,特别是对于存储目的。

文档

此存储库中有两种主要的文档类型

  • crate文档。这提供了关于库提供的所有函数的信息,以及它导出的数据结构的文档。要检查这些内容,请随时访问文档页面或运行make docmake doc-internal

  • 注意。这是文档的一个特定子集,它解释了PLONK的关键数学概念以及它们是如何通过数学证明来工作的。要检查它,请运行make doc并打开生成的文档,这些文档将位于/target下,您可以使用浏览器打开。

性能

Apple M1上进行的基准测试,针对大小为2^16的约束

  • 证明时间:7.871s
  • 验证时间:7.643ms (此时间将不会因电路大小而变化。)

要获取更多结果,请运行cargo bench以获取关于约束数的基准测试的完整报告。

致谢

  • AztecProtocol/Barretenberg的参考实现
  • FFT模块和KZG10模块分别从zexe/zcash和scipr-lab获取并修改。

许可

此代码根据Mozilla公共许可证版本2.0(MPL-2.0)许可。有关更多信息,请参阅LICENSE

关于

dusk团队设计。

贡献

  • 如果您想为此存储库/项目做出贡献,请检查CONTRIBUTING.md
  • 如果您想报告错误或请求添加新功能,请在此存储库上打开一个问题。

依赖关系

~6MB
~122K SLoC