@@ -422,11 +422,14 @@ struct RelayData<ParaHash, ParaNumber, RelayNumber> {
422
422
pub para_header_at_source : Option < HeaderId < ParaHash , ParaNumber > > ,
423
423
/// Parachain header, that is available at the source relay chain at `relay_header_at_target`
424
424
/// block.
425
+ ///
426
+ /// May be `None` if there's no `relay_header_at_target` yet, or if the
427
+ /// `relay_header_at_target` is too old and we think its state has been pruned.
425
428
pub para_header_at_relay_header_at_target : Option < HeaderId < ParaHash , ParaNumber > > ,
426
429
/// Relay header number at the source chain.
427
430
pub relay_header_at_source : RelayNumber ,
428
431
/// Relay header number at the target chain.
429
- pub relay_header_at_target : RelayNumber ,
432
+ pub relay_header_at_target : Option < RelayNumber > ,
430
433
}
431
434
432
435
/// Read required data from source and target clients.
@@ -477,9 +480,8 @@ where
477
480
// submit at least one. Otherwise the pallet will be treated as uninitialized and messages
478
481
// sync will stall.
479
482
let para_header_at_target = match para_header_at_target {
480
- Ok ( para_header_at_target) => Some ( para_header_at_target. 0 ) ,
481
- Err ( SubstrateError :: BridgePalletIsNotInitialized ) |
482
- Err ( SubstrateError :: NoParachainHeadAtTarget ( _, _) ) => None ,
483
+ Ok ( Some ( para_header_at_target) ) => Some ( para_header_at_target. 0 ) ,
484
+ Ok ( None ) => None ,
483
485
Err ( e) => return Err ( map_target_err ( e) ) ,
484
486
} ;
485
487
@@ -502,51 +504,70 @@ where
502
504
. await
503
505
. map_err ( map_target_err) ?;
504
506
505
- // if relay header at target is too old, then its state may already be discarded at the source
507
+ // if relay header at target is too old then its state may already be discarded at the source
506
508
// => just use `None` in this case
507
- let is_relay_header_at_target_ancient =
508
- is_ancient_block ( relay_header_at_target. number ( ) , relay_header_at_source) ;
509
- let para_header_at_relay_header_at_target = if is_relay_header_at_target_ancient {
510
- None
511
- } else {
512
- source
513
- . on_chain_para_head_id ( relay_header_at_target, P :: SourceParachain :: PARACHAIN_ID . into ( ) )
514
- . await
515
- . map_err ( map_source_err) ?
516
- } ;
509
+ //
510
+ // the same is for case when there's no relay header at target at all
511
+ let available_relay_header_at_target =
512
+ relay_header_at_target. filter ( |relay_header_at_target| {
513
+ !is_ancient_block ( relay_header_at_target. number ( ) , relay_header_at_source)
514
+ } ) ;
515
+ let para_header_at_relay_header_at_target =
516
+ if let Some ( available_relay_header_at_target) = available_relay_header_at_target {
517
+ source
518
+ . on_chain_para_head_id (
519
+ available_relay_header_at_target,
520
+ P :: SourceParachain :: PARACHAIN_ID . into ( ) ,
521
+ )
522
+ . await
523
+ . map_err ( map_source_err) ?
524
+ } else {
525
+ None
526
+ } ;
517
527
518
528
Ok ( RelayData {
519
529
required_para_header : required_header_number,
520
530
para_header_at_target,
521
531
para_header_at_source,
522
532
relay_header_at_source,
523
- relay_header_at_target : relay_header_at_target. 0 ,
533
+ relay_header_at_target : relay_header_at_target
534
+ . map ( |relay_header_at_target| relay_header_at_target. 0 ) ,
524
535
para_header_at_relay_header_at_target,
525
536
} )
526
537
}
527
538
528
539
/// Select relay and parachain headers that need to be relayed.
529
540
fn select_headers_to_relay < ParaHash , ParaNumber , RelayNumber > (
530
541
data : & RelayData < ParaHash , ParaNumber , RelayNumber > ,
531
- mut state : RelayState < ParaHash , ParaNumber , RelayNumber > ,
542
+ state : RelayState < ParaHash , ParaNumber , RelayNumber > ,
532
543
) -> RelayState < ParaHash , ParaNumber , RelayNumber >
533
544
where
534
545
ParaHash : Clone ,
535
546
ParaNumber : Copy + PartialOrd + Zero ,
536
547
RelayNumber : Copy + Debug + Ord ,
537
548
{
549
+ // we can't do anything until **relay chain** bridge GRANDPA pallet is not initialized at the
550
+ // target chain
551
+ let relay_header_at_target = match data. relay_header_at_target {
552
+ Some ( relay_header_at_target) => relay_header_at_target,
553
+ None => return RelayState :: Idle ,
554
+ } ;
555
+
538
556
// Process the `RelayingRelayHeader` state.
539
557
if let & RelayState :: RelayingRelayHeader ( relay_header_number) = & state {
540
- if data . relay_header_at_target < relay_header_number {
558
+ if relay_header_at_target < relay_header_number {
541
559
// The required relay header hasn't yet been relayed. Ask / wait for it.
542
560
return state
543
561
}
544
562
545
563
// We may switch to `RelayingParaHeader` if parachain head is available.
546
- state = data
547
- . para_header_at_relay_header_at_target
548
- . clone ( )
549
- . map_or ( RelayState :: Idle , RelayState :: RelayingParaHeader ) ;
564
+ if let Some ( para_header_at_relay_header_at_target) =
565
+ data. para_header_at_relay_header_at_target . as_ref ( )
566
+ {
567
+ return RelayState :: RelayingParaHeader ( para_header_at_relay_header_at_target. clone ( ) )
568
+ }
569
+
570
+ // else use the regular process - e.g. we may require to deliver new relay header first
550
571
}
551
572
552
573
// Process the `RelayingParaHeader` state.
@@ -585,7 +606,7 @@ where
585
606
// its ancestor
586
607
587
608
// we need relay chain header first
588
- if data . relay_header_at_target < data. relay_header_at_source {
609
+ if relay_header_at_target < data. relay_header_at_source {
589
610
return RelayState :: RelayingRelayHeader ( data. relay_header_at_source )
590
611
}
591
612
@@ -640,7 +661,8 @@ impl<'a, P: SubstrateParachainsPipeline>
640
661
None ,
641
662
)
642
663
. await ?
643
- . best_finalized_peer_at_best_self )
664
+ . best_finalized_peer_at_best_self
665
+ . ok_or ( SubstrateError :: BridgePalletIsNotInitialized ) ?)
644
666
}
645
667
646
668
async fn best_finalized_para_block_at_source (
@@ -726,7 +748,7 @@ mod tests {
726
748
para_header_at_target: Some ( 50 ) ,
727
749
para_header_at_source: Some ( HeaderId ( 110 , 110 ) ) ,
728
750
relay_header_at_source: 800 ,
729
- relay_header_at_target: 700 ,
751
+ relay_header_at_target: Some ( 700 ) ,
730
752
para_header_at_relay_header_at_target: Some ( HeaderId ( 100 , 100 ) ) ,
731
753
} ,
732
754
RelayState :: RelayingRelayHeader ( 750 ) ,
@@ -744,7 +766,7 @@ mod tests {
744
766
para_header_at_target: Some ( 50 ) ,
745
767
para_header_at_source: Some ( HeaderId ( 110 , 110 ) ) ,
746
768
relay_header_at_source: 800 ,
747
- relay_header_at_target: 750 ,
769
+ relay_header_at_target: Some ( 750 ) ,
748
770
para_header_at_relay_header_at_target: Some ( HeaderId ( 100 , 100 ) ) ,
749
771
} ,
750
772
RelayState :: RelayingRelayHeader ( 750 ) ,
@@ -762,7 +784,7 @@ mod tests {
762
784
para_header_at_target: Some ( 50 ) ,
763
785
para_header_at_source: Some ( HeaderId ( 110 , 110 ) ) ,
764
786
relay_header_at_source: 800 ,
765
- relay_header_at_target: 780 ,
787
+ relay_header_at_target: Some ( 780 ) ,
766
788
para_header_at_relay_header_at_target: Some ( HeaderId ( 105 , 105 ) ) ,
767
789
} ,
768
790
RelayState :: RelayingRelayHeader ( 750 ) ,
@@ -779,7 +801,7 @@ mod tests {
779
801
para_header_at_target: Some ( 50 ) ,
780
802
para_header_at_source: Some ( HeaderId ( 110 , 110 ) ) ,
781
803
relay_header_at_source: 800 ,
782
- relay_header_at_target: 780 ,
804
+ relay_header_at_target: Some ( 780 ) ,
783
805
para_header_at_relay_header_at_target: Some ( HeaderId ( 105 , 105 ) ) ,
784
806
} ,
785
807
RelayState :: RelayingParaHeader ( HeaderId ( 105 , 105 ) ) ,
@@ -797,7 +819,7 @@ mod tests {
797
819
para_header_at_target: Some ( 105 ) ,
798
820
para_header_at_source: Some ( HeaderId ( 110 , 110 ) ) ,
799
821
relay_header_at_source: 800 ,
800
- relay_header_at_target: 780 ,
822
+ relay_header_at_target: Some ( 780 ) ,
801
823
para_header_at_relay_header_at_target: Some ( HeaderId ( 105 , 105 ) ) ,
802
824
} ,
803
825
RelayState :: Idle ,
@@ -815,7 +837,7 @@ mod tests {
815
837
para_header_at_target: Some ( 105 ) ,
816
838
para_header_at_source: None ,
817
839
relay_header_at_source: 800 ,
818
- relay_header_at_target: 780 ,
840
+ relay_header_at_target: Some ( 780 ) ,
819
841
para_header_at_relay_header_at_target: Some ( HeaderId ( 105 , 105 ) ) ,
820
842
} ,
821
843
RelayState :: Idle ,
@@ -833,7 +855,7 @@ mod tests {
833
855
para_header_at_target: Some ( 105 ) ,
834
856
para_header_at_source: Some ( HeaderId ( 110 , 110 ) ) ,
835
857
relay_header_at_source: 800 ,
836
- relay_header_at_target: 780 ,
858
+ relay_header_at_target: Some ( 780 ) ,
837
859
para_header_at_relay_header_at_target: Some ( HeaderId ( 105 , 105 ) ) ,
838
860
} ,
839
861
RelayState :: Idle ,
@@ -851,7 +873,7 @@ mod tests {
851
873
para_header_at_target: Some ( 105 ) ,
852
874
para_header_at_source: Some ( HeaderId ( 125 , 125 ) ) ,
853
875
relay_header_at_source: 800 ,
854
- relay_header_at_target: 780 ,
876
+ relay_header_at_target: Some ( 780 ) ,
855
877
para_header_at_relay_header_at_target: Some ( HeaderId ( 105 , 105 ) ) ,
856
878
} ,
857
879
RelayState :: Idle ,
@@ -869,7 +891,7 @@ mod tests {
869
891
para_header_at_target: Some ( 105 ) ,
870
892
para_header_at_source: Some ( HeaderId ( 125 , 125 ) ) ,
871
893
relay_header_at_source: 800 ,
872
- relay_header_at_target: 800 ,
894
+ relay_header_at_target: Some ( 800 ) ,
873
895
para_header_at_relay_header_at_target: Some ( HeaderId ( 125 , 125 ) ) ,
874
896
} ,
875
897
RelayState :: Idle ,
@@ -887,7 +909,7 @@ mod tests {
887
909
para_header_at_target: Some ( 105 ) ,
888
910
para_header_at_source: None ,
889
911
relay_header_at_source: 800 ,
890
- relay_header_at_target: 800 ,
912
+ relay_header_at_target: Some ( 800 ) ,
891
913
para_header_at_relay_header_at_target: None ,
892
914
} ,
893
915
RelayState :: RelayingRelayHeader ( 800 ) ,
@@ -905,7 +927,7 @@ mod tests {
905
927
para_header_at_target: None ,
906
928
para_header_at_source: Some ( HeaderId ( 125 , 125 ) ) ,
907
929
relay_header_at_source: 800 ,
908
- relay_header_at_target: 800 ,
930
+ relay_header_at_target: Some ( 800 ) ,
909
931
para_header_at_relay_header_at_target: Some ( HeaderId ( 125 , 125 ) ) ,
910
932
} ,
911
933
RelayState :: Idle ,
@@ -923,7 +945,7 @@ mod tests {
923
945
para_header_at_target: None ,
924
946
para_header_at_source: Some ( HeaderId ( 125 , 125 ) ) ,
925
947
relay_header_at_source: 800 ,
926
- relay_header_at_target: 700 ,
948
+ relay_header_at_target: Some ( 700 ) ,
927
949
para_header_at_relay_header_at_target: Some ( HeaderId ( 125 , 125 ) ) ,
928
950
} ,
929
951
RelayState :: Idle ,
0 commit comments