2017-01-30 06:16:51 -08:00
|
|
|
package commands
|
2017-01-28 18:12:58 -08:00
|
|
|
|
|
|
|
import (
|
2017-02-16 09:03:01 -08:00
|
|
|
"fmt"
|
2017-01-29 21:27:57 -08:00
|
|
|
"os"
|
|
|
|
"path"
|
2017-01-28 18:12:58 -08:00
|
|
|
|
2017-04-15 09:07:27 -07:00
|
|
|
"github.com/pkg/errors"
|
2017-03-08 23:19:07 -08:00
|
|
|
"github.com/spf13/cobra"
|
2017-05-12 11:29:13 -07:00
|
|
|
"github.com/spf13/viper"
|
2017-01-28 18:12:58 -08:00
|
|
|
|
|
|
|
"github.com/tendermint/abci/server"
|
2017-07-03 08:32:01 -07:00
|
|
|
"github.com/tendermint/basecoin"
|
2017-06-27 06:20:32 -07:00
|
|
|
eyesApp "github.com/tendermint/merkleeyes/app"
|
2017-01-28 18:12:58 -08:00
|
|
|
eyes "github.com/tendermint/merkleeyes/client"
|
2017-05-12 11:29:13 -07:00
|
|
|
"github.com/tendermint/tmlibs/cli"
|
|
|
|
cmn "github.com/tendermint/tmlibs/common"
|
2017-01-29 11:41:21 -08:00
|
|
|
|
2017-06-26 05:18:36 -07:00
|
|
|
tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands"
|
2017-01-29 11:41:21 -08:00
|
|
|
"github.com/tendermint/tendermint/node"
|
|
|
|
"github.com/tendermint/tendermint/proxy"
|
2017-05-12 12:47:18 -07:00
|
|
|
"github.com/tendermint/tendermint/types"
|
2017-01-29 11:41:21 -08:00
|
|
|
|
|
|
|
"github.com/tendermint/basecoin/app"
|
2017-07-03 08:32:01 -07:00
|
|
|
"github.com/tendermint/basecoin/modules/coin"
|
|
|
|
"github.com/tendermint/basecoin/stack"
|
2017-01-28 18:12:58 -08:00
|
|
|
)
|
|
|
|
|
2017-03-08 23:19:07 -08:00
|
|
|
var StartCmd = &cobra.Command{
|
|
|
|
Use: "start",
|
|
|
|
Short: "Start basecoin",
|
2017-04-15 09:07:27 -07:00
|
|
|
RunE: startCmd,
|
2017-01-30 06:16:51 -08:00
|
|
|
}
|
|
|
|
|
2017-03-08 23:19:07 -08:00
|
|
|
// TODO: move to config file
|
|
|
|
const EyesCacheSize = 10000
|
|
|
|
|
2017-06-26 05:46:13 -07:00
|
|
|
//nolint
|
|
|
|
const (
|
|
|
|
FlagAddress = "address"
|
|
|
|
FlagEyes = "eyes"
|
|
|
|
FlagWithoutTendermint = "without-tendermint"
|
|
|
|
)
|
2017-03-08 23:19:07 -08:00
|
|
|
|
2017-06-26 05:46:13 -07:00
|
|
|
func init() {
|
|
|
|
flags := StartCmd.Flags()
|
|
|
|
flags.String(FlagAddress, "tcp://0.0.0.0:46658", "Listen address")
|
|
|
|
flags.String(FlagEyes, "local", "MerkleEyes address, or 'local' for embedded")
|
|
|
|
flags.Bool(FlagWithoutTendermint, false, "Only run basecoin abci app, assume external tendermint process")
|
|
|
|
// add all standard 'tendermint node' flags
|
|
|
|
tcmd.AddNodeFlags(StartCmd)
|
2017-01-30 08:16:00 -08:00
|
|
|
}
|
|
|
|
|
2017-07-03 08:32:01 -07:00
|
|
|
// TODO: setup handler instead of Plugins
|
|
|
|
func getHandler() basecoin.Handler {
|
|
|
|
// use the default stack
|
|
|
|
h := coin.NewHandler()
|
2017-07-03 09:10:46 -07:00
|
|
|
app := stack.NewDefault().Use(h)
|
2017-07-03 08:32:01 -07:00
|
|
|
return app
|
|
|
|
|
|
|
|
// register IBC plugn
|
|
|
|
// basecoinApp.RegisterPlugin(NewIBCPlugin())
|
|
|
|
|
|
|
|
// register all other plugins
|
|
|
|
// for _, p := range plugins {
|
|
|
|
// basecoinApp.RegisterPlugin(p.newPlugin())
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
|
2017-04-15 09:07:27 -07:00
|
|
|
func startCmd(cmd *cobra.Command, args []string) error {
|
2017-05-12 11:29:13 -07:00
|
|
|
rootDir := viper.GetString(cli.HomeFlag)
|
2017-06-26 05:46:13 -07:00
|
|
|
meyes := viper.GetString(FlagEyes)
|
2017-01-28 18:12:58 -08:00
|
|
|
|
|
|
|
// Connect to MerkleEyes
|
|
|
|
var eyesCli *eyes.Client
|
2017-06-26 05:46:13 -07:00
|
|
|
if meyes == "local" {
|
2017-06-27 06:20:32 -07:00
|
|
|
eyesApp.SetLogger(logger.With("module", "merkleeyes"))
|
2017-05-12 11:29:13 -07:00
|
|
|
eyesCli = eyes.NewLocalClient(path.Join(rootDir, "data", "merkleeyes.db"), EyesCacheSize)
|
2017-01-28 18:12:58 -08:00
|
|
|
} else {
|
|
|
|
var err error
|
2017-06-26 05:46:13 -07:00
|
|
|
eyesCli, err = eyes.NewClient(meyes)
|
2017-01-28 18:12:58 -08:00
|
|
|
if err != nil {
|
2017-04-15 09:07:27 -07:00
|
|
|
return errors.Errorf("Error connecting to MerkleEyes: %v\n", err)
|
2017-01-28 18:12:58 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create Basecoin app
|
2017-07-03 08:32:01 -07:00
|
|
|
h := app.DefaultHandler()
|
|
|
|
basecoinApp := app.NewBasecoin(h, eyesCli, logger.With("module", "app"))
|
2017-01-29 15:32:38 -08:00
|
|
|
|
2017-03-14 14:28:49 -07:00
|
|
|
// if chain_id has not been set yet, load the genesis.
|
|
|
|
// else, assume it's been loaded
|
|
|
|
if basecoinApp.GetState().GetChainID() == "" {
|
|
|
|
// If genesis file exists, set key-value options
|
2017-05-12 11:29:13 -07:00
|
|
|
genesisFile := path.Join(rootDir, "genesis.json")
|
2017-03-14 14:28:49 -07:00
|
|
|
if _, err := os.Stat(genesisFile); err == nil {
|
|
|
|
err := basecoinApp.LoadGenesis(genesisFile)
|
|
|
|
if err != nil {
|
2017-04-15 09:07:27 -07:00
|
|
|
return errors.Errorf("Error in LoadGenesis: %v\n", err)
|
2017-03-14 14:28:49 -07:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
fmt.Printf("No genesis file at %s, skipping...\n", genesisFile)
|
2017-01-28 18:12:58 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-18 17:48:48 -07:00
|
|
|
chainID := basecoinApp.GetState().GetChainID()
|
2017-06-26 05:46:13 -07:00
|
|
|
if viper.GetBool(FlagWithoutTendermint) {
|
2017-05-01 07:03:54 -07:00
|
|
|
logger.Info("Starting Basecoin without Tendermint", "chain_id", chainID)
|
2017-03-13 14:23:05 -07:00
|
|
|
// run just the abci app/server
|
2017-04-15 09:07:27 -07:00
|
|
|
return startBasecoinABCI(basecoinApp)
|
2017-03-13 14:23:05 -07:00
|
|
|
} else {
|
2017-05-01 07:03:54 -07:00
|
|
|
logger.Info("Starting Basecoin with Tendermint", "chain_id", chainID)
|
2017-03-13 14:23:05 -07:00
|
|
|
// start the app with tendermint in-process
|
2017-05-12 11:29:13 -07:00
|
|
|
return startTendermint(rootDir, basecoinApp)
|
2017-01-29 11:41:21 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-15 09:07:27 -07:00
|
|
|
func startBasecoinABCI(basecoinApp *app.Basecoin) error {
|
2017-01-29 11:41:21 -08:00
|
|
|
// Start the ABCI listener
|
2017-06-26 05:46:13 -07:00
|
|
|
addr := viper.GetString(FlagAddress)
|
|
|
|
svr, err := server.NewServer(addr, "socket", basecoinApp)
|
2017-01-28 18:12:58 -08:00
|
|
|
if err != nil {
|
2017-04-15 09:07:27 -07:00
|
|
|
return errors.Errorf("Error creating listener: %v\n", err)
|
2017-01-28 18:12:58 -08:00
|
|
|
}
|
2017-05-01 07:03:54 -07:00
|
|
|
svr.SetLogger(logger.With("module", "abci-server"))
|
2017-05-16 09:52:43 -07:00
|
|
|
svr.Start()
|
2017-03-08 23:19:07 -08:00
|
|
|
|
2017-01-28 18:12:58 -08:00
|
|
|
// Wait forever
|
|
|
|
cmn.TrapSignal(func() {
|
|
|
|
// Cleanup
|
|
|
|
svr.Stop()
|
|
|
|
})
|
2017-04-15 09:07:27 -07:00
|
|
|
return nil
|
2017-01-29 11:41:21 -08:00
|
|
|
}
|
|
|
|
|
2017-05-22 04:30:42 -07:00
|
|
|
func startTendermint(dir string, basecoinApp *app.Basecoin) error {
|
2017-06-26 05:18:36 -07:00
|
|
|
cfg, err := tcmd.ParseConfig()
|
2017-05-22 04:30:42 -07:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-05-01 07:03:54 -07:00
|
|
|
|
2017-01-29 11:41:21 -08:00
|
|
|
// Create & start tendermint node
|
2017-06-26 05:28:56 -07:00
|
|
|
privValidator := types.LoadOrGenPrivValidator(cfg.PrivValidatorFile(), logger)
|
|
|
|
n := node.NewNode(cfg, privValidator, proxy.NewLocalClientCreator(basecoinApp), logger.With("module", "node"))
|
2017-01-29 11:41:21 -08:00
|
|
|
|
2017-05-12 11:29:13 -07:00
|
|
|
_, err = n.Start()
|
2017-03-18 17:48:48 -07:00
|
|
|
if err != nil {
|
2017-04-17 18:28:03 -07:00
|
|
|
return err
|
2017-03-18 17:48:48 -07:00
|
|
|
}
|
2017-01-29 11:41:21 -08:00
|
|
|
|
2017-05-12 12:47:18 -07:00
|
|
|
// Trap signal, run forever.
|
|
|
|
n.RunForever()
|
2017-04-15 09:07:27 -07:00
|
|
|
return nil
|
2017-01-28 18:12:58 -08:00
|
|
|
}
|