private bool VerifyBlock(BlockDetailedModel model) { foreach (var mod in model.Transactions) { mod.State = "Unverified"; } var transactionHash = MerkleTree <TransactionModel> .Compute(model.Transactions.OrderBy(x => x.Id).ToList()); var obj = new MiningBlock { Hash = transactionHash.TrimEnd('=') + model.PreviousHash.TrimEnd('='), PreviousBlockHash = model.PreviousHash.TrimEnd('='), Nonce = model.Nonce, Miner = model.Miner }; using (SHA256Managed sha = new SHA256Managed()) { using (MemoryStream ms = new MemoryStream()) { ms.Position = 0; BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); return(model.Hash == Convert.ToBase64String(sha.ComputeHash(ms.ToArray()))); } } }
private void _txTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (_httpClient.CheckTransactionsAmount()) { var transactions = _httpClient.GetUnverifiedTransactions(); var block = _httpClient.GetLastBlock()?.Hash ?? "0000000000"; Block = new BlockDetailedModel { Transactions = transactions, PreviousHash = block }; _txTimer.Stop(); Task.Factory.StartNew(() => Run(), _miningTokenSource.Token); } }