Beispiel #1
0
        /// <summary>
        /// Создать экземпляр пользователя на основе блока.
        /// </summary>
        /// <param name="block"> Блок цепочки, содержащий информацию о пользователе. </param>
        public User(Block block)
        {
            if (block == null)
            {
                throw new MethodRequiresException(nameof(block), "Блок не может быть равен null");
            }

            if (!block.IsCorrect())
            {
                throw new MethodRequiresException(nameof(block), "Блок некорректный");
            }

            if (block.Data == null)
            {
                throw new MethodRequiresException(nameof(block), "Данные блока не могут быть равны null");
            }

            if (block.Data.Type != DataType.User)
            {
                throw new MethodRequiresException(nameof(block), "Некоректный тип данных блока.");
            }

            var user = Deserialize(block.Data.Content);

            Login    = user.Login;
            Password = user.Password;
            Role     = user.Role;
            Hash     = user.Hash;

            if (!this.IsCorrect())
            {
                throw new MethodResultException(nameof(User), "Не корректный пользователь.");
            }
        }
Beispiel #2
0
        /// <summary>
        /// Создать экземпляр блока.
        /// </summary>
        /// <param name="previousBlock">Предыдущий блок.</param>
        /// <param name="data">Данные, сохраняемые в блоке.</param>
        /// <param name="algorithm">Алгоритм хеширования.</param>
        /// <param name="user"> Идентификатор пользователя, создавшего блок. </param>
        public Block(Block previousBlock, Data data, User user, IAlgorithm algorithm = null)
        {
            #region Requires
            if (previousBlock == null)
            {
                throw new MethodRequiresException(nameof(previousBlock), "Предыдущий блок не может быть равен null.");
            }

            if (!previousBlock.IsCorrect())
            {
                throw new MethodRequiresException(nameof(previousBlock), "Предыдущий блок некорректный.");
            }

            if (data == null)
            {
                throw new MethodRequiresException(nameof(data), "Данные не могут быть равны null.");
            }

            if (!data.IsCorrect())
            {
                throw new MethodRequiresException(nameof(data), "Данные некорректные.");
            }

            if (user == null)
            {
                throw new MethodRequiresException(nameof(user), "Пользователь не может быть равен null.");
            }

            if (!user.IsCorrect())
            {
                throw new MethodRequiresException(nameof(user), "Пользователь некорректный.");
            }
            #endregion

            if (algorithm != null)
            {
                _algorithm = algorithm;
            }

            Version      = 1; // TODO: Вынести в конфиг файл.
            CreatedOn    = DateTime.Now.ToUniversalTime();
            PreviousHash = previousBlock.Hash;
            Data         = data;
            User         = user;
            Hash         = this.GetHash(_algorithm);

            if (!this.IsCorrect())
            {
                throw new MethodResultException(nameof(Block), "Ошибка создания блока. Блок некорректный.");
            }
        }
Beispiel #3
0
        /// <summary>
        /// Создать экземпляр блока.
        /// </summary>
        /// <param name="previousBlock">Предыдущий блок.</param>
        /// <param name="data">Данные, сохраняемые в блоке.</param>
        /// <param name="algorithm">Алгоритм хеширования.</param>
        /// <param name="user">Идентификатор пользователя, создавшего блок.</param>
        public Block(Block previousBlock, Data data, User user, IAlgorithm algorithm)
        {
            Contract.Requires <ArgumentNullException>(previousBlock != null, $"Не возможно создать блок. Отсутствует ссылка на предыдущий блок.");
            Contract.Requires <ArgumentException>(previousBlock.IsCorrect(algorithm), $"Не возможно создать блок. Предыдущий блок не корректный.");
            Contract.Requires <ArgumentNullException>(data != null, $"Не возможно создать блок. Отсутствуют данные для сохранения в блоке.");
            Contract.Requires <ArgumentNullException>(user != null, $"Не возможно создать блок. Отсутствует идентификатор пользователя.");

            Version      = Properties.Settings.Default.Version;
            Code         = Guid.NewGuid();
            CreatedOn    = (ulong)DateTime.Now.Ticks;
            PreviousHash = previousBlock.Hash;
            Data         = data;
            User         = user;
            Hash         = this.GetHash(algorithm);
        }
Beispiel #4
0
        /// <summary>
        /// Добавить данные в цепочку блоков.
        /// </summary>
        /// <param name="data"> Добавляемые данные. </param>
        public void Add(Data data)
        {
            Contract.Requires <ArgumentNullException>(data != null, $"Не возможно добавить данные в цепочку блоков. Отсутствуют данные для сохранения в блоке.");
            Contract.Requires <ArgumentNullException>(data.IsCorrect(Algorithm), $"Не возможно добавить данные в цепочку блоков. Данные являются некорректными.");

            var block = new Block(PreviousBlock, data, User.GetCurrentUser(), Algorithm);

            if (block.IsCorrect(Algorithm))
            {
                _blockChain.Add(block);
            }
            else
            {
                throw new ArgumentException("Не удалось добавить данные в цепочку блоков. Созданные блок некорректен.", nameof(block));
            }
        }
Beispiel #5
0
        /// <summary>
        /// Добавить блок.
        /// </summary>
        /// <param name="block"> Добавляемый блок. </param>
        private void AddBlock(Block block)
        {
            if (!block.IsCorrect())
            {
                throw new MethodRequiresException(nameof(block), "Блок не корректный.");
            }

            // Не добавляем уже существующий блок.
            if (_blockChain.Any(b => b.Hash == block.Hash))
            {
                return;
            }

            // TODO: Реализовать транзакцию.
            _blockChain.Add(block);
            _dataProvider.AddBlock(block.Version, block.CreatedOn, block.Hash, block.PreviousHash, block.Data.GetJson(), block.User.GetJson());
            AddDataInList(block);
            SendBlockToGlobalChain(block);

            if (!CheckCorrect())
            {
                throw new MethodResultException(nameof(Chain), "Была нарушена корректность после добавления блока.");
            }
        }