/// <summary>
        /// Appends the given load to the machine with the lowest load
        /// </summary>
        /// <param name="load">Load to append</param>
        /// <param name="includeMaster">Can master receive this load</param>
        /// <returns>The peer manager that received the load, null if master machine received it</returns>
        public IPeerManager AppendLoad(float load, bool includeMaster)
        {
            IPeerManager lowestPeer = null;

            foreach (var clientLoad in clientLoads)
            {
                if (lowestPeer == null || clientLoad.Value < clientLoads[lowestPeer])
                {
                    lowestPeer = clientLoad.Key;
                }
            }

            if (includeMaster && (lowestPeer == null || masterLoad < clientLoads[lowestPeer]))
            {
                masterLoad += load;
                return(null);
            }

            if (lowestPeer == null)
            {
                Log.Error($"{nameof(NetworkLoadBalancer)} does not have any client registered. Load appended to the master machine.");
                masterLoad += load;
                return(null);
            }

            clientLoads[lowestPeer] = clientLoads[lowestPeer] + load;
            return(lowestPeer);
        }
Example #2
0
        /// <inheritdoc/>
        public void ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
        {
            if (ParentObject.IsAuthoritative)
            {
                return;
            }

            DistributedMessage messageCopy = null;

            if (ParentObject.ForwardMessages)
            {
                messageCopy = new DistributedMessage(distributedMessage);
                if (string.IsNullOrEmpty(messageCopy.AddressKey))
                {
                    Log.Error("Null before");
                }
            }

            ParseMessage(distributedMessage);
            if (ParentObject.ForwardMessages && messageCopy != null)
            {
                if (!string.IsNullOrEmpty(messageCopy.AddressKey))
                {
                    BroadcastMessage(messageCopy);
                }
                else
                {
                    Log.Error("Null after");
                }
            }
        }
Example #3
0
        public void parity_netPeers_null_ActivePeers()
        {
            var logger        = LimboLogs.Instance;
            var specProvider  = MainnetSpecProvider.Instance;
            var ethereumEcdsa = new EthereumEcdsa(specProvider.ChainId, logger);
            var txStorage     = new InMemoryTxStorage();

            IDb        blockDb     = new MemDb();
            IDb        headerDb    = new MemDb();
            IDb        blockInfoDb = new MemDb();
            IBlockTree blockTree   = new BlockTree(blockDb, headerDb, blockInfoDb, new ChainLevelInfoRepository(blockInfoDb), specProvider, NullBloomStorage.Instance, LimboLogs.Instance);

            var txPool = new TxPool.TxPool(txStorage, ethereumEcdsa, new ChainHeadSpecProvider(specProvider, blockTree), new TxPoolConfig(),
                                           new StateProvider(new TrieStore(new MemDb(), LimboLogs.Instance), new MemDb(), LimboLogs.Instance), new TxValidator(specProvider.ChainId), LimboLogs.Instance);

            new OnChainTxWatcher(blockTree, txPool, specProvider, LimboLogs.Instance);
            IReceiptStorage receiptStorage = new InMemoryReceiptStorage();

            IPeerManager peerManager = Substitute.For <IPeerManager>();

            IParityModule parityModule = new ParityModule(ethereumEcdsa, txPool, blockTree, receiptStorage, new Enode(TestItem.PublicKeyA, IPAddress.Loopback, 8545),
                                                          _signerStore, new MemKeyStore(new[] { TestItem.PrivateKeyA }), logger, peerManager);
            string serialized     = RpcTest.TestSerializedRequest(parityModule, "parity_netPeers");
            var    expectedResult = "{\"jsonrpc\":\"2.0\",\"result\":{\"active\":0,\"connected\":0,\"max\":0,\"peers\":[]},\"id\":67}";

            Assert.AreEqual(expectedResult, serialized);
        }
Example #4
0
        /// <summary>
        /// Method invoked when new peer connects
        /// </summary>
        /// <param name="peer">Peer that has connected</param>
        public void OnPeerConnected(IPeerManager peer)
        {
            Debug.Assert(State == SimulationState.Initial);
            MasterPeer = peer;

            Log.Info($"Master {peer.PeerEndPoint} connected.");

            var info = new Commands.Info()
            {
                Version         = "todo",
                UnityVersion    = Application.unityVersion,
                OperatingSystem = SystemInfo.operatingSystemFamily.ToString(),
            };

            State = SimulationState.Connected;
            if (Loader.Instance.LoaderUI != null)
            {
                Loader.Instance.LoaderUI.SetLoaderUIState(LoaderUI.LoaderUIStateType.PROGRESS);
            }
            var infoData = PacketsProcessor.Write(info);
            var message  = MessagesPool.Instance.GetMessage(infoData.Length);

            message.AddressKey = Key;
            message.Content.PushBytes(infoData);
            message.Type = DistributedMessageType.ReliableOrdered;
            UnicastMessage(peer.PeerEndPoint, message);
        }
