public void Can_start_insert_pivot_block_with_correct_pointers() { (BlockTree notSyncedTree, BlockTree syncedTree) = BuildBlockTrees(10, 20); Block?beaconBlock = syncedTree.FindBlock(14, BlockTreeLookupOptions.None); BlockTreeInsertHeaderOptions insertHeaderOption = BlockTreeInsertHeaderOptions.BeaconBlockInsert; AddBlockResult insertResult = notSyncedTree.Insert(beaconBlock, BlockTreeInsertBlockOptions.SaveHeader, insertHeaderOption); Assert.AreEqual(AddBlockResult.Added, insertResult); Assert.AreEqual(9, notSyncedTree.BestKnownNumber); Assert.AreEqual(9, notSyncedTree.BestSuggestedHeader !.Number); Assert.AreEqual(9, notSyncedTree.Head !.Number); Assert.AreEqual(9, notSyncedTree.BestSuggestedBody !.Number); Assert.AreEqual(14, notSyncedTree.BestKnownBeaconNumber); Assert.AreEqual(14, notSyncedTree.BestSuggestedBeaconHeader !.Number); }
public void Can_insert_beacon_headers() { (BlockTree notSyncedTree, BlockTree syncedTree) = BuildBlockTrees(10, 20); Block?beaconBlock = syncedTree.FindBlock(14, BlockTreeLookupOptions.None); BlockTreeInsertHeaderOptions headerOptions = BlockTreeInsertHeaderOptions.BeaconBlockInsert; AddBlockResult insertResult = notSyncedTree.Insert(beaconBlock, BlockTreeInsertBlockOptions.SaveHeader, headerOptions); for (int i = 13; i > 9; --i) { BlockHeader? beaconHeader = syncedTree.FindHeader(i, BlockTreeLookupOptions.None); AddBlockResult insertOutcome = notSyncedTree.Insert(beaconHeader !, headerOptions); Assert.AreEqual(insertOutcome, insertResult); } }
public void Can_fill_beacon_headers_gap() { (BlockTree notSyncedTree, BlockTree syncedTree) = BuildBlockTrees(10, 20); Block?beaconBlock = syncedTree.FindBlock(14, BlockTreeLookupOptions.None); BlockTreeInsertHeaderOptions headerOptions = BlockTreeInsertHeaderOptions.BeaconBlockInsert; AddBlockResult insertResult = notSyncedTree.Insert(beaconBlock, BlockTreeInsertBlockOptions.SaveHeader, headerOptions); for (int i = 13; i > 9; --i) { BlockHeader? beaconHeader = syncedTree.FindHeader(i, BlockTreeLookupOptions.None); AddBlockResult insertOutcome = notSyncedTree.Insert(beaconHeader !, headerOptions); Assert.AreEqual(AddBlockResult.Added, insertOutcome); } for (int i = 10; i < 14; ++i) { Block? block = syncedTree.FindBlock(i, BlockTreeLookupOptions.None); AddBlockResult insertOutcome = notSyncedTree.SuggestBlock(block !); Assert.AreEqual(AddBlockResult.Added, insertOutcome); } Assert.AreEqual(13, notSyncedTree.BestSuggestedBody !.Number); }
protected override AddBlockResult InsertToBlockTree(BlockHeader header) { if (_chainMerged) { if (_logger.IsTrace) { _logger.Trace( "Chain already merged, skipping header insert"); } return(AddBlockResult.AlreadyKnown); } if (_logger.IsTrace) { _logger.Trace( $"Adding new header in beacon headers sync {header.ToString(BlockHeader.Format.FullHashAndNumber)}"); } BlockTreeInsertHeaderOptions headerOptions = BlockTreeInsertHeaderOptions.BeaconHeaderInsert; if (_nextHeaderDiff is null) { headerOptions |= BlockTreeInsertHeaderOptions.TotalDifficultyNotNeeded; } // Found existing block in the block tree if (_blockTree.IsKnownBlock(header.Number, header.GetOrCalculateHash())) { _chainMerged = true; if (_logger.IsTrace) { _logger.Trace( $"Found header to join dangling beacon chain {header.ToString(BlockHeader.Format.FullHashAndNumber)}"); } return(AddBlockResult.AlreadyKnown); } _invalidChainTracker.SetChildParent(header.Hash !, header.ParentHash !); AddBlockResult insertOutcome = _blockTree.Insert(header, headerOptions); if (insertOutcome == AddBlockResult.Added || insertOutcome == AddBlockResult.AlreadyKnown) { _nextHeaderHash = header.ParentHash !; if (_expectedDifficultyOverride?.TryGetValue(header.Number, out ulong nextHeaderDiff) == true) { _nextHeaderDiff = nextHeaderDiff; } else { _nextHeaderDiff = header.TotalDifficulty != null && header.TotalDifficulty >= header.Difficulty ? header.TotalDifficulty - header.Difficulty : null; } } if (_logger.IsTrace) { _logger.Trace( $"New header {header.ToString(BlockHeader.Format.FullHashAndNumber)} in beacon headers sync. InsertOutcome: {insertOutcome}"); } return(insertOutcome); }