@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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{},
|
||||
)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user