コード例 #1
0
ファイル: ListenerTester.cs プロジェクト: sukhdev22/QBitNinja
        public ListenerTester(ServerTester tester, bool nodeOnly)
        {
            _Network = tester.Configuration.Indexer.Network;
            Random rand = new Random();

            _Server = tester;
            _Server._disposables.Add(this);

            _Listener = new QBitNinjaNodeListener(_Server.Configuration);

            _NodeServer   = new NodeServer(_Server.Configuration.Indexer.Network, internalPort: rand.Next(20000, 50000));
            _NodeListener = new EventLoopMessageListener <IncomingMessage>(NewNodeMessage);
            _NodeServer.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), _NodeServer.LocalEndpoint.Port);
            _NodeServer.AllowLocalPeers  = true;
            _NodeServer.InboundNodeConnectionParameters.IsRelay = true;
            _NodeServer.AllMessages.AddMessageListener(_NodeListener);
            _NodeServer.Listen();

            _Listener.Configuration.Indexer.Node = "127.0.0.1:" + _NodeServer.LocalEndpoint.Port;
            if (!nodeOnly)
            {
                _Listener.Listen();
            }

            _Server.Configuration.Indexer.CreateIndexer().Index(_Server.Configuration.Indexer.Network.GetGenesis());

            _Server.ChainBuilder.SkipIndexer     = true;
            _Server.ChainBuilder.NewBlock       += ChainBuilder_NewBlock;
            _Server.ChainBuilder.NewTransaction += ChainBuilder_NewTransaction;

            var genesis = _Server.Configuration.Indexer.Network.GetGenesis();

            _Blocks.AddOrReplace(genesis.Header.GetHash(), genesis);
        }
コード例 #2
0
        /// <summary>
        /// Initializes instance of a network peer server.
        /// </summary>
        /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param>
        /// <param name="version">Version of the network protocol that the server should run.</param>
        /// <param name="internalPort">Port on which the server will listen, or -1 to use the default port for the selected network.</param>
        /// <param name="dateTimeProvider">Provider of time functions.</param>
        /// <param name="loggerFactory">Factory for creating loggers.</param>
        /// <param name="networkPeerFactory">Factory for creating P2P network peers.</param>
        public NetworkPeerServer(Network network, ProtocolVersion version, int internalPort, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, INetworkPeerFactory networkPeerFactory)
        {
            internalPort = internalPort == -1 ? network.DefaultPort : internalPort;

            this.logger             = loggerFactory.CreateLogger(this.GetType().FullName, $"[{internalPort}] ");
            this.dateTimeProvider   = dateTimeProvider;
            this.networkPeerFactory = networkPeerFactory;

            this.AllowLocalPeers = true;
            this.InboundNetworkPeerConnectionParameters = new NetworkPeerConnectionParameters();

            this.localEndpoint = new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), internalPort);

            this.MaxConnections   = 125;
            this.Network          = network;
            this.externalEndpoint = new IPEndPoint(this.localEndpoint.Address, this.Network.DefaultPort);
            this.Version          = version;

            var listener = new EventLoopMessageListener <IncomingMessage>(ProcessMessage);

            this.messageProducer.AddMessageListener(listener);
            this.OwnResource(listener);

            this.ConnectedNetworkPeers          = new NetworkPeerCollection();
            this.ConnectedNetworkPeers.Added   += Peers_PeerAdded;
            this.ConnectedNetworkPeers.Removed += Peers_PeerRemoved;
            this.ConnectedNetworkPeers.MessageProducer.AddMessageListener(listener);

            this.AllMessages = new MessageProducer <IncomingMessage>();
            this.trace       = new TraceCorrelation(NodeServerTrace.Trace, "Network peer server listening on " + this.LocalEndpoint);
        }
