From 438d18e059500f478ef266f3fa31f7caee3c4109 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 14 Feb 2018 20:04:34 +0100 Subject: [PATCH] Pulled most of gaiad into server, with rough implementation --- baseapp/baseapp.go | 6 +- examples/gaia/gaiad/main.go | 22 +++++--- examples/gaia/gaiad/node.go | 47 ---------------- server/reset.go | 31 +++++++++++ server/start.go | 107 ++++++++++++++++++++++++++++++++++++ 5 files changed, 155 insertions(+), 58 deletions(-) delete mode 100644 examples/gaia/gaiad/node.go create mode 100644 server/reset.go create mode 100644 server/start.go diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index f1bd112b84..e5eb59538c 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -24,7 +24,7 @@ var dbHeaderKey = []byte("header") // The ABCI application type BaseApp struct { // initialized on creation - logger log.Logger + Logger log.Logger name string // application name from abci.Info db dbm.DB // common DB backend cms sdk.CommitMultiStore // Main (uncached) state @@ -56,7 +56,7 @@ var _ abci.Application = (*BaseApp)(nil) // Create and name new BaseApp func NewBaseApp(name string, logger log.Logger, db dbm.DB) *BaseApp { return &BaseApp{ - logger: logger, + Logger: logger, name: name, db: db, cms: store.NewCommitMultiStore(db), @@ -420,7 +420,7 @@ func (app *BaseApp) Commit() (res abci.ResponseCommit) { // Write the Deliver state and commit the MultiStore app.deliverState.ms.Write() commitID := app.cms.Commit() - app.logger.Debug("Commit synced", + app.Logger.Debug("Commit synced", "commit", commitID, ) diff --git a/examples/gaia/gaiad/main.go b/examples/gaia/gaiad/main.go index 544cd03e2b..63cfd45ddb 100644 --- a/examples/gaia/gaiad/main.go +++ b/examples/gaia/gaiad/main.go @@ -9,15 +9,10 @@ import ( "github.com/tendermint/tmlibs/cli" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/version" ) -const ( - flagTo = "to" - flagAmount = "amount" - flagFee = "fee" -) - // gaiadCmd is the entry point for this binary var ( gaiadCmd = &cobra.Command{ @@ -26,16 +21,27 @@ var ( } ) +// TODO: move into server +var ( + initNodeCmd = &cobra.Command{ + Use: "init ", + Short: "Initialize full node", + RunE: todoNotImplemented, + } +) + func todoNotImplemented(_ *cobra.Command, _ []string) error { return errors.New("TODO: Command not yet implemented") } func main() { // TODO: set this to something real - var node baseapp.BaseApp + var app *baseapp.BaseApp - AddNodeCommands(gaiadCmd, node) gaiadCmd.AddCommand( + initNodeCmd, + server.StartNodeCmd(app), + server.UnsafeResetAllCmd(app.Logger), version.VersionCmd, ) diff --git a/examples/gaia/gaiad/node.go b/examples/gaia/gaiad/node.go deleted file mode 100644 index 8d362a6a78..0000000000 --- a/examples/gaia/gaiad/node.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/baseapp" -) - -const ( - flagWithTendermint = "with-tendermint" -) - -var ( - initNodeCmd = &cobra.Command{ - Use: "init ", - Short: "Initialize full node", - RunE: todoNotImplemented, - } - - resetNodeCmd = &cobra.Command{ - Use: "unsafe_reset_all", - Short: "Reset full node data (danger, must resync)", - RunE: todoNotImplemented, - } -) - -// AddNodeCommands registers all commands to interact -// with a local full-node as subcommands of the argument. -// -// Accept an application it should start -func AddNodeCommands(cmd *cobra.Command, node baseapp.BaseApp) { - cmd.AddCommand( - initNodeCmd, - startNodeCmd(node), - resetNodeCmd, - ) -} - -func startNodeCmd(node baseapp.BaseApp) *cobra.Command { - cmd := &cobra.Command{ - Use: "start", - Short: "Run the full node", - RunE: todoNotImplemented, - } - cmd.Flags().Bool(flagWithTendermint, true, "run abci app embedded in-process with tendermint") - return cmd -} diff --git a/server/reset.go b/server/reset.go new file mode 100644 index 0000000000..5c70bbdace --- /dev/null +++ b/server/reset.go @@ -0,0 +1,31 @@ +package server + +import ( + "github.com/spf13/cobra" + + tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" + "github.com/tendermint/tmlibs/log" +) + +// UnsafeResetAllCmd - extension of the tendermint command, resets initialization +func UnsafeResetAllCmd(logger log.Logger) *cobra.Command { + cmd := resetAll{logger} + return &cobra.Command{ + Use: "unsafe_reset_all", + Short: "Reset all blockchain data", + RunE: cmd.run, + } +} + +type resetAll struct { + logger log.Logger +} + +func (r resetAll) run(cmd *cobra.Command, args []string) error { + cfg, err := tcmd.ParseConfig() + if err != nil { + return err + } + tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), r.logger) + return nil +} diff --git a/server/start.go b/server/start.go new file mode 100644 index 0000000000..137a0b6cc6 --- /dev/null +++ b/server/start.go @@ -0,0 +1,107 @@ +package server + +import ( + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "github.com/tendermint/abci/server" + + tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" + "github.com/tendermint/tendermint/node" + "github.com/tendermint/tendermint/proxy" + "github.com/tendermint/tendermint/types" + cmn "github.com/tendermint/tmlibs/common" + + "github.com/cosmos/cosmos-sdk/baseapp" +) + +const ( + flagWithTendermint = "with-tendermint" + flagAddress = "address" +) + +// StartNodeCmd runs the service passed in, either +// stand-alone, or in-process with tendermint +func StartNodeCmd(app *baseapp.BaseApp) *cobra.Command { + start := startNodeCmd{ + app: app, + } + cmd := &cobra.Command{ + Use: "start", + Short: "Run the full node", + RunE: start.run, + } + // basic flags for abci app + cmd.Flags().Bool(flagWithTendermint, true, "run abci app embedded in-process with tendermint") + cmd.Flags().String(flagAddress, "tcp://0.0.0.0:46658", "Listen address") + + // AddNodeFlags adds support for all + // tendermint-specific command line options + tcmd.AddNodeFlags(cmd) + return cmd +} + +type startNodeCmd struct { + // do this in main: + // rootDir := viper.GetString(cli.HomeFlag) + // node.Logger = .... + app *baseapp.BaseApp +} + +func (s startNodeCmd) run(cmd *cobra.Command, args []string) error { + logger := s.app.Logger + if !viper.GetBool(flagWithTendermint) { + logger.Info("Starting ABCI without Tendermint") + return s.startStandAlone() + } + logger.Info("Starting ABCI with Tendermint") + return s.startInProcess() +} + +func (s startNodeCmd) startStandAlone() error { + logger := s.app.Logger + // Start the ABCI listener + addr := viper.GetString(flagAddress) + svr, err := server.NewServer(addr, "socket", s.app) + if err != nil { + return errors.Errorf("Error creating listener: %v\n", err) + } + svr.SetLogger(logger.With("module", "abci-server")) + svr.Start() + + // Wait forever + cmn.TrapSignal(func() { + // Cleanup + svr.Stop() + }) + return nil +} + +func (s startNodeCmd) startInProcess() error { + logger := s.app.Logger + cfg, err := tcmd.ParseConfig() + if err != nil { + return err + } + + // Create & start tendermint node + n, err := node.NewNode(cfg, + types.LoadOrGenPrivValidatorFS(cfg.PrivValidatorFile()), + proxy.NewLocalClientCreator(s.app), + node.DefaultGenesisDocProviderFunc(cfg), + node.DefaultDBProvider, + logger.With("module", "node")) + if err != nil { + return err + } + + err = n.Start() + if err != nil { + return err + } + + // Trap signal, run forever. + n.RunForever() + return nil +}