Skip to content
This repository has been archived by the owner on Oct 18, 2023. It is now read-only.

Commit

Permalink
Don't feed invalid headers into DB (ledgerwatch#4693)
Browse files Browse the repository at this point in the history
* Reduce code duplication in verifyAndSaveNewPoSHeader

* Don't feed invalid headers into DB

* remove superfluous comment
  • Loading branch information
yperbasis committed Jul 12, 2022
1 parent 9637b25 commit e0845f2
Showing 1 changed file with 12 additions and 26 deletions.
38 changes: 12 additions & 26 deletions eth/stagedsync/stage_headers.go
Original file line number Diff line number Diff line change
Expand Up @@ -579,39 +579,21 @@ func verifyAndSaveNewPoSHeader(
}, false, nil
}

if err := headerInserter.FeedHeaderPoS(tx, header, headerHash); err != nil {
return nil, false, err
}

currentHeadHash := rawdb.ReadHeadHeaderHash(tx)
if currentHeadHash != header.ParentHash {
// Side chain or something weird
// TODO(yperbasis): considered non-canonical because some missing headers were downloaded but not canonized
// Or it's not a problem because forkChoice is updated frequently?
status, latestValidHash, validationError, criticalError := cfg.forkValidator.ValidatePayload(tx, header, body, false)
if criticalError != nil {
return &privateapi.PayloadStatus{CriticalError: criticalError}, false, criticalError
}
if validationError != nil {
cfg.hd.ReportBadHeaderPoS(headerHash, latestValidHash)
}
success = status == remote.EngineStatus_VALID || status == remote.EngineStatus_ACCEPTED
return &privateapi.PayloadStatus{
Status: status,
LatestValidHash: latestValidHash,
ValidationError: validationError,
}, success, nil
}
canExtendCanonical := header.ParentHash == currentHeadHash
canExtendInMemory := cfg.memoryOverlay && (cfg.forkValidator.ExtendingForkHeadHash() == (common.Hash{}) || header.ParentHash == cfg.forkValidator.ExtendingForkHeadHash())

if cfg.memoryOverlay && (cfg.forkValidator.ExtendingForkHeadHash() == (common.Hash{}) || header.ParentHash == cfg.forkValidator.ExtendingForkHeadHash()) {
status, latestValidHash, validationError, criticalError := cfg.forkValidator.ValidatePayload(tx, header, body, true)
if canExtendInMemory || !canExtendCanonical {
status, latestValidHash, validationError, criticalError := cfg.forkValidator.ValidatePayload(tx, header, body, canExtendCanonical)
if criticalError != nil {
return &privateapi.PayloadStatus{CriticalError: criticalError}, false, criticalError
}
if validationError != nil {
success = validationError == nil
if !success {
cfg.hd.ReportBadHeaderPoS(headerHash, latestValidHash)
} else if err := headerInserter.FeedHeaderPoS(tx, header, headerHash); err != nil {
return nil, false, err
}
success = status == remote.EngineStatus_VALID || status == remote.EngineStatus_ACCEPTED
return &privateapi.PayloadStatus{
Status: status,
LatestValidHash: latestValidHash,
Expand All @@ -620,6 +602,10 @@ func verifyAndSaveNewPoSHeader(
}

// OK, we're on the canonical chain
if err := headerInserter.FeedHeaderPoS(tx, header, headerHash); err != nil {
return nil, false, err
}

if requestStatus == engineapi.New {
cfg.hd.SetPendingPayloadHash(headerHash)
}
Expand Down

0 comments on commit e0845f2

Please sign in to comment.