diff --git a/genesis/make_genesis_file.go b/genesis/make_genesis_file.go index 79454fe948de2d3240d190ec5d3f97646fa463fb..99d626d8b57b3e5a34f96eb603f365af1a4acdd0 100644 --- a/genesis/make_genesis_file.go +++ b/genesis/make_genesis_file.go @@ -10,7 +10,6 @@ import ( "strconv" "github.com/eris-ltd/common/go/common" - stypes "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" ptypes "github.com/eris-ltd/eris-db/permission/types" "github.com/tendermint/go-crypto" @@ -21,12 +20,11 @@ import ( // core functions func GenerateKnown(chainID, accountsPathCSV, validatorsPathCSV string) (string, error) { - var genDoc *stypes.GenesisDoc + var genDoc *GenesisDoc // TODO [eb] eliminate reading priv_val ... [zr] where? if accountsPathCSV == "" || validatorsPathCSV == "" { return "", fmt.Errorf("both accounts.csv and validators.csv is required") - } pubkeys, amts, names, perms, setbits, err := parseCsv(validatorsPathCSV) @@ -62,19 +60,19 @@ func GenerateKnown(chainID, accountsPathCSV, validatorsPathCSV string) (string, //----------------------------------------------------------------------------- // gendoc convenience functions -func newGenDoc(chainID string, nVal, nAcc int) *stypes.GenesisDoc { - genDoc := stypes.GenesisDoc{ +func newGenDoc(chainID string, nVal, nAcc int) *GenesisDoc { + genDoc := GenesisDoc{ ChainID: chainID, // GenesisTime: time.Now(), } - genDoc.Accounts = make([]stypes.GenesisAccount, nAcc) - genDoc.Validators = make([]stypes.GenesisValidator, nVal) + genDoc.Accounts = make([]GenesisAccount, nAcc) + genDoc.Validators = make([]GenesisValidator, nVal) return &genDoc } -func genDocAddAccount(genDoc *stypes.GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) { +func genDocAddAccount(genDoc *GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) { addr := pubKey.Address() - acc := stypes.GenesisAccount{ + acc := GenesisAccount{ Address: addr, Amount: amt, Name: name, @@ -92,13 +90,13 @@ func genDocAddAccount(genDoc *stypes.GenesisDoc, pubKey crypto.PubKeyEd25519, am } } -func genDocAddValidator(genDoc *stypes.GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) { +func genDocAddValidator(genDoc *GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) { addr := pubKey.Address() - genDoc.Validators[index] = stypes.GenesisValidator{ + genDoc.Validators[index] = GenesisValidator{ PubKey: pubKey, Amount: amt, Name: name, - UnbondTo: []stypes.BasicAccount{ + UnbondTo: []BasicAccount{ { Address: addr, Amount: amt, diff --git a/genesis/types.go b/genesis/types.go new file mode 100644 index 0000000000000000000000000000000000000000..d03e6197645b67ab9f306a9d71106a2ab0d7b338 --- /dev/null +++ b/genesis/types.go @@ -0,0 +1,67 @@ +package genesis + +import ( + "fmt" + "os" + "time" + + ptypes "github.com/eris-ltd/eris-db/permission/types" + "github.com/tendermint/go-crypto" + "github.com/tendermint/go-wire" +) + +//------------------------------------------------------------ +// we store the GenesisDoc in the db under this key + +var GenDocKey = []byte("GenDocKey") + +//------------------------------------------------------------ +// core types for a genesis definition + +type BasicAccount struct { + Address []byte `json:"address"` + Amount int64 `json:"amount"` +} + +type GenesisAccount struct { + Address []byte `json:"address"` + Amount int64 `json:"amount"` + Name string `json:"name"` + Permissions *ptypes.AccountPermissions `json:"permissions"` +} + +type GenesisValidator struct { + PubKey crypto.PubKey `json:"pub_key"` + Amount int64 `json:"amount"` + Name string `json:"name"` + UnbondTo []BasicAccount `json:"unbond_to"` +} + +type GenesisParams struct { + GlobalPermissions *ptypes.AccountPermissions `json:"global_permissions"` +} + +//------------------------------------------------------------ +// GenesisDoc is stored in the state database + +type GenesisDoc struct { + GenesisTime time.Time `json:"genesis_time"` + ChainID string `json:"chain_id"` + Params *GenesisParams `json:"params"` + Accounts []GenesisAccount `json:"accounts"` + Validators []GenesisValidator `json:"validators"` +} + +//------------------------------------------------------------ +// Make genesis state from file + +func GenesisDocFromJSON(jsonBlob []byte) (genState *GenesisDoc) { + var err error + wire.ReadJSONPtr(&genState, jsonBlob, &err) + if err != nil { + fmt.Printf("Couldn't read GenesisDoc: %v", err) + // TODO: on error return error, not exit + os.Exit(1) + } + return +} diff --git a/manager/eris-mint/pipe.go b/manager/eris-mint/pipe.go index 121f9fa4387854697913d9d2be4df6a16b7aa3fd..be62592e8af54d258cdb65f5d6222ba372d3c0e3 100644 --- a/manager/eris-mint/pipe.go +++ b/manager/eris-mint/pipe.go @@ -40,7 +40,7 @@ import ( "github.com/eris-ltd/eris-db/logging/loggers" vm "github.com/eris-ltd/eris-db/manager/eris-mint/evm" "github.com/eris-ltd/eris-db/manager/eris-mint/state" - state_types "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" + genesis "github.com/eris-ltd/eris-db/genesis" manager_types "github.com/eris-ltd/eris-db/manager/types" rpc_tm_types "github.com/eris-ltd/eris-db/rpc/tendermint/core/types" "github.com/eris-ltd/eris-db/txs" @@ -57,7 +57,7 @@ type erisMintPipe struct { namereg *namereg transactor *transactor // Genesis cache - genesisDoc *state_types.GenesisDoc + genesisDoc *genesis.GenesisDoc genesisState *state.State logger loggers.InfoTraceLogger } @@ -142,7 +142,7 @@ func NewErisMintPipe(moduleConfig *config.ModuleConfig, // If no state can be loaded, the JSON genesis file will be loaded into the // state database as the zero state. func startState(dataDir, backend, genesisFile, chainId string) (*state.State, - *state_types.GenesisDoc, error) { + *genesis.GenesisDoc, error) { // avoid Tendermints PanicSanity and return a clean error if backend != db.DBBackendMemDB && backend != db.DBBackendLevelDB { @@ -152,18 +152,18 @@ func startState(dataDir, backend, genesisFile, chainId string) (*state.State, stateDB := db.NewDB("erismint", backend, dataDir) newState := state.LoadState(stateDB) - var genesisDoc *state_types.GenesisDoc + var genesisDoc *genesis.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()) + stateDB.Set(genesis.GenDocKey, buf.Bytes()) if *err != nil { return nil, nil, fmt.Errorf("Unable to write genesisDoc to db: %v", err) } } else { - loadedGenesisDocBytes := stateDB.Get(state_types.GenDocKey) + loadedGenesisDocBytes := stateDB.Get(genesis.GenDocKey) err := new(error) wire.ReadJSONPtr(&genesisDoc, loadedGenesisDocBytes, err) if *err != nil { diff --git a/manager/eris-mint/state/genesis_test.go b/manager/eris-mint/state/genesis_test.go index 73e7f92f4d4ad04f135f1270f6173dc5cae61832..3bc2fdf005fc50686e698ef061a1340def5e8619 100644 --- a/manager/eris-mint/state/genesis_test.go +++ b/manager/eris-mint/state/genesis_test.go @@ -9,7 +9,7 @@ import ( "time" acm "github.com/eris-ltd/eris-db/account" - . "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" + genesis "github.com/eris-ltd/eris-db/genesis" ptypes "github.com/eris-ltd/eris-db/permission/types" . "github.com/tendermint/go-common" @@ -60,7 +60,7 @@ var g1 = fmt.Sprintf(` `, chain_id, addr1, amt1, accName, perms, setbit, roles1[0], roles1[1]) func TestGenesisReadable(t *testing.T) { - genDoc := GenesisDocFromJSON([]byte(g1)) + genDoc := genesis.GenesisDocFromJSON([]byte(g1)) if genDoc.ChainID != chain_id { t.Fatalf("Incorrect chain id. Got %d, expected %d\n", genDoc.ChainID, chain_id) } @@ -82,7 +82,7 @@ func TestGenesisReadable(t *testing.T) { } func TestGenesisMakeState(t *testing.T) { - genDoc := GenesisDocFromJSON([]byte(g1)) + genDoc := genesis.GenesisDocFromJSON([]byte(g1)) db := tdb.NewMemDB() st := MakeGenesisState(db, genDoc) acc := st.GetAccount(addr1) @@ -118,27 +118,27 @@ func RandAccount(randBalance bool, minBalance int64) (*acm.Account, *acm.PrivAcc return acc, privAccount } -func RandGenesisDoc(numAccounts int, randBalance bool, minBalance int64, numValidators int, randBonded bool, minBonded int64) (*GenesisDoc, []*acm.PrivAccount, []*types.PrivValidator) { - accounts := make([]GenesisAccount, numAccounts) +func RandGenesisDoc(numAccounts int, randBalance bool, minBalance int64, numValidators int, randBonded bool, minBonded int64) (*genesis.GenesisDoc, []*acm.PrivAccount, []*types.PrivValidator) { + accounts := make([]genesis.GenesisAccount, numAccounts) privAccounts := make([]*acm.PrivAccount, numAccounts) defaultPerms := ptypes.DefaultAccountPermissions for i := 0; i < numAccounts; i++ { account, privAccount := RandAccount(randBalance, minBalance) - accounts[i] = GenesisAccount{ + accounts[i] = genesis.GenesisAccount{ Address: account.Address, Amount: account.Balance, Permissions: &defaultPerms, // This will get copied into each state.Account. } privAccounts[i] = privAccount } - validators := make([]GenesisValidator, numValidators) + validators := make([]genesis.GenesisValidator, numValidators) privValidators := make([]*types.PrivValidator, numValidators) for i := 0; i < numValidators; i++ { valInfo, privVal := types.RandValidator(randBonded, minBonded) - validators[i] = GenesisValidator{ + validators[i] = genesis.GenesisValidator{ PubKey: valInfo.PubKey, Amount: valInfo.VotingPower, - UnbondTo: []BasicAccount{ + UnbondTo: []genesis.BasicAccount{ { Address: valInfo.PubKey.Address(), Amount: valInfo.VotingPower, @@ -148,7 +148,7 @@ func RandGenesisDoc(numAccounts int, randBalance bool, minBalance int64, numVali privValidators[i] = privVal } sort.Sort(types.PrivValidatorsByAddress(privValidators)) - return &GenesisDoc{ + return &genesis.GenesisDoc{ GenesisTime: time.Now(), ChainID: "tendermint_test", Accounts: accounts, diff --git a/manager/eris-mint/state/permissions_test.go b/manager/eris-mint/state/permissions_test.go index 523a5ffc8b2a75a13749c8ba924d4c6ded2e824a..b57a4fbc475116f33beddfa7493ea7fc5d7170b3 100644 --- a/manager/eris-mint/state/permissions_test.go +++ b/manager/eris-mint/state/permissions_test.go @@ -10,7 +10,7 @@ import ( acm "github.com/eris-ltd/eris-db/account" "github.com/eris-ltd/eris-db/manager/eris-mint/evm" - . "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" + genesis "github.com/eris-ltd/eris-db/genesis" ptypes "github.com/eris-ltd/eris-db/permission/types" "github.com/eris-ltd/eris-db/txs" @@ -111,30 +111,30 @@ var ( PermsAllFalse = ptypes.ZeroAccountPermissions ) -func newBaseGenDoc(globalPerm, accountPerm ptypes.AccountPermissions) GenesisDoc { - genAccounts := []GenesisAccount{} +func newBaseGenDoc(globalPerm, accountPerm ptypes.AccountPermissions) genesis.GenesisDoc { + genAccounts := []genesis.GenesisAccount{} for _, u := range user[:5] { accountPermCopy := accountPerm // Create new instance for custom overridability. - genAccounts = append(genAccounts, GenesisAccount{ + genAccounts = append(genAccounts, genesis.GenesisAccount{ Address: u.Address, Amount: 1000000, Permissions: &accountPermCopy, }) } - return GenesisDoc{ + return genesis.GenesisDoc{ GenesisTime: time.Now(), ChainID: chainID, - Params: &GenesisParams{ + Params: &genesis.GenesisParams{ GlobalPermissions: &globalPerm, }, Accounts: genAccounts, - Validators: []GenesisValidator{ - GenesisValidator{ + Validators: []genesis.GenesisValidator{ + genesis.GenesisValidator{ PubKey: user[0].PubKey.(crypto.PubKeyEd25519), Amount: 10, - UnbondTo: []BasicAccount{ - BasicAccount{ + UnbondTo: []genesis.BasicAccount{ + genesis.BasicAccount{ Address: user[0].Address, }, }, diff --git a/manager/eris-mint/state/state.go b/manager/eris-mint/state/state.go index 20106e3386d7818d681ebebaa8e8a2c24379b1e1..09e9a8d87cbe0f467b47713d0f177806134c99f5 100644 --- a/manager/eris-mint/state/state.go +++ b/manager/eris-mint/state/state.go @@ -8,7 +8,7 @@ import ( "time" acm "github.com/eris-ltd/eris-db/account" - . "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" + genesis "github.com/eris-ltd/eris-db/genesis" ptypes "github.com/eris-ltd/eris-db/permission/types" "github.com/eris-ltd/eris-db/txs" @@ -156,9 +156,9 @@ func (s *State) ComputeBlockStateHash(block *types.Block) error { } */ -func (s *State) GetGenesisDoc() (*GenesisDoc, error) { - var genesisDoc *GenesisDoc - loadedGenesisDocBytes := s.DB.Get(GenDocKey) +func (s *State) GetGenesisDoc() (*genesis.GenesisDoc, error) { + var genesisDoc *genesis.GenesisDoc + loadedGenesisDocBytes := s.DB.Get(genesis.GenDocKey) err := new(error) wire.ReadJSONPtr(&genesisDoc, loadedGenesisDocBytes, err) if *err != nil { @@ -401,16 +401,16 @@ func (s *State) SetFireable(evc events.Fireable) { //----------------------------------------------------------------------------- // Genesis -func MakeGenesisStateFromFile(db dbm.DB, genDocFile string) (*GenesisDoc, *State) { +func MakeGenesisStateFromFile(db dbm.DB, genDocFile string) (*genesis.GenesisDoc, *State) { jsonBlob, err := ioutil.ReadFile(genDocFile) if err != nil { util.Fatalf("Couldn't read GenesisDoc file: %v", err) } - genDoc := GenesisDocFromJSON(jsonBlob) + genDoc := genesis.GenesisDocFromJSON(jsonBlob) return genDoc, MakeGenesisState(db, genDoc) } -func MakeGenesisState(db dbm.DB, genDoc *GenesisDoc) *State { +func MakeGenesisState(db dbm.DB, genDoc *genesis.GenesisDoc) *State { if len(genDoc.Validators) == 0 { util.Fatalf("The genesis file has no validators") } diff --git a/rpc/tendermint/core/types/responses.go b/rpc/tendermint/core/types/responses.go index c6494d919f3868507d562eeb3c0f0c30aa831f2e..98b72fbbd200d120c46c834a02d5cc237ff6b5a4 100644 --- a/rpc/tendermint/core/types/responses.go +++ b/rpc/tendermint/core/types/responses.go @@ -3,7 +3,7 @@ package types import ( acm "github.com/eris-ltd/eris-db/account" core_types "github.com/eris-ltd/eris-db/core/types" - stypes "github.com/eris-ltd/eris-db/manager/eris-mint/state/types" + genesis "github.com/eris-ltd/eris-db/genesis" "github.com/eris-ltd/eris-db/txs" tendermint_types "github.com/tendermint/tendermint/types" @@ -126,7 +126,7 @@ type ResultGetName struct { } type ResultGenesis struct { - Genesis *stypes.GenesisDoc `json:"genesis"` + Genesis *genesis.GenesisDoc `json:"genesis"` } type ResultSignTx struct {