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 IndexBuilderService(RPCClient rpc, TrustedNodeNotifyingBehavior trustedNodeNotifyingBehavior, string indexFilePath, string bech32UtxoSetFilePath) { RpcClient = Guard.NotNull(nameof(rpc), rpc); TrustedNodeNotifyingBehavior = Guard.NotNull(nameof(trustedNodeNotifyingBehavior), trustedNodeNotifyingBehavior); IndexFilePath = Guard.NotNullOrEmptyOrWhitespace(nameof(indexFilePath), indexFilePath); Bech32UtxoSetFilePath = Guard.NotNullOrEmptyOrWhitespace(nameof(bech32UtxoSetFilePath), bech32UtxoSetFilePath); Bech32UtxoSet = new Dictionary <OutPoint, Script>(); Bech32UtxoSetHistory = new List <ActionHistoryHelper>(capacity: 100); Index = new List <FilterModel>(); IndexLock = new AsyncLock(); StartingFilter = StartingFilters.GetStartingFilter(RpcClient.Network); StartingHeight = StartingFilters.GetStartingHeight(RpcClient.Network); _running = 0; IoHelpers.EnsureContainingDirectoryExists(IndexFilePath); if (File.Exists(IndexFilePath)) { if (RpcClient.Network == Network.RegTest) { File.Delete(IndexFilePath); // RegTest is not a global ledger, better to delete it. } else { var height = StartingHeight; foreach (var line in File.ReadAllLines(IndexFilePath)) { var filter = FilterModel.FromHeightlessLine(line, height); height++; Index.Add(filter); } } } IoHelpers.EnsureContainingDirectoryExists(bech32UtxoSetFilePath); if (File.Exists(bech32UtxoSetFilePath)) { if (RpcClient.Network == Network.RegTest) { File.Delete(bech32UtxoSetFilePath); // RegTest is not a global ledger, better to delete it. } else { foreach (var line in File.ReadAllLines(Bech32UtxoSetFilePath)) { var parts = line.Split(':'); var txHash = new uint256(parts[0]); var nIn = int.Parse(parts[1]); var script = new Script(ByteHelpers.FromHex(parts[2]), true); Bech32UtxoSet.Add(new OutPoint(txHash, nIn), script); } } } TrustedNodeNotifyingBehavior.BlockInv += TrustedNodeNotifyingBehavior_BlockInv; }
public async Task GetFiltersAsync(NetworkType networkType) { using var client = new WasabiClient(LiveServerTestsFixture.UriMappings[networkType], Global.Instance.TorSocks5Endpoint); var filterModel = StartingFilters.GetStartingFilter(Network.GetNetwork(networkType.ToString())); FiltersResponse filtersResponse = await client.GetFiltersAsync(filterModel.Header.BlockHash, 2); Assert.NotNull(filtersResponse); Assert.True(filtersResponse.Filters.Count() == 2); }
public async Task GetFiltersAsync(Network network) { TorHttpClient torHttpClient = MakeTorHttpClient(network); WasabiClient client = new(torHttpClient); var filterModel = StartingFilters.GetStartingFilter(network); FiltersResponse?filtersResponse = await client.GetFiltersAsync(filterModel.Header.BlockHash, 2); Assert.NotNull(filtersResponse); Assert.True(filtersResponse !.Filters.Count() == 2); }
public async Task GetFiltersAsync(NetworkType networkType) { Network network = (networkType == NetworkType.Mainnet) ? Network.Main : Network.TestNet; using var client = new WasabiClient(LiveServerTestsFixture.UriMappings[networkType], Common.TorSocks5Endpoint); var filterModel = StartingFilters.GetStartingFilter(network); FiltersResponse filtersResponse = await client.GetFiltersAsync(filterModel.Header.BlockHash, 2); Assert.NotNull(filtersResponse); Assert.True(filtersResponse.Filters.Count() == 2); }
public async Task GetFiltersAsync(NetworkType networkType) { Network network = (networkType == NetworkType.Mainnet) ? Network.Main : Network.TestNet; using var torHttpClient = MakeTorHttpClient(networkType); var client = new WasabiClient(torHttpClient); var filterModel = StartingFilters.GetStartingFilter(network); FiltersResponse?filtersResponse = await client.GetFiltersAsync(filterModel.Header.BlockHash, 2); Assert.NotNull(filtersResponse); Assert.True(filtersResponse !.Filters.Count() == 2); }
public IndexStore(string workFolderPath, Network network, SmartHeaderChain smartHeaderChain) { WorkFolderPath = Guard.NotNullOrEmptyOrWhitespace(nameof(workFolderPath), workFolderPath, trim: true); IoHelpers.EnsureDirectoryExists(WorkFolderPath); var indexFilePath = Path.Combine(WorkFolderPath, "MatureIndex.dat"); MatureIndexFileManager = new DigestableSafeIoManager(indexFilePath, useLastCharacterDigest: true); var immatureIndexFilePath = Path.Combine(WorkFolderPath, "ImmatureIndex.dat"); ImmatureIndexFileManager = new DigestableSafeIoManager(immatureIndexFilePath, useLastCharacterDigest: true); Network = network; StartingFilter = StartingFilters.GetStartingFilter(Network); SmartHeaderChain = smartHeaderChain; }
public IndexStore(string workFolderPath, Network network, SmartHeaderChain hashChain) { WorkFolderPath = Guard.NotNullOrEmptyOrWhitespace(nameof(workFolderPath), workFolderPath, trim: true); IoHelpers.EnsureDirectoryExists(WorkFolderPath); var indexFilePath = Path.Combine(WorkFolderPath, "MatureIndex.dat"); MatureIndexFileManager = new DigestableSafeIoManager(indexFilePath, digestRandomIndex: -1); var immatureIndexFilePath = Path.Combine(WorkFolderPath, "ImmatureIndex.dat"); ImmatureIndexFileManager = new DigestableSafeIoManager(immatureIndexFilePath, digestRandomIndex: -1); Network = Guard.NotNull(nameof(network), network); StartingFilter = StartingFilters.GetStartingFilter(Network); SmartHeaderChain = Guard.NotNull(nameof(hashChain), hashChain); }