diff --git a/.pending/improvements/gaia/4062-Remove-cmd-gaia b/.pending/improvements/gaia/4062-Remove-cmd-gaia new file mode 100644 index 0000000000..b0d5e7c9ec --- /dev/null +++ b/.pending/improvements/gaia/4062-Remove-cmd-gaia @@ -0,0 +1 @@ +#4066 Fix 'ExportGenesisFile() incorrectly overwrites genesis' diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index b71d6c1c2c..a245e9e515 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -15,6 +15,7 @@ import ( "time" "github.com/tendermint/tendermint/crypto/ed25519" + tmtypes "github.com/tendermint/tendermint/types" "github.com/stretchr/testify/require" @@ -992,6 +993,7 @@ trust-node = true func TestGaiadCollectGentxs(t *testing.T) { t.Parallel() + var customMaxBytes, customMaxGas int64 = 99999999, 1234567 f := NewFixtures(t) // Initialise temporary directories @@ -1011,6 +1013,15 @@ func TestGaiadCollectGentxs(t *testing.T) { // Run init f.GDInit(keyFoo) + // Customise genesis.json + + genFile := f.GenesisFile() + genDoc, err := tmtypes.GenesisDocFromFile(genFile) + require.NoError(t, err) + genDoc.ConsensusParams.Block.MaxBytes = customMaxBytes + genDoc.ConsensusParams.Block.MaxGas = customMaxGas + genDoc.SaveAs(genFile) + // Add account to genesis.json f.AddGenesisAccount(f.KeyAddress(keyFoo), startCoins) @@ -1020,6 +1031,11 @@ func TestGaiadCollectGentxs(t *testing.T) { // Collect gentxs from a custom directory f.CollectGenTxs(fmt.Sprintf("--gentx-dir=%s", gentxDir)) + genDoc, err = tmtypes.GenesisDocFromFile(genFile) + require.NoError(t, err) + require.Equal(t, genDoc.ConsensusParams.Block.MaxBytes, customMaxBytes) + require.Equal(t, genDoc.ConsensusParams.Block.MaxGas, customMaxGas) + f.Cleanup(gentxDir) } diff --git a/cmd/gaia/cli_test/test_helpers.go b/cmd/gaia/cli_test/test_helpers.go index 010fd05d5b..656c2f80a6 100644 --- a/cmd/gaia/cli_test/test_helpers.go +++ b/cmd/gaia/cli_test/test_helpers.go @@ -15,10 +15,10 @@ import ( "github.com/stretchr/testify/require" cmn "github.com/tendermint/tendermint/libs/common" + tmtypes "github.com/tendermint/tendermint/types" clientkeys "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" - appInit "github.com/cosmos/cosmos-sdk/cmd/gaia/init" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/server" @@ -98,7 +98,7 @@ func (f Fixtures) GenesisFile() string { // GenesisFile returns the application's genesis state func (f Fixtures) GenesisState() app.GenesisState { cdc := codec.New() - genDoc, err := appInit.LoadGenesisDoc(cdc, f.GenesisFile()) + genDoc, err := tmtypes.GenesisDocFromFile(f.GenesisFile()) require.NoError(f.T, err) var appState app.GenesisState diff --git a/cmd/gaia/init/collect.go b/cmd/gaia/init/collect.go index 8586394868..0ad58252d9 100644 --- a/cmd/gaia/init/collect.go +++ b/cmd/gaia/init/collect.go @@ -46,7 +46,7 @@ func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { return err } - genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile()) + genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) if err != nil { return err } @@ -59,7 +59,7 @@ func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { toPrint := newPrintInfo(config.Moniker, genDoc.ChainID, nodeID, genTxsDir, json.RawMessage("")) initCfg := newInitConfig(genDoc.ChainID, genTxsDir, name, nodeID, valPubKey) - appMessage, err := genAppStateFromConfig(cdc, config, initCfg, genDoc) + appMessage, err := genAppStateFromConfig(cdc, config, initCfg, *genDoc) if err != nil { return err } @@ -82,7 +82,6 @@ func genAppStateFromConfig( cdc *codec.Codec, config *cfg.Config, initCfg initConfig, genDoc types.GenesisDoc, ) (appState json.RawMessage, err error) { - genFile := config.GenesisFile() var ( appGenTxs []auth.StdTx persistentPeers string @@ -116,7 +115,8 @@ func genAppStateFromConfig( return } - err = ExportGenesisFile(genFile, initCfg.ChainID, nil, appState) + genDoc.AppState = appState + err = ExportGenesisFile(&genDoc, config.GenesisFile()) return } diff --git a/cmd/gaia/init/genesis_accts.go b/cmd/gaia/init/genesis_accts.go index 5aa73dae94..79748f1ea0 100644 --- a/cmd/gaia/init/genesis_accts.go +++ b/cmd/gaia/init/genesis_accts.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/viper" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" @@ -58,7 +59,7 @@ func AddGenesisAccountCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command return fmt.Errorf("%s does not exist, run `gaiad init` first", genFile) } - genDoc, err := LoadGenesisDoc(cdc, genFile) + genDoc, err := tmtypes.GenesisDocFromFile(genFile) if err != nil { return err } @@ -78,7 +79,8 @@ func AddGenesisAccountCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command return err } - return ExportGenesisFile(genFile, genDoc.ChainID, nil, appStateJSON) + genDoc.AppState = appStateJSON + return ExportGenesisFile(genDoc, genFile) }, } diff --git a/cmd/gaia/init/gentx.go b/cmd/gaia/init/gentx.go index 970c77e0d8..b873cd88b5 100644 --- a/cmd/gaia/init/gentx.go +++ b/cmd/gaia/init/gentx.go @@ -17,6 +17,7 @@ import ( "github.com/tendermint/tendermint/crypto" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" @@ -79,7 +80,7 @@ following delegation and commission default parameters: "the tx's memo field will be unset") } - genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile()) + genDoc, err := tmtypes.GenesisDocFromFile(config.GenesisFile()) if err != nil { return err } diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index 506557d3f6..b539c86323 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -11,6 +11,7 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" @@ -76,7 +77,22 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { // nolint: return err } - if err = ExportGenesisFile(genFile, chainID, nil, appState); err != nil { + genDoc := &types.GenesisDoc{} + if _, err := os.Stat(genFile); err != nil { + if !os.IsNotExist(err) { + return err + } + } else { + genDoc, err = types.GenesisDocFromFile(genFile) + if err != nil { + return err + } + } + + genDoc.ChainID = chainID + genDoc.Validators = nil + genDoc.AppState = appState + if err = ExportGenesisFile(genDoc, genFile); err != nil { return err } diff --git a/cmd/gaia/init/testnet.go b/cmd/gaia/init/testnet.go index 334286335a..670dbc8013 100644 --- a/cmd/gaia/init/testnet.go +++ b/cmd/gaia/init/testnet.go @@ -306,12 +306,12 @@ func collectGenFiles( nodeID, valPubKey := nodeIDs[i], valPubKeys[i] initCfg := newInitConfig(chainID, gentxsDir, moniker, nodeID, valPubKey) - genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile()) + genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) if err != nil { return err } - nodeAppState, err := genAppStateFromConfig(cdc, config, initCfg, genDoc) + nodeAppState, err := genAppStateFromConfig(cdc, config, initCfg, *genDoc) if err != nil { return err } diff --git a/cmd/gaia/init/utils.go b/cmd/gaia/init/utils.go index 4e2f2f26f2..ce43781c71 100644 --- a/cmd/gaia/init/utils.go +++ b/cmd/gaia/init/utils.go @@ -3,11 +3,9 @@ package init import ( "encoding/json" "fmt" - "io/ioutil" "path/filepath" "time" - amino "github.com/tendermint/go-amino" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/libs/common" @@ -22,16 +20,7 @@ import ( // ExportGenesisFile creates and writes the genesis configuration to disk. An // error is returned if building or writing the configuration to file fails. -func ExportGenesisFile( - genFile, chainID string, validators []types.GenesisValidator, appState json.RawMessage, -) error { - - genDoc := types.GenesisDoc{ - ChainID: chainID, - Validators: validators, - AppState: appState, - } - +func ExportGenesisFile(genDoc *types.GenesisDoc, genFile string) error { if err := genDoc.ValidateAndComplete(); err != nil { return err } @@ -88,20 +77,6 @@ func InitializeNodeValidatorFiles( return nodeID, valPubKey, nil } -// LoadGenesisDoc reads and unmarshals GenesisDoc from the given file. -func LoadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc types.GenesisDoc, err error) { - genContents, err := ioutil.ReadFile(genFile) - if err != nil { - return genDoc, err - } - - if err := cdc.UnmarshalJSON(genContents, &genDoc); err != nil { - return genDoc, err - } - - return genDoc, err -} - func initializeEmptyGenesis( cdc *codec.Codec, genFile, chainID string, overwrite bool, ) (appState json.RawMessage, err error) { diff --git a/cmd/gaia/init/utils_test.go b/cmd/gaia/init/utils_test.go index 3a5a136903..87dfabd4d6 100644 --- a/cmd/gaia/init/utils_test.go +++ b/cmd/gaia/init/utils_test.go @@ -2,13 +2,10 @@ package init import ( "encoding/json" - "fmt" - "os" "path/filepath" "testing" "time" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/tests" "github.com/stretchr/testify/require" @@ -22,28 +19,3 @@ func TestExportGenesisFileWithTime(t *testing.T) { fname := filepath.Join(dir, "genesis.json") require.NoError(t, ExportGenesisFileWithTime(fname, "test", nil, json.RawMessage(""), time.Now())) } - -func TestLoadGenesisDoc(t *testing.T) { - t.Parallel() - dir, cleanup := tests.NewTestCaseDir(t) - defer cleanup() - - fname := filepath.Join(dir, "genesis.json") - require.NoError(t, ExportGenesisFileWithTime(fname, "test", nil, json.RawMessage(""), time.Now())) - - _, err := LoadGenesisDoc(codec.Cdc, fname) - require.NoError(t, err) - - // Non-existing file - _, err = LoadGenesisDoc(codec.Cdc, "non-existing-file") - require.Error(t, err) - - malformedFilename := filepath.Join(dir, "malformed") - malformedFile, err := os.Create(malformedFilename) - require.NoError(t, err) - fmt.Fprint(malformedFile, "invalidjson") - malformedFile.Close() - // Non-existing file - _, err = LoadGenesisDoc(codec.Cdc, malformedFilename) - require.Error(t, err) -} diff --git a/cmd/gaia/init/validate_genesis.go b/cmd/gaia/init/validate_genesis.go index e98fdbedad..0f7303691e 100644 --- a/cmd/gaia/init/validate_genesis.go +++ b/cmd/gaia/init/validate_genesis.go @@ -31,8 +31,8 @@ func ValidateGenesisCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { //nolint fmt.Fprintf(os.Stderr, "validating genesis file at %s\n", genesis) - var genDoc types.GenesisDoc - if genDoc, err = LoadGenesisDoc(cdc, genesis); err != nil { + var genDoc *types.GenesisDoc + if genDoc, err = types.GenesisDocFromFile(genesis); err != nil { return fmt.Errorf("Error loading genesis doc from %s: %s", genesis, err.Error()) }