public override async Task OnConnectedAsync(ConnectionContext connection)
        {
            if (_connectionLoops.ContainsKey(connection.RemoteEndPoint))
            {
                _logger.LogWarning($"another inbound connection from a known peer: {connection.RemoteEndPoint.ToEndpointString()}. Ignoring");
                return;
            }

            _logger.LogDebug($"New inbound connection from {connection.RemoteEndPoint.ToEndpointString()}");
            var(descriptor, writeReceiver) = descriptorFactory.GetNewSocket(connection.Transport.Output);
            // TODO: using "BTC" here is not clean.
            var peerMan = PeerManagerProvider.GetPeerManager("BTC");

            peerMan.NewInboundConnection(descriptor);
            Func <Task> cleanup = async() =>
            {
                _connectionLoops.TryRemove(connection.RemoteEndPoint, out _);
                await _repository.RemoveRemoteEndPoint(connection.RemoteEndPoint);
            };
            await _repository.SetRemoteEndPoint(connection.RemoteEndPoint);

            var conn = new ConnectionLoop(connection.Transport, descriptor, peerMan, writeReceiver, EventNotify.Writer, _loggerFactory.CreateLogger <ConnectionLoop>(), cleanup);

            _connectionLoops.TryAdd(connection.RemoteEndPoint, conn);
            conn.Start(connection.ConnectionClosed);
            await conn.ExecutionTask;
        }
Exemple #2
0
 public ChannelController(PeerManagerProvider peerManagerProvider, NRustLightningNetworkProvider networkProvider, ILogger <ChannelController> logger, EventAggregator eventAggregator)
 {
     _peerManagerProvider = peerManagerProvider;
     _networkProvider     = networkProvider;
     _logger          = logger;
     _eventAggregator = eventAggregator;
     _pool            = MemoryPool <byte> .Shared;
 }
 public InfoController(IKeysRepository keysRepository, IOptions <Config> config,
                       P2PConnectionHandler connectionHandler, NRustLightningNetworkProvider networkProvider,
                       RepositoryProvider repositoryProvider, PeerManagerProvider peerManagerProvider)
 {
     this.keysRepository  = keysRepository;
     _connectionHandler   = connectionHandler;
     _networkProvider     = networkProvider;
     _repositoryProvider  = repositoryProvider;
     _peerManagerProvider = peerManagerProvider;
     this.config          = config.Value;
 }
        /// <summary>
        /// Returns `false` if the peer is already connected. otherwise return `true`.
        /// </summary>
        /// <param name="remoteEndPoint"></param>
        /// <param name="pubkey"></param>
        /// <param name="ct"></param>
        /// <returns>true if the peer is unknown</returns>
        public async ValueTask <bool> NewOutbound(EndPoint remoteEndPoint, PubKey pubkey, CancellationToken ct = default)
        {
            if (remoteEndPoint == null)
            {
                throw new ArgumentNullException(nameof(remoteEndPoint));
            }
            if (pubkey == null)
            {
                throw new ArgumentNullException(nameof(pubkey));
            }
            if (_connectionLoops.ContainsKey(remoteEndPoint))
            {
                _logger.LogError($"We have already connected to: {remoteEndPoint.ToEndpointString()}.");
                return(false);
            }

            try
            {
                var connectionContext = await _connectionFactory.ConnectAsync(remoteEndPoint, ct);

                var(descriptor, writeReceiver) = descriptorFactory.GetNewSocket(connectionContext.Transport.Output);
                var peerMan     = PeerManagerProvider.GetPeerManager("BTC");
                var initialSend = peerMan.NewOutboundConnection(descriptor, pubkey.ToBytes());
                await connectionContext.Transport.Output.WriteAsync(initialSend, ct);

                var flushResult = connectionContext.Transport.Output.FlushAsync(ct);
                if (!flushResult.IsCompleted)
                {
                    await flushResult.ConfigureAwait(false);
                }

                Func <Task> cleanup = async() =>
                {
                    _connectionLoops.TryRemove(connectionContext.RemoteEndPoint, out _);
                    await _repository.RemoveRemoteEndPoint(connectionContext.RemoteEndPoint, ct);
                };
                await _repository.SetRemoteEndPoint(remoteEndPoint, ct);

                var conn = new ConnectionLoop(connectionContext.Transport, descriptor, peerMan,
                                              writeReceiver, EventNotify.Writer, _loggerFactory.CreateLogger <ConnectionLoop>(), cleanup);
                _connectionLoops.TryAdd(remoteEndPoint, conn);
                Task.Run(() => conn.Start(ct));
            }

            catch (SocketException ex) when(ex.SocketErrorCode == SocketError.ConnectionRefused)
            {
                _logger.LogError($"{ex.Message}:{Environment.NewLine}{ex.StackTrace}");
                return(false);
            }

            return(true);
        }
 public WalletController(NRustLightningNetworkProvider networkProvider,
                         IWalletService walletService,
                         PeerManagerProvider peerManagerProvider,
                         RepositoryProvider repositoryProvider,
                         INBXplorerClientProvider clientProvider)
 {
     _networkProvider     = networkProvider;
     _walletService       = walletService;
     _peerManagerProvider = peerManagerProvider;
     _repositoryProvider  = repositoryProvider;
     _clientProvider      = clientProvider;
     _pool = MemoryPool <byte> .Shared;
 }
 public P2PConnectionHandler(ISocketDescriptorFactory descriptorFactory, PeerManagerProvider peerManagerProvider,
                             ILoggerFactory loggerFactory, IConnectionFactory connectionFactory, IRepository repository)
 {
     // TODO: Support other chains
     this.descriptorFactory = descriptorFactory ?? throw new ArgumentNullException(nameof(descriptorFactory));
     _loggerFactory         = loggerFactory;
     _connectionFactory     = connectionFactory;
     _repository            = repository;
     _logger             = _loggerFactory.CreateLogger <P2PConnectionHandler>();
     PeerManagerProvider = peerManagerProvider;
     _logger.LogWarning("WARNING: it only supports BTC");
     _pool       = MemoryPool <byte> .Shared;
     EventNotify = Channel.CreateBounded <byte>(new BoundedChannelOptions(100));
 }
Exemple #7
0
 public PeerController(PeerManagerProvider peerManagerProvider, ISocketDescriptorFactory socketDescriptorFactory, P2PConnectionHandler connectionHandler)
 {
     _connectionHandler      = connectionHandler;
     PeerManagerProvider     = peerManagerProvider;
     SocketDescriptorFactory = socketDescriptorFactory;
 }
 public PubKey[] GetPeerNodeIds() => PeerManagerProvider.GetPeerManager("BTC").GetPeerNodeIds(_pool);