Exemple #1
0
        public void GenerateTestVectorsTest()
        {
            var tests = TestCase.read_json("data/bip158_vectors.json");

            foreach (var test in tests.Skip(1))
            {
                var i = 0;
                var testBlockHeight         = test[i++];
                var testBlockHash           = uint256.Parse((string)test[i++]);
                var testBlock               = Block.Parse((string)test[i++]);
                var testPreviousBasicHeader = uint256.Parse((string)test[i++]);
                var testPreviousExtHeader   = uint256.Parse((string)test[i++]);
                var testBasicFilter         = (string)test[i++];
                var testExtFilter           = (string)test[i++];
                var testBasicHeader         = (string)test[i++];
                var testExtHeader           = (string)test[i++];
                var message = (string)test[i++];

                var basicFilter = GolombRiceFilterBuilder.BuildBasicFilter(testBlock);
                Assert.Equal(testBasicFilter, basicFilter.ToString());
                Assert.Equal(testBasicHeader, basicFilter.GetHeader(testPreviousBasicHeader).ToString());

                var extFilter = GolombRiceFilterBuilder.BuildExtendedFilter(testBlock);
                Assert.Equal(testExtFilter, extFilter.ToString());
                Assert.Equal(testExtHeader, extFilter.GetHeader(testPreviousExtHeader).ToString());

                var deserializedBasicFilter = GolombRiceFilter.Parse(testBasicFilter);
                Assert.Equal(testBasicFilter, deserializedBasicFilter.ToString());

                var deserializedExtFilter = GolombRiceFilter.Parse(testExtFilter);
                Assert.Equal(testExtFilter, deserializedExtFilter.ToString());
            }
        }
Exemple #2
0
        public void GenerateTestVectorsTest()
        {
            var testLines = File.ReadAllLines("data/bip158_vectors.csv");

            foreach (var testLine in testLines.Skip(1))
            {
                var i                       = 0;
                var test                    = testLine.Split(',');
                var testBlockHeight         = int.Parse(test[i++]);
                var testBlockHash           = uint256.Parse(test[i++]);
                var testBlock               = Block.Parse(test[i++]);
                var testPreviousBasicHeader = uint256.Parse(test[i++]);
                var testPreviousExtHeader   = uint256.Parse(test[i++]);
                var testBasicFilter         = test[i++];
                var testExtFilter           = test[i++];
                var testBasicHeader         = test[i++];
                var testExtHeader           = test[i++];

                var basicFilter = GolombRiceFilterBuilder.BuildBasicFilter(testBlock);
                Assert.Equal(testBasicFilter, basicFilter.ToString());
                Assert.Equal(testBasicHeader, basicFilter.GetHeader(testPreviousBasicHeader).ToString());

                testExtFilter = !string.IsNullOrEmpty(testExtFilter) ? testExtFilter : "00";
                var extFilter = GolombRiceFilterBuilder.BuildExtendedFilter(testBlock);
                Assert.Equal(testExtFilter, extFilter.ToString());
                Assert.Equal(testExtHeader, extFilter.GetHeader(testPreviousExtHeader).ToString());

                var deserializedBasicFilter = GolombRiceFilter.Parse(testBasicFilter);
                Assert.Equal(testBasicFilter, deserializedBasicFilter.ToString());

                var deserializedExtFilter = GolombRiceFilter.Parse(testExtFilter);
                Assert.Equal(testExtFilter, deserializedExtFilter.ToString());
            }
        }
    public async Task GapInIndexAsync()
    {
        var(dir, matureFilters, immatureFilters) = await GetIndexStorePathsAsync();

        var network      = Network.Main;
        var headersChain = new SmartHeaderChain();

        await using var indexStore = new IndexStore(dir, network, headersChain);

        var dummyFilter = GolombRiceFilter.Parse("00");

        var matureIndexStoreContent = new[]
        {
            new FilterModel(new SmartHeader(new uint256(2), new uint256(1), 1, MinutesAgo(30)), dummyFilter),
            new FilterModel(new SmartHeader(new uint256(3), new uint256(2), 2, MinutesAgo(20)), dummyFilter),
        };
        await File.WriteAllLinesAsync(matureFilters, matureIndexStoreContent.Select(x => x.ToLine()));

        var immatureIndexStoreContent = new[]
        {
            new FilterModel(new SmartHeader(new uint256(5), new uint256(4), 4, MinutesAgo(30)), dummyFilter),
            new FilterModel(new SmartHeader(new uint256(6), new uint256(5), 5, MinutesAgo(20)), dummyFilter),
        };
        await File.WriteAllLinesAsync(immatureFilters, immatureIndexStoreContent.Select(x => x.ToLine()));

        await Assert.ThrowsAsync <InvalidOperationException>(async() => await indexStore.InitializeAsync());

        Assert.Equal(new uint256(3), headersChain.TipHash);
        Assert.Equal(2u, headersChain.TipHeight);

        Assert.True(File.Exists(matureFilters));            // mature filters are ok
        Assert.False(File.Exists(immatureFilters));         // immature filters are NOT ok
    }
    public async Task InconsistentImmatureIndexAsync()
    {
        var(dir, _, immatureFilters) = await GetIndexStorePathsAsync();

        var network      = Network.Main;
        var headersChain = new SmartHeaderChain();

        await using var indexStore = new IndexStore(dir, network, headersChain);

        var dummyFilter    = GolombRiceFilter.Parse("00");
        var startingFilter = StartingFilters.GetStartingFilter(network);

        var immatureIndexStoreContent = new[]
        {
            new FilterModel(new SmartHeader(new uint256(2), startingFilter.Header.BlockHash, startingFilter.Header.Height + 1, MinutesAgo(30)), dummyFilter),
            new FilterModel(new SmartHeader(new uint256(3), new uint256(2), startingFilter.Header.Height + 2, MinutesAgo(20)), dummyFilter),
            new FilterModel(new SmartHeader(new uint256(99), new uint256(98), startingFilter.Header.Height + 98, MinutesAgo(10)), dummyFilter)
        };
        await File.WriteAllLinesAsync(immatureFilters, immatureIndexStoreContent.Select(x => x.ToLine()));

        await Assert.ThrowsAsync <InvalidOperationException>(async() => await indexStore.InitializeAsync());

        Assert.Equal(new uint256(3), headersChain.TipHash);
        Assert.Equal(startingFilter.Header.Height + 2u, headersChain.TipHeight);

        // Check if the immatureIndex is deleted
        Assert.False(File.Exists(immatureFilters));
    }
