Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
image-tag: ${{ needs.determine-image-tag.outputs.tag }}
apps: |
[
{"name": "ev-node-evm-single", "dockerfile": "apps/evm/single/Dockerfile"},
{"name": "ev-node-evm", "dockerfile": "apps/evm/Dockerfile"},
{"name": "ev-node-testapp", "dockerfile": "apps/testapp/Dockerfile"}
]

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/docker-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ permissions: {}
workflow_dispatch:
inputs:
image-tag:
description: 'Docker image tag to use for tests (e.g., v1.2.3, pr-123, sha-abc123)'
description: "Docker image tag to use for tests (e.g., v1.2.3, pr-123, sha-abc123)"
required: true
type: string

Expand Down Expand Up @@ -47,5 +47,5 @@ jobs:
- name: Run Docker Upgrade E2E Tests
run: make test-docker-upgrade-e2e
env:
EVM_SINGLE_IMAGE_REPO: ghcr.io/${{ github.repository_owner }}/ev-node-evm-single
EVM_SINGLE_NODE_IMAGE_TAG: ${{ inputs.image-tag }}
EVM_IMAGE_REPO: ghcr.io/${{ github.repository_owner }}/ev-node-evm
EVM_NODE_IMAGE_TAG: ${{ inputs.image-tag }}
2 changes: 1 addition & 1 deletion .github/workflows/ghcr-prune.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
matrix:
package:
- ev-node
- ev-node-evm-single
- ev-node-evm
- local-da
steps:
- name: Delete stale tags
Expand Down
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- Rename `evm-single` to `evm` and `grpc-single` to `evgrpc` for clarity. [#2839](https://github.com/evstack/ev-node/pull/2839)

## v1.0.0-beta.10

### Added

- Enhanced health check system with separate liveness (`/health/live`) and readiness (`/health/ready`) HTTP endpoints. Readiness endpoint includes P2P listening check and aggregator block production rate validation (5x block time threshold). ([#2800](https://github.com/evstack/ev-node/pull/2800))
Expand Down Expand Up @@ -38,7 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

<!-- New features or capabilities -->

- Added automated upgrade test for the `evm-single` app that verifies compatibility when moving from v1.0.0-beta.8 to HEAD in CI ([#2780](https://github.com/evstack/ev-node/pull/2780))
- Added automated upgrade test for the `evm` app that verifies compatibility when moving from v1.0.0-beta.8 to HEAD in CI ([#2780](https://github.com/evstack/ev-node/pull/2780))
- Added execution-layer replay mechanism so nodes can resynchronize by replaying missed batches against the executor ([#2771](https://github.com/evstack/ev-node/pull/2771))
- Added cache-pruning logic that evicts entries once heights are finalized to keep node memory usage bounded ([#2761](https://github.com/evstack/ev-node/pull/2761))
- Added Prometheus gauges and counters that surface DA submission failures, pending blobs, and resend attempts for easier operational monitoring ([#2756](https://github.com/evstack/ev-node/pull/2756))
Expand Down
56 changes: 21 additions & 35 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ git push origin evm/single/v0.2.0
# GitHub → Actions → Release workflow

# 4. Verify release
docker pull ghcr.io/evstack/ev-node-evm-single:v0.2.0
docker pull ghcr.io/evstack/ev-node-evm:v0.2.0
```

### Tag Format
Expand All @@ -34,9 +34,9 @@ Use the hierarchical tag format: `{app-path}/v{major}.{minor}.{patch}`

**Examples:**

- `evm/single/v0.2.0` → Releases `apps/evm/single/`
- `testapp/v1.0.0` → Releases `apps/testapp/`
- `grpc/single/v2.1.3` → Releases `apps/grpc/single/`
- `apps/evm/v0.2.0` → Releases `apps/evm/`
- `apps/testapp/v1.0.0` → Releases `apps/testapp/`
- `apps/grpc/v2.1.3` → Releases `apps/grpc/`

### Automated Process

Expand Down Expand Up @@ -75,12 +75,11 @@ This section outlines the release process for all Go packages in the ev-node rep
│ da │ │ ev-node │ │execution/evm │
└─────────┘ └────┬────┘ └──────────────┘
┌───────────┴───────────┐
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│apps/evm/based │ │apps/evm/single │
└─────────────────┘ └─────────────────┘
┌───────────┐
│ apps/evm │
└───────────┘
```

### Release Order
Expand All @@ -106,8 +105,7 @@ These packages only depend on `core` and can be released in parallel after `core

These packages have the most dependencies and should be released last:

1. **github.com/evstack/ev-node/apps/evm/based** - Path: `./apps/evm/based`
2. **github.com/evstack/ev-node/apps/evm/single** - Path: `./apps/evm/single`
- **github.com/evstack/ev-node/apps/evm** - Path: `./apps/evm`

### Release Process

Expand Down Expand Up @@ -169,29 +167,18 @@ go list -m github.com/evstack/ev-node/execution/[email protected]
After all dependencies are available:

```bash
# Update and release apps/evm/based
cd apps/evm/based
go get github.com/evstack/ev-node/[email protected]
go get github.com/evstack/ev-node/[email protected]
go get github.com/evstack/ev-node/execution/[email protected]
go get github.com/evstack/[email protected]
go mod tidy
git tag apps/evm/based/v0.3.0
git push origin apps/evm/based/v0.3.0

# Update and release apps/evm/single
cd ../single
# Update and release apps/evm
go get github.com/evstack/ev-node/[email protected]
go get github.com/evstack/ev-node/[email protected]
go get github.com/evstack/ev-node/execution/[email protected]
go get github.com/evstack/[email protected]
go mod tidy
git tag apps/evm/single/v0.3.0
git push origin apps/evm/single/v0.3.0
git tag apps/evm/v0.3.0
git push origin apps/evm/v0.3.0

# Verify availability
go list -m github.com/evstack/ev-node/apps/evm/[email protected]
go list -m github.com/evstack/ev-node/apps/evm/[email protected]
go list -m github.com/evstack/ev-node/apps/[email protected]
```

---
Expand All @@ -202,8 +189,8 @@ go list -m github.com/evstack/ev-node/apps/evm/[email protected]

```bash
# Tag and push - automation handles the rest
git tag evm/single/v0.2.0
git push origin evm/single/v0.2.0
git tag evm/v0.2.0
git push origin evm/v0.2.0
```

### Scenario 2: Release Multiple Apps
Expand All @@ -229,8 +216,7 @@ git tag v0.3.0 && git push origin v0.3.0
git tag execution/evm/v0.3.0 && git push origin execution/evm/v0.3.0

# 3. Wait, update deps, then release apps
git tag apps/evm/based/v0.3.0 && git push origin apps/evm/based/v0.3.0
git tag apps/evm/single/v0.3.0 && git push origin apps/evm/single/v0.3.0
git tag apps/evm/v0.3.0 && git push origin apps/evm/v0.3.0
```

### Scenario 4: Hotfix/Patch Release
Expand Down Expand Up @@ -259,11 +245,11 @@ git push origin evm/single/v0.2.1
# GitHub → Actions → Release

# Pull and test image
docker pull ghcr.io/evstack/ev-node-evm-single:v0.2.0
docker run ghcr.io/evstack/ev-node-evm-single:v0.2.0 --version
docker pull ghcr.io/evstack/ev-node-evm:v0.2.0
docker run ghcr.io/evstack/ev-node-evm:v0.2.0 --version

# Check GHCR
# GitHub → Packages → ev-node-evm-single
# GitHub → Packages → ev-node-evm
```

### Go Module Release
Expand All @@ -284,7 +270,7 @@ go get github.com/evstack/ev-node/[email protected]

**"App directory does not exist"**

- Ensure tag matches app path: `apps/evm/single/` → `evm/single/v0.2.0`
- Ensure tag matches app path: `apps/evm/` → `apps/evm/v0.2.0`
- Check spelling and case sensitivity

**"Dockerfile not found"**
Expand Down
8 changes: 4 additions & 4 deletions apps/evm/single/Dockerfile → apps/evm/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ RUN go mod download

COPY . .

WORKDIR /src/apps/evm/single
RUN go mod tidy && CGO_ENABLED=0 GOOS=linux go build -o evm-single .
WORKDIR /src/apps/evm
RUN go mod tidy && CGO_ENABLED=0 GOOS=linux go build -o evm .

FROM alpine:3.22.2

Expand All @@ -19,8 +19,8 @@ RUN apk --no-cache add ca-certificates curl

WORKDIR /root

COPY --from=build-env /src/apps/evm/single/evm-single /usr/bin/evm-single
COPY apps/evm/single/entrypoint.sh /usr/bin/entrypoint.sh
COPY --from=build-env /src/apps/evm/evm /usr/bin/evm
COPY apps/evm/entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod +x /usr/bin/entrypoint.sh

ENTRYPOINT ["/usr/bin/entrypoint.sh"]
18 changes: 9 additions & 9 deletions apps/evm/single/README.md → apps/evm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@ This directory contains the implementation of a single EVM sequencer using Ev-no
2. Build the sequencer:

```bash
go build -o evm-single .
go build -o evm .
```

3. Initialize the sequencer:

```bash
./evm-single init --rollkit.node.aggregator=true --rollkit.signer.passphrase secret
./evm init --rollkit.node.aggregator=true --rollkit.signer.passphrase secret
```

4. Start the sequencer:

```bash
./evm-single start \
./evm start \
--evm.jwt-secret $(cat <path_to>/execution/evm/docker/jwttoken/jwt.hex) \
--evm.genesis-hash 0x2b8bbb1ea1e04f9c9809b4b278a8687806edc061a356c7dbc491930d8e922503 \
--rollkit.node.block_time 1s \
Expand All @@ -41,7 +41,7 @@ Share your `genesis.json` with other node operators. Add `da_start_height` field
Note: Replace `<path_to>` with the actual path to the rollkit repository. If you'd ever like to restart a fresh node, make sure to remove the originally created sequencer node directory using:

```bash
rm -rf ~/.evm-single
rm -rf ~/.evm
```

## Configuration
Expand All @@ -61,13 +61,13 @@ The sequencer can be configured using various command-line flags. The most impor
2. Initialize the full node:

```bash
./evm-single init --home ~/.evm-single-full-node
./evm init --home ~/.evm-full-node
```

3. Copy the genesis file from the sequencer node:

```bash
cp ~/.evm-single/config/genesis.json ~/.evm-single-full-node/config/genesis.json
cp ~/.evm/config/genesis.json ~/.evm-full-node/config/genesis.json
```

Verify the `da_start_height` value in the genesis file is set. If not, ask the chain developer to share it.
Expand All @@ -87,8 +87,8 @@ The sequencer can be configured using various command-line flags. The most impor
5. Start the full node:

```bash
./evm-single start \
--home ~/.evm-single-full-node \
./evm start \
--home ~/.evm-full-node \
--evm.jwt-secret $(cat <path_to>/execution/evm/docker/jwttoken/jwt.hex) \
--evm.genesis-hash 0x2b8bbb1ea1e04f9c9809b4b278a8687806edc061a356c7dbc491930d8e922503 \
--rollkit.rpc.address=127.0.0.1:46657 \
Expand All @@ -101,5 +101,5 @@ The sequencer can be configured using various command-line flags. The most impor
If you'd ever like to restart a fresh node, make sure to remove the originally created full node directory using:

```bash
rm -rf ~/.evm-single-full-node
rm -rf ~/.evm-full-node
```
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func NewRollbackCmd() *cobra.Command {
}

// evolve db
rawEvolveDB, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, "evm-single")
rawEvolveDB, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, "evm")
if err != nil {
return err
}
Expand Down
66 changes: 43 additions & 23 deletions apps/evm/single/cmd/run.go → apps/evm/cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,25 @@ import (
"os"
"path/filepath"

"github.com/evstack/ev-node/core/da"
"github.com/evstack/ev-node/da/jsonrpc"
"github.com/evstack/ev-node/node"
"github.com/evstack/ev-node/sequencers/single"

"github.com/ethereum/go-ethereum/common"
"github.com/ipfs/go-datastore"
"github.com/rs/zerolog"
"github.com/spf13/cobra"

"github.com/evstack/ev-node/execution/evm"

"github.com/evstack/ev-node/core/da"
"github.com/evstack/ev-node/core/execution"
coresequencer "github.com/evstack/ev-node/core/sequencer"
"github.com/evstack/ev-node/da/jsonrpc"
"github.com/evstack/ev-node/execution/evm"
"github.com/evstack/ev-node/node"
rollcmd "github.com/evstack/ev-node/pkg/cmd"
"github.com/evstack/ev-node/pkg/config"
"github.com/evstack/ev-node/pkg/genesis"
genesispkg "github.com/evstack/ev-node/pkg/genesis"
"github.com/evstack/ev-node/pkg/p2p"
"github.com/evstack/ev-node/pkg/p2p/key"
"github.com/evstack/ev-node/pkg/store"
"github.com/evstack/ev-node/sequencers/single"
)

var RunCmd = &cobra.Command{
Expand Down Expand Up @@ -58,7 +60,7 @@ var RunCmd = &cobra.Command{
return err
}

datastore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, "evm-single")
datastore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, "evm")
if err != nil {
return err
}
Expand All @@ -73,21 +75,8 @@ var RunCmd = &cobra.Command{
logger.Warn().Msg("da_start_height is not set in genesis.json, ask your chain developer")
}

singleMetrics, err := single.DefaultMetricsProvider(nodeConfig.Instrumentation.IsPrometheusEnabled())(genesis.ChainID)
if err != nil {
return err
}

sequencer, err := single.NewSequencer(
context.Background(),
logger,
datastore,
&daJrpc.DA,
[]byte(genesis.ChainID),
nodeConfig.Node.BlockTime.Duration,
singleMetrics,
nodeConfig.Node.Aggregator,
)
// Create sequencer based on configuration
sequencer, err := createSequencer(context.Background(), logger, datastore, &daJrpc.DA, nodeConfig, genesis)
if err != nil {
return err
}
Expand All @@ -111,6 +100,37 @@ func init() {
addFlags(RunCmd)
}

// createSequencer creates a sequencer based on the configuration.
func createSequencer(
ctx context.Context,
logger zerolog.Logger,
datastore datastore.Batching,
da da.DA,
nodeConfig config.Config,
genesis genesis.Genesis,
) (coresequencer.Sequencer, error) {
singleMetrics, err := single.NopMetrics()
if err != nil {
return nil, fmt.Errorf("failed to create single sequencer metrics: %w", err)
}

sequencer, err := single.NewSequencer(
ctx,
logger,
datastore,
da,
[]byte(genesis.ChainID),
nodeConfig.Node.BlockTime.Duration,
singleMetrics,
nodeConfig.Node.Aggregator,
)
if err != nil {
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
}

return sequencer, nil
}

func createExecutionClient(cmd *cobra.Command) (execution.Executor, error) {
// Read execution client parameters from flags
ethURL, err := cmd.Flags().GetString(evm.FlagEvmEthURL)
Expand Down
File renamed without changes.
Loading
Loading