1
+ use core :: option :: OptionTrait ;
2
+ use core :: array :: SpanTrait ;
3
+ use core :: traits :: Into ;
4
+ use cairo_verifier :: structs :: table_commitment_config :: TableCommitmentConfig ;
5
+
6
+ const MAX_LAST_LAYER_LOG_DEGREE_BOUND : u32 = 15 ;
7
+ const MAX_FRI_LAYERS : u32 = 15 ;
8
+ const MAX_FRI_STEP : u32 = 4 ;
9
+
10
+ struct FriConfig {
11
+ // Log2 of the size of the input layer to FRI.
12
+ log_input_size : felt252 ,
13
+ // Number of layers in the FRI. Inner + last layer.
14
+ n_layers : felt252 ,
15
+ // Array of size n_layers - 1, each entry is a configuration of a table commitment for the
16
+ // corresponding inner layer.
17
+ inner_layers : Span <TableCommitmentConfig >,
18
+ // Array of size n_layers, each entry represents the FRI step size,
19
+ // i.e. the number of FRI-foldings between layer i and i+1.
20
+ fri_step_sizes : Span <felt252 >,
21
+ log_last_layer_degree_bound : felt252 ,
22
+ }
23
+
24
+ fn fri_config_validate (
25
+ config : FriConfig , log_n_cosets : felt252 , n_verifier_friendly_commitment_layers : felt252
26
+ ) -> felt252 {
27
+ assert (0_u256 <= config . log_last_layer_degree_bound. into (), '' );
28
+ assert (config . log_last_layer_degree_bound. try_into (). unwrap () <= MAX_LAST_LAYER_LOG_DEGREE_BOUND , '' );
29
+
30
+ assert (2_u256 <= config . n_layers. into (), '' );
31
+ assert (config . n_layers. try_into (). unwrap () <= MAX_FRI_LAYERS + 1 , '' );
32
+
33
+ assert (* (config . fri_step_sizes[0 ]) == 0 , '' );
34
+
35
+ let len : u32 = config . n_layers. try_into (). unwrap ();
36
+ let mut i = 0_u32 ;
37
+ let mut sum_of_step_sizes : felt252 = 0 ;
38
+ let mut log_input_size = config . log_input_size;
39
+ loop {
40
+ if i == len { break ; }
41
+ let fri_step : felt252 = * (config . fri_step_sizes. at (i ));
42
+ assert (1_u32 <= fri_step . try_into (). unwrap (), '' );
43
+ assert (fri_step . try_into (). unwrap () <= MAX_FRI_STEP + 1 , '' );
44
+ assert ((* (config . inner_layers. at (i ))). columns == fri_step * fri_step , '' );
45
+ i += 1 ;
46
+ log_input_size -= fri_step ;
47
+ sum_of_step_sizes += fri_step ;
48
+ // validate_vector_commitment(
49
+ // config=layers[0].vector,
50
+ // expected_height=log_input_size,
51
+ // n_verifier_friendly_commitment_layers=n_verifier_friendly_commitment_layers,
52
+ // );
53
+ };
54
+
55
+
56
+ let log_expected_input_degree = sum_of_step_sizes + config . log_last_layer_degree_bound;
57
+ assert (log_expected_input_degree + log_n_cosets == config . log_input_size, '' );
58
+ log_expected_input_degree
59
+ }
0 commit comments