/// <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), "Не корректный пользователь."); } }
/// <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), "Ошибка создания блока. Блок некорректный."); } }
/// <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); }
/// <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)); } }
/// <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), "Была нарушена корректность после добавления блока."); } }