public bool VerifyTarget(Block block) { var last = _blockChainService.LookUpBlockInfo(block.Body.LastBlockId); var info = new BlockInfo() { CreationTime = block.TimeOfCreation, Height = last.Height + 1, Id = block.Body.Id, LastBlockId = block.Body.LastBlockId, Target = "" }; var target = _difficultyService.TargetForBlock(info); var bb = new BigInteger(Convert.FromBase64String(block.Body.Id)); return(target >= bb); }
private void Miner() { var id = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("[Info]New miner {0}", id); if (Terminators.ContainsKey(id)) { Terminators[id] = false; } else { Terminators.Add(id, false); } List <Transaction> choosenTxs; if (MemPool.Count == 0) { return; } else { choosenTxs = ChooseTxs(); } var nounce = GenerateRandomString(); var newInfo = new BlockInfo() { LastBlockId = _blockChainService.Info.EndOfLongestChain, Height = _blockChainService.Info.Height + 1, Id = "", Target = "" }; var target = _difficultyService.TargetForBlock(newInfo); var targetString = Convert.ToBase64String(target.ToByteArray()); _logger.Log($"Choosen for mine : {choosenTxs.Count}"); foreach (var transaction in choosenTxs) { _logger.Log($"{transaction.Body.TransactionId} - transaction"); } var bBody = new BlockBody() { Height = newInfo.Height, Id = "", LastBlockId = _blockChainService.Info.EndOfLongestChain, MinerVOut = GetMinerVOut(choosenTxs, newInfo.Height), Nounce = nounce, Target = targetString, Tx = choosenTxs }; var block = new Block { TimeOfCreation = DateTime.UtcNow, Body = bBody }; var lastTime = DateTime.UtcNow; var tries = 0; Block.SetUniqueBlockId(block); var totalRips = block.Body.MinerVOut.Amount; while (!IsNounceGood(target, block)) { nounce = GenerateRandomString(); block.TimeOfCreation = DateTime.UtcNow; block.Body.Nounce = nounce; block.TimeOfCreation = DateTime.UtcNow; Block.SetUniqueBlockId(block); tries++; if (tries % 100000 == 0) { Console.WriteLine("[MinerInfo]{0}|Hashing at - {1}/Hs | Working on {2} rips of block", Thread.CurrentThread.ManagedThreadId, 100000f * 1 / (DateTime.UtcNow - lastTime).TotalSeconds, totalRips.ToString()); lastTime = DateTime.UtcNow; } if (Terminators[id]) { Console.WriteLine("[MinerInfo]{0}|Aborting", id); break; } } if (!Terminators[id]) { Console.WriteLine("[MinerInfo]Miner finished"); _eventManager.PassNewTrigger(block, EventTypes.EventType.NewBlock); } }