Ejemplo n.º 1
0
		public NodeServerTester(Network network = null)
		{
			int retry = 0;
			network = network ?? Network.TestNet;
			while(true)
			{
				try
				{
					var a = _Rand.Next(4000, 60000);
					var b = _Rand.Next(4000, 60000);
					_Server1 = new NodeServer(network, internalPort: a);
					_Server1.AllowLocalPeers = true;
					_Server1.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1").MapToIPv6Ex(), a);
					_Server1.Listen();
					_Server2 = new NodeServer(network, internalPort: b);
					_Server2.AllowLocalPeers = true;
					_Server2.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1").MapToIPv6Ex(), b);
					_Server2.Listen();
					break;
				}
				catch(Exception)
				{
					if(_Server1 != null)
						_Server1.Dispose();
					if(_Server2 != null)
						_Server2.Dispose();
					retry++;
					if(retry == 5)
						throw;
				}
			}
		}
Ejemplo n.º 2
0
 public NodeServerTester()
 {
     _Server1 = new NodeServer(Network.Main, internalPort: 3390);
     _Server1.AllowLocalPeers = true;
     _Server1.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1").MapToIPv6(), 3390);
     _Server1.NATRuleName = NATRuleName;
     _Server1.Listen();
     _Server2 = new NodeServer(Network.Main, internalPort: 3391);
     _Server2.AllowLocalPeers = true;
     _Server2.NATRuleName = NATRuleName;
     _Server2.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1").MapToIPv6(), 3391);
     _Server2.Listen();
 }
Ejemplo n.º 3
0
		public NodeServerTester(Network network = null)
		{
			network = network ?? Network.TestNet;
			var a = _Rand.Next(4000, 60000);
			var b = _Rand.Next(4000, 60000);
			_Server1 = new NodeServer(network, internalPort: a);
			_Server1.AllowLocalPeers = true;
			_Server1.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1").MapToIPv6(), a);
			_Server1.Listen();
			_Server2 = new NodeServer(network, internalPort: b);
			_Server2.AllowLocalPeers = true;
			_Server2.ExternalEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1").MapToIPv6(), b);
			_Server2.Listen();
		}
Ejemplo n.º 4
0
        public void VersionHandshake(CancellationToken cancellationToken = default(CancellationToken))
        {
            var listener = new PollMessageListener <IncomingMessage>();

            using (MessageProducer.AddMessageListener(listener))
            {
                using (TraceCorrelation.Open())
                {
                    var myVersion = CreateVersionPayload();
                    SendMessage(myVersion);

                    var version = listener.RecieveMessage(cancellationToken).AssertPayload <VersionPayload>();
                    _FullVersion = version;
                    Version      = version.Version;
                    if (version.Nonce == NodeServer.Nonce)
                    {
                        NodeServerTrace.ConnectionToSelfDetected();
                        Disconnect();
                        throw new InvalidOperationException("Impossible to connect to self");
                    }

                    if (!version.AddressReciever.Address.Equals(ExternalEndpoint.Address))
                    {
                        NodeServerTrace.Warning("Different external address detected by the node " + version.AddressReciever.Address + " instead of " + ExternalEndpoint.Address);
                    }
                    NodeServer.ExternalAddressDetected(version.AddressReciever.Address);
                    if (version.Version < ProtocolVersion.MIN_PEER_PROTO_VERSION)
                    {
                        NodeServerTrace.Warning("Outdated version " + version.Version + " disconnecting");
                        Disconnect();
                        return;
                    }
                    SendMessage(new VerAckPayload());
                    listener.RecieveMessage(cancellationToken).AssertPayload <VerAckPayload>();
                    State = NodeState.HandShaked;
                    if (NodeServer.AdvertizeMyself)
                    {
                        AdvertiseMyself();
                    }
                }
            }
        }
