diff --git a/BasicBlockChain.Core/BlockChain.cs b/BasicBlockChain.Core/BlockChain.cs index 7406ebd..e6a6a49 100644 --- a/BasicBlockChain.Core/BlockChain.cs +++ b/BasicBlockChain.Core/BlockChain.cs @@ -11,12 +11,66 @@ namespace BasicBlockChain.Core public int Difficulty { get; set; } = 2; public int Reward { get; set; } = 1_000_000; + private List _users = null; + + public List Users + { + get + { + if (_users == null) + { + InitUsers(); + } + return _users; + } + } + + private void InitUsers() + { + _users = new List(); + foreach (Block block in Chain) + { + foreach (Transaction transaction in block.Transactions) + { + AddUser(transaction.Sender, false); + AddUser(transaction.Receiver, false); + } + } + } + + private void AddUser(string user, bool init = true) + { + if (string.IsNullOrEmpty(user)) { return; } + if (_users == null) + { + if (init) + { + InitUsers(); + } + else + { + return; + } + } + if (_users.Contains(user)) { return; } + _users.Add(user); + } + + private void AddUsersOfBlock(Block block) + { + foreach (Transaction transaction in block.Transactions) + { + AddUser(transaction.Sender); + AddUser(transaction.Receiver); + } + } + public BlockChain(DateTime? genesisDate = null, int difficulty = 2, int reward = 1_000_000) { Block genesisBlock = new Block(genesisDate ?? DateTime.UtcNow, null, null); genesisBlock.Mine(difficulty); Difficulty = difficulty; - Reward = 1_000_000; + Reward = reward; Chain.Add(genesisBlock); } @@ -25,6 +79,7 @@ namespace BasicBlockChain.Core Block lastBlock = Chain.Last(); Block newBlock = new Block(date, lastBlock, transactions); newBlock.Mine(Difficulty); + AddUsersOfBlock(newBlock); Chain.Add(newBlock); } @@ -39,6 +94,7 @@ namespace BasicBlockChain.Core Block newBlock = new Block(date, lastBlock, PendingTransactions); newBlock.Transactions.Add(new Transaction(null, miner, Reward, date)); newBlock.Mine(Difficulty); + AddUsersOfBlock(newBlock); Chain.Add(newBlock); PendingTransactions.Clear(); }