@@ -72,15 +72,34 @@ macro_rules! declare_bridge_reject_obsolete_parachain_header {
7272 ref parachains,
7373 ..
7474 } ) if parachains. len( ) == 1 => {
75- let parachain = parachains. get( 0 ) . expect( "verified by match condition; qed" ) ;
75+ let ( parachain, parachain_head_hash ) = parachains. get( 0 ) . expect( "verified by match condition; qed" ) ;
7676
7777 let bundled_relay_block_number = at_relay_block. 0 ;
7878
7979 let best_parachain_head = $crate:: BestParaHeads :: <$runtime, $instance>:: get( parachain) ;
80+
8081 match best_parachain_head {
8182 Some ( best_parachain_head) if best_parachain_head. at_relay_block_number
82- >= bundled_relay_block_number =>
83- sp_runtime:: transaction_validity:: InvalidTransaction :: Stale . into( ) ,
83+ >= bundled_relay_block_number => {
84+ log:: trace!(
85+ target: $crate:: LOG_TARGET ,
86+ "Rejecting obsolete parachain-head {:?} transaction: bundled relay block number: \
87+ {:?} best relay block number: {:?}",
88+ parachain,
89+ bundled_relay_block_number,
90+ best_parachain_head. at_relay_block_number,
91+ ) ;
92+ sp_runtime:: transaction_validity:: InvalidTransaction :: Stale . into( )
93+ }
94+ Some ( best_parachain_head) if best_parachain_head. head_hash == * parachain_head_hash => {
95+ log:: trace!(
96+ target: $crate:: LOG_TARGET ,
97+ "Rejecting obsolete parachain-head {:?} transaction: head hash {:?}" ,
98+ parachain,
99+ best_parachain_head. head_hash,
100+ ) ;
101+ sp_runtime:: transaction_validity:: InvalidTransaction :: Stale . into( )
102+ }
84103 _ => Ok ( sp_runtime:: transaction_validity:: ValidTransaction :: default ( ) ) ,
85104 }
86105 } ,
@@ -118,7 +137,7 @@ mod tests {
118137 mock:: { run_test, Call , TestRuntime } ,
119138 BestParaHead , BestParaHeads , RelayBlockNumber ,
120139 } ;
121- use bp_polkadot_core:: parachains:: { ParaHeadsProof , ParaId } ;
140+ use bp_polkadot_core:: parachains:: { ParaHash , ParaHeadsProof , ParaId } ;
122141 use frame_support:: weights:: { DispatchClass , DispatchInfo , Pays } ;
123142 use sp_runtime:: traits:: SignedExtension ;
124143
@@ -127,7 +146,10 @@ mod tests {
127146 Call :: Parachains => ( )
128147 }
129148
130- fn validate_submit_parachain_heads ( num : RelayBlockNumber , parachains : Vec < ParaId > ) -> bool {
149+ fn validate_submit_parachain_heads (
150+ num : RelayBlockNumber ,
151+ parachains : Vec < ( ParaId , ParaHash ) > ,
152+ ) -> bool {
131153 BridgeRejectObsoleteParachainHeader
132154 . validate (
133155 & 42 ,
@@ -147,29 +169,39 @@ mod tests {
147169 ParaId ( 1 ) ,
148170 BestParaHead {
149171 at_relay_block_number : 10 ,
150- head_hash : Default :: default ( ) ,
172+ head_hash : [ 1u8 ; 32 ] . into ( ) ,
151173 next_imported_hash_position : 0 ,
152174 } ,
153175 ) ;
154176 }
155177
156178 #[ test]
157- fn extension_rejects_obsolete_header ( ) {
179+ fn extension_rejects_header_from_the_obsolete_relay_block ( ) {
158180 run_test ( || {
159181 // when current best finalized is #10 and we're trying to import header#5 => tx is
160182 // rejected
161183 sync_to_relay_header_10 ( ) ;
162- assert ! ( !validate_submit_parachain_heads( 5 , vec![ ParaId ( 1 ) ] ) ) ;
184+ assert ! ( !validate_submit_parachain_heads( 5 , vec![ ( ParaId ( 1 ) , [ 1u8 ; 32 ] . into( ) ) ] ) ) ;
185+ } ) ;
186+ }
187+
188+ #[ test]
189+ fn extension_rejects_header_from_the_same_relay_block ( ) {
190+ run_test ( || {
191+ // when current best finalized is #10 and we're trying to import header#10 => tx is
192+ // rejected
193+ sync_to_relay_header_10 ( ) ;
194+ assert ! ( !validate_submit_parachain_heads( 10 , vec![ ( ParaId ( 1 ) , [ 1u8 ; 32 ] . into( ) ) ] ) ) ;
163195 } ) ;
164196 }
165197
166198 #[ test]
167- fn extension_rejects_same_header ( ) {
199+ fn extension_rejects_header_from_new_relay_block_with_same_hash ( ) {
168200 run_test ( || {
169201 // when current best finalized is #10 and we're trying to import header#10 => tx is
170202 // rejected
171203 sync_to_relay_header_10 ( ) ;
172- assert ! ( !validate_submit_parachain_heads( 10 , vec![ ParaId ( 1 ) ] ) ) ;
204+ assert ! ( !validate_submit_parachain_heads( 20 , vec![ ( ParaId ( 1 ) , [ 1u8 ; 32 ] . into ( ) ) ] ) ) ;
173205 } ) ;
174206 }
175207
@@ -179,7 +211,7 @@ mod tests {
179211 // when current best finalized is #10 and we're trying to import header#15 => tx is
180212 // accepted
181213 sync_to_relay_header_10 ( ) ;
182- assert ! ( validate_submit_parachain_heads( 15 , vec![ ParaId ( 1 ) ] ) ) ;
214+ assert ! ( validate_submit_parachain_heads( 15 , vec![ ( ParaId ( 1 ) , [ 2u8 ; 32 ] . into ( ) ) ] ) ) ;
183215 } ) ;
184216 }
185217
@@ -189,7 +221,10 @@ mod tests {
189221 // when current best finalized is #10 and we're trying to import header#5, but another
190222 // parachain head is also supplied => tx is accepted
191223 sync_to_relay_header_10 ( ) ;
192- assert ! ( validate_submit_parachain_heads( 5 , vec![ ParaId ( 1 ) , ParaId ( 2 ) ] ) ) ;
224+ assert ! ( validate_submit_parachain_heads(
225+ 5 ,
226+ vec![ ( ParaId ( 1 ) , [ 1u8 ; 32 ] . into( ) ) , ( ParaId ( 2 ) , [ 1u8 ; 32 ] . into( ) ) ]
227+ ) ) ;
193228 } ) ;
194229 }
195230}
0 commit comments