private JsonResponse ParseRequest(Func <NodeResponse> func)
        {
            Logger.Log.Info($"Получен {Request.Method} запрос " +
                            $"на {Request.Url} от {Request.UserHostAddress}");

            var nodeResponse = func.Invoke();

            nodeResponse.Host = Common.HostName;

            Logger.Log.Debug(nodeResponse);

            if (nodeResponse.HttpCode == HttpStatusCode.Conflict)
            {
                NodeBalance.RebalanceSelf();
            }

            return(new JsonResponse(nodeResponse, Serializer)
            {
                StatusCode = nodeResponse.HttpCode
            });
        }
        private NodeResponse PostNewTransaction()
        {
            var nodeResponse = new NodeResponse {
                DataRows = new Dictionary <string, string>()
            };

            Transaction transaction;

            try
            {
                transaction = this.Bind <Transaction>();
            }
            catch (ModelBindingException)
            {
                nodeResponse.HttpCode       = HttpStatusCode.BadRequest;
                nodeResponse.ResponseString = "Не удалось получить данные модели из запроса!";
                return(nodeResponse);
            }

            var validationErrors = new List <string>();

            if (string.IsNullOrEmpty(transaction.UserHash))
            {
                validationErrors.Add("Не передан хэш пользователя!");
            }

            if (transaction.Signature is null)
            {
                validationErrors.Add("Не передана подпись!");
            }

            if (transaction.Data is null)
            {
                validationErrors.Add("Не переданы данные!");
            }

            if (!transaction.Valid)
            {
                validationErrors.Add("Подпись не совпадает с переданным ключом!");
            }

            if (validationErrors.Count != 0)
            {
                Logger.Log.Error("Провести транзакцию не удалось!:\n" +
                                 $"{string.Join("\r\n", validationErrors)}");

                nodeResponse.HttpCode       = HttpStatusCode.BadRequest;
                nodeResponse.ResponseString = string.Join("\r\n", validationErrors);

                return(nodeResponse);
            }

            Machine.AddNewTransaction(transaction);
            if (!Machine.Pending)
            {
                NodeBalance.BroadcastNewBlock();
            }

            nodeResponse.HttpCode       = HttpStatusCode.OK;
            nodeResponse.ResponseString = "Added new transaction";

            return(nodeResponse);
        }
Exemple #3
0
        public static void Main()
        {
            Console.OutputEncoding = Encoding.UTF8;
            Uri localUri = null;

            Logger.Init();
            Logger.Log.Info("Запуск программы...");

            Logger.Log.Info($"Привязка к адресу {ConfigurationManager.AppSettings["host"]}...");
            try
            {
                localUri = new Uri(ConfigurationManager.AppSettings["host"]);
            }
            catch (Exception ex) when(ex is ArgumentNullException || ex is UriFormatException)
            {
                Logger.Log.Fatal("Указанный адрес неверен!");
                Console.ReadKey();
                Environment.Exit(1);
            }

            Logger.Log.Info("Успешно!");
            NodeBalance.NodeSet = new HashSet <string> {
                localUri.ToString()
            };

            Logger.Log.Info("Производится первоначальная настройка...");
            try
            {
                Logger.Log.Debug($"Соединение с {ConfigurationManager.AppSettings["target"]}...");
                var target = ConfigurationManager.AppSettings["target"];
                var hosts  = NodeBalance.RegisterSelfAt(target);
                NodeBalance.NodeSet = JsonConvert.DeserializeObject <HashSet <string> >(hosts);
                Logger.Log.Debug($"Получено {NodeBalance.NodeSet.Count} узлов!");
            }
            catch (ApplicationException exc)
            {
                Logger.Log.Fatal(exc.Message, exc);
                Console.ReadKey();
                Environment.Exit(1);
            }
            catch (InvalidOperationException)
            {
                Logger.Log.Warn("Соединение с узлами не установлено!");
                Logger.Log.Warn("Игнорируйте это предупреждение если узел единственный.");
            }

            Logger.Log.Info("Настройка завершена.");

            var hostConfigs = new HostConfiguration
            {
                UrlReservations = new UrlReservations {
                    CreateAutomatically = true
                }
            };
            var host = new NancyHost(localUri, new DefaultNancyBootstrapper(), hostConfigs);

            host.Start();

            Logger.Log.Debug("Синхронизация текущей цепочки блоков...");
            NodeBalance.RebalanceSelf();
            Logger.Log.Debug($"Успешно! В цепи: {OperationModule.Machine.Chain.Count} блоков.");

            Logger.Log.Info("Узел запущен. Нажмите ESC для остановки.");

            while (true)
            {
                if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
                {
                    break;
                }
            }

            Logger.Log.Info("Узел останавливается...");
            host.Stop();
            Logger.Log.Info("Узел остановлен. Нажмите любую клавишу для выхода");
            Console.ReadKey(true);
        }