コード例 #1
0
        public void PeerAddressManagerBehaviour_InboundConnectionIsLoopBack_Add_PeerEndPoint_ToAddressBook()
        {
            var addressFromEndpoint = new IPEndPoint(IPAddress.Loopback, this.Network.DefaultPort);

            IPAddress peerEndPointAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var       peerEndPoint        = new IPEndPoint(peerEndPointAddress, 80);

            DataFolder peerFolder     = CreateDataFolder(this);
            var        addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.LoggerFactory.Object, new SelfEndpointTracker(this.extendedLoggerFactory));

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.Inbound).Returns(true);
            networkPeer.SetupGet(n => n.Network).Returns(this.Network);
            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(peerEndPoint);
            networkPeer.SetupGet(n => n.PeerVersion).Returns(new VersionPayload()
            {
                AddressFrom = addressFromEndpoint
            });
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager, new Mock <IPeerBanning>().Object, this.extendedLoggerFactory)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            // Trigger the event handler that signals that the peer has handshaked.
            networkPeer.Object.StateChanged.ExecuteCallbacksAsync(networkPeer.Object, NetworkPeerState.HandShaked).GetAwaiter().GetResult();

            // The address manager should contain the inbound peer's address.
            var endpointToFind = new IPEndPoint(peerEndPoint.Address, this.Network.DefaultPort);

            Assert.NotNull(addressManager.FindPeer(endpointToFind));
        }
コード例 #2
0
        public void PeerAddressManagerBehaviour_DoesntSendAddress_Outbound()
        {
            IPAddress ipAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var       endpoint  = new IPEndPoint(ipAddress, 80);

            DataFolder peerFolder     = CreateDataFolder(this);
            var        addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.LoggerFactory.Object,
                                                               new SelfEndpointTracker(this.extendedLoggerFactory, this.connectionManagerSettings));

            addressManager.AddPeer(endpoint, IPAddress.Loopback);

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(endpoint);
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);
            networkPeer.SetupGet(n => n.Inbound).Returns(false); // Outbound

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager, new Mock <IPeerBanning>().Object, this.extendedLoggerFactory)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            var incomingMessage = new IncomingMessage();

            incomingMessage.Message = new Message(new PayloadProvider().DiscoverPayloads())
            {
                Magic   = this.Network.Magic,
                Payload = new GetAddrPayload(),
            };

            // Event handler triggered, but SendMessage shouldn't be called as the node is Outbound.
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, incomingMessage).GetAwaiter().GetResult();
            networkPeer.Verify(x => x.SendMessageAsync(It.IsAny <Payload>(), It.IsAny <CancellationToken>()), Times.Never);
        }
コード例 #3
0
        /// <summary>
        /// Initializes parts of the object that are common for both inbound and outbound peers.
        /// </summary>
        /// <param name="inbound"><c>true</c> for inbound peers, <c>false</c> for outbound peers.</param>
        /// <param name="peerEndPoint">IP address and port on the side of the peer.</param>
        /// <param name="network">Specification of the network the node runs on - regtest/testnet/mainnet.</param>
        /// <param name="parameters">Various settings and requirements related to how the connections with peers are going to be established, or <c>null</c> to use default parameters.</param>
        /// <param name="dateTimeProvider">Provider of time functions.</param>
        /// <param name="loggerFactory">Factory for creating loggers.</param>
        private NetworkPeer(bool inbound, IPEndPoint peerEndPoint, Network network, NetworkPeerConnectionParameters parameters, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory)
        {
            this.loggerFactory    = loggerFactory;
            this.dateTimeProvider = dateTimeProvider;

            this.preferredTransactionOptions = network.NetworkOptions;
            this.SupportedTransactionOptions = network.NetworkOptions & ~NetworkOptions.All;

            this.State        = NetworkPeerState.Offline;
            this.Inbound      = inbound;
            this.PeerEndPoint = peerEndPoint;
            this.Network      = network;
            this.Behaviors    = new NetworkPeerBehaviorsCollection(this);

            this.Parameters = parameters ?? new NetworkPeerConnectionParameters();
            this.MyVersion  = this.Parameters.CreateVersion(this.PeerEndPoint, network, this.dateTimeProvider.GetTimeOffset());

            this.MessageReceived = new AsyncExecutionEvent <NetworkPeer, IncomingMessage>();
            this.StateChanged    = new AsyncExecutionEvent <NetworkPeer, NetworkPeerState>();
        }
