Esempio n. 1
0
 protected void ReportIn(string messageInfo)
 {
     if (NetworkDiagTracer.IsEnabled)
     {
         NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, messageInfo);
     }
 }
Esempio n. 2
0
 private void HandlePing()
 {
     if (NetworkDiagTracer.IsEnabled)
     {
         NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, "p2p", "Ping");
     }
     if (Logger.IsTrace)
     {
         Logger.Trace($"{Session} P2P responding to ping");
     }
     Send(PongMessage.Instance);
 }
Esempio n. 3
0
        protected void ReportIn(string messageInfo)
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"OUT {Counter:D5} {messageInfo}");
            }

            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportIncomingMessage(Session?.Node?.Address, Name, messageInfo);
            }
        }
Esempio n. 4
0
 protected void Send <T>(T message) where T : P2PMessage
 {
     if (Logger.IsTrace)
     {
         Logger.Trace($"Sending {typeof(T).Name}");
     }
     if (NetworkDiagTracer.IsEnabled)
     {
         NetworkDiagTracer.ReportOutgoingMessage(Session.Node.Host, Name, typeof(T).Name);
     }
     Session.DeliverMessage(message);
 }
Esempio n. 5
0
 protected void Send <T>(T message) where T : P2PMessage
 {
     Interlocked.Increment(ref Counter);
     if (Logger.IsTrace)
     {
         Logger.Trace($"{Counter} Sending {typeof(T).Name}");
     }
     if (NetworkDiagTracer.IsEnabled)
     {
         NetworkDiagTracer.ReportOutgoingMessage(Session.Node?.Address, Name, message.ToString());
     }
     Session.DeliverMessage(message);
 }
Esempio n. 6
0
 private void HandlePong(Packet msg)
 {
     if (NetworkDiagTracer.IsEnabled)
     {
         NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, "p2p", "Pong");
     }
     if (Logger.IsTrace)
     {
         Logger.Trace($"{Session} sending P2P pong");
     }
     _nodeStatsManager.ReportEvent(Session.Node, NodeStatsEventType.P2PPingIn);
     _pongCompletionSource?.TrySetResult(msg);
 }
Esempio n. 7
0
        public override void Init()
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"{ProtocolCode} v{ProtocolVersion} subprotocol initializing with {Session.Node:c}");
            }
            if (SyncServer.Head == null)
            {
                throw new InvalidOperationException($"Cannot initialize {ProtocolCode} v{ProtocolVersion} protocol without the head block set");
            }

            BlockHeader   head          = SyncServer.Head;
            StatusMessage statusMessage = new StatusMessage
            {
                ProtocolVersion = ProtocolVersion,
                ChainId         = (UInt256)SyncServer.ChainId,
                TotalDifficulty = head.TotalDifficulty ?? head.Difficulty,
                BestHash        = head.Hash,
                HeadBlockNo     = head.Number,
                GenesisHash     = SyncServer.Genesis.Hash,

                // TODO - implement config option for these
                ServeHeaders    = true,
                ServeChainSince = 0x00,
                //if (config.recentchain != null)
                //    ServeRecentChain = Config.recentchain
                ServeStateSince = 0x00,
                //if (Config.serverecentstate != null)
                //    ServeRecentState = Config.RecentState
                TxRelay = true,
                // TODO - should allow setting to infinite
                BufferLimit         = int.MaxValue,
                MaximumRechargeRate = int.MaxValue
            };

            Send(statusMessage);

            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportOutgoingMessage(Session.Node.Address, Name, statusMessage.ToString());
            }
            Metrics.LesStatusesSent++;

            CheckProtocolInitTimeout().ContinueWith(x =>
            {
                if (x.IsFaulted && Logger.IsError)
                {
                    Logger.Error("Error during lesProtocol handler timeout logic", x.Exception);
                }
            });
        }
Esempio n. 8
0
        public override void DisconnectProtocol(DisconnectReason disconnectReason, string details)
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"Sending disconnect {disconnectReason} ({details}) to {Session.Node:s}");
            }
            DisconnectMessage message = new DisconnectMessage(disconnectReason);

            Send(message);
            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportDisconnect(Session.Node.Address, $"Local {disconnectReason} {details}");
            }
        }
Esempio n. 9
0
        private void Handle(NewBlockMessage newBlockMessage)
        {
            Metrics.Eth62NewBlockReceived++;
            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(NewBlockMessage)}({newBlockMessage.Block.Number})");
            }
            newBlockMessage.Block.Header.TotalDifficulty = newBlockMessage.TotalDifficulty;

            try
            {
                SyncServer.AddNewBlock(newBlockMessage.Block, this);
            }
            catch (Exception e)
            {
                Logger.Debug($"Adding new block {newBlockMessage.Block?.ToString(Block.Format.Short)} from {Node:c} failed: " + e.Message);
                throw;
            }
        }
