public async Task <bool> TestAsync() { var passed = true; try { await RPCArgs.TestRPCAsync(_Network.Network, _RPC); } catch (Exception ex) { Log(ex); passed = false; } try { Logs.Configuration.LogInformation("Trying to connect to node: " + _Configuration.NodeEndpoint); using (var node = Node.Connect(_Network.Network, _Configuration.NodeEndpoint)) { var cts = new CancellationTokenSource(); cts.CancelAfter(5000); node.VersionHandshake(cts.Token); Logs.Configuration.LogInformation("Handshaked"); } Logs.Configuration.LogInformation("Node connection successfull"); } catch (Exception ex) { Log(ex); passed = false; } return(passed); }
public static void ConfigureServices(IConfiguration conf, IServiceCollection services) { services.AddMvcCore() .AddJsonFormatters() .AddAuthorization() .AddFormatterMappings(); var clightning = conf.GetOrDefault("clightning", GetDefaultLightningDirectory()); if (!LightningConnectionString.TryParse(clightning, out var connectionString)) { throw new ConfigException("Invalid clightning parameter (expected path to lightning-rpc or url)"); } var args = RPCArgs.Parse(conf, Network.RegTest); var btcrpc = args.ConfigureRPCClient(Network.RegTest); services.AddSingleton(btcrpc); RPCArgs.TestRPCAsync(Network.RegTest, btcrpc, default(CancellationToken)).GetAwaiter().GetResult(); var rpc = new CLightning.CLightningRPCClient(connectionString.ToUri(true), Network.RegTest); services.AddSingleton(rpc); services.AddSingleton <ILightningInvoiceClient>(rpc); DateTimeOffset start = DateTimeOffset.UtcNow; while (true) { try { rpc.GetInfoAsync().GetAwaiter().GetResult(); break; } catch (Exception ex) { if (DateTimeOffset.UtcNow - start > TimeSpan.FromSeconds(5)) { throw new ConfigException($"Lightning connection failed ({ex.Message})"); } } } }
async Task <bool> StepAsync(CancellationToken token) { var oldState = State; switch (State) { case BitcoinDWaiterState.NotStarted: await RPCArgs.TestRPCAsync(_Network, _RPCWithTimeout, token); _OriginalRPC.Capabilities = _RPCWithTimeout.Capabilities; GetBlockchainInfoResponse blockchainInfo = null; try { blockchainInfo = await _RPCWithTimeout.GetBlockchainInfoAsyncEx(); if (_Network.CryptoCode == "BTC" && _Network.NBitcoinNetwork.NetworkType == NetworkType.Mainnet && !_BanListLoaded) { if (await LoadBanList()) { _BanListLoaded = true; } } if (blockchainInfo != null && _Network.NBitcoinNetwork.NetworkType == NetworkType.Regtest) { if (await WarmupBlockchain()) { blockchainInfo = await _RPCWithTimeout.GetBlockchainInfoAsyncEx(); } } } catch (Exception ex) { Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failed to connect to RPC"); break; } if (IsSynchingCore(blockchainInfo)) { State = BitcoinDWaiterState.CoreSynching; } else { await ConnectToBitcoinD(token); State = BitcoinDWaiterState.NBXplorerSynching; } break; case BitcoinDWaiterState.CoreSynching: GetBlockchainInfoResponse blockchainInfo2 = null; try { blockchainInfo2 = await _RPCWithTimeout.GetBlockchainInfoAsyncEx(); } catch (Exception ex) { Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failed to connect to RPC"); State = BitcoinDWaiterState.NotStarted; break; } if (!IsSynchingCore(blockchainInfo2)) { await ConnectToBitcoinD(token); State = BitcoinDWaiterState.NBXplorerSynching; } break; case BitcoinDWaiterState.NBXplorerSynching: var explorer = GetExplorerBehavior(); if (explorer == null) { State = BitcoinDWaiterState.NotStarted; } else if (!explorer.IsSynching()) { State = BitcoinDWaiterState.Ready; } break; case BitcoinDWaiterState.Ready: var explorer2 = GetExplorerBehavior(); if (explorer2 == null) { State = BitcoinDWaiterState.NotStarted; } else if (explorer2.IsSynching()) { State = BitcoinDWaiterState.NBXplorerSynching; } break; default: break; } var changed = oldState != State; if (changed) { if (oldState == BitcoinDWaiterState.NotStarted) { NetworkInfo = await _RPCWithTimeout.GetNetworkInfoAsync(); } _EventAggregator.Publish(new BitcoinDStateChangedEvent(_Network, oldState, State)); if (State == BitcoinDWaiterState.Ready) { await File.WriteAllTextAsync(RPCReadyFile, NBitcoin.Utils.DateTimeToUnixTime(DateTimeOffset.UtcNow).ToString()); } } if (State != BitcoinDWaiterState.Ready) { EnsureRPCReadyFileDeleted(); } return(changed); }
async Task <bool> StepAsync(CancellationToken token) { var oldState = State; switch (State) { case BitcoinDWaiterState.NotStarted: await RPCArgs.TestRPCAsync(_Network, _RPC, token); GetBlockchainInfoResponse blockchainInfo = null; try { blockchainInfo = await _RPC.GetBlockchainInfoAsyncEx(); if (blockchainInfo != null && _Network.NBitcoinNetwork.NetworkType == NetworkType.Regtest) { if (await WarmupBlockchain()) { blockchainInfo = await _RPC.GetBlockchainInfoAsyncEx(); } } } catch (Exception ex) { Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failed to connect to RPC"); break; } if (IsSynchingCore(blockchainInfo)) { State = BitcoinDWaiterState.CoreSynching; } else { await ConnectToBitcoinD(token); State = BitcoinDWaiterState.NBXplorerSynching; } break; case BitcoinDWaiterState.CoreSynching: GetBlockchainInfoResponse blockchainInfo2 = null; try { blockchainInfo2 = await _RPC.GetBlockchainInfoAsyncEx(); } catch (Exception ex) { Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failed to connect to RPC"); State = BitcoinDWaiterState.NotStarted; break; } if (!IsSynchingCore(blockchainInfo2)) { await ConnectToBitcoinD(token); State = BitcoinDWaiterState.NBXplorerSynching; } break; case BitcoinDWaiterState.NBXplorerSynching: var explorer = _Group?.ConnectedNodes.SelectMany(n => n.Behaviors.OfType <ExplorerBehavior>()).FirstOrDefault(); if (explorer == null) { GetBlockchainInfoResponse blockchainInfo3 = null; try { blockchainInfo3 = await _RPC.GetBlockchainInfoAsyncEx(); } catch (Exception ex) { Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failed to connect to RPC"); State = BitcoinDWaiterState.NotStarted; break; } if (IsSynchingCore(blockchainInfo3)) { State = BitcoinDWaiterState.CoreSynching; } } else if (!explorer.IsSynching()) { State = BitcoinDWaiterState.Ready; } break; case BitcoinDWaiterState.Ready: var explorer2 = _Group?.ConnectedNodes.SelectMany(n => n.Behaviors.OfType <ExplorerBehavior>()).FirstOrDefault(); if (explorer2 == null) { State = BitcoinDWaiterState.NotStarted; } else if (explorer2.IsSynching()) { State = BitcoinDWaiterState.NBXplorerSynching; } break; default: break; } var changed = oldState != State; if (changed) { _EventAggregator.Publish(new BitcoinDStateChangedEvent(_Network, oldState, State)); } return(changed); }