diff --git a/cmd/hsm/main.go b/cmd/hsm/main.go index 743a8fcd9..657c946a1 100644 --- a/cmd/hsm/main.go +++ b/cmd/hsm/main.go @@ -3,10 +3,17 @@ package main import ( "os" - tc "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tmlibs/cli" + "github.com/tendermint/tmlibs/log" - "github.com/tendermint/tendermint/cmd/hsm/commands" + tc "github.com/tendermint/tendermint/cmd/tendermint/commands" + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/types" +) + +var ( + config = cfg.DefaultConfig() + logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "main") ) func main() { @@ -28,7 +35,9 @@ func main() { rootCmd.AddCommand(tc.TestnetFilesCmd) rootCmd.AddCommand(tc.VersionCmd) - rootCmd.AddCommand(commands.RunNodeCmd) + privValidator := types.LoadOrGenPrivValidator(config.PrivValidatorFile(), logger) + privValidator.SetSigner(types.NewDefaultSigner(privValidator.PrivKey)) + rootCmd.AddCommand(tc.NewRunNodeCmd(privValidator)) cmd := cli.PrepareBaseCmd(rootCmd, "TM", os.ExpandEnv("$HOME/.tendermint")) cmd.Execute() diff --git a/cmd/tendermint/commands/run_node.go b/cmd/tendermint/commands/run_node.go index 413e2cc7a..51b370300 100644 --- a/cmd/tendermint/commands/run_node.go +++ b/cmd/tendermint/commands/run_node.go @@ -5,16 +5,59 @@ import ( "github.com/spf13/cobra" + cmn "github.com/tendermint/tmlibs/common" + "github.com/tendermint/tendermint/node" + "github.com/tendermint/tendermint/proxy" "github.com/tendermint/tendermint/types" ) +// RunNodeCmd creates and starts a tendermint node. var RunNodeCmd = &cobra.Command{ Use: "node", Short: "Run the tendermint node", RunE: runNode, } +// NewRunNodeCmd creates and starts a tendermint node. It allows the user to +// use a custom PrivValidator. +func NewRunNodeCmd(privVal *types.PrivValidator) *cobra.Command { + return &cobra.Command{ + Use: "node", + Short: "Run the tendermint node", + RunE: func(cmd *cobra.Command, args []string) error { + // Wait until the genesis doc becomes available + // This is for Mintnet compatibility. + // TODO: If Mintnet gets deprecated or genesis_file is + // always available, remove. + genDocFile := config.GenesisFile() + for !cmn.FileExists(genDocFile) { + logger.Info(cmn.Fmt("Waiting for genesis file %v...", genDocFile)) + time.Sleep(time.Second) + } + + genDoc, err := types.GenesisDocFromFile(genDocFile) + if err != nil { + return err + } + config.ChainID = genDoc.ChainID + + // Create & start node + n := node.NewNode(config, privVal, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), logger) + if _, err := n.Start(); err != nil { + return fmt.Errorf("Failed to start node: %v", err) + } else { + logger.Info("Started node", "nodeInfo", n.Switch().NodeInfo()) + } + + // Trap signal, run forever. + n.RunForever() + + return nil + }, + } +} + func init() { AddNodeFlags(RunNodeCmd) } diff --git a/types/priv_validator.go b/types/priv_validator.go index 3e84e7f36..072b394ca 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -35,6 +35,7 @@ func voteToStep(vote *Vote) int8 { } } +// PrivValidator implements the functionality for signing blocks. type PrivValidator struct { Address data.Bytes `json:"address"` PubKey crypto.PubKey `json:"pub_key"` @@ -58,26 +59,29 @@ type PrivValidator struct { // It is the caller's duty to verify the msg before calling Sign, // eg. to avoid double signing. // Currently, the only callers are SignVote and SignProposal +// Signer is an interface that describes how to sign votes. type Signer interface { PubKey() crypto.PubKey Sign(msg []byte) (crypto.Signature, error) } -// Implements Signer +// DefaultSigner implements Signer. type DefaultSigner struct { priv crypto.PrivKey } +// NewDefaultSigner returns an instance of DefaultSigner. func NewDefaultSigner(priv crypto.PrivKey) *DefaultSigner { return &DefaultSigner{priv: priv} } -// Implements Signer +// Sign implements Signer. It signs the byte slice with a private key. func (ds *DefaultSigner) Sign(msg []byte) (crypto.Signature, error) { return ds.priv.Sign(msg), nil } -// Implements Signer +// PubKey implements Signer. It should return the public key that corresponds +// to the private key used for signing. func (ds *DefaultSigner) PubKey() crypto.PubKey { return ds.priv.PubKey() }