예제 #1
0
        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);
            }
        }
예제 #2
0
        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();
        }
예제 #3
0
        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());
            }
        }
예제 #4
0
        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}");
        }
예제 #5
0
        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);
        }