package commands import ( "errors" "os" "path" "github.com/urfave/cli" "github.com/tendermint/abci/server" cmn "github.com/tendermint/go-common" cfg "github.com/tendermint/go-config" //logger "github.com/tendermint/go-logger" eyes "github.com/tendermint/merkleeyes/client" tmcfg "github.com/tendermint/tendermint/config/tendermint" "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/proxy" tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/basecoin/app" "github.com/tendermint/basecoin/types" ) var config cfg.Config const EyesCacheSize = 10000 var StartCmd = cli.Command{ Name: "start", Usage: "Start basecoin", ArgsUsage: "", Action: func(c *cli.Context) error { return cmdStart(c) }, Flags: []cli.Flag{ AddrFlag, EyesFlag, DirFlag, InProcTMFlag, ChainIDFlag, }, } type plugin struct { name string newPlugin func() types.Plugin } var plugins = []plugin{} // RegisterStartPlugin is used to enable a plugin func RegisterStartPlugin(name string, newPlugin func() types.Plugin) { plugins = append(plugins, plugin{name: name, newPlugin: newPlugin}) } func cmdStart(c *cli.Context) error { // Connect to MerkleEyes var eyesCli *eyes.Client if c.String("eyes") == "local" { eyesCli = eyes.NewLocalClient(path.Join(c.String("dir"), "merkleeyes.db"), EyesCacheSize) } else { var err error eyesCli, err = eyes.NewClient(c.String("eyes")) if err != nil { return errors.New("connect to MerkleEyes: " + err.Error()) } } // Create Basecoin app basecoinApp := app.NewBasecoin(eyesCli) // register all plugins for _, p := range plugins { basecoinApp.RegisterPlugin(p.newPlugin()) } // If genesis file exists, set key-value options genesisFile := path.Join(c.String("dir"), "genesis.json") if _, err := os.Stat(genesisFile); err == nil { err := basecoinApp.LoadGenesis(genesisFile) if err != nil { return errors.New(cmn.Fmt("%+v", err)) } } if c.Bool("in-proc") { startTendermint(c, basecoinApp) } else { startBasecoinABCI(c, basecoinApp) } return nil } func startBasecoinABCI(c *cli.Context, basecoinApp *app.Basecoin) error { // Start the ABCI listener svr, err := server.NewServer(c.String("address"), "socket", basecoinApp) if err != nil { return errors.New("create listener: " + err.Error()) } // Wait forever cmn.TrapSignal(func() { // Cleanup svr.Stop() }) return nil } func startTendermint(c *cli.Context, basecoinApp *app.Basecoin) { // Get configuration config = tmcfg.GetConfig("") // logger.SetLogLevel("notice") //config.GetString("log_level")) // parseFlags(config, args[1:]) // Command line overrides // Create & start tendermint node privValidatorFile := config.GetString("priv_validator_file") privValidator := tmtypes.LoadOrGenPrivValidator(privValidatorFile) n := node.NewNode(config, privValidator, proxy.NewLocalClientCreator(basecoinApp)) n.Start() // Wait forever cmn.TrapSignal(func() { // Cleanup n.Stop() }) }