Skip to content

Commit

Permalink
Refactor basecoin example (#332)
Browse files Browse the repository at this point in the history
Refactor basecoin example
  • Loading branch information
jaekwon committed Jan 18, 2018
1 parent fdc7316 commit 14a0dce
Show file tree
Hide file tree
Showing 11 changed files with 291 additions and 119 deletions.
2 changes: 2 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,8 @@ func (app *App) runTx(isCheckTx bool, txBytes []byte) (result sdk.Result) {
}
}

// TODO: override default ante handler w/ custom ante handler.

// Run the ante handler.
ctx, result, abort := app.defaultAnteHandler(ctx, tx)
if isCheckTx || abort {
Expand Down
97 changes: 97 additions & 0 deletions examples/basecoin/app/basecoin_app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package app

import (
"fmt"
"os"

apm "github.com/cosmos/cosmos-sdk/app"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/tendermint/abci/server"
"github.com/tendermint/go-wire"
cmn "github.com/tendermint/tmlibs/common"
)

const appName = "BasecoinApp"

type BasecoinApp struct {
*apm.App
cdc *wire.Codec
multiStore sdk.CommitMultiStore

// The key to access the substores.
mainStoreKey *sdk.KVStoreKey
ibcStoreKey *sdk.KVStoreKey

// Additional stores:
accStore sdk.AccountStore
}

// TODO: This should take in more configuration options.
func NewBasecoinApp() *BasecoinApp {

// Create and configure app.
var app = &BasecoinApp{}
app.initKeys()
app.initMultiStore()
app.initAppStore()
app.initSDKApp()
app.initCodec()
app.initTxDecoder()
app.initAnteHandler()
app.initRoutes()

// TODO: Load genesis
// TODO: InitChain with validators
// TODO: Set the genesis accounts
app.loadStores()

return app
}

func (app *BasecoinApp) RunForever() {

// Start the ABCI server
srv, err := server.NewServer("0.0.0.0:46658", "socket", app)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
srv.Start()

// Wait forever
cmn.TrapSignal(func() {
// Cleanup
srv.Stop()
})

}

func (app *BasecoinApp) initKeys() {
app.mainStoreKey = sdk.NewKVStoreKey("main")
app.ibcStoreKey = sdk.NewKVStoreKey("ibc")
}

// depends on initMultiStore()
func (app *BasecoinApp) initSDKApp() {
app.App = apm.NewApp(appName, app.multiStore)
}

func (app *BasecoinApp) initCodec() {
app.cdc = wire.NewCodec()
}

// depends on initSDKApp()
func (app *BasecoinApp) initTxDecoder() {
app.App.SetTxDecoder(app.decodeTx)
}

// initAnteHandler defined in app/routes.go
// initRoutes defined in app/routes.go

// Load the stores.
func (app *BasecoinApp) loadStores() {
if err := app.LoadLatestVersion(app.mainStoreKey); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
28 changes: 28 additions & 0 deletions examples/basecoin/app/msgs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package app

import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/bank"
)

// Set via `app.App.SetTxDecoder(app.decodeTx)`
func (app *BasecoinApp) decodeTx(txBytes []byte) (sdk.Tx, error) {
var tx = sdk.StdTx{}
err := app.cdc.UnmarshalBinary(txBytes, &tx)
return tx, err
}

// Wire requires registration of interfaces & concrete types.
func (app *BasecoinApp) registerMsgs() {
cdc := app.cdc

// Register the Msg interface.
cdc.RegisterInterface((*sdk.Msg)(nil), nil)
cdc.RegisterConcrete(bank.SendMsg{}, "cosmos-sdk/SendMsg", nil) // XXX refactor out
cdc.RegisterConcrete(bank.IssueMsg{}, "cosmos-sdk/IssueMsg", nil) // XXX refactor out to bank/msgs.go
// more msgs here...

// All interfaces to be encoded/decoded in a Msg must be
// registered here, along with all the concrete types that
// implement them.
}
22 changes: 22 additions & 0 deletions examples/basecoin/app/routes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package app

import (
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/bank"
)

// Handle charging tx fees and checking signatures.
func (app *BasecoinApp) initAnteHandler() {
var authAnteHandler = auth.NewAnteHandler(app.accStore)
app.App.SetDefaultAnteHandler(authAnteHandler)
}

// Constructs router to route handling of msgs.
func (app *BasecoinApp) initRoutes() {
var router = app.App.Router()
// var multiStore = app.multiStore
var accStore = app.accStore

router.AddRoute("bank", bank.NewHandler(accStore))
// more routes here... (order matters)
}
45 changes: 45 additions & 0 deletions examples/basecoin/app/stores.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package app

import (
"fmt"
"os"

"github.com/cosmos/cosmos-sdk/examples/basecoin/types"
"github.com/cosmos/cosmos-sdk/store"
"github.com/cosmos/cosmos-sdk/x/auth"
dbm "github.com/tendermint/tmlibs/db"
)

// depends on initKeys()
func (app *BasecoinApp) initMultiStore() {

// Create the underlying leveldb datastore which will
// persist the Merkle tree inner & leaf nodes.
db, err := dbm.NewGoLevelDB("basecoin", "basecoin-data")
if err != nil {
fmt.Println(err)
os.Exit(1)
}

// Create CommitStoreLoader.
cacheSize := 10000
numHistory := int64(100)
mainLoader := store.NewIAVLStoreLoader(db, cacheSize, numHistory)
ibcLoader := store.NewIAVLStoreLoader(db, cacheSize, numHistory)

// Create MultiStore
multiStore := store.NewCommitMultiStore(db)
multiStore.SetSubstoreLoader(app.mainStoreKey, mainLoader)
multiStore.SetSubstoreLoader(app.ibcStoreKey, ibcLoader)

// Finally,
app.multiStore = multiStore
}

// depends on initKeys()
func (app *BasecoinApp) initAppStore() {
app.accStore = auth.NewAccountStore(
app.mainStoreKey,
types.AppAccountCodec{},
)
}
99 changes: 0 additions & 99 deletions examples/basecoin/main.go

This file was deleted.

3 changes: 3 additions & 0 deletions store/rootmultistore.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ func NewCommitMultiStore(db dbm.DB) *rootMultiStore {

// Implements CommitMultiStore.
func (rs *rootMultiStore) SetSubstoreLoader(key SubstoreKey, loader CommitStoreLoader) {
if key == nil {
panic("SetSubstoreLoader() key cannot be nil")
}
if _, ok := rs.storeLoaders[key]; ok {
panic(fmt.Sprintf("rootMultiStore duplicate substore key", key))
}
Expand Down
2 changes: 2 additions & 0 deletions types/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,11 @@ type CommitMultiStore interface {
MultiStore

// Add a substore loader.
// Panics on a nil key.
SetSubstoreLoader(key SubstoreKey, loader CommitStoreLoader)

// Gets the substore, which is a CommitSubstore.
// Panics on a nil key.
GetSubstore(key SubstoreKey) CommitStore

// Load the latest persisted version.
Expand Down
2 changes: 1 addition & 1 deletion x/auth/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func NewAnteHandler(store sdk.AccountStore) sdk.AnteHandler {
}
}

// Check and incremenet sequence number.
// Check and increment sequence number.
seq := signerAcc.GetSequence()
if seq != sig.Sequence {
return ctx, sdk.Result{
Expand Down
Loading

0 comments on commit 14a0dce

Please sign in to comment.