Esempio n. 10
0
        public void AddPeer(ISyncPeer syncPeer)
        {
            if (_logger.IsDebug)
            {
                _logger.Debug($"Adding sync peer {syncPeer.Node:c}");
            }
            if (!_isStarted)
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Sync peer pool not started yet - adding peer is blocked: {syncPeer.Node:s}");
                }
                return;
            }

            if (_peers.ContainsKey(syncPeer.Node.Id))
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Sync peer {syncPeer.Node:c} already in peers collection.");
                }
                return;
            }

            PeerInfo peerInfo = new PeerInfo(syncPeer);

            _peers.TryAdd(syncPeer.Node.Id, peerInfo);
            Metrics.SyncPeers = _peers.Count;

            if (_logger.IsDebug)
            {
                _logger.Debug($"Adding {syncPeer.Node:c} to refresh queue");
            }
            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportInterestingEvent(syncPeer.Node.Host, "adding node to refresh queue");
            }
            _peerRefreshQueue.Add(new RefreshTotalDiffTask {
                SyncPeer = syncPeer
            });
        }
        public override void HandleMessage(ZeroPacket message)
        {
            if (message.PacketType != LesMessageCode.Status && !_statusReceived)
            {
                throw new SubprotocolException($"No {nameof(StatusMessage)} received prior to communication with {Session.Node:c}.");
            }

            int size = message.Content.ReadableBytes;

            switch (message.PacketType)
            {
            case LesMessageCode.Status:
                StatusMessage statusMessage = Deserialize <StatusMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, statusMessage.ToString());
                }
                Handle(statusMessage);
                break;
            }
        }
        public override int MessageIdSpaceSize => 17; // magic number here following Go

        public override void HandleMessage(ZeroPacket message)
        {
            base.HandleMessage(message);
            int size = message.Content.ReadableBytes;

            switch (message.PacketType)
            {
            case Eth63MessageCode.GetReceipts:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(GetReceiptsMessage));
                }
                Handle(Deserialize <GetReceiptsMessage>(message.Content));
                break;

            case Eth63MessageCode.Receipts:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(ReceiptsMessage));
                }
                Handle(Deserialize <ReceiptsMessage>(message.Content), size);
                break;

            case Eth63MessageCode.GetNodeData:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(GetNodeDataMessage));
                }
                Handle(Deserialize <GetNodeDataMessage>(message.Content));
                break;

            case Eth63MessageCode.NodeData:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(NodeDataMessage));
                }
                Handle(Deserialize <NodeDataMessage>(message.Content), size);
                break;
            }
        }
Esempio n. 13
0
        public override void Init()
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"{ProtocolCode} v{ProtocolVersion} subprotocol initializing with {Session.Node:c}");
            }
            if (SyncServer.Head == null)
            {
                throw new InvalidOperationException($"Cannot initialize {ProtocolCode} v{ProtocolVersion} protocol without the head block set");
            }


            BlockHeader   head          = SyncServer.Head;
            StatusMessage statusMessage = new StatusMessage();

            statusMessage.ChainId         = (UInt256)SyncServer.ChainId;
            statusMessage.ProtocolVersion = ProtocolVersion;
            statusMessage.TotalDifficulty = head.TotalDifficulty ?? head.Difficulty;
            statusMessage.BestHash        = head.Hash;
            statusMessage.GenesisHash     = SyncServer.Genesis.Hash;

            Send(statusMessage);
            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportOutgoingMessage(Session.Node.Host, Name, statusMessage.ToString());
            }
            Metrics.StatusesSent++;

            //We are expecting receiving Status message anytime from the p2p completion, irrespective of sending Status from our side
            CheckProtocolInitTimeout().ContinueWith(x =>
            {
                if (x.IsFaulted && Logger.IsError)
                {
                    Logger.Error("Error during eth62Protocol handler timeout logic", x.Exception);
                }
            });
        }
Esempio n. 14
0
        private async Task Initialize()
        {
            if (_context.DbProvider == null)
            {
                throw new StepDependencyException(nameof(_context.DbProvider));
            }
            if (_context.BlockTree == null)
            {
                throw new StepDependencyException(nameof(_context.BlockTree));
            }
            if (_context.ReceiptStorage == null)
            {
                throw new StepDependencyException(nameof(_context.ReceiptStorage));
            }
            if (_context.BlockValidator == null)
            {
                throw new StepDependencyException(nameof(_context.BlockValidator));
            }
            if (_context.SealValidator == null)
            {
                throw new StepDependencyException(nameof(_context.SealValidator));
            }
            if (_context.Enode == null)
            {
                throw new StepDependencyException(nameof(_context.Enode));
            }

            if (_networkConfig.DiagTracerEnabled)
            {
                NetworkDiagTracer.IsEnabled = true;
                NetworkDiagTracer.Start();
            }

            // Environment.SetEnvironmentVariable("io.netty.allocator.pageSize", "8192");
            Environment.SetEnvironmentVariable("io.netty.allocator.maxOrder", _networkConfig.NettyArenaOrder.ToString());

            int maxPeersCount = _networkConfig.ActivePeersMaxCount;

            _context.SyncPeerPool = new EthSyncPeerPool(_context.BlockTree, _context.NodeStatsManager, maxPeersCount, _context.LogManager);
            _context.DisposeStack.Push(_context.SyncPeerPool);
            NodeDataFeed       feed = new NodeDataFeed(_context.DbProvider.CodeDb, _context.DbProvider.StateDb, _context.LogManager);
            NodeDataDownloader nodeDataDownloader = new NodeDataDownloader(_context.SyncPeerPool, feed, _context.NodeDataConsumer, _context.LogManager);

            _context.Synchronizer = new Synchronizer(_context.SpecProvider, _context.BlockTree, _context.ReceiptStorage, _context.BlockValidator, _context.SealValidator, _context.SyncPeerPool, _context.Config <ISyncConfig>(), nodeDataDownloader, _context.NodeStatsManager, _context.LogManager);
            _context.DisposeStack.Push(_context.Synchronizer);

            _context.SyncServer = new SyncServer(
                _context.DbProvider.StateDb,
                _context.DbProvider.CodeDb,
                _context.BlockTree,
                _context.ReceiptStorage,
                _context.BlockValidator,
                _context.SealValidator,
                _context.SyncPeerPool,
                _context.Synchronizer,
                _context.Config <ISyncConfig>(),
                _context.LogManager);

            InitDiscovery();
            await InitPeer().ContinueWith(initPeerTask =>
            {
                if (initPeerTask.IsFaulted)
                {
                    _logger.Error("Unable to init the peer manager.", initPeerTask.Exception);
                }
            });

            await StartSync().ContinueWith(initNetTask =>
            {
                if (initNetTask.IsFaulted)
                {
                    _logger.Error("Unable to start the synchronizer.", initNetTask.Exception);
                }
            });

            await StartDiscovery().ContinueWith(initDiscoveryTask =>
            {
                if (initDiscoveryTask.IsFaulted)
                {
                    _logger.Error("Unable to start the discovery protocol.", initDiscoveryTask.Exception);
                }
            });

            try
            {
                StartPeer();
            }
            catch (Exception e)
            {
                _logger.Error("Unable to start the peer manager.", e);
            }

            ThisNodeInfo.AddInfo("Ethereum     :", $"tcp://{_context.Enode.HostIp}:{_context.Enode.Port}");
            ThisNodeInfo.AddInfo("Version      :", $"{ClientVersion.Description.Replace("Nethermind/v", string.Empty)}");
            ThisNodeInfo.AddInfo("This node    :", $"{_context.Enode.Info}");
            ThisNodeInfo.AddInfo("Node address :", $"{_context.Enode.Address} (do not use as an account)");
        }
