Merge pull request #481 from cosmos/bez/refactor-db-app

R4R: Update database and baseapp Initialization
This commit is contained in:
Alexander Bezobchuk 2018-09-07 16:31:46 -04:00 committed by GitHub
commit 6e1a73bcad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 47 deletions

View File

@ -2,6 +2,7 @@ package app
import ( import (
bam "github.com/cosmos/cosmos-sdk/baseapp" bam "github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/wire"
"github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth"
@ -13,6 +14,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/cosmos/ethermint/handlers" "github.com/cosmos/ethermint/handlers"
"github.com/cosmos/ethermint/state"
"github.com/cosmos/ethermint/types" "github.com/cosmos/ethermint/types"
ethcmn "github.com/ethereum/go-ethereum/common" ethcmn "github.com/ethereum/go-ethereum/common"
@ -35,8 +37,10 @@ type (
*bam.BaseApp *bam.BaseApp
codec *wire.Codec codec *wire.Codec
ethDB *state.Database
accountKey *sdk.KVStoreKey accountKey *sdk.KVStoreKey
storageKey *sdk.KVStoreKey
mainKey *sdk.KVStoreKey mainKey *sdk.KVStoreKey
stakeKey *sdk.KVStoreKey stakeKey *sdk.KVStoreKey
slashingKey *sdk.KVStoreKey slashingKey *sdk.KVStoreKey
@ -57,23 +61,36 @@ type (
// NewEthermintApp returns a reference to a new initialized Ethermint // NewEthermintApp returns a reference to a new initialized Ethermint
// application. // application.
func NewEthermintApp( func NewEthermintApp(logger tmlog.Logger, db dbm.DB, sdkAddr ethcmn.Address) *EthermintApp {
logger tmlog.Logger, db dbm.DB, sdkAddr ethcmn.Address, baseAppOpts ...func(*bam.BaseApp),
) *EthermintApp {
codec := CreateCodec() codec := CreateCodec()
app := &EthermintApp{ cms := store.NewCommitMultiStore(db)
BaseApp: bam.NewBaseApp(appName, logger, db, types.TxDecoder(codec, sdkAddr), baseAppOpts...),
codec: codec, baseAppOpts := []func(*bam.BaseApp){
accountKey: sdk.NewKVStoreKey("acc"), func(bApp *bam.BaseApp) { bApp.SetCMS(cms) },
mainKey: sdk.NewKVStoreKey("main"),
stakeKey: sdk.NewKVStoreKey("stake"),
slashingKey: sdk.NewKVStoreKey("slashing"),
govKey: sdk.NewKVStoreKey("gov"),
feeCollKey: sdk.NewKVStoreKey("fee"),
paramsKey: sdk.NewKVStoreKey("params"),
tParamsKey: sdk.NewTransientStoreKey("transient_params"),
} }
baseApp := bam.NewBaseApp(appName, logger, db, types.TxDecoder(codec, sdkAddr), baseAppOpts...)
app := &EthermintApp{
BaseApp: baseApp,
codec: codec,
accountKey: types.StoreKeyAccount,
storageKey: types.StoreKeyStorage,
mainKey: types.StoreKeyMain,
stakeKey: types.StoreKeyStake,
slashingKey: types.StoreKeySlashing,
govKey: types.StoreKeyGov,
feeCollKey: types.StoreKeyFeeColl,
paramsKey: types.StoreKeyParams,
tParamsKey: types.StoreKeyTransParams,
}
// create Ethereum state database
ethDB, err := state.NewDatabase(cms, db, state.DefaultStoreCacheSize)
if err != nil {
tmcmn.Exit(err.Error())
}
app.ethDB = ethDB
// set application keepers and mappers // set application keepers and mappers
app.accountMapper = auth.NewAccountMapper(codec, app.accountKey, auth.ProtoBaseAccount) app.accountMapper = auth.NewAccountMapper(codec, app.accountKey, auth.ProtoBaseAccount)
@ -108,7 +125,7 @@ func NewEthermintApp(
app.MountStoresIAVL( app.MountStoresIAVL(
app.mainKey, app.accountKey, app.stakeKey, app.slashingKey, app.mainKey, app.accountKey, app.stakeKey, app.slashingKey,
app.govKey, app.feeCollKey, app.paramsKey, app.govKey, app.feeCollKey, app.paramsKey, app.storageKey,
) )
app.MountStore(app.tParamsKey, sdk.StoreTypeTransient) app.MountStore(app.tParamsKey, sdk.StoreTypeTransient)

View File

@ -5,6 +5,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/ethermint/core" "github.com/cosmos/ethermint/core"
"github.com/cosmos/ethermint/types"
ethcmn "github.com/ethereum/go-ethereum/common" ethcmn "github.com/ethereum/go-ethereum/common"
ethstate "github.com/ethereum/go-ethereum/core/state" ethstate "github.com/ethereum/go-ethereum/core/state"
@ -16,20 +17,16 @@ import (
) )
var ( var (
// AccountsKey is the key used for storing Ethereum accounts in the Cosmos
// SDK multi-store.
AccountsKey = sdk.NewKVStoreKey("account")
// StorageKey is the key used for storing Ethereum contract storage in the
// Cosmos SDK multi-store.
StorageKey = sdk.NewKVStoreKey("storage")
// CodeKey is the key used for storing Ethereum contract code in the Cosmos // CodeKey is the key used for storing Ethereum contract code in the Cosmos
// SDK multi-store. // SDK multi-store.
CodeKey = sdk.NewKVStoreKey("code") CodeKey = sdk.NewKVStoreKey("code")
) )
const ( const (
// DefaultStoreCacheSize defines the default number of key/value pairs for
// the state stored in memory.
DefaultStoreCacheSize = 1024 * 1024
// codeSizeCacheSize is the number of codehash to size associations to // codeSizeCacheSize is the number of codehash to size associations to
// keep in cached memory. This is to address any DoS attempts on // keep in cached memory. This is to address any DoS attempts on
// EXTCODESIZE calls. // EXTCODESIZE calls.
@ -68,25 +65,8 @@ type Database struct {
// implements Ethereum's state.Database interface. An error is returned if the // implements Ethereum's state.Database interface. An error is returned if the
// latest state failed to load. The underlying storage structure is defined by // latest state failed to load. The underlying storage structure is defined by
// the Cosmos SDK IAVL tree. // the Cosmos SDK IAVL tree.
func NewDatabase(stateDB, codeDB dbm.DB, storeCacheSize int) (*Database, error) { func NewDatabase(stateStore store.CommitMultiStore, codeDB dbm.DB, storeCacheSize int) (*Database, error) {
// Initialize an implementation of Ethereum state.Database and create a db := &Database{stateStore: stateStore}
// Cosmos SDK multi-store.
db := &Database{
stateStore: store.NewCommitMultiStore(stateDB),
}
// currently do not prune any historical state
db.stateStore.SetPruning(sdk.PruneNothing)
// Create the underlying multi-store stores that will persist account and
// account storage data.
db.stateStore.MountStoreWithDB(AccountsKey, sdk.StoreTypeIAVL, nil)
db.stateStore.MountStoreWithDB(StorageKey, sdk.StoreTypeIAVL, nil)
// Load the latest account state from the Cosmos SDK multi-store.
if err := db.stateStore.LoadLatestVersion(); err != nil {
return nil, err
}
// Set the persistent Cosmos SDK Database and initialize an Ethereum // Set the persistent Cosmos SDK Database and initialize an Ethereum
// trie.Database using an EthereumDB as the underlying implementation of // trie.Database using an EthereumDB as the underlying implementation of
@ -135,8 +115,8 @@ func (db *Database) OpenTrie(root ethcmn.Hash) (ethstate.Trie, error) {
} }
if db.accountsCache == nil { if db.accountsCache == nil {
db.accountsCache = store.NewCacheKVStore(db.stateStore.GetCommitKVStore(AccountsKey)) db.accountsCache = store.NewCacheKVStore(db.stateStore.GetCommitKVStore(types.StoreKeyAccount))
db.storageCache = store.NewCacheKVStore(db.stateStore.GetCommitKVStore(StorageKey)) db.storageCache = store.NewCacheKVStore(db.stateStore.GetCommitKVStore(types.StoreKeyStorage))
} }
return &Trie{ return &Trie{

View File

@ -5,6 +5,9 @@ import (
"math/rand" "math/rand"
"time" "time"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/ethermint/types"
ethcmn "github.com/ethereum/go-ethereum/common" ethcmn "github.com/ethereum/go-ethereum/common"
dbm "github.com/tendermint/tendermint/libs/db" dbm "github.com/tendermint/tendermint/libs/db"
@ -28,10 +31,17 @@ func init() {
func newTestDatabase() *Database { func newTestDatabase() *Database {
memDB := dbm.NewMemDB() memDB := dbm.NewMemDB()
testDB, err := NewDatabase(memDB, memDB, 100) cms := store.NewCommitMultiStore(memDB)
cms.SetPruning(sdk.PruneNothing)
cms.MountStoreWithDB(types.StoreKeyAccount, sdk.StoreTypeIAVL, nil)
cms.MountStoreWithDB(types.StoreKeyStorage, sdk.StoreTypeIAVL, nil)
testDB, err := NewDatabase(cms, memDB, 100)
if err != nil { if err != nil {
panic(fmt.Sprintf("failed to create database: %v", err)) panic(fmt.Sprintf("failed to create database: %v", err))
} }
testDB.stateStore.LoadLatestVersion()
return testDB return testDB
} }

View File

@ -9,8 +9,12 @@ import (
"runtime/pprof" "runtime/pprof"
"syscall" "syscall"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/ethermint/state" "github.com/cosmos/ethermint/state"
"github.com/cosmos/ethermint/test/importer" "github.com/cosmos/ethermint/test/importer"
"github.com/cosmos/ethermint/types"
dbm "github.com/tendermint/tendermint/libs/db" dbm "github.com/tendermint/tendermint/libs/db"
) )
@ -52,7 +56,16 @@ func main() {
stateDB := dbm.NewDB("state", dbm.LevelDBBackend, *datadir) stateDB := dbm.NewDB("state", dbm.LevelDBBackend, *datadir)
codeDB := dbm.NewDB("code", dbm.LevelDBBackend, *datadir) codeDB := dbm.NewDB("code", dbm.LevelDBBackend, *datadir)
ethermintDB, err := state.NewDatabase(stateDB, codeDB, *cachesize) cms := store.NewCommitMultiStore(stateDB)
cms.SetPruning(sdk.PruneNothing)
cms.MountStoreWithDB(types.StoreKeyAccount, sdk.StoreTypeIAVL, nil)
cms.MountStoreWithDB(types.StoreKeyStorage, sdk.StoreTypeIAVL, nil)
if err := cms.LoadLatestVersion(); err != nil {
panic(fmt.Sprintf("failed to load state store: %v", err))
}
ethermintDB, err := state.NewDatabase(cms, codeDB, *cachesize)
if err != nil { if err != nil {
panic(fmt.Sprintf("failed to initialize geth Database: %v", err)) panic(fmt.Sprintf("failed to initialize geth Database: %v", err))
} }

16
types/store_keys.go Normal file
View File

@ -0,0 +1,16 @@
package types
import sdk "github.com/cosmos/cosmos-sdk/types"
// Application multi-store keys
var (
StoreKeyAccount = sdk.NewKVStoreKey("acc")
StoreKeyStorage = sdk.NewKVStoreKey("contract_storage")
StoreKeyMain = sdk.NewKVStoreKey("main")
StoreKeyStake = sdk.NewKVStoreKey("stake")
StoreKeySlashing = sdk.NewKVStoreKey("slashing")
StoreKeyGov = sdk.NewKVStoreKey("gov")
StoreKeyFeeColl = sdk.NewKVStoreKey("fee")
StoreKeyParams = sdk.NewKVStoreKey("params")
StoreKeyTransParams = sdk.NewTransientStoreKey("transient_params")
)