From b64a5239daf6d49b090fa7debb9990bba9e17733 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 15 May 2024 18:18:05 +0200 Subject: [PATCH 1/6] feat(rollkit): add rollkit init --- rollkit/cmd/add.go | 2 +- rollkit/cmd/cmd.go | 1 + rollkit/cmd/init.go | 103 ++++++++++++++++++++++++++++++++++++++++++++ rollkit/go.mod | 6 +-- rollkit/go.sum | 2 + 5 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 rollkit/cmd/init.go diff --git a/rollkit/cmd/add.go b/rollkit/cmd/add.go index eb80088a..fbfef3fd 100644 --- a/rollkit/cmd/add.go +++ b/rollkit/cmd/add.go @@ -59,7 +59,7 @@ func NewRollkitAdd() *cobra.Command { return err } - session.Printf("\nšŸŽ‰ RollKit added (`%[1]v`).\n\n", chain.AppPath()) + session.Printf("šŸŽ‰ RollKit added (`%[1]v`).\n Use `ignite rollkit init` to init `%s`\n", chain.AppPath(), chain.Name()) return nil }, } diff --git a/rollkit/cmd/cmd.go b/rollkit/cmd/cmd.go index 07b8d6b4..c255e8ce 100644 --- a/rollkit/cmd/cmd.go +++ b/rollkit/cmd/cmd.go @@ -16,6 +16,7 @@ func NewRollkit() *cobra.Command { // add sub commands. c.AddCommand( NewRollkitAdd(), + NewRollkitInit(), ) return c } diff --git a/rollkit/cmd/init.go b/rollkit/cmd/init.go new file mode 100644 index 00000000..5b7f3947 --- /dev/null +++ b/rollkit/cmd/init.go @@ -0,0 +1,103 @@ +package cmd + +import ( + "os" + "path/filepath" + + "github.com/cometbft/cometbft/crypto" + cmtjson "github.com/cometbft/cometbft/libs/json" + cmprivval "github.com/cometbft/cometbft/privval" + cmttypes "github.com/cometbft/cometbft/types" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/pkg/errors" + "github.com/spf13/cobra" + + "github.com/ignite/cli/v28/ignite/pkg/cliui" + "github.com/ignite/cli/v28/ignite/pkg/cliui/colors" + "github.com/ignite/cli/v28/ignite/services/chain" +) + +func NewRollkitInit() *cobra.Command { + c := &cobra.Command{ + Use: "init", + Short: "Init rollkit support", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.End() + + appPath, err := cmd.Flags().GetString(flagPath) + if err != nil { + return err + } + absPath, err := filepath.Abs(appPath) + if err != nil { + return err + } + + rollkitChain, err := chain.New(absPath) + if err != nil { + return err + } + + if err := rollkitChain.Init(cmd.Context(), chain.InitArgsAll); err != nil { + return err + } + + home, err := rollkitChain.Home() + if err != nil { + return err + } + + // modify genesis (add sequencer) + genesisPath, err := rollkitChain.GenesisPath() + if err != nil { + return err + } + + genesis, err := genutiltypes.AppGenesisFromFile(genesisPath) + if err != nil { + return err + } + + pubKey, err := getPubKey(home) + if err != nil { + return err + } + + genesis.Consensus.Validators = []cmttypes.GenesisValidator{ + { + Name: "Rollkit Sequencer", + Address: pubKey.Address(), + PubKey: pubKey, + Power: 1000, + }, + } + + if err := genesis.SaveAs(genesisPath); err != nil { + return err + } + + return session.Printf("šŸ—ƒ Initialized. Checkout your rollkit chain's home (data) directory: %s\n", colors.Info(home)) + }, + } + + c.Flags().StringP(flagPath, "p", ".", "path of the app") + + return c +} + +// getPubKey returns the validator public key. +func getPubKey(chainHome string) (crypto.PubKey, error) { + keyFilePath := filepath.Join(chainHome, "config", "priv_validator_key.json") + keyJSONBytes, err := os.ReadFile(keyFilePath) + if err != nil { + return nil, err + } + var pvKey cmprivval.FilePVKey + err = cmtjson.Unmarshal(keyJSONBytes, &pvKey) + if err != nil { + return nil, errors.Errorf("error reading PrivValidator key from %v: %s", keyFilePath, err) + } + return pvKey.PubKey, nil +} diff --git a/rollkit/go.mod b/rollkit/go.mod index 8f0ca421..a1587156 100644 --- a/rollkit/go.mod +++ b/rollkit/go.mod @@ -3,10 +3,13 @@ module github.com/ignite/apps/rollkit go 1.22.0 require ( + github.com/cometbft/cometbft v0.38.6 + github.com/cosmos/cosmos-sdk v0.50.6 github.com/gobuffalo/genny/v2 v2.1.0 github.com/gobuffalo/plush/v4 v4.1.19 github.com/hashicorp/go-plugin v1.6.0 github.com/ignite/cli/v28 v28.4.0 + github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 ) @@ -49,13 +52,11 @@ require ( github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft v0.38.6 // indirect github.com/cometbft/cometbft-db v0.9.1 // indirect github.com/containerd/containerd v1.7.11 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.2 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect - github.com/cosmos/cosmos-sdk v0.50.6 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.4.12 // indirect @@ -164,7 +165,6 @@ require ( github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect diff --git a/rollkit/go.sum b/rollkit/go.sum index 7c50bb3b..e75a4f7f 100644 --- a/rollkit/go.sum +++ b/rollkit/go.sum @@ -87,6 +87,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= +github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= From abbaf669f2752566f389d613cde100f8b0b65b80 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 15 May 2024 21:33:40 +0200 Subject: [PATCH 2/6] updates --- rollkit/cmd/add.go | 4 ++-- rollkit/cmd/init.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rollkit/cmd/add.go b/rollkit/cmd/add.go index fbfef3fd..e388926f 100644 --- a/rollkit/cmd/add.go +++ b/rollkit/cmd/add.go @@ -40,7 +40,7 @@ func NewRollkitAdd() *cobra.Command { return err } - chain, err := chain.New(absPath) + chain, err := chain.New(absPath, chain.CollectEvents(session.EventBus())) if err != nil { return err } @@ -59,7 +59,7 @@ func NewRollkitAdd() *cobra.Command { return err } - session.Printf("šŸŽ‰ RollKit added (`%[1]v`).\n Use `ignite rollkit init` to init `%s`\n", chain.AppPath(), chain.Name()) + session.Printf("šŸŽ‰ RollKit added (`%[1]v`).", chain.AppPath(), chain.Name()) return nil }, } diff --git a/rollkit/cmd/init.go b/rollkit/cmd/init.go index 5b7f3947..b6c2c75d 100644 --- a/rollkit/cmd/init.go +++ b/rollkit/cmd/init.go @@ -35,22 +35,22 @@ func NewRollkitInit() *cobra.Command { return err } - rollkitChain, err := chain.New(absPath) + rc, err := chain.New(absPath, chain.CollectEvents(session.EventBus())) if err != nil { return err } - if err := rollkitChain.Init(cmd.Context(), chain.InitArgsAll); err != nil { + if err := rc.Init(cmd.Context(), chain.InitArgsAll); err != nil { return err } - home, err := rollkitChain.Home() + home, err := rc.Home() if err != nil { return err } // modify genesis (add sequencer) - genesisPath, err := rollkitChain.GenesisPath() + genesisPath, err := rc.GenesisPath() if err != nil { return err } @@ -78,7 +78,7 @@ func NewRollkitInit() *cobra.Command { return err } - return session.Printf("šŸ—ƒ Initialized. Checkout your rollkit chain's home (data) directory: %s\n", colors.Info(home)) + return session.Printf("šŸ—ƒ Initialized. Checkout your rollkit chain's home (data) directory: %s\n", colors.Info(home)) }, } From 42281a1c39c58d41ad4392045541b604f9e54fbe Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 29 May 2024 16:27:48 +0200 Subject: [PATCH 3/6] updates --- rollkit/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rollkit/README.md b/rollkit/README.md index a0f02317..6994c050 100644 --- a/rollkit/README.md +++ b/rollkit/README.md @@ -15,6 +15,7 @@ cd gm ignite app install -g github.com/ignite/apps/rollkit@rollkit/v0.1.0 ignite rollkit add ignite chain build +ignite rollkit init ``` Learn more about Rollkit and Ignite in their respective documentation: From 0f4a070061864e5679577795e0ec4137991b4181 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 29 May 2024 17:50:26 +0200 Subject: [PATCH 4/6] updates --- rollkit/README.md | 4 ++-- rollkit/cmd/add.go | 5 +++-- rollkit/cmd/init.go | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/rollkit/README.md b/rollkit/README.md index 6994c050..e26bd39b 100644 --- a/rollkit/README.md +++ b/rollkit/README.md @@ -10,9 +10,9 @@ This Ignite App is aimed to extend [Ignite CLI](https://github.com/ignite/cli) a ## Usage ```sh -ignite s chain gm --address-prefix gm +ignite s chain gm --address-prefix gm --minimal cd gm -ignite app install -g github.com/ignite/apps/rollkit@rollkit/v0.1.0 +ignite app install -g github.com/ignite/apps/rollkit@rollkit/v0.2.0 ignite rollkit add ignite chain build ignite rollkit init diff --git a/rollkit/cmd/add.go b/rollkit/cmd/add.go index e388926f..e073ef76 100644 --- a/rollkit/cmd/add.go +++ b/rollkit/cmd/add.go @@ -18,7 +18,8 @@ import ( const ( statusScaffolding = "Scaffolding..." - flagPath = "path" + flagPath = "path" + flagLocalDa = "local-da" ) func NewRollkitAdd() *cobra.Command { @@ -59,7 +60,7 @@ func NewRollkitAdd() *cobra.Command { return err } - session.Printf("šŸŽ‰ RollKit added (`%[1]v`).", chain.AppPath(), chain.Name()) + session.Printf("šŸŽ‰ RollKit added (`%[1]v`).\n", chain.AppPath(), chain.Name()) return nil }, } diff --git a/rollkit/cmd/init.go b/rollkit/cmd/init.go index b6c2c75d..a527e52a 100644 --- a/rollkit/cmd/init.go +++ b/rollkit/cmd/init.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" + configchain "github.com/ignite/cli/v28/ignite/config/chain" "github.com/ignite/cli/v28/ignite/pkg/cliui" "github.com/ignite/cli/v28/ignite/pkg/cliui/colors" "github.com/ignite/cli/v28/ignite/services/chain" @@ -40,6 +41,24 @@ func NewRollkitInit() *cobra.Command { return err } + if localDa, err := cmd.Flags().GetBool(flagLocalDa); err == nil && localDa { + igniteConfig, err := rc.Config() + if err != nil { + return err + } + + igniteConfig.Validators[0].Bonded = "1000000000stake" + for i, account := range igniteConfig.Accounts { + if account.Name == igniteConfig.Validators[0].Name { + igniteConfig.Accounts[i].Coins = []string{"10000000000000000000000000stake"} + } + } + + if err := configchain.Save(*igniteConfig, rc.ConfigPath()); err != nil { + return err + } + } + if err := rc.Init(cmd.Context(), chain.InitArgsAll); err != nil { return err } @@ -83,6 +102,7 @@ func NewRollkitInit() *cobra.Command { } c.Flags().StringP(flagPath, "p", ".", "path of the app") + c.Flags().BoolP(flagLocalDa, "l", false, "use local-da (creates the expected genesis account for local-da)") return c } From 3f6c864b2e33f2262dcca40e11fc6278b6bf8bd5 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 29 May 2024 18:22:02 +0200 Subject: [PATCH 5/6] add integration test --- rollkit/integration/app_test.go | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/rollkit/integration/app_test.go b/rollkit/integration/app_test.go index 9f898219..59c47caa 100644 --- a/rollkit/integration/app_test.go +++ b/rollkit/integration/app_test.go @@ -38,7 +38,7 @@ func TestRollkit(t *testing.T) { assertLocalPlugins(t, app, []pluginsconfig.Plugin{{Path: pluginPath}}) assertGlobalPlugins(t, nil) - env.Must(env.Exec("run rollkit app", + env.Must(env.Exec("run rollkit add", step.NewSteps(step.New( step.Exec( envtest.IgniteApp, @@ -62,9 +62,6 @@ func TestRollkit(t *testing.T) { ), step.New( step.Exec(bin, "start", "--help"), - step.PostExec(func(exitErr error) error { - return os.Remove(bin) - }), step.Stdout(buf), step.Workdir(app.SourcePath()), )), @@ -73,6 +70,27 @@ func TestRollkit(t *testing.T) { if !strings.Contains(buf.String(), "--rollkit.da_") { t.Errorf("rollkitd doesn't contain --rollkit flags: %s", buf.String()) } + + buf.Reset() + + env.Must(env.Exec("run rollkit init", step.NewSteps( + step.New( + step.Exec( + envtest.IgniteApp, + "rollkit", + "init", + ), + step.PostExec(func(exitErr error) error { + return os.Remove(bin) + }), + step.Workdir(app.SourcePath()), + step.Stdout(buf), + ), + ))) + + if !strings.Contains(buf.String(), "Initialized. Checkout your rollkit chain's home") { + t.Errorf("ignite rollkit init has failed: %s", buf.String()) + } } func assertLocalPlugins(t *testing.T, app envtest.App, expectedPlugins []pluginsconfig.Plugin) { From 551d380b4171f373eddbdef0a69558fd6c4b49be Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Mon, 3 Jun 2024 22:35:37 +0200 Subject: [PATCH 6/6] formatting --- rollkit/cmd/add.go | 9 ++++----- rollkit/cmd/init.go | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rollkit/cmd/add.go b/rollkit/cmd/add.go index e073ef76..c2ce9652 100644 --- a/rollkit/cmd/add.go +++ b/rollkit/cmd/add.go @@ -41,12 +41,12 @@ func NewRollkitAdd() *cobra.Command { return err } - chain, err := chain.New(absPath, chain.CollectEvents(session.EventBus())) + c, err := chain.New(absPath, chain.CollectEvents(session.EventBus())) if err != nil { return err } - g, err := template.NewRollKitGenerator(chain) + g, err := template.NewRollKitGenerator(c) if err != nil { return err } @@ -56,12 +56,11 @@ func NewRollkitAdd() *cobra.Command { return err } - if finish(cmd.Context(), session, chain.AppPath()) != nil { + if finish(cmd.Context(), session, c.AppPath()) != nil { return err } - session.Printf("šŸŽ‰ RollKit added (`%[1]v`).\n", chain.AppPath(), chain.Name()) - return nil + return session.Printf("šŸŽ‰ RollKit added (`%[1]v`).\n", c.AppPath(), c.Name()) }, } diff --git a/rollkit/cmd/init.go b/rollkit/cmd/init.go index a527e52a..47add64b 100644 --- a/rollkit/cmd/init.go +++ b/rollkit/cmd/init.go @@ -115,8 +115,7 @@ func getPubKey(chainHome string) (crypto.PubKey, error) { return nil, err } var pvKey cmprivval.FilePVKey - err = cmtjson.Unmarshal(keyJSONBytes, &pvKey) - if err != nil { + if err = cmtjson.Unmarshal(keyJSONBytes, &pvKey); err != nil { return nil, errors.Errorf("error reading PrivValidator key from %v: %s", keyFilePath, err) } return pvKey.PubKey, nil