public void Mine()
        {
            int division = int.MaxValue / Miners.minerIPs.Count;

            Nonce = 0;
            for (int a = 0; a < Miners.minerIPs.Count; a++)
            {
                if (Miners.minerIPs[a].Equals(TCP.myIP))
                {
                    Nonce = division * a;
                }
            }
            Console.WriteLine("Mine started");
            while (true)
            {
                //if(Nonce%1000 == 0)
                //    Console.WriteLine(Nonce);
                if (ChangeNonce(Nonce))
                {
                    Console.WriteLine("Mine ended");
                    Time = DateTime.Now;
                    Miners.SetMyMinerTrue(this);
                    TCP.SendAllMiners("checkNonce" + Time.ToString() + "$" + BlockID.ToString() + "$" + Nonce.ToString());
                    break;
                }
                else
                {
                    Nonce++;
                }
            }
            Console.WriteLine(
                "Block's hash is -> " + Hash +
                "\nBlock's nonce is -> " + Nonce + "\n" +
                "Found Date is -> " + Time + "\n");
        }
        /// <summary>
        /// Set miner true when another miner found the nonce
        /// </summary>
        /// <param name="time"></param>
        /// <param name="blockID"></param>
        /// <param name="nonce"></param>
        public static void SetMyMinerTrue(DateTime time, long blockID, int nonce, string ip)
        {
            Console.WriteLine("Nonce is checking for " + blockID);
            var   keyValuePair = GetBlockInProcessingBlock(blockID);
            Block block        = keyValuePair.Value;

            if (block == null)
            {
                return;
            }

            if (block.ChangeNonce(nonce))
            {
                block.Time = time;
                Console.WriteLine("Nonce is true for " + blockID);

                UpdateProcessingBlockList(block);
                SetMinersTrue(ip, block.BlockID);

                TCP.SendAllMiners("nonceIsTrue" + blockID);
            }
            else
            {
                Console.WriteLine("Nonce is wrong for " + blockID);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Adds block to chain if more than %50 of miners agrees it
        /// </summary>
        /// <param name="block"></param>
        /// <param name="blockID"></param>
        public static void AddBlockToChain(Block block)
        {
            for (int a = 0; a < Miners.miners.Count; a++)
            {
                for (int b = 0; b < Miners.miners[a].Count; b++)
                {
                    if (Miners.miners[a][b].Key.BlockID == block.BlockID)
                    {
                        if (Miners.miners[a][b].Key.Time.CompareTo(block.Time) < 0)
                        {
                            block.Time  = Miners.miners[a][b].Key.Time;
                            block.Nonce = Miners.miners[a][b].Key.Nonce;
                            block.Hash  = Miners.miners[a][b].Key.Hash;
                        }
                        Miners.miners[a].RemoveAt(b);
                        break;
                    }
                }
            }

            for (int a = 0; a < Chain.Count; a++)
            {
                if (Chain[a].BlockID == block.BlockID)
                {
                    return;
                }
            }

            Chain.Add(block);

            // notify all miners that a block is added into the local chain
            TCP.SendAllMiners("block" + TCP.JsonSerialize(block));
        }