Skip to content

Commit

Permalink
feat: Add --no-mining opt to Devnet
Browse files Browse the repository at this point in the history
  • Loading branch information
fmoura authored and vfusco committed Jul 9, 2024
1 parent a9d9a87 commit c719311
Show file tree
Hide file tree
Showing 11 changed files with 153 additions and 32 deletions.
6 changes: 5 additions & 1 deletion cmd/cartesi-rollups-cli/root/deps/deps.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}

Expand Down
41 changes: 41 additions & 0 deletions cmd/cartesi-rollups-cli/root/mine/mine.go
Original file line number Diff line number Diff line change
@@ -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)
}
2 changes: 2 additions & 0 deletions cmd/cartesi-rollups-cli/root/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
}
1 change: 1 addition & 0 deletions docs/cli/cartesi-rollups-cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions docs/cli/cartesi-rollups-cli_mine.md
Original file line number Diff line number Diff line change
@@ -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

1 change: 1 addition & 0 deletions docs/cli/cartesi-rollups-cli_run-deps.md
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
48 changes: 32 additions & 16 deletions internal/deps/deps.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -54,6 +55,7 @@ type DevnetConfig struct {
Port string
BlockTime string
BlockToWaitForOnStartup string
NoMining bool
}

// Builds a DepsConfig struct with default values
Expand All @@ -67,8 +69,9 @@ func NewDefaultDepsConfig() *DepsConfig {
&DevnetConfig{
DefaultDevnetDockerImage,
DefaultDevnetPort,
DefaultBlockTime,
DefaultBlockToWaitForOnStartup,
DefaultDevnetBlockTime,
DefaultDevnetBlockToWaitForOnStartup,
DefaultDevnetNoMining,
},
}
}
Expand Down Expand Up @@ -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{
Expand Down
4 changes: 2 additions & 2 deletions internal/node/machinehash_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
},
})
Expand Down
26 changes: 24 additions & 2 deletions pkg/ethutil/ethutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
28 changes: 18 additions & 10 deletions pkg/ethutil/ethutil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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(),
},
})
Expand Down
2 changes: 1 addition & 1 deletion test/echo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func (s *EchoInputTestSuite) SetupTest() {
DockerImage: deps.DefaultDevnetDockerImage,
Port: testutil.GetCartesiTestDepsPortRange(),
BlockTime: devNetMiningBlockTimeInSeconds,
BlockToWaitForOnStartup: deps.DefaultBlockToWaitForOnStartup,
BlockToWaitForOnStartup: deps.DefaultDevnetBlockToWaitForOnStartup,
},
}

Expand Down

0 comments on commit c719311

Please sign in to comment.