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