예제 #1
0
        // Process incoming command instance
        internal static void Invoke(LevinProtocol Context, LevinPeer Peer, Command Command)
        {
            // Command is a request
            if (!Command.IsResponse)
            {
                // TODO: Do something
            }

            // Command is a response
            else
            {
                // TODO: Do something
            }
        }
예제 #2
0
        // Process incoming command instance
        internal static void Invoke(LevinProtocol Context, LevinPeer Peer, Command Command)
        {
            // Command is a request
            if (!Command.IsResponse)
            {
                // Deserialize request
                Request Request = Request.Deserialize(Command.Data);

                // debug
                Context.Logger?.Log(Level.DEBUG, "[IN] Received \"Request TX Pool\" Request:");
                Context.Logger?.Log(Level.DEBUG, "- Response Requested: {0}", !Command.IsNotification);
                Context.Logger?.Log(Level.DEBUG, "- TXs:");
                for (int i = 0; i < Request.Txs.Length; i++)
                {
                    Context.Logger?.Log(Level.DEBUG, "  - [{0}]: {1}", i, Request.Txs[i]);
                }

                // TODO: Do something with request data
            }
        }
예제 #3
0
        // Process incoming command instance
        public static void Invoke(LevinProtocol Context, LevinPeer Peer, Command Command)
        {
            // Command is a request
            if (!Command.IsResponse)
            {
                // Deserialize request
                Request Request = Request.Deserialize(Command.Data);

                // debug
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "[IN] Received \"Notify Request Chain\" Request:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Response Requested: " + !Command.IsNotification, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- TXs:", LogLevel.DEBUG);
                for (int i = 0; i < Request.BlockIds.Length; i++)
                {
                    ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - [" + i + "]: " + Request.BlockIds[i], LogLevel.DEBUG);
                }

                // TODO: Do something with request data
            }
        }
예제 #4
0
        // Start server on specified port
        public void Start(int Port = GlobalsConfig.P2P_DEFAULT_PORT)
        {
            // Create a new TCP listener and start listening
            try
            {
                // Set internals
                this.Port = Port;
                PeerId = SecureRandom.Integer<ulong>();

                // Start listener
                Listener = new TcpListener(IPAddress.Parse("127.0.0.1"), Port);
                Listener.Start();
                Running = true;

                // Raise server start event
                OnStart?.Invoke(this, EventArgs.Empty);
            }
            catch
            {
                // Failed to start the server for some reason or another
                Logger.Log(Level.FATAL, "Failed to start P2P server on port {0}, port may be in use", Port);
                OnError?.Invoke("Failed to start P2P server", EventArgs.Empty);
            }

            // Create a levin protocol context
            Context = new LevinProtocol(this);

            // Start request handling thread
            IncomingRequestThread = new Thread(ProcessIncomingRequests);
            IncomingRequestThread.Start();

            // Start request handling thread
            OutgoingRequestThread = new Thread(ProcessOutgoingRequests);
            OutgoingRequestThread.Start();

            // Start connection handling thread
            PeerConnectionThread = new Thread(PeerConnection);
            PeerConnectionThread.Start();
        }
예제 #5
0
        // Process incoming command instance
        public static void Invoke(LevinProtocol Context, LevinPeer Peer, Command Command)
        {
            // Command is a request
            if (!Command.IsResponse)
            {
                // Deserialize request
                Request Request = Request.Deserialize(Command.Data);

                // debug
                Context.Logger?.Log(Level.DEBUG, "[IN] Received \"Timed Sync\" Request:");
                Context.Logger?.Log(Level.DEBUG, "- Response Requested: {0}", !Command.IsNotification);
                Context.Logger?.Log(Level.DEBUG, "- Core Sync Data:");
                Context.Logger?.Log(Level.DEBUG, "  - Current Height: {0}", Request.PayloadData.CurrentHeight);
                Context.Logger?.Log(Level.DEBUG, "  - Top ID: {0}", Encoding.StringToHexString(Request.PayloadData.TopId));

                // TODO: Do something with request data

                // TODO: Do some processing in here, make sure the packet isn't a notification for some reason,
                //       make sure peer isn't duplicate, etc.

                // Create a response
                Response Response = new Response
                {
                    LocalTime   = GeneralUtilities.GetTimestamp(),
                    PayloadData = new CoreSyncData
                    {
                        CurrentHeight = Globals.DAEMON_BLOCK_HEIGHT,
                        TopId         = Globals.DAEMON_TOP_ID
                    },
                    LocalPeerlist = Globals.DAEMON_PEERLIST
                };

                // debug
                Context.Logger?.Log(Level.DEBUG, "[OUT] Sending \"Timed Sync\" Response:");
                Context.Logger?.Log(Level.DEBUG, "- Local Time: {0}", Response.LocalTime);
                Context.Logger?.Log(Level.DEBUG, "- Core Sync Data:");
                Context.Logger?.Log(Level.DEBUG, "  - Current Height: {0}", Response.PayloadData.CurrentHeight);
                Context.Logger?.Log(Level.DEBUG, "  - Top ID: {0}", Encoding.StringToHexString(Response.PayloadData.TopId));
                Context.Logger?.Log(Level.DEBUG, "- Local Peerlist:");
                Context.Logger?.Log(Level.DEBUG, "  - Entries: {0}", Response.LocalPeerlist.Length);

                // Reply with response
                Context.Reply(Peer, Id, Response.Serialize(), true);
            }

            // Command is a response
            else
            {
                // Deserialize response
                Response Response = Response.Deserialize(Command.Data);

                // debug
                Context.Logger?.Log(Level.DEBUG, "[IN] Received \"Timed Sync\" Response:");
                Context.Logger?.Log(Level.DEBUG, "- Response Requested: {0}", !Command.IsNotification);
                Context.Logger?.Log(Level.DEBUG, "- Local Time: {0}", Response.LocalTime);
                Context.Logger?.Log(Level.DEBUG, "- Core Sync Data:");
                Context.Logger?.Log(Level.DEBUG, "  - Current Height: {0}", Response.PayloadData.CurrentHeight);
                Context.Logger?.Log(Level.DEBUG, "  - Top ID: {0}", Encoding.StringToHexString(Response.PayloadData.TopId));
                Context.Logger?.Log(Level.DEBUG, "- Local Peerlist:");
                Context.Logger?.Log(Level.DEBUG, "  - Entries: {0}", Response.LocalPeerlist.Length);

                // TODO: Do something with response data
            }
        }
예제 #6
0
        // Process incoming command instance
        public static void Invoke(LevinProtocol Context, LevinPeer Peer, Command Command)
        {
            // Debug
            Peer.State = PeerState.Verified;

            // Command is a request
            if (!Command.IsResponse)
            {
                // Deserialize request
                Request Request = Request.Deserialize(Command.Data);

                // debug
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "[IN] Received \"Handshake\" Request:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Response Requested: " + !Command.IsNotification, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Node Data:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Network ID: " + Encoding.StringToHexString(Request.NodeData.NetworkId), LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Peer ID: " + Request.NodeData.PeerId, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Version: " + Request.NodeData.Version, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Local Time: " + Request.NodeData.LocalTime, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Port: " + Request.NodeData.Port, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Core Sync Data:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Current Height: " + Request.PayloadData.CurrentHeight, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Top ID: " + Encoding.StringToHexString(Request.PayloadData.TopId), LogLevel.DEBUG);

                // TODO: Do something with request data

                // TODO: Do some processing in here, make sure the packet isn't a notification for some reason,
                //       make sure peer isn't duplicate, etc.

                // Create a response
                Response Response = new Response
                {
                    NodeData = new NodeData
                    {
                        NetworkId = GlobalsConfig.NETWORK_ID,
                        LocalTime = GeneralUtilities.GetTimestamp(),
                        Port      = (uint)Context.Server.Port,
                        PeerId    = Context.Server.PeerId,
                        Version   = GlobalsConfig.LEVIN_VERSION
                    },
                    PayloadData = new CoreSyncData
                    {
                        CurrentHeight = Globals.DAEMON_BLOCK_HEIGHT,
                        TopId         = Globals.DAEMON_TOP_ID
                    },
                    LocalPeerlist = Globals.DAEMON_PEERLIST
                };

                // debug
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "[OUT] Sending \"Handshake\" Response:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Node Data:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Network ID: " + Encoding.StringToHexString(Response.NodeData.NetworkId), LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Peer ID: " + Response.NodeData.PeerId, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Version: " + Response.NodeData.Version, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Local Time: " + Response.NodeData.LocalTime, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Port: " + Response.NodeData.Port, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Core Sync Data:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Current Height: " + Response.PayloadData.CurrentHeight, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Top ID: " + Encoding.StringToHexString(Response.PayloadData.TopId), LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Local Peerlist:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Entries: " + Response.LocalPeerlist.Length, LogLevel.DEBUG);

                // Reply with response
                Context.Reply(Peer, Id, Response.Serialize(), true);
            }

            // Command is a response
            else if (Command.IsResponse && Peer.State != PeerState.Verified)
            {
                // Deserialize response
                Response Response = Response.Deserialize(Command.Data);

                // debug
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "[IN] Received \"Handshake\" Response:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Response Requested: " + !Command.IsNotification, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Node Data:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Network ID: " + Encoding.StringToHexString(Response.NodeData.NetworkId), LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Peer ID: " + Response.NodeData.PeerId, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Version: " + Response.NodeData.Version, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Local Time: " + Response.NodeData.LocalTime, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Port: " + Response.NodeData.Port, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Core Sync Data:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Current Height: " + Response.PayloadData.CurrentHeight, LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Top ID: " + Encoding.StringToHexString(Response.PayloadData.TopId), LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "- Local Peerlist:", LogLevel.DEBUG);
                ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "  - Entries: " + Response.LocalPeerlist.Length, LogLevel.DEBUG);

                // TODO: Do something with response data
            }
        }