mirror of https://github.com/zcash/halo2.git
Merge pull request #144 from zcash/bump-halo2
Migrate to latest `halo2::plonk::Circuit` API
This commit is contained in:
commit
f3c9b6cedc
|
@ -62,5 +62,5 @@ name = "small"
|
||||||
harness = false
|
harness = false
|
||||||
|
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
halo2 = { git = "https://github.com/zcash/halo2.git", rev = "d04b532368d05b505e622f8cac4c0693574fbd93" }
|
halo2 = { git = "https://github.com/zcash/halo2.git", rev = "d5be50a8488a433a9b20f1127ff1e21f121c5a2c" }
|
||||||
zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "cc533a9da4f6a7209a7be05f82b12a03969152c9" }
|
zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "cc533a9da4f6a7209a7be05f82b12a03969152c9" }
|
||||||
|
|
|
@ -4,6 +4,7 @@ use std::mem;
|
||||||
|
|
||||||
use group::Curve;
|
use group::Curve;
|
||||||
use halo2::{
|
use halo2::{
|
||||||
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
plonk,
|
plonk,
|
||||||
poly::{EvaluationDomain, LagrangeCoeff, Polynomial, Rotation},
|
poly::{EvaluationDomain, LagrangeCoeff, Polynomial, Rotation},
|
||||||
transcript::{Blake2bRead, Blake2bWrite},
|
transcript::{Blake2bRead, Blake2bWrite},
|
||||||
|
@ -28,6 +29,11 @@ pub struct Circuit {}
|
||||||
|
|
||||||
impl plonk::Circuit<pallas::Base> for Circuit {
|
impl plonk::Circuit<pallas::Base> for Circuit {
|
||||||
type Config = ();
|
type Config = ();
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
Circuit {}
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut plonk::ConstraintSystem<pallas::Base>) -> Self::Config {
|
fn configure(meta: &mut plonk::ConstraintSystem<pallas::Base>) -> Self::Config {
|
||||||
// Placeholder so the proving key is correctly built.
|
// Placeholder so the proving key is correctly built.
|
||||||
|
@ -42,8 +48,8 @@ impl plonk::Circuit<pallas::Base> for Circuit {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
_cs: &mut impl plonk::Assignment<pallas::Base>,
|
|
||||||
_config: Self::Config,
|
_config: Self::Config,
|
||||||
|
_layouter: impl Layouter<pallas::Base>,
|
||||||
) -> Result<(), plonk::Error> {
|
) -> Result<(), plonk::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -426,9 +426,9 @@ mod tests {
|
||||||
use group::{prime::PrimeCurveAffine, Curve, Group};
|
use group::{prime::PrimeCurveAffine, Curve, Group};
|
||||||
|
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
plonk::{Assignment, Circuit, ConstraintSystem, Error},
|
plonk::{Circuit, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
use pasta_curves::pallas;
|
use pasta_curves::pallas;
|
||||||
|
|
||||||
|
@ -439,6 +439,11 @@ mod tests {
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
impl Circuit<pallas::Base> for MyCircuit {
|
impl Circuit<pallas::Base> for MyCircuit {
|
||||||
type Config = EccConfig;
|
type Config = EccConfig;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
MyCircuit {}
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
||||||
let advices = [
|
let advices = [
|
||||||
|
@ -469,10 +474,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<pallas::Base>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<pallas::Base>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
let chip = EccChip::construct(config.clone());
|
let chip = EccChip::construct(config.clone());
|
||||||
|
|
||||||
// Load 10-bit lookup table. In the Action circuit, this will be
|
// Load 10-bit lookup table. In the Action circuit, this will be
|
||||||
|
@ -586,6 +590,8 @@ mod tests {
|
||||||
let root = root.titled("Ecc Chip Layout", ("sans-serif", 60)).unwrap();
|
let root = root.titled("Ecc Chip Layout", ("sans-serif", 60)).unwrap();
|
||||||
|
|
||||||
let circuit = MyCircuit {};
|
let circuit = MyCircuit {};
|
||||||
halo2::dev::circuit_layout(&circuit, &root).unwrap();
|
halo2::dev::CircuitLayout::default()
|
||||||
|
.render(&circuit, &root)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -603,10 +603,10 @@ mod tests {
|
||||||
use ff::PrimeField;
|
use ff::PrimeField;
|
||||||
use halo2::{
|
use halo2::{
|
||||||
arithmetic::FieldExt,
|
arithmetic::FieldExt,
|
||||||
circuit::{layouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
pasta::Fp,
|
pasta::Fp,
|
||||||
plonk::{Assignment, Circuit, ConstraintSystem, Error},
|
plonk::{Circuit, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
use pasta_curves::pallas;
|
use pasta_curves::pallas;
|
||||||
|
|
||||||
|
@ -620,6 +620,11 @@ mod tests {
|
||||||
|
|
||||||
impl Circuit<Fp> for PermuteCircuit {
|
impl Circuit<Fp> for PermuteCircuit {
|
||||||
type Config = Pow5T3Config<Fp>;
|
type Config = Pow5T3Config<Fp>;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
PermuteCircuit {}
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<Fp>) -> Pow5T3Config<Fp> {
|
fn configure(meta: &mut ConstraintSystem<Fp>) -> Pow5T3Config<Fp> {
|
||||||
let state = [
|
let state = [
|
||||||
|
@ -633,11 +638,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<Fp>,
|
|
||||||
config: Pow5T3Config<Fp>,
|
config: Pow5T3Config<Fp>,
|
||||||
|
mut layouter: impl Layouter<Fp>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = layouter::SingleChipLayouter::new(cs)?;
|
|
||||||
|
|
||||||
let initial_state = layouter.assign_region(
|
let initial_state = layouter.assign_region(
|
||||||
|| "prepare initial state",
|
|| "prepare initial state",
|
||||||
|mut region| {
|
|mut region| {
|
||||||
|
@ -702,6 +705,7 @@ mod tests {
|
||||||
assert_eq!(prover.verify(), Ok(()))
|
assert_eq!(prover.verify(), Ok(()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
struct HashCircuit {
|
struct HashCircuit {
|
||||||
message: Option<[Fp; 2]>,
|
message: Option<[Fp; 2]>,
|
||||||
// For the purpose of this test, witness the result.
|
// For the purpose of this test, witness the result.
|
||||||
|
@ -711,6 +715,11 @@ mod tests {
|
||||||
|
|
||||||
impl Circuit<Fp> for HashCircuit {
|
impl Circuit<Fp> for HashCircuit {
|
||||||
type Config = Pow5T3Config<Fp>;
|
type Config = Pow5T3Config<Fp>;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<Fp>) -> Pow5T3Config<Fp> {
|
fn configure(meta: &mut ConstraintSystem<Fp>) -> Pow5T3Config<Fp> {
|
||||||
let state = [
|
let state = [
|
||||||
|
@ -724,10 +733,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<Fp>,
|
|
||||||
config: Pow5T3Config<Fp>,
|
config: Pow5T3Config<Fp>,
|
||||||
|
mut layouter: impl Layouter<Fp>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = layouter::SingleChipLayouter::<'_, Fp, _>::new(cs)?;
|
|
||||||
let chip = Pow5T3Chip::construct(config.clone());
|
let chip = Pow5T3Chip::construct(config.clone());
|
||||||
|
|
||||||
let message = layouter.assign_region(
|
let message = layouter.assign_region(
|
||||||
|
@ -817,6 +825,8 @@ mod tests {
|
||||||
message: None,
|
message: None,
|
||||||
output: None,
|
output: None,
|
||||||
};
|
};
|
||||||
halo2::dev::circuit_layout(&circuit, &root).unwrap();
|
halo2::dev::CircuitLayout::default()
|
||||||
|
.render(&circuit, &root)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,10 +293,10 @@ pub trait HashDomains<C: CurveAffine>: Clone + Debug {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
pasta::pallas,
|
pasta::pallas,
|
||||||
plonk::{Assignment, Circuit, ConstraintSystem, Error},
|
plonk::{Circuit, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
|
@ -322,6 +322,11 @@ mod tests {
|
||||||
|
|
||||||
impl Circuit<pallas::Base> for MyCircuit {
|
impl Circuit<pallas::Base> for MyCircuit {
|
||||||
type Config = (EccConfig, SinsemillaConfig, SinsemillaConfig);
|
type Config = (EccConfig, SinsemillaConfig, SinsemillaConfig);
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
MyCircuit {}
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
||||||
|
@ -393,10 +398,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<pallas::Base>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<pallas::Base>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
let ecc_chip = EccChip::construct(config.0);
|
let ecc_chip = EccChip::construct(config.0);
|
||||||
|
|
||||||
// The two `SinsemillaChip`s share the same lookup table.
|
// The two `SinsemillaChip`s share the same lookup table.
|
||||||
|
@ -503,6 +507,8 @@ mod tests {
|
||||||
let root = root.titled("SinsemillaHash", ("sans-serif", 60)).unwrap();
|
let root = root.titled("SinsemillaHash", ("sans-serif", 60)).unwrap();
|
||||||
|
|
||||||
let circuit = MyCircuit {};
|
let circuit = MyCircuit {};
|
||||||
halo2::dev::circuit_layout(&circuit, &root).unwrap();
|
halo2::dev::CircuitLayout::default()
|
||||||
|
.render(&circuit, &root)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,15 +149,16 @@ pub mod tests {
|
||||||
use ff::PrimeFieldBits;
|
use ff::PrimeFieldBits;
|
||||||
use halo2::{
|
use halo2::{
|
||||||
arithmetic::FieldExt,
|
arithmetic::FieldExt,
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
pasta::pallas,
|
pasta::pallas,
|
||||||
plonk::{Assignment, Circuit, ConstraintSystem, Error},
|
plonk::{Circuit, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
|
|
||||||
use rand::random;
|
use rand::random;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
struct MyCircuit {
|
struct MyCircuit {
|
||||||
leaf: Option<pallas::Base>,
|
leaf: Option<pallas::Base>,
|
||||||
leaf_pos: Option<u32>,
|
leaf_pos: Option<u32>,
|
||||||
|
@ -166,6 +167,11 @@ pub mod tests {
|
||||||
|
|
||||||
impl Circuit<pallas::Base> for MyCircuit {
|
impl Circuit<pallas::Base> for MyCircuit {
|
||||||
type Config = (MerkleConfig, MerkleConfig);
|
type Config = (MerkleConfig, MerkleConfig);
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
||||||
let advices = [
|
let advices = [
|
||||||
|
@ -239,11 +245,9 @@ pub mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<pallas::Base>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<pallas::Base>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
|
|
||||||
// Load generator table (shared across both configs)
|
// Load generator table (shared across both configs)
|
||||||
SinsemillaChip::load(config.0.sinsemilla_config.clone(), &mut layouter)?;
|
SinsemillaChip::load(config.0.sinsemilla_config.clone(), &mut layouter)?;
|
||||||
|
|
||||||
|
@ -268,13 +272,15 @@ pub mod tests {
|
||||||
let computed_final_root =
|
let computed_final_root =
|
||||||
path.calculate_root(layouter.namespace(|| "calculate root"), leaf)?;
|
path.calculate_root(layouter.namespace(|| "calculate root"), leaf)?;
|
||||||
|
|
||||||
|
if let Some(leaf_pos) = self.leaf_pos {
|
||||||
// The expected final root
|
// The expected final root
|
||||||
let pos_bool = i2lebsp::<32>(self.leaf_pos.unwrap() as u64);
|
let pos_bool = i2lebsp::<32>(leaf_pos as u64);
|
||||||
let path: Option<Vec<pallas::Base>> = self.merkle_path.map(|path| path.to_vec());
|
let path: Option<Vec<pallas::Base>> = self.merkle_path.map(|path| path.to_vec());
|
||||||
let final_root = hash_path(self.leaf.unwrap(), &pos_bool, &path.unwrap());
|
let final_root = hash_path(self.leaf.unwrap(), &pos_bool, &path.unwrap());
|
||||||
|
|
||||||
// Check the computed final root against the expected final root.
|
// Check the computed final root against the expected final root.
|
||||||
assert_eq!(computed_final_root.value().unwrap(), final_root);
|
assert_eq!(computed_final_root.value().unwrap(), final_root);
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -339,4 +345,20 @@ pub mod tests {
|
||||||
let prover = MockProver::run(11, &circuit, vec![]).unwrap();
|
let prover = MockProver::run(11, &circuit, vec![]).unwrap();
|
||||||
assert_eq!(prover.verify(), Ok(()))
|
assert_eq!(prover.verify(), Ok(()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "dev-graph")]
|
||||||
|
#[test]
|
||||||
|
fn print_merkle_chip() {
|
||||||
|
use plotters::prelude::*;
|
||||||
|
|
||||||
|
let root = BitMapBackend::new("merkle-path-layout.png", (1024, 7680)).into_drawing_area();
|
||||||
|
root.fill(&WHITE).unwrap();
|
||||||
|
let root = root.titled("MerkleCRH Path", ("sans-serif", 60)).unwrap();
|
||||||
|
|
||||||
|
let circuit = MyCircuit::default();
|
||||||
|
halo2::dev::CircuitLayout::default()
|
||||||
|
.show_labels(false)
|
||||||
|
.render(&circuit, &root)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,9 +135,9 @@ mod tests {
|
||||||
use bigint::U256;
|
use bigint::U256;
|
||||||
use ff::PrimeField;
|
use ff::PrimeField;
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::{MockProver, VerifyFailure},
|
dev::{MockProver, VerifyFailure},
|
||||||
plonk::{Assignment, Circuit, ConstraintSystem, Error, Selector},
|
plonk::{Circuit, ConstraintSystem, Error, Selector},
|
||||||
poly::Rotation,
|
poly::Rotation,
|
||||||
};
|
};
|
||||||
use pasta_curves::pallas;
|
use pasta_curves::pallas;
|
||||||
|
@ -158,6 +158,11 @@ mod tests {
|
||||||
|
|
||||||
impl<const RANGE: usize> Circuit<pallas::Base> for MyCircuit<RANGE> {
|
impl<const RANGE: usize> Circuit<pallas::Base> for MyCircuit<RANGE> {
|
||||||
type Config = Config;
|
type Config = Config;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
MyCircuit(self.0)
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
|
||||||
let selector = meta.selector();
|
let selector = meta.selector();
|
||||||
|
@ -175,11 +180,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<pallas::Base>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<pallas::Base>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
|
|
||||||
layouter.assign_region(
|
layouter.assign_region(
|
||||||
|| "range constrain",
|
|| "range constrain",
|
||||||
|mut region| {
|
|mut region| {
|
||||||
|
@ -209,10 +212,7 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
prover.verify(),
|
prover.verify(),
|
||||||
Err(vec![VerifyFailure::Constraint {
|
Err(vec![VerifyFailure::Constraint {
|
||||||
gate_index: 0,
|
constraint: ((0, "range check").into(), 0, "").into(),
|
||||||
gate_name: "range check",
|
|
||||||
constraint_index: 0,
|
|
||||||
constraint_name: "",
|
|
||||||
row: 0
|
row: 0
|
||||||
}])
|
}])
|
||||||
);
|
);
|
||||||
|
|
|
@ -210,14 +210,15 @@ mod tests {
|
||||||
use super::super::UtilitiesInstructions;
|
use super::super::UtilitiesInstructions;
|
||||||
use super::{CondSwapChip, CondSwapConfig, CondSwapInstructions};
|
use super::{CondSwapChip, CondSwapConfig, CondSwapInstructions};
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
plonk::{Any, Assignment, Circuit, Column, ConstraintSystem, Error},
|
plonk::{Any, Circuit, Column, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
use pasta_curves::{arithmetic::FieldExt, pallas::Base};
|
use pasta_curves::{arithmetic::FieldExt, pallas::Base};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn cond_swap() {
|
fn cond_swap() {
|
||||||
|
#[derive(Default)]
|
||||||
struct MyCircuit<F: FieldExt> {
|
struct MyCircuit<F: FieldExt> {
|
||||||
a: Option<F>,
|
a: Option<F>,
|
||||||
b: Option<F>,
|
b: Option<F>,
|
||||||
|
@ -226,6 +227,11 @@ mod tests {
|
||||||
|
|
||||||
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
||||||
type Config = CondSwapConfig;
|
type Config = CondSwapConfig;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
||||||
let advices = [
|
let advices = [
|
||||||
|
@ -248,10 +254,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<F>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<F>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
let chip = CondSwapChip::<F>::construct(config.clone());
|
let chip = CondSwapChip::<F>::construct(config.clone());
|
||||||
|
|
||||||
// Load the pair and the swap flag into the circuit.
|
// Load the pair and the swap flag into the circuit.
|
||||||
|
|
|
@ -131,14 +131,15 @@ mod tests {
|
||||||
use super::super::UtilitiesInstructions;
|
use super::super::UtilitiesInstructions;
|
||||||
use super::{EnableFlagChip, EnableFlagConfig, EnableFlagInstructions};
|
use super::{EnableFlagChip, EnableFlagConfig, EnableFlagInstructions};
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::{MockProver, VerifyFailure},
|
dev::{MockProver, VerifyFailure},
|
||||||
plonk::{Any, Assignment, Circuit, Column, ConstraintSystem, Error},
|
plonk::{Any, Circuit, Column, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
use pasta_curves::{arithmetic::FieldExt, pallas::Base};
|
use pasta_curves::{arithmetic::FieldExt, pallas::Base};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn enable_flag() {
|
fn enable_flag() {
|
||||||
|
#[derive(Default)]
|
||||||
struct MyCircuit<F: FieldExt> {
|
struct MyCircuit<F: FieldExt> {
|
||||||
value: Option<F>,
|
value: Option<F>,
|
||||||
enable_flag: Option<bool>,
|
enable_flag: Option<bool>,
|
||||||
|
@ -146,6 +147,11 @@ mod tests {
|
||||||
|
|
||||||
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
||||||
type Config = EnableFlagConfig;
|
type Config = EnableFlagConfig;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
||||||
let advices = [meta.advice_column(), meta.advice_column()];
|
let advices = [meta.advice_column(), meta.advice_column()];
|
||||||
|
@ -162,10 +168,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<F>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<F>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
let chip = EnableFlagChip::<F>::construct(config.clone());
|
let chip = EnableFlagChip::<F>::construct(config.clone());
|
||||||
|
|
||||||
// Load the value and the enable flag into the circuit.
|
// Load the value and the enable flag into the circuit.
|
||||||
|
@ -219,10 +224,7 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
prover.verify(),
|
prover.verify(),
|
||||||
Err(vec![VerifyFailure::Constraint {
|
Err(vec![VerifyFailure::Constraint {
|
||||||
gate_index: 0,
|
constraint: ((0, "Enable flag").into(), 0, "").into(),
|
||||||
gate_name: "Enable flag",
|
|
||||||
constraint_index: 0,
|
|
||||||
constraint_name: "",
|
|
||||||
row: 1,
|
row: 1,
|
||||||
}])
|
}])
|
||||||
);
|
);
|
||||||
|
|
|
@ -369,9 +369,9 @@ mod tests {
|
||||||
use crate::spec::lebs2ip;
|
use crate::spec::lebs2ip;
|
||||||
use ff::{Field, PrimeFieldBits};
|
use ff::{Field, PrimeFieldBits};
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::{MockProver, VerifyFailure},
|
dev::{MockProver, VerifyFailure},
|
||||||
plonk::{Assignment, Circuit, ConstraintSystem, Error},
|
plonk::{Circuit, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
use pasta_curves::{arithmetic::FieldExt, pallas};
|
use pasta_curves::{arithmetic::FieldExt, pallas};
|
||||||
|
|
||||||
|
@ -379,6 +379,7 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn lookup_range_check() {
|
fn lookup_range_check() {
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
struct MyCircuit<F: FieldExt + PrimeFieldBits> {
|
struct MyCircuit<F: FieldExt + PrimeFieldBits> {
|
||||||
num_words: usize,
|
num_words: usize,
|
||||||
_marker: PhantomData<F>,
|
_marker: PhantomData<F>,
|
||||||
|
@ -386,6 +387,11 @@ mod tests {
|
||||||
|
|
||||||
impl<F: FieldExt + PrimeFieldBits> Circuit<F> for MyCircuit<F> {
|
impl<F: FieldExt + PrimeFieldBits> Circuit<F> for MyCircuit<F> {
|
||||||
type Config = LookupRangeCheckConfig<F, K>;
|
type Config = LookupRangeCheckConfig<F, K>;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
||||||
let running_sum = meta.advice_column();
|
let running_sum = meta.advice_column();
|
||||||
|
@ -404,11 +410,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<F>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<F>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
|
|
||||||
// Load table_idx
|
// Load table_idx
|
||||||
config.load(&mut layouter)?;
|
config.load(&mut layouter)?;
|
||||||
|
|
||||||
|
@ -491,6 +495,15 @@ mod tests {
|
||||||
|
|
||||||
impl<F: FieldExt + PrimeFieldBits> Circuit<F> for MyCircuit<F> {
|
impl<F: FieldExt + PrimeFieldBits> Circuit<F> for MyCircuit<F> {
|
||||||
type Config = LookupRangeCheckConfig<F, K>;
|
type Config = LookupRangeCheckConfig<F, K>;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
MyCircuit {
|
||||||
|
element: None,
|
||||||
|
num_bits: self.num_bits,
|
||||||
|
_marker: self._marker,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
||||||
let running_sum = meta.advice_column();
|
let running_sum = meta.advice_column();
|
||||||
|
@ -509,11 +522,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<F>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<F>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
|
|
||||||
// Load table_idx
|
// Load table_idx
|
||||||
config.load(&mut layouter)?;
|
config.load(&mut layouter)?;
|
||||||
|
|
||||||
|
|
|
@ -225,14 +225,15 @@ mod tests {
|
||||||
use super::super::UtilitiesInstructions;
|
use super::super::UtilitiesInstructions;
|
||||||
use super::{PLONKChip, PLONKConfig, PLONKInstructions};
|
use super::{PLONKChip, PLONKConfig, PLONKInstructions};
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{layouter::SingleChipLayouter, Layouter},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
plonk::{Any, Assignment, Circuit, Column, ConstraintSystem, Error},
|
plonk::{Any, Circuit, Column, ConstraintSystem, Error},
|
||||||
};
|
};
|
||||||
use pasta_curves::{arithmetic::FieldExt, pallas::Base};
|
use pasta_curves::{arithmetic::FieldExt, pallas::Base};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn plonk_util() {
|
fn plonk_util() {
|
||||||
|
#[derive(Default)]
|
||||||
struct MyCircuit<F: FieldExt> {
|
struct MyCircuit<F: FieldExt> {
|
||||||
a: Option<F>,
|
a: Option<F>,
|
||||||
b: Option<F>,
|
b: Option<F>,
|
||||||
|
@ -240,6 +241,11 @@ mod tests {
|
||||||
|
|
||||||
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
||||||
type Config = PLONKConfig;
|
type Config = PLONKConfig;
|
||||||
|
type FloorPlanner = SimpleFloorPlanner;
|
||||||
|
|
||||||
|
fn without_witnesses(&self) -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
fn configure(meta: &mut ConstraintSystem<F>) -> Self::Config {
|
||||||
let advices = [
|
let advices = [
|
||||||
|
@ -260,10 +266,9 @@ mod tests {
|
||||||
|
|
||||||
fn synthesize(
|
fn synthesize(
|
||||||
&self,
|
&self,
|
||||||
cs: &mut impl Assignment<F>,
|
|
||||||
config: Self::Config,
|
config: Self::Config,
|
||||||
|
mut layouter: impl Layouter<F>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut layouter = SingleChipLayouter::new(cs)?;
|
|
||||||
let chip = PLONKChip::<F>::construct(config.clone());
|
let chip = PLONKChip::<F>::construct(config.clone());
|
||||||
|
|
||||||
let a = chip.load_private(layouter.namespace(|| "a"), config.a, self.a)?;
|
let a = chip.load_private(layouter.namespace(|| "a"), config.a, self.a)?;
|
||||||
|
|
Loading…
Reference in New Issue