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 }