コード例 #3
0
        public NodeServer(Network network, ProtocolVersion version = ProtocolVersion.PROTOCOL_VERSION, int internalPort = -1)
        {
            this.AllowLocalPeers = true;
            this.InboundNodeConnectionParameters = new NodeConnectionParameters();

            internalPort       = internalPort == -1 ? network.DefaultPort : internalPort;
            this.localEndpoint = new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), internalPort);

            this.MaxConnections   = 125;
            this.Network          = network;
            this.externalEndpoint = new IPEndPoint(this.localEndpoint.Address, this.Network.DefaultPort);
            this.Version          = version;

            var listener = new EventLoopMessageListener <IncomingMessage>(ProcessMessage);

            this.messageProducer.AddMessageListener(listener);
            this.OwnResource(listener);

            this.ConnectedNodes          = new NodesCollection();
            this.ConnectedNodes.Added   += Nodes_NodeAdded;
            this.ConnectedNodes.Removed += Nodes_NodeRemoved;
            this.ConnectedNodes.MessageProducer.AddMessageListener(listener);

            this.AllMessages = new MessageProducer <IncomingMessage>();
            this.trace       = new TraceCorrelation(NodeServerTrace.Trace, "Node server listening on " + this.LocalEndpoint);
        }
コード例 #4
0
        /// <summary>
        /// Initializes instance of a network peer server.
        /// </summary>
        /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param>
        /// <param name="version">Version of the network protocol that the server should run.</param>
        /// <param name="internalPort">Port on which the server will listen, or -1 to use the default port for the selected network.</param>
        /// <param name="dateTimeProvider">Provider of time functions.</param>
        /// <param name="loggerFactory">Factory for creating loggers.</param>
        /// <param name="networkPeerFactory">Factory for creating P2P network peers.</param>
        public NetworkPeerServer(Network network, ProtocolVersion version, int internalPort, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, INetworkPeerFactory networkPeerFactory)
        {
            internalPort = internalPort == -1 ? network.DefaultPort : internalPort;

            this.logger = loggerFactory.CreateLogger(this.GetType().FullName, $"[{internalPort}] ");
            this.logger.LogTrace("({0}:{1},{2}:{3},{4}:{5})", nameof(network), network, nameof(version), version, nameof(internalPort), internalPort);

            this.dateTimeProvider   = dateTimeProvider;
            this.networkPeerFactory = networkPeerFactory;

            this.AllowLocalPeers = true;
            this.InboundNetworkPeerConnectionParameters = new NetworkPeerConnectionParameters();

            this.localEndpoint = new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), internalPort);

            this.MaxConnections   = 125;
            this.Network          = network;
            this.externalEndpoint = new IPEndPoint(this.localEndpoint.Address, this.Network.DefaultPort);
            this.Version          = version;

            this.listener        = new EventLoopMessageListener <IncomingMessage>(ProcessMessage);
            this.messageProducer = new MessageProducer <IncomingMessage>();
            this.messageProducer.AddMessageListener(this.listener);

            this.ConnectedNetworkPeers = new NetworkPeerCollection();
            this.ConnectedNetworkPeers.MessageProducer.AddMessageListener(this.listener);

            this.logger.LogTrace("Network peer server ready to listen on '{0}'.", this.LocalEndpoint);

            this.logger.LogTrace("(-)");
        }
コード例 #5
0
        public MinerManager(BlockChain.BlockChain blockChain, Address address)
        {
            TxsPerBlockLimit = 100; //TODO
            Difficulty       = 12;  //TODO: when set to 10, becomes apparent a issue of 'tx race condition' (i.e. when using a secure contract to send token, two subsequent txs are dispatched) in which the miner is reset after mining a block with 1st tx and 2nd is never gets mined

            _Address         = address;
            _BlockChain      = blockChain;
            _Hasher.OnMined += DispatchBlock;
            OwnResource(_Hasher);

            _BlockChainListener = new EventLoopMessageListener <BlockChainMessage>(OnBlockChainMessage, "Miner Consumer");
            OwnResource(MessageProducer <BlockChainMessage> .Instance.AddMessageListener(_BlockChainListener));

            Reset();
        }
コード例 #6
0
ファイル: NodeServer.cs プロジェクト: nikropht/NBitcoin
 public NodeServer(Network network, ProtocolVersion version = ProtocolVersion.PROTOCOL_VERSION,
     int internalPort = -1)
 {
     AdvertizeMyself = true;
     internalPort = internalPort == -1 ? network.DefaultPort : internalPort;
     _LocalEndpoint = new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6(), internalPort);
     _Network = network;
     _ExternalEndpoint = new IPEndPoint(_LocalEndpoint.Address, Network.DefaultPort);
     _Version = version;
     var listener = new EventLoopMessageListener<IncomingMessage>(ProcessMessage);
     _MessageProducer.AddMessageListener(listener);
     OwnResource(listener);
     RegisterPeerTableRepository(_PeerTable);
     _Nodes = new NodeSet();
     _Nodes.MessageProducer.AddMessageListener(listener);
     _Trace = new TraceCorrelation(NodeServerTrace.Trace, "Node server listening on " + LocalEndpoint);
 }
コード例 #7
0
ファイル: NodeServer.cs プロジェクト: woutersmit/NBitcoin
		public NodeServer(Network network, ProtocolVersion version = ProtocolVersion.PROTOCOL_VERSION,
			int internalPort = -1)
		{
			AllowLocalPeers = true;
			InboundNodeConnectionParameters = new NodeConnectionParameters();
			internalPort = internalPort == -1 ? network.DefaultPort : internalPort;
			_LocalEndpoint = new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), internalPort);
			_Network = network;
			_ExternalEndpoint = new IPEndPoint(_LocalEndpoint.Address, Network.DefaultPort);
			_Version = version;
			var listener = new EventLoopMessageListener<IncomingMessage>(ProcessMessage);
			_MessageProducer.AddMessageListener(listener);
			OwnResource(listener);
			_ConnectedNodes = new NodesCollection();
			_ConnectedNodes.Added += _Nodes_NodeAdded;
			_ConnectedNodes.Removed += _Nodes_NodeRemoved;
			_ConnectedNodes.MessageProducer.AddMessageListener(listener);
			_Trace = new TraceCorrelation(NodeServerTrace.Trace, "Node server listening on " + LocalEndpoint);
		}
コード例 #8
0
        public WalletManager(BlockChain.BlockChain blockChain, string dbName)
        {
            _BlockChain = blockChain;

            _DBContext = new DBContext(dbName);

            _KeyStore = new KeyStore();
            _TxStore  = new TxStore();

            TxDeltaList = new List <TxDelta>();

            _BlockChainListener = new EventLoopMessageListener <BlockChainMessage>(OnBlockChainMessage, "Wallet Consumer");
            OwnResource(MessageProducer <BlockChainMessage> .Instance.AddMessageListener(_BlockChainListener));
            OwnResource(_DBContext);

            using (var dbTx = _DBContext.GetTransactionContext())
            {
                _Keys = _KeyStore.List(dbTx);
                var purgeList = new List <ulong>();

                _TxStore.All(dbTx).ToList().ForEach(item =>
                {
                    switch (item.Item2.TxState)
                    {
                    case TxStateEnum.Confirmed:
                        TxDeltaList.Add(new TxDelta(item.Item2.TxState, item.Item2.TxHash, item.Item2.Tx, item.Item2.AssetDeltas, item.Item2.DateTime));
                        break;

                    case TxStateEnum.Unconfirmed:
                        purgeList.Add(item.Item1);
                        //TODO: implement 'smarter' mode: only after the node has been synced and is up-to-date, try to revalidate
                        //_BlockChain.HandleTransaction(txData.Tx);
                        break;
                    }

                    foreach (var key in purgeList)
                    {
                        _TxStore.Remove(dbTx, key);
                    }
                });
            }
        }
コード例 #9
0
        public NodeServer(Network network, uint?version = null,
                          int internalPort = -1)
        {
            AllowLocalPeers = true;
            InboundNodeConnectionParameters = new NodeConnectionParameters();
            internalPort      = internalPort == -1 ? network.DefaultPort : internalPort;
            _LocalEndpoint    = new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), internalPort);
            MaxConnections    = 125;
            _Network          = network;
            _ExternalEndpoint = new IPEndPoint(_LocalEndpoint.Address, Network.DefaultPort);
            _Version          = version == null ? network.MaxP2PVersion : version.Value;
            var listener = new EventLoopMessageListener <IncomingMessage>(ProcessMessage);

            _MessageProducer.AddMessageListener(listener);
            OwnResource(listener);
            _ConnectedNodes          = new NodesCollection();
            _ConnectedNodes.Added   += _Nodes_NodeAdded;
            _ConnectedNodes.Removed += _Nodes_NodeRemoved;
            _ConnectedNodes.MessageProducer.AddMessageListener(listener);
        }
コード例 #10
0
        /// <summary>
        /// Initializes instance of a network peer server.
        /// </summary>
        /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param>
        /// <param name="ipAddress">Address of the local interface to listen on, or <c>null</c> to listen on all available interfaces.</param>
        /// <param name="internalPort">Port on which the server will listen, or -1 to use the default port for the selected network.</param>
        /// <param name="version">Version of the network protocol that the server should run.</param>
        /// <param name="dateTimeProvider">Provider of time functions.</param>
        /// <param name="loggerFactory">Factory for creating loggers.</param>
        /// <param name="networkPeerFactory">Factory for creating P2P network peers.</param>
        public NetworkPeerServer(Network network, IPEndPoint localEndpoint, IPEndPoint externalEndpoint, ProtocolVersion version, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, INetworkPeerFactory networkPeerFactory)
        {
            this.logger = loggerFactory.CreateLogger(this.GetType().FullName, $"[{localEndpoint}] ");
            this.logger.LogTrace("({0}:{1},{2}:{3},{4}:{5})", nameof(network), network, nameof(localEndpoint), localEndpoint, nameof(externalEndpoint), externalEndpoint, nameof(version), version);

            this.dateTimeProvider   = dateTimeProvider;
            this.networkPeerFactory = networkPeerFactory;

            this.AllowLocalPeers = true;
            this.InboundNetworkPeerConnectionParameters = new NetworkPeerConnectionParameters();

            this.LocalEndpoint    = Utils.EnsureIPv6(localEndpoint);
            this.ExternalEndpoint = Utils.EnsureIPv6(externalEndpoint);

            this.MaxConnections = 125;
            this.Network        = network;
            this.Version        = version;

            this.listener        = new EventLoopMessageListener <IncomingMessage>(this.ProcessMessageAsync);
            this.messageProducer = new MessageProducer <IncomingMessage>();
            this.messageProducer.AddMessageListener(this.listener);

            this.ConnectedNetworkPeers = new NetworkPeerCollection();
            this.ConnectedNetworkPeers.MessageProducer.AddMessageListener(this.listener);

            this.serverCancel = new CancellationTokenSource();

            this.tcpListener = new TcpListener(this.LocalEndpoint);
            this.tcpListener.Server.LingerState = new LingerOption(true, 0);
            this.tcpListener.Server.NoDelay     = true;
            this.tcpListener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);

            this.clientsById = new ConcurrentDictionary <int, NetworkPeerClient>();
            this.acceptTask  = Task.CompletedTask;

            this.logger.LogTrace("Network peer server ready to listen on '{0}'.", this.LocalEndpoint);

            this.logger.LogTrace("(-)");
        }
コード例 #11
0
ファイル: ListenerTester.cs プロジェクト: dthorpe/QBitNinja
        public ListenerTester(ServerTester tester)
        {
            _Network = tester.Configuration.Indexer.Network;
            Random rand = new Random();

            _Server = tester;
            _Server._disposables.Add(this);
            _Listener = new QBitNinjaListener(_Server.Configuration);

            _NodeServer   = new NodeServer(_Server.Configuration.Indexer.Network, internalPort: rand.Next(20000, 50000));
            _NodeListener = new EventLoopMessageListener <IncomingMessage>(NewNodeMessage);
            _NodeServer.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), _NodeServer.LocalEndpoint.Port);
            _NodeServer.AllowLocalPeers  = true;
            _NodeServer.IsRelay          = true;
            _NodeServer.AllMessages.AddMessageListener(_NodeListener);
            _NodeServer.Listen();

            _Listener.Configuration.Indexer.Node = "127.0.0.1:" + _NodeServer.LocalEndpoint.Port;
            _Listener.Listen();

            _Server.ChainBuilder.SkipIndexer     = true;
            _Server.ChainBuilder.NewBlock       += ChainBuilder_NewBlock;
            _Server.ChainBuilder.NewTransaction += ChainBuilder_NewTransaction;
        }
コード例 #12
0
        /// <summary>
        /// Initializes an instance of the object.
        /// </summary>
        /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param>
        /// <param name="peer">Network peer the node is connected to, or will connect to.</param>
        /// <param name="client">Initialized TCP client, which may or may not be already connected.</param>
        /// <param name="clientId">Unique identifier of the connection.</param>
        /// <param name="messageReceivedCallback">Callback to be called when a new message arrives from the peer.</param>
        /// <param name="dateTimeProvider">Provider of time functions.</param>
        /// <param name="loggerFactory">Factory for creating loggers.</param>
        public NetworkPeerConnection(Network network, NetworkPeer peer, TcpClient client, int clientId, Func <IncomingMessage, Task> messageReceivedCallback, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory)
        {
            this.loggerFactory = loggerFactory;
            this.logger        = this.loggerFactory.CreateLogger(this.GetType().FullName, $"[{clientId}-{peer.PeerAddress.Endpoint}] ");

            this.network          = network;
            this.dateTimeProvider = dateTimeProvider;

            this.peer = peer;
            this.setPeerStateOnShutdown = NetworkPeerState.Offline;
            this.tcpClient = client;
            this.Id        = clientId;

            this.stream           = this.tcpClient.Connected ? this.tcpClient.GetStream() : null;
            this.ShutdownComplete = new TaskCompletionSource <bool>();

            this.writeLock = new AsyncLock();

            this.CancellationSource = new CancellationTokenSource();

            this.MessageProducer = new MessageProducer <IncomingMessage>();
            this.messageListener = new EventLoopMessageListener <IncomingMessage>(messageReceivedCallback);
            this.MessageProducer.AddMessageListener(this.messageListener);
        }
コード例 #13
0
ファイル: NodeServer.cs プロジェクト: nikropht/NBitcoin
        public IDisposable RegisterPeerTableRepository(PeerTableRepository peerTableRepository)
        {
            var poll = new EventLoopMessageListener<object>(o =>
            {
                var message = o as IncomingMessage;
                if(message != null)
                {
                    if(message.Message.Payload is AddrPayload)
                    {
                        peerTableRepository.WritePeers(((AddrPayload)message.Message.Payload).Addresses
                                                        .Where(a => a.Endpoint.Address.IsRoutable(AllowLocalPeers))
                                                        .Select(a => new Peer(PeerOrigin.Addr, a)));
                    }
                }
                var peer = o as Peer;
                if(peer != null)
                {
                    if(peer.NetworkAddress.Endpoint.Address.IsRoutable(AllowLocalPeers))
                        peerTableRepository.WritePeer(peer);
                }
            });

            if(peerTableRepository != _PeerTable)
            {
                _InternalMessageProducer.PushMessages(peerTableRepository.GetPeers());
            }
            return new CompositeDisposable(AllMessages.AddMessageListener(poll), _InternalMessageProducer.AddMessageListener(poll), OwnResource(poll));
        }
コード例 #14
0
ファイル: NodeServer.cs プロジェクト: nikropht/NBitcoin
 public IDisposable RegisterBlockRepository(BlockRepository repository)
 {
     var listener = new EventLoopMessageListener<IncomingMessage>((m) =>
     {
         if(m.Node != null)
         {
             if(m.Message.Payload is HeadersPayload)
             {
                 foreach(var header in ((HeadersPayload)m.Message.Payload).Headers)
                 {
                     repository.WriteBlockHeader(header);
                 }
             }
             if(m.Message.Payload is BlockPayload)
             {
                 repository.WriteBlock(((BlockPayload)m.Message.Payload).Object);
             }
         }
     });
     return new CompositeDisposable(AllMessages.AddMessageListener(listener), OwnResource(listener));
 }