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()); } }
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)); }
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); }
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]) }); }