Pulled most of gaiad into server, with rough implementation

This commit is contained in:
Ethan Frey 2018-02-14 20:04:34 +01:00 committed by rigelrozanski
parent a99d913982
commit 438d18e059
5 changed files with 155 additions and 58 deletions

View File

@ -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,
)

View File

@ -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 <flags???>",
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,
)

View File

@ -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 <flags???>",
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
}

31
server/reset.go Normal file
View File

@ -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
}

107
server/start.go Normal file
View File

@ -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
}