Skip to content

Commit

Permalink
spec ttest full prover
Browse files Browse the repository at this point in the history
  • Loading branch information
ec2 committed Sep 19, 2023
1 parent b7eaea4 commit fae8b30
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 12 deletions.
6 changes: 3 additions & 3 deletions lightclient-circuits/src/sync_step_circuit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ impl<S: Spec, F: Field> SyncStepCircuit<S, F> {
Ok(vec![pi_field])
}

fn instances(args: SyncStepArgs<S>) -> Vec<Vec<bn256::Fr>> {
pub fn instance(args: SyncStepArgs<S>) -> Vec<Vec<bn256::Fr>> {
let mut input: [u8; 64] = [0; 64];

let mut attested_slot = args.attested_block.slot.to_le_bytes().to_vec();
Expand Down Expand Up @@ -593,7 +593,7 @@ mod tests {
let (assigned_instances, args) = load_circuit_with_data(&mut builder, K);
let circuit = Eth2CircuitBuilder::prover(assigned_instances, builder, break_points);

let instances = SyncStepCircuit::<Test, bn256::Fr>::instances(args);
let instances = SyncStepCircuit::<Test, bn256::Fr>::instance(args);
let proof = full_prover(&params, &pk, circuit, instances.clone());

assert!(full_verifier(&params, pk.get_vk(), proof, instances))
Expand All @@ -608,7 +608,7 @@ mod tests {
let mut builder = ShaThreadBuilder::prover();
let (assigned_instances, args) = load_circuit_with_data(&mut builder, K);
let circuit = Eth2CircuitBuilder::prover(assigned_instances, builder, break_points);
let instances = SyncStepCircuit::<Test, bn256::Fr>::instances(args);
let instances = SyncStepCircuit::<Test, bn256::Fr>::instance(args);

let num_instance = vec![instances[0].len()];
let deployment_code = gen_evm_verifier_shplonk::<
Expand Down
83 changes: 74 additions & 9 deletions lightclient-circuits/tests/step.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ use light_client_verifier::{ZiplineUpdateWitness, ZiplineUpdateWitnessCapella};
use lightclient_circuits::builder::Eth2CircuitBuilder;
use lightclient_circuits::gadget::crypto::ShaThreadBuilder;
use lightclient_circuits::sync_step_circuit::SyncStepCircuit;
use lightclient_circuits::util::ThreadBuilderBase;
use lightclient_circuits::util::{AppCircuitExt, ThreadBuilderBase};
use lightclient_circuits::witness::SyncStepArgs;
use rstest::fixture;
use rstest::rstest;
use snark_verifier_sdk::CircuitExt;
use ssz_rs::prelude::*;
Expand Down Expand Up @@ -225,12 +226,8 @@ fn to_witness<
// args.beacon_state_root = args.attested_block.state_root.as_ref().to_vec();
args
}
#[rstest]
fn test_verify(
#[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")]
#[exclude("deneb*")]
path: PathBuf,
) {

fn read_test_files_and_gen_witness(path: PathBuf) -> SyncStepArgs<Minimal> {
let bootstrap: LightClientBootstrap =
load_snappy_ssz(&path.join("bootstrap.ssz_snappy").to_str().unwrap()).unwrap();
let meta: TestMeta = load_yaml(&path.join("meta.yaml").to_str().unwrap());
Expand Down Expand Up @@ -265,10 +262,17 @@ fn test_verify(
committee: bootstrap.current_sync_committee.clone(),
light_client_update: updates[0].clone(),
};

to_witness(&zipline_witness, genesis_validators_root.clone())
}
#[rstest]
fn test_step_mock(
#[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")]
#[exclude("deneb*")]
path: PathBuf,
) {
let spectre_args = read_test_files_and_gen_witness(path);
const K: usize = 20;
let mut builder = ShaThreadBuilder::mock();
let spectre_args = to_witness(&zipline_witness, genesis_validators_root.clone());
let assigned_instances = load_circuit_with_data(&spectre_args, &mut builder, K);

let circuit = Eth2CircuitBuilder::mock(assigned_instances, builder);
Expand All @@ -279,6 +283,67 @@ fn test_verify(
end_timer!(timer);
}

#[rstest]
fn test_step_proofgen(
#[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")]
#[exclude("deneb*")]
path: PathBuf,
) {
const K: usize = 20;
let spectre_args = read_test_files_and_gen_witness(path);

let (params, pk, break_points) = SyncStepCircuit::<Minimal, bn256::Fr>::setup(K, None);

let mut builder = ShaThreadBuilder::prover();
let assigned_instances = load_circuit_with_data(&spectre_args, &mut builder, K);
let circuit = Eth2CircuitBuilder::prover(assigned_instances, builder, break_points);

let instances = SyncStepCircuit::<Minimal, bn256::Fr>::instance(spectre_args);
let timer = start_timer!(|| "sync circuit prover");
let proof = lightclient_circuits::util::full_prover(&params, &pk, circuit, instances.clone());
end_timer!(timer);
let timer = start_timer!(|| "sync circuit verifier");
assert!(lightclient_circuits::util::full_verifier(
&params,
pk.get_vk(),
proof,
instances
));
end_timer!(timer);
}
#[rstest]
fn test_step_evm_verify(
#[files("../consensus-spec-tests/tests/minimal/capella/light_client/sync/pyspec_tests/**")]
#[exclude("deneb*")]
path: PathBuf,
) {
const K: usize = 20;
let spectre_args = read_test_files_and_gen_witness(path);

let (params, pk, break_points) = SyncStepCircuit::<Minimal, bn256::Fr>::setup(K, None);

let mut builder = ShaThreadBuilder::prover();
let assigned_instances = load_circuit_with_data(&spectre_args, &mut builder, K);
let circuit = Eth2CircuitBuilder::prover(assigned_instances, builder, break_points);

let instances = SyncStepCircuit::<Minimal, bn256::Fr>::instance(spectre_args);
let num_instance = vec![instances[0].len()];

let timer = start_timer!(|| "sync evm prover");

let deployment_code = snark_verifier_sdk::evm::gen_evm_verifier_shplonk::<
Eth2CircuitBuilder<bn256::Fr, ShaThreadBuilder<bn256::Fr>>,
>(&params, pk.get_vk(), num_instance, None);

let proof =
snark_verifier_sdk::evm::gen_evm_proof_shplonk(&params, &pk, circuit, instances.clone());

end_timer!(timer);
let timer = start_timer!(|| "sync evm verify");
snark_verifier_sdk::evm::evm_verify(deployment_code, instances, proof);
end_timer!(timer);
}

fn load_circuit_with_data(
args: &SyncStepArgs<Minimal>,
thread_pool: &mut ShaThreadBuilder<bn256::Fr>,
Expand Down

0 comments on commit fae8b30

Please sign in to comment.