Clean up genesis handling
This commit is contained in:
parent
adab86c947
commit
3a16fa9482
32
app/bc.go
32
app/bc.go
|
@ -4,13 +4,13 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
abci "github.com/tendermint/abci/types"
|
abci "github.com/tendermint/abci/types"
|
||||||
"github.com/tendermint/abci/version"
|
|
||||||
"github.com/tendermint/tmlibs/log"
|
"github.com/tendermint/tmlibs/log"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk"
|
sdk "github.com/cosmos/cosmos-sdk"
|
||||||
"github.com/cosmos/cosmos-sdk/errors"
|
"github.com/cosmos/cosmos-sdk/errors"
|
||||||
"github.com/cosmos/cosmos-sdk/stack"
|
"github.com/cosmos/cosmos-sdk/stack"
|
||||||
sm "github.com/cosmos/cosmos-sdk/state"
|
sm "github.com/cosmos/cosmos-sdk/state"
|
||||||
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Basecoin - The ABCI application
|
// Basecoin - The ABCI application
|
||||||
|
@ -61,7 +61,13 @@ func (app *Basecoin) InitState(module, key, value string) (string, error) {
|
||||||
return "", fmt.Errorf("unknown base option: %s", key)
|
return "", fmt.Errorf("unknown base option: %s", key)
|
||||||
}
|
}
|
||||||
|
|
||||||
return app.handler.InitState(app.Logger(), state, module, key, value)
|
log, err := app.handler.InitState(app.Logger(), state, module, key, value)
|
||||||
|
if err != nil {
|
||||||
|
app.Logger().Error("Genesis App Options", "err", err)
|
||||||
|
} else {
|
||||||
|
app.Logger().Info(log)
|
||||||
|
}
|
||||||
|
return log, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeliverTx - ABCI
|
// DeliverTx - ABCI
|
||||||
|
@ -119,25 +125,3 @@ func (app *Basecoin) BeginBlock(req abci.RequestBeginBlock) {
|
||||||
app.AddValChange(diff)
|
app.AddValChange(diff)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadGenesis parses the genesis file and sets the initial
|
|
||||||
// state based on that
|
|
||||||
func (app *Basecoin) LoadGenesis(filePath string) error {
|
|
||||||
init, err := GetInitialState(filePath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// execute all the genesis init options
|
|
||||||
// abort on any error
|
|
||||||
fmt.Printf("%#v\n", init)
|
|
||||||
for _, mkv := range init {
|
|
||||||
log, _ := app.InitState(mkv.Module, mkv.Key, mkv.Value)
|
|
||||||
// TODO: error out on bad options??
|
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
app.Logger().Info(log)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,17 +14,43 @@ const (
|
||||||
ModuleNameBase = "base"
|
ModuleNameBase = "base"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InitState just holds module/key/value triples from
|
// Option just holds module/key/value triples from
|
||||||
// parsing the genesis file
|
// parsing the genesis file
|
||||||
type InitState struct {
|
type Option struct {
|
||||||
Module string
|
Module string
|
||||||
Key string
|
Key string
|
||||||
Value string
|
Value string
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetInitialState parses the genesis file in a format
|
// InitStater is anything that can handle app options
|
||||||
// that can easily be handed into InitState modules
|
// from genesis file.
|
||||||
func GetInitialState(path string) ([]InitState, error) {
|
type InitStater interface {
|
||||||
|
InitState(module, key, value string) (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadGenesis parses the genesis file and sets the initial
|
||||||
|
// state based on that
|
||||||
|
func LoadGenesis(app InitStater, filePath string) error {
|
||||||
|
opts, err := GetGenesisOptions(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// execute all the genesis init options
|
||||||
|
// abort on any error
|
||||||
|
for _, opt := range opts {
|
||||||
|
_, _ = app.InitState(opt.Module, opt.Key, opt.Value)
|
||||||
|
// TODO: error out on bad options??
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGenesisOptions parses the genesis file in a format
|
||||||
|
// that can easily be handed into InitStaters
|
||||||
|
func GetGenesisOptions(path string) ([]Option, error) {
|
||||||
genDoc, err := loadGenesis(path)
|
genDoc, err := loadGenesis(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -32,21 +58,21 @@ func GetInitialState(path string) ([]InitState, error) {
|
||||||
|
|
||||||
opts := genDoc.AppOptions
|
opts := genDoc.AppOptions
|
||||||
cnt := 1 + len(opts.Accounts) + len(opts.pluginOptions)
|
cnt := 1 + len(opts.Accounts) + len(opts.pluginOptions)
|
||||||
res := make([]InitState, cnt)
|
res := make([]Option, cnt)
|
||||||
|
|
||||||
res[0] = InitState{ModuleNameBase, ChainKey, genDoc.ChainID}
|
res[0] = Option{ModuleNameBase, ChainKey, genDoc.ChainID}
|
||||||
i := 1
|
i := 1
|
||||||
|
|
||||||
// set accounts
|
// set accounts
|
||||||
for _, acct := range opts.Accounts {
|
for _, acct := range opts.Accounts {
|
||||||
res[i] = InitState{"coin", "account", string(acct)}
|
res[i] = Option{"coin", "account", string(acct)}
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
// set plugin options
|
// set plugin options
|
||||||
for _, kv := range opts.pluginOptions {
|
for _, kv := range opts.pluginOptions {
|
||||||
module, key := splitKey(kv.Key)
|
module, key := splitKey(kv.Key)
|
||||||
res[i] = InitState{module, key, kv.Value}
|
res[i] = Option{module, key, kv.Value}
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ func TestLoadGenesisDoNotFailIfAppOptionsAreMissing(t *testing.T) {
|
||||||
logger)
|
logger)
|
||||||
require.Nil(t, err, "%+v", err)
|
require.Nil(t, err, "%+v", err)
|
||||||
|
|
||||||
err = app.LoadGenesis("./testdata/genesis3.json")
|
err = LoadGenesis(app, "./testdata/genesis3.json")
|
||||||
require.Nil(t, err, "%+v", err)
|
require.Nil(t, err, "%+v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ func TestLoadGenesis(t *testing.T) {
|
||||||
logger)
|
logger)
|
||||||
require.Nil(err, "%+v", err)
|
require.Nil(err, "%+v", err)
|
||||||
|
|
||||||
err = app.LoadGenesis(genesisFilepath)
|
err = LoadGenesis(app, genesisFilepath)
|
||||||
require.Nil(err, "%+v", err)
|
require.Nil(err, "%+v", err)
|
||||||
|
|
||||||
// check the chain id
|
// check the chain id
|
||||||
|
@ -73,7 +73,7 @@ func TestLoadGenesisAccountAddress(t *testing.T) {
|
||||||
logger)
|
logger)
|
||||||
require.Nil(err, "%+v", err)
|
require.Nil(err, "%+v", err)
|
||||||
|
|
||||||
err = app.LoadGenesis(genesisAcctFilepath)
|
err = LoadGenesis(app, genesisAcctFilepath)
|
||||||
require.Nil(err, "%+v", err)
|
require.Nil(err, "%+v", err)
|
||||||
|
|
||||||
// check the chain id
|
// check the chain id
|
||||||
|
|
|
@ -111,7 +111,7 @@ func start(rootDir string, basecoinApp *app.Basecoin) error {
|
||||||
// If genesis file exists, set key-value options
|
// If genesis file exists, set key-value options
|
||||||
genesisFile := path.Join(rootDir, "genesis.json")
|
genesisFile := path.Join(rootDir, "genesis.json")
|
||||||
if _, err := os.Stat(genesisFile); err == nil {
|
if _, err := os.Stat(genesisFile); err == nil {
|
||||||
err := basecoinApp.LoadGenesis(genesisFile)
|
err = app.LoadGenesis(basecoinApp, genesisFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Errorf("Error in LoadGenesis: %v\n", err)
|
return errors.Errorf("Error in LoadGenesis: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue