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  }