/// <summary> /// Создать экземпляр блока. /// </summary> /// <param name="previousBlock">Предыдущий блок.</param> /// <param name="data">Данные, сохраняемые в блоке.</param> /// <param name="algorithm">Алгоритм хеширования.</param> /// <param name="user"> Идентификатор пользователя, создавшего блок. </param> public Block(Block previousBlock, Data data, BlockchainMSSQL.User userFrom, BlockchainMSSQL.User userTo, double money, IAlgorithm algorithm = null) { #region Requires if (previousBlock == null) { throw new ArgumentException("Предыдущий блок не может быть равен null.", nameof(previousBlock)); } if (!previousBlock.IsCorrect()) { throw new ArgumentException("Предыдущий блок некорректный.", nameof(previousBlock)); } if (data == null) { throw new ArgumentException("Данные не могут быть равны null.", nameof(data)); } if (!data.IsCorrect()) { throw new ArgumentException("Данные некорректные.", nameof(data)); } #endregion if (algorithm != null) { _algorithm = algorithm; } Version = 1; CreatedOn = DateTime.Now.ToUniversalTime(); PreviousHash = previousBlock.Hash; Data = data; UserFrom = userFrom ?? throw new ArgumentException("Пользователь не может быть равен null.", nameof(userFrom)); UserTo = userTo ?? throw new ArgumentException("Пользователь не может быть равен null.", nameof(userTo)); Hash = this.GetHash(_algorithm); Money = money; if (!this.IsCorrect()) { throw new ArgumentException("Ошибка создания блока. Блок некорректный.", nameof(Block)); } }
/// <summary> /// Добавить блок. /// </summary> /// <param name="block"> Добавляемый блок. </param> private void AddBlock(Block block) { if (!block.IsCorrect()) { throw new ArgumentException("Блок не корректный.", nameof(block)); } // Не добавляем уже существующий блок. if (_blockChain.Any(b => b.Hash == block.Hash)) { return; } _blockChain.Add(block); Session._curProvider.AddBlock(block.Version, block.CreatedOn, block.Hash, block.PreviousHash, block.Data.Content, block.UserFrom, block.UserTo, block.Money); //_localProvider.AddBlock(block.Version, block.CreatedOn, block.Hash, block.PreviousHash, block.Data.Content, block.UserFrom, block.UserTo); if (!CheckCorrect()) { throw new ArgumentException("Была нарушена корректность после добавления блока.", nameof(Chain)); } }