public void StopMining(bool result, string startId) { var stopMsg = StopMiningMsg.CreateNew(); stopMsg.StopTime = Time.EpochTime; var block = RedisManager.Current.GetDataInRedis <BlockMsg>(startId); stopMsg.CurrentHeight = Convert.ToInt32(block.Header.Height); stopMsg.StartMsgId = startId; if (result) { stopMsg.StopReason = StopReason.MiningSucesses; _generatedBlockCount++; } else { stopMsg.StopReason = StopReason.IsMininged; } //MQApi.SendStopMsg(stopMsg); RabbitMQApi.SendStopMsg(stopMsg); if (!RemoveStartMsgIds.ContainsKey(stopMsg.StartMsgId)) { RemoveStartMsgIds.Add(stopMsg.StartMsgId, stopMsg.StopTime); } }
static void Init(PoolArgs args) { GlobalParameters.IsTestnet = args.IsTestNet; PoolCenterConfig config = ConfigurationTool.GetAppSettings <PoolCenterConfig>("OmniCoin.PoolCenter.conf.json", "PoolCenterSetting"); if (config == null) { throw new Exception("read config from OmniCoin.PoolCenter.conf.json failed!!!"); } if (string.IsNullOrWhiteSpace(config.RabbitMqConnectString)) { throw new Exception("RabbitMqConnectString from OmniCoin.PoolCenter.conf.json can't be null or empty!!!"); } RabbitMQ.RabbitMqSetting.CONNECTIONSTRING = config.RabbitMqConnectString; Pool.Redis.Setting.Init(config.RedisTestnetConnections, config.RedisMainnetConnections); MiningPool.Data.DataAccessComponent.MainnetConnectionString = config.MySqlMainnetConnectString; MiningPool.Data.DataAccessComponent.TestnetConnectionString = config.MySqlTestnetConnectString; ConfigCenter.ConfigPoolCenter = config; Setting.Init(config.NodeRpcMainnet, config.NodeRpcTestnet); //KafkaMQ.KafkaInfo.MqName = Setting.CENTERKAFKAGROUPNAME; NodeApi.Current = new NodeApi(Setting.API_URL); //MQApi.Init(); RabbitMQApi.Init(); }
private static void Start(PoolArgs args) { try { //MQApi.SendStopMsg(new ShareModels.Msgs.StopMiningMsg { StopReason = StopReason.ReStart }); RabbitMQApi.SendStopMsg(new ShareModels.Msgs.StopMiningMsg { StopReason = StopReason.ReStart }); PoolCenterJob.Current = new PoolCenterJob(args); PoolCenterJob.Current.Start(); PoolCenterJob.Current.StartListen(); LogHelper.Info("OmniCoin PoolCenter Start !!!"); TimerTasks.Current.Init(); } catch (Exception ex) { LogHelper.Error(ex.ToString()); } }
private void StartMining() { var block = NodeApi.Current.GenerateMiningBlock(_startArgs.Name, _startArgs.Account); var currentScoopNumber = POC.GetScoopNumber(block.Header.PayloadHash, block.Header.Height); _startTime = Time.EpochTime; block.Header.Timestamp = _startTime; if (block.Header.Height != this.currentBlockHeight || this.currentBlockStartTime <= 0) { this.currentBlockStartTime = _startTime; this.currentBlockHeight = block.Header.Height; } StartMiningMsg startMiningMsg = StartMiningMsg.CreateNew(); startMiningMsg.BlockHeight = block.Header.Height; startMiningMsg.ScoopNumber = currentScoopNumber; startMiningMsg.StartTime = _startTime; var genHash = BlockHelper.GenHash(block.Header.PayloadHash, block.Header.Height); startMiningMsg.GenHash = Base16.Encode(genHash); startMiningMsg.BaseTarget = NodeApi.Current.GetBaseTarget(block.Header.Height); var blockKey = KeyHelper.GetBlockKey(startMiningMsg.Id); RedisManager.Current.SaveDataToRedis(blockKey, block); //MQApi.SendStartMsg(startMiningMsg); RabbitMQApi.SendStartMsg(startMiningMsg); CurrentStartMiningMsg = startMiningMsg; LogHelper.Info("Start MiningTask Id=" + startMiningMsg.Id + " ScoopNumber = " + startMiningMsg.ScoopNumber + " Height= " + startMiningMsg.BlockHeight); LogHelper.Info($"Block bits is {POC.ConvertBitsToBigInt(block.Header.Bits).ToString("X").PadLeft(64, '0')}"); LogHelper.Info($"StartMiningMsg.BaseTarget is {POC.ConvertBitsToBigInt(startMiningMsg.BaseTarget).ToString("X").PadLeft(64, '0')}"); LogHelper.Info($"Block height is {block.Header.Height}"); }
internal static void Received(TcpReceiveState e, PoolCommand cmd) { var miner = PoolCache.WorkingMiners.FirstOrDefault(m => m.ClientAddress == e.Address && m.IsConnected); if (miner == null) { LogHelper.Info("Received invalid scoop data from " + e.Address); LogHelper.Info("Miner logout"); PoolJob.TcpServer.CloseSocket(e); return; } if (PoolCache.CurrentTask == null || PoolCache.CurrentTask.State != MiningState.Mining) { return; } var msg = new ScoopDataMsg(); int index = 0; msg.Deserialize(cmd.Payload, ref index); PoolCache.CurrentTask.LastReceiveTime = Time.EpochTime; var minerinfo = PoolCache.CurrentTask.MinerEfforts.FirstOrDefault(x => x.Account == miner.WalletAddress); if (minerinfo == null) { PoolCache.CurrentTask.MinerEfforts.Add(new Models.MinerEffort { Account = miner.WalletAddress, Effort = 1 }); } else { if (minerinfo.Effort == Setting.MaxNonceCount) { RejectCommand.Send(e); return; } minerinfo.Effort++; } if (msg.BlockHeight != PoolCache.CurrentTask.CurrentBlockHeight) { LogHelper.Info("Received invalid scoop data from " + e.Address + ", nonce is " + msg.Nonce + ", height is " + msg.BlockHeight); LogHelper.Info("Block Height invalid , Stop and Send StartMsg"); var stopMsg = new StopMsg { BlockHeight = msg.BlockHeight, Result = false, StartTime = Time.EpochTime, StopTime = Time.EpochTime }; StopCommand.Send(e, stopMsg); Task.Delay(1000).Wait(); var startMsg = PoolCache.CurrentTask.CurrentStartMsg; if (startMsg != null) { StartCommand.Send(e, startMsg); } return; } LogHelper.Info("Received scoop data from " + miner.ClientAddress + ", nonce is " + msg.Nonce + ", scoop number is " + msg.ScoopNumber + ", block height is " + msg.BlockHeight); if (msg.ScoopNumber != PoolCache.CurrentTask.CurrentScoopNumber) { LogHelper.Info("Received invalid scoop data from " + e.Address + ", nonce is " + msg.Nonce + ", ScoopNumber is " + PoolCache.CurrentTask.CurrentScoopNumber + "/" + msg.ScoopNumber); LogHelper.Info("Scoop Number invalid"); return; } var verResult = POC.Verify(PoolCache.CurrentTask.BaseTarget, msg.Target); LogHelper.Debug("Bits:" + POC.ConvertBitsToBigInt(PoolCache.CurrentTask.BaseTarget).ToString("X").PadLeft(64, '0')); LogHelper.Debug("Hash:" + Base16.Encode(msg.Target)); LogHelper.Debug("Verify Result is " + verResult); if (!verResult) { return; } ForgeMsg forgeMsg = new ForgeMsg(); forgeMsg.Account = msg.WalletAddress; forgeMsg.Nonce = msg.Nonce; forgeMsg.StartMsgId = PoolCache.CurrentTask.Id; //MQApi.SendForgeBlock(msg.WalletAddress, msg.Nonce, PoolCache.CurrentTask.Id); RabbitMQApi.SendForgeBlock(msg.WalletAddress, msg.Nonce, PoolCache.CurrentTask.Id); }