Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            }
        }