Esempio n. 15
0
        private async Task Initialize(CancellationToken cancellationToken)
        {
            if (_networkConfig.DiagTracerEnabled)
            {
                NetworkDiagTracer.IsEnabled = true;
                NetworkDiagTracer.Start();
            }

            Environment.SetEnvironmentVariable("io.netty.allocator.maxOrder", _networkConfig.NettyArenaOrder.ToString());

            var cht = new CanonicalHashTrie(_api.DbProvider !.ChtDb);

            int maxPeersCount = _networkConfig.ActivePeersMaxCount;

            _api.SyncPeerPool = new SyncPeerPool(_api.BlockTree !, _api.NodeStatsManager !, maxPeersCount, _api.LogManager);
            _api.DisposeStack.Push(_api.SyncPeerPool);

            SyncProgressResolver  syncProgressResolver = new SyncProgressResolver(_api.BlockTree !, _api.ReceiptStorage !, _api.DbProvider.StateDb, _api.DbProvider.BeamStateDb, _syncConfig, _api.LogManager);
            MultiSyncModeSelector syncModeSelector     = CreateMultiSyncModeSelector(syncProgressResolver);

            if (_api.SyncModeSelector != null)
            {
                // this is really bad and is a result of lack of proper dependency management
                PendingSyncModeSelector pendingOne = (PendingSyncModeSelector)_api.SyncModeSelector;
                pendingOne.SetActual(syncModeSelector);
            }

            _api.SyncModeSelector = syncModeSelector;
            _api.DisposeStack.Push(syncModeSelector);

            _api.Synchronizer = new Synchronizer(
                _api.DbProvider,
                _api.SpecProvider !,
                _api.BlockTree !,
                _api.ReceiptStorage !,
                _api.BlockValidator !,
                _api.SealValidator !,
                _api.SyncPeerPool,
                _api.NodeStatsManager !,
                _api.SyncModeSelector,
                _syncConfig,
                _api.LogManager);
            _api.DisposeStack.Push(_api.Synchronizer);

            _api.SyncServer = new SyncServer(
                _api.DbProvider.StateDb,
                _api.DbProvider.CodeDb,
                _api.BlockTree !,
                _api.ReceiptStorage !,
                _api.BlockValidator !,
                _api.SealValidator !,
                _api.SyncPeerPool,
                _api.SyncModeSelector,
                _api.Config <ISyncConfig>(),
                _api.LogManager,
                cht);

            _ = _api.SyncServer.BuildCHT();

            _api.DisposeStack.Push(_api.SyncServer);

            InitDiscovery();
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await InitPeer().ContinueWith(initPeerTask =>
            {
                if (initPeerTask.IsFaulted)
                {
                    _logger.Error("Unable to init the peer manager.", initPeerTask.Exception);
                }
            });

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await StartSync().ContinueWith(initNetTask =>
            {
                if (initNetTask.IsFaulted)
                {
                    _logger.Error("Unable to start the synchronizer.", initNetTask.Exception);
                }
            });

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await StartDiscovery().ContinueWith(initDiscoveryTask =>
            {
                if (initDiscoveryTask.IsFaulted)
                {
                    _logger.Error("Unable to start the discovery protocol.", initDiscoveryTask.Exception);
                }
            });

            try
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                StartPeer();
            }
            catch (Exception e)
            {
                _logger.Error("Unable to start the peer manager.", e);
            }

            if (_api.Enode == null)
            {
                throw new InvalidOperationException("Cannot initialize network without knowing own enode");
            }

            ThisNodeInfo.AddInfo("Ethereum     :", $"tcp://{_api.Enode.HostIp}:{_api.Enode.Port}");
            ThisNodeInfo.AddInfo("Version      :", $"{ClientVersion.Description.Replace("Nethermind/v", string.Empty)}");
            ThisNodeInfo.AddInfo("This node    :", $"{_api.Enode.Info}");
            ThisNodeInfo.AddInfo("Node address :", $"{_api.Enode.Address} (do not use as an account)");
        }
Esempio n. 16
0
        public override void HandleMessage(ZeroPacket message)
        {
            if (message.PacketType != LesMessageCode.Status && !_statusReceived)
            {
                throw new SubprotocolException($"No {nameof(StatusMessage)} received prior to communication with {Session.Node:c}.");
            }

            int size = message.Content.ReadableBytes;

            switch (message.PacketType)
            {
            case LesMessageCode.Status:
                StatusMessage statusMessage = Deserialize <StatusMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, statusMessage.ToString());
                }
                Handle(statusMessage);
                break;

            case LesMessageCode.GetBlockHeaders:
                GetBlockHeadersMessage getBlockHeadersMessage = Deserialize <GetBlockHeadersMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getBlockHeadersMessage.ToString());
                }
                Handle(getBlockHeadersMessage);
                break;

            case LesMessageCode.GetBlockBodies:
                GetBlockBodiesMessage getBlockBodiesMessage = Deserialize <GetBlockBodiesMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getBlockBodiesMessage.ToString());
                }
                Handle(getBlockBodiesMessage);
                break;

            case LesMessageCode.GetReceipts:
                GetReceiptsMessage getReceiptsMessage = Deserialize <GetReceiptsMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getReceiptsMessage.ToString());
                }
                Handle(getReceiptsMessage);
                break;

            case LesMessageCode.GetContractCodes:
                GetContractCodesMessage getContractCodesMessage = Deserialize <GetContractCodesMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getContractCodesMessage.ToString());
                }
                Handle(getContractCodesMessage);
                break;

            case LesMessageCode.GetHelperTrieProofs:
                GetHelperTrieProofsMessage getHelperTrieProofsMessage = Deserialize <GetHelperTrieProofsMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Address, Name, getHelperTrieProofsMessage.ToString());
                }
                Handle(getHelperTrieProofsMessage);
                break;
            }
        }
