mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 14:46:42 +00:00
core: validate chain before writing block (#1319)
This commit is contained in:
parent
4c4185c9ae
commit
ee5318b07b
1 changed files with 14 additions and 0 deletions
|
|
@ -2374,6 +2374,20 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error)
|
||||||
status WriteStatus
|
status WriteStatus
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Before the actual db insertion happens, verify the block against the whitelisted
|
||||||
|
// milestone and checkpoint. This is to prevent a race condition where a milestone
|
||||||
|
// or checkpoint was whitelisted while the block execution happened (and wasn't
|
||||||
|
// available sometime before) and the block turns out to be inavlid (i.e. not
|
||||||
|
// honouring the milestone or checkpoint). Use the block itself as current block
|
||||||
|
// so that it's considered as a `past` chain and the validation doesn't get bypassed.
|
||||||
|
isValid, err = bc.forker.ValidateReorg(block.Header(), []*types.Header{block.Header()})
|
||||||
|
if err != nil {
|
||||||
|
return it.index, err
|
||||||
|
}
|
||||||
|
if !isValid {
|
||||||
|
return it.index, whitelist.ErrMismatch
|
||||||
|
}
|
||||||
|
|
||||||
if !setHead {
|
if !setHead {
|
||||||
// Don't set the head, only insert the block
|
// Don't set the head, only insert the block
|
||||||
_, err = bc.writeBlockWithState(block, receipts, logs, statedb)
|
_, err = bc.writeBlockWithState(block, receipts, logs, statedb)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue