Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
552 changes: 552 additions & 0 deletions starky/src/cross_table_lookup.rs

Large diffs are not rendered by default.

164 changes: 82 additions & 82 deletions starky/src/fibonacci_stark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,13 +120,13 @@ mod test {
use crate::config::StarkConfig;
use crate::consumer::basic::RecursiveConstraintConsumer;
use crate::proof::StarkProofWithPublicInputs;
use crate::prover::prove;
use crate::prover::prove_no_ctl;
use crate::recursive_verifier::{
add_virtual_stark_proof_with_pis, set_stark_proof_with_pis_target,
verify_stark_proof_circuit,
};
use crate::stark_testing::{test_stark_circuit_constraints, test_stark_low_degree};
use crate::verifier::verify_stark_proof;
use crate::verifier::verify_stark_proof_no_ctl;

fn fibonacci<F: Field>(n: usize, x0: F, x1: F) -> F {
(0..n).fold((x0, x1), |x, _| (x.1, x.0 + x.1)).1
Expand All @@ -144,15 +144,15 @@ mod test {
let public_inputs = vec![F::ZERO, F::ONE, fibonacci(num_rows - 1, F::ZERO, F::ONE)];
let stark = S::new(num_rows);
let trace = stark.generate_trace(public_inputs[0], public_inputs[1]);
let proof = prove::<F, C, S, D>(
stark,
let proof = prove_no_ctl::<F, C, S, D>(
&stark,
&config,
trace,
&trace,
public_inputs,
&mut TimingTree::default(),
)?;

verify_stark_proof(stark, proof, &config)
verify_stark_proof_no_ctl(&stark, proof, &config)
}

#[test]
Expand All @@ -168,82 +168,82 @@ mod test {
test_stark_low_degree::<F, _, D>(stark, metadata.columns, metadata.public_inputs)
}

#[test]
fn test_fibonacci_stark_circuit() -> Result<()> {
const D: usize = 2;
type C = PoseidonGoldilocksConfig;
type F = <C as GenericConfig<D>>::F;
type S = FibonacciStark;

let num_rows = 1 << 5;
let stark = S::new(num_rows);
let metadata = stark.metadata();
test_stark_circuit_constraints::<F, C, S, D>(
stark,
metadata.columns,
metadata.public_inputs,
)
}

#[test]
fn test_recursive_stark_verifier() -> Result<()> {
init_logger();
const D: usize = 2;
type C = PoseidonGoldilocksConfig;
type F = <C as GenericConfig<D>>::F;
type S = FibonacciStark;

let config = StarkConfig::standard_fast_config();
let num_rows = 1 << 5;
let public_inputs = vec![F::ZERO, F::ONE, fibonacci(num_rows - 1, F::ZERO, F::ONE)];
let stark = S::new(num_rows);
let trace = stark.generate_trace(public_inputs[0], public_inputs[1]);
let proof = prove::<F, C, S, D>(
stark,
&config,
trace,
public_inputs,
&mut TimingTree::default(),
)?;
verify_stark_proof(stark, proof.clone(), &config)?;

recursive_proof::<F, C, S, C, D>(stark, proof, &config, true)
}

fn recursive_proof<
F: RichField + Extendable<D>,
C: GenericConfig<D, F = F>,
S: Copy
+ Stark<F, ConstraintConsumer<F>>
+ Stark<ExtensionTarget<D>, RecursiveConstraintConsumer<D>, CircuitBuilder<F, D>>,
InnerC: GenericConfig<D, F = F>,
const D: usize,
>(
stark: S,
inner_proof: StarkProofWithPublicInputs<F, InnerC, D>,
inner_config: &StarkConfig,
print_gate_counts: bool,
) -> Result<()>
where
InnerC::Hasher: AlgebraicHasher<F>,
{
let circuit_config = CircuitConfig::standard_recursion_config();
let mut builder = CircuitBuilder::<F, D>::new(circuit_config);
let mut pw = PartialWitness::new();
let degree_bits = inner_proof.proof.recover_degree_bits(inner_config);
let pt = add_virtual_stark_proof_with_pis(&mut builder, stark, inner_config, degree_bits);
set_stark_proof_with_pis_target(&mut pw, &pt, &inner_proof);

verify_stark_proof_circuit::<F, InnerC, S, D>(&mut builder, stark, pt, inner_config);

if print_gate_counts {
builder.print_gate_counts(0);
}

let data = builder.build::<C>();
let proof = data.prove(pw)?;
data.verify(proof)
}
// #[test]
// fn test_fibonacci_stark_circuit() -> Result<()> {
// const D: usize = 2;
// type C = PoseidonGoldilocksConfig;
// type F = <C as GenericConfig<D>>::F;
// type S = FibonacciStark;

// let num_rows = 1 << 5;
// let stark = S::new(num_rows);
// let metadata = stark.metadata();
// test_stark_circuit_constraints::<F, C, S, D>(
// stark,
// metadata.columns,
// metadata.public_inputs,
// )
// }

// #[test]
// fn test_recursive_stark_verifier() -> Result<()> {
// init_logger();
// const D: usize = 2;
// type C = PoseidonGoldilocksConfig;
// type F = <C as GenericConfig<D>>::F;
// type S = FibonacciStark;

// let config = StarkConfig::standard_fast_config();
// let num_rows = 1 << 5;
// let public_inputs = vec![F::ZERO, F::ONE, fibonacci(num_rows - 1, F::ZERO, F::ONE)];
// let stark = S::new(num_rows);
// let trace = stark.generate_trace(public_inputs[0], public_inputs[1]);
// let proof = prove::<F, C, S, D>(
// stark,
// &config,
// trace,
// public_inputs,
// &mut TimingTree::default(),
// )?;
// verify_stark_proof(stark, proof.clone(), &config)?;

// recursive_proof::<F, C, S, C, D>(stark, proof, &config, true)
// }

// fn recursive_proof<
// F: RichField + Extendable<D>,
// C: GenericConfig<D, F = F>,
// S: Copy
// + Stark<F, ConstraintConsumer<F>>
// + Stark<ExtensionTarget<D>, RecursiveConstraintConsumer<D>, CircuitBuilder<F, D>>,
// InnerC: GenericConfig<D, F = F>,
// const D: usize,
// >(
// stark: S,
// inner_proof: StarkProofWithPublicInputs<F, InnerC, D>,
// inner_config: &StarkConfig,
// print_gate_counts: bool,
// ) -> Result<()>
// where
// InnerC::Hasher: AlgebraicHasher<F>,
// {
// let circuit_config = CircuitConfig::standard_recursion_config();
// let mut builder = CircuitBuilder::<F, D>::new(circuit_config);
// let mut pw = PartialWitness::new();
// let degree_bits = inner_proof.proof.recover_degree_bits(inner_config);
// let pt = add_virtual_stark_proof_with_pis(&mut builder, stark, inner_config, degree_bits);
// set_stark_proof_with_pis_target(&mut pw, &pt, &inner_proof);

// verify_stark_proof_circuit::<F, InnerC, S, D>(&mut builder, stark, pt, inner_config);

// if print_gate_counts {
// builder.print_gate_counts(0);
// }

// let data = builder.build::<C>();
// let proof = data.prove(pw)?;
// data.verify(proof)
// }

fn init_logger() {
let _ = env_logger::builder().format_timestamp(None).try_init();
Expand Down
Loading