예제 #1
0
 public MiningInfoStratumMessage(MiningInfo miningInfo) : base(MessageType.MiningInfo)
 {
     this.AddField(miningInfo.GenerationSignature.ToByteArray())
     .AddField(ulong.Parse(miningInfo.BaseTarget))
     .AddField(ulong.Parse(miningInfo.Height))
     .AddField(miningInfo.TargetDeadline);
 }
예제 #2
0
        private async Task HandleMiningInfoUpdateAsync(MiningInfo miningInfo, CancellationToken cancellationToken)
        {
            using (var scope = _scopeFactory.CreateScope())
            {
                var context = scope.ServiceProvider.GetRequiredService <PoolContext>();
                if (!long.TryParse(miningInfo.Height, out var height))
                {
                    return;
                }
                if (!ulong.TryParse(miningInfo.BaseTarget, out var baseTarget))
                {
                    return;
                }
                using (var transaction = await context.Database.BeginTransactionAsync(cancellationToken))
                {
                    if (await context.Blocks.AnyAsync(i => i.Height == height, cancellationToken).ConfigureAwait(false))
                    {
                        return;
                    }

                    var newBlock = context.Blocks.Add(new Block()
                    {
                        Height     = height,
                        BaseTarget = baseTarget,
                        Difficulty = _shareCalculator.GetDifficulty(baseTarget)
                    }).Entity;
                    _logger.LogInformation($"Adding block {newBlock.Height} with difficulty {newBlock.Difficulty}");
                    await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                    transaction.Commit();
                    _logger.LogInformation($"Added block {newBlock.Height} with difficulty {newBlock.Difficulty}");
                    _messenger.Publish("Public.Block.Update", this, miningInfo);
                }
            }
        }
예제 #3
0
        //public void MiningConfirmed(List<Tuple<byte, Guid, decimal>> accountList)
        //{
        //    if (accountList == null || accountList.Count <= 0)
        //        return;

        //    MiningInfo info;
        //    foreach (var item in accountList)
        //    {
        //        info = new MiningInfo { AccountType = item.Item1, AccountId = item.Item2, Amount = item.Item3 };
        //        RabbitMQSender.SendMessage("MiningConfirmed", JsonConvert.SerializeObject(info));
        //    }
        //}

        public void MiningConfirmed(byte accountType, Guid accountId, decimal amount)
        {
            var info = new MiningInfo {
                AccountType = accountType, AccountId = accountId, Amount = amount
            };

            RabbitMQSender.SendMessage("MiningConfirmed", JsonConvert.SerializeObject(info));
        }
예제 #4
0
        public static byte[] CreateMiningInfoBuffer(MiningInfo miningInfo)
        {
            var baseTarget = CreateField(ulong.Parse(miningInfo.BaseTarget));
            var height     = CreateField(ulong.Parse(miningInfo.Height));
            var target     = CreateField(miningInfo.TargetDeadline);
            var genSig     = CreateField(miningInfo.GenerationSignature.ToByteArray());

            return(CreateMessageBuffer(MessageType.MiningInfo, 4, MergeFields(genSig, baseTarget, height, target)));
        }
예제 #5
0
        protected override async Task ExecuteAsync(CancellationToken stopCancellationToken)
        {
            _logger.LogInformation("Started block monitoring background job.");
            ulong lastBlock = 0;

            while (!stopCancellationToken.IsCancellationRequested)
            {
                try
                {
                    await Task.Delay(TimeSpan.FromSeconds(1), stopCancellationToken).ConfigureAwait(false);

                    var walletUrl  = _configuration.GetSection("Pool")?.GetValue <string>("TrustedWallet");
                    var uriBuilder = new UriBuilder(walletUrl);
                    uriBuilder.Path  = "/burst";
                    uriBuilder.Query = "?requestType=getMiningInfo";
                    var response = await _client.GetAsync(uriBuilder.Uri, stopCancellationToken).ConfigureAwait(false);

                    response.EnsureSuccessStatusCode();
                    var miningInfo = JObject.Parse(await response.Content.ReadAsStringAsync().ConfigureAwait(false)).ToObject <MiningInfo>();
                    if (ulong.TryParse(miningInfo.Height, out var height) && height > lastBlock)
                    {
                        await HandleMiningInfoUpdateAsync(miningInfo, stopCancellationToken).ConfigureAwait(false);

                        lastBlock = height;
                    }
                    MiningInfo = miningInfo;
                }
                catch (OperationCanceledException) when(stopCancellationToken.IsCancellationRequested)
                {
                    return;
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Failed to update mining information. Will retry.");
                    await Task.Delay(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
                }
            }
        }
예제 #6
0
 public static byte[] CreateMiningInfoBuffer(MiningInfo miningInfo)
 {
     return(new MiningInfoStratumMessage(miningInfo).Build());
 }