Esempio n. 17
0
        public virtual void HandleMessage(ZeroPacket message)
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"Handling {message} message from {Session.Node:c}.");
            }

            if (message.PacketType != Eth62MessageCode.Status && !_statusReceived)
            {
                throw new SubprotocolException($"No {nameof(StatusMessage)} received prior to communication with {Session.Node:c}.");
            }

            int size = message.Content.ReadableBytes;

            // Logger.Warn($"Received a message {message.Protocol}.{Enum.GetName(typeof(Eth62MessageCode), message.PacketType)} of size {size/1024}kb");

            switch (message.PacketType)
            {
            case Eth62MessageCode.Status:
                StatusMessage statusMessage = Deserialize <StatusMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, statusMessage.ToString());
                }
                Handle(statusMessage);
                break;

            case Eth62MessageCode.NewBlockHashes:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(NewBlockHashesMessage));
                }
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} NewBlockHashes from {Node:c}");
                }
                Metrics.Eth62NewBlockHashesReceived++;
                Handle(Deserialize <NewBlockHashesMessage>(message.Content));
                break;

            case Eth62MessageCode.Transactions:
                Interlocked.Increment(ref Counter);
                Metrics.Eth62TransactionsReceived++;
                TransactionsMessage transactionsMessage = Deserialize <TransactionsMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(TransactionsMessage)}({transactionsMessage.Transactions.Length})");
                }
                if (!_isDowngradedDueToTxFlooding || 10 > _random.Next(0, 99))     // TODO: disable that when IsMining is set to true
                {
                    Handle(transactionsMessage);
                }

                break;

            case Eth62MessageCode.GetBlockHeaders:
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} GetBlockHeaders from {Node:c}");
                }
                Metrics.Eth62GetBlockHeadersReceived++;
                GetBlockHeadersMessage getBlockHeadersMessage = Deserialize <GetBlockHeadersMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(GetBlockHeadersMessage)}({getBlockHeadersMessage.StartingBlockNumber}|{getBlockHeadersMessage.StartingBlockHash}, {getBlockHeadersMessage.MaxHeaders})");
                }
                Handle(getBlockHeadersMessage);
                break;

            case Eth62MessageCode.BlockHeaders:
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} BlockHeaders from {Node:c}");
                }
                Metrics.Eth62BlockHeadersReceived++;
                BlockHeadersMessage blockHeadersMessage = Deserialize <BlockHeadersMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(BlockHeadersMessage)}({blockHeadersMessage.BlockHeaders.Length})");
                }
                Handle(blockHeadersMessage, size);
                break;

            case Eth62MessageCode.GetBlockBodies:
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} GetBlockBodies from {Node:c}");
                }
                Metrics.Eth62GetBlockBodiesReceived++;
                GetBlockBodiesMessage getBlockBodiesMessage = Deserialize <GetBlockBodiesMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(GetBlockBodiesMessage)}({getBlockBodiesMessage.BlockHashes.Count})");
                }
                Handle(getBlockBodiesMessage);
                break;

            case Eth62MessageCode.BlockBodies:
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} BlockBodies from {Node:c}");
                }
                Metrics.Eth62BlockBodiesReceived++;
                BlockBodiesMessage blockBodiesMessage = Deserialize <BlockBodiesMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(BlockBodiesMessage)}({blockBodiesMessage.Bodies.Length})");
                }
                Handle(blockBodiesMessage, size);
                break;

            case Eth62MessageCode.NewBlock:
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} NewBlock from {Node:c}");
                }
                Metrics.Eth62NewBlockReceived++;
                NewBlockMessage newBlockMessage = Deserialize <NewBlockMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(NewBlockMessage)}({newBlockMessage.Block.Number})");
                }
                Handle(newBlockMessage);
                break;
            }
        }
