github.com/number571/tendermint@v0.34.11-gost/cmd/tendermint/commands/reset_priv_validator.go (about)

     1  package commands
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/spf13/cobra"
     7  
     8  	"github.com/number571/tendermint/libs/log"
     9  	tmos "github.com/number571/tendermint/libs/os"
    10  	"github.com/number571/tendermint/privval"
    11  	"github.com/number571/tendermint/types"
    12  
    13  	"github.com/number571/tendermint/crypto/gost512"
    14  )
    15  
    16  // ResetAllCmd removes the database of this Tendermint core
    17  // instance.
    18  var ResetAllCmd = &cobra.Command{
    19  	Use:     "unsafe-reset-all",
    20  	Aliases: []string{"unsafe_reset_all"},
    21  	Short:   "(unsafe) Remove all the data and WAL, reset this node's validator to genesis state",
    22  	RunE:    resetAll,
    23  	PreRun:  deprecateSnakeCase,
    24  }
    25  
    26  var keepAddrBook bool
    27  
    28  func init() {
    29  	ResetAllCmd.Flags().BoolVar(&keepAddrBook, "keep-addr-book", false, "keep the address book intact")
    30  	ResetPrivValidatorCmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeGost512,
    31  		"Key type to generate privval file with. Options: '"+gost512.KeyType+"', '"+gost512.KeyType+"'")
    32  }
    33  
    34  // ResetPrivValidatorCmd resets the private validator files.
    35  var ResetPrivValidatorCmd = &cobra.Command{
    36  	Use:     "unsafe-reset-priv-validator",
    37  	Aliases: []string{"unsafe_reset_priv_validator"},
    38  	Short:   "(unsafe) Reset this node's validator to genesis state",
    39  	RunE:    resetPrivValidator,
    40  	PreRun:  deprecateSnakeCase,
    41  }
    42  
    43  // XXX: this is totally unsafe.
    44  // it's only suitable for testnets.
    45  func resetAll(cmd *cobra.Command, args []string) error {
    46  	return ResetAll(config.DBDir(), config.P2P.AddrBookFile(), config.PrivValidator.KeyFile(),
    47  		config.PrivValidator.StateFile(), logger)
    48  }
    49  
    50  // XXX: this is totally unsafe.
    51  // it's only suitable for testnets.
    52  func resetPrivValidator(cmd *cobra.Command, args []string) error {
    53  	return resetFilePV(config.PrivValidator.KeyFile(), config.PrivValidator.StateFile(), logger)
    54  }
    55  
    56  // ResetAll removes address book files plus all data, and resets the privValdiator data.
    57  // Exported so other CLI tools can use it.
    58  func ResetAll(dbDir, addrBookFile, privValKeyFile, privValStateFile string, logger log.Logger) error {
    59  	if keepAddrBook {
    60  		logger.Info("The address book remains intact")
    61  	} else {
    62  		removeAddrBook(addrBookFile, logger)
    63  	}
    64  	if err := os.RemoveAll(dbDir); err == nil {
    65  		logger.Info("Removed all blockchain history", "dir", dbDir)
    66  	} else {
    67  		logger.Error("Error removing all blockchain history", "dir", dbDir, "err", err)
    68  	}
    69  	// recreate the dbDir since the privVal state needs to live there
    70  	if err := tmos.EnsureDir(dbDir, 0700); err != nil {
    71  		logger.Error("unable to recreate dbDir", "err", err)
    72  	}
    73  	return resetFilePV(privValKeyFile, privValStateFile, logger)
    74  }
    75  
    76  func resetFilePV(privValKeyFile, privValStateFile string, logger log.Logger) error {
    77  	if _, err := os.Stat(privValKeyFile); err == nil {
    78  		pv, err := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile)
    79  		if err != nil {
    80  			return err
    81  		}
    82  		pv.Reset()
    83  		logger.Info("Reset private validator file to genesis state", "keyFile", privValKeyFile,
    84  			"stateFile", privValStateFile)
    85  	} else {
    86  		pv, err := privval.GenFilePV(privValKeyFile, privValStateFile, keyType)
    87  		if err != nil {
    88  			return err
    89  		}
    90  		pv.Save()
    91  		logger.Info("Generated private validator file", "keyFile", privValKeyFile,
    92  			"stateFile", privValStateFile)
    93  	}
    94  	return nil
    95  }
    96  
    97  func removeAddrBook(addrBookFile string, logger log.Logger) {
    98  	if err := os.Remove(addrBookFile); err == nil {
    99  		logger.Info("Removed existing address book", "file", addrBookFile)
   100  	} else if !os.IsNotExist(err) {
   101  		logger.Info("Error removing address book", "file", addrBookFile, "err", err)
   102  	}
   103  }