From 9e3ab6675b740286eb8b7cf08f8a3a5cbceb653f Mon Sep 17 00:00:00 2001 From: Benjamin Bollen <ben@erisindustries.com> Date: Tue, 31 May 2016 22:09:16 +0200 Subject: [PATCH] load genesis file in ErisMintPipe --- manager/eris-mint/eris-mint_test.go | 1 - manager/eris-mint/pipe.go | 60 ++++++++++++++++++++++++++++- manager/manager.go | 4 +- server_config.toml | 6 +++ 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/manager/eris-mint/eris-mint_test.go b/manager/eris-mint/eris-mint_test.go index 8919ad4f..cc3a7a88 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 5fb7f499..30a30819 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 07a662f8..3aab6d88 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 6d04451f..3227f7b9 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" -- GitLab