mirror of
https://github.com/saymrwulf/pasta_curves-source.git
synced 2026-09-07 20:30:34 +00:00
Add example to MockProver documentation
Also fixes a bug in MockProver::verify (which was exposing an internal implementation detail as an incorrect row numbering).
This commit is contained in:
parent
64b06735bf
commit
49f1598c0e
1 changed files with 77 additions and 1 deletions
78
src/dev.rs
78
src/dev.rs
|
|
@ -52,6 +52,82 @@ pub enum VerifyFailure {
|
||||||
/// other than "something is invalid". `MockProver` can be used to figure out _why_ these
|
/// other than "something is invalid". `MockProver` can be used to figure out _why_ these
|
||||||
/// are invalid: it stores all the private inputs along with the circuit internals, and
|
/// are invalid: it stores all the private inputs along with the circuit internals, and
|
||||||
/// then checks every constraint manually.
|
/// then checks every constraint manually.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use halo2::{
|
||||||
|
/// arithmetic::FieldExt,
|
||||||
|
/// dev::{MockProver, VerifyFailure},
|
||||||
|
/// pasta::Fp,
|
||||||
|
/// plonk::{Advice, Assignment, Circuit, Column, ConstraintSystem, Error},
|
||||||
|
/// };
|
||||||
|
/// const K: u32 = 5;
|
||||||
|
///
|
||||||
|
/// struct MyConfig {
|
||||||
|
/// a: Column<Advice>,
|
||||||
|
/// b: Column<Advice>,
|
||||||
|
/// c: Column<Advice>,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// struct MyCircuit {
|
||||||
|
/// a: Option<u64>,
|
||||||
|
/// b: Option<u64>,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl<F: FieldExt> Circuit<F> for MyCircuit {
|
||||||
|
/// type Config = MyConfig;
|
||||||
|
///
|
||||||
|
/// fn configure(meta: &mut ConstraintSystem<F>) -> MyConfig {
|
||||||
|
/// let a = meta.advice_column();
|
||||||
|
/// let b = meta.advice_column();
|
||||||
|
/// let c = meta.advice_column();
|
||||||
|
///
|
||||||
|
/// meta.create_gate(|meta| {
|
||||||
|
/// let a = meta.query_advice(a, 0);
|
||||||
|
/// let b = meta.query_advice(b, 0);
|
||||||
|
/// let c = meta.query_advice(c, 0);
|
||||||
|
///
|
||||||
|
/// // BUG: Should be a * b - c
|
||||||
|
/// a * b + c
|
||||||
|
/// });
|
||||||
|
///
|
||||||
|
/// MyConfig { a, b, c }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// fn synthesize(&self, cs: &mut impl Assignment<F>, config: MyConfig) -> Result<(), Error> {
|
||||||
|
/// cs.assign_advice(config.a, 0, || {
|
||||||
|
/// self.a.map(|v| F::from_u64(v)).ok_or(Error::SynthesisError)
|
||||||
|
/// })?;
|
||||||
|
/// cs.assign_advice(config.b, 0, || {
|
||||||
|
/// self.b.map(|v| F::from_u64(v)).ok_or(Error::SynthesisError)
|
||||||
|
/// })?;
|
||||||
|
/// cs.assign_advice(config.c, 0, || {
|
||||||
|
/// self.a
|
||||||
|
/// .and_then(|a| self.b.map(|b| F::from_u64(a * b)))
|
||||||
|
/// .ok_or(Error::SynthesisError)
|
||||||
|
/// })
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// // Assemble the private inputs to the circuit.
|
||||||
|
/// let circuit = MyCircuit {
|
||||||
|
/// a: Some(2),
|
||||||
|
/// b: Some(4),
|
||||||
|
/// };
|
||||||
|
///
|
||||||
|
/// // This circuit has no public inputs.
|
||||||
|
/// let aux = vec![];
|
||||||
|
///
|
||||||
|
/// let prover = MockProver::<Fp>::run(K, &circuit, aux).unwrap();
|
||||||
|
/// assert_eq!(
|
||||||
|
/// prover.verify(),
|
||||||
|
/// Err(VerifyFailure::Gate {
|
||||||
|
/// gate_index: 0,
|
||||||
|
/// row: 0
|
||||||
|
/// })
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct MockProver<F: Group> {
|
pub struct MockProver<F: Group> {
|
||||||
n: u32,
|
n: u32,
|
||||||
|
|
@ -201,7 +277,7 @@ impl<F: FieldExt> MockProver<F> {
|
||||||
{
|
{
|
||||||
return Err(VerifyFailure::Gate {
|
return Err(VerifyFailure::Gate {
|
||||||
gate_index,
|
gate_index,
|
||||||
row: row as usize,
|
row: (row - n) as usize,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue