github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/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/ari-anchor/sei-tendermint/config" 10 "github.com/ari-anchor/sei-tendermint/libs/log" 11 tmos "github.com/ari-anchor/sei-tendermint/libs/os" 12 "github.com/ari-anchor/sei-tendermint/privval" 13 "github.com/ari-anchor/sei-tendermint/types" 14 ) 15 16 // MakeResetCommand constructs a command that removes the database of 17 // the specified Tendermint core instance. 18 func MakeResetCommand(conf *config.Config, logger log.Logger) *cobra.Command { 19 var keyType string 20 21 resetCmd := &cobra.Command{ 22 Use: "reset", 23 Short: "Set of commands to conveniently reset tendermint related data", 24 } 25 26 resetBlocksCmd := &cobra.Command{ 27 Use: "blockchain", 28 Short: "Removes all blocks, state, transactions and evidence stored by the tendermint node", 29 RunE: func(cmd *cobra.Command, args []string) error { 30 return ResetState(conf.DBDir(), logger) 31 }, 32 } 33 34 resetPeersCmd := &cobra.Command{ 35 Use: "peers", 36 Short: "Removes all peer addresses", 37 RunE: func(cmd *cobra.Command, args []string) error { 38 return ResetPeerStore(conf.DBDir()) 39 }, 40 } 41 42 resetSignerCmd := &cobra.Command{ 43 Use: "unsafe-signer", 44 Short: "esets private validator signer state", 45 Long: `Resets private validator signer state. 46 Only use in testing. This can cause the node to double sign`, 47 RunE: func(cmd *cobra.Command, args []string) error { 48 return ResetFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile(), logger, keyType) 49 }, 50 } 51 52 resetAllCmd := &cobra.Command{ 53 Use: "unsafe-all", 54 Short: "Removes all tendermint data including signing state", 55 Long: `Removes all tendermint data including signing state. 56 Only use in testing. This can cause the node to double sign`, 57 RunE: func(cmd *cobra.Command, args []string) error { 58 return ResetAll(conf.DBDir(), conf.PrivValidator.KeyFile(), 59 conf.PrivValidator.StateFile(), logger, keyType) 60 }, 61 } 62 63 resetSignerCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, 64 "Signer key type. Options: ed25519, secp256k1") 65 66 resetAllCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, 67 "Signer key type. Options: ed25519, secp256k1") 68 69 resetCmd.AddCommand(resetBlocksCmd) 70 resetCmd.AddCommand(resetPeersCmd) 71 resetCmd.AddCommand(resetSignerCmd) 72 resetCmd.AddCommand(resetAllCmd) 73 74 return resetCmd 75 } 76 77 // ResetAll removes address book files plus all data, and resets the privValdiator data. 78 // Exported for extenal CLI usage 79 // XXX: this is unsafe and should only suitable for testnets. 80 func ResetAll(dbDir, privValKeyFile, privValStateFile string, logger log.Logger, keyType string) error { 81 if err := os.RemoveAll(dbDir); err == nil { 82 logger.Info("Removed all blockchain history", "dir", dbDir) 83 } else { 84 logger.Error("error removing all blockchain history", "dir", dbDir, "err", err) 85 } 86 87 if err := tmos.EnsureDir(dbDir, 0700); err != nil { 88 logger.Error("unable to recreate dbDir", "err", err) 89 } 90 91 // recreate the dbDir since the privVal state needs to live there 92 return ResetFilePV(privValKeyFile, privValStateFile, logger, keyType) 93 } 94 95 // ResetState removes all blocks, tendermint state, indexed transactions and evidence. 96 func ResetState(dbDir string, logger log.Logger) error { 97 blockdb := filepath.Join(dbDir, "blockstore.db") 98 state := filepath.Join(dbDir, "state.db") 99 wal := filepath.Join(dbDir, "cs.wal") 100 evidence := filepath.Join(dbDir, "evidence.db") 101 txIndex := filepath.Join(dbDir, "tx_index.db") 102 103 if tmos.FileExists(blockdb) { 104 if err := os.RemoveAll(blockdb); err == nil { 105 logger.Info("Removed all blockstore.db", "dir", blockdb) 106 } else { 107 logger.Error("error removing all blockstore.db", "dir", blockdb, "err", err) 108 } 109 } 110 111 if tmos.FileExists(state) { 112 if err := os.RemoveAll(state); err == nil { 113 logger.Info("Removed all state.db", "dir", state) 114 } else { 115 logger.Error("error removing all state.db", "dir", state, "err", err) 116 } 117 } 118 119 if tmos.FileExists(wal) { 120 if err := os.RemoveAll(wal); err == nil { 121 logger.Info("Removed all cs.wal", "dir", wal) 122 } else { 123 logger.Error("error removing all cs.wal", "dir", wal, "err", err) 124 } 125 } 126 127 if tmos.FileExists(evidence) { 128 if err := os.RemoveAll(evidence); err == nil { 129 logger.Info("Removed all evidence.db", "dir", evidence) 130 } else { 131 logger.Error("error removing all evidence.db", "dir", evidence, "err", err) 132 } 133 } 134 135 if tmos.FileExists(txIndex) { 136 if err := os.RemoveAll(txIndex); err == nil { 137 logger.Info("Removed tx_index.db", "dir", txIndex) 138 } else { 139 logger.Error("error removing tx_index.db", "dir", txIndex, "err", err) 140 } 141 } 142 143 return tmos.EnsureDir(dbDir, 0700) 144 } 145 146 // ResetFilePV loads the file private validator and resets the watermark to 0. If used on an existing network, 147 // this can cause the node to double sign. 148 // XXX: this is unsafe and should only suitable for testnets. 149 func ResetFilePV(privValKeyFile, privValStateFile string, logger log.Logger, keyType string) error { 150 if _, err := os.Stat(privValKeyFile); err == nil { 151 pv, err := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile) 152 if err != nil { 153 return err 154 } 155 if err := pv.Reset(); err != nil { 156 return err 157 } 158 logger.Info("Reset private validator file to genesis state", "keyFile", privValKeyFile, 159 "stateFile", privValStateFile) 160 } else { 161 pv, err := privval.GenFilePV(privValKeyFile, privValStateFile, keyType) 162 if err != nil { 163 return err 164 } 165 if err := pv.Save(); err != nil { 166 return err 167 } 168 logger.Info("Generated private validator file", "keyFile", privValKeyFile, 169 "stateFile", privValStateFile) 170 } 171 return nil 172 } 173 174 // ResetPeerStore removes the peer store containing all information used by the tendermint networking layer 175 // In the case of a reset, new peers will need to be set either via the config or through the discovery mechanism 176 func ResetPeerStore(dbDir string) error { 177 peerstore := filepath.Join(dbDir, "peerstore.db") 178 if tmos.FileExists(peerstore) { 179 return os.RemoveAll(peerstore) 180 } 181 return nil 182 } 183 184 func MakeUnsafeResetAllCommand(conf *config.Config, logger log.Logger) *cobra.Command { 185 var keyType string 186 187 resetAllCmd := &cobra.Command{ 188 Use: "unsafe-reset-all", 189 Short: "Removes all tendermint data including signing state", 190 Long: `Removes all tendermint data including signing state. 191 Only use in testing. This can cause the node to double sign`, 192 RunE: func(cmd *cobra.Command, args []string) error { 193 return ResetAll(conf.DBDir(), conf.PrivValidator.KeyFile(), 194 conf.PrivValidator.StateFile(), logger, keyType) 195 }, 196 } 197 198 resetAllCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519, 199 "Signer key type. Options: ed25519, secp256k1") 200 201 return resetAllCmd 202 }