コード例 #4
0
        public void PeerAddressManagerBehaviour_ReceivedPong_UpdateLastSeen()
        {
            var ipAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var endpoint  = new IPEndPoint(ipAddress, 80);

            var peerFolder     = AssureEmptyDirAsDataFolder(Path.Combine(AppContext.BaseDirectory, "PeerAddressManagerBehaviourTests"));
            var addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.loggerFactory);

            addressManager.AddPeer(endpoint, IPAddress.Loopback);

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(endpoint);
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            var message = new IncomingMessage(new PongPayload(), this.network);

            //Trigger the event handler
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, message).GetAwaiter().GetResult();

            var peer = addressManager.FindPeer(endpoint);

            Assert.Equal(DateTimeProvider.Default.GetUtcNow().Date, peer.LastSeen.Value.Date);
        }
コード例 #5
0
        public async Task AsyncExecutionEvent_CanUnregisterFromCallback_Async()
        {
            using (var executionEvent = new AsyncExecutionEvent <object, object>())
            {
                int value = 0;
                Task callback1Async(object sender, object arg)
                {
                    value++;

                    // Try to unregister itself.
                    executionEvent.Unregister(callback1Async);
                    return(Task.CompletedTask);
                }

                async Task callback2Async(object sender, object arg)
                {
                    value++;

                    // Try to unregister itself, but first await a bit.
                    await Task.Delay(20);

                    executionEvent.Unregister(callback2Async);
                }

                executionEvent.Register(callback1Async);
                executionEvent.Register(callback2Async);

                // First execution should increment the value twice and unregister the callbacks.
                await executionEvent.ExecuteCallbacksAsync(null, null);

                Assert.Equal(2, value);

                // Second execution should do nothing as there should be no registered callbacks.
                await executionEvent.ExecuteCallbacksAsync(null, null);

                Assert.Equal(2, value);
            }
        }
コード例 #6
0
        private Mock <INetworkPeer> CreatePeerMock()
        {
            var peer = new Mock <INetworkPeer>();

            var signals       = new Bitcoin.Signals.Signals(this.loggerFactory, null);
            var asyncProvider = new AsyncProvider(this.loggerFactory, signals, new NodeLifetime());

            var connection = new NetworkPeerConnection(KnownNetworks.StraxMain, peer.Object, new TcpClient(), 0, (message, token) => Task.CompletedTask,
                                                       new DateTimeProvider(), this.loggerFactory, new PayloadProvider(), asyncProvider);

            peer.SetupGet(networkPeer => networkPeer.Connection).Returns(connection);

            var            connectionParameters = new NetworkPeerConnectionParameters();
            VersionPayload version = connectionParameters.CreateVersion(new IPEndPoint(1, 1), new IPEndPoint(1, 1), KnownNetworks.StraxMain, new DateTimeProvider().GetTimeOffset());

            version.Services = NetworkPeerServices.Network;

            peer.SetupGet(x => x.PeerVersion).Returns(version);
            peer.SetupGet(x => x.State).Returns(NetworkPeerState.HandShaked);

            this.StateChanged    = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();
            this.MessageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            peer.Setup(x => x.StateChanged).Returns(() => this.StateChanged);
            peer.Setup(x => x.MessageReceived).Returns(() => this.MessageReceived);

            var connectionManagerBehaviorMock = new Mock <IConnectionManagerBehavior>();

            connectionManagerBehaviorMock.Setup(x => x.Whitelisted).Returns(this.IsPeerWhitelisted);

            peer.Setup(x => x.Behavior <IConnectionManagerBehavior>()).Returns(() => connectionManagerBehaviorMock.Object);

            peer.SetupGet(x => x.PeerEndPoint).Returns(new IPEndPoint(1, 1));

            return(peer);
        }