1个不稳定版本
0.0.1 | 2023年11月5日 |
---|
#46 in #plonk
用于 zkrollup
170KB
3K SLoC
PLONK
这是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-381
的parallel
特性。默认情况下,这是crate中启用的高级功能。debug
:启用运行时调试后端。将输出CDF文件到在CDF_OUTPUT
环境变量中定义的路径。如果使用,则必须使用debug = true
进行编译。有关更多信息,请参阅cargo book。 推荐的方法是导出std输出和std错误,并将它们放置在文本文件中,以便有效地分析门。canon
:启用特定数据结构的规范序列化,这对于在Dusk堆栈的其余部分中集成此库非常有用,特别是对于存储目的。
文档
此存储库中有两种主要的文档类型
-
crate文档。这提供了关于库提供的所有函数的信息,以及它导出的数据结构的文档。要检查这些内容,请随时访问文档页面或运行
make doc
或make 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