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); } }
/// <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)); }