2222use crate :: {
2323 messages:: {
2424 source:: FromBridgedChainMessagesDeliveryProof , target:: FromBridgedChainMessagesProof ,
25- AccountIdOf , BalanceOf , BridgedChain , CallOf , HashOf , MessageBridge , ThisChain ,
25+ AccountIdOf , BridgedChain , HashOf , HasherOf , MessageBridge , RawStorageProof , ThisChain ,
2626 } ,
2727 messages_generation:: {
2828 encode_all_messages, encode_lane_data, grow_trie, prepare_messages_storage_proof,
2929 } ,
3030} ;
3131
3232use bp_messages:: storage_keys;
33- use bp_runtime:: { record_all_trie_keys, StorageProofSize } ;
33+ use bp_polkadot_core:: parachains:: ParaHash ;
34+ use bp_runtime:: { record_all_trie_keys, Chain , Parachain , StorageProofSize , UnderlyingChainOf } ;
3435use codec:: Encode ;
35- use frame_support:: { dispatch :: GetDispatchInfo , weights:: Weight } ;
36+ use frame_support:: weights:: Weight ;
3637use pallet_bridge_messages:: benchmarking:: { MessageDeliveryProofParams , MessageProofParams } ;
37- use sp_core:: Hasher ;
38- use sp_runtime:: traits:: { Header , MaybeSerializeDeserialize , Zero } ;
39- use sp_std:: { fmt:: Debug , prelude:: * } ;
38+ use sp_runtime:: traits:: { Header , Zero } ;
39+ use sp_std:: prelude:: * ;
4040use sp_trie:: { trie_types:: TrieDBMutBuilderV1 , LayoutV1 , MemoryDB , Recorder , TrieMut } ;
4141
4242/// Prepare proof of messages for the `receive_messages_proof` call.
4343///
4444/// In addition to returning valid messages proof, environment is prepared to verify this message
4545/// proof.
46- pub fn prepare_message_proof < R , BI , FI , B , BH , BHH > (
46+ ///
47+ /// This method is intended to be used when benchmarking pallet, linked to the chain that
48+ /// uses GRANDPA finality. For parachains, please use the `prepare_message_proof_from_parachain`
49+ /// function.
50+ pub fn prepare_message_proof_from_grandpa_chain < R , FI , B > (
4751 params : MessageProofParams ,
4852) -> ( FromBridgedChainMessagesProof < HashOf < BridgedChain < B > > > , Weight )
4953where
50- R : frame_system:: Config < AccountId = AccountIdOf < ThisChain < B > > >
51- + pallet_bridge_grandpa:: Config < FI > ,
52- R :: BridgedChain : bp_runtime:: Chain < Hash = HashOf < BridgedChain < B > > , Header = BH > ,
53- B : MessageBridge ,
54- BI : ' static ,
54+ R : pallet_bridge_grandpa:: Config < FI , BridgedChain = UnderlyingChainOf < BridgedChain < B > > > ,
5555 FI : ' static ,
56- BH : Header < Hash = HashOf < BridgedChain < B > > > ,
57- BHH : Hasher < Out = HashOf < BridgedChain < B > > > ,
58- AccountIdOf < ThisChain < B > > : PartialEq + sp_std:: fmt:: Debug ,
59- AccountIdOf < BridgedChain < B > > : From < [ u8 ; 32 ] > ,
60- BalanceOf < ThisChain < B > > : Debug + MaybeSerializeDeserialize ,
61- CallOf < ThisChain < B > > : From < frame_system:: Call < R > > + GetDispatchInfo ,
62- HashOf < BridgedChain < B > > : Copy + Default ,
56+ B : MessageBridge ,
6357{
64- let message_payload = match params. size {
65- StorageProofSize :: Minimal ( ref size) => vec ! [ 0u8 ; * size as _] ,
66- _ => vec ! [ ] ,
67- } ;
68-
69- // finally - prepare storage proof and update environment
58+ // prepare storage proof
7059 let ( state_root, storage_proof) = prepare_messages_storage_proof :: < B > (
7160 params. lane ,
7261 params. message_nonces . clone ( ) ,
7362 params. outbound_lane_data ,
7463 params. size ,
75- message_payload,
64+ match params. size {
65+ StorageProofSize :: Minimal ( ref size) => vec ! [ 0u8 ; * size as _] ,
66+ _ => vec ! [ ] ,
67+ } ,
7668 encode_all_messages,
7769 encode_lane_data,
7870 ) ;
71+
72+ // update runtime storage
7973 let ( _, bridged_header_hash) = insert_header_to_grandpa_pallet :: < R , FI > ( state_root) ;
8074
8175 (
@@ -90,47 +84,142 @@ where
9084 )
9185}
9286
87+ /// Prepare proof of messages for the `receive_messages_proof` call.
88+ ///
89+ /// In addition to returning valid messages proof, environment is prepared to verify this message
90+ /// proof.
91+ ///
92+ /// This method is intended to be used when benchmarking pallet, linked to the chain that
93+ /// uses parachain finality. For GRANDPA chains, please use the
94+ /// `prepare_message_proof_from_grandpa_chain` function.
95+ pub fn prepare_message_proof_from_parachain < R , PI , B > (
96+ params : MessageProofParams ,
97+ ) -> ( FromBridgedChainMessagesProof < HashOf < BridgedChain < B > > > , Weight )
98+ where
99+ R : pallet_bridge_parachains:: Config < PI > ,
100+ PI : ' static ,
101+ B : MessageBridge ,
102+ UnderlyingChainOf < BridgedChain < B > > : Chain < Hash = ParaHash > + Parachain ,
103+ {
104+ // prepare storage proof
105+ let ( state_root, storage_proof) = prepare_messages_storage_proof :: < B > (
106+ params. lane ,
107+ params. message_nonces . clone ( ) ,
108+ params. outbound_lane_data ,
109+ params. size ,
110+ match params. size {
111+ StorageProofSize :: Minimal ( ref size) => vec ! [ 0u8 ; * size as _] ,
112+ _ => vec ! [ ] ,
113+ } ,
114+ encode_all_messages,
115+ encode_lane_data,
116+ ) ;
117+
118+ // update runtime storage
119+ let ( _, bridged_header_hash) =
120+ insert_header_to_parachains_pallet :: < R , PI , UnderlyingChainOf < BridgedChain < B > > > ( state_root) ;
121+
122+ (
123+ FromBridgedChainMessagesProof {
124+ bridged_header_hash,
125+ storage_proof,
126+ lane : params. lane ,
127+ nonces_start : * params. message_nonces . start ( ) ,
128+ nonces_end : * params. message_nonces . end ( ) ,
129+ } ,
130+ Weight :: zero ( ) ,
131+ )
132+ }
133+
93134/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call.
94- pub fn prepare_message_delivery_proof < R , FI , B , BH , BHH > (
135+ ///
136+ /// This method is intended to be used when benchmarking pallet, linked to the chain that
137+ /// uses GRANDPA finality. For parachains, please use the
138+ /// `prepare_message_delivery_proof_from_parachain` function.
139+ pub fn prepare_message_delivery_proof_from_grandpa_chain < R , FI , B > (
95140 params : MessageDeliveryProofParams < AccountIdOf < ThisChain < B > > > ,
96141) -> FromBridgedChainMessagesDeliveryProof < HashOf < BridgedChain < B > > >
97142where
98- R : pallet_bridge_grandpa:: Config < FI > ,
99- R :: BridgedChain : bp_runtime:: Chain < Hash = HashOf < BridgedChain < B > > , Header = BH > ,
143+ R : pallet_bridge_grandpa:: Config < FI , BridgedChain = UnderlyingChainOf < BridgedChain < B > > > ,
100144 FI : ' static ,
101145 B : MessageBridge ,
102- BH : Header < Hash = HashOf < BridgedChain < B > > > ,
103- BHH : Hasher < Out = HashOf < BridgedChain < B > > > ,
104- HashOf < BridgedChain < B > > : Copy + Default ,
146+ {
147+ // prepare storage proof
148+ let lane = params. lane ;
149+ let ( state_root, storage_proof) = prepare_message_delivery_proof :: < B > ( params) ;
150+
151+ // update runtime storage
152+ let ( _, bridged_header_hash) = insert_header_to_grandpa_pallet :: < R , FI > ( state_root) ;
153+
154+ FromBridgedChainMessagesDeliveryProof {
155+ bridged_header_hash : bridged_header_hash. into ( ) ,
156+ storage_proof,
157+ lane,
158+ }
159+ }
160+
161+ /// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call.
162+ ///
163+ /// This method is intended to be used when benchmarking pallet, linked to the chain that
164+ /// uses parachain finality. For GRANDPA chains, please use the
165+ /// `prepare_message_delivery_proof_from_grandpa_chain` function.
166+ pub fn prepare_message_delivery_proof_from_parachain < R , PI , B > (
167+ params : MessageDeliveryProofParams < AccountIdOf < ThisChain < B > > > ,
168+ ) -> FromBridgedChainMessagesDeliveryProof < HashOf < BridgedChain < B > > >
169+ where
170+ R : pallet_bridge_parachains:: Config < PI > ,
171+ PI : ' static ,
172+ B : MessageBridge ,
173+ UnderlyingChainOf < BridgedChain < B > > : Chain < Hash = ParaHash > + Parachain ,
174+ {
175+ // prepare storage proof
176+ let lane = params. lane ;
177+ let ( state_root, storage_proof) = prepare_message_delivery_proof :: < B > ( params) ;
178+
179+ // update runtime storage
180+ let ( _, bridged_header_hash) =
181+ insert_header_to_parachains_pallet :: < R , PI , UnderlyingChainOf < BridgedChain < B > > > ( state_root) ;
182+
183+ FromBridgedChainMessagesDeliveryProof {
184+ bridged_header_hash : bridged_header_hash. into ( ) ,
185+ storage_proof,
186+ lane,
187+ }
188+ }
189+
190+ /// Prepare in-memory message delivery proof, without inserting anything to the runtime storage.
191+ fn prepare_message_delivery_proof < B > (
192+ params : MessageDeliveryProofParams < AccountIdOf < ThisChain < B > > > ,
193+ ) -> ( HashOf < BridgedChain < B > > , RawStorageProof )
194+ where
195+ B : MessageBridge ,
105196{
106197 // prepare Bridged chain storage with inbound lane state
107198 let storage_key =
108199 storage_keys:: inbound_lane_data_key ( B :: BRIDGED_MESSAGES_PALLET_NAME , & params. lane ) . 0 ;
109200 let mut root = Default :: default ( ) ;
110201 let mut mdb = MemoryDB :: default ( ) ;
111202 {
112- let mut trie = TrieDBMutBuilderV1 :: < BHH > :: new ( & mut mdb, & mut root) . build ( ) ;
203+ let mut trie =
204+ TrieDBMutBuilderV1 :: < HasherOf < BridgedChain < B > > > :: new ( & mut mdb, & mut root) . build ( ) ;
113205 trie. insert ( & storage_key, & params. inbound_lane_data . encode ( ) )
114206 . map_err ( |_| "TrieMut::insert has failed" )
115207 . expect ( "TrieMut::insert should not fail in benchmarks" ) ;
116208 }
117209 root = grow_trie ( root, & mut mdb, params. size ) ;
118210
119211 // generate storage proof to be delivered to This chain
120- let mut proof_recorder = Recorder :: < LayoutV1 < BHH > > :: new ( ) ;
121- record_all_trie_keys :: < LayoutV1 < BHH > , _ > ( & mdb, & root, & mut proof_recorder)
122- . map_err ( |_| "record_all_trie_keys has failed" )
123- . expect ( "record_all_trie_keys should not fail in benchmarks" ) ;
212+ let mut proof_recorder = Recorder :: < LayoutV1 < HasherOf < BridgedChain < B > > > > :: new ( ) ;
213+ record_all_trie_keys :: < LayoutV1 < HasherOf < BridgedChain < B > > > , _ > (
214+ & mdb,
215+ & root,
216+ & mut proof_recorder,
217+ )
218+ . map_err ( |_| "record_all_trie_keys has failed" )
219+ . expect ( "record_all_trie_keys should not fail in benchmarks" ) ;
124220 let storage_proof = proof_recorder. drain ( ) . into_iter ( ) . map ( |n| n. data . to_vec ( ) ) . collect ( ) ;
125221
126- // finally insert header with given state root to our storage
127- let ( _, bridged_header_hash) = insert_header_to_grandpa_pallet :: < R , FI > ( root) ;
128-
129- FromBridgedChainMessagesDeliveryProof {
130- bridged_header_hash : bridged_header_hash. into ( ) ,
131- storage_proof,
132- lane : params. lane ,
133- }
222+ ( root, storage_proof)
134223}
135224
136225/// Insert header to the bridge GRANDPA pallet.
@@ -154,3 +243,25 @@ where
154243 pallet_bridge_grandpa:: initialize_for_benchmarks :: < R , GI > ( bridged_header) ;
155244 ( bridged_block_number, bridged_header_hash)
156245}
246+
247+ /// Insert header to the bridge parachains pallet.
248+ pub ( crate ) fn insert_header_to_parachains_pallet < R , PI , PC > (
249+ state_root : bp_runtime:: HashOf < PC > ,
250+ ) -> ( bp_runtime:: BlockNumberOf < PC > , bp_runtime:: HashOf < PC > )
251+ where
252+ R : pallet_bridge_parachains:: Config < PI > ,
253+ PI : ' static ,
254+ PC : Chain < Hash = ParaHash > + Parachain ,
255+ {
256+ let bridged_block_number = Zero :: zero ( ) ;
257+ let bridged_header = bp_runtime:: HeaderOf :: < PC > :: new (
258+ bridged_block_number,
259+ Default :: default ( ) ,
260+ state_root,
261+ Default :: default ( ) ,
262+ Default :: default ( ) ,
263+ ) ;
264+ let bridged_header_hash = bridged_header. hash ( ) ;
265+ pallet_bridge_parachains:: initialize_for_benchmarks :: < R , PI , PC > ( bridged_header) ;
266+ ( bridged_block_number, bridged_header_hash)
267+ }
0 commit comments