예제 #1
0
        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);
        }
예제 #2
0
        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);
        }