private void OnConsoleCommandPeersLayout(string[] args) { byte n = Env.Value <byte>("n", 4); if (args.Length > 0) { byte.TryParse(args[0], out n); } // define layout ElasticLayout layout = ElasticLayout.DefineLayout(Peers.Count, n); for (byte x = 1; x <= layout.X; x++) { for (byte y = 1; y <= layout.Y; y++) { for (byte z = 1; z <= layout.Z; z++) { Elastic3D coordinates = new Elastic3D(x, y, z); string[] peers = Peers.ToArray <string>(coordinates, layout); BConsole.WriteLine(ConsoleColor.DarkCyan, $"Coordinates{coordinates.ToString()}: nPeers={peers.Length}"); foreach (var peer in peers) { BConsole.WriteLine(EndPoint.ToString() == peer?ConsoleColor.Yellow : ConsoleColor.Gray, $" {peer}"); } } } } BConsole.WriteLine(ConsoleColor.DarkCyan, $"ElasticLayout.DefineLayout({Peers.Count},{n})={layout.ToString()}"); }
private void Register(ITcpSession session) { Message message = new Message.Builder() .Body(ACTION, ACTION_REGISTER) .Body("enode", NodeUrl.ToString()) .Build(NodeKey); session?.Write(message.ToBytes()); }
private void OnTcpMessageRegister(ITcpSession session, Message message) { // register requested enode ElasticAddress address = message.Value <string>("enode"); // verify message PrivateKey nodeKey = MasterKey.CKD($"{address.Host}:{address.Port}"); if (!message.Verify(nodeKey.Address)) { Logger.warning("Unverified message!"); return; } // valid address? if (nodeKey.Address != address.Address) { Logger.warning("Invalid address"); return; } // register peer Peers.Append(address); // session lock (_sessionMap) _sessionMap[session.SID] = address.Address; lock (BConsole.Lock) { BConsole.Write(ConsoleColor.DarkCyan, address.ToString()); BConsole.WriteLine(" registered!"); } SyncAllPeers(); }