コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
                }
            }
        }
コード例 #6
0
ファイル: IndexDownloader.cs プロジェクト: i470/WalletWasabi
        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);
                    }
                }
            });
        }