Ejemplo n.º 1
0
        private void MainFrm_Load(object sender, EventArgs e)
        {
            LoadWebServerSettings();
            var chain = new BlockChainDemo.BlockChain();

            Text += $" Node Id : {chain.NodeId}";
            chain.NewBlockMined            += ChainOnNewBlockMined;
            chain.BlockMiningCanceled      += ChainOnBlockMiningCanceled;
            chain.ConsensusValidateRequest += ChainOnConsensusValidateRequest;
            chain.ShowCurrentNounce        += ChainOnShowCurrentNounce;
            _server = new WebServer(chain, WebServerSettings.Default.Host,
                                    WebServerSettings.Default.Port);
        }
Ejemplo n.º 2
0
        private void MainFrm_Load(object sender, EventArgs e)
        {
            LoadWebServerSettings();
            var chain = new BlockChainDemo.BlockChain(WebServerSettings.Default.NodeName, WebServerSettings.Default.WalletAddress);

            Text += $" Node : {WebServerSettings.Default.NodeName}";
            chain.NewBlockMined            += ChainOnNewBlockMined;
            chain.BlockMiningCanceled      += ChainOnBlockMiningCanceled;
            chain.ConsensusValidateRequest += ChainOnConsensusValidateRequest;
            chain.ShowCurrentNounce        += ChainOnShowCurrentNounce;
            chain.NotifyBadTransaction     += ChainOnNotifyBadTransaction;
            _server = new WebServer(chain, WebServerSettings.Default.Host,
                                    WebServerSettings.Default.Port);
        }
Ejemplo n.º 3
0
        public WebServer(BlockChain chain)
        {
            var    settings = ConfigurationManager.AppSettings;
            string host     = settings["host"]?.Length > 1 ? settings["host"] : "localhost";
            string port     = settings["port"]?.Length > 1 ? settings["port"] : "12345";

            var server = new TinyWebServer.WebServer(request =>
            {
                string path  = request.Url.PathAndQuery.ToLower();
                string query = "";
                string json  = "";
                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());

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

                    json            = new StreamReader(request.InputStream).ReadToEnd();
                    Transaction trx = JsonConvert.DeserializeObject <Transaction>(json);
                    int blockId     = chain.CreateTransaction(trx.Sender, trx.Recipient, trx.Amount);
                    return($"Your transaction will be included in block {blockId}");

                //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());
                }

                return("");
            },
                                                     $"http://{host}:{port}/mine/",
                                                     $"http://{host}:{port}/transactions/new/",
                                                     $"http://{host}:{port}/chain/",
                                                     $"http://{host}:{port}/nodes/register/",
                                                     $"http://{host}:{port}/nodes/resolve/"
                                                     );

            server.Run();
        }
Ejemplo n.º 4
0
        public WebServer(BlockChain chain)
        {
            ReadAllSettings();
            AddUpdateAppSettings("host", GetLocalIPv4(NetworkInterfaceType.Ethernet));
            var settings = ConfigurationManager.AppSettings;
            //ApplySettings("host", hosti);
            string host = settings["host"]?.Length > 1 ? settings["host"] : "localhost";
            string port = settings["port"]?.Length > 1 ? settings["port"] : "12345";

            ReadAllSettings();
            //Console.ReadKey();

            var server = new TinyWebServer.WebServer(request =>
            {
                // HttpContent testi;
                //request.Headers.Set("Access-Control-Allow-Origin", "*");
                //request.Headers.Add("Access-Control-Allow-Origin", "*");
                string path  = request.Url.PathAndQuery.ToLower();
                string query = "";
                string json  = "";
                if (path.Contains("?"))
                {
                    string[] parts = path.Split('?');
                    path           = parts[0];
                    query          = parts[1];
                }

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

                //POST: http://localhost:12345/transactions/new
                //{ "Amount":123, "Recipient":"ebeabf5cc1d54abdbca5a8fe9493b479", "Sender":"31de2e0ef1cb4937830fcfd5d2b3b24f" }
                case "/transactions/new":



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

                    json            = new StreamReader(request.InputStream).ReadToEnd();
                    Transaction trx = JsonConvert.DeserializeObject <Transaction>(json);
                    int blockId     = chain.CreateTransaction(trx.Sender, trx.Recipient, trx.Amount);

                    //var s = chain.GetFullChain();
                    // System.Console.WriteLine(s);

                    //System.IO.File.WriteAllText("file.json", s);
                    //FindAndSave(chain);
                    return($"Your transaction will be included in block {blockId}");

                //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)}");
                    }
                    //request.Headers.Add("Access-Control-Allow-Origin", "*");

                    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());

                case "/tallenna":
                    //InsertToDatabase(chain).Wait();
                    FindAndSave(chain);
                    return("Tallennettiin tietokantaan");

                case "/testi":
                    //MainAsync(chain).Wait();
                    //FindAllFromChain().Wait();
                    // CallMain(chain).Wait();
                    //InsertToDatabase(chain).Wait();
                    FindAndSave(chain);
                    return($"Tallennettiin tietokantaan,haku tietokannasta{chain.GetFullChain()}");
                }

                return("");
            },
                                                     $"http://{host}:{port}/mine/",
                                                     $"http://{host}:{port}/transactions/new/",
                                                     $"http://{host}:{port}/chain/",
                                                     $"http://{host}:{port}/nodes/register/",
                                                     $"http://{host}:{port}/nodes/resolve/",
                                                     $"http://{host}:{port}/testi/", //Added by Severi
                                                     $"http://{host}:{port}/tallenna/"
                                                     );

            server.Run();
        }
Ejemplo n.º 5
0
 static void Main(string[] args)
 {
     BlockChain.Test(); // run the test
 }
Ejemplo n.º 6
0
        public WebServer(BlockChain chain, string host = null, string port = null)
        {
            var settings = ConfigurationManager.AppSettings;

            _host = string.IsNullOrEmpty(host)
                ? (settings["host"]?.Length > 1 ? settings["host"] : "localhost")
                : host;


            _port = string.IsNullOrEmpty(port)
                ?(settings["port"]?.Length > 1 ? settings["port"] : "12345"):port;

            Url     = $"http://{_host}:{_port}/";
            _server = new TinyWebServer.WebServer(request =>
            {
                string path  = request.Url.PathAndQuery.ToLower();
                string query = "";
                string json  = "";
                if (path.Contains("?"))
                {
                    string[] parts = path.Split('?');
                    path           = parts[0];
                    query          = parts[1];
                }

                switch (path)
                {
                //GET: http://localhost:12345/mine
                case "/mine":
                    chain.Mine();
                    return($"Mining process is started");

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

                    json            = new StreamReader(request.InputStream).ReadToEnd();
                    Transaction trx = JsonConvert.DeserializeObject <Transaction>(json);
                    int blockId     = chain.CreateTransaction(trx.Id, trx.Sender, trx.Recipient, trx.Amount, trx.Signature);
                    if (blockId > 0)
                    {
                        return($"Your transaction will be included in block {blockId}");
                    }
                    else
                    {
                        return("Your transaction is invalid");
                    }

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

                    json = new StreamReader(request.InputStream).ReadToEnd();
                    Transaction incomeTrx = JsonConvert.DeserializeObject <Transaction>(json);
                    chain.AddTransaction(incomeTrx.Id, incomeTrx.Sender, incomeTrx.Recipient, incomeTrx.Amount, incomeTrx.Signature);
                    return($"Your transaction has been added");

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

                    json = new StreamReader(request.InputStream).ReadToEnd();
                    Transaction newTrx = JsonConvert.DeserializeObject <Transaction>(json);
                    chain.EditTransaction(newTrx.Id, newTrx.Sender, newTrx.Recipient, newTrx.Amount, newTrx.Signature);
                    return($"Your transaction has been edited");


                //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
                case "/nodes":
                    return(chain.GetAllRegisteredNodes());

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

                //GET: http://localhost:12345/nodes/update
                case "/consensus/request":
                    chain.RequestUpdate();
                    return("A consensus request has been sent");

                //POST: http://localhost:12345/balance/query
                //{ "Owner": "Node 1"}
                case "/balance/query":
                    if (request.HttpMethod != HttpMethod.Post.Method)
                    {
                        return($"{new HttpResponseMessage(HttpStatusCode.MethodNotAllowed)}");
                    }

                    json           = new StreamReader(request.InputStream).ReadToEnd();
                    var ownerQuery = new { Owner = "" };
                    var owner      = JsonConvert.DeserializeAnonymousType(json, ownerQuery);
                    var balance    = chain.QueryBalance(owner.Owner);
                    return(balance.ToString());

                //GET: http://localhost:12345/transactions/pool
                case "/transactions/pool":
                    return(chain.GetTransactionsMemTool());
                }

                return("");
            },
                                                  $"http://{_host}:{_port}/mine/",
                                                  $"http://{_host}:{_port}/transactions/new/",
                                                  $"http://{_host}:{_port}/transactions/add/",
                                                  $"http://{_host}:{_port}/transactions/edit/",
                                                  $"http://{_host}:{_port}/chain/",
                                                  $"http://{_host}:{_port}/nodes/register/",
                                                  $"http://{_host}:{_port}/nodes/",
                                                  $"http://{_host}:{_port}/nodes/resolve/",
                                                  $"http://{_host}:{_port}/consensus/request/",
                                                  $"http://{_host}:{_port}/balance/query/",
                                                  $"http://{_host}:{_port}/transactions/pool/"

                                                  );
        }