Refactor basecoin example (#332)

Refactor basecoin example
This commit is contained in:
Jae Kwon
2018-01-17 16:59:40 -08:00
committed by GitHub
parent fdc7316fda
commit 14a0dce920
11 changed files with 297 additions and 125 deletions
+97
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -1,99 +0,0 @@
package main
import (
"fmt"
"os"
"github.com/cosmos/cosmos-sdk/app"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/bank"
"github.com/tendermint/abci/server"
"github.com/tendermint/go-wire"
cmn "github.com/tendermint/tmlibs/common"
dbm "github.com/tendermint/tmlibs/db"
bcm "github.com/cosmos/cosmos-sdk/examples/basecoin/types"
)
func main() {
// 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)
// The key to access the main KVStore.
var mainStoreKey = sdk.NewKVStoreKey("main")
var ibcStoreKey = sdk.NewKVStoreKey("ibc")
// Create MultiStore
multiStore := store.NewCommitMultiStore(db)
multiStore.SetSubstoreLoader(mainStoreKey, mainLoader)
multiStore.SetSubstoreLoader(ibcStoreKey, ibcLoader)
// Create the Application.
app := app.NewApp("basecoin", multiStore)
// Set Tx decoder
app.SetTxDecoder(decodeTx)
var accStore = auth.NewAccountStore(mainStoreKey, bcm.AppAccountCodec{})
var authAnteHandler = auth.NewAnteHandler(accStore)
// Handle charging fees and checking signatures.
app.SetDefaultAnteHandler(authAnteHandler)
// Add routes to App.
app.Router().AddRoute("bank", bank.NewHandler(accStore))
// TODO: load genesis
// TODO: InitChain with validators
// accounts := auth.NewAccountStore(multiStore.GetKVStore("main"))
// TODO: set the genesis accounts
// Load the stores.
if err := app.LoadLatestVersion(mainStoreKey); err != nil {
fmt.Println(err)
os.Exit(1)
}
// 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()
})
return
}
//----------------------------------------
// Misc.
func registerMsgs() {
wire.RegisterInterface((*sdk.Msg)(nil), nil)
wire.RegisterConcrete(&bank.SendMsg{}, "com.cosmos.basecoin.send_msg", nil)
}
func decodeTx(txBytes []byte) (sdk.Tx, error) {
var tx = sdk.StdTx{}
err := wire.UnmarshalBinary(txBytes, &tx)
return tx, err
}