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); }
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); } } }
//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)); }
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))); }
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); } } }
public static byte[] CreateMiningInfoBuffer(MiningInfo miningInfo) { return(new MiningInfoStratumMessage(miningInfo).Build()); }