@@ -25,8 +25,6 @@ lazy_static! {
2525const MAX_PROOF_SIZE : usize = 16 * 1024 ;
2626const MAX_PUB_INPUT_SIZE : usize = 6 * 1024 ;
2727const PROTOCOL_STATE_HASH_SIZE : usize = 32 ;
28- // TODO(gabrielbosio): check that this length is always the same for every block
29- const PROTOCOL_STATE_SIZE : usize = 2060 ;
3028
3129#[ no_mangle]
3230pub extern "C" fn verify_protocol_state_proof_ffi (
@@ -110,14 +108,13 @@ pub fn parse_protocol_state_pub(
110108 ) ,
111109 String ,
112110> {
113- let ( tip_protocol_state_hash, tip_protocol_state) = parse_protocol_state_with_hash (
114- & protocol_state_pub[ ..( PROTOCOL_STATE_HASH_SIZE + PROTOCOL_STATE_SIZE ) ] ,
115- ) ?;
111+ let ( tip_protocol_state_hash, tip_protocol_state, candidate_offset) =
112+ parse_protocol_state_with_hash ( & protocol_state_pub) ?;
116113
117- let ( candidate_protocol_state_hash, candidate_protocol_state) = parse_protocol_state_with_hash (
118- & protocol_state_pub[ ( PROTOCOL_STATE_HASH_SIZE + PROTOCOL_STATE_SIZE )
119- .. ( ( PROTOCOL_STATE_HASH_SIZE + PROTOCOL_STATE_SIZE ) * 2 ) ] ,
120- ) ? ;
114+ let ( candidate_protocol_state_hash, candidate_protocol_state, protocol_state_pub_len ) =
115+ parse_protocol_state_with_hash ( & protocol_state_pub[ candidate_offset.. ] ) ? ;
116+
117+ debug_assert_eq ! ( protocol_state_pub_len , protocol_state_pub . len ( ) ) ;
121118
122119 Ok ( (
123120 tip_protocol_state_hash,
@@ -129,25 +126,33 @@ pub fn parse_protocol_state_pub(
129126
130127fn parse_protocol_state_with_hash (
131128 protocol_state_pub : & [ u8 ] ,
132- ) -> Result <
133- (
134- ark_ff:: Fp256 < mina_curves:: pasta:: fields:: FpParameters > ,
135- MinaStateProtocolStateValueStableV2 ,
136- ) ,
137- String ,
138- > {
139- let protocol_state_hash =
140- Fp :: from_bytes ( & protocol_state_pub[ ..32 ] ) . map_err ( |err| err. to_string ( ) ) ?;
141- let protocol_state_base64 =
142- std:: str:: from_utf8 ( & protocol_state_pub[ 32 ..] ) . map_err ( |err| err. to_string ( ) ) ?;
129+ ) -> Result < ( Fp , MinaStateProtocolStateValueStableV2 , usize ) , String > {
130+ let protocol_state_hash = Fp :: from_bytes ( & protocol_state_pub[ ..PROTOCOL_STATE_HASH_SIZE ] )
131+ . map_err ( |err| err. to_string ( ) ) ?;
132+
133+ let mut protocol_state_size_bytes = [ 0u8 ; 4 ] ;
134+ protocol_state_size_bytes. copy_from_slice (
135+ & protocol_state_pub[ PROTOCOL_STATE_HASH_SIZE ..( PROTOCOL_STATE_HASH_SIZE + 4 ) ] ,
136+ ) ;
137+ let protocol_state_size = u32:: from_be_bytes ( protocol_state_size_bytes) as usize ;
138+
139+ let protocol_state_base64 = std:: str:: from_utf8 (
140+ & protocol_state_pub
141+ [ ( PROTOCOL_STATE_HASH_SIZE + 4 ) ..( PROTOCOL_STATE_HASH_SIZE + 4 + protocol_state_size) ] ,
142+ )
143+ . map_err ( |err| err. to_string ( ) ) ?;
143144 let protocol_state_binprot = BASE64_STANDARD
144145 . decode ( protocol_state_base64)
145146 . map_err ( |err| err. to_string ( ) ) ?;
146147 let protocol_state =
147148 MinaStateProtocolStateValueStableV2 :: binprot_read ( & mut protocol_state_binprot. as_slice ( ) )
148149 . map_err ( |err| err. to_string ( ) ) ?;
149150
150- Ok ( ( protocol_state_hash, protocol_state) )
151+ Ok ( (
152+ protocol_state_hash,
153+ protocol_state,
154+ PROTOCOL_STATE_HASH_SIZE + 4 + protocol_state_size,
155+ ) )
151156}
152157
153158#[ cfg( test) ]
@@ -159,7 +164,7 @@ mod test {
159164 const PROTOCOL_STATE_PUB_BYTES : & [ u8 ] =
160165 include_bytes ! ( "../../../../batcher/aligned/test_files/mina/protocol_state.pub" ) ;
161166 const BAD_PROTOCOL_STATE_PUB_BYTES : & [ u8 ] =
162- include_bytes ! ( "../../../../batcher/aligned/test_files/mina/bad_protocol_state .pub" ) ;
167+ include_bytes ! ( "../../../../batcher/aligned/test_files/mina/protocol_state_bad_hash .pub" ) ;
163168 // BAD_PROTOCOL_STATE_PUB_BYTES has an invalid hash.
164169
165170 #[ test]
0 commit comments