Example #5
0
        private async Task InitPeer()
        {
            /* rlpx */
            var eciesCipher = new EciesCipher(_cryptoRandom);
            var eip8Pad     = new Eip8MessagePad(_cryptoRandom);

            _messageSerializationService.Register(new AuthEip8MessageSerializer(eip8Pad));
            _messageSerializationService.Register(new AckEip8MessageSerializer(eip8Pad));
            _messageSerializationService.Register(Assembly.GetAssembly(typeof(HelloMessageSerializer)));

            var encryptionHandshakeServiceA = new EncryptionHandshakeService(_messageSerializationService, eciesCipher,
                                                                             _cryptoRandom, new Ecdsa(), _nodeKey, _logManager);

            var networkConfig = _configProvider.GetConfig <INetworkConfig>();

            _sessionMonitor = new SessionMonitor(networkConfig, _logManager);
            _rlpxPeer       = new RlpxPeer(
                _nodeKey.PublicKey,
                _initConfig.P2PPort,
                encryptionHandshakeServiceA,
                _logManager,
                _sessionMonitor);

            await _rlpxPeer.Init();

            var peerStorage = new NetworkStorage(PeersDbPath, networkConfig, _logManager, _perfService);

            ProtocolValidator protocolValidator = new ProtocolValidator(_nodeStatsManager, _blockTree, _logManager);

            _protocolsManager = new ProtocolsManager(_syncPeerPool, _syncServer, _txPool, _discoveryApp, _messageSerializationService, _rlpxPeer, _nodeStatsManager, protocolValidator, peerStorage, _perfService, _logManager);
            PeerLoader peerLoader = new PeerLoader(networkConfig, _nodeStatsManager, peerStorage, _logManager);

            _peerManager = new PeerManager(_rlpxPeer, _discoveryApp, _nodeStatsManager, peerStorage, peerLoader, networkConfig, _logManager);
            _peerManager.Init();
        }
Example #6
0
        public void Initialize()
        {
            _logManager            = new OneLoggerLogManager(new SimpleConsoleLogger());
            _configurationProvider = new JsonConfigProvider();
            ((NetworkConfig)_configurationProvider.GetConfig <NetworkConfig>()).DbBasePath = Path.Combine(Path.GetTempPath(), "PeerManagerTests");
            if (!Directory.Exists(_configurationProvider.GetConfig <NetworkConfig>().DbBasePath))
            {
                Directory.CreateDirectory(_configurationProvider.GetConfig <NetworkConfig>().DbBasePath);
            }
            _nodeFactory = new NodeFactory();
            _localPeer   = new TestRlpxPeer();
            var keyProvider = new PrivateKeyProvider(new CryptoRandom());
            var key         = keyProvider.PrivateKey.PublicKey;

            _synchronizationManager = Substitute.For <ISynchronizationManager>();

            var nodeTable = new NodeTable(_nodeFactory, Substitute.For <IKeyStore>(), new NodeDistanceCalculator(_configurationProvider), _configurationProvider, _logManager);

            nodeTable.Initialize(new NodeId(key));

            _discoveryManager = new DiscoveryManager(new NodeLifecycleManagerFactory(_nodeFactory, nodeTable, new DiscoveryMessageFactory(_configurationProvider), Substitute.For <IEvictionManager>(), new NodeStatsProvider(_configurationProvider), _configurationProvider, _logManager), _nodeFactory, nodeTable, new DiscoveryStorage(_configurationProvider, _nodeFactory, _logManager, new PerfService(_logManager)), _configurationProvider, _logManager);
            _discoveryManager.MessageSender = Substitute.For <IMessageSender>();

            _peerManager = new PeerManager(_localPeer, _discoveryManager, _synchronizationManager, new NodeStatsProvider(_configurationProvider), new PeerStorage(_configurationProvider, _nodeFactory, _logManager, new PerfService(_logManager)), _nodeFactory, _configurationProvider, new PerfService(_logManager), _logManager);
        }
