@@ -16,7 +16,7 @@ use afs_test_utils::{
16
16
engine:: StarkEngine ,
17
17
page_config:: { PageConfig , PageMode } ,
18
18
} ;
19
- use alloy_primitives:: U256 ;
19
+ use alloy_primitives:: { U256 , U512 } ;
20
20
use clap:: Parser ;
21
21
use color_eyre:: eyre:: Result ;
22
22
use logical_interface:: {
@@ -85,9 +85,8 @@ impl ProveCommand {
85
85
/// Execute the `prove` command
86
86
pub fn execute ( & self , config : & PageConfig ) -> Result < ( ) > {
87
87
let start = Instant :: now ( ) ;
88
- let prefix = create_prefix ( config) ;
89
88
match config. page . mode {
90
- PageMode :: ReadWrite => self . execute_rw ( config, prefix ) ?,
89
+ PageMode :: ReadWrite => self . execute_rw ( config) ?,
91
90
PageMode :: ReadOnly => panic ! ( ) ,
92
91
}
93
92
@@ -97,127 +96,148 @@ impl ProveCommand {
97
96
Ok ( ( ) )
98
97
}
99
98
100
- pub fn execute_rw ( & self , config : & PageConfig , prefix : String ) -> Result < ( ) > {
99
+ pub fn execute_rw ( & self , config : & PageConfig ) -> Result < ( ) > {
101
100
println ! ( "Proving ops file: {}" , self . afi_file_path) ;
102
- let instructions = AfsInputInstructions :: from_file ( & self . afi_file_path ) ?;
103
- let mut db = MockDb :: from_file ( & self . db_file_path ) ;
104
- let idx_len = ( config. page . index_bytes + 1 ) / 2 ;
105
- let data_len = ( config. page . data_bytes + 1 ) / 2 ;
106
- let height = config. page . height ;
107
- let codec = FixedBytesCodec :: new ( config. page . index_bytes , config. page . data_bytes ) ;
108
- let mut interface = AfsInterface :: < U256 , U256 > :: new ( & mut db) ;
109
- let table_id = instructions. header . table_id ;
110
- let page_init = interface
111
- . get_table ( table_id. clone ( ) )
112
- . unwrap ( )
113
- . to_page ( height) ;
114
- let zk_ops = instructions
115
- . operations
116
- . iter ( )
117
- . enumerate ( )
118
- . map ( |( i, op) | afi_op_conv ( op, table_id. clone ( ) , & mut interface, i + 1 , & codec) )
119
- . collect :: < Vec < _ > > ( ) ;
101
+ println ! (
102
+ "Index bytes: {}, Data bytes: {}" ,
103
+ config. page. index_bytes, config. page. data_bytes
104
+ ) ;
105
+ match ( config. page . index_bytes , config. page . data_bytes ) {
106
+ ( 2 , 2 ) => prove :: < u16 , u16 > ( self , config) ,
107
+ ( 4 , 4 ) => prove :: < u32 , u32 > ( self , config) ,
108
+ ( 8 , 8 ) => prove :: < u64 , u64 > ( self , config) ,
109
+ ( 16 , 16 ) => prove :: < u128 , u128 > ( self , config) ,
110
+ ( 32 , 32 ) => prove :: < U256 , U256 > ( self , config) ,
111
+ ( 32 , 64 ) => prove :: < U256 , U512 > ( self , config) ,
112
+ ( 32 , 128 ) => prove :: < U256 , [ U256 ; 4 ] > ( self , config) ,
113
+ ( 32 , 256 ) => prove :: < U256 , [ U256 ; 8 ] > ( self , config) ,
114
+ ( 32 , 512 ) => prove :: < U256 , [ U256 ; 16 ] > ( self , config) ,
115
+ ( 32 , 1024 ) => prove :: < U256 , [ U256 ; 32 ] > ( self , config) ,
116
+ _ => panic ! ( "Unsupported index/data size" ) ,
117
+ }
118
+ }
119
+ }
120
120
121
- assert ! ( height > 0 ) ;
122
- let page_bus_index = 0 ;
123
- let range_bus_index = 2 ;
124
- let ops_bus_index = 3 ;
121
+ fn prove < I : Index , D : Data > ( cmd : & ProveCommand , config : & PageConfig ) -> Result < ( ) > {
122
+ let instructions = AfsInputInstructions :: from_file ( & cmd. afi_file_path ) ?;
123
+ let mut db = MockDb :: from_file ( & cmd. db_file_path ) ;
124
+ let mut interface = AfsInterface :: < I , D > :: new ( & mut db) ;
125
+ let idx_len = ( config. page . index_bytes + 1 ) / 2 ;
126
+ let data_len = ( config. page . data_bytes + 1 ) / 2 ;
127
+ let height = config. page . height ;
128
+ let codec = FixedBytesCodec :: new ( config. page . index_bytes , config. page . data_bytes ) ;
129
+ let table_id = instructions. header . table_id ;
130
+ let page_init = interface
131
+ . get_table ( table_id. clone ( ) )
132
+ . unwrap ( )
133
+ . to_page ( height) ;
134
+ let zk_ops = instructions
135
+ . operations
136
+ . iter ( )
137
+ . enumerate ( )
138
+ . map ( |( i, op) | afi_op_conv ( op, table_id. clone ( ) , & mut interface, i + 1 , & codec) )
139
+ . collect :: < Vec < _ > > ( ) ;
125
140
126
- let checker_trace_degree = config. page . max_rw_ops * 4 ;
141
+ assert ! ( height > 0 ) ;
142
+ let page_bus_index = 0 ;
143
+ let range_bus_index = 2 ;
144
+ let ops_bus_index = 3 ;
127
145
128
- let idx_limb_bits = config. page . bits_per_fe ;
146
+ let checker_trace_degree = config. page . max_rw_ops * 4 ;
129
147
130
- let max_log_degree = log2_strict_usize ( checker_trace_degree)
131
- . max ( log2_strict_usize ( height) )
132
- . max ( 8 ) ;
148
+ let idx_limb_bits = config. page . bits_per_fe ;
133
149
134
- let idx_decomp = 8 ;
150
+ let max_log_degree = log2_strict_usize ( checker_trace_degree)
151
+ . max ( log2_strict_usize ( height) )
152
+ . max ( 8 ) ;
135
153
136
- let mut page_controller: PageController < BabyBearPoseidon2Config > = PageController :: new (
137
- page_bus_index,
138
- range_bus_index,
139
- ops_bus_index,
140
- idx_len,
141
- data_len,
142
- idx_limb_bits,
143
- idx_decomp,
144
- ) ;
145
- let ops_sender = ExecutionAir :: new ( ops_bus_index, idx_len, data_len) ;
146
- let engine = config:: baby_bear_poseidon2:: default_engine ( max_log_degree) ;
147
- let prover = MultiTraceStarkProver :: new ( & engine. config ) ;
148
- let mut trace_builder = TraceCommitmentBuilder :: new ( prover. pcs ( ) ) ;
154
+ let idx_decomp = 8 ;
149
155
150
- let init_prover_data_encoded =
151
- read_from_path ( self . cache_folder . clone ( ) + "/" + & table_id + ".cache.bin" ) . unwrap ( ) ;
152
- let init_prover_data: ProverTraceData < BabyBearPoseidon2Config > =
153
- bincode:: deserialize ( & init_prover_data_encoded) . unwrap ( ) ;
156
+ let mut page_controller: PageController < BabyBearPoseidon2Config > = PageController :: new (
157
+ page_bus_index,
158
+ range_bus_index,
159
+ ops_bus_index,
160
+ idx_len,
161
+ data_len,
162
+ idx_limb_bits,
163
+ idx_decomp,
164
+ ) ;
165
+ let ops_sender = ExecutionAir :: new ( ops_bus_index, idx_len, data_len) ;
166
+ let engine = config:: baby_bear_poseidon2:: default_engine ( max_log_degree) ;
167
+ let prover = MultiTraceStarkProver :: new ( & engine. config ) ;
168
+ let mut trace_builder = TraceCommitmentBuilder :: new ( prover. pcs ( ) ) ;
154
169
155
- let span = tracing:: info_span!( "Trace generation" ) ;
156
- let _enter = span. enter ( ) ;
157
- let ( page_traces, mut prover_data) = page_controller. load_page_and_ops (
158
- & page_init,
159
- zk_ops. clone ( ) ,
160
- checker_trace_degree,
161
- & mut trace_builder. committer ,
162
- ) ;
163
- let offline_checker_trace = page_controller. offline_checker_trace ( ) ;
164
- let final_page_aux_trace = page_controller. final_page_aux_trace ( ) ;
165
- let range_checker_trace = page_controller. range_checker_trace ( ) ;
170
+ let init_prover_data_encoded =
171
+ read_from_path ( cmd. cache_folder . clone ( ) + "/" + & table_id + ".cache.bin" ) . unwrap ( ) ;
172
+ let init_prover_data: ProverTraceData < BabyBearPoseidon2Config > =
173
+ bincode:: deserialize ( & init_prover_data_encoded) . unwrap ( ) ;
166
174
167
- // Generating trace for ops_sender and making sure it has height num_ops
168
- let ops_sender_trace =
169
- ops_sender. generate_trace_testing ( & zk_ops, config. page . max_rw_ops , 1 ) ;
170
- drop ( _enter) ;
175
+ let span = tracing:: info_span!( "Trace generation" ) ;
176
+ let _enter = span. enter ( ) ;
177
+ let ( page_traces, mut prover_data) = page_controller. load_page_and_ops (
178
+ & page_init,
179
+ zk_ops. clone ( ) ,
180
+ checker_trace_degree,
181
+ & mut trace_builder. committer ,
182
+ ) ;
183
+ let offline_checker_trace = page_controller. offline_checker_trace ( ) ;
184
+ let final_page_aux_trace = page_controller. final_page_aux_trace ( ) ;
185
+ let range_checker_trace = page_controller. range_checker_trace ( ) ;
171
186
172
- // Clearing the range_checker counts
173
- page_controller. update_range_checker ( idx_decomp) ;
187
+ // Generating trace for ops_sender and making sure it has height num_ops
188
+ let ops_sender_trace = ops_sender. generate_trace_testing ( & zk_ops, config. page . max_rw_ops , 1 ) ;
189
+ drop ( _enter) ;
174
190
175
- trace_builder. clear ( ) ;
191
+ // Clearing the range_checker counts
192
+ page_controller. update_range_checker ( idx_decomp) ;
176
193
177
- trace_builder. load_cached_trace ( page_traces[ 0 ] . clone ( ) , init_prover_data) ;
178
- trace_builder. load_cached_trace ( page_traces[ 1 ] . clone ( ) , prover_data. remove ( 0 ) ) ;
179
- trace_builder. load_trace ( final_page_aux_trace) ;
180
- trace_builder. load_trace ( offline_checker_trace. clone ( ) ) ;
181
- trace_builder. load_trace ( range_checker_trace) ;
182
- trace_builder. load_trace ( ops_sender_trace) ;
194
+ trace_builder. clear ( ) ;
183
195
184
- tracing:: info_span!( "Trace commitment" ) . in_scope ( || trace_builder. commit_current ( ) ) ;
185
- let encoded_pk =
186
- read_from_path ( self . keys_folder . clone ( ) + "/" + & prefix + ".partial.pk" ) . unwrap ( ) ;
187
- let partial_pk: MultiStarkPartialProvingKey < BabyBearPoseidon2Config > =
188
- bincode:: deserialize ( & encoded_pk) . unwrap ( ) ;
189
- let partial_vk = partial_pk. partial_vk ( ) ;
190
- let main_trace_data = trace_builder. view (
191
- & partial_vk,
192
- vec ! [
193
- & page_controller. init_chip,
194
- & page_controller. final_chip,
195
- & page_controller. offline_checker,
196
- & page_controller. range_checker. air,
197
- & ops_sender,
198
- ] ,
199
- ) ;
196
+ trace_builder. load_cached_trace ( page_traces[ 0 ] . clone ( ) , init_prover_data) ;
197
+ trace_builder. load_cached_trace ( page_traces[ 1 ] . clone ( ) , prover_data. remove ( 0 ) ) ;
198
+ trace_builder. load_trace ( final_page_aux_trace) ;
199
+ trace_builder. load_trace ( offline_checker_trace. clone ( ) ) ;
200
+ trace_builder. load_trace ( range_checker_trace) ;
201
+ trace_builder. load_trace ( ops_sender_trace) ;
200
202
201
- let pis = vec ! [ vec! [ ] ; partial_vk . per_air . len ( ) ] ;
203
+ let prefix = create_prefix ( config ) ;
202
204
203
- let prover = engine. prover ( ) ;
205
+ tracing:: info_span!( "Trace commitment" ) . in_scope ( || trace_builder. commit_current ( ) ) ;
206
+ let encoded_pk =
207
+ read_from_path ( cmd. keys_folder . clone ( ) + "/" + & prefix + ".partial.pk" ) . unwrap ( ) ;
208
+ let partial_pk: MultiStarkPartialProvingKey < BabyBearPoseidon2Config > =
209
+ bincode:: deserialize ( & encoded_pk) . unwrap ( ) ;
210
+ let partial_vk = partial_pk. partial_vk ( ) ;
211
+ let main_trace_data = trace_builder. view (
212
+ & partial_vk,
213
+ vec ! [
214
+ & page_controller. init_chip,
215
+ & page_controller. final_chip,
216
+ & page_controller. offline_checker,
217
+ & page_controller. range_checker. air,
218
+ & ops_sender,
219
+ ] ,
220
+ ) ;
204
221
205
- let mut challenger = engine. new_challenger ( ) ;
206
- let proof = prover. prove ( & mut challenger, & partial_pk, main_trace_data, & pis) ;
207
- let encoded_proof: Vec < u8 > = bincode:: serialize ( & proof) . unwrap ( ) ;
208
- let table = interface. get_table ( table_id. clone ( ) ) . unwrap ( ) ;
209
- if !self . silent {
210
- println ! ( "Table ID: {}" , table_id) ;
211
- println ! ( "{:?}" , table. metadata) ;
212
- for ( index, data) in table. body . iter ( ) {
213
- println ! ( "{:?}: {:?}" , index, data) ;
214
- }
222
+ let pis = vec ! [ vec![ ] ; partial_vk. per_air. len( ) ] ;
223
+
224
+ let prover = engine. prover ( ) ;
225
+
226
+ let mut challenger = engine. new_challenger ( ) ;
227
+ let proof = prover. prove ( & mut challenger, & partial_pk, main_trace_data, & pis) ;
228
+ let encoded_proof: Vec < u8 > = bincode:: serialize ( & proof) . unwrap ( ) ;
229
+ let table = interface. get_table ( table_id. clone ( ) ) . unwrap ( ) ;
230
+ if !cmd. silent {
231
+ println ! ( "Table ID: {}" , table_id) ;
232
+ println ! ( "{:?}" , table. metadata) ;
233
+ for ( index, data) in table. body . iter ( ) {
234
+ println ! ( "{:?}: {:?}" , index, data) ;
215
235
}
216
- let proof_path = self . db_file_path . clone ( ) + ".prove.bin" ;
217
- write_bytes ( & encoded_proof, proof_path) . unwrap ( ) ;
218
- db. save_to_file ( & ( self . db_file_path . clone ( ) + ".0" ) ) ?;
219
- Ok ( ( ) )
220
236
}
237
+ let proof_path = cmd. db_file_path . clone ( ) + ".prove.bin" ;
238
+ write_bytes ( & encoded_proof, proof_path) . unwrap ( ) ;
239
+ db. save_to_file ( & ( cmd. db_file_path . clone ( ) + ".0" ) ) ?;
240
+ Ok ( ( ) )
221
241
}
222
242
223
243
fn afi_op_conv < I , D > (
0 commit comments