private async Task DetectChainAsync() { var commands = new[] { new DaemonCmd(EC.GetNetVersion), new DaemonCmd(EC.ParityChain), }; var results = await daemon.ExecuteBatchAnyAsync(commands); if (results.Any(x => x.Error != null)) { var errors = results.Where(x => x.Error != null) .ToArray(); if (errors.Any()) { throw new Exception($"Chain detection failed: {string.Join(", ", errors.Select(y => y.Error.Message))}"); } } // convert network var netVersion = results[0].Response.ToObject <string>(); var parityChain = results[1].Response.ToObject <string>(); EthereumUtils.DetectNetworkAndChain(netVersion, parityChain, out networkType, out chainType); }
protected override async Task PostStartInitAsync() { var commands = new[] { new DaemonCmd(EC.GetNetVersion), new DaemonCmd(EC.GetAccounts), new DaemonCmd(EC.GetCoinbase), new DaemonCmd(EC.ParityVersion), new DaemonCmd(EC.ParityChain), }; var results = await daemon.ExecuteBatchAnyAsync(commands); if (results.Any(x => x.Error != null)) { if (results[4].Error != null) { logger.ThrowLogPoolStartupException($"Looks like you are NOT running 'Parity' as daemon which is not supported - https://parity.io/", LogCat); } var errors = results.Where(x => x.Error != null) .ToArray(); if (errors.Any()) { logger.ThrowLogPoolStartupException($"Init RPC failed: {string.Join(", ", errors.Select(y => y.Error.Message))}", LogCat); } } // extract results var netVersion = results[0].Response.ToObject <string>(); var accounts = results[1].Response.ToObject <string[]>(); var coinbase = results[2].Response.ToObject <string>(); var parityVersion = results[3].Response.ToObject <JObject>(); var parityChain = results[4].Response.ToObject <string>(); // ensure pool owns wallet if (!accounts.Contains(poolConfig.Address) || coinbase != poolConfig.Address) { logger.ThrowLogPoolStartupException($"Daemon does not own pool-address '{poolConfig.Address}'", LogCat); } EthereumUtils.DetectNetworkAndChain(netVersion, parityChain, out networkType, out chainType); ConfigureRewards(); // update stats BlockchainStats.RewardType = "POW"; BlockchainStats.NetworkType = $"{chainType}"; await UpdateNetworkStatsAsync(); // make sure we have a current DAG while (true) { var blockTemplate = await GetBlockTemplateAsync(); if (blockTemplate == null) { logger.Info(() => $"[{LogCat}] Waiting for first valid block template"); await Task.Delay(TimeSpan.FromSeconds(5)); continue; } await ethash.GetDagAsync(blockTemplate.Height); break; } SetupJobUpdates(); }
protected override async Task PostStartInitAsync(CancellationToken ct) { var commands = new[] { new DaemonCmd(EC.GetNetVersion), new DaemonCmd(EC.GetAccounts), new DaemonCmd(EC.GetCoinbase), new DaemonCmd(EC.ParityVersion), new DaemonCmd(EC.ParityChain), }; var results = await daemon.ExecuteBatchAnyAsync(commands); if (results.Any(x => x.Error != null)) { if (results[4].Error != null) { logger.ThrowLogPoolStartupException($"Looks like you are NOT running 'Parity' as daemon which is not supported - https://parity.io/", LogCat); } var errors = results.Where(x => x.Error != null) .ToArray(); if (errors.Any()) { logger.ThrowLogPoolStartupException($"Init RPC failed: {string.Join(", ", errors.Select(y => y.Error.Message))}", LogCat); } } // extract results var netVersion = results[0].Response.ToObject <string>(); var accounts = results[1].Response.ToObject <string[]>(); var coinbase = results[2].Response.ToObject <string>(); var parityVersion = results[3].Response.ToObject <JObject>(); var parityChain = results[4].Response.ToObject <string>(); // ensure pool owns wallet //if (clusterConfig.PaymentProcessing?.Enabled == true && !accounts.Contains(poolConfig.Address) || coinbase != poolConfig.Address) // logger.ThrowLogPoolStartupException($"Daemon does not own pool-address '{poolConfig.Address}'", LogCat); EthereumUtils.DetectNetworkAndChain(netVersion, parityChain, out networkType, out chainType); if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) { ConfigureRewards(); } // update stats BlockchainStats.RewardType = "POW"; BlockchainStats.NetworkType = $"{chainType}-{networkType}"; await UpdateNetworkStatsAsync(); // Periodically update network stats Observable.Interval(TimeSpan.FromMinutes(10)) .Select(via => Observable.FromAsync(UpdateNetworkStatsAsync)) .Concat() .Subscribe(); if (poolConfig.EnableInternalStratum == true) { // make sure we have a current DAG while (true) { var blockTemplate = await GetBlockTemplateAsync(); if (blockTemplate != null) { logger.Info(() => $"[{LogCat}] Loading current DAG ..."); await ethash.GetDagAsync(blockTemplate.Height, logger); logger.Info(() => $"[{LogCat}] Loaded current DAG"); break; } logger.Info(() => $"[{LogCat}] Waiting for first valid block template"); await Task.Delay(TimeSpan.FromSeconds(5), ct); } SetupJobUpdates(); } }