@@ -9,6 +9,24 @@ use starknet::ContractAddress;
99// Growing module is separated into different contract to reduce class size of the Satellite
1010// contract.
1111
12+ #[derive(Drop , Serde )]
13+ struct FromMmrProof {
14+ mmr_index : MmrSize ,
15+ mmr_proof : Proof ,
16+ proof_mmr_peaks : Peaks ,
17+ }
18+
19+ #[derive(Drop , Serde )]
20+ struct FromParentHashProof {
21+ reference_block : u256 ,
22+ }
23+
24+ #[derive(Drop , Serde )]
25+ enum ProofType {
26+ FromMmr : FromMmrProof ,
27+ FromParentHash : FromParentHashProof ,
28+ }
29+
1230#[starknet:: interface]
1331pub trait IEvmGrowing <TContractState > {
1432 fn _setGrowingInnerContractAddress (
@@ -19,11 +37,9 @@ pub trait IEvmGrowing<TContractState> {
1937 ref self : TContractState ,
2038 chain_id : u256 ,
2139 headers_rlp : Span <Words64 >,
22- mmr_peaks : Peaks ,
23- mmr_id : u256 ,
24- reference_block : Option <u256 >,
25- mmr_index : Option <MmrSize >,
26- mmr_proof : Option <Proof >,
40+ grow_mmr_peaks : Peaks ,
41+ grow_mmr_id : u256 ,
42+ proof_type : ProofType ,
2743 );
2844}
2945
@@ -81,18 +97,16 @@ pub mod evm_growing_component {
8197 fn onchainEvmAppendBlocksBatch (
8298 ref self : ComponentState <TContractState >,
8399 chain_id : u256 ,
84- mut headers_rlp : Span <Words64 >,
85- mmr_peaks : Peaks ,
86- mmr_id : u256 ,
87- reference_block : Option <u256 >,
88- mmr_index : Option <MmrSize >,
89- mmr_proof : Option <Proof >,
100+ headers_rlp : Span <Words64 >,
101+ grow_mmr_peaks : Peaks ,
102+ grow_mmr_id : u256 ,
103+ proof_type : ProofType ,
90104 ) {
91105 let mut state = get_dep_component_mut! (ref self , State );
92106 let mut mmr_data = state
93107 . mmrs
94108 . entry (chain_id )
95- . entry (mmr_id )
109+ . entry (grow_mmr_id )
96110 . entry (POSEIDON_HASHING_FUNCTION );
97111
98112 let mmr_size = mmr_data . latest_size. read ();
@@ -105,18 +119,18 @@ pub mod evm_growing_component {
105119 . expect (' ROOT_DOES_NOT_FIT' ),
106120 };
107121
108- let initial_blockhash = if mmr_proof . is_none () {
109- let reference_block = reference_block . unwrap ();
110- Some (
111- state
112- . received_parent_hashes
113- . entry (chain_id )
114- . entry (POSEIDON_HASHING_FUNCTION )
115- . entry (reference_block )
116- . read (),
117- )
118- } else {
119- None
122+ let initial_blockhash = match @ proof_type {
123+ ProofType :: FromParentHash ( FromParentHashProof { reference_block }) => {
124+ Some (
125+ state
126+ . received_parent_hashes
127+ . entry (chain_id )
128+ . entry (POSEIDON_HASHING_FUNCTION )
129+ . entry (* reference_block )
130+ . read (),
131+ )
132+ },
133+ _ => None
120134 };
121135
122136 let (mmr , start_block , end_block ) = IEvmGrowingInternalDispatcher {
@@ -125,11 +139,9 @@ pub mod evm_growing_component {
125139 . inner_onchainEvmAppendBlocksBatch (
126140 chain_id ,
127141 headers_rlp ,
128- mmr_peaks ,
129- mmr_id ,
130- reference_block ,
131- mmr_index ,
132- mmr_proof ,
142+ grow_mmr_peaks ,
143+ grow_mmr_id ,
144+ proof_type ,
133145 mmr ,
134146 initial_blockhash ,
135147 );
@@ -151,7 +163,7 @@ pub mod evm_growing_component {
151163 ]
152164 . span (),
153165 mmr_size : mmr . last_pos,
154- mmr_id ,
166+ mmr_id : grow_mmr_id ,
155167 accumulated_chain_id : chain_id ,
156168 grown_by : GrownBy :: EvmOnChainGrowing ,
157169 },
@@ -167,11 +179,9 @@ trait IEvmGrowingInternal<TContractState> {
167179 self : @ TContractState ,
168180 chain_id : u256 ,
169181 headers_rlp : Span <Words64 >,
170- mmr_peaks : Peaks ,
171- mmr_id : u256 ,
172- reference_block : Option <u256 >,
173- mmr_index : Option <MmrSize >,
174- mmr_proof : Option <Proof >,
182+ grow_mmr_peaks : Peaks ,
183+ grow_mmr_id : u256 ,
184+ proof_type : ProofType ,
175185 mmr : MMR ,
176186 initial_blockhash : Option <u256 >,
177187 ) -> (MMR , u256 , u256 );
@@ -192,11 +202,9 @@ pub mod evm_growing_contract {
192202 self : @ ContractState ,
193203 chain_id : u256 ,
194204 mut headers_rlp : Span <Words64 >,
195- mmr_peaks : Peaks ,
196- mmr_id : u256 ,
197- reference_block : Option <u256 >,
198- mmr_index : Option <MmrSize >,
199- mmr_proof : Option <Proof >,
205+ grow_mmr_peaks : Peaks ,
206+ grow_mmr_id : u256 ,
207+ proof_type : ProofType ,
200208 mut mmr : MMR ,
201209 initial_blockhash : Option <u256 >,
202210 ) -> (MMR , u256 , u256 ) {
@@ -205,49 +213,50 @@ pub mod evm_growing_contract {
205213 let headers_rlp_len = headers_rlp . len ();
206214 let header_rlp_first = * headers_rlp . pop_front (). unwrap ();
207215 let poseidon_hash = hash_words64 (header_rlp_first );
208- let mut peaks = mmr_peaks ;
216+ let mut peaks = grow_mmr_peaks ;
209217 let mut start_block : u256 = 0 ;
210218 let mut end_block : u256 = 0 ;
211219
212220 let mut previous_parent_hash : u256 = 0 ;
213221
214- if mmr_proof . is_some () {
215- // Start from block that is present in different mmr
216- // requires mmr_proof and mmr_index, reference_block to be None
222+ match proof_type {
223+ ProofType :: FromMmr (FromMmrProof { mmr_index , mmr_proof , proof_mmr_peaks }) => {
224+ // Start from block that is present in different mmr
225+ // requires mmr_proof and mmr_index, reference_block to be None
217226
218- assert (reference_block . is_none (), ' PROOF_AND_REF_BLOCK_NOT_ALLOWED' );
219- assert (headers_rlp_len >= 2 , ' INVALID_HEADER_RLP' );
227+ assert (headers_rlp_len >= 2 , ' INVALID_HEADER_RLP' );
220228
221- let (d , _ ) = decode_rlp (
222- header_rlp_first ,
223- [header_rlp_index :: PARENT_HASH , header_rlp_index :: BLOCK_NUMBER ]. span (),
224- );
225- previous_parent_hash = decode_parent_hash (* d . at (0 ));
226- start_block = decode_block_number (* d . at (1 )) - 1 ;
229+ let (d , _ ) = decode_rlp (
230+ header_rlp_first ,
231+ [header_rlp_index :: PARENT_HASH , header_rlp_index :: BLOCK_NUMBER ]. span (),
232+ );
233+ previous_parent_hash = decode_parent_hash (* d . at (0 ));
234+ start_block = decode_block_number (* d . at (1 )) - 1 ;
227235
228- mmr
229- . verify_proof (mmr_index . unwrap () , poseidon_hash , mmr_peaks , mmr_proof . unwrap () )
230- . expect (' INVALID_MMR_PROOF' );
236+ mmr
237+ . verify_proof (mmr_index , poseidon_hash , proof_mmr_peaks , mmr_proof )
238+ . expect (' INVALID_MMR_PROOF' );
231239
232- end_block = (start_block + 2 ) - headers_rlp_len . into ();
233- } else {
234- // Start from block for which we know the parent hash
240+ end_block = (start_block + 2 ) - headers_rlp_len . into ();
241+ },
242+ ProofType :: FromParentHash (FromParentHashProof { reference_block }) => {
243+ // Start from block for which we know the parent hash
235244
236- assert (headers_rlp_len >= 1 , ' INVALID_HEADER_RLP' );
245+ assert (headers_rlp_len >= 1 , ' INVALID_HEADER_RLP' );
237246
238- let (d , _ ) = decode_rlp (header_rlp_first , [header_rlp_index :: PARENT_HASH ]. span ());
239- previous_parent_hash = decode_parent_hash (* d . at (0 ));
247+ let (d , _ ) = decode_rlp (header_rlp_first , [header_rlp_index :: PARENT_HASH ]. span ());
248+ previous_parent_hash = decode_parent_hash (* d . at (0 ));
240249
241- let reference_block = reference_block . unwrap ();
242- start_block = reference_block - 1 ;
243- end_block = (start_block + 1 ) - headers_rlp_len . into ();
250+ start_block = reference_block - 1 ;
251+ end_block = (start_block + 1 ) - headers_rlp_len . into ();
244252
245- let initial_blockhash = initial_blockhash . unwrap ();
246- assert (initial_blockhash != 0 , ' BLOCK_NOT_RECEIVED' );
247- assert (initial_blockhash == poseidon_hash . into (), ' INVALID_INITIAL_HEADER_RLP' );
253+ let initial_blockhash = initial_blockhash . unwrap ();
254+ assert (initial_blockhash != 0 , ' BLOCK_NOT_RECEIVED' );
255+ assert (initial_blockhash == poseidon_hash . into (), ' INVALID_INITIAL_HEADER_RLP' );
248256
249- let (_ , p ) = mmr . append (poseidon_hash , mmr_peaks ). expect (' MMR_APPEND_FAILED' );
250- peaks = p ;
257+ let (_ , p ) = mmr . append (poseidon_hash , peaks ). expect (' MMR_APPEND_FAILED' );
258+ peaks = p ;
259+ }
251260 }
252261
253262 for header_rlp in headers_rlp {
0 commit comments