Skip to content

Commit af9c353

Browse files
authored
Merge branch 'main' into julien/use-cache-seenstore
2 parents d5aa3e5 + 271f74b commit af9c353

11 files changed

Lines changed: 163 additions & 505 deletions

File tree

.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: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
### Added
1414

1515
<!-- New features or capabilities -->
16+
- 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))
17+
- 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))
18+
- 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))
19+
- 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))
1620
- Added gRPC execution client implementation for remote execution services using Connect-RPC protocol ([#2490](https://github.com/evstack/ev-node/pull/2490))
1721
- Added `ExecutorService` protobuf definition with InitChain, GetTxs, ExecuteTxs, and SetFinal RPCs ([#2490](https://github.com/evstack/ev-node/pull/2490))
1822
- Added new `grpc` app for running EVNode with a remote execution layer via gRPC ([#2490](https://github.com/evstack/ev-node/pull/2490))
1923

2024
### Changed
2125

2226
<!-- Changes to existing functionality -->
27+
- 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))
28+
- Added retries around executor `ExecuteTxs` calls to better tolerate transient execution errors ([#2784](https://github.com/evstack/ev-node/pull/2784))
29+
- 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))
2330
- Updated EVM execution client to use new `txpoolExt_getTxs` RPC API for retrieving pending transactions as RLP-encoded bytes
2431

2532
### Deprecated
@@ -30,12 +37,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3037
### Removed
3138

3239
<!-- Features that were removed -->
33-
-
40+
- 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))
3441

3542
### Fixed
3643

3744
<!-- 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))
3945

4046
### Security
4147

execution/evm/go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/evstack/ev-node/execution/evm
33
go 1.24.6
44

55
require (
6-
github.com/ethereum/go-ethereum v1.16.5
6+
github.com/ethereum/go-ethereum v1.16.6
77
github.com/evstack/ev-node/core v1.0.0-beta.4
88
github.com/golang-jwt/jwt/v5 v5.3.0
99
github.com/rs/zerolog v1.34.0
@@ -13,6 +13,7 @@ require (
1313
require (
1414
github.com/DataDog/zstd v1.5.5 // indirect
1515
github.com/Microsoft/go-winio v0.6.2 // indirect
16+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect
1617
github.com/StackExchange/wmi v1.2.1 // indirect
1718
github.com/bits-and-blooms/bitset v1.20.0 // indirect
1819
github.com/consensys/gnark-crypto v0.18.0 // indirect

execution/evm/go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
22
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
33
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
44
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
5+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU=
6+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
57
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
68
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
79
github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0=
@@ -54,8 +56,8 @@ github.com/ethereum/c-kzg-4844/v2 v2.1.3 h1:DQ21UU0VSsuGy8+pcMJHDS0CV1bKmJmxsJYK
5456
github.com/ethereum/c-kzg-4844/v2 v2.1.3/go.mod h1:fyNcYI/yAuLWJxf4uzVtS8VDKeoAaRM8G/+ADz/pRdA=
5557
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk=
5658
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8=
57-
github.com/ethereum/go-ethereum v1.16.5 h1:GZI995PZkzP7ySCxEFaOPzS8+bd8NldE//1qvQDQpe0=
58-
github.com/ethereum/go-ethereum v1.16.5/go.mod h1:kId9vOtlYg3PZk9VwKbGlQmSACB5ESPTBGT+M9zjmok=
59+
github.com/ethereum/go-ethereum v1.16.6 h1:g/7uDKVgHr3n0wD2jOGUcTuKcjSdt5H4lbJYaRB5kH0=
60+
github.com/ethereum/go-ethereum v1.16.6/go.mod h1:7H+5GueIhAtyrByVxUeT3DJdGlsSnz59gm5eqnXBItw=
5961
github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
6062
github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
6163
github.com/evstack/ev-node/core v1.0.0-beta.4 h1:F/rqHCrZ+ViUY4I6RuoBVvkhYfosD68yo/6gCdGRdmo=

execution/evm/test/go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.24.6
44

55
require (
66
github.com/celestiaorg/tastora v0.7.5
7-
github.com/ethereum/go-ethereum v1.16.5
7+
github.com/ethereum/go-ethereum v1.16.6
88
github.com/evstack/ev-node/execution/evm v0.0.0-00010101000000-000000000000
99
github.com/golang-jwt/jwt/v5 v5.3.0
1010
github.com/moby/moby v27.5.1+incompatible
@@ -27,6 +27,7 @@ require (
2727
github.com/BurntSushi/toml v1.5.0 // indirect
2828
github.com/DataDog/zstd v1.5.5 // indirect
2929
github.com/Microsoft/go-winio v0.6.2 // indirect
30+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect
3031
github.com/StackExchange/wmi v1.2.1 // indirect
3132
github.com/avast/retry-go/v4 v4.6.1 // indirect
3233
github.com/beorn7/perks v1.0.1 // indirect

execution/evm/test/go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
3737
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
3838
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
3939
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
40+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU=
41+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
4042
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
4143
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
4244
github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0=
@@ -184,8 +186,8 @@ github.com/ethereum/c-kzg-4844/v2 v2.1.3 h1:DQ21UU0VSsuGy8+pcMJHDS0CV1bKmJmxsJYK
184186
github.com/ethereum/c-kzg-4844/v2 v2.1.3/go.mod h1:fyNcYI/yAuLWJxf4uzVtS8VDKeoAaRM8G/+ADz/pRdA=
185187
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk=
186188
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8=
187-
github.com/ethereum/go-ethereum v1.16.5 h1:GZI995PZkzP7ySCxEFaOPzS8+bd8NldE//1qvQDQpe0=
188-
github.com/ethereum/go-ethereum v1.16.5/go.mod h1:kId9vOtlYg3PZk9VwKbGlQmSACB5ESPTBGT+M9zjmok=
189+
github.com/ethereum/go-ethereum v1.16.6 h1:g/7uDKVgHr3n0wD2jOGUcTuKcjSdt5H4lbJYaRB5kH0=
190+
github.com/ethereum/go-ethereum v1.16.6/go.mod h1:7H+5GueIhAtyrByVxUeT3DJdGlsSnz59gm5eqnXBItw=
189191
github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
190192
github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
191193
github.com/evstack/ev-node/core v1.0.0-beta.4 h1:F/rqHCrZ+ViUY4I6RuoBVvkhYfosD68yo/6gCdGRdmo=

0 commit comments

Comments
 (0)