Example #7
0
 /// <summary>
 /// Method invoked when peer disconnects
 /// </summary>
 /// <param name="peer">Peer that has disconnected</param>
 public void OnPeerDisconnected(IPeerManager peer)
 {
     MasterPeer = null;
     OnStopCommand(new Commands.Stop());
     MessagesManager.RevokeIdentifiers();
     Debug.Log($"Peer {peer.PeerEndPoint} disconnected.");
 }
    void IMessageReceiver.ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
    {
        if (sensorsInstances.Any() || Loader.Instance.Network.IsMaster)
        {
            return;
        }
        var allSensorsString     = distributedMessage.Content.PopString();
        var allSensors           = JsonConvert.DeserializeObject <SensorData[]>(allSensorsString);
        var enabledSensorsString = distributedMessage.Content.PopString();
        var enabledSensors       = JsonConvert.DeserializeObject <List <string> >(enabledSensorsString);

        InstantiateSensors(allSensors);
        foreach (var instance in sensorsInstances)
        {
            if (enabledSensors.Contains(instance.Key))
            {
                instance.Value.Enable();
            }
            else
            {
                instance.Value.Disable();
            }
        }
        SensorsChanged?.Invoke();
    }
Example #9
0
        /// <inheritdoc/>
        public void ReceiveMessage(IPeerManager sender, Message message)
        {
            var command =
                (IdsRegisterCommandType)message.Content.PopInt(ByteCompression
                                                               .RequiredBytes <IdsRegisterCommandType>());
            var key = message.Content.PopString();
            var id  = message.Content.PopInt(BytesPerId);

            switch (command)
            {
            case IdsRegisterCommandType.BindIdAndKey:
                if (AssignIds)
                {
                    return;
                }
                BindReceiver(key, id);
                break;

            case IdsRegisterCommandType.UnbindIdAndKey:
                if (AssignIds)
                {
                    return;
                }
                UnbindKeyId(key, id);
                break;
            }
        }
Example #10
0
    /// <inheritdoc/>
    public void ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
    {
        var methodName = distributedMessage.Content.PopEnum <NPCControllerMethodName>();

        switch (methodName)
        {
        case NPCControllerMethodName.SetLights:
            SetLights(distributedMessage.Content.PopInt());
            break;

        case NPCControllerMethodName.SetBrakeLights:
            SetBrakeLights(distributedMessage.Content.PopBool());
            break;

        case NPCControllerMethodName.SetNPCTurnSignal:
            SetNPCTurnSignal(distributedMessage.Content.PopBool(), distributedMessage.Content.PopBool(), distributedMessage.Content.PopBool());
            break;

        case NPCControllerMethodName.SetNPCHazards:
            SetNPCHazards(distributedMessage.Content.PopBool());
            break;

        case NPCControllerMethodName.SetIndicatorReverse:
            SetIndicatorReverse(distributedMessage.Content.PopBool());
            break;

        case NPCControllerMethodName.ResetLights:
            ResetLights();
            break;

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
Example #11
0
 /// <summary>
 /// Method that sends initial messages to new peer after connecting to the connection manager
 /// </summary>
 /// <param name="peer">New connected peer</param>
 private void ConnectionManagerOnPeerConnected(IPeerManager peer)
 {
     for (var i = 0; i < senders.Count; i++)
     {
         senders[i].UnicastInitialMessages(peer.PeerEndPoint);
     }
 }
Example #12
0
 /// <inheritdoc/>
 public void ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
 {
     if (!ParentObject.IsAuthoritative)
     {
         ParseMessage(distributedMessage);
     }
 }
 public EthStatsIntegration(
     string name,
     string node,
     int port,
     string network,
     string protocol,
     string api,
     string client,
     string contact,
     bool canUpdateHistory,
     string secret,
     IEthStatsClient?ethStatsClient,
     IMessageSender?sender,
     ITxPool?txPool,
     IBlockTree?blockTree,
     IPeerManager?peerManager,
     ILogManager?logManager)
 {
     _name             = name;
     _node             = node;
     _port             = port;
     _network          = network;
     _protocol         = protocol;
     _api              = api;
     _client           = client;
     _contact          = contact;
     _canUpdateHistory = canUpdateHistory;
     _secret           = secret;
     _ethStatsClient   = ethStatsClient ?? throw new ArgumentNullException(nameof(ethStatsClient));
     _sender           = sender ?? throw new ArgumentNullException(nameof(sender));
     _txPool           = txPool ?? throw new ArgumentNullException(nameof(txPool));
     _blockTree        = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _peerManager      = peerManager ?? throw new ArgumentNullException(nameof(peerManager));
     _logger           = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
 }
Example #14
0
 public ServerSocket(IPeerManager peerMgr)
 {
     sock = new Socket(AddressFamily.InterNetworkV6,
                       SocketType.Stream,
                       ProtocolType.Tcp);
     listener    = new TcpListener(IPAddress.Parse("127.0.0.1"), 1984);
     peerManager = peerMgr;
 }
Example #15
0
        private async Task InitPeer()
        {
            /* rlpx */
            var eciesCipher = new EciesCipher(_cryptoRandom);
            var eip8Pad     = new Eip8MessagePad(_cryptoRandom);

            _messageSerializationService.Register(new AuthEip8MessageSerializer(eip8Pad));
            _messageSerializationService.Register(new AckEip8MessageSerializer(eip8Pad));
            var encryptionHandshakeServiceA = new EncryptionHandshakeService(_messageSerializationService, eciesCipher,
                                                                             _cryptoRandom, new Signer(), _nodeKey, _logManager);

            /* p2p */
            _messageSerializationService.Register(new HelloMessageSerializer());
            _messageSerializationService.Register(new DisconnectMessageSerializer());
            _messageSerializationService.Register(new PingMessageSerializer());
            _messageSerializationService.Register(new PongMessageSerializer());

            /* eth62 */
            _messageSerializationService.Register(new StatusMessageSerializer());
            _messageSerializationService.Register(new TransactionsMessageSerializer());
            _messageSerializationService.Register(new GetBlockHeadersMessageSerializer());
            _messageSerializationService.Register(new NewBlockHashesMessageSerializer());
            _messageSerializationService.Register(new GetBlockBodiesMessageSerializer());
            _messageSerializationService.Register(new BlockHeadersMessageSerializer());
            _messageSerializationService.Register(new BlockBodiesMessageSerializer());
            _messageSerializationService.Register(new NewBlockMessageSerializer());

            /* eth63 */
            _messageSerializationService.Register(new GetNodeDataMessageSerializer());
            _messageSerializationService.Register(new NodeDataMessageSerializer());
            _messageSerializationService.Register(new GetReceiptsMessageSerializer());
            _messageSerializationService.Register(new ReceiptsMessageSerializer());

            var             networkConfig  = _configProvider.GetConfig <INetworkConfig>();
            ISessionMonitor sessionMonitor = new SessionMonitor(networkConfig, _logManager);

            _rlpxPeer = new RlpxPeer(
                _nodeKey.PublicKey,
                _initConfig.P2PPort,
                encryptionHandshakeServiceA,
                _logManager,
                _perfService,
                sessionMonitor);

            await _rlpxPeer.Init();


            var peerStorage = new NetworkStorage(PeersDbPath, networkConfig, _logManager, _perfService);

            ProtocolValidator protocolValidator = new ProtocolValidator(_nodeStatsManager, _blockTree, _logManager);

            _protocolsManager = new ProtocolsManager(_syncManager, _transactionPool, _discoveryApp, _messageSerializationService, _rlpxPeer, _nodeStatsManager, protocolValidator, peerStorage, _perfService, _logManager);
            PeerLoader peerLoader = new PeerLoader(networkConfig, _nodeStatsManager, peerStorage, _logManager);

            _peerManager = new PeerManager(_rlpxPeer, _discoveryApp, _nodeStatsManager, peerStorage, peerLoader, networkConfig, _logManager);
            _peerManager.Init();
        }
Example #16
0
 /// <summary>
 /// Method invoked when peer disconnects
 /// </summary>
 /// <param name="peer">Peer that has disconnected</param>
 public void OnPeerDisconnected(IPeerManager peer)
 {
     if (peer != MasterPeer)
     {
         return;
     }
     MasterPeer = null;
     Log.Info($"Peer {peer.PeerEndPoint} disconnected.");
 }
        /// <summary>
        /// Method invoked when master manager connects to a new client
        /// </summary>
        /// <param name="peer">Peer manager of the connected client</param>
        private void MasterManagerOnClientConnected(IPeerManager peer)
        {
            if (clientLoads.ContainsKey(peer))
            {
                Log.Error($"Client {peer.PeerEndPoint.Address} is already registered in the load balanced.");
                return;
            }

            clientLoads.Add(peer, 0.0f);
        }
Example #18
0
    public void ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
    {
        if (sensorsInstances.Any() || Loader.Instance.Network.IsMaster)
        {
            return;
        }
        var sensors = distributedMessage.Content.PopString();

        InstantiateSensors(sensors);
    }
        /// <summary>
        /// Release the load from given peer
        /// </summary>
        /// <param name="peer">Peer which should lower its load</param>
        /// <param name="load">Load value</param>
        public void ReleaseLoad(IPeerManager peer, float load)
        {
            if (peer == null)
            {
                masterLoad -= load;
                return;
            }

            clientLoads[peer] = clientLoads[peer] - load;
        }
Example #20
0
        public AdminModule(IBlockTree blockTree, INetworkConfig networkConfig, IPeerManager peerManager, IStaticNodesManager staticNodesManager, IEnode enode, string dataDir)
        {
            _blockTree          = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _networkConfig      = networkConfig ?? throw new ArgumentNullException(nameof(networkConfig));
            _peerManager        = peerManager ?? throw new ArgumentNullException(nameof(peerManager));
            _staticNodesManager = staticNodesManager ?? throw new ArgumentNullException(nameof(staticNodesManager));
            _enode   = enode ?? throw new ArgumentNullException(nameof(enode));
            _dataDir = dataDir ?? throw new ArgumentNullException(nameof(dataDir));

            BuildNodeInfo();
        }
 public BusBootstrapper(IAssemblyScanner assemblyScanner, ZmqTransportConfiguration zmqTransportConfiguration, IBusBootstrapperConfiguration bootstrapperConfiguration,
     IMessageSender messageSender, IPeerManager peerManager, ISubscriptionManager subscriptionManager, IPeerConfiguration peerConfiguration)
 {
     _assemblyScanner = assemblyScanner;
     _zmqTransportConfiguration = zmqTransportConfiguration;
     _bootstrapperConfiguration = bootstrapperConfiguration;
     _messageSender = messageSender;
     _peerManager = peerManager;
     _subscriptionManager = subscriptionManager;
     _peerConfiguration = peerConfiguration;
 }
Example #22
0
    public void ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
    {
        if (sensorsInstances.Any() || Loader.Instance.Network.IsMaster)
        {
            return;
        }
        var sensors = distributedMessage.Content.PopString();
        var parsed  = JsonConvert.DeserializeObject <SensorData[]>(sensors);

        InstantiateSensors(parsed);
    }
 // And this for Autofac or real IoC
 public ConversationManager(
     ISignallingService signaller,
     IPeerManager peerManager,
     IMediaManager mediaManager,
     IDispatcherProvider dispatcherProvider)
 {
     this.signaller   = signaller;
     this.peerManager = peerManager;
     this.peerManager.OnIceCandidate += this.OnLocalIceCandidateDeterminedAsync;
     this.mediaManager       = mediaManager;
     this.dispatcherProvider = dispatcherProvider;
 }
Example #24
0
        /// <summary>
        /// Method invoked when peer disconnects
        /// </summary>
        /// <param name="peer">Peer that has disconnected</param>
        public void OnPeerDisconnected(IPeerManager peer)
        {
            if (peer != MasterPeer)
            {
                Log.Info($"Could not connect to the {peer.PeerEndPoint} endpoint.");
                connectionRequests--;
                return;
            }

            MasterPeer = null;
            Log.Info($"Peer {peer.PeerEndPoint} disconnected.");
        }
        public ReliabilityCoordinator(IPeerManager peerManager, IPeerConfiguration peerConfiguration, IAssemblyScanner assemblyScanner)
        {
            _peerManager = peerManager;
            _peerConfiguration = peerConfiguration;
            _assemblyScanner = assemblyScanner;
            _peerManager.PeerConnected += OnPeerChange;

            var messageOptionses = _assemblyScanner.GetMessageOptions();
            foreach (var messageOptionse in messageOptionses)
            {
                _messageOptions.Add(messageOptionse.MessageType.FullName, messageOptionse);
            }
        }
Example #26
0
        /// <summary>
        /// Method invoked when new peer connects
        /// </summary>
        /// <param name="peer">Peer that has connected</param>
        public void OnPeerConnected(IPeerManager peer)
        {
            Debug.Assert(State == SimulationState.Connecting);
            Connection.DroppedAllConnections -= TryConnectToMasterEndPoints;
            MasterPeer = peer;

            Log.Info($"Peer {peer.PeerEndPoint} connected.");

            State = SimulationState.Connected;
            if (Loader.Instance.Network.IsSimulationReady)
            {
                SendReadyCommand();
            }
        }
Example #27
0
    public void ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
    {
        var sensorPath   = distributedMessage.Content.PopString();
        var sensorUid    = distributedMessage.Content.PopString();
        var sensorInPath = sensors.FirstOrDefault(metaData => metaData.HierarchyPath == sensorPath);

        if (sensorInPath != null)
        {
            AppendUid(sensorInPath.Instance, sensorUid);
        }
        else
        {
            awaitingPathToUID.Add(sensorPath, sensorUid);
        }
    }
        protected bool DisposedValue; // To detect redundant calls

        public UDPNetworking(IPeerIdentification peerName, IPeerManager peerManager, ISerializer serializer, IPEndPoint ipEndPoint)
        {
            PeerName    = peerName;
            PeerManager = peerManager;
            Serializer  = serializer;

            UDPClient = new UDPClient(ipEndPoint);
            UDPClient.OnMessageReceived +=
                (sender, udpResult) => RecieveMessageAsync(udpResult.Buffer, udpResult.RemoteEndPoint);
            UDPClient.OnMessageReceivedFailure +=
                (sender, exception) => OnMessageReceivedFailure?.Invoke(sender, exception);
            UDPClient.OnMessageSendFailure +=
                (sender, exception) => OnMessageSendFailure?.Invoke(sender, exception);
            UDPClient.WaitForStartup();
        }
Example #29
0
        /// <summary>
        /// Method invoked when new peer connects
        /// </summary>
        /// <param name="peer">Peer that has connected</param>
        public void OnPeerConnected(IPeerManager peer)
        {
            connectionRequests--;
            Debug.Assert(State == SimulationState.Connecting);
            StopCoroutine(masterEndpointsCouroutine);
            MasterPeer = peer;

            Log.Info($"Peer {peer.PeerEndPoint} connected.");

            State = SimulationState.Connected;
            if (Loader.Instance.Network.IsSimulationReady)
            {
                SendReadyCommand();
            }
        }
        /// <inheritdoc/>
        public void OnPeerConnected(NetPeer peer)
        {
            if (MasterPeer != null)
            {
                peers.Remove(peer.EndPoint);
                return;
            }
            if (!peers.TryGetValue(peer.EndPoint, out masterPeer))
            {
                masterPeer = new LiteNetLibPeerManager(peer);
                peers.Add(peer.EndPoint, MasterPeer);
            }

            Log.Info($"{GetType().Name} has connected to the master peer '{MasterPeer.PeerEndPoint}'.");
            PeerConnected?.Invoke(MasterPeer);
        }
Example #31
0
        public void Setup()
        {
            _blockTree     = Build.A.BlockTree().OfChainLength(5).TestObject;
            _networkConfig = new NetworkConfig();
            IPeerManager peerManager = Substitute.For <IPeerManager>();

            peerManager.ActivePeers.Returns(new List <Peer> {
                new Peer(new Node("127.0.0.1", 30303, true))
            });

            IStaticNodesManager staticNodesManager = Substitute.For <IStaticNodesManager>();
            Enode enode = new Enode(_enodeString);

            _adminRpcModule = new AdminRpcModule(_blockTree, _networkConfig, peerManager, staticNodesManager, enode, _exampleDataDir);
            _serializer     = new EthereumJsonSerializer();
        }
        void IMessageReceiver.ReceiveMessage(IPeerManager sender, DistributedMessage distributedMessage)
        {
            var network = Loader.Instance.Network;

            if (network.IsMaster)
            {
                var agentsString = distributedMessage.Content.PopString();
                var agentsData   = JArray.Parse(agentsString);
                foreach (var agentDataToken in agentsData.Children())
                {
                    var agentData = agentDataToken as JObject;
                    if (agentData == null)
                    {
                        continue;
                    }
                    var agentId     = agentData["id"].Value <uint>();
                    var sensorsJson = agentData["Sensors"] as JObject;
                    if (sensorsJson == null)
                    {
                        continue;
                    }
                    if (ClientsSensorsData.TryGetValue(agentId, out var sensors))
                    {
                        foreach (var clientSensorData in sensorsJson.Properties())
                        {
                            sensors.Add(clientSensorData.Name, clientSensorData.Value);
                        }
                    }
                    else
                    {
                        ClientsSensorsData.Add(agentId, sensorsJson);
                    }
                }

                //Send approve response to the client
                var message = MessagesPool.Instance.GetMessage();
                message.AddressKey = Key;
                message.Type       = DistributedMessageType.ReliableOrdered;
                UnicastMessage(sender.PeerEndPoint, message);
                ReceivedResponses++;
            }
            else
            {
                //Register received response from the master
                ReceivedResponses++;
            }
        }