예제 #1
0
    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));
    }
예제 #2
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
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);
        }
예제 #6
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);
        }
예제 #7
0
    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;
    }
예제 #8
0
    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);
    }