Exemplo n.º 1
0
        public WebServer(BlockChain chain)
        {
            //start the web-server
            var    settings = ConfigurationManager.AppSettings;
            string host     = settings["host"]?.Length > 1 ? settings["host"] : "localhost";
            string port     = settings["port"]?.Length > 1 ? settings["port"] : "12345";

            Logger.Log($"Web Service Listening on port: {port}");

            var server = new TinyWebServer.WebServer(request =>
            {
                string path  = request.Url.PathAndQuery.ToLower();
                string query = "";
                string json  = "";

                Logger.Log($"Request:{path}");


                if (path.Contains("?"))
                {
                    string[] parts = path.Split('?');
                    path           = parts[0];
                    query          = parts[1];
                }

                switch (path)
                {
                //GET: http://localhost:12345/mine
                case "/mine":
                    return(chain.Mine(query));

                //POST: http://localhost:12345/transactions/new
                //{ "Amount":123, "Recipient":"ebeabf5cc1d54abdbca5a8fe9493b479", "Sender":"31de2e0ef1cb4937830fcfd5d2b3b24f" }
                case "/transfer":
                    if (request.HttpMethod != HttpMethod.Post.Method)
                    {
                        return($"{new HttpResponseMessage(HttpStatusCode.MethodNotAllowed)}");
                    }

                    json            = new StreamReader(request.InputStream).ReadToEnd();
                    Transaction trx = JsonConvert.DeserializeObject <Transaction>(json);
                    try
                    {
                        int blockId = chain.CreateTransaction(trx, false);
                        return($"Your transaction will be included in block {blockId}");
                    } catch (System.Exception ex)
                    {
                        return(ex.Message);
                    }

                //GET: http://localhost:12345/chain
                case "/chain":
                    return(chain.GetFullChain());

                //POST: http://localhost:12345/nodes/register
                //{ "Urls": ["localhost:54321", "localhost:54345", "localhost:12321"] }
                case "/nodes/register":
                    if (request.HttpMethod != HttpMethod.Post.Method)
                    {
                        return($"{new HttpResponseMessage(HttpStatusCode.MethodNotAllowed)}");
                    }

                    json        = new StreamReader(request.InputStream).ReadToEnd();
                    var urlList = new { Urls = new string[0] };
                    var obj     = JsonConvert.DeserializeAnonymousType(json, urlList);
                    return(chain.RegisterNodes(obj.Urls));

                //GET: http://localhost:12345/nodes/resolve
                case "/nodes/resolve":
                    return(chain.Consensus(false));

                case "/balance":
                    if (request.HttpMethod != HttpMethod.Post.Method)
                    {
                        return($"{new HttpResponseMessage(HttpStatusCode.MethodNotAllowed)}");
                    }

                    json = new StreamReader(request.InputStream).ReadToEnd();

                    return(chain.Balance(json));

                case "/history":
                    List <string> history = chain.TransactionHistory(query);
                    return(JsonConvert.SerializeObject(history));

                case "/pending":
                    return(JsonConvert.SerializeObject(chain.PendingTransactions()));

                case "/test/start":
                    Logger.Log($"Test {query} Start ----------------------------------------");
                    return($"Test {query} Start");

                case "/test/end":
                    Logger.Log($"Test {query} End ------------------------------------------");
                    return($"Test {query} end");

                case "/test/init":
                    chain.Init();
                    return($"BlockChain initialized");

                case "/test/checkpoint":
                    return(chain.CheckPoint());

                case "/test/rollback":
                    return(chain.Rollback());

                case "/test/miner/start":
                    string[] cmdArgs = query.Split('&');
                    chain.Miner_Start(cmdArgs[0]);
                    return("Miner started");

                case "/test/miner/stop":
                    chain.Miner_Stop();
                    return("Miner Stopped");
                }

                return("");
            },
                                                     $"http://{host}:{port}/mine/",
                                                     $"http://{host}:{port}/transfer/",
                                                     $"http://{host}:{port}/chain/",
                                                     $"http://{host}:{port}/nodes/register/",
                                                     $"http://{host}:{port}/nodes/resolve/",
                                                     $"http://{host}:{port}/balance/",
                                                     $"http://{host}:{port}/history/",
                                                     $"http://{host}:{port}/pending/",
                                                     $"http://{host}:{port}/test/init/",
                                                     $"http://{host}:{port}/test/start/",
                                                     $"http://{host}:{port}/test/end/",
                                                     $"http://{host}:{port}/test/checkpoint/",
                                                     $"http://{host}:{port}/test/rollback/",
                                                     $"http://{host}:{port}/test/miner/start/",
                                                     $"http://{host}:{port}/test/miner/stop/"
                                                     );

            server.Run();
        }