Skip to content

Commit 7769c77

Browse files
authored
Merge branch 'main' into health-endpoint-block-check
2 parents 35f7c74 + 3d98502 commit 7769c77

File tree

40 files changed

+662
-668
lines changed

40 files changed

+662
-668
lines changed

.github/workflows/ghcr-prune.yml

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# Cleanup workflow for pruning old commit-hash Docker tags from GHCR.
2+
name: GHCR Tag Prune
3+
on:
4+
schedule:
5+
- cron: "0 6 * * *" # daily at 06:00 UTC
6+
workflow_dispatch:
7+
inputs:
8+
retention-days:
9+
description: "Override retention window (days)"
10+
required: false
11+
type: number
12+
13+
permissions:
14+
contents: read
15+
packages: write
16+
17+
env:
18+
DEFAULT_RETENTION_DAYS: 14
19+
20+
jobs:
21+
prune:
22+
name: Remove aged commit-hash tags
23+
runs-on: ubuntu-latest
24+
strategy:
25+
fail-fast: false
26+
matrix:
27+
package:
28+
- ev-node
29+
- ev-node-evm-single
30+
- local-da
31+
steps:
32+
- name: Delete stale tags
33+
uses: actions/github-script@v7
34+
env:
35+
PACKAGE_NAME: ${{ matrix.package }}
36+
OVERRIDE_RETENTION: ${{ github.event.inputs.retention-days }}
37+
with:
38+
script: |
39+
const packageName = process.env.PACKAGE_NAME;
40+
if (!packageName) {
41+
core.setFailed('PACKAGE_NAME env not provided');
42+
return;
43+
}
44+
45+
const retentionDaysInput = process.env.OVERRIDE_RETENTION;
46+
const retentionDays = retentionDaysInput ? Number(retentionDaysInput) : Number(process.env.DEFAULT_RETENTION_DAYS);
47+
if (Number.isNaN(retentionDays) || retentionDays <= 0) {
48+
core.setFailed(`Invalid retention window: ${retentionDaysInput}`);
49+
return;
50+
}
51+
const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
52+
const owner = context.repo.owner;
53+
const ownerType = context.payload.repository?.owner?.type === 'User' ? 'User' : 'Organization';
54+
55+
core.info(`Processing ${packageName} for ${ownerType.toLowerCase()} ${owner}; removing commit-hash tags older than ${retentionDays} days`);
56+
57+
const listParams = {
58+
package_type: 'container',
59+
package_name: packageName,
60+
per_page: 100,
61+
};
62+
if (ownerType === 'Organization') {
63+
listParams.org = owner;
64+
} else {
65+
listParams.username = owner;
66+
}
67+
68+
const listFn = ownerType === 'Organization'
69+
? github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg
70+
: github.rest.packages.getAllPackageVersionsForPackageOwnedByUser;
71+
72+
const deleteFn = ownerType === 'Organization'
73+
? github.rest.packages.deletePackageVersionForOrg
74+
: github.rest.packages.deletePackageVersionForUser;
75+
76+
const versions = await github.paginate(listFn, listParams);
77+
core.info(`Found ${versions.length} versions`);
78+
79+
const hashRegex = /^(?:sha256:)?[0-9a-f]{7,64}$/i;
80+
const prRegex = /^pr-\d+$/i;
81+
const maxDeletes = 100;
82+
let deleted = 0;
83+
for (const version of versions) {
84+
if (deleted >= maxDeletes) {
85+
core.info(`Hit per-run deletion cap (${maxDeletes}); stopping early for ${packageName}`);
86+
break;
87+
}
88+
const created = new Date(version.created_at).getTime();
89+
if (Number.isNaN(created) || created >= cutoff) {
90+
continue;
91+
}
92+
93+
const tags = version.metadata?.container?.tags ?? [];
94+
const digest = version.metadata?.container?.digest;
95+
const identifiers = [...tags];
96+
if (digest) {
97+
identifiers.push(digest);
98+
}
99+
if (version.name) {
100+
identifiers.push(version.name);
101+
}
102+
103+
const hasReleaseTag = tags.some(tag => tag.startsWith('v'));
104+
if (hasReleaseTag) {
105+
continue;
106+
}
107+
108+
const hasCommitTag = identifiers.some(id => hashRegex.test(id));
109+
const hasPrTag = tags.some(tag => prRegex.test(tag));
110+
if (!hasCommitTag && !hasPrTag) {
111+
continue;
112+
}
113+
114+
core.info(`Deleting version ${version.id} (${tags.join(', ')}) created ${version.created_at}`);
115+
await deleteFn({
116+
package_type: 'container',
117+
package_name: packageName,
118+
package_version_id: version.id,
119+
...(ownerType === 'Organization' ? { org: owner } : { username: owner }),
120+
});
121+
deleted += 1;
122+
}
123+
124+
core.info(`Deleted ${deleted} old commit-hash tags for ${packageName}`);