Esempio n. 18
0
        public override void HandleMessage(ZeroPacket message)
        {
            int packetType = message.PacketType;

            if (packetType != Eth62MessageCode.Status && !_statusReceived)
            {
                throw new SubprotocolException($"No {nameof(StatusMessage)} received prior to communication with {Session.Node:c}.");
            }

            int size = message.Content.ReadableBytes;

            if (Logger.IsTrace)
            {
                Logger.Trace($"{Counter:D5} {Eth62MessageCode.GetDescription(packetType)} from {Node:c}");
            }

            switch (packetType)
            {
            case Eth62MessageCode.Status:
                StatusMessage statusMessage = Deserialize <StatusMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, statusMessage.ToString());
                }
                Handle(statusMessage);
                break;

            case Eth62MessageCode.NewBlockHashes:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(NewBlockHashesMessage));
                }
                Handle(Deserialize <NewBlockHashesMessage>(message.Content));
                break;

            case Eth62MessageCode.Transactions:
                TransactionsMessage transactionsMessage = Deserialize <TransactionsMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(TransactionsMessage)}({transactionsMessage.Transactions.Count})");
                }
                Handle(transactionsMessage);
                break;

            case Eth62MessageCode.GetBlockHeaders:
                GetBlockHeadersMessage getBlockHeadersMessage = Deserialize <GetBlockHeadersMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(GetBlockHeadersMessage)}({getBlockHeadersMessage.StartingBlockNumber}|{getBlockHeadersMessage.StartingBlockHash}, {getBlockHeadersMessage.MaxHeaders})");
                }
                Handle(getBlockHeadersMessage);
                break;

            case Eth62MessageCode.BlockHeaders:
                BlockHeadersMessage blockHeadersMessage = Deserialize <BlockHeadersMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(BlockHeadersMessage)}({blockHeadersMessage.BlockHeaders.Length})");
                }
                Handle(blockHeadersMessage, size);
                break;

            case Eth62MessageCode.GetBlockBodies:
                GetBlockBodiesMessage getBlockBodiesMessage = Deserialize <GetBlockBodiesMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(GetBlockBodiesMessage)}({getBlockBodiesMessage.BlockHashes.Count})");
                }
                Handle(getBlockBodiesMessage);
                break;

            case Eth62MessageCode.BlockBodies:
                BlockBodiesMessage blockBodiesMessage = Deserialize <BlockBodiesMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(BlockBodiesMessage)}({blockBodiesMessage.Bodies.Length})");
                }
                Handle(blockBodiesMessage, size);
                break;

            case Eth62MessageCode.NewBlock:
                NewBlockMessage newBlockMessage = Deserialize <NewBlockMessage>(message.Content);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, $"{nameof(NewBlockMessage)}({newBlockMessage.Block.Number})");
                }
                Handle(newBlockMessage);
                break;
            }
        }
Esempio n. 19
0
        private async Task Initialize(CancellationToken cancellationToken)
        {
            if (_ctx.DbProvider == null)
            {
                throw new StepDependencyException(nameof(_ctx.DbProvider));
            }
            if (_ctx.BlockTree == null)
            {
                throw new StepDependencyException(nameof(_ctx.BlockTree));
            }
            if (_ctx.ReceiptStorage == null)
            {
                throw new StepDependencyException(nameof(_ctx.ReceiptStorage));
            }
            if (_ctx.BlockValidator == null)
            {
                throw new StepDependencyException(nameof(_ctx.BlockValidator));
            }
            if (_ctx.SealValidator == null)
            {
                throw new StepDependencyException(nameof(_ctx.SealValidator));
            }
            if (_ctx.Enode == null)
            {
                throw new StepDependencyException(nameof(_ctx.Enode));
            }

            if (_networkConfig.DiagTracerEnabled)
            {
                NetworkDiagTracer.IsEnabled = true;
                NetworkDiagTracer.Start();
            }

            ThisNodeInfo.AddInfo("Mem est netty:", $"{NettyMemoryEstimator.Estimate((uint)Environment.ProcessorCount, _networkConfig.NettyArenaOrder) / 1000 / 1000}MB".PadLeft(8));
            ThisNodeInfo.AddInfo("Mem est peers:", $"{_networkConfig.ActivePeersMaxCount}MB".PadLeft(8));
            Environment.SetEnvironmentVariable("io.netty.allocator.maxOrder", _networkConfig.NettyArenaOrder.ToString());

            int maxPeersCount = _networkConfig.ActivePeersMaxCount;

            _ctx.SyncPeerPool = new SyncPeerPool(_ctx.BlockTree, _ctx.NodeStatsManager, maxPeersCount, _ctx.LogManager);
            _ctx.DisposeStack.Push(_ctx.SyncPeerPool);

            SyncProgressResolver  syncProgressResolver = new SyncProgressResolver(_ctx.BlockTree, _ctx.ReceiptStorage, _ctx.DbProvider.StateDb, _ctx.DbProvider.BeamStateDb, _syncConfig, _ctx.LogManager);
            MultiSyncModeSelector syncModeSelector     = new MultiSyncModeSelector(syncProgressResolver, _ctx.SyncPeerPool, _syncConfig, _ctx.LogManager);

            if (_ctx.SyncModeSelector != null)
            {
                // this is really bad and is a result of lack of proper dependency management
                PendingSyncModeSelector pendingOne = (PendingSyncModeSelector)_ctx.SyncModeSelector;
                pendingOne.SetActual(syncModeSelector);
            }

            _ctx.SyncModeSelector = syncModeSelector;
            _ctx.DisposeStack.Push(syncModeSelector);

            _ctx.Synchronizer = new Synchronizer(
                _ctx.DbProvider,
                _ctx.SpecProvider,
                _ctx.BlockTree,
                _ctx.ReceiptStorage,
                _ctx.BlockValidator,
                _ctx.SealValidator,
                _ctx.SyncPeerPool,
                _ctx.NodeStatsManager,
                _ctx.SyncModeSelector,
                _syncConfig,
                _ctx.LogManager);
            _ctx.DisposeStack.Push(_ctx.Synchronizer);

            _ctx.SyncServer = new SyncServer(
                _ctx.DbProvider.StateDb,
                _ctx.DbProvider.CodeDb,
                _ctx.BlockTree,
                _ctx.ReceiptStorage,
                _ctx.BlockValidator,
                _ctx.SealValidator,
                _ctx.SyncPeerPool,
                _ctx.SyncModeSelector,
                _ctx.Config <ISyncConfig>(),
                _ctx.LogManager);
            _ctx.DisposeStack.Push(_ctx.SyncServer);

            InitDiscovery();
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await InitPeer().ContinueWith(initPeerTask =>
            {
                if (initPeerTask.IsFaulted)
                {
                    _logger.Error("Unable to init the peer manager.", initPeerTask.Exception);
                }
            });

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await StartSync().ContinueWith(initNetTask =>
            {
                if (initNetTask.IsFaulted)
                {
                    _logger.Error("Unable to start the synchronizer.", initNetTask.Exception);
                }
            });

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await StartDiscovery().ContinueWith(initDiscoveryTask =>
            {
                if (initDiscoveryTask.IsFaulted)
                {
                    _logger.Error("Unable to start the discovery protocol.", initDiscoveryTask.Exception);
                }
            });

            try
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                StartPeer();
            }
            catch (Exception e)
            {
                _logger.Error("Unable to start the peer manager.", e);
            }

            ThisNodeInfo.AddInfo("Ethereum     :", $"tcp://{_ctx.Enode.HostIp}:{_ctx.Enode.Port}");
            ThisNodeInfo.AddInfo("Version      :", $"{ClientVersion.Description.Replace("Nethermind/v", string.Empty)}");
            ThisNodeInfo.AddInfo("This node    :", $"{_ctx.Enode.Info}");
            ThisNodeInfo.AddInfo("Node address :", $"{_ctx.Enode.Address} (do not use as an account)");
        }
