Pulled most of gaiad into server, with rough implementation
This commit is contained in:
parent
a99d913982
commit
438d18e059
|
@ -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,
|
||||
)
|
||||
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue