示例#1
0
        P2PNetwork CreateNetwork(BadNetworkSimulation badNetworkSimulation)
        {
            var appConfig = new NetworkAppConfig("Rollback Test", new[] { 11101, 11102, 11103, 11104, 11105, 11106 }, 0, null);

            network = new P2PNetwork(appConfig, new SimpleConsoleWriter(console), badNetworkSimulation);
            return(network);
        }
示例#2
0
 public VotingService(BlockchainContext dbContext, WalletService walletService, MinerService minerService,
                      P2PNetwork p2PNetwork)
 {
     _dbContext     = dbContext;
     _walletService = walletService;
     _minerService  = minerService;
     _p2PNetwork    = p2PNetwork;
 }
 public MinerService(BlockChainService blockChainService,
                     TransactionPoolService transactionPoolService,
                     WalletService walletService,
                     TransactionService transactionService,
                     P2PNetwork p2PNetwork)
 {
     _blockChainService      = blockChainService;
     _transactionPoolService = transactionPoolService;
     _transactionService     = transactionService;
     _walletService          = walletService;
     _p2pNetwork             = p2PNetwork;
 }
        public async Task <Block> AddBlock(List <Transaction> data)
        {
            Block lastBlock = await _dbContext.Blocks.LastAsync();

            Block block = _blockService.MineBlock(lastBlock, data);

            _dbContext.Blocks.Add(block);
            await _dbContext.SaveChangesAsync();

            //Can't use Constructor DI Because of circular injection
            _p2PNetwork = _serviceProvider.GetService <P2PNetwork>();
            _p2PNetwork.SyncChains();

            return(block);
        }
示例#5
0
        public void Update()
        {
            if (network == null)
            {
                //
                // Before Network Startup
                //

                if (Input.KeyWentDown(Keys.F3)) // Simulate bad network conditions
                {
                    badNetworkSimPreset = BadNetworkSimulation.NextPreset(badNetworkSimPreset);
                    console.WriteLine(BadNetworkSimulation.GetPreset(badNetworkSimPreset).ToString());
                }

                if (Input.KeyWentDown(Keys.F1)) // Start Network
                {
                    network = createNetwork(BadNetworkSimulation.GetPreset(badNetworkSimPreset));
                    network.OnExternalEndpointDiscovered += ExternalEndpointDiscovered;
                    network.StartDiscovery();
                }
            }
            else
            {
                //
                // After Network Started
                //

                if (Input.Control && Input.KeyWentDown(Keys.S))
                {
                    network.RequestExternalEndpoint();
                }

                if (rollbackDriver == null)
                {
                    //
                    // Before Game Start/Connect
                    //

                    if (Input.KeyWentDown(Keys.F4))
                    {
                        useSideChannelAuth = !useSideChannelAuth;
                    }

                    bool internet = false;
                    if (Input.KeyWentDown(Keys.F1) || (internet = Input.KeyWentDown(Keys.F2))) // Start Internet or LAN game
                    {
                        network.StopDiscovery();

                        console.WriteLine(internet ? "Starting Internet Game..." : "Starting LAN Game...", Color.DarkRed);

                        network.StartGame(CreateRollbackDriverAndGame(), "Player", localPlayerData, "Default Game", internet, useSideChannelAuth, 0);

                        if (!network.UsingKnownPort)
                        {
                            console.WriteLine("To connect to this game on LAN, connect to: " + network.LocalPeerInfo.InternalEndPoint, Color.Red);
                        }
                    }

                    // Hard coded for this test...
                    const ulong sideChannelId = 1;

                    // Endpoint to connect to for game client:
                    IPEndPoint clientConnectTo = null;

                    if (commandLineHost != null && Input.KeyWentDown(Keys.F3))
                    {
                        try { clientConnectTo = network.ParseAndResolveEndpoint(commandLineHost); }
                        catch { clientConnectTo = null; }

                        if (clientConnectTo == null)
                        {
                            console.WriteLine("Failed to parse or resolve endpoint: \"" + commandLineHost + "\"");
                            commandLineHost = null;
                        }
                    }

                    if (network.Discovery != null)
                    {
                        for (int i = 0; i < network.Discovery.Items.Count; i++) // Join Discovered Game
                        {
                            if (Input.KeyWentDown(Keys.D0 + i) && network.Discovery.Items[i].CanJoin)
                            {
                                DiscoveredGame discoveredGame = network.Discovery.Items[i];
                                clientConnectTo = discoveredGame.EndPoint;
                                console.WriteLine("Selected discovererd game: " + discoveredGame.GameInfo.Name, Color.DarkRed);
                                break;
                            }
                        }
                    }

                    if (clientConnectTo != null)
                    {
                        network.StopDiscovery();
                        console.WriteLine("Connecting to " + clientConnectTo, Color.DarkRed);
                        network.ConnectToGame(CreateRollbackDriverAndGame(), "Player", localPlayerData,
                                              useSideChannelAuth ? null : clientConnectTo, sideChannelId, sideChannelToken);
                        if (useSideChannelAuth)
                        {
                            network.SideChannelTryVerifyAndConnect(clientConnectTo); // <- Use the verify path if we're using side-channel auth
                        }
                    }
                }
                else
                {
                    //
                    // After game start:
                    //

                    if (useSideChannelAuth && network.IsServer)
                    {
                        if (Input.KeyWentDown(Keys.F8))
                        {
                            if (!tokenIssued)
                            {
                                tokenIssued      = true;
                                sideChannelToken = network.SideChannelAdd(1);
                                console.WriteLine("Token issued: " + sideChannelToken);
                            }
                            else
                            {
                                tokenIssued = false;
                                network.SideChannelRemove(1); // Kick any user connected to the network with this ID
                                console.WriteLine("Token revoked");
                            }
                        }
                    }
                }
            }
        }
 public HomeController(ILogger <HomeController> logger, P2PNetwork p2PNetwork)
 {
     _logger     = logger;
     _p2PNetwork = p2PNetwork;
 }
示例#7
0
 public SimpleNetworkGame(P2PNetwork network)
 {
     this.network = network;
 }
示例#8
0
        private static void Main(string[] args)
        {
            Console.Title = "P2P Test";
            const int msPerFrame = 16;

            #region Startup mode select

            Console.WriteLine("Connection Testing Program. Escape to exit.");
            Console.WriteLine();
            Console.WriteLine("[Z] = Toggle bad network simulation");
            Console.WriteLine("[Q] = Add player data");
            Console.WriteLine("[space] = Begin");
            Console.WriteLine();

            var    badNetworkSimPreset = 0;
            byte[] localPlayerData     = null;

            while (true)
            {
                var keyInfo = Console.ReadKey(true);
                var key     = keyInfo.Key;

                if (key == ConsoleKey.Escape)
                {
                    return;
                }

                if (key == ConsoleKey.Spacebar)
                {
                    break;
                }

                if (key == ConsoleKey.Q)
                {
                    if ((keyInfo.Modifiers & ConsoleModifiers.Shift) == 0)
                    {
                        Array.Resize(ref localPlayerData, localPlayerData == null ? 1 : localPlayerData.Length + 1);
                        localPlayerData[localPlayerData.Length - 1] = (byte)(localPlayerData.Length - 1);
                    }
                    else if (localPlayerData != null && localPlayerData.Length > 0)
                    {
                        Array.Resize(ref localPlayerData, localPlayerData.Length - 1);
                    }

                    Console.WriteLine("Player data length = " + localPlayerData.Length);
                }

                if (key == ConsoleKey.Z)
                {
                    badNetworkSimPreset = BadNetworkSimulation.NextPreset(badNetworkSimPreset);
                    Console.WriteLine(BadNetworkSimulation.GetPreset(badNetworkSimPreset).ToString());
                }
            }

            #endregion

            #region Network Game Menu (and LAN Discovery)

            var appConfig = new NetworkAppConfig("P2P Test", new[] { 20001, 20002, 20003, 20004, 20005, 20006 },
                                                 SimpleNetworkGame.ProtocolVersion, null);

            var network = new P2PNetwork(appConfig, new ConsoleLogHandler(),
                                         BadNetworkSimulation.GetPreset(badNetworkSimPreset));
            SimpleNetworkGame networkGame;

            Console.Title = "P2P Test - Port " + network.PortNumber;

            network.StartDiscovery();
            network.Discovery.OnItemsChanged += PrintNetworkMenu;             // Will keep reprinting menu during discovery

            // Print initial menu directly:
            PrintNetworkMenu(network.Discovery);

            while (true)
            {
                // Poll network
                network.Update();

                // Handle Input
                if (Console.KeyAvailable)
                {
                    var keyPress = Console.ReadKey(true);

                    // Exit
                    if (keyPress.Key == ConsoleKey.Escape)
                    {
                        goto Shutdown;
                    }

                    // Select a discovered server
                    if (keyPress.Key >= ConsoleKey.D0 && keyPress.Key <= ConsoleKey.D9)
                    {
                        var selection = keyPress.Key - ConsoleKey.D0;
                        if (selection >= 0 && selection < network.Discovery.Items.Count &&
                            network.Discovery.Items[selection].CanJoin)
                        {
                            var discoveredGame = network.Discovery.Items[selection];
                            network.StopDiscovery();

                            Console.WriteLine();
                            Console.WriteLine("Connecting to game: " + discoveredGame.GameInfo.Name);
                            network.ConnectToGame(networkGame = new SimpleNetworkGame(network), "Player",
                                                  localPlayerData, discoveredGame.EndPoint, 0, 0);
                            break;
                        }
                    }

                    // Start an Internet or LAN game:
                    var internet = false;
                    if (keyPress.Key == ConsoleKey.F1 || (internet = keyPress.Key == ConsoleKey.F2))
                    {
                        network.StopDiscovery();

                        Console.WriteLine();
                        Console.WriteLine(internet ? "Starting Internet Game..." : "Starting LAN Game...");
                        network.StartGame(networkGame = new SimpleNetworkGame(network), "Player", localPlayerData,
                                          "Default Game", internet, false, 0);
                        break;
                    }

                    // Join a specific game host:
                    if (keyPress.Key == ConsoleKey.F3)
                    {
                        Console.WriteLine();
                        Console.WriteLine("Enter host to connect to:");
                        var userHost = Console.ReadLine();

                        IPEndPoint endpoint = null;
                        try
                        {
                            endpoint = network.ParseAndResolveEndpoint(userHost);
                        }
                        catch
                        {
                        }

                        if (endpoint == null)
                        {
                            Console.WriteLine("Failed to parse or resolve endpoint: \"" + endpoint + "\"");
                        }
                        else
                        {
                            network.StopDiscovery();
                            Console.WriteLine("Connecting to game at " + endpoint);
                            network.ConnectToGame(networkGame = new SimpleNetworkGame(network), "Player",
                                                  localPlayerData, endpoint, 0, 0);
                            break;
                        }
                    }
                }

                Thread.Sleep(msPerFrame);
            }

            #endregion

            #region Run Network

            while (true)
            {
                // Poll network
                network.Update();
                networkGame.Update();

                // Handle Input
                if (Console.KeyAvailable)
                {
                    var keyPress = Console.ReadKey(true);

                    // Exit
                    if (keyPress.Key == ConsoleKey.Escape)
                    {
                        goto Shutdown;
                    }

                    networkGame.HandleKeyPress(keyPress);
                }

                Thread.Sleep(msPerFrame);
            }

            #endregion

            #region Shutdown

Shutdown:
            network.Shutdown().Wait(1500);

            #endregion
        }