diff --git a/manager/eris-mint/eris-mint_test.go b/manager/eris-mint/eris-mint_test.go index 8919ad4fc176a48bde74d2102caa80590bd61c78..cc3a7a8815b1259525c5239fe9b91bc1fcc352d7 100644 --- a/manager/eris-mint/eris-mint_test.go +++ b/manager/eris-mint/eris-mint_test.go @@ -17,7 +17,6 @@ package erismint import ( - "fmt" "testing" assert "github.com/stretchr/testify/assert" diff --git a/manager/eris-mint/pipe.go b/manager/eris-mint/pipe.go index 5fb7f499feef2972f80a81cf21e8df6119fed077..30a3081923bcf650b056843f21abc944258cd79e 100644 --- a/manager/eris-mint/pipe.go +++ b/manager/eris-mint/pipe.go @@ -16,10 +16,66 @@ package erismint +import ( + "bytes" + "fmt" + + db "github.com/tendermint/go-db" + wire "github.com/tendermint/go-wire" + + config "github.com/eris-ltd/eris-db/config" + state "github.com/eris-ltd/eris-db/manager/eris-mint/state" + state_types "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" +) + type ErisMintPipe struct { + erisMintState *state.State +} +func NewErisMintPipe(moduleConfig *config.ModuleConfig, + genesisFile string) (*ErisMintPipe, error) { + + startedState, err := startState(moduleConfig.DataDir, + moduleConfig.Config.GetString("db_backend"), genesisFile) + if err != nil { + return nil, fmt.Errorf("Failed to start state: %v", err) + } + return &ErisMintPipe{ + erisMintState: startedState, + }, nil } -func NewErisMintPipe() *ErisMintPipe { - return &ErisMintPipe{} +//------------------------------------------------------------------------------ +// Start state + +func startState(dataDir, backend, genesisFile string) (*state.State, error) { + // avoid Tendermints PanicSanity and return a clean error + if backend != db.DBBackendMemDB && + backend != db.DBBackendLevelDB { + return nil, fmt.Errorf("Dababase backend %s is not supported by %s", + backend, GetErisMintVersion) + } + + stateDB := db.NewDB("erismint", backend, dataDir) + newState := state.LoadState(stateDB) + var genesisDoc *state_types.GenesisDoc + if newState == nil { + genesisDoc, newState = state.MakeGenesisStateFromFile(stateDB, genesisFile) + newState.Save() + buf, n, err := new(bytes.Buffer), new(int), new(error) + wire.WriteJSON(genesisDoc, buf, n, err) + stateDB.Set(state_types.GenDocKey, buf.Bytes()) + if *err != nil { + return nil, fmt.Errorf("Unable to write genesisDoc to db: %v", err) + } + } else { + genDocBytes := stateDB.Get(state_types.GenDocKey) + err := new(error) + wire.ReadJSONPtr(&genesisDoc, genDocBytes, err) + if *err != nil { + return nil, fmt.Errorf("Unable to read genesisDoc from db: %v", err) + } + } + + return newState, nil } diff --git a/manager/manager.go b/manager/manager.go index 07a662f8d47c709ccf08c9a37058c5faf9e5065e..3aab6d88df722b9ec950040c029c2d54dc208a77 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -34,9 +34,11 @@ func NewApplication(moduleConfig *config.ModuleConfig, error) { switch moduleConfig.Name { case "erismint" : - if err := erismint.AssertCompatibleConsensus(consensusMinorVersion); err != nil { + if err := erismint.AssertCompatibleConsensus(consensusMinorVersion); + err != nil { return nil, err } + return newErisMintPH(moduleConfig) } return nil, fmt.Errorf("PLACEHOLDER") diff --git a/server_config.toml b/server_config.toml index 6d04451f1c88ffa0473a91f3e3ef9b1f9e1a4ef8..3227f7b9bbb99c44ec7c6a142de06ad94b3c7daf 100644 --- a/server_config.toml +++ b/server_config.toml @@ -25,6 +25,9 @@ assert_chain_id = "MyChainId" # semantic major and minor version major_version = 0 minor_version = 12 +# genesis file, relative path is to eris-db working directory +genesis_file = "genesis.json" + ############################################################################### ## @@ -168,3 +171,6 @@ listener = "tcp://0.0.0.0:46658" ################################################################################ [erismint] +# Database backend to use for ErisMint state database. +# Supported `leveldb` and `memdb`. +db_backend = "leveldb"