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  }