mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-04 14:08:39 +00:00
fix panic
This commit is contained in:
parent
a9b4718d6d
commit
58819e6ba0
1 changed files with 17 additions and 12 deletions
|
|
@ -53,16 +53,19 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error {
|
||||||
if v.config.IsOsaka(block.Number(), block.Time()) && block.Size() > params.MaxBlockSize {
|
if v.config.IsOsaka(block.Number(), block.Time()) && block.Size() > params.MaxBlockSize {
|
||||||
return ErrBlockOversized
|
return ErrBlockOversized
|
||||||
}
|
}
|
||||||
// Check whether the block is already imported.
|
|
||||||
if v.bc.HasBlockAndState(block.Hash(), block.NumberU64()) {
|
|
||||||
return ErrKnownBlock
|
|
||||||
}
|
|
||||||
|
|
||||||
// Header validity is known at this point. Here we verify that uncles, transactions
|
// Header validity is known at this point. Here we verify that uncles, transactions
|
||||||
// and withdrawals given in the block body match the header.
|
// and withdrawals given in the block body match the header.
|
||||||
header := block.Header()
|
header := block.Header()
|
||||||
if err := v.bc.engine.VerifyUncles(v.bc, block); err != nil {
|
|
||||||
return err
|
// Chain-dependent checks: skip in stateless mode (no blockchain available).
|
||||||
|
if v.bc != nil {
|
||||||
|
// Check whether the block is already imported.
|
||||||
|
if v.bc.HasBlockAndState(block.Hash(), block.NumberU64()) {
|
||||||
|
return ErrKnownBlock
|
||||||
|
}
|
||||||
|
if err := v.bc.engine.VerifyUncles(v.bc, block); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if hash := types.CalcUncleHash(block.Uncles()); hash != header.UncleHash {
|
if hash := types.CalcUncleHash(block.Uncles()); hash != header.UncleHash {
|
||||||
return fmt.Errorf("uncle root hash mismatch (header value %x, calculated %x)", header.UncleHash, hash)
|
return fmt.Errorf("uncle root hash mismatch (header value %x, calculated %x)", header.UncleHash, hash)
|
||||||
|
|
@ -111,12 +114,14 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ancestor block must be known.
|
// Ancestor block must be known (skip in stateless mode).
|
||||||
if !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) {
|
if v.bc != nil {
|
||||||
if !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) {
|
if !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) {
|
||||||
return consensus.ErrUnknownAncestor
|
if !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) {
|
||||||
|
return consensus.ErrUnknownAncestor
|
||||||
|
}
|
||||||
|
return consensus.ErrPrunedAncestor
|
||||||
}
|
}
|
||||||
return consensus.ErrPrunedAncestor
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue