diff --git a/cmd/blsync/main.go b/cmd/blsync/main.go index 39a9407304..1aa5c49e02 100644 --- a/cmd/blsync/main.go +++ b/cmd/blsync/main.go @@ -51,6 +51,7 @@ func main() { utils.HoodiFlag, utils.BlsyncApiFlag, utils.BlsyncJWTSecretFlag, + utils.DeleteAllBadBlocksFlag, }, debug.Flags, ) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 5a7e40767c..d56db73da5 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -669,6 +669,11 @@ var ( } // MISC settings + DeleteAllBadBlocksFlag = &cli.BoolFlag{ + Name: "delete-all-bad-blocks", + Usage: "Delete all bad blocks in the database", + Category: flags.MiscCategory, + } SyncTargetFlag = &cli.StringFlag{ Name: "synctarget", Usage: `Hash of the block to full sync to (dev testing feature)`, @@ -1606,7 +1611,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { // Avoid conflicting network flags, don't allow network id override on preset networks flags.CheckExclusive(ctx, MainnetFlag, DeveloperFlag, SepoliaFlag, HoleskyFlag, HoodiFlag, NetworkIdFlag, OverrideGenesisFlag) flags.CheckExclusive(ctx, DeveloperFlag, ExternalSignerFlag) // Can't use both ephemeral unlocked and external signer - + if ctx.Bool(DeleteAllBadBlocksFlag.Name) { + cfg.DeleteAllBadBlocks = true + } // Set configurations from CLI flags setEtherbase(ctx, cfg) setGPO(ctx, &cfg.GPO) diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 6ae64fb2fd..ee66d2ecf6 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -827,6 +827,13 @@ func WriteBadBlock(db ethdb.KeyValueStore, block *types.Block) { } } +// DeleteBadBlocks deletes all the bad blocks from the database +func DeleteBadBlocks(db ethdb.KeyValueWriter) { + if err := db.Delete(badBlockKey); err != nil { + log.Crit("Failed to delete bad blocks", "err", err) + } +} + // ReadHeadHeader returns the current canonical head header. func ReadHeadHeader(db ethdb.Reader) *types.Header { headHeaderHash := ReadHeadHeaderHash(db) diff --git a/eth/backend.go b/eth/backend.go index 8509561822..f01b4bf891 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -220,6 +220,20 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } } + badBlocks := rawdb.ReadAllBadBlocks(chainDb) + log.Info("Bad blocks in db", "count", len(badBlocks)) + for i, block := range badBlocks { + log.Info("Bad block in db", "i", i, "number", block.Number(), "hash", block.Hash().Hex()) + } + if config.DeleteAllBadBlocks { + if len(badBlocks) == 0 { + log.Warn("No bad blocks in db to delete") + } else { + rawdb.DeleteBadBlocks(chainDb) + log.Info(fmt.Sprintf("Deleted %d bad blocks in db", len(badBlocks))) + } + } + var ( options = &core.BlockChainConfig{ TrieCleanLimit: config.TrieCleanCache, diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index c4a0956b3b..c6d1b4b892 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -120,6 +120,7 @@ type Config struct { // Database options SkipBcVersionCheck bool `toml:"-"` + DeleteAllBadBlocks bool `toml:"-"` DatabaseHandles int `toml:"-"` DatabaseCache int DatabaseFreezer string