public void Should_validate_a_chain(bool validChain) { const int size = 5; var consense = new NetworkConsense(1, size, 0); var blockGenesis = new MockBlock(size, Enumerable.Empty <Transaction>(), string.Empty); var block1 = new MockBlock(size, Enumerable.Empty <Transaction>(), string.Empty); var block2 = new MockBlock(size, Enumerable.Empty <Transaction>(), string.Empty); var block3 = new MockBlock(size, Enumerable.Empty <Transaction>(), string.Empty); IEnumerable <IBlock> GetNext(string previosHash) { blockGenesis.PreviousHash = previosHash; yield return(blockGenesis); block1.PreviousHash = blockGenesis.Hash; yield return(block1); block2.PreviousHash = validChain ? block1.Hash : "INCORRECT"; yield return(block2); block3.PreviousHash = block2.Hash; yield return(block3); }; IEnumerator <IBlock> factoryState = null; IBlock factory(DateTime created, string previousHash, int blockSize, IEnumerable <Transaction> pendingTransactions) { if (factoryState == null) { factoryState = GetNext(previousHash).GetEnumerator(); } factoryState.MoveNext(); return(factoryState.Current); } var bc = new BlockChain(Guid.NewGuid(), consense, factory); var transactions = Enumerable .Repeat(new Transaction(Guid.NewGuid(), Guid.NewGuid(), 1), size * 2) .ToArray(); bc.CreateTransaction(transactions); while (bc.PenddingTransactions.Count > 1) { bc.MiningPedingTransactions(); } // lazy test :< bc.IsChainValid().Should().Be(validChain); }
public void Should_remove_transactions_whens_mines(int blockSize, int transactionCount, int remains) { var factory = MockBlock.CreateFactory(); var bc = new BlockChain(Guid.NewGuid(), new NetworkConsense(1, blockSize, 0), factory); const int transactionRewardCount = 1; var transactions = Enumerable.Repeat(new Transaction(Guid.NewGuid(), Guid.NewGuid(), 1), transactionCount) .ToArray(); bc.CreateTransaction(transactions); bc.MiningPedingTransactions(); bc.PenddingTransactions.Should().HaveCount(remains + transactionRewardCount); }
public void Should_add_fi_for_a_founded_block() { var minerAddress = Guid.NewGuid(); var factory = MockBlock.CreateFactory(); var bc = new BlockChain(minerAddress, new NetworkConsense(1, 5, 42), factory); var transaction = new Transaction(Guid.NewGuid(), Guid.NewGuid(), 1); bc.CreateTransaction(transaction); bc.MiningPedingTransactions(); bc.PenddingTransactions.Should().HaveCount(1); bc.PenddingTransactions.First().ToAdress.Should().Be(minerAddress); bc.PenddingTransactions.First().Amount.Should().Be(42); }
public void Should_calc_correct_address_balance() { var address1 = Guid.NewGuid(); var address2 = Guid.NewGuid(); const int reward = 50; var factory = MockBlock.CreateFactory(); var bc = new BlockChain(address1, new NetworkConsense(1, 5, reward), factory); // 50 0 bc.CreateTransaction(new Transaction(address1, address2, 20)); // 30 20 bc.CreateTransaction(new Transaction(address2, address1, 10)); // 40 10 bc.CreateTransaction(new Transaction(address1, address2, 5)); // 35 15 bc.MiningPedingTransactions(); var address1balance = bc.GetAddressBalance(address1); var address2balance = bc.GetAddressBalance(address2); address1balance.Should().Be(35); address2balance.Should().Be(15); }