From c7193114c7ef6fe254453d96b735a8b4de351a89 Mon Sep 17 00:00:00 2001 From: Francisco Moura Date: Mon, 20 May 2024 19:54:15 -0300 Subject: [PATCH] feat: Add --no-mining opt to Devnet --- cmd/cartesi-rollups-cli/root/deps/deps.go | 6 ++- cmd/cartesi-rollups-cli/root/mine/mine.go | 41 +++++++++++++++++++ cmd/cartesi-rollups-cli/root/root.go | 2 + docs/cli/cartesi-rollups-cli.md | 1 + docs/cli/cartesi-rollups-cli_mine.md | 26 ++++++++++++ docs/cli/cartesi-rollups-cli_run-deps.md | 1 + internal/deps/deps.go | 48 +++++++++++++++-------- internal/node/machinehash_test.go | 4 +- pkg/ethutil/ethutil.go | 26 +++++++++++- pkg/ethutil/ethutil_test.go | 28 ++++++++----- test/echo_test.go | 2 +- 11 files changed, 153 insertions(+), 32 deletions(-) create mode 100644 cmd/cartesi-rollups-cli/root/mine/mine.go create mode 100644 docs/cli/cartesi-rollups-cli_mine.md diff --git a/cmd/cartesi-rollups-cli/root/deps/deps.go b/cmd/cartesi-rollups-cli/root/deps/deps.go index e262bab80..dfb2917a4 100644 --- a/cmd/cartesi-rollups-cli/root/deps/deps.go +++ b/cmd/cartesi-rollups-cli/root/deps/deps.go @@ -51,9 +51,13 @@ func init() { "Devnet local listening port number") Cmd.Flags().StringVar(&depsConfig.Devnet.BlockTime, "devnet-block-time", - deps.DefaultBlockTime, + deps.DefaultDevnetBlockTime, "Devnet mining block time") + Cmd.Flags().BoolVar(&depsConfig.Devnet.NoMining, "devnet-no-mining", + deps.DefaultDevnetNoMining, + "Devnet disable mining") + Cmd.Flags().BoolVarP(&verbose, "verbose", "v", false, "verbose logs") } diff --git a/cmd/cartesi-rollups-cli/root/mine/mine.go b/cmd/cartesi-rollups-cli/root/mine/mine.go new file mode 100644 index 000000000..2c1969544 --- /dev/null +++ b/cmd/cartesi-rollups-cli/root/mine/mine.go @@ -0,0 +1,41 @@ +// (c) Cartesi and individual authors (see AUTHORS) +// SPDX-License-Identifier: Apache-2.0 (see LICENSE) + +package mine + +import ( + "context" + "log/slog" + + "github.com/cartesi/rollups-node/pkg/ethutil" + "github.com/spf13/cobra" +) + +var Cmd = &cobra.Command{ + Use: "mine", + Short: "Mine a new block", + Example: examples, + Run: run, +} + +const examples = `# Mine a new block: +cartesi-rollups-cli mine` + +var ( + anvilEndpoint string +) + +func init() { + + Cmd.Flags().StringVar(&anvilEndpoint, "anvil-endpoint", "http://localhost:8545", + "address of anvil endpoint to be used to send the mining request") +} + +func run(cmd *cobra.Command, args []string) { + + blockNumber, err := ethutil.MineNewBlock(context.Background(), anvilEndpoint) + + cobra.CheckErr(err) + + slog.Info("Ok", "block number", blockNumber) +} diff --git a/cmd/cartesi-rollups-cli/root/root.go b/cmd/cartesi-rollups-cli/root/root.go index 6d4c63678..7a612fc69 100644 --- a/cmd/cartesi-rollups-cli/root/root.go +++ b/cmd/cartesi-rollups-cli/root/root.go @@ -8,6 +8,7 @@ import ( "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/execute" "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/increasetime" "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/inspect" + "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/mine" "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/read" "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/savesnapshot" "github.com/cartesi/rollups-node/cmd/cartesi-rollups-cli/root/send" @@ -31,5 +32,6 @@ func init() { Cmd.AddCommand(validate.Cmd) Cmd.AddCommand(deps.Cmd) Cmd.AddCommand(execute.Cmd) + Cmd.AddCommand(mine.Cmd) Cmd.DisableAutoGenTag = true } diff --git a/docs/cli/cartesi-rollups-cli.md b/docs/cli/cartesi-rollups-cli.md index 77ac81ca6..b70bba14a 100644 --- a/docs/cli/cartesi-rollups-cli.md +++ b/docs/cli/cartesi-rollups-cli.md @@ -18,6 +18,7 @@ Cartesi Rollups node. * [cartesi-rollups-cli execute](cartesi-rollups-cli_execute.md) - Executes a voucher * [cartesi-rollups-cli increase-time](cartesi-rollups-cli_increase-time.md) - Increases evm time of the current machine * [cartesi-rollups-cli inspect](cartesi-rollups-cli_inspect.md) - Calls inspect API +* [cartesi-rollups-cli mine](cartesi-rollups-cli_mine.md) - Mine a new block * [cartesi-rollups-cli read](cartesi-rollups-cli_read.md) - Read the node state from the GraphQL API * [cartesi-rollups-cli run-deps](cartesi-rollups-cli_run-deps.md) - Run node dependencies with Docker * [cartesi-rollups-cli save-snapshot](cartesi-rollups-cli_save-snapshot.md) - Saves the testing Cartesi machine snapshot to the designated folder diff --git a/docs/cli/cartesi-rollups-cli_mine.md b/docs/cli/cartesi-rollups-cli_mine.md new file mode 100644 index 000000000..3995ca3f6 --- /dev/null +++ b/docs/cli/cartesi-rollups-cli_mine.md @@ -0,0 +1,26 @@ +## cartesi-rollups-cli mine + +Mine a new block + +``` +cartesi-rollups-cli mine [flags] +``` + +### Examples + +``` +# Mine a new block: +cartesi-rollups-cli mine +``` + +### Options + +``` + --anvil-endpoint string address of anvil endpoint to be used to send the mining request (default "http://localhost:8545") + -h, --help help for mine +``` + +### SEE ALSO + +* [cartesi-rollups-cli](cartesi-rollups-cli.md) - Command line interface for Cartesi Rollups + diff --git a/docs/cli/cartesi-rollups-cli_run-deps.md b/docs/cli/cartesi-rollups-cli_run-deps.md index 333808433..fca0efb30 100644 --- a/docs/cli/cartesi-rollups-cli_run-deps.md +++ b/docs/cli/cartesi-rollups-cli_run-deps.md @@ -19,6 +19,7 @@ cartesi-rollups-cli run-deps --devnet-block-time string Devnet mining block time (default "1") --devnet-docker-image string Devnet docker image name (default "cartesi/rollups-node-devnet:devel") --devnet-mapped-port string Devnet local listening port number (default "8545") + --devnet-no-mining Devnet disable mining -h, --help help for run-deps --postgres-docker-image string Postgress docker image name (default "postgres:16-alpine") --postgres-mapped-port string Postgres local listening port number (default "5432") diff --git a/internal/deps/deps.go b/internal/deps/deps.go index 194cb49dd..7742fb830 100644 --- a/internal/deps/deps.go +++ b/internal/deps/deps.go @@ -18,15 +18,16 @@ import ( ) const ( - DefaultPostgresDatabase = "postgres" - DefaultPostgresDockerImage = "postgres:16-alpine" - DefaultPostgresPort = "5432" - DefaultPostgresUser = "postgres" - DefaultPostgresPassword = "password" - DefaultDevnetDockerImage = "cartesi/rollups-node-devnet:devel" - DefaultDevnetPort = "8545" - DefaultBlockTime = "1" - DefaultBlockToWaitForOnStartup = "21" + DefaultPostgresDatabase = "postgres" + DefaultPostgresDockerImage = "postgres:16-alpine" + DefaultPostgresPort = "5432" + DefaultPostgresUser = "postgres" + DefaultPostgresPassword = "password" + DefaultDevnetDockerImage = "cartesi/rollups-node-devnet:devel" + DefaultDevnetPort = "8545" + DefaultDevnetBlockTime = "1" + DefaultDevnetBlockToWaitForOnStartup = "21" + DefaultDevnetNoMining = false numPostgresCheckReadyAttempts = 2 pollInterval = 5 * time.Second @@ -54,6 +55,7 @@ type DevnetConfig struct { Port string BlockTime string BlockToWaitForOnStartup string + NoMining bool } // Builds a DepsConfig struct with default values @@ -67,8 +69,9 @@ func NewDefaultDepsConfig() *DepsConfig { &DevnetConfig{ DefaultDevnetDockerImage, DefaultDevnetPort, - DefaultBlockTime, - DefaultBlockToWaitForOnStartup, + DefaultDevnetBlockTime, + DefaultDevnetBlockToWaitForOnStartup, + DefaultDevnetNoMining, }, } } @@ -206,12 +209,25 @@ func Run(ctx context.Context, depsConfig DepsConfig) (*DepsContainers, error) { devnetExposedPort = strings.Join([]string{ depsConfig.Devnet.Port, ":", devnetExposedPort}, "") } + cmd := []string{ + "anvil", + "--load-state", + "/usr/share/devnet/anvil_state.json", + } + var waitStrategy *wait.LogStrategy + if depsConfig.Devnet.NoMining { + cmd = append(cmd, "--no-mining") + waitStrategy = wait.ForLog("net_listening") + } else { + cmd = append(cmd, "--block-time", + depsConfig.Devnet.BlockTime) + waitStrategy = wait.ForLog("Block Number: " + depsConfig.Devnet.BlockToWaitForOnStartup) + } devNetReq := testcontainers.ContainerRequest{ - Image: depsConfig.Devnet.DockerImage, - ExposedPorts: []string{devnetExposedPort}, - WaitingFor: wait.ForLog("Block Number: " + depsConfig.Devnet.BlockToWaitForOnStartup), - Cmd: []string{"anvil", "--block-time", - depsConfig.Devnet.BlockTime, "--load-state", "/usr/share/devnet/anvil_state.json"}, + Image: depsConfig.Devnet.DockerImage, + ExposedPorts: []string{devnetExposedPort}, + WaitingFor: waitStrategy, + Cmd: cmd, LifecycleHooks: createHook(&finishedWaitGroup), } devnet, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ diff --git a/internal/node/machinehash_test.go b/internal/node/machinehash_test.go index ff2d13cf3..c1aefc8fb 100644 --- a/internal/node/machinehash_test.go +++ b/internal/node/machinehash_test.go @@ -138,8 +138,8 @@ func startDevnet() (*deps.DepsContainers, error) { container, err := deps.Run(context.Background(), deps.DepsConfig{ Devnet: &deps.DevnetConfig{ DockerImage: deps.DefaultDevnetDockerImage, - BlockTime: deps.DefaultBlockTime, - BlockToWaitForOnStartup: deps.DefaultBlockToWaitForOnStartup, + BlockTime: deps.DefaultDevnetBlockTime, + BlockToWaitForOnStartup: deps.DefaultDevnetBlockToWaitForOnStartup, Port: testutil.GetCartesiTestDepsPortRange(), }, }) diff --git a/pkg/ethutil/ethutil.go b/pkg/ethutil/ethutil.go index 1ec16f1a1..75e70cdcc 100644 --- a/pkg/ethutil/ethutil.go +++ b/pkg/ethutil/ethutil.go @@ -199,14 +199,36 @@ func AdvanceDevnetTime(ctx context.Context, // Sets the timestamp for the next block at Devnet func SetNextDevnetBlockTimestamp( ctx context.Context, - blockchainHttpEnpoint string, + blockchainHttpEndpoint string, timestamp int64, ) error { - client, err := rpc.DialContext(ctx, blockchainHttpEnpoint) + client, err := rpc.DialContext(ctx, blockchainHttpEndpoint) if err != nil { return err } defer client.Close() return client.CallContext(ctx, nil, "evm_setNextBlockTimestamp", timestamp) } + +// Mines a new block +func MineNewBlock( + ctx context.Context, + blockchainHttpEndpoint string, +) (uint64, error) { + client, err := rpc.DialContext(ctx, blockchainHttpEndpoint) + if err != nil { + return 0, err + } + defer client.Close() + err = client.CallContext(ctx, nil, "evm_mine") + if err != nil { + return 0, err + } + ethClient, err := ethclient.DialContext(ctx, blockchainHttpEndpoint) + if err != nil { + return 0, err + } + defer ethClient.Close() + return ethClient.BlockNumber(ctx) +} diff --git a/pkg/ethutil/ethutil_test.go b/pkg/ethutil/ethutil_test.go index f06a62b3f..84f125e20 100644 --- a/pkg/ethutil/ethutil_test.go +++ b/pkg/ethutil/ethutil_test.go @@ -24,12 +24,13 @@ const testTimeout = 300 * time.Second // go-ethereum's client. type EthUtilSuite struct { suite.Suite - ctx context.Context - cancel context.CancelFunc - deps *deps.DepsContainers - client *ethclient.Client - signer Signer - book *addresses.Book + ctx context.Context + cancel context.CancelFunc + deps *deps.DepsContainers + client *ethclient.Client + endpoint string + signer Signer + book *addresses.Book } func (s *EthUtilSuite) SetupTest() { @@ -39,10 +40,10 @@ func (s *EthUtilSuite) SetupTest() { s.deps, err = newDevNetContainer(context.Background()) s.Require().Nil(err) - endpoint, err := s.deps.DevnetEndpoint(s.ctx, "ws") + s.endpoint, err = s.deps.DevnetEndpoint(s.ctx, "ws") s.Require().Nil(err) - s.client, err = ethclient.DialContext(s.ctx, endpoint) + s.client, err = ethclient.DialContext(s.ctx, s.endpoint) s.Require().Nil(err) s.signer, err = NewMnemonicSigner(s.ctx, s.client, FoundryMnemonic, 0) @@ -83,6 +84,13 @@ func (s *EthUtilSuite) TestAddInput() { s.Require().Equal(payload, inputArgs["payload"]) } +func (s *EthUtilSuite) TestMineNewBlock() { + blockNumber, err := MineNewBlock(s.ctx, s.endpoint) + s.Require().Nil(err) + s.Require().Equal(uint64(22), blockNumber) + +} + // Log the output of the given container func (s *EthUtilSuite) logDevnetOutput() { reader, err := s.deps.DevnetLogs(s.ctx) @@ -105,8 +113,8 @@ func newDevNetContainer(ctx context.Context) (*deps.DepsContainers, error) { container, err := deps.Run(ctx, deps.DepsConfig{ Devnet: &deps.DevnetConfig{ DockerImage: deps.DefaultDevnetDockerImage, - BlockTime: deps.DefaultBlockTime, - BlockToWaitForOnStartup: deps.DefaultBlockToWaitForOnStartup, + BlockTime: deps.DefaultDevnetBlockTime, + BlockToWaitForOnStartup: deps.DefaultDevnetBlockToWaitForOnStartup, Port: testutil.GetCartesiTestDepsPortRange(), }, }) diff --git a/test/echo_test.go b/test/echo_test.go index dfaea7cd9..7b238bb2a 100644 --- a/test/echo_test.go +++ b/test/echo_test.go @@ -71,7 +71,7 @@ func (s *EchoInputTestSuite) SetupTest() { DockerImage: deps.DefaultDevnetDockerImage, Port: testutil.GetCartesiTestDepsPortRange(), BlockTime: devNetMiningBlockTimeInSeconds, - BlockToWaitForOnStartup: deps.DefaultBlockToWaitForOnStartup, + BlockToWaitForOnStartup: deps.DefaultDevnetBlockToWaitForOnStartup, }, }