.github/workflows/test.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ jobs:
130130
EVM_SINGLE_IMAGE_REPO: ghcr.io/${{ github.repository_owner }}/ev-node-evm-single
131131
EVM_SINGLE_NODE_IMAGE_TAG: ${{ inputs.image-tag }}
132132

133-
134133
build_all-apps:
135134
name: Build All ev-node Binaries
136135
runs-on: ubuntu-latest

CHANGELOG.md

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# Changelog
32

43
<!--
@@ -10,37 +9,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
109

1110
## [Unreleased]
1211

12+
### Changed
13+
14+
- Use cache instead of in memory store for reaper. Persist cache on reload. Autoclean after 24 hours. ([#2811](https://github.com/evstack/ev-node/pull/2811))
15+
16+
## v1.0.0-beta.9
17+
1318
### Added
1419

1520
<!-- New features or capabilities -->
21+
22+
- 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))
23+
- 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))
24+
- 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))
25+
- 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))
1626
- Added gRPC execution client implementation for remote execution services using Connect-RPC protocol ([#2490](https://github.com/evstack/ev-node/pull/2490))
1727
- Added `ExecutorService` protobuf definition with InitChain, GetTxs, ExecuteTxs, and SetFinal RPCs ([#2490](https://github.com/evstack/ev-node/pull/2490))
1828
- Added new `grpc` app for running EVNode with a remote execution layer via gRPC ([#2490](https://github.com/evstack/ev-node/pull/2490))
1929

2030
### Changed
2131

2232
<!-- Changes to existing functionality -->
33+
34+
- Hardened signer CLI and block pipeline per security audit: passphrases must be provided via `--evnode.signer.passphrase_file`, JWT secrets must be provided via `--evm.jwt-secret-file`, data/header validation enforces metadata and timestamp checks, and the reaper backs off on failures (BREAKING) ([#2764](https://github.com/evstack/ev-node/pull/2764))
35+
- Added retries around executor `ExecuteTxs` calls to better tolerate transient execution errors ([#2784](https://github.com/evstack/ev-node/pull/2784))
36+
- Increased default `ReadinessMaxBlocksBehind` from 3 to 30 blocks so `/health/ready` stays true during normal batch sync ([#2779](https://github.com/evstack/ev-node/pull/2779))
2337
- Updated EVM execution client to use new `txpoolExt_getTxs` RPC API for retrieving pending transactions as RLP-encoded bytes
2438

2539
### Deprecated
2640

2741
<!-- Features that will be removed in future versions -->
28-
-
2942

3043
### Removed
3144

3245
<!-- Features that were removed -->
33-
-
46+
47+
- Removed `LastCommitHash`, `ConsensusHash`, and `LastResultsHash` from the canonical header representation in favor of slim headers (BREAKING; legacy hashes now live under `Header.Legacy`) ([#2766](https://github.com/evstack/ev-node/pull/2766))
3448

3549
### Fixed
3650

3751
<!-- Bug fixes -->
38-
- Pass correct namespaces for header and data to the da layer for posting ([#2560](https://github.com/evstack/ev-node/pull/2560))
3952

4053
### Security
4154

4255
<!-- Security vulnerability fixes -->
43-
-
4456

4557
<!--
4658
## Category Guidelines:
@@ -111,4 +123,4 @@ Pre-release versions: 0.x.y (anything may change)
111123
-->
112124

113125
<!-- Links -->
114-
[Unreleased]: https://github.com/evstack/ev-node/compare/v1.0.0-beta.1...HEAD
126+
- [Unreleased]: https://github.com/evstack/ev-node/compare/v1.0.0-beta.1...HEAD

apps/evm/single/go.mod

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,16 @@ go 1.24.6
44

55
replace github.com/celestiaorg/go-header => github.com/julienrbrt/go-header v0.0.0-20251008134330-747c8c192fa8 // TODO: to remove after https://github.com/celestiaorg/go-header/pull/347
66

7-
replace (
8-
github.com/evstack/ev-node => ../../../
9-
github.com/evstack/ev-node/core => ../../../core
10-
github.com/evstack/ev-node/da => ../../../da
11-
github.com/evstack/ev-node/execution/evm => ../../../execution/evm
12-
github.com/evstack/ev-node/sequencers/single => ../../../sequencers/single
13-
)
7+
replace github.com/evstack/ev-node => ../../../
148

159
require (
1610
github.com/celestiaorg/go-header v0.7.3
1711
github.com/ethereum/go-ethereum v1.16.5
18-
github.com/evstack/ev-node v1.0.0-beta.8
19-
github.com/evstack/ev-node/core v1.0.0-beta.3
20-
github.com/evstack/ev-node/da v0.0.0-20250317130407-e9e0a1b0485e
21-
github.com/evstack/ev-node/execution/evm v0.0.0-00010101000000-000000000000
22-
github.com/evstack/ev-node/sequencers/single v0.0.0-00010101000000-000000000000
12+
github.com/evstack/ev-node v1.0.0-beta.9
13+
github.com/evstack/ev-node/core v1.0.0-beta.4
14+
github.com/evstack/ev-node/da v1.0.0-beta.5
15+
github.com/evstack/ev-node/execution/evm v1.0.0-beta.3
16+
github.com/evstack/ev-node/sequencers/single v1.0.0-beta.3
2317
github.com/ipfs/go-datastore v0.9.0
2418
github.com/spf13/cobra v1.10.1
2519
)

apps/evm/single/go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ github.com/ethereum/go-ethereum v1.16.5 h1:GZI995PZkzP7ySCxEFaOPzS8+bd8NldE//1qv
103103
github.com/ethereum/go-ethereum v1.16.5/go.mod h1:kId9vOtlYg3PZk9VwKbGlQmSACB5ESPTBGT+M9zjmok=
104104
github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
105105
github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
106+
github.com/evstack/ev-node/core v1.0.0-beta.4 h1:F/rqHCrZ+ViUY4I6RuoBVvkhYfosD68yo/6gCdGRdmo=
107+
github.com/evstack/ev-node/core v1.0.0-beta.4/go.mod h1:n2w/LhYQTPsi48m6lMj16YiIqsaQw6gxwjyJvR+B3sY=
108+
github.com/evstack/ev-node/da v1.0.0-beta.5 h1:rWs/H0Nkj9uwTqD7Tzu+PpaNHGFE71B1ZVKCFLx0yVI=
109+
github.com/evstack/ev-node/da v1.0.0-beta.5/go.mod h1:lJ7vGlczBwiqTaTE9C4zV9tEsQO+oi0sqyUyYzj3zpo=
110+
github.com/evstack/ev-node/execution/evm v1.0.0-beta.3 h1:xo0mZz3CJtntP1RPLFDBubBKpNkqStImt9H9N0xysj8=
111+
github.com/evstack/ev-node/execution/evm v1.0.0-beta.3/go.mod h1:yazCKZaVczYwizfHYSQ4KIYqW0d42M7q7e9AxuSXV3s=
112+
github.com/evstack/ev-node/sequencers/single v1.0.0-beta.3 h1:BT/UeH7Tf8z0btzomCzTbbDDZGAT8/yHcd6xY6P/aaw=
113+
github.com/evstack/ev-node/sequencers/single v1.0.0-beta.3/go.mod h1:eCkDecdJ3s7TB3R5nFdPDyz7jjRmwYen6lGe9D2sSH4=
106114
github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY=
107115
github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg=
108116
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=

apps/grpc/single/go.mod

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ module github.com/evstack/ev-node/apps/grpc/single
33
go 1.24.6
44

55
require (
6-
github.com/evstack/ev-node v1.0.0-beta.8
7-
github.com/evstack/ev-node/core v1.0.0-beta.3
8-
github.com/evstack/ev-node/da v1.0.0-beta.1
6+
github.com/evstack/ev-node v1.0.0-beta.9
7+
github.com/evstack/ev-node/core v1.0.0-beta.4
8+
github.com/evstack/ev-node/da v1.0.0-beta.5
99
github.com/evstack/ev-node/execution/grpc v0.0.0
10-
github.com/evstack/ev-node/sequencers/single v0.0.0
10+
github.com/evstack/ev-node/sequencers/single v1.0.0-beta.3
1111
github.com/spf13/cobra v1.10.1
1212
)
1313

@@ -166,8 +166,5 @@ require (
166166

167167
replace (
168168
github.com/evstack/ev-node => ../../../
169-
github.com/evstack/ev-node/core => ../../../core
170-
github.com/evstack/ev-node/da => ../../../da
171169
github.com/evstack/ev-node/execution/grpc => ../../../execution/grpc
172-
github.com/evstack/ev-node/sequencers/single => ../../../sequencers/single
173170
)

apps/grpc/single/go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
6262
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
6363
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
6464
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
65+
github.com/evstack/ev-node/core v1.0.0-beta.4 h1:F/rqHCrZ+ViUY4I6RuoBVvkhYfosD68yo/6gCdGRdmo=
66+
github.com/evstack/ev-node/core v1.0.0-beta.4/go.mod h1:n2w/LhYQTPsi48m6lMj16YiIqsaQw6gxwjyJvR+B3sY=
67+
github.com/evstack/ev-node/da v1.0.0-beta.5 h1:rWs/H0Nkj9uwTqD7Tzu+PpaNHGFE71B1ZVKCFLx0yVI=
68+
github.com/evstack/ev-node/da v1.0.0-beta.5/go.mod h1:lJ7vGlczBwiqTaTE9C4zV9tEsQO+oi0sqyUyYzj3zpo=
69+
github.com/evstack/ev-node/sequencers/single v1.0.0-beta.3 h1:BT/UeH7Tf8z0btzomCzTbbDDZGAT8/yHcd6xY6P/aaw=
70+
github.com/evstack/ev-node/sequencers/single v1.0.0-beta.3/go.mod h1:eCkDecdJ3s7TB3R5nFdPDyz7jjRmwYen6lGe9D2sSH4=
6571
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
6672
github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
6773
github.com/filecoin-project/go-jsonrpc v0.9.0 h1:G47qEF52w7GholpI21vPSTVBFvsrip6geIoqNiqyZtQ=

apps/testapp/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ replace (
1313

1414
require (
1515
github.com/celestiaorg/go-header v0.7.3
16-
github.com/evstack/ev-node v1.0.0-beta.8
17-
github.com/evstack/ev-node/core v1.0.0-beta.3
16+
github.com/evstack/ev-node v1.0.0-beta.9
17+
github.com/evstack/ev-node/core v1.0.0-beta.4
1818
github.com/evstack/ev-node/da v0.0.0-00010101000000-000000000000
1919
github.com/evstack/ev-node/sequencers/single v0.0.0-00010101000000-000000000000
2020
github.com/ipfs/go-datastore v0.9.0

block/components.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ func NewAggregatorComponents(
236236
genesis,
237237
logger,
238238
executor,
239+
cacheManager,
239240
reaping.DefaultInterval,
240241
)
241242
if err != nil {

block/internal/cache/bench_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ok github.com/evstack/ev-node/block/internal/cache 25.834s
2828
*/
2929

3030
func benchSetupStore(b *testing.B, n int, txsPer int, chainID string) store.Store {
31-
ds, err := store.NewDefaultInMemoryKVStore()
31+
ds, err := store.NewTestInMemoryKVStore()
3232
if err != nil {
3333
b.Fatal(err)
3434
}

0 commit comments

Comments
 (0)