Ejemplo n.º 5
0
        internal Node(Peer peer, NodeServer nodeServer, CancellationToken cancellation)
        {
            Version     = nodeServer.Version;
            _NodeServer = nodeServer;
            _Peer       = peer;
            LastSeen    = peer.NetworkAddress.Time;

            var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);

            _Connection = new NodeConnection(this, socket);
            using (TraceCorrelation.Open())
            {
                try
                {
                    var ar = socket.BeginConnect(Peer.NetworkAddress.Endpoint, null, null);
                    WaitHandle.WaitAny(new WaitHandle[] { ar.AsyncWaitHandle, cancellation.WaitHandle });
                    cancellation.ThrowIfCancellationRequested();
                    socket.EndConnect(ar);
                    State = NodeState.Connected;
                    NodeServerTrace.Information("Outbound connection successfull");
                }
                catch (OperationCanceledException)
                {
                    Utils.SafeCloseSocket(socket);
                    NodeServerTrace.Information("Connection to node cancelled");
                    State = NodeState.Offline;
                    return;
                }
                catch (Exception ex)
                {
                    Utils.SafeCloseSocket(socket);
                    NodeServerTrace.Error("Error connecting to the remote endpoint ", ex);
                    State = NodeState.Failed;
                    throw;
                }
                _Connection.BeginListen();
            }
        }
Ejemplo n.º 6
0
 private VersionPayload CreateVersionPayload()
 {
     return(NodeServer.CreateVersionPayload(Peer, ExternalEndpoint, Version));
 }
Ejemplo n.º 7
0
		public void CanGetMyIp()
		{
			var client = new NodeServer(Network.Main, ProtocolVersion.PROTOCOL_VERSION);
			Assert.True(client.GetMyExternalIP() != null);
		}
 internal MiniNode CreateLocalNode()
 {
     NodeServer nodeServer = new NodeServer(Client.Configuration.Network, internalPort: (ushort)RandomUtils.GetInt32());
     nodeServer.Listen();
     _NodeServer = nodeServer;
     Indexer.Configuration.Node = "127.0.0.1:" + nodeServer.LocalEndpoint.Port;
     return new MiniNode(this, nodeServer);
 }
Ejemplo n.º 9
0
 public void CanUseUPNP()
 {
     UPnPLease lease = null;
     UPnPLease.ReleaseAll(NodeServerTester.NATRuleName); //Clean the gateway of previous tests attempt
     using(var server = new NodeServer(Network.Main))
     {
         server.NATRuleName = NodeServerTester.NATRuleName;
         Assert.False(server.ExternalEndpoint.Address.IsRoutable(false));
         lease = server.DetectExternalEndpoint();
         Assert.True(server.ExternalEndpoint.Address.IsRoutable(false));
         Assert.NotNull(lease);
         Assert.True(lease.IsOpen());
         lease.Dispose();
         Assert.False(lease.IsOpen());
         lease = server.DetectExternalEndpoint();
         Assert.NotNull(lease);
         Assert.True(lease.IsOpen());
     }
     Assert.False(lease.IsOpen());
 }
Ejemplo n.º 10
0
 public void CanHandshake()
 {
     using(var server = new NodeServer(Network.Main, ProtocolVersion.PROTOCOL_VERSION))
     {
         var seed = server.GetNodeByHostName("seed.bitcoin.sipa.be");
         Assert.True(seed.State == NodeState.Connected);
         seed.VersionHandshake();
         Assert.True(seed.State == NodeState.HandShaked);
         seed.Disconnect();
         Assert.True(seed.State == NodeState.Offline);
     }
 }
Ejemplo n.º 11
0
 public void CanDownloadChain()
 {
     using(var server = new NodeServer(Network.Main))
     {
         server.RegisterPeerTableRepository(PeerCache);
         CancellationTokenSource cancel = new CancellationTokenSource();
         StreamObjectStream<ChainChange> changes = new StreamObjectStream<ChainChange>(new MemoryStream());
         var chain = new Chain(changes);
         server.BuildChain(changes, cancel.Token);
     }
 }
Ejemplo n.º 12
0
 public void CanDiscoverPeers()
 {
     using(var server = new NodeServer(Network.Main, ProtocolVersion.PROTOCOL_VERSION))
     {
         Assert.True(server.PeerTable.CountUsed(true) < 50);
         server.DiscoverPeers(100);
         Assert.True(server.PeerTable.CountUsed(true) > 50);
     }
 }
Ejemplo n.º 13
0
 public void CanConnectToNodeSet()
 {
     using(var server = new NodeServer(Network.Main))
     {
         server.RegisterPeerTableRepository(PeerCache);
         var set = server.CreateNodeSet(5);
         Assert.Equal(5, set.GetNodes().Length);
         foreach(var node in set.GetNodes())
         {
             Assert.Equal(NodeState.HandShaked, node.State);
         }
     }
 }