From 6eb884017bf2d5a9e86406a64213e3c9aba99c74 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Tue, 3 Oct 2017 19:01:02 -0400 Subject: [PATCH] proper integration of tick functionality --- app/app.go | 23 ++++++++++++++++++++++ server/commands/start.go | 41 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/app/app.go b/app/app.go index 79ed53b0c1..0ff0908231 100644 --- a/app/app.go +++ b/app/app.go @@ -28,12 +28,16 @@ type Basecoin struct { state *Store handler sdk.Handler + tick Ticker pending []*abci.Validator height uint64 logger log.Logger } +// Ticker - tick function +type Ticker func(sm.SimpleDB) ([]*abci.Validator, error) + var _ abci.Application = &Basecoin{} // NewBasecoin - create a new instance of the basecoin application @@ -46,6 +50,17 @@ func NewBasecoin(handler sdk.Handler, store *Store, logger log.Logger) *Basecoin } } +// NewBasecoinTick - create a new instance of the basecoin application with tick functionality +func NewBasecoinTick(handler sdk.Handler, store *Store, logger log.Logger, tick Ticker) *Basecoin { + return &Basecoin{ + handler: handler, + info: sm.NewChainState(), + state: store, + logger: logger, + tick: tick, + } +} + // GetChainID returns the currently stored chain func (app *Basecoin) GetChainID() string { return app.info.GetChainID(app.state.Committed()) @@ -170,6 +185,14 @@ func (app *Basecoin) BeginBlock(req abci.RequestBeginBlock) { // for _, plugin := range app.plugins.GetList() { // plugin.BeginBlock(app.state, hash, header) // } + + if app.tick != nil { + diff, err := app.tick(app.state.Append()) + if err != nil { + panic(err) + } + app.addValChange(diff) + } } // EndBlock - ABCI diff --git a/server/commands/start.go b/server/commands/start.go index 949e57f068..8a5a56e6f2 100644 --- a/server/commands/start.go +++ b/server/commands/start.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - sdk "github.com/cosmos/cosmos-sdk" "github.com/tendermint/abci/server" + abci "github.com/tendermint/abci/types" "github.com/tendermint/tmlibs/cli" cmn "github.com/tendermint/tmlibs/common" @@ -19,6 +19,7 @@ import ( "github.com/tendermint/tendermint/proxy" "github.com/tendermint/tendermint/types" + sdk "github.com/cosmos/cosmos-sdk" "github.com/cosmos/cosmos-sdk/app" ) @@ -29,6 +30,15 @@ var StartCmd = &cobra.Command{ RunE: startCmd, } +// TickStartCmd - command to create a start command with tick +func TickStartCmd(tick app.Ticker) *cobra.Command { + return &cobra.Command{ + Use: "start", + Short: "Start this full node", + RunE: tickStartCmd(tick), + } +} + // nolint TODO: move to config file const EyesCacheSize = 10000 @@ -52,6 +62,26 @@ func init() { tcmd.AddNodeFlags(StartCmd) } +//returns the start command which uses the tick +func tickStartCmd(tick app.Ticker) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + rootDir := viper.GetString(cli.HomeFlag) + + store, err := app.NewStore( + path.Join(rootDir, "data", "merkleeyes.db"), + EyesCacheSize, + logger.With("module", "store"), + ) + if err != nil { + return err + } + + // Create Basecoin app + basecoinApp := app.NewBasecoinTick(Handler, store, logger.With("module", "app"), tick) + return start(rootDir, store, basecoinApp) + } +} + func startCmd(cmd *cobra.Command, args []string) error { rootDir := viper.GetString(cli.HomeFlag) @@ -63,9 +93,12 @@ func startCmd(cmd *cobra.Command, args []string) error { if err != nil { return err } - // Create Basecoin app basecoinApp := app.NewBasecoin(Handler, store, logger.With("module", "app")) + return start(rootDir, store, basecoinApp) +} + +func start(rootDir string, store *app.Store, basecoinApp *app.Basecoin) error { // if chain_id has not been set yet, load the genesis. // else, assume it's been loaded @@ -93,7 +126,7 @@ func startCmd(cmd *cobra.Command, args []string) error { return startTendermint(rootDir, basecoinApp) } -func startBasecoinABCI(basecoinApp *app.Basecoin) error { +func startBasecoinABCI(basecoinApp abci.Application) error { // Start the ABCI listener addr := viper.GetString(FlagAddress) svr, err := server.NewServer(addr, "socket", basecoinApp) @@ -111,7 +144,7 @@ func startBasecoinABCI(basecoinApp *app.Basecoin) error { return nil } -func startTendermint(dir string, basecoinApp *app.Basecoin) error { +func startTendermint(dir string, basecoinApp abci.Application) error { cfg, err := tcmd.ParseConfig() if err != nil { return err