Esempio n. 20
0
        private async Task Initialize(CancellationToken cancellationToken)
        {
            if (_api.DbProvider == null)
            {
                throw new StepDependencyException(nameof(_api.DbProvider));
            }

            if (_networkConfig.DiagTracerEnabled)
            {
                NetworkDiagTracer.IsEnabled = true;
            }

            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.Start(_api.LogManager);
            }

            Environment.SetEnvironmentVariable("io.netty.allocator.maxOrder", _networkConfig.NettyArenaOrder.ToString());
            CanonicalHashTrie cht = new CanonicalHashTrie(_api.DbProvider !.ChtDb);

            ProgressTracker progressTracker = new(_api.BlockTree !, _api.DbProvider.StateDb, _api.LogManager);

            _api.SnapProvider = new SnapProvider(progressTracker, _api.DbProvider, _api.LogManager);

            SyncProgressResolver syncProgressResolver = new(
                _api.BlockTree !,
                _api.ReceiptStorage !,
                _api.DbProvider.StateDb,
                _api.ReadOnlyTrieStore !,
                progressTracker,
                _syncConfig,
                _api.LogManager);

            _api.SyncProgressResolver = syncProgressResolver;
            _api.BetterPeerStrategy   = new TotalDifficultyBetterPeerStrategy(_api.LogManager);

            int          maxPeersCount         = _networkConfig.ActivePeersMaxCount;
            int          maxPriorityPeersCount = _networkConfig.PriorityPeersMaxCount;
            SyncPeerPool apiSyncPeerPool       = new(_api.BlockTree !, _api.NodeStatsManager !, _api.BetterPeerStrategy, maxPeersCount, maxPriorityPeersCount, SyncPeerPool.DefaultUpgradeIntervalInMs, _api.LogManager);

            _api.SyncPeerPool = apiSyncPeerPool;
            _api.PeerDifficultyRefreshPool = apiSyncPeerPool;
            _api.DisposeStack.Push(_api.SyncPeerPool);

            IEnumerable <ISynchronizationPlugin> synchronizationPlugins = _api.GetSynchronizationPlugins();

            foreach (ISynchronizationPlugin plugin in synchronizationPlugins)
            {
                await plugin.InitSynchronization();
            }

            _api.SyncModeSelector ??= CreateMultiSyncModeSelector(syncProgressResolver);
            _api.DisposeStack.Push(_api.SyncModeSelector);

            _api.Pivot ??= new Pivot(_syncConfig);

            if (_api.BlockDownloaderFactory is null || _api.Synchronizer is null)
            {
                SyncReport syncReport = new(_api.SyncPeerPool !, _api.NodeStatsManager !, _api.SyncModeSelector, _syncConfig, _api.Pivot, _api.LogManager);

                _api.BlockDownloaderFactory ??= new BlockDownloaderFactory(_api.SpecProvider !,
                                                                           _api.BlockTree !,
                                                                           _api.ReceiptStorage !,
                                                                           _api.BlockValidator !,
                                                                           _api.SealValidator !,
                                                                           _api.SyncPeerPool !,
                                                                           _api.BetterPeerStrategy !,
                                                                           syncReport,
                                                                           _api.LogManager);
                _api.Synchronizer ??= new Synchronizer(
                    _api.DbProvider,
                    _api.SpecProvider !,
                    _api.BlockTree !,
                    _api.ReceiptStorage !,
                    _api.SyncPeerPool,
                    _api.NodeStatsManager !,
                    _api.SyncModeSelector,
                    _syncConfig,
                    _api.SnapProvider,
                    _api.BlockDownloaderFactory,
                    _api.Pivot,
                    syncReport,
                    _api.LogManager);
            }

            _api.DisposeStack.Push(_api.Synchronizer);

            _api.SyncServer = new SyncServer(
                _api.TrieStore !,
                _api.DbProvider.CodeDb,
                _api.BlockTree !,
                _api.ReceiptStorage !,
                _api.BlockValidator !,
                _api.SealValidator !,
                _api.SyncPeerPool,
                _api.SyncModeSelector,
                _api.Config <ISyncConfig>(),
                _api.WitnessRepository,
                _api.GossipPolicy,
                _api.SpecProvider !,
                _api.LogManager,
                cht);

            _ = _api.SyncServer.BuildCHT();
            _api.DisposeStack.Push(_api.SyncServer);

            InitDiscovery();
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await InitPeer().ContinueWith(initPeerTask =>
            {
                if (initPeerTask.IsFaulted)
                {
                    _logger.Error("Unable to init the peer manager.", initPeerTask.Exception);
                }
            });

            if (_syncConfig.SnapSync)
            {
                SnapCapabilitySwitcher snapCapabilitySwitcher = new(_api.ProtocolsManager, progressTracker);
                snapCapabilitySwitcher.EnableSnapCapabilityUntilSynced();
            }

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await StartSync().ContinueWith(initNetTask =>
            {
                if (initNetTask.IsFaulted)
                {
                    _logger.Error("Unable to start the synchronizer.", initNetTask.Exception);
                }
            });

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            await StartDiscovery().ContinueWith(initDiscoveryTask =>
            {
                if (initDiscoveryTask.IsFaulted)
                {
                    _logger.Error("Unable to start the discovery protocol.", initDiscoveryTask.Exception);
                }
            });

            try
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                StartPeer();
            }
            catch (Exception e)
            {
                _logger.Error("Unable to start the peer manager.", e);
            }

            if (_api.Enode == null)
            {
                throw new InvalidOperationException("Cannot initialize network without knowing own enode");
            }

            ThisNodeInfo.AddInfo("Ethereum     :", $"tcp://{_api.Enode.HostIp}:{_api.Enode.Port}");
            ThisNodeInfo.AddInfo("Version      :", $"{ClientVersion.Description.Replace("Nethermind/v", string.Empty)}");
            ThisNodeInfo.AddInfo("This node    :", $"{_api.Enode.Info}");
            ThisNodeInfo.AddInfo("Node address :", $"{_api.Enode.Address} (do not use as an account)");
        }
