diff --git a/src/input_structs/stark_config.cairo b/src/input_structs/stark_config.cairo index 92b6e4192..a6a8c08d6 100644 --- a/src/input_structs/stark_config.cairo +++ b/src/input_structs/stark_config.cairo @@ -1,3 +1,5 @@ +use cairo_verifier::vector_commitment::VectorCommitmentConfig; + #[derive(Drop, Serde)] struct StarkConfig { traces: TracesConfig, @@ -23,16 +25,10 @@ struct TracesConfig { #[derive(Drop, Serde)] struct TableCommitmentConfig { - columns: felt252, + n_columns: felt252, vector: VectorCommitmentConfig } -#[derive(Drop, Serde)] -struct VectorCommitmentConfig { - height: felt252, - verifier_friendly_commitment_layers: felt252, -} - #[derive(Drop, Serde)] struct FriConfig { // Log2 of the size of the input layer to FRI. diff --git a/src/lib.cairo b/src/lib.cairo index 0e38dd657..f518f2964 100644 --- a/src/lib.cairo +++ b/src/lib.cairo @@ -10,9 +10,10 @@ mod validation; mod vector_commitment; mod queries; -use cairo_verifier::input_structs::stark_proof::StarkProof; +use cairo_verifier::{input_structs::stark_proof::StarkProof, validation::stark::verify_stark_proof}; fn main(x: Array) { let mut x_span = x.span(); let stark_proof: StarkProof = Serde::deserialize(ref x_span).unwrap(); + verify_stark_proof(stark_proof) } diff --git a/src/validation.cairo b/src/validation.cairo index 899924323..88cbac065 100644 --- a/src/validation.cairo +++ b/src/validation.cairo @@ -1 +1,5 @@ +mod asserts; +mod config; +mod proof_of_work; mod stark_config_validate; +mod stark; diff --git a/src/validation/asserts.cairo b/src/validation/asserts.cairo new file mode 100644 index 000000000..5603bf777 --- /dev/null +++ b/src/validation/asserts.cairo @@ -0,0 +1,6 @@ +use cairo_verifier::common::math::Felt252PartialOrd; + +fn assert_in_range(x: felt252, min: felt252, max: felt252) { + assert(min <= x, 'Value too small'); + assert(x < max, 'Value too large'); +} diff --git a/src/validation/config.cairo b/src/validation/config.cairo new file mode 100644 index 000000000..3d1533028 --- /dev/null +++ b/src/validation/config.cairo @@ -0,0 +1,29 @@ +use cairo_verifier::{ + input_structs::stark_config::TracesConfig, validation::asserts::assert_in_range, + vector_commitment::validate_vector_commitment, + fri::fri_config::fri_config_validate, +}; + +const MAX_N_COLUMNS: felt252 = 128; +const AIR_LAYOUT_N_ORIGINAL_COLUMNS: felt252 = 8; +const AIR_LAYOUT_N_INTERACTION_COLUMNS: felt252 = 8; + +// Validates the configuration of the traces. +// log_eval_domain_size - Log2 of the evaluation domain size. +fn traces_config_validate( + config: TracesConfig, + log_eval_domain_size: felt252, + n_verifier_friendly_commitment_layers: felt252, +) { + assert_in_range(config.original.n_columns, 1, MAX_N_COLUMNS + 1); + assert_in_range(config.interaction.n_columns, 1, MAX_N_COLUMNS + 1); + assert(config.original.n_columns == AIR_LAYOUT_N_ORIGINAL_COLUMNS, ''); + assert(config.interaction.n_columns == AIR_LAYOUT_N_INTERACTION_COLUMNS, ''); + + validate_vector_commitment( + config.original.vector, log_eval_domain_size, n_verifier_friendly_commitment_layers, + ); + validate_vector_commitment( + config.interaction.vector, log_eval_domain_size, n_verifier_friendly_commitment_layers, + ); +} diff --git a/src/validation/proof_of_work.cairo b/src/validation/proof_of_work.cairo new file mode 100644 index 000000000..fe1d2d58a --- /dev/null +++ b/src/validation/proof_of_work.cairo @@ -0,0 +1,10 @@ +use cairo_verifier::input_structs::stark_config::ProofOfWorkConfig; +use cairo_verifier::common::math::Felt252PartialOrd; + +const MIN_PROOF_OF_WORK_BITS: felt252 = 30; +const MAX_PROOF_OF_WORK_BITS: felt252 = 50; + +fn proof_of_work_config_validate(config: ProofOfWorkConfig) { + assert(MIN_PROOF_OF_WORK_BITS < config.n_bits, ''); + assert(config.n_bits <= MAX_PROOF_OF_WORK_BITS, ''); +} diff --git a/src/validation/stark.cairo b/src/validation/stark.cairo new file mode 100644 index 000000000..209e35b7b --- /dev/null +++ b/src/validation/stark.cairo @@ -0,0 +1,11 @@ +use cairo_verifier::{ + input_structs::stark_proof::StarkProof, + validation::stark_config_validate::stark_config_validate +}; + +const SECURITY_BITS: felt252 = 96; + + +fn verify_stark_proof(proof: StarkProof) { + stark_config_validate(proof.config, SECURITY_BITS); +} diff --git a/src/validation/stark_config_validate.cairo b/src/validation/stark_config_validate.cairo index 5a1bf5608..67e47cb49 100644 --- a/src/validation/stark_config_validate.cairo +++ b/src/validation/stark_config_validate.cairo @@ -1,11 +1,24 @@ -use cairo_verifier::input_structs::stark_config::StarkConfig; +use cairo_verifier::{ + input_structs::stark_config::StarkConfig, + validation::{proof_of_work::proof_of_work_config_validate, config::traces_config_validate}, + vector_commitment::validate_vector_commitment, fri::fri_config::fri_config_validate, +}; -fn stark_config_validate(stark_config: StarkConfig) {} +fn stark_config_validate(stark_config: StarkConfig, security_bits: felt252) { + proof_of_work_config_validate(stark_config.proof_of_work); -fn proof_of_work_config_validate() {} + let log_eval_domain_size = stark_config.log_trace_domain_size + stark_config.log_n_cosets; + traces_config_validate(stark_config.traces, log_eval_domain_size, security_bits); -fn traces_config_validate() {} + validate_vector_commitment( + stark_config.composition.vector, + log_eval_domain_size, + stark_config.n_verifier_friendly_commitment_layers + ); -fn validate_vector_commitment() {} - -fn fri_config_validate() {} + // fri_config_validate( + // stark_config.fri, + // stark_config.log_n_cosets, + // stark_config.n_verifier_friendly_commitment_layers + // ); +} diff --git a/src/vector_commitment.cairo b/src/vector_commitment.cairo index 95ae6f53f..cefd3a95a 100644 --- a/src/vector_commitment.cairo +++ b/src/vector_commitment.cairo @@ -12,7 +12,7 @@ struct VectorCommitment { commitment_hash: felt252, } -#[derive(Drop, Copy)] +#[derive(Drop, Copy, Serde)] struct VectorCommitmentConfig { height: felt252, n_verifier_friendly_commitment_layers: felt252,