@@ -545,31 +545,46 @@ impl std::error::Error for ApplyHeaderError {}
545
545
546
546
/// Applies `update_tip` onto `original_tip`.
547
547
///
548
- /// On success, a tuple is returned `(changeset, can_replace)`. If `can_replace` is true, then the
549
- /// `update_tip` can replace the `original_tip`.
548
+ /// On success, a tuple is returned ([`CheckPoint`], [`ChangeSet`]).
549
+ ///
550
+ /// # Errors
551
+ ///
552
+ /// [`CannotConnectError`] occurs when the `original_tip` and `update_tip` chains are disjoint:
553
+ ///
554
+ /// - If no point of agreement is found between the update and original chains.
555
+ /// - A point of agreement is found but the update is ambiguous above the point of agreement (a.k.a.
556
+ /// the update and original chain both have a block above the point of agreement, but their
557
+ /// heights do not overlap).
558
+ /// - The update attempts to replace the genesis block of the original chain.
550
559
fn merge_chains (
551
560
original_tip : CheckPoint ,
552
561
update_tip : CheckPoint ,
553
562
) -> Result < ( CheckPoint , ChangeSet ) , CannotConnectError > {
554
563
let mut changeset = ChangeSet :: default ( ) ;
564
+
555
565
let mut orig = original_tip. iter ( ) ;
556
566
let mut update = update_tip. iter ( ) ;
567
+
557
568
let mut curr_orig = None ;
558
569
let mut curr_update = None ;
570
+
559
571
let mut prev_orig: Option < CheckPoint > = None ;
560
572
let mut prev_update: Option < CheckPoint > = None ;
573
+
561
574
let mut point_of_agreement_found = false ;
575
+
562
576
let mut prev_orig_was_invalidated = false ;
577
+
563
578
let mut potentially_invalidated_heights = vec ! [ ] ;
564
579
565
580
// If we can, we want to return the update tip as the new tip because this allows checkpoints
566
581
// in multiple locations to keep the same `Arc` pointers when they are being updated from each
567
- // other using this function. We can do this as long as long as the update contains every
582
+ // other using this function. We can do this as long as the update contains every
568
583
// block's height of the original chain.
569
584
let mut is_update_height_superset_of_original = true ;
570
585
571
586
// To find the difference between the new chain and the original we iterate over both of them
572
- // from the tip backwards in tandem. We always dealing with the highest one from either chain
587
+ // from the tip backwards in tandem. We are always dealing with the highest one from either chain
573
588
// first and move to the next highest. The crucial logic is applied when they have blocks at the
574
589
// same height.
575
590
loop {
0 commit comments