use std::marker::PhantomData;
use axiom_eth::{
halo2_base::{
gates::circuit::{BaseCircuitParams, BaseConfig},
utils::ScalarField,
},
halo2_proofs::{
circuit::{Layouter, SimpleFloorPlanner},
halo2curves::bn256::{Bn256, Fr, G1Affine},
plonk::{keygen_vk_custom, Circuit, ConstraintSystem, Error, VerifyingKey},
poly::kzg::commitment::ParamsKZG,
},
rlc::circuit::{RlcCircuitParams, RlcConfig},
};
use super::metadata::AxiomV2CircuitMetadata;
pub(super) const DUMMY_K: u32 = 7;
#[derive(Clone)]
struct DummyAxiomCircuit<F> {
metadata: AxiomV2CircuitMetadata,
_marker: PhantomData<F>,
}
#[derive(Clone, Debug)]
pub enum MaybeRlcConfig<F: ScalarField> {
Rlc(RlcConfig<F>),
Base(BaseConfig<F>),
}
impl<F: ScalarField> Circuit<F> for DummyAxiomCircuit<F> {
type Config = MaybeRlcConfig<F>;
type FloorPlanner = SimpleFloorPlanner;
type Params = AxiomV2CircuitMetadata;
fn without_witnesses(&self) -> Self {
self.clone()
}
fn params(&self) -> Self::Params {
self.metadata.clone()
}
fn configure_with_params(
meta: &mut ConstraintSystem<F>,
metadata: Self::Params,
) -> Self::Config {
let num_phase = metadata.num_challenge.len();
assert!(num_phase == 1 || num_phase == 2, "only support 2 phases for now");
let base_circuit_params = BaseCircuitParams {
k: DUMMY_K as usize,
num_advice_per_phase: metadata
.num_advice_per_phase
.iter()
.map(|x| *x as usize)
.collect(),
num_fixed: metadata.num_fixed as usize,
num_lookup_advice_per_phase: metadata
.num_lookup_advice_per_phase
.iter()
.map(|x| *x as usize)
.collect(),
lookup_bits: Some(DUMMY_K as usize - 1), num_instance_columns: metadata.num_instance.len(),
};
if num_phase == 1 {
assert!(metadata.num_rlc_columns == 0, "rlc columns only allowed in phase1");
MaybeRlcConfig::Base(BaseConfig::configure(meta, base_circuit_params))
} else {
let rlc_circuit_params = RlcCircuitParams {
base: base_circuit_params,
num_rlc_columns: metadata.num_rlc_columns as usize,
};
MaybeRlcConfig::Rlc(RlcConfig::configure(meta, rlc_circuit_params))
}
}
fn configure(_: &mut ConstraintSystem<F>) -> Self::Config {
unreachable!("must use configure_with_params")
}
fn synthesize(
&self,
_config: Self::Config,
mut layouter: impl Layouter<F>,
) -> Result<(), Error> {
layouter.assign_region(|| "dummy", |_region| Ok(()))
}
}
pub(crate) fn dummy_vk_from_metadata(
params: &ParamsKZG<Bn256>,
metadata: AxiomV2CircuitMetadata,
) -> anyhow::Result<VerifyingKey<G1Affine>> {
let dummy_circuit = DummyAxiomCircuit::<Fr> { metadata, _marker: PhantomData };
let vk = keygen_vk_custom(params, &dummy_circuit, false)?;
Ok(vk)
}