@@ -5,6 +5,7 @@ use crate::vec252::VecFelt252;
5
5
use cairo_lang_runner:: { Arg , ProfilingInfoCollectionConfig , RunResultValue , SierraCasmRunner } ;
6
6
use cairo_lang_sierra:: program:: VersionedProgram ;
7
7
use cairo_lang_utils:: ordered_hash_map:: OrderedHashMap ;
8
+ use cairo_vm:: Felt252 ;
8
9
use clap:: Parser ;
9
10
use itertools:: { chain, Itertools } ;
10
11
use runner:: { CairoVersion , HasherBitLength , StoneVersion } ;
@@ -13,9 +14,9 @@ use std::{
13
14
io:: { stdin, Read } ,
14
15
} ;
15
16
use swiftness_proof_parser:: parse;
16
- use transform:: StarkProofExprs ;
17
+ use transform:: { Expr , StarkProofExprs } ;
17
18
18
- const ENTRYPOINT : & str = "main " ;
19
+ const ENTRYPOINT : & str = "get_calldata " ;
19
20
20
21
#[ derive( Parser ) ]
21
22
#[ command( author, version, about) ]
@@ -45,6 +46,19 @@ fn main() -> anyhow::Result<()> {
45
46
serde_json:: from_str ( & stark_proof. public_input . to_string ( ) ) . unwrap ( ) ;
46
47
let unsent_commitment: VecFelt252 =
47
48
serde_json:: from_str ( & stark_proof. unsent_commitment . to_string ( ) ) . unwrap ( ) ;
49
+ let last_layer_commitment: VecFelt252 =
50
+ serde_json:: from_str ( & stark_proof. unsent_commitment [ 5 ] . to_string ( ) ) . unwrap ( ) ;
51
+
52
+ let fri_witness = stark_proof. witness . last ( ) . expect ( "No fri witness" ) . clone ( ) ;
53
+ let fri_witness = split_array ( fri_witness) ;
54
+ let steps = fri_witness. chunks ( 2 ) . map ( |chunk| {
55
+ chunk
56
+ . into_iter ( )
57
+ . flatten ( )
58
+ . map ( |s| Felt252 :: from_dec_str ( s) . unwrap ( ) . to_hex_string ( ) )
59
+ . join ( " " )
60
+ } ) . collect_vec ( ) ;
61
+
48
62
let witness: VecFelt252 = serde_json:: from_str ( & stark_proof. witness . to_string ( ) ) . unwrap ( ) ;
49
63
50
64
let proof = chain ! (
@@ -84,7 +98,25 @@ fn main() -> anyhow::Result<()> {
84
98
85
99
match result. value {
86
100
RunResultValue :: Success ( msg) => {
87
- println ! ( "{:?}" , msg) ;
101
+ let ( const_state, mut variable_state, fact_hash) = extract_calldata_from_memory ( result. memory , & msg) ;
102
+
103
+ let const_state_str = const_state. iter ( ) . map ( |x| x. to_hex_string ( ) ) . join ( " " ) ;
104
+
105
+ let last_variable_state = variable_state. pop ( ) . unwrap ( ) ;
106
+
107
+ for ( var, step) in variable_state. iter ( ) . zip_eq ( steps. iter ( ) ) {
108
+ let v = var. iter ( ) . map ( |x| x. to_hex_string ( ) ) . join ( " " ) ;
109
+ println ! ( "\n STEP" ) ;
110
+ println ! ( "{} {} {}" , const_state_str, v, step) ;
111
+ }
112
+
113
+ println ! ( "\n FINAL" ) ;
114
+ println ! ( "{} {} 0x{:x} {}" ,
115
+ const_state_str,
116
+ last_variable_state. iter( ) . map( |x| x. to_hex_string( ) ) . join( " " ) ,
117
+ last_layer_commitment. len( ) ,
118
+ last_layer_commitment. iter( ) . map( |x| x. to_hex_string( ) ) . join( " " )
119
+ ) ;
88
120
}
89
121
RunResultValue :: Panic ( msg) => {
90
122
panic ! ( "{:?}" , msg) ;
@@ -93,3 +125,75 @@ fn main() -> anyhow::Result<()> {
93
125
94
126
Ok ( ( ) )
95
127
}
128
+
129
+ fn extract_calldata_from_memory ( memory : Vec < Option < Felt252 > > , output : & Vec < Felt252 > ) -> ( Vec < Felt252 > , Vec < Vec < Felt252 > > , Felt252 ) {
130
+ let mut output_iter = output. iter ( ) ;
131
+
132
+ let mut calldata_constant_state: Vec < Felt252 > = vec ! [ ] ;
133
+ calldata_constant_state. push ( * output_iter. next ( ) . unwrap ( ) ) ; // n_layers
134
+ append_memory_segment ( & mut calldata_constant_state, & memory, output_iter. next_tuple ( ) . unwrap ( ) , 6 ) ; // commitment
135
+ append_memory_segment ( & mut calldata_constant_state, & memory, output_iter. next_tuple ( ) . unwrap ( ) , 1 ) ; // eval_points
136
+ append_memory_segment ( & mut calldata_constant_state, & memory, output_iter. next_tuple ( ) . unwrap ( ) , 1 ) ; // step_sizes
137
+ calldata_constant_state. push ( * output_iter. next ( ) . unwrap ( ) ) ; // last_layer_coefficients_hash
138
+
139
+ let mut variable_state_ptr: Vec < Felt252 > = vec ! [ ] ;
140
+ append_memory_segment ( & mut variable_state_ptr, & memory, output_iter. next_tuple ( ) . unwrap ( ) , 1 ) ; // variable_state
141
+ let variable_state_iter = variable_state_ptr. iter ( ) . skip ( 1 ) ;
142
+ let mut calldata_variable_state: Vec < Vec < Felt252 > > = vec ! [ ] ;
143
+ for mut x in & variable_state_iter. chunks ( 3 ) {
144
+ let ( iteration, begin, end) = x. next_tuple ( ) . unwrap ( ) ;
145
+ let begin: usize = begin. to_biguint ( ) . try_into ( ) . unwrap ( ) ;
146
+ let end: usize = end. to_biguint ( ) . try_into ( ) . unwrap ( ) ;
147
+ let len = ( end - begin) / 3 ;
148
+ let mut calldata = vec ! [ ] ;
149
+ calldata. push ( * iteration) ;
150
+ calldata. push ( len. into ( ) ) ;
151
+ for x in memory[ begin..end] . iter ( ) {
152
+ calldata. push ( x. unwrap ( ) ) ;
153
+ }
154
+ calldata_variable_state. push ( calldata) ;
155
+ }
156
+
157
+ let fact_hash = * output_iter. next ( ) . unwrap ( ) ;
158
+
159
+ ( calldata_constant_state, calldata_variable_state, fact_hash)
160
+ }
161
+
162
+ fn append_memory_segment ( calldata : & mut Vec < Felt252 > , memory : & Vec < Option < Felt252 > > , ( & start, & end) : ( & Felt252 , & Felt252 ) , size : usize ) {
163
+ let start: usize = start. to_biguint ( ) . try_into ( ) . unwrap ( ) ;
164
+ let end: usize = end. to_biguint ( ) . try_into ( ) . unwrap ( ) ;
165
+ let len = ( end - start) / size;
166
+ calldata. push ( len. into ( ) ) ;
167
+ for addr in start..end {
168
+ calldata. push ( memory[ addr] . unwrap ( ) ) ;
169
+ }
170
+ }
171
+
172
+ fn split_array ( expr : Expr ) -> Vec < Vec < String > > {
173
+ match expr {
174
+ Expr :: Array ( arr) => {
175
+ let mut acc: Vec < Vec < String > > = vec ! [ ] ;
176
+ let mut curr: Vec < String > = vec ! [ ] ;
177
+ let mut it: u32 = 0 ;
178
+ for elem in arr {
179
+ if let Expr :: Value ( val) = elem {
180
+ if it == 0 {
181
+ if curr. len ( ) > 0 {
182
+ acc. push ( curr) ;
183
+ }
184
+ it = val. parse ( ) . expect ( "Not a number" ) ;
185
+ curr = vec ! [ val] ;
186
+ } else {
187
+ curr. push ( val) ;
188
+ it -= 1 ;
189
+ }
190
+ }
191
+ }
192
+ if curr. len ( ) > 0 {
193
+ acc. push ( curr) ;
194
+ }
195
+ acc
196
+ }
197
+ _ => panic ! ( "Not an array" ) ,
198
+ }
199
+ }
0 commit comments