public void BlockRepositoryPutBatch() { using (var dir = TestDirectory.Create()) { using (var blockRepo = new BlockRepository(Network.Main, dir.FolderName, DateTimeProvider.Default, this.loggerFactory)) { blockRepo.SetTxIndexAsync(true).Wait(); var lst = new List <Block>(); for (int i = 0; i < 5; i++) { // put var block = new Block(); block.AddTransaction(new Transaction()); block.AddTransaction(new Transaction()); 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 = lst.Any() ? lst.Last().GetHash() : Network.Main.GenesisHash; lst.Add(block); } blockRepo.PutAsync(lst.Last().GetHash(), lst).GetAwaiter().GetResult(); // check each block foreach (var block in lst) { var received = blockRepo.GetAsync(block.GetHash()).GetAwaiter().GetResult(); Assert.True(block.ToBytes().SequenceEqual(received.ToBytes())); foreach (var transaction in block.Transactions) { var trx = blockRepo.GetTrxAsync(transaction.GetHash()).GetAwaiter().GetResult(); Assert.True(trx.ToBytes().SequenceEqual(transaction.ToBytes())); } } // delete blockRepo.DeleteAsync(lst.ElementAt(2).GetHash(), new[] { lst.ElementAt(2).GetHash() }.ToList()).GetAwaiter().GetResult(); var deleted = blockRepo.GetAsync(lst.ElementAt(2).GetHash()).GetAwaiter().GetResult(); Assert.Null(deleted); } } }
public void BlockRepositoryPutBatch() { using (var blockRepository = new BlockRepository(this.network, TestBase.CreateDataFolder(this), DateTimeProvider.Default, this.loggerFactory)) { blockRepository.SetTxIndexAsync(true).Wait(); 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.PutAsync(blocks.Last().GetHash(), blocks).GetAwaiter().GetResult(); // check the presence of each block in the repository foreach (Block block in blocks) { Block received = blockRepository.GetAsync(block.GetHash()).GetAwaiter().GetResult(); Assert.True(block.ToBytes().SequenceEqual(received.ToBytes())); foreach (Transaction transaction in block.Transactions) { Transaction trx = blockRepository.GetTrxAsync(transaction.GetHash()).GetAwaiter().GetResult(); Assert.True(trx.ToBytes().SequenceEqual(transaction.ToBytes())); } } // delete blockRepository.DeleteAsync(blocks.ElementAt(2).GetHash(), new[] { blocks.ElementAt(2).GetHash() }.ToList()).GetAwaiter().GetResult(); Block deleted = blockRepository.GetAsync(blocks.ElementAt(2).GetHash()).GetAwaiter().GetResult(); Assert.Null(deleted); } }
/// <summary> /// Gets a bitcoin block. In case the requested block is not available in the repository it is returned /// immediately to the caller; otherwise it obtains the block from the source provider and stores it in /// the repository to satisfy future requests. /// </summary> /// <param name="hash">The block's hash that identifies the requested block.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The requested bitcoin block.</returns> public async Task <Block> GetBlockAsync(uint256 hash, CancellationToken cancellationToken) { Block block = await BlockRepository.GetAsync(hash, cancellationToken).ConfigureAwait(false); if (block is null) { block = await BlockSourceProvider.GetBlockAsync(hash, cancellationToken).ConfigureAwait(false); await BlockRepository.SaveAsync(block, cancellationToken).ConfigureAwait(false); } return(block); }
public Block GetStoreTip() { return(_repo.GetAsync(_repo.BlockHash).GetAwaiter().GetResult()); }