github.com/badrootd/nibiru-cometbft@v0.37.5-0.20240307173500-2a75559eee9b/cmd/cometbft/commands/reset.go (about)

     1  package commands
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/badrootd/nibiru-cometbft/libs/log"
    10  	cmtos "github.com/badrootd/nibiru-cometbft/libs/os"
    11  	"github.com/badrootd/nibiru-cometbft/privval"
    12  )
    13  
    14  // ResetAllCmd removes the database of this CometBFT core
    15  // instance.
    16  var ResetAllCmd = &cobra.Command{
    17  	Use:     "unsafe-reset-all",
    18  	Aliases: []string{"unsafe_reset_all"},
    19  	Short:   "(unsafe) Remove all the data and WAL, reset this node's validator to genesis state",
    20  	RunE:    resetAllCmd,
    21  }
    22  
    23  var keepAddrBook bool
    24  
    25  // ResetStateCmd removes the database of the specified CometBFT core instance.
    26  var ResetStateCmd = &cobra.Command{
    27  	Use:     "reset-state",
    28  	Aliases: []string{"reset_state"},
    29  	Short:   "Remove all the data and WAL",
    30  	RunE: func(cmd *cobra.Command, args []string) (err error) {
    31  		config, err = ParseConfig(cmd)
    32  		if err != nil {
    33  			return err
    34  		}
    35  
    36  		return resetState(config.DBDir(), logger)
    37  	},
    38  }
    39  
    40  func init() {
    41  	ResetAllCmd.Flags().BoolVar(&keepAddrBook, "keep-addr-book", false, "keep the address book intact")
    42  }
    43  
    44  // ResetPrivValidatorCmd resets the private validator files.
    45  var ResetPrivValidatorCmd = &cobra.Command{
    46  	Use:     "unsafe-reset-priv-validator",
    47  	Aliases: []string{"unsafe_reset_priv_validator"},
    48  	Short:   "(unsafe) Reset this node's validator to genesis state",
    49  	RunE:    resetPrivValidator,
    50  }
    51  
    52  // XXX: this is totally unsafe.
    53  // it's only suitable for testnets.
    54  func resetAllCmd(cmd *cobra.Command, args []string) (err error) {
    55  	config, err = ParseConfig(cmd)
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	return resetAll(
    61  		config.DBDir(),
    62  		config.P2P.AddrBookFile(),
    63  		config.PrivValidatorKeyFile(),
    64  		config.PrivValidatorStateFile(),
    65  		logger,
    66  	)
    67  }
    68  
    69  // XXX: this is totally unsafe.
    70  // it's only suitable for testnets.
    71  func resetPrivValidator(cmd *cobra.Command, args []string) (err error) {
    72  	config, err = ParseConfig(cmd)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	resetFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), logger)
    78  	return nil
    79  }
    80  
    81  // resetAll removes address book files plus all data, and resets the privValdiator data.
    82  func resetAll(dbDir, addrBookFile, privValKeyFile, privValStateFile string, logger log.Logger) error {
    83  	if keepAddrBook {
    84  		logger.Info("The address book remains intact")
    85  	} else {
    86  		removeAddrBook(addrBookFile, logger)
    87  	}
    88  
    89  	if err := os.RemoveAll(dbDir); err == nil {
    90  		logger.Info("Removed all blockchain history", "dir", dbDir)
    91  	} else {
    92  		logger.Error("Error removing all blockchain history", "dir", dbDir, "err", err)
    93  	}
    94  
    95  	if err := cmtos.EnsureDir(dbDir, 0700); err != nil {
    96  		logger.Error("unable to recreate dbDir", "err", err)
    97  	}
    98  
    99  	// recreate the dbDir since the privVal state needs to live there
   100  	resetFilePV(privValKeyFile, privValStateFile, logger)
   101  	return nil
   102  }
   103  
   104  // resetState removes address book files plus all databases.
   105  func resetState(dbDir string, logger log.Logger) error {
   106  	blockdb := filepath.Join(dbDir, "blockstore.db")
   107  	state := filepath.Join(dbDir, "state.db")
   108  	wal := filepath.Join(dbDir, "cs.wal")
   109  	evidence := filepath.Join(dbDir, "evidence.db")
   110  	txIndex := filepath.Join(dbDir, "tx_index.db")
   111  
   112  	if cmtos.FileExists(blockdb) {
   113  		if err := os.RemoveAll(blockdb); err == nil {
   114  			logger.Info("Removed all blockstore.db", "dir", blockdb)
   115  		} else {
   116  			logger.Error("error removing all blockstore.db", "dir", blockdb, "err", err)
   117  		}
   118  	}
   119  
   120  	if cmtos.FileExists(state) {
   121  		if err := os.RemoveAll(state); err == nil {
   122  			logger.Info("Removed all state.db", "dir", state)
   123  		} else {
   124  			logger.Error("error removing all state.db", "dir", state, "err", err)
   125  		}
   126  	}
   127  
   128  	if cmtos.FileExists(wal) {
   129  		if err := os.RemoveAll(wal); err == nil {
   130  			logger.Info("Removed all cs.wal", "dir", wal)
   131  		} else {
   132  			logger.Error("error removing all cs.wal", "dir", wal, "err", err)
   133  		}
   134  	}
   135  
   136  	if cmtos.FileExists(evidence) {
   137  		if err := os.RemoveAll(evidence); err == nil {
   138  			logger.Info("Removed all evidence.db", "dir", evidence)
   139  		} else {
   140  			logger.Error("error removing all evidence.db", "dir", evidence, "err", err)
   141  		}
   142  	}
   143  
   144  	if cmtos.FileExists(txIndex) {
   145  		if err := os.RemoveAll(txIndex); err == nil {
   146  			logger.Info("Removed tx_index.db", "dir", txIndex)
   147  		} else {
   148  			logger.Error("error removing tx_index.db", "dir", txIndex, "err", err)
   149  		}
   150  	}
   151  
   152  	if err := cmtos.EnsureDir(dbDir, 0700); err != nil {
   153  		logger.Error("unable to recreate dbDir", "err", err)
   154  	}
   155  	return nil
   156  }
   157  
   158  func resetFilePV(privValKeyFile, privValStateFile string, logger log.Logger) {
   159  	if _, err := os.Stat(privValKeyFile); err == nil {
   160  		pv := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile)
   161  		pv.Reset()
   162  		logger.Info(
   163  			"Reset private validator file to genesis state",
   164  			"keyFile", privValKeyFile,
   165  			"stateFile", privValStateFile,
   166  		)
   167  	} else {
   168  		pv := privval.GenFilePV(privValKeyFile, privValStateFile)
   169  		pv.Save()
   170  		logger.Info(
   171  			"Generated private validator file",
   172  			"keyFile", privValKeyFile,
   173  			"stateFile", privValStateFile,
   174  		)
   175  	}
   176  }
   177  
   178  func removeAddrBook(addrBookFile string, logger log.Logger) {
   179  	if err := os.Remove(addrBookFile); err == nil {
   180  		logger.Info("Removed existing address book", "file", addrBookFile)
   181  	} else if !os.IsNotExist(err) {
   182  		logger.Info("Error removing address book", "file", addrBookFile, "err", err)
   183  	}
   184  }