Exemplo n.º 1
0
    public async Task Can_reach_terminal_block(long headNumber, int options, int threshold, bool withBeaconPivot)
    {
        UInt256 ttd = 10000000;

        BlockTreeTests.BlockTreeTestScenario.ScenarioBuilder blockTrees = BlockTreeTests.BlockTreeTestScenario
                                                                          .GoesLikeThis()
                                                                          .WithBlockTrees(4, (int)headNumber + 1, true, ttd)
                                                                          .InsertBeaconPivot(16)
                                                                          .InsertHeaders(4, 15)
                                                                          .InsertBeaconBlocks(17, headNumber, BlockTreeTests.BlockTreeTestScenario.ScenarioBuilder.TotalDifficultyMode.Null);
        BlockTree              notSyncedTree     = blockTrees.NotSyncedTree;
        BlockTree              syncedTree        = blockTrees.SyncedTree;
        Context                ctx               = new(notSyncedTree);
        DownloaderOptions      downloaderOptions = (DownloaderOptions)options;
        InMemoryReceiptStorage receiptStorage    = new();
        MemDb       metadataDb  = blockTrees.NotSyncedTreeBuilder.MetadataDb;
        PoSSwitcher posSwitcher = new(new MergeConfig()
        {
            Enabled = true, TerminalTotalDifficulty = $"{ttd}"
        }, new SyncConfig(), metadataDb, notSyncedTree,
                                      RopstenSpecProvider.Instance, LimboLogs.Instance);
        BeaconPivot beaconPivot = new(new SyncConfig(), metadataDb, notSyncedTree, LimboLogs.Instance);

        if (withBeaconPivot)
        {
            beaconPivot.EnsurePivot(blockTrees.SyncedTree.FindHeader(16, BlockTreeLookupOptions.None));
        }

        MergeBlockDownloader downloader = new(
            posSwitcher,
            beaconPivot,
            ctx.Feed,
            ctx.PeerPool,
            notSyncedTree,
            Always.Valid,
            Always.Valid,
            NullSyncReport.Instance,
            receiptStorage,
            RopstenSpecProvider.Instance,
            CreateMergePeerChoiceStrategy(posSwitcher, beaconPivot),
            new ChainLevelHelper(notSyncedTree, beaconPivot, new SyncConfig(), LimboLogs.Instance),
            Substitute.For <ISyncProgressResolver>(),
            LimboLogs.Instance);

        SyncPeerMock syncPeer = new(syncedTree, false, Response.AllCorrect, 16000000);
        PeerInfo     peerInfo = new(syncPeer);
        await downloader.DownloadBlocks(peerInfo, new BlocksRequest(downloaderOptions), CancellationToken.None);

        Assert.True(posSwitcher.HasEverReachedTerminalBlock());
    }
Exemplo n.º 2
0
    public async Task Merge_Happy_path(long pivot, long headNumber, int options, int threshold, long insertedBeaconBlocks)
    {
        BlockTreeTests.BlockTreeTestScenario.ScenarioBuilder blockTrees = BlockTreeTests.BlockTreeTestScenario
                                                                          .GoesLikeThis()
                                                                          .WithBlockTrees(4, (int)headNumber + 1)
                                                                          .InsertBeaconPivot(pivot)
                                                                          .InsertHeaders(4, pivot - 1)
                                                                          .InsertBeaconBlocks(pivot + 1, insertedBeaconBlocks, BlockTreeTests.BlockTreeTestScenario.ScenarioBuilder.TotalDifficultyMode.Null);
        BlockTree         notSyncedTree     = blockTrees.NotSyncedTree;
        BlockTree         syncedTree        = blockTrees.SyncedTree;
        Context           ctx               = new(notSyncedTree);
        DownloaderOptions downloaderOptions = (DownloaderOptions)options;
        bool withReceipts = downloaderOptions == DownloaderOptions.WithReceipts;
        InMemoryReceiptStorage receiptStorage = new();
        MemDb       metadataDb  = blockTrees.NotSyncedTreeBuilder.MetadataDb;
        PoSSwitcher posSwitcher = new(new MergeConfig()
        {
            Enabled = true, TerminalTotalDifficulty = "0"
        }, new SyncConfig(), metadataDb, notSyncedTree,
                                      RopstenSpecProvider.Instance, LimboLogs.Instance);
        BeaconPivot beaconPivot = new(new SyncConfig(), metadataDb, notSyncedTree, LimboLogs.Instance);

        beaconPivot.EnsurePivot(blockTrees.SyncedTree.FindHeader(pivot, BlockTreeLookupOptions.None));
        beaconPivot.ProcessDestination = blockTrees.SyncedTree.FindHeader(pivot, BlockTreeLookupOptions.None);

        MergeBlockDownloader downloader = new(
            posSwitcher,
            beaconPivot,
            ctx.Feed,
            ctx.PeerPool,
            notSyncedTree,
            Always.Valid,
            Always.Valid,
            NullSyncReport.Instance,
            receiptStorage,
            RopstenSpecProvider.Instance,
            CreateMergePeerChoiceStrategy(posSwitcher, beaconPivot),
            new ChainLevelHelper(notSyncedTree, beaconPivot, new SyncConfig(), LimboLogs.Instance),
            Substitute.For <ISyncProgressResolver>(),
            LimboLogs.Instance);

        Response responseOptions = Response.AllCorrect;

        if (withReceipts)
        {
            responseOptions |= Response.WithTransactions;
        }

        SyncPeerMock syncPeer = new(syncedTree, withReceipts, responseOptions, 16000000);
        PeerInfo     peerInfo = new(syncPeer);
        await downloader.DownloadBlocks(peerInfo, new BlocksRequest(downloaderOptions), CancellationToken.None);

        ctx.BlockTree.BestSuggestedHeader.Number.Should().Be(Math.Max(0, insertedBeaconBlocks));
        ctx.BlockTree.BestKnownNumber.Should().Be(Math.Max(0, insertedBeaconBlocks));

        int receiptCount = 0;

        for (int i = (int)Math.Max(0, headNumber - threshold); i < peerInfo.HeadNumber; i++)
        {
            if (i % 3 == 0)
            {
                receiptCount += 2;
            }
        }

        receiptStorage.Count.Should().Be(withReceipts ? receiptCount : 0);
        beaconPivot.ProcessDestination?.Number.Should().Be(insertedBeaconBlocks);
    }