Exemple #5
0
        public async Task InconsistentMatureIndexAsync()
        {
            var(dir, matureFilters, _) = await GetIndexStorePathsAsync();

            var network      = Network.Main;
            var headersChain = new SmartHeaderChain();

            var indexStore  = new IndexStore(dir, network, headersChain);
            var dummyFilter = GolombRiceFilter.Parse("00");
    public async Task ReceiveNonMatchingFilterAsync()
    {
        var(dir, matureFilters, immatureFilters) = await GetIndexStorePathsAsync();

        var network      = Network.Main;
        var headersChain = new SmartHeaderChain();

        await using var indexStore = new IndexStore(dir, network, headersChain);

        var dummyFilter = GolombRiceFilter.Parse("00");

        var matureIndexStoreContent = new[]
        {
            new FilterModel(new SmartHeader(new uint256(2), new uint256(1), 1, MinutesAgo(30)), dummyFilter),
            new FilterModel(new SmartHeader(new uint256(3), new uint256(2), 2, MinutesAgo(20)), dummyFilter),
        };
        await File.WriteAllLinesAsync(matureFilters, matureIndexStoreContent.Select(x => x.ToLine()));

        await indexStore.InitializeAsync();

        Assert.Equal(new uint256(3), headersChain.TipHash);
        Assert.Equal(2u, headersChain.TipHeight);

        Assert.True(File.Exists(matureFilters));         // mature filters are ok

        var nonMatchingBlockHashFilter = new FilterModel(new SmartHeader(new uint256(2), new uint256(1), 1, MinutesAgo(30)), dummyFilter);
        await indexStore.AddNewFiltersAsync(new[] { nonMatchingBlockHashFilter }, CancellationToken.None);

        Assert.Equal(new uint256(3), headersChain.TipHash);         // the filter is not added!
        Assert.Equal(2u, headersChain.TipHeight);

        var nonMatchingHeightFilter = new FilterModel(new SmartHeader(new uint256(4), new uint256(3), 37, MinutesAgo(1)), dummyFilter);
        await indexStore.AddNewFiltersAsync(new[] { nonMatchingHeightFilter }, CancellationToken.None);

        Assert.Equal(new uint256(3), headersChain.TipHash);         // the filter is not added!
        Assert.Equal(2u, headersChain.TipHeight);

        var correctFilter = new FilterModel(new SmartHeader(new uint256(4), new uint256(3), 3, MinutesAgo(1)), dummyFilter);
        await indexStore.AddNewFiltersAsync(new[] { correctFilter }, CancellationToken.None);

        Assert.Equal(new uint256(4), headersChain.TipHash);         // the filter is not added!
        Assert.Equal(3u, headersChain.TipHeight);
    }
Exemple #7
0
        public static FilterModel FromLine(string line, Height height)
        {
            Guard.NotNullOrEmptyOrWhitespace(nameof(line), line);
            var parts = line.Split(':');

            if (parts.Length == 1)             // no bech here
            {
                return(new FilterModel
                {
                    BlockHeight = Guard.NotNull(nameof(height), height),
                    BlockHash = new uint256(parts[0]),
                    Filter = null
                });
            }
            return(new FilterModel
            {
                BlockHeight = Guard.NotNull(nameof(height), height),
                BlockHash = new uint256(parts[0]),
                Filter = GolombRiceFilter.Parse(parts[1])
            });
        }