public void PruneRepository_PruneAndCompact_FromGenesis_OnStartUp() { var posBlocks = CreatePosBlocks(50); var chainedHeaderTip = BuildProvenHeaderChainFromBlocks(posBlocks); var dataFolderPath = CreateTestDir(this); var dataFolder = new DataFolder(dataFolderPath); var dBreezeSerializer = new DBreezeSerializer(this.Network.Consensus.ConsensusFactory); var blockRepository = new LevelDbBlockRepository(this.Network, dataFolder, dBreezeSerializer); blockRepository.Initialize(); blockRepository.PutBlocks(new HashHeightPair(posBlocks.Last().GetHash(), 50), posBlocks); var storeSettings = new StoreSettings(NodeSettings.Default(this.Network)) { AmountOfBlocksToKeep = 10 }; var prunedBlockRepository = new PrunedBlockRepository(blockRepository, dBreezeSerializer, this.LoggerFactory.Object, storeSettings); prunedBlockRepository.Initialize(); prunedBlockRepository.PruneAndCompactDatabase(chainedHeaderTip.GetAncestor(50), this.Network, true); // The first prune will delete blocks from 40 to 0. Assert.Equal(chainedHeaderTip.GetAncestor(40).HashBlock, prunedBlockRepository.PrunedTip.Hash); Assert.Equal(chainedHeaderTip.GetAncestor(40).Height, prunedBlockRepository.PrunedTip.Height); // Ensure that the block has been deleted from disk. Assert.Null(blockRepository.GetBlock(chainedHeaderTip.GetAncestor(39).HashBlock)); }
public void PruneRepository_PruneAndCompact_OnShutDown() { var posBlocks = CreatePosBlocks(50); var chainedHeaderTip = BuildProvenHeaderChainFromBlocks(posBlocks); var dataFolderPath = CreateTestDir(this); var dataFolder = new DataFolder(dataFolderPath); var dBreezeSerializer = new DBreezeSerializer(this.Network.Consensus.ConsensusFactory); var blockRepository = new LevelDbBlockRepository(this.Network, dataFolder, dBreezeSerializer); blockRepository.PutBlocks(new HashHeightPair(posBlocks.Last().GetHash(), 50), posBlocks); var storeSettings = new StoreSettings(NodeSettings.Default(this.Network)) { AmountOfBlocksToKeep = 10 }; var prunedBlockRepository = new PrunedBlockRepository(blockRepository, dBreezeSerializer, this.LoggerFactory.Object, storeSettings); prunedBlockRepository.Initialize(); // Delete blocks 30 to 0 from the repo, this would have been done by the service before shutdown was initiated. blockRepository.DeleteBlocks(posBlocks.Take(30).Select(b => b.GetHash()).ToList()); prunedBlockRepository.UpdatePrunedTip(chainedHeaderTip.GetAncestor(30)); // Ensure that the block has been deleted from disk. Assert.Null(blockRepository.GetBlock(chainedHeaderTip.GetAncestor(29).HashBlock)); // On shutdown the database will only be compacted. prunedBlockRepository.PruneAndCompactDatabase(chainedHeaderTip.GetAncestor(50), this.Network, false); Assert.Equal(chainedHeaderTip.GetAncestor(30).HashBlock, prunedBlockRepository.PrunedTip.Hash); Assert.Equal(chainedHeaderTip.GetAncestor(30).Height, prunedBlockRepository.PrunedTip.Height); Assert.Null(blockRepository.GetBlock(chainedHeaderTip.GetAncestor(29).HashBlock)); }
private IBlockRepository SetupRepository(Network main, string dataFolder) { var dBreezeSerializer = new DBreezeSerializer(main.Consensus.ConsensusFactory); var repository = new LevelDbBlockRepository(main, dataFolder, dBreezeSerializer); repository.Initialize(); return(repository); }
private IBlockRepository SetupRepository(Network main, string dir) { var dBreezeSerializer = new DataStoreSerializer(main.Consensus.ConsensusFactory); var repository = new LevelDbBlockRepository(main, dir, this.LoggerFactory.Object, dBreezeSerializer); repository.Initialize(); return(repository); }
public void BlockRepositoryPutBatch() { var dBreezeSerializer = new DBreezeSerializer(this.network.Consensus.ConsensusFactory); using (var blockRepository = new LevelDbBlockRepository(this.network, TestBase.CreateDataFolder(this), dBreezeSerializer)) { blockRepository.Initialize(); blockRepository.SetTxIndex(true); var blocks = new List <Block>(); for (int i = 0; i < 5; i++) { Block block = this.network.CreateBlock(); block.AddTransaction(this.network.CreateTransaction()); block.AddTransaction(this.network.CreateTransaction()); block.Transactions[0].AddInput(new TxIn(Script.Empty)); block.Transactions[0].AddOutput(Money.COIN + i * 2, Script.Empty); block.Transactions[1].AddInput(new TxIn(Script.Empty)); block.Transactions[1].AddOutput(Money.COIN + i * 2 + 1, Script.Empty); block.UpdateMerkleRoot(); block.Header.HashPrevBlock = blocks.Any() ? blocks.Last().GetHash() : this.network.GenesisHash; blocks.Add(block); } // put blockRepository.PutBlocks(new HashHeightPair(blocks.Last().GetHash(), blocks.Count), blocks); // check the presence of each block in the repository foreach (Block block in blocks) { Block received = blockRepository.GetBlock(block.GetHash()); Assert.True(block.ToBytes().SequenceEqual(received.ToBytes())); foreach (Transaction transaction in block.Transactions) { Transaction trx = blockRepository.GetTransactionById(transaction.GetHash()); Assert.True(trx.ToBytes().SequenceEqual(transaction.ToBytes())); } } // delete blockRepository.Delete(new HashHeightPair(blocks.ElementAt(2).GetHash(), 2), new[] { blocks.ElementAt(2).GetHash() }.ToList()); Block deleted = blockRepository.GetBlock(blocks.ElementAt(2).GetHash()); Assert.Null(deleted); } }
/// <summary> /// Creates test chain with a consensus loop. /// </summary> /// <param name="network">The network context.</param> /// <param name="dataDir">The data directory.</param> /// <param name="mockPeerAddressManager">A mock <see cref="IPeerAddressManager"/>.</param> /// <returns>The asynchronous task returning a <see cref="TestChainContext"/>.</returns> public static async Task <TestChainContext> CreateAsync(Network network, string dataDir, Mock <IPeerAddressManager> mockPeerAddressManager = null) { var testChainContext = new TestChainContext() { Network = network }; testChainContext.NodeSettings = new NodeSettings(network, args: new string[] { $"-datadir={dataDir}" }); testChainContext.ConnectionSettings = new ConnectionManagerSettings(testChainContext.NodeSettings); testChainContext.LoggerFactory = testChainContext.NodeSettings.LoggerFactory; testChainContext.DateTimeProvider = DateTimeProvider.Default; testChainContext.Signals = new Signals.Signals(testChainContext.NodeSettings.LoggerFactory, null); testChainContext.AsyncProvider = new AsyncProvider(testChainContext.NodeSettings.LoggerFactory, testChainContext.Signals); network.Consensus.Options = new ConsensusOptions(); //new FullNodeBuilderConsensusExtension.PowConsensusRulesRegistration().RegisterRules(network.Consensus); var consensusSettings = new ConsensusSettings(testChainContext.NodeSettings); testChainContext.Checkpoints = new Checkpoints(); testChainContext.ChainIndexer = new ChainIndexer(network); testChainContext.ChainState = new ChainState(); testChainContext.InitialBlockDownloadState = new InitialBlockDownloadState(testChainContext.ChainState, testChainContext.Network, consensusSettings, new Checkpoints(), testChainContext.DateTimeProvider); var inMemoryCoinView = new InMemoryCoinView(new HashHeightPair(testChainContext.ChainIndexer.Tip)); var cachedCoinView = new CachedCoinView(network, new Checkpoints(), inMemoryCoinView, DateTimeProvider.Default, testChainContext.LoggerFactory, new NodeStats(testChainContext.DateTimeProvider, testChainContext.NodeSettings, new Mock <IVersionProvider>().Object), new ConsensusSettings(testChainContext.NodeSettings)); var dataFolder = new DataFolder(TestBase.AssureEmptyDir(dataDir).FullName); testChainContext.PeerAddressManager = mockPeerAddressManager == null ? new PeerAddressManager(DateTimeProvider.Default, dataFolder, testChainContext.LoggerFactory, new SelfEndpointTracker(testChainContext.LoggerFactory, testChainContext.ConnectionSettings)) : mockPeerAddressManager.Object; testChainContext.MockConnectionManager = new Mock <IConnectionManager>(); testChainContext.MockReadOnlyNodesCollection = new Mock <IReadOnlyNetworkPeerCollection>(); testChainContext.MockConnectionManager.Setup(s => s.ConnectedPeers).Returns(testChainContext.MockReadOnlyNodesCollection.Object); testChainContext.MockConnectionManager.Setup(s => s.NodeSettings).Returns(testChainContext.NodeSettings); testChainContext.MockConnectionManager.Setup(s => s.ConnectionSettings).Returns(testChainContext.ConnectionSettings); testChainContext.ConnectionManager = testChainContext.MockConnectionManager.Object; var dateTimeProvider = new DateTimeProvider(); testChainContext.PeerBanning = new PeerBanning(testChainContext.ConnectionManager, testChainContext.LoggerFactory, testChainContext.DateTimeProvider, testChainContext.PeerAddressManager); var deployments = new NodeDeployments(testChainContext.Network, testChainContext.ChainIndexer); testChainContext.ConsensusRules = new PowConsensusRuleEngine(testChainContext.Network, testChainContext.LoggerFactory, testChainContext.DateTimeProvider, testChainContext.ChainIndexer, deployments, consensusSettings, testChainContext.Checkpoints, cachedCoinView, testChainContext.ChainState, new InvalidBlockHashStore(dateTimeProvider), new NodeStats(dateTimeProvider, testChainContext.NodeSettings, new Mock <IVersionProvider>().Object), testChainContext.AsyncProvider, new ConsensusRulesContainer()).SetupRulesEngineParent(); testChainContext.HeaderValidator = new HeaderValidator(testChainContext.ConsensusRules, testChainContext.LoggerFactory); testChainContext.IntegrityValidator = new IntegrityValidator(testChainContext.ConsensusRules, testChainContext.LoggerFactory); testChainContext.PartialValidator = new PartialValidator(testChainContext.AsyncProvider, testChainContext.ConsensusRules, testChainContext.LoggerFactory); testChainContext.FullValidator = new FullValidator(testChainContext.ConsensusRules, testChainContext.LoggerFactory); var dBreezeSerializer = new DBreezeSerializer(network.Consensus.ConsensusFactory); var blockRepository = new LevelDbBlockRepository(testChainContext.Network, dataFolder, dBreezeSerializer); var blockStoreFlushCondition = new BlockStoreQueueFlushCondition(testChainContext.ChainState, testChainContext.InitialBlockDownloadState); var blockStore = new BlockStoreQueue(testChainContext.ChainIndexer, testChainContext.ChainState, blockStoreFlushCondition, new Mock <StoreSettings>().Object, blockRepository, testChainContext.LoggerFactory, new Mock <INodeStats>().Object, testChainContext.AsyncProvider, testChainContext.InitialBlockDownloadState); blockStore.Initialize(); testChainContext.Consensus = ConsensusManagerHelper.CreateConsensusManager(network, dataDir); await testChainContext.Consensus.InitializeAsync(testChainContext.ChainIndexer.Tip); return(testChainContext); }