Skip to content

Commit

Permalink
fix committee update contract generation
Browse files Browse the repository at this point in the history
  • Loading branch information
nulltea committed Dec 2, 2023
1 parent 4838834 commit 1d7eb08
Show file tree
Hide file tree
Showing 7 changed files with 1,385 additions and 69 deletions.
1,326 changes: 1,305 additions & 21 deletions contracts/snark-verifiers/sync_step.sol

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ setup-step network *k='22':
cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey -k $2 setup

setup-committee-update network *k='25':
cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey -k 18 \
cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey -k 18 \
--verifier-k $2 --verifier-pk-path ./build/committee_update_verifier_$1.pkey setup

gen-verifier-step network:
cargo run -r -- circuit sync-step -p ./build/sync_step_$1.pkey gen-verifier -o ./contracts/snark-verifiers/sync_step_$1.sol

gen-verifier-committee-update network:
cargo run -r -- circuit aggregation -c ./lightclient-circuits/config/aggregation.json --app-pk-path ./build/committee_update.pkey --app-config-path ./lightclient-circuits/config/committee_update.json -i ./rotation -o evm-verifier ./contracts/snark-verifiers/committee_update_aggregated.yul
cargo run -r -- circuit committee-update -p ./build/committee_update_$1.pkey --verifier-pk-path ./build/committee_update_verifier_$1.pkey \
gen-verifier -o ./contracts/snark-verifiers/committee_update_$1.sol

