diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index e92f58bdcc..356dba0b6e 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -8,6 +8,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" + abci "github.com/tendermint/abci/types" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" @@ -21,44 +22,22 @@ var mainHeaderKey = []byte("header") // The ABCI application type BaseApp struct { - logger log.Logger - - // Application name from abci.Info - name string - - // Common DB backend - db dbm.DB - - // Main (uncached) state - cms sdk.CommitMultiStore - - // unmarshal []byte into sdk.Tx - txDecoder sdk.TxDecoder - - // unmarshal rawjsonbytes to initialize the application - // TODO unexpose and call from InitChain - InitStater sdk.InitStater - - // ante handler for fee and auth - defaultAnteHandler sdk.AnteHandler - - // handle any kind of message - router Router + logger log.Logger + name string // application name from abci.Info + db dbm.DB // common DB backend + cms sdk.CommitMultiStore // Main (uncached) state + txDecoder sdk.TxDecoder // unmarshal []byte into sdk.Tx + InitStater sdk.InitStater // TODO unexpose + defaultAnteHandler sdk.AnteHandler // ante handler for fee and auth + router Router // handle any kind of message //-------------------- // Volatile - // CheckTx state, a cache-wrap of `.cms` - msCheck sdk.CacheMultiStore - - // DeliverTx state, a cache-wrap of `.cms` - msDeliver sdk.CacheMultiStore - - // current block header - header *abci.Header - - // cached validator changes from DeliverTx - valUpdates []abci.Validator + msCheck sdk.CacheMultiStore // CheckTx state, a cache-wrap of `.cms` + msDeliver sdk.CacheMultiStore // DeliverTx state, a cache-wrap of `.cms` + header *abci.Header // current block header + valUpdates []abci.Validator // cached validator changes from DeliverTx } var _ abci.Application = &BaseApp{} @@ -122,40 +101,40 @@ func (app *BaseApp) SetBeginBlocker(...) {} func (app *BaseApp) SetEndBlocker(...) {} */ -// TODO add description +// load latest application version func (app *BaseApp) LoadLatestVersion(mainKey sdk.StoreKey) error { app.cms.LoadLatestVersion() return app.initFromStore(mainKey) } -// Load application version +// load application version func (app *BaseApp) LoadVersion(version int64, mainKey sdk.StoreKey) error { app.cms.LoadVersion(version) return app.initFromStore(mainKey) } -// The last CommitID of the multistore. +// the last CommitID of the multistore func (app *BaseApp) LastCommitID() sdk.CommitID { return app.cms.LastCommitID() } -// The last commited block height. +// the last commited block height func (app *BaseApp) LastBlockHeight() int64 { return app.cms.LastCommitID().Version } -// Initializes the remaining logic from app.cms. +// initializes the remaining logic from app.cms func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { var lastCommitID = app.cms.LastCommitID() var main = app.cms.GetKVStore(mainKey) var header *abci.Header - // Main store should exist. + // main store should exist. if main == nil { return errors.New("BaseApp expects MultiStore with 'main' KVStore") } - // If we've committed before, we expect main://. + // if we've committed before, we expect main:// if !lastCommitID.IsZero() { headerBytes := main.Get(mainHeaderKey) if len(headerBytes) == 0 { @@ -173,7 +152,7 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { } } - // Set BaseApp state. + // set BaseApp state app.header = header app.msCheck = nil app.msDeliver = nil @@ -183,6 +162,7 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { } //---------------------------------------- +// ABCI // Implements ABCI func (app *BaseApp) Info(req abci.RequestInfo) abci.ResponseInfo { @@ -205,7 +185,7 @@ func (app *BaseApp) SetOption(req abci.RequestSetOption) (res abci.ResponseSetOp // Implements ABCI func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitChain) { // TODO: Use req.Validators - // TODO: Use req.AppStateJSON (?) + // TODO: Use req.AppState return } @@ -367,7 +347,7 @@ func (app *BaseApp) Commit() (res abci.ResponseCommit) { } //---------------------------------------- -// Misc. +// Helpers func (app *BaseApp) getMultiStore(isCheckTx bool) sdk.MultiStore { if isCheckTx { diff --git a/baseapp/genesis.go b/baseapp/genesis.go index 2baff9e515..c18d5e3589 100644 --- a/baseapp/genesis.go +++ b/baseapp/genesis.go @@ -5,8 +5,7 @@ import ( "io/ioutil" ) -// TODO: remove from here and pass the AppState -// through InitChain +// TODO: remove from here and pass the AppState through InitChain // GenesisDoc defines the initial conditions for a tendermint blockchain, in particular its validator set. type GenesisDoc struct { @@ -14,12 +13,11 @@ type GenesisDoc struct { } // GenesisDocFromFile reads JSON data from a file and unmarshalls it into a GenesisDoc. -func GenesisDocFromFile(genDocFile string) (*GenesisDoc, error) { - if genDocFile == "" { - var g GenesisDoc - return &g, nil +func ReadGenesisAppState(genesisPath string) (state json.RawMessage, err error) { + if genesisPath == "" { + return } - jsonBlob, err := ioutil.ReadFile(genDocFile) + jsonBlob, err := ioutil.ReadFile(genesisPath) if err != nil { return nil, err } @@ -28,26 +26,5 @@ func GenesisDocFromFile(genDocFile string) (*GenesisDoc, error) { if err != nil { return nil, err } - return &genDoc, nil + return genDoc.AppState, nil } - -// read app state from the genesis file -//func GenesisAppState(genesisFile string) (state json.RawMessage, err error) { -//if genesisFile == "" { -//return -//} -//jsonBlob, err := ioutil.ReadFile(genesisFile) -//if err != nil { -//return nil, err -//} -//data := make(map[string]interface{}) -//err = json.Unmarshal(jsonBlob, &data) -//if err != nil { -//return nil, err -//} -//state, ok := data["app_state"].(json.RawMessage) -//if !ok { -//return nil, errors.New("app state genesis parse error") -//} -//return state, nil -//} diff --git a/baseapp/helpers.go b/baseapp/helpers.go new file mode 100644 index 0000000000..43bd654d67 --- /dev/null +++ b/baseapp/helpers.go @@ -0,0 +1,24 @@ +package baseapp + +import ( + "github.com/tendermint/abci/server" + abci "github.com/tendermint/abci/types" + cmn "github.com/tendermint/tmlibs/common" +) + +// RunForever - BasecoinApp execution and cleanup +func RunForever(app abci.Application) { + + // Start the ABCI server + srv, err := server.NewServer("0.0.0.0:46658", "socket", app) + if err != nil { + cmn.Exit(err.Error()) + } + srv.Start() + + // Wait forever + cmn.TrapSignal(func() { + // Cleanup + srv.Stop() + }) +} diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index a7d27c5805..67f871331c 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -1,12 +1,16 @@ package app import ( + "encoding/json" "fmt" bam "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/examples/basecoin/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/sketchy" - "github.com/tendermint/abci/server" abci "github.com/tendermint/abci/types" "github.com/tendermint/go-wire" cmn "github.com/tendermint/tmlibs/common" @@ -28,63 +32,130 @@ type BasecoinApp struct { accountMapper sdk.AccountMapper } -// TODO: This should take in more configuration options. -// TODO: This should be moved into baseapp to isolate complexity +// construct top level keys +func (app *BasecoinApp) initCapKeys() { + app.capKeyMainStore = sdk.NewKVStoreKey("main") + app.capKeyIBCStore = sdk.NewKVStoreKey("ibc") +} + +func (app *BasecoinApp) initDefaultAnteHandler() { + // deducts fee from payer, verifies signatures and nonces, sets Signers to ctx. + app.BaseApp.SetDefaultAnteHandler(auth.NewAnteHandler(app.accountMapper)) +} + +func (app *BasecoinApp) initRouterHandlers() { + + // All handlers must be added here, the order matters + app.router.AddRoute("bank", bank.NewHandler(bank.NewCoinKeeper(app.accountMapper))) + app.router.AddRoute("sketchy", sketchy.NewHandler()) +} + +func (app *BasecoinApp) initBaseAppTxDecoder() { + cdc := makeTxCodec() + app.BaseApp.SetTxDecoder(func(txBytes []byte) (sdk.Tx, sdk.Error) { + var tx = sdk.StdTx{} + // StdTx.Msg is an interface whose concrete + // types are registered in app/msgs.go. + err := cdc.UnmarshalBinary(txBytes, &tx) + if err != nil { + return nil, sdk.ErrTxParse("").TraceCause(err, "") + } + return tx, nil + }) +} + +// define the custom logic for basecoin initialization +func (app *BasecoinApp) initBaseAppInitStater() { + accountMapper := app.accountMapper + + app.BaseApp.SetInitStater(func(ctx sdk.Context, state json.RawMessage) sdk.Error { + if state == nil { + return nil + } + + genesisState := new(types.GenesisState) + err := json.Unmarshal(state, genesisState) + if err != nil { + return sdk.ErrGenesisParse("").TraceCause(err, "") + } + + for _, gacc := range genesisState.Accounts { + acc, err := gacc.ToAppAccount() + if err != nil { + return sdk.ErrGenesisParse("").TraceCause(err, "") + } + accountMapper.SetAccount(ctx, acc) + } + return nil + }) +} + +// Initialize root stores. +func (app *BasecoinApp) mountStores() { + + // Create MultiStore mounts. + app.BaseApp.MountStore(app.capKeyMainStore, sdk.StoreTypeIAVL) + app.BaseApp.MountStore(app.capKeyIBCStore, sdk.StoreTypeIAVL) +} + +// Initialize the AccountMapper. +func (app *BasecoinApp) initAccountMapper() { + + var accountMapper = auth.NewAccountMapper( + app.capKeyMainStore, // target store + &types.AppAccount{}, // prototype + ) + + // Register all interfaces and concrete types that + // implement those interfaces, here. + cdc := accountMapper.WireCodec() + auth.RegisterWireBaseAccount(cdc) + + // Make accountMapper's WireCodec() inaccessible. + app.accountMapper = accountMapper.Seal() +} + func NewBasecoinApp(genesisPath string) *BasecoinApp { - // Create and configure app. + // create and configure app var app = &BasecoinApp{} + bapp := bam.NewBaseApp(appName) + app.BaseApp = bapp + app.router = bapp.Router() + app.initBaseAppTxDecoder() - // TODO open up out of functions, or introduce clarity, - // interdependancies are a nightmare to debug - app.initCapKeys() // ./init_capkeys.go - app.initBaseApp() // ./init_baseapp.go - app.initStores() // ./init_stores.go + // add keys + app.initCapKeys() + + // initialize the stores + app.mountStores() + app.initAccountMapper() + + // initialize the genesis function app.initBaseAppInitStater() - app.initHandlers() // ./init_handlers.go - genesisiDoc, err := bam.GenesisDocFromFile(genesisPath) + // initialize the handler + app.initDefaultAnteHandler() + app.initRouterHandlers() + + genesisAppState, err := bam.ReadGenesisAppState(genesisPath) if err != nil { panic(fmt.Errorf("error loading genesis state: %v", err)) } // set up the cache store for ctx, get ctx - // TODO: can InitChain handle this too ? + // TODO: combine with InitChain and let tendermint invoke it. app.BaseApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{}}) ctx := app.BaseApp.NewContext(false, nil) // context for DeliverTx - - // TODO: combine with InitChain and let tendermint invoke it. - err = app.BaseApp.InitStater(ctx, genesisiDoc.AppState) + err = app.BaseApp.InitStater(ctx, genesisAppState) if err != nil { panic(fmt.Errorf("error initializing application genesis state: %v", err)) } - app.loadStores() - - return app -} - -// RunForever - BasecoinApp execution and cleanup -func (app *BasecoinApp) RunForever() { - - // Start the ABCI server - srv, err := server.NewServer("0.0.0.0:46658", "socket", app) - if err != nil { - cmn.Exit(err.Error()) - } - srv.Start() - - // Wait forever - cmn.TrapSignal(func() { - // Cleanup - srv.Stop() - }) - -} - -// Load the stores -func (app *BasecoinApp) loadStores() { + // load the stores if err := app.LoadLatestVersion(app.capKeyMainStore); err != nil { cmn.Exit(err.Error()) } + + return app } diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 2e0f24982b..2014fef7c8 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/examples/basecoin/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" @@ -15,6 +16,20 @@ import ( crypto "github.com/tendermint/go-crypto" ) +type testBasecoinApp struct { + *BasecoinApp + *bam.TestApp +} + +func newTestBasecoinApp() *testBasecoinApp { + app := NewBasecoinApp("") + tba := &testBasecoinApp{ + BasecoinApp: app, + } + tba.TestApp = bam.NewTestApp(app.BaseApp) + return tba +} + func TestSendMsg(t *testing.T) { tba := newTestBasecoinApp() tba.RunBeginBlock() @@ -62,9 +77,9 @@ func TestGenesis(t *testing.T) { } acc := &types.AppAccount{baseAcc, "foobart"} - genesisState := GenesisState{ - Accounts: []*GenesisAccount{ - NewGenesisAccount(acc), + genesisState := types.GenesisState{ + Accounts: []*types.GenesisAccount{ + types.NewGenesisAccount(acc), }, } bytes, err := json.MarshalIndent(genesisState, "", "\t") diff --git a/examples/basecoin/app/init_baseapp.go b/examples/basecoin/app/init_baseapp.go deleted file mode 100644 index 4ab701a9ff..0000000000 --- a/examples/basecoin/app/init_baseapp.go +++ /dev/null @@ -1,94 +0,0 @@ -package app - -import ( - "encoding/json" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/examples/basecoin/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - crypto "github.com/tendermint/go-crypto" -) - -// initCapKeys, initBaseApp, initStores, initHandlers. -func (app *BasecoinApp) initBaseApp() { - bapp := baseapp.NewBaseApp(appName) - app.BaseApp = bapp - app.router = bapp.Router() - app.initBaseAppTxDecoder() - app.initBaseAppInitStater() -} - -func (app *BasecoinApp) initBaseAppTxDecoder() { - cdc := makeTxCodec() - app.BaseApp.SetTxDecoder(func(txBytes []byte) (sdk.Tx, sdk.Error) { - var tx = sdk.StdTx{} - // StdTx.Msg is an interface whose concrete - // types are registered in app/msgs.go. - err := cdc.UnmarshalBinary(txBytes, &tx) - if err != nil { - return nil, sdk.ErrTxParse("").TraceCause(err, "") - } - return tx, nil - }) -} - -// define the custom logic for basecoin initialization -func (app *BasecoinApp) initBaseAppInitStater() { - accountMapper := app.accountMapper - - app.BaseApp.SetInitStater(func(ctx sdk.Context, state json.RawMessage) sdk.Error { - if state == nil { - return nil - } - - genesisState := new(GenesisState) - err := json.Unmarshal(state, genesisState) - if err != nil { - return sdk.ErrGenesisParse("").TraceCause(err, "") - } - - for _, gacc := range genesisState.Accounts { - acc, err := gacc.toAppAccount() - if err != nil { - return sdk.ErrGenesisParse("").TraceCause(err, "") - } - accountMapper.SetAccount(ctx, acc) - } - return nil - }) -} - -//----------------------------------------------------- - -// State to Unmarshal -type GenesisState struct { - Accounts []*GenesisAccount `accounts` -} - -// GenesisAccount doesn't need pubkey or sequence -type GenesisAccount struct { - Name string `json:"name"` - Address crypto.Address `json:"address"` - Coins sdk.Coins `json:"coins"` -} - -func NewGenesisAccount(aa *types.AppAccount) *GenesisAccount { - return &GenesisAccount{ - Name: aa.Name, - Address: aa.Address, - Coins: aa.Coins, - } -} - -// convert GenesisAccount to AppAccount -func (ga *GenesisAccount) toAppAccount() (acc *types.AppAccount, err error) { - baseAcc := auth.BaseAccount{ - Address: ga.Address, - Coins: ga.Coins, - } - return &types.AppAccount{ - BaseAccount: baseAcc, - Name: ga.Name, - }, nil -} diff --git a/examples/basecoin/app/init_capkeys.go b/examples/basecoin/app/init_capkeys.go deleted file mode 100644 index 7327c61843..0000000000 --- a/examples/basecoin/app/init_capkeys.go +++ /dev/null @@ -1,16 +0,0 @@ -package app - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// initCapKeys, initBaseApp, initStores, initHandlers. -func (app *BasecoinApp) initCapKeys() { - - // All top-level capabilities keys - // should be constructed here. - // For more information, see http://www.erights.org/elib/capability/ode/ode.pdf. - app.capKeyMainStore = sdk.NewKVStoreKey("main") - app.capKeyIBCStore = sdk.NewKVStoreKey("ibc") - -} diff --git a/examples/basecoin/app/init_handlers.go b/examples/basecoin/app/init_handlers.go deleted file mode 100644 index 62831514b1..0000000000 --- a/examples/basecoin/app/init_handlers.go +++ /dev/null @@ -1,30 +0,0 @@ -package app - -import ( - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/sketchy" -) - -// initCapKeys, initBaseApp, initStores, initHandlers. -func (app *BasecoinApp) initHandlers() { - app.initDefaultAnteHandler() - app.initRouterHandlers() -} - -func (app *BasecoinApp) initDefaultAnteHandler() { - - // Deducts fee from payer. - // Verifies signatures and nonces. - // Sets Signers to ctx. - app.BaseApp.SetDefaultAnteHandler( - auth.NewAnteHandler(app.accountMapper)) -} - -func (app *BasecoinApp) initRouterHandlers() { - - // All handlers must be added here. - // The order matters. - app.router.AddRoute("bank", bank.NewHandler(bank.NewCoinKeeper(app.accountMapper))) - app.router.AddRoute("sketchy", sketchy.NewHandler()) -} diff --git a/examples/basecoin/app/init_stores.go b/examples/basecoin/app/init_stores.go deleted file mode 100644 index e819ecd2c5..0000000000 --- a/examples/basecoin/app/init_stores.go +++ /dev/null @@ -1,38 +0,0 @@ -package app - -import ( - "github.com/cosmos/cosmos-sdk/examples/basecoin/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" -) - -// initCapKeys, initBaseApp, initStores, initHandlers. -func (app *BasecoinApp) initStores() { - app.mountStores() - app.initAccountMapper() -} - -// Initialize root stores. -func (app *BasecoinApp) mountStores() { - - // Create MultiStore mounts. - app.BaseApp.MountStore(app.capKeyMainStore, sdk.StoreTypeIAVL) - app.BaseApp.MountStore(app.capKeyIBCStore, sdk.StoreTypeIAVL) -} - -// Initialize the AccountMapper. -func (app *BasecoinApp) initAccountMapper() { - - var accountMapper = auth.NewAccountMapper( - app.capKeyMainStore, // target store - &types.AppAccount{}, // prototype - ) - - // Register all interfaces and concrete types that - // implement those interfaces, here. - cdc := accountMapper.WireCodec() - auth.RegisterWireBaseAccount(cdc) - - // Make accountMapper's WireCodec() inaccessible. - app.accountMapper = accountMapper.Seal() -} diff --git a/examples/basecoin/app/msgs.go b/examples/basecoin/app/msgs.go index a8ec883bdf..c1273dfbce 100644 --- a/examples/basecoin/app/msgs.go +++ b/examples/basecoin/app/msgs.go @@ -6,7 +6,7 @@ import ( wire "github.com/tendermint/go-wire" ) -// Wire requires registration of interfaces & concrete types. All +// Wire requires registration of interfaces & concrete types. All // interfaces to be encoded/decoded in a Msg must be registered // here, along with all the concrete types that implement them. func makeTxCodec() (cdc *wire.Codec) { diff --git a/examples/basecoin/app/testapp.go b/examples/basecoin/app/testapp.go deleted file mode 100644 index 8603911d51..0000000000 --- a/examples/basecoin/app/testapp.go +++ /dev/null @@ -1,19 +0,0 @@ -package app - -import ( - bam "github.com/cosmos/cosmos-sdk/baseapp" -) - -type testBasecoinApp struct { - *BasecoinApp - *bam.TestApp -} - -func newTestBasecoinApp() *testBasecoinApp { - app := NewBasecoinApp("") - tba := &testBasecoinApp{ - BasecoinApp: app, - } - tba.TestApp = bam.NewTestApp(app.BaseApp) - return tba -} diff --git a/examples/basecoin/cmd/basecoind/main.go b/examples/basecoin/cmd/basecoind/main.go index 623bb35e45..dff41d0b81 100644 --- a/examples/basecoin/cmd/basecoind/main.go +++ b/examples/basecoin/cmd/basecoind/main.go @@ -1,10 +1,13 @@ package main -import "github.com/cosmos/cosmos-sdk/examples/basecoin/app" +import ( + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/examples/basecoin/app" +) func main() { // TODO CREATE CLI bapp := app.NewBasecoinApp("") - bapp.RunForever() + baseapp.RunForever(bapp) } diff --git a/examples/basecoin/types/account.go b/examples/basecoin/types/account.go index d4bc7fba41..3177f99122 100644 --- a/examples/basecoin/types/account.go +++ b/examples/basecoin/types/account.go @@ -4,7 +4,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" crypto "github.com/tendermint/go-crypto" - cmn "github.com/tendermint/tmlibs/common" ) var _ sdk.Account = (*AppAccount)(nil) @@ -25,36 +24,31 @@ func (acc *AppAccount) SetName(name string) { acc.Name = name } //___________________________________________________________________________________ -// We use GenesisAccount instead of AppAccount for cleaner json input of PubKey +// State to Unmarshal +type GenesisState struct { + Accounts []*GenesisAccount `json:"accounts"` +} + +// GenesisAccount doesn't need pubkey or sequence type GenesisAccount struct { - Name string `json:"name"` - Address crypto.Address `json:"address"` - Coins sdk.Coins `json:"coins"` - PubKey cmn.HexBytes `json:"public_key"` - Sequence int64 `json:"sequence"` + Name string `json:"name"` + Address crypto.Address `json:"address"` + Coins sdk.Coins `json:"coins"` } func NewGenesisAccount(aa *AppAccount) *GenesisAccount { return &GenesisAccount{ - Name: aa.Name, - Address: aa.Address, - Coins: aa.Coins, - PubKey: aa.PubKey.Bytes(), - Sequence: aa.Sequence, + Name: aa.Name, + Address: aa.Address, + Coins: aa.Coins, } } // convert GenesisAccount to AppAccount -func (ga *GenesisAccount) toAppAccount() (acc *AppAccount, err error) { - pk, err := crypto.PubKeyFromBytes(ga.PubKey) - if err != nil { - return - } +func (ga *GenesisAccount) ToAppAccount() (acc *AppAccount, err error) { baseAcc := auth.BaseAccount{ - Address: ga.Address, - Coins: ga.Coins, - PubKey: pk, - Sequence: ga.Sequence, + Address: ga.Address, + Coins: ga.Coins, } return &AppAccount{ BaseAccount: baseAcc,