Esempio n. 21
0
        public override void HandleMessage(Packet msg)
        {
            if (msg.PacketType == P2PMessageCode.Hello)
            {
                HandleHello(Deserialize <HelloMessage>(msg.Data));
                Metrics.HellosReceived++;

                foreach (Capability capability in AgreedCapabilities.GroupBy(c => c.ProtocolCode).Select(c => c.OrderBy(v => v.Version).Last()))
                {
                    if (Logger.IsTrace)
                    {
                        Logger.Trace($"{Session.RemoteNodeId} Starting protocolHandler for {capability.ProtocolCode} v{capability.Version} on {Session.RemotePort}");
                    }
                    SubprotocolRequested?.Invoke(this, new ProtocolEventArgs(capability.ProtocolCode, capability.Version));
                }
            }
            else if (msg.PacketType == P2PMessageCode.Disconnect)
            {
                DisconnectMessage disconnectMessage = Deserialize <DisconnectMessage>(msg.Data);
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, "p2p", $"Disconnect({disconnectMessage.Reason})");
                }
                if (Logger.IsTrace)
                {
                    Logger.Trace($"|NetworkTrace| {Session.RemoteNodeId} Received disconnect ({(Enum.IsDefined(typeof(DisconnectReason), (byte) disconnectMessage.Reason) ? ((DisconnectReason) disconnectMessage.Reason).ToString() : disconnectMessage.Reason.ToString())}) on {Session.RemotePort}");
                }
                Close(disconnectMessage.Reason);
            }
            else if (msg.PacketType == P2PMessageCode.Ping)
            {
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Session.RemoteNodeId} Received PING on {Session.RemotePort}");
                }
                HandlePing();
            }
            else if (msg.PacketType == P2PMessageCode.Pong)
            {
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Session.RemoteNodeId} Received PONG on {Session.RemotePort}");
                }
                HandlePong(msg);
            }
            else if (msg.PacketType == P2PMessageCode.AddCapability)
            {
                AddCapabilityMessage message    = Deserialize <AddCapabilityMessage>(msg.Data);
                Capability           capability = message.Capability;
                AgreedCapabilities.Add(message.Capability);
                SupportedCapabilities.Add(message.Capability);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Session.RemoteNodeId} Starting protocolHandler for {capability.ProtocolCode} v{capability.Version} on {Session.RemotePort}");
                }
                SubprotocolRequested?.Invoke(this, new ProtocolEventArgs(capability.ProtocolCode, capability.Version));
            }
            else
            {
                Logger.Error($"{Session.RemoteNodeId} Unhandled packet type: {msg.PacketType}");
            }
        }
Esempio n. 22
0
        private void HandleHello(HelloMessage hello)
        {
            if (NetworkDiagTracer.IsEnabled)
            {
                NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, "p2p", $"Hello({hello.ClientId}, {string.Join(", ", hello.Capabilities)})");
            }

            bool isInbound = !_sentHello;

            if (Logger.IsTrace)
            {
                Logger.Trace($"{Session} P2P received hello.");
            }

            if (!hello.NodeId.Equals(Session.RemoteNodeId))
            {
                if (Logger.IsDebug)
                {
                    Logger.Debug($"Inconsistent Node ID details - expected {Session.RemoteNodeId}, received hello with {hello.NodeId} on " + (isInbound ? "IN connection" : "OUT connection"));
                }
                // it does not really matter if there is mismatch - we do not use it anywhere
//                throw new NodeDetailsMismatchException();
            }

            RemoteClientId        = hello.ClientId;
            Session.Node.ClientId = hello.ClientId;

            if (Logger.IsTrace)
            {
                Logger.Trace(!_sentHello
                ? $"{Session.RemoteNodeId} P2P initiating inbound {hello.Protocol}.{hello.P2PVersion} on {hello.ListenPort} ({hello.ClientId})"
                : $"{Session.RemoteNodeId} P2P initiating outbound {hello.Protocol}.{hello.P2PVersion} on {hello.ListenPort} ({hello.ClientId})");
            }

            // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-8.md
            // Clients implementing a newer version simply send a packet with higher version and possibly additional list elements.
            // * If such a packet is received by a node with lower version, it will blindly assume that the remote end is backwards-compatible and respond with the old handshake.
            // * If the packet is received by a node with equal version, new features of the protocol can be used.
            // * If the packet is received by a node with higher version, it can enable backwards-compatibility logic or drop the connection.

            ProtocolVersion = hello.P2PVersion;

            List <Capability> capabilities = hello.Capabilities;

            AvailableCapabilities = new List <Capability>(capabilities);
            foreach (Capability remotePeerCapability in capabilities)
            {
                if (SupportedCapabilities.Contains(remotePeerCapability))
                {
                    if (Logger.IsTrace)
                    {
                        Logger.Trace($"{Session.RemoteNodeId} Agreed on {remotePeerCapability.ProtocolCode} v{remotePeerCapability.Version}");
                    }
                    AgreedCapabilities.Add(remotePeerCapability);
                }
                else
                {
                    if (Logger.IsTrace)
                    {
                        Logger.Trace($"{Session.RemoteNodeId} Capability not supported {remotePeerCapability.ProtocolCode} v{remotePeerCapability.Version}");
                    }
                }
            }

            if (!capabilities.Any(c => SupportedCapabilities.Contains(c)))
            {
                InitiateDisconnect(DisconnectReason.UselessPeer, $"capabilities: {string.Join(", ", capabilities.Select(c => string.Concat(c.ProtocolCode, c.Version)))}");
            }

            ReceivedProtocolInitMsg(hello);

            P2PProtocolInitializedEventArgs eventArgs = new P2PProtocolInitializedEventArgs(this)
            {
                P2PVersion   = ProtocolVersion,
                ClientId     = RemoteClientId,
                Capabilities = capabilities,
                ListenPort   = hello.ListenPort
            };

            ProtocolInitialized?.Invoke(this, eventArgs);
        }
