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(NetworkType networkType) { using (var client = new WasabiClient(LiveServerTestsFixture.UriMappings[networkType])) { var filterModel = IndexDownloader.GetStartingFilter(Network.GetNetwork(networkType.ToString())); FiltersResponse filtersResponse = await client.GetFiltersAsync(filterModel.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); }
private static async Task AssertFiltersInitializedAsync(RegTestFixture regTestFixture, Backend.Global global) { var firstHash = await global.RpcClient.GetBlockHashAsync(0); while (true) { using var client = new WasabiClient(new Uri(regTestFixture.BackendEndPoint), null); FiltersResponse filtersResponse = await client.GetFiltersAsync(firstHash, 1000); Assert.NotNull(filtersResponse); var filterCount = filtersResponse.Filters.Count(); if (filterCount >= 101) { break; } else { await Task.Delay(100); } } }
public void Synchronize(TimeSpan requestInterval) { Guard.NotNull(nameof(requestInterval), requestInterval); Interlocked.Exchange(ref _running, 1); Task.Run(async() => { FilterModel bestKnownFilter = null; try { while (IsRunning) { try { // If stop was requested return. if (IsRunning == false) { return; } using (await IndexLock.LockAsync()) { bestKnownFilter = Index.Last(); } var filters = await WasabiClient.GetFiltersAsync(bestKnownFilter.BlockHash, 1000); if (!filters.Any()) { continue; } using (await IndexLock.LockAsync()) { var filtersList = filters.ToList(); // performance for (int i = 0; i < filtersList.Count; i++) { var filterModel = FilterModel.FromLine(filtersList[i], bestKnownFilter.BlockHeight + i + 1); Index.Add(filterModel); NewFilter?.Invoke(this, filterModel); } if (filtersList.Count == 1) // minor optimization { await File.AppendAllLinesAsync(IndexFilePath, new[] { Index.Last().ToLine() }); } else { await File.WriteAllLinesAsync(IndexFilePath, Index.Select(x => x.ToLine())); } Logger.LogInfo <IndexDownloader>($"Downloaded filters for blocks from {bestKnownFilter.BlockHeight.Value + 1} to {Index.Last().BlockHeight}."); } continue; } catch (HttpRequestException ex) when(ex.Message.StartsWith(HttpStatusCode.NotFound.ToReasonString())) { // Reorg happened var reorgedHash = bestKnownFilter.BlockHash; Logger.LogInfo <IndexDownloader>($"REORG Invalid Block: {reorgedHash}"); // 1. Rollback index using (await IndexLock.LockAsync()) { Index.RemoveAt(Index.Count - 1); } Reorged?.Invoke(this, reorgedHash); // 2. Serialize Index. (Remove last line.) var lines = File.ReadAllLines(IndexFilePath); File.WriteAllLines(IndexFilePath, lines.Take(lines.Length - 1).ToArray()); // 3. Skip the last valid block. continue; } catch (Exception ex) { Logger.LogError <IndexDownloader>(ex); } finally { await Task.Delay(requestInterval); // Ask for new index in every requestInterval. } } } finally { if (IsStopping) { Interlocked.Exchange(ref _running, 3); } } }); }