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})");
                    }
                }
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }