diff --git a/client/cmd/eris-client.go b/client/cmd/eris-client.go index 0c7585230a93199ff8d06b68039404340a21c38e..f073141998de883a7134df05199485f30b5e53e0 100644 --- a/client/cmd/eris-client.go +++ b/client/cmd/eris-client.go @@ -62,6 +62,10 @@ func AddGlobalFlags() { func AddClientCommands() { ErisClientCmd.AddCommand(buildTransactionCommand()) ErisClientCmd.AddCommand(buildStatusCommand()) + + buildGenesisGenCommand() + ErisClientCmd.AddCommand(GenesisGenCmd) + } //------------------------------------------------------------------------------ diff --git a/client/cmd/genesis.go b/client/cmd/genesis.go new file mode 100644 index 0000000000000000000000000000000000000000..ad8d01216b3fdcbc1304c7e8787581e533a49403 --- /dev/null +++ b/client/cmd/genesis.go @@ -0,0 +1,39 @@ +package commands + +import ( + "fmt" + + "github.com/eris-ltd/eris-db/genesis" + + "github.com/spf13/cobra" +) + +// TODO refactor these vars into a struct? +var ( + AccountsPathFlag string + ValidatorsPathFlag string +) + +var GenesisGenCmd = &cobra.Command{ + Use: "make-genesis", + Short: "eris-client make-genesis creates a genesis.json with known inputs", + Long: "eris-client make-genesis creates a genesis.json with known inputs", + + Run: func(cmd *cobra.Command, args []string) { + // TODO refactor to not panic + genesisFile, err := genesis.GenerateKnown(args[0], AccountsPathFlag, ValidatorsPathFlag) + if err != nil { + panic(err) + } + fmt.Println(genesisFile) // may want to save somewhere instead + }, +} + +func buildGenesisGenCommand() { + addGenesisPersistentFlags() +} + +func addGenesisPersistentFlags() { + GenesisGenCmd.Flags().StringVarP(&AccountsPathFlag, "accounts", "", "", "path to accounts.csv with the following params: (pubkey, starting balance, name, permissions, setbit") + GenesisGenCmd.Flags().StringVarP(&ValidatorsPathFlag, "validators", "", "", "path to validators.csv with the following params: (pubkey, starting balance, name, permissions, setbit") +} diff --git a/client/cmd/transaction.go b/client/cmd/transaction.go index a527577481c7fec56dc87ac25383cbfef6b7f3f7..e020c0ac12cbee9d99d63c7e314b295fe91c2980 100644 --- a/client/cmd/transaction.go +++ b/client/cmd/transaction.go @@ -23,6 +23,8 @@ import ( "github.com/eris-ltd/eris-db/client/methods" "github.com/eris-ltd/eris-db/util" + + "github.com/eris-ltd/eris-db/client/transaction" ) func buildTransactionCommand() *cobra.Command { diff --git a/client/transaction/transaction.go b/client/transaction/transaction.go new file mode 100644 index 0000000000000000000000000000000000000000..a004d5de327934dfa03eca93a9bcbcdf58c21c8a --- /dev/null +++ b/client/transaction/transaction.go @@ -0,0 +1,96 @@ +// Copyright 2015, 2016 Eris Industries (UK) Ltd. +// This file is part of Eris-RT + +// Eris-RT is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Eris-RT is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Eris-RT. If not, see <http://www.gnu.org/licenses/>. + +package transaction + +import ( + "fmt" + "os" + + "github.com/eris-ltd/eris-cli/log" + + "github.com/eris-ltd/eris-db/client" + "github.com/eris-ltd/eris-db/client/core" + "github.com/eris-ltd/eris-db/definitions" + "github.com/eris-ltd/eris-db/keys" +) + +func Send(do *definitions.ClientDo) { + // construct two clients to call out to keys server and + // blockchain node. + erisKeyClient := keys.NewErisKeyClient(do.SignAddrFlag) + erisNodeClient := client.NewErisNodeClient(do.NodeAddrFlag) + // form the send transaction + sendTransaction, err := core.Send(erisNodeClient, erisKeyClient, + do.PubkeyFlag, do.AddrFlag, do.ToFlag, do.AmtFlag, do.NonceFlag) + if err != nil { + log.Fatalf("Failed on forming Send Transaction: %s", err) + return + } + // TODO: [ben] we carry over the sign bool, but always set it to true, + // as we move away from and deprecate the api that allows sending unsigned + // transactions and relying on (our) receiving node to sign it. + unpackSignAndBroadcast( + core.SignAndBroadcast(do.ChainidFlag, erisNodeClient, + erisKeyClient, sendTransaction, true, do.BroadcastFlag, do.WaitFlag)) +} + +func Call(do *definitions.ClientDo) { + // construct two clients to call out to keys server and + // blockchain node. + erisKeyClient := keys.NewErisKeyClient(do.SignAddrFlag) + erisNodeClient := client.NewErisNodeClient(do.NodeAddrFlag) + // form the call transaction + callTransaction, err := core.Call(erisNodeClient, erisKeyClient, + do.PubkeyFlag, do.AddrFlag, do.ToFlag, do.AmtFlag, do.NonceFlag, + do.GasFlag, do.FeeFlag, do.DataFlag) + if err != nil { + log.Fatalf("Failed on forming Call Transaction: %s", err) + return + } + // TODO: [ben] we carry over the sign bool, but always set it to true, + // as we move away from and deprecate the api that allows sending unsigned + // transactions and relying on (our) receiving node to sign it. + unpackSignAndBroadcast( + core.SignAndBroadcast(do.ChainidFlag, erisNodeClient, + erisKeyClient, callTransaction, true, do.BroadcastFlag, do.WaitFlag)) +} + +//---------------------------------------------------------------------- +// Helper functions + +func unpackSignAndBroadcast(result *core.TxResult, err error) { + if err != nil { + log.Fatalf("Failed on signing (and broadcasting) transaction: %s", err) + os.Exit(1) + } + if result == nil { + // if we don't provide --sign or --broadcast + return + } + printResult := log.Fields{ + "transaction hash": fmt.Sprintf("%X", result.Hash), + } + if result.Address != nil { + printResult["Contract Address"] = fmt.Sprintf("%X", result.Address) + } + if result.Return != nil { + printResult["Block Hash"] = fmt.Sprintf("%X", result.BlockHash) + printResult["Return Value"] = fmt.Sprintf("%X", result.Return) + printResult["Exception"] = fmt.Sprintf("%s", result.Exception) + } + log.WithFields(printResult).Warn("Result") +} diff --git a/genesis/gen_test.go b/genesis/gen_test.go new file mode 100644 index 0000000000000000000000000000000000000000..30d5f9c511df7efbd372c6a44814b1c0d64070c8 --- /dev/null +++ b/genesis/gen_test.go @@ -0,0 +1,162 @@ +package genesis + +import ( + "bytes" + "io/ioutil" + "os" + "path/filepath" + "testing" +) + +// set the chain ID +var chainID string = "genesis-file-maker-test" + +var genesisFileExpected string = `{ + "genesis_time": "0001-01-01T00:00:00.000Z", + "chain_id": "genesis-file-maker-test", + "params": null, + "accounts": [ + { + "address": "74417C1BEFB3938B71B22B202050A4C6591FFCF6", + "amount": 9999999999, + "name": "genesis-file-maker-test_developer_000", + "permissions": { + "base": { + "perms": 14430, + "set": 16383 + }, + "roles": [] + } + }, + { + "address": "0C9DAEA4046491A661FCE0B41B0CAA2AD3415268", + "amount": 99999999999999, + "name": "genesis-file-maker-test_full_000", + "permissions": { + "base": { + "perms": 16383, + "set": 16383 + }, + "roles": [] + } + }, + { + "address": "E1BD50A1B90A15861F5CF0F182D291F556B21A86", + "amount": 9999999999, + "name": "genesis-file-maker-test_participant_000", + "permissions": { + "base": { + "perms": 2118, + "set": 16383 + }, + "roles": [] + } + }, + { + "address": "A6C8E2DE652DB8ADB4036293DC21F8FE389D77C2", + "amount": 9999999999, + "name": "genesis-file-maker-test_root_000", + "permissions": { + "base": { + "perms": 16383, + "set": 16383 + }, + "roles": [] + } + }, + { + "address": "E96CB7910001320B6F1E2266A8431D5E98FF0183", + "amount": 9999999999, + "name": "genesis-file-maker-test_validator_000", + "permissions": { + "base": { + "perms": 32, + "set": 16383 + }, + "roles": [] + } + } + ], + "validators": [ + { + "pub_key": [ + 1, + "238E1A77CC7CDCD13F4D77841F1FE4A46A77DB691EC89718CD0D4CB3409F61D2" + ], + "amount": 9999999999, + "name": "genesis-file-maker-test_full_000", + "unbond_to": [ + { + "address": "0C9DAEA4046491A661FCE0B41B0CAA2AD3415268", + "amount": 9999999999 + } + ] + }, + { + "pub_key": [ + 1, + "7F53D78C526F96C87ACBD0D2B9DB2E9FC176981623D26B1DB1CF59748EE9F4CF" + ], + "amount": 9999999998, + "name": "genesis-file-maker-test_validator_000", + "unbond_to": [ + { + "address": "E96CB7910001320B6F1E2266A8431D5E98FF0183", + "amount": 9999999998 + } + ] + } + ] +}` + +var accountsCSV string = `F0BD5CE45D306D61C9AB73CE5268C2B59D52CAF7127EF0E3B65523302254350A,9999999999,genesis-file-maker-test_developer_000,14430,16383 +238E1A77CC7CDCD13F4D77841F1FE4A46A77DB691EC89718CD0D4CB3409F61D2,99999999999999,genesis-file-maker-test_full_000,16383,16383 +E37A655E560D53721C9BB06BA742398323504DFE2EB2C67E71F8D16E71E0471B,9999999999,genesis-file-maker-test_participant_000,2118,16383 +EC0E38CC8308EC9E720EE839242A7BC5C781D1F852E962FAC5A8E0599CE5B224,9999999999,genesis-file-maker-test_root_000,16383,16383 +7F53D78C526F96C87ACBD0D2B9DB2E9FC176981623D26B1DB1CF59748EE9F4CF,9999999999,genesis-file-maker-test_validator_000,32,16383` + +var validatorsCSV string = `238E1A77CC7CDCD13F4D77841F1FE4A46A77DB691EC89718CD0D4CB3409F61D2,9999999999,genesis-file-maker-test_full_000,16383,16383 +7F53D78C526F96C87ACBD0D2B9DB2E9FC176981623D26B1DB1CF59748EE9F4CF,9999999998,genesis-file-maker-test_validator_000,32,16383` + +func TestKnownCSV(t *testing.T) { + // make temp dir + dir, err := ioutil.TempDir(os.TempDir(), "genesis-file-maker-test") + if err != nil { + t.Fatal(err) + } + + defer func() { + //cleanup + os.RemoveAll(dir) + if err != nil { + t.Fatal(err) + } + + }() + + // set the filepaths to be written to + accountsCSVpath := filepath.Join(dir, "accounts.csv") + validatorsCSVpath := filepath.Join(dir, "validators.csv") + + // write the accounts.csv + if err := ioutil.WriteFile(accountsCSVpath, []byte(accountsCSV), 0600); err != nil { + t.Fatal(err) + } + + // write the validators.csv + if err := ioutil.WriteFile(validatorsCSVpath, []byte(validatorsCSV), 0600); err != nil { + t.Fatal(err) + } + + // create the genesis file + genesisFileWritten, err := GenerateKnown(chainID, accountsCSVpath, validatorsCSVpath) + if err != nil { + t.Fatal(err) + } + + // compare + if !bytes.Equal([]byte(genesisFileExpected), []byte(genesisFileWritten)) { + t.Fatalf("Bad genesis file: got (%s), expected (%s)", genesisFileWritten, genesisFileExpected) + } + +} diff --git a/genesis/make_genesis_file.go b/genesis/make_genesis_file.go new file mode 100644 index 0000000000000000000000000000000000000000..c4324366ccf4f1c6195684ce32c59592ddc37712 --- /dev/null +++ b/genesis/make_genesis_file.go @@ -0,0 +1,199 @@ +package genesis + +import ( + "bytes" + "encoding/csv" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "strconv" + + ptypes "github.com/eris-ltd/eris-db/permission/types" + "github.com/eris-ltd/eris-db/util" + + "github.com/tendermint/go-crypto" + wire "github.com/tendermint/go-wire" +) + +//------------------------------------------------------------------------------------ +// core functions + +func GenerateKnown(chainID, accountsPathCSV, validatorsPathCSV string) (string, error) { + 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) + if err != nil { + return "", err + } + + pubkeysA, amtsA, namesA, permsA, setbitsA, err := parseCsv(accountsPathCSV) + if err != nil { + return "", err + } + + genDoc = newGenDoc(chainID, len(pubkeys), len(pubkeysA)) + for i, pk := range pubkeys { + genDocAddValidator(genDoc, pk, amts[i], names[i], perms[i], setbits[i], i) + } + for i, pk := range pubkeysA { + genDocAddAccount(genDoc, pk, amtsA[i], namesA[i], permsA[i], setbitsA[i], i) + } + + buf, buf2, n := new(bytes.Buffer), new(bytes.Buffer), new(int) + wire.WriteJSON(genDoc, buf, n, &err) + if err != nil { + return "", err + } + if err := json.Indent(buf2, buf.Bytes(), "", "\t"); err != nil { + return "", err + } + + return buf2.String(), nil +} + +//----------------------------------------------------------------------------- +// gendoc convenience functions + +func newGenDoc(chainID string, nVal, nAcc int) *GenesisDoc { + genDoc := GenesisDoc{ + ChainID: chainID, + // GenesisTime: time.Now(), + } + genDoc.Accounts = make([]GenesisAccount, nAcc) + genDoc.Validators = make([]GenesisValidator, nVal) + return &genDoc +} + +func genDocAddAccount(genDoc *GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) { + addr := pubKey.Address() + acc := GenesisAccount{ + Address: addr, + Amount: amt, + Name: name, + Permissions: &ptypes.AccountPermissions{ + Base: ptypes.BasePermissions{ + Perms: perm, + SetBit: setbit, + }, + }, + } + if index < 0 { + genDoc.Accounts = append(genDoc.Accounts, acc) + } else { + genDoc.Accounts[index] = acc + } +} + +func genDocAddValidator(genDoc *GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) { + addr := pubKey.Address() + genDoc.Validators[index] = GenesisValidator{ + PubKey: pubKey, + Amount: amt, + Name: name, + UnbondTo: []BasicAccount{ + { + Address: addr, + Amount: amt, + }, + }, + } + // [zr] why no index < 0 like in genDocAddAccount? +} + +//----------------------------------------------------------------------------- +// util functions + +// convert hex strings to ed25519 pubkeys +func pubKeyStringsToPubKeys(pubkeys []string) ([]crypto.PubKeyEd25519, error) { + pubKeys := make([]crypto.PubKeyEd25519, len(pubkeys)) + for i, k := range pubkeys { + pubBytes, err := hex.DecodeString(k) + if err != nil { + return pubKeys, err + } + copy(pubKeys[i][:], pubBytes) + } + return pubKeys, nil +} + +// empty is over written +func ifExistsElse(list []string, index int, defaultValue string) string { + if len(list) > index { + if list[index] != "" { + return list[index] + } + } + return defaultValue +} + +// takes a csv in the following format: pubkey, starting balance, name, permissions, setbit +func parseCsv(filePath string) (pubKeys []crypto.PubKeyEd25519, amts []int64, names []string, perms, setbits []ptypes.PermFlag, err error) { + + csvFile, err := os.Open(filePath) + if err != nil { + util.Fatalf("Couldn't open file: %s: %v", filePath, err) + } + defer csvFile.Close() + + r := csv.NewReader(csvFile) + //r.FieldsPerRecord = # of records expected + params, err := r.ReadAll() + if err != nil { + util.Fatalf("Couldn't read file: %v", err) + + } + + pubkeys := make([]string, len(params)) + amtS := make([]string, len(params)) + names = make([]string, len(params)) + permsS := make([]string, len(params)) + setbitS := make([]string, len(params)) + for i, each := range params { + pubkeys[i] = each[0] + amtS[i] = ifExistsElse(each, 1, "1000") + names[i] = ifExistsElse(each, 2, "") + permsS[i] = ifExistsElse(each, 3, fmt.Sprintf("%d", ptypes.DefaultPermFlags)) + setbitS[i] = ifExistsElse(each, 4, permsS[i]) + } + + //TODO convert int to uint64, see issue #25 + perms = make([]ptypes.PermFlag, len(permsS)) + for i, perm := range permsS { + pflag, err := strconv.Atoi(perm) + if err != nil { + util.Fatalf("Permissions (%v) must be an integer", perm) + } + perms[i] = ptypes.PermFlag(pflag) + } + setbits = make([]ptypes.PermFlag, len(setbitS)) + for i, setbit := range setbitS { + setbitsFlag, err := strconv.Atoi(setbit) + if err != nil { + util.Fatalf("SetBits (%v) must be an integer", setbit) + } + setbits[i] = ptypes.PermFlag(setbitsFlag) + } + + // convert amts to ints + amts = make([]int64, len(amtS)) + for i, a := range amtS { + if amts[i], err = strconv.ParseInt(a, 10, 64); err != nil { + err = fmt.Errorf("Invalid amount: %v", err) + return + } + } + + // convert pubkey hex strings to struct + pubKeys, err = pubKeyStringsToPubKeys(pubkeys) + if err != nil { + return + } + + return pubKeys, amts, names, perms, setbits, nil +} 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/eris-mint.go b/manager/eris-mint/eris-mint.go index 6a79b82eacdaaa0c628c3ab2598c08155f2b2533..90f9af757bd1548845b1e304e7953a12289f6948 100644 --- a/manager/eris-mint/eris-mint.go +++ b/manager/eris-mint/eris-mint.go @@ -27,6 +27,7 @@ import ( "github.com/eris-ltd/eris-db/logging" "github.com/eris-ltd/eris-db/logging/loggers" + sm "github.com/eris-ltd/eris-db/manager/eris-mint/state" manager_types "github.com/eris-ltd/eris-db/manager/types" "github.com/eris-ltd/eris-db/txs" diff --git a/manager/eris-mint/pipe.go b/manager/eris-mint/pipe.go index 121f9fa4387854697913d9d2be4df6a16b7aa3fd..014de66207a1c2b0f27de336016d15291f9c8de6 100644 --- a/manager/eris-mint/pipe.go +++ b/manager/eris-mint/pipe.go @@ -36,11 +36,11 @@ import ( core_types "github.com/eris-ltd/eris-db/core/types" "github.com/eris-ltd/eris-db/definitions" edb_event "github.com/eris-ltd/eris-db/event" + genesis "github.com/eris-ltd/eris-db/genesis" "github.com/eris-ltd/eris-db/logging" "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" 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 {