build-contracts:
cd contracts && forge build
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion lightclient-circuits/src/committee_update_circuit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ mod tests {
use std::fs;

use crate::{
aggregation::AggregationConfigPinning, util::Halo2ConfigPinning,
aggregation_circuit::AggregationConfigPinning, util::Halo2ConfigPinning,
witness::CommitteeRotationArgs,
};

Expand Down
2 changes: 1 addition & 1 deletion lightclient-circuits/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub mod gadget;
pub mod util;
pub mod witness;

pub mod aggregation;
pub mod aggregation_circuit;
pub mod committee_update_circuit;
pub mod sync_step_circuit;

Expand Down
1 change: 1 addition & 0 deletions prover/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ preprocessor.workspace = true
eth-types.workspace = true

# misc
ark-std.workspace = true
itertools.workspace = true
serde.workspace = true
serde_json.workspace = true
Expand Down
118 changes: 74 additions & 44 deletions prover/src/cli.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::args::BaseArgs;
use crate::args::{OperationCmd, ProofCmd};

use ark_std::{end_timer, start_timer};
use lightclient_circuits::{
committee_update_circuit::CommitteeUpdateCircuit,
halo2_proofs::halo2curves::bn256::{Bn256, Fr},
Expand All @@ -13,7 +14,9 @@ use std::path::PathBuf;
use std::{fs::File, future::Future, io::Write, path::Path};

#[cfg(feature = "experimental")]
use halo2_solidity_verifier_new::{SolidityGenerator, BatchOpenScheme, compile_solidity, Evm, encode_calldata};
use halo2_solidity_verifier_new::{
compile_solidity, encode_calldata, BatchOpenScheme, Evm, SolidityGenerator,
};

ethers::contract::abigen!(
SnarkVerifierSol,
Expand Down Expand Up @@ -70,9 +73,19 @@ where

Ok(())
}
OperationCmd::GenVerifier{ solidity_out, estimate_gas } => {
OperationCmd::GenVerifier {
solidity_out,
estimate_gas,
} => {
let params = gen_srs(StepCircuit::<S, Fr>::get_degree(&cfg_path));
gen_evm_verifier::<StepCircuit<S, Fr>>(&params, &pk_path, &cfg_path, solidity_out, estimate_gas)
gen_evm_verifier::<StepCircuit<S, Fr>>(
&params,
&pk_path,
&cfg_path,
solidity_out,
estimate_gas,
Default::default(),
)
}
}
}
Expand All @@ -84,25 +97,32 @@ where
pk_path,
} => {
let cfg_path = get_config_path(&pk_path, &base_args.config_dir);
match operation {
OperationCmd::Setup => {
let params = gen_srs(k);

let pk = CommitteeUpdateCircuit::<S, Fr>::create_pk(
&params,
&pk_path,
&cfg_path,
&Default::default(),
);
let gen_dummy_snark = |k: u32| {
let params = gen_srs(k);

let dummy_snark = CommitteeUpdateCircuit::<S, Fr>::gen_snark_shplonk(
&params,
&pk,
&cfg_path,
None::<String>,
&Default::default(),
)
.map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?;
let pk = CommitteeUpdateCircuit::<S, Fr>::create_pk(
&params,
&pk_path,
&cfg_path,
&Default::default(),
);

CommitteeUpdateCircuit::<S, Fr>::gen_snark_shplonk(
&params,
&pk,
&cfg_path,
None::<String>,
&Default::default(),
)
.map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))
};

match operation {
OperationCmd::Setup => {
let timer = start_timer!(|| "gen committee update verifier witness");
let dummy_snark = gen_dummy_snark(k)?;
end_timer!(timer);

let verifier_params = gen_srs(verifier_k);
let verifier_cfg_path =
Expand All @@ -117,9 +137,28 @@ where

Ok(())
}
OperationCmd::GenVerifier{ solidity_out, estimate_gas } => {
let params = gen_srs(AggregationCircuit::get_degree(&cfg_path));
gen_evm_verifier::<StepCircuit<S, Fr>>(&params, &pk_path, &cfg_path, solidity_out, estimate_gas)
OperationCmd::GenVerifier {
solidity_out,
estimate_gas,
} => {
let timer = start_timer!(|| "gen committee update verifier witness");
let dummy_snark =
gen_dummy_snark(CommitteeUpdateCircuit::<S, Fr>::get_degree(&cfg_path))?;
end_timer!(timer);

let verifier_cfg_path =
get_config_path(&verifier_pk_path, &base_args.config_dir);
let verifier_params =
gen_srs(AggregationCircuit::get_degree(&verifier_cfg_path));

gen_evm_verifier::<AggregationCircuit>(
&verifier_params,
&verifier_pk_path,
&verifier_cfg_path,
solidity_out,
estimate_gas,
vec![dummy_snark],
)
}
}
}
Expand All @@ -142,11 +181,9 @@ fn gen_evm_verifier<Circuit: AppCircuit>(
cfg_path: &Path,
mut path_out: PathBuf,
estimate_gas: bool,
) -> eyre::Result<()>
where
Circuit::Witness: Default,
{
let pk = Circuit::read_pk(params, pk_path, &Default::default());
default_witness: Circuit::Witness,
) -> eyre::Result<()> {
let pk = Circuit::read_pk(params, pk_path, &default_witness);

let generator = SolidityGenerator::new(params, pk.get_vk(), BatchOpenScheme::Bdfg21, 1);

Expand All @@ -168,14 +205,9 @@ where
);
let verifier_address = evm.create(verifier_creation_code);

let (proof, instances) = Circuit::gen_evm_proof_shplonk(
params,
&pk,
cfg_path,
None,
&Circuit::Witness::default(),
)
.map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?;
let (proof, instances) =
Circuit::gen_evm_proof_shplonk(params, &pk, cfg_path, None, &default_witness)
.map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?;
let calldata = encode_calldata(None, &proof, &instances[0]);
let (gas_cost, output) = evm.call(verifier_address, calldata);
assert_eq!(output, [vec![0; 31], vec![1]].concat());
Expand All @@ -192,15 +224,13 @@ fn gen_evm_verifier<Circuit: AppCircuit>(
cfg_path: &Path,
mut path_out: PathBuf,
estimate_gas: bool,
) -> eyre::Result<()>
where
Circuit::Witness: Default,
{
let pk = Circuit::read_pk(params, pk_path, &Default::default());

default_witness: Circuit::Witness,
) -> eyre::Result<()> {
let pk = Circuit::read_pk(params, pk_path, &default_witness);

path_out.set_extension("yul");
let deplyment_code =
Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &Default::default())
Circuit::gen_evm_verifier_shplonk(params, &pk, Some(path_out.clone()), &default_witness)
.map_err(|e| eyre::eyre!("Failed to EVM verifier: {}", e))?;
println!("yul size: {}", deplyment_code.len());

Expand All @@ -217,7 +247,7 @@ where
&pk,
cfg_path,
Some(deplyment_code),
&Circuit::Witness::default(),
&default_witness,
)
.map_err(|e| eyre::eyre!("Failed to generate proof: {}", e))?;
}
Expand Down

0 comments on commit 1d7eb08

Please sign in to comment.