public bool ValidateSuggestedBlock(Block suggestedBlock) { if (!_ommersValidator.Validate(suggestedBlock.Header, suggestedBlock.Ommers)) { _logger?.Info($"Invalid block ({suggestedBlock.Hash}) - invalid ommers"); return(false); } foreach (Transaction transaction in suggestedBlock.Transactions) { if (!_transactionValidator.IsWellFormed(transaction, _specProvider.GetSpec(suggestedBlock.Number))) { _logger?.Info($"Invalid block ({suggestedBlock.Hash}) - invalid transaction ({transaction.Hash})"); return(false); } } // TODO it may not be needed here (computing twice?) if (suggestedBlock.Header.OmmersHash != Keccak.Compute(Rlp.Encode(suggestedBlock.Ommers))) { _logger?.Info($"Invalid block ({suggestedBlock.Hash}) - invalid ommers hash"); return(false); } bool blockHeaderValid = _headerValidator.Validate(suggestedBlock.Header); if (!blockHeaderValid) { _logger?.Info($"Invalid block ({suggestedBlock.Hash}) - invalid header"); return(false); } return(true); }
public bool ValidateSuggestedBlock(Block block) { if (!_ommersValidator.Validate(block.Header, block.Ommers)) { _logger?.Debug($"Invalid block ({block.Hash}) - invalid ommers"); return(false); } Transaction[] txs = block.Transactions; for (int i = 0; i < txs.Length; i++) { if (!_transactionValidator.IsWellFormed(txs[i], _specProvider.GetSpec(block.Number))) { if (_logger.IsDebug) { _logger.Debug($"Invalid block ({block.ToString(Block.Format.FullHashAndNumber)}) - invalid transaction ({txs[i].Hash})"); } return(false); } } Keccak txsRoot = block.CalculateTransactionsRoot(); if (txsRoot != block.Header.TransactionsRoot) { if (_logger.IsDebug) { _logger.Debug($"Invalid block ({block.ToString(Block.Format.FullHashAndNumber)}) tx root {txsRoot} != stated tx root {block.Header.TransactionsRoot}"); } return(false); } if (block.Header.OmmersHash != Keccak.Compute(Rlp.Encode(block.Ommers))) { _logger?.Debug($"Invalid block ({block.ToString(Block.Format.FullHashAndNumber)}) - invalid ommers hash"); return(false); } bool blockHeaderValid = _headerValidator.Validate(block.Header); if (!blockHeaderValid) { if (_logger.IsDebug) { _logger.Debug($"Invalid block ({block.ToString(Block.Format.FullHashAndNumber)}) - invalid header"); } return(false); } return(true); }