Esempio n. 23
0
        protected override void ChannelRead0(IChannelHandlerContext ctx, DatagramPacket packet)
        {
            IByteBuffer content = packet.Content;
            EndPoint    address = packet.Sender;

            byte[] msg = new byte[content.ReadableBytes];
            content.ReadBytes(msg);

            if (msg.Length < 98)
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Incorrect discovery message, length: {msg.Length}, sender: {address}");
                }
                return;
            }

            byte typeRaw = msg[97];

            if (!Enum.IsDefined(typeof(MessageType), (int)typeRaw))
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Unsupported message type: {typeRaw}, sender: {address}, message {msg.ToHexString()}");
                }
                return;
            }

            MessageType type = (MessageType)typeRaw;

            if (_logger.IsTrace)
            {
                _logger.Trace($"Received message: {type}");
            }

            DiscoveryMessage message;

            try
            {
                message            = Deserialize(type, msg);
                message.FarAddress = (IPEndPoint)address;
            }
            catch (Exception e)
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Error during deserialization of the message, type: {type}, sender: {address}, msg: {msg.ToHexString()}, {e.Message}");
                }
                return;
            }

            try
            {
                if ((ulong)message.ExpirationTime < _timestamper.EpochSeconds)
                {
                    if (_logger.IsDebug)
                    {
                        _logger.Debug($"Received a discovery message that has expired, type: {type}, sender: {address}, message: {message}");
                    }
                    return;
                }

                if (!message.FarAddress.Equals((IPEndPoint)packet.Sender))
                {
                    if (_logger.IsDebug)
                    {
                        _logger.Debug($"Discovery fake IP detected - pretended {message.FarAddress} but was {ctx.Channel.RemoteAddress}, type: {type}, sender: {address}, message: {message}");
                    }
                    return;
                }

                if (message.FarPublicKey == null)
                {
                    if (_logger.IsDebug)
                    {
                        _logger.Debug($"Discovery message without a valid signature {message.FarAddress} but was {ctx.Channel.RemoteAddress}, type: {type}, sender: {address}, message: {message}");
                    }
                    return;
                }

                if (message is PingMessage pingMessage)
                {
                    if (NetworkDiagTracer.IsEnabled)
                    {
                        NetworkDiagTracer.ReportIncomingMessage(pingMessage.FarAddress.Address.ToString(), "HANDLER disc v4", $"PING {pingMessage.SourceAddress.Address} -> {pingMessage.DestinationAddress.Address}");
                    }
                }
                else
                {
                    if (NetworkDiagTracer.IsEnabled)
                    {
                        NetworkDiagTracer.ReportIncomingMessage(message.FarAddress.Address.ToString(), "HANDLER disc v4", message.MessageType.ToString());
                    }
                }

                _discoveryManager.OnIncomingMessage(message);
            }
            catch (Exception e)
            {
                if (_logger.IsDebug)
                {
                    _logger.Error($"DEBUG/ERROR Error while processing message, type: {type}, sender: {address}, message: {message}", e);
                }
            }
        }
Esempio n. 24
0
        public override int MessageIdSpaceSize => 17; // magic number here following Go

        public override void HandleMessage(ZeroPacket message)
        {
            base.HandleMessage(message);

            int size = message.Content.ReadableBytes;

            switch (message.PacketType)
            {
            case Eth63MessageCode.GetReceipts:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(GetReceiptsMessage));
                }
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} GetReceipts from {Node:c}");
                }
                Metrics.Eth63GetReceiptsReceived++;
                Handle(Deserialize <GetReceiptsMessage>(message.Content));
                break;

            case Eth63MessageCode.Receipts:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(ReceiptsMessage));
                }
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} Receipts from {Node:c}");
                }
                Metrics.Eth63ReceiptsReceived++;
                Handle(Deserialize <ReceiptsMessage>(message.Content), size);
                break;

            case Eth63MessageCode.GetNodeData:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(GetNodeDataMessage));
                }
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} GetNodeData from {Node:c}");
                }
                Metrics.Eth63GetNodeDataReceived++;
                Handle(Deserialize <GetNodeDataMessage>(message.Content));
                break;

            case Eth63MessageCode.NodeData:
                if (NetworkDiagTracer.IsEnabled)
                {
                    NetworkDiagTracer.ReportIncomingMessage(Session.Node.Host, Name, nameof(NodeDataMessage));
                }
                Interlocked.Increment(ref Counter);
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{Counter:D5} NodeData from {Node:c}");
                }
                Metrics.Eth63NodeDataReceived++;
                Handle(Deserialize <NodeDataMessage>(message.Content), size);
                break;
            }
        }