Skip to content

Commit 205d270

Browse files
authored
chore: sync to arc-node (#74)
Automated sync via Copybara.
2 parents c5f9f7d + 205c9f2 commit 205d270

215 files changed

Lines changed: 23785 additions & 5488 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ docker-bake.hcl
5959

6060
# CI/CD and tooling
6161
.github/
62+
.agents/
6263
.claude/
6364
.gitlab-ci.yml
6465
.travis.yml

.github/workflows/build-docker.yaml

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ jobs:
7171
${{ matrix.image }}.tags=
7272
${{ matrix.image }}.output=type=oci,tar=false,dest=/tmp/image
7373
env:
74+
BUILDX_NO_DEFAULT_ATTESTATIONS: 1
7475
GITHUB_TOKEN: ${{ github.token }}
7576
GIT_COMMIT_HASH: ${{ github.sha }}
7677
GIT_VERSION: ${{ github.ref_name }}
@@ -104,17 +105,23 @@ jobs:
104105
env:
105106
IMAGE: ${{ env.REGISTRY }}/${{ env.REGISTRY_NAMESPACE }}/${{ matrix.image }}
106107
BAKE_METADATA: ${{ steps.build.outputs.metadata }}
108+
MATRIX_IMAGE: ${{ matrix.image }}
109+
MATRIX_PLATFORM: ${{ matrix.platform }}
107110
run: |
108-
DIGEST=$(echo "${BAKE_METADATA}" | jq -r '."${{ matrix.image }}"."containerimage.digest"')
111+
DIGEST=$(echo "${BAKE_METADATA}" | jq -r --arg img "${MATRIX_IMAGE}" '.[$img]."containerimage.digest"')
109112
if [ -z "${DIGEST}" ] || [ "${DIGEST}" = "null" ]; then
110113
echo "::error::Failed to extract digest from build metadata"
111114
exit 1
112115
fi
113-
skopeo copy "oci:/tmp/image" "docker://${IMAGE}@${DIGEST}"
116+
skopeo copy "oci:/tmp/image" "docker://${IMAGE}@${DIGEST}" --digestfile /tmp/push-digest
114117
rm -rf /tmp/image
115-
PLATFORM_SLUG=$(echo "${{ matrix.platform }}" | tr '/' '-')
116-
mkdir -p "/tmp/digests/${{ matrix.image }}"
117-
echo "${DIGEST}" > "/tmp/digests/${{ matrix.image }}/${PLATFORM_SLUG}"
118+
REGISTRY_DIGEST=$(cat /tmp/push-digest)
119+
if [ "${DIGEST}" != "${REGISTRY_DIGEST}" ]; then
120+
echo "::warning::Bake metadata digest ${DIGEST} differs from registry digest ${REGISTRY_DIGEST}"
121+
fi
122+
PLATFORM_SLUG=$(echo "${MATRIX_PLATFORM}" | tr '/' '-')
123+
mkdir -p "/tmp/digests/${MATRIX_IMAGE}"
124+
echo "${REGISTRY_DIGEST}" > "/tmp/digests/${MATRIX_IMAGE}/${PLATFORM_SLUG}"
118125
119126
- name: Upload digest
120127
if: ${{ github.event_name == 'push' }}
@@ -188,11 +195,13 @@ jobs:
188195
echo "image-with-digest=${IMAGE}@${MANIFEST_DIGEST}" >> "$GITHUB_OUTPUT"
189196
190197
- name: Generate SBOM
198+
continue-on-error: true
191199
uses: anchore/sbom-action@17ae1740179002c89186b61233e0f892c3118b11 # v0.23.0
192200
with:
193201
image: ${{ steps.manifest.outputs.image-with-digest }}
194202
artifact-name: sbom-${{ matrix.image }}.spdx.json
195203
output-file: sbom-${{ matrix.image }}.spdx.json
204+
upload-release-assets: false
196205

197206
- name: Attest build provenance
198207
uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0

.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,6 @@ terraform.tfvars*
117117
.claude/memory/
118118
.claude/worktrees/
119119
.claude/todo.md
120-
.claude/skills/**
121-
!.claude/skills/
122-
!.claude/skills/*/
123-
!.claude/skills/*/**
124120
.planning
125121

126122
deployments/certs/*

BREAKING_CHANGES.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Breaking Changes
2+
3+
Records breaking changes between tagged public releases of [`arc-node`](https://github.com/circlefin/arc-node).
4+
5+
Each bullet is prefixed with a flag identifying the kind of breaking change:
6+
7+
- `[CLI]` -- CLI flag added, renamed, removed, or made required.
8+
- `[Config]` -- default value, environment variable, or manifest field change.
9+
- `[Format]` -- log, metric label, or serialized output format change that breaks parsers.
10+
11+
Entries are split by audience. A change appears under `### For Validators` when validator-mode operation must change; otherwise it appears under `### For Node Operators`. A change requiring both audiences to act appears in both sections (rare).
12+
13+
Compare and release-notes links resolve once the corresponding tag is published at [`circlefin/arc-node`](https://github.com/circlefin/arc-node).
14+
15+
## [v0.7.1]
16+
17+
**Changes:** [v0.7.0...v0.7.1](https://github.com/circlefin/arc-node/compare/v0.7.0...v0.7.1) -- [release notes](https://github.com/circlefin/arc-node/releases/tag/v0.7.1)
18+
19+
*Note: testnet node operators must use v0.7.1 before timestamp `1779894517` (2026-05-27 15:08:37 UTC), when Zero5/Zero6 activate on testnet. Earlier versions are not supported.*
20+
21+
### For Node Operators
22+
23+
- **[Config] `arc-node-execution`: EL RPC connection defaults tightened.**
24+
- `--rpc.max-connections` default: `500` -> `250`.
25+
- `--rpc.max-subscriptions-per-connection` default: `1024` -> `32`.
26+
- Both flags remain accepted on `arc-node-execution`; operators that need the previous behavior must pass them explicitly. The new defaults bound a WebSocket subscription fan-out memory pressure path; real-world clients typically multiplex around five subscriptions per socket and are unaffected.
27+
28+
## [v0.7.0]
29+
30+
**Changes:** [v0.6.0...v0.7.0](https://github.com/circlefin/arc-node/compare/v0.6.0...v0.7.0) -- [release notes](https://github.com/circlefin/arc-node/releases/tag/v0.7.0)
31+
32+
*Note: mainnet node operators must use v0.7.0. Earlier versions are not supported.*
33+
34+
### For Node Operators
35+
36+
- **[CLI] `arc-node-execution`: pending-tx flag rename and default flip.**
37+
- Old (`v0.6.0`): `--arc.hide-pending-txs` (opt-in to hide, default exposed).
38+
- New (`v0.7.0`): `--arc.expose-pending-txs` (opt-in to expose, default hidden).
39+
- Adds `--public-api`, a convenience flag for externally-exposed nodes that forces hiding and warns if `--http.api` / `--ws.api` expose namespaces outside `{eth, net, web3, rpc}`.
40+
- Nodes that relied on the default exposure must now pass `--arc.expose-pending-txs` or adopt the new secure-by-default behavior.
41+
42+
- **[Config] `arc-node-consensus`: `--execution-persistence-backpressure-threshold=0` is rejected at startup.**
43+
- Old (`v0.6.0`): `0` was accepted and caused indefinite stalling.
44+
- New (`v0.7.0`): the value must be `> 0`; the CL refuses to start otherwise.
45+
- Backpressure trigger semantics also changed: the gap now triggers when it *reaches* the threshold (previously *exceeds*).
46+
- The default (`16`) is unchanged. Only operators who set this flag explicitly to `0` (now rejected) or who monitor the exact threshold value need to act.
47+
48+
- **[Config] CL default `--log-level` changed from `debug` to `info`.**
49+
Not a config syntax change, but a behavior change that affects log volume and content. Pass `--log-level debug` explicitly if your tooling depends on debug-level output.
50+
51+
- **[Format] libp2p protocol identifiers on mainnet are Arc-branded.**
52+
- The CL on mainnet (chain id `5042`) advertises Arc-branded libp2p protocol IDs from v0.7.0. A pre-v0.7.0 CL **cannot** peer with a v0.7.0 CL on mainnet.
53+
- Operators must upgrade all mainnet nodes before or simultaneously with the v0.7.0 rollout; staged rollouts that leave a subset of nodes on `v0.6.x` will fragment the mainnet mesh.
54+
- Testnet (`5042002`) protocol IDs are unchanged in this release.
55+
56+
- **[Format] Address and public-key rendering uniformly switched to `0x`-prefixed lowercase hex.**
57+
- Logs, metrics, and JSON-RPC responses now use a single canonical format (signatures continue to use Base64). EIP-55 checksums are not used; Prometheus labels are case-sensitive.
58+
- Log parsers, alerting rules, and dashboards built against the previous mixed formats (EIP-55 checksummed, non-prefixed hex, etc.) must be updated.
59+
60+
### For Validators
61+
62+
- **[CLI] `arc-node-consensus`: `--validator` is required for block signing and voting.**
63+
- The CL now runs as a non-voting full node unless `--validator` is explicitly set.
64+
- The flag did not exist in `v0.6.0`. Validator operators upgrading from `v0.6.0` must add `--validator` to their startup command or they will stop participating in consensus.
65+
66+
- **[CLI] `arc-node-consensus`: `--suggested-fee-recipient` is required when `--validator` is set.**
67+
- Enforced at startup. Omitting the recipient with `--validator` set causes the binary to refuse to start.
68+
- **Important**: this address is where block rewards (tx fees, in USDC) collect after successful proposals are made.
69+
- Example:
70+
71+
```
72+
arc-node-consensus start \
73+
--validator \
74+
--suggested-fee-recipient 0xYOUR_ADDRESS \
75+
...
76+
```
77+
78+
## [v0.6.0]
79+
80+
Baseline -- initial public open-source release. Treat the [`v0.6.0`](https://github.com/circlefin/arc-node/releases/tag/v0.6.0) tag as the reference point for subsequent breaking-change notes. No breaking-change entries are recorded for this release.

CHANGELOG.md

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# Changelog
2+
3+
All notable changes to arc-node are documented in this file.
4+
5+
## [v0.7.1]
6+
7+
**Changes:** [v0.7.0...v0.7.1](https://github.com/circlefin/arc-node/compare/v0.7.0...v0.7.1) -- [release notes](https://github.com/circlefin/arc-node/releases/tag/v0.7.1)
8+
9+
*Note: testnet node operators must use v0.7.1 before timestamp `1779894517` (2026-05-27 15:08:37 UTC), when Zero5/Zero6 activate on testnet. Earlier versions are not supported.*
10+
11+
### For Node Operators
12+
13+
- **[Config] EL RPC connection defaults tightened.** `--rpc.max-connections` default lowered from `500` to `250`; `--rpc.max-subscriptions-per-connection` default lowered from `1024` to `32`. Operators running tooling that opens many concurrent WebSocket connections, or that subscribes more than 32 times on a single connection, must raise these explicitly on the `arc-node-execution` command line. See [BREAKING_CHANGES.md](./BREAKING_CHANGES.md#v071) for migration details.
14+
15+
### Features
16+
17+
- [Shared] Enable global keccak cache and asm-backed keccak
18+
- [Spammer] Expose per-run telemetry from the spammer
19+
20+
### Fixes
21+
22+
- [EL] Avoid double-hashing initCode on CREATE2 with non-zero value
23+
- [EL] Activate testnet Zero5/Zero6 by timestamp instead of block height to preserve fork-id compatibility across mixed-version peers
24+
25+
## [v0.7.0]
26+
27+
**Changes:** [v0.6.0...v0.7.0](https://github.com/circlefin/arc-node/compare/v0.6.0...v0.7.0) -- [release notes](https://github.com/circlefin/arc-node/releases/tag/v0.7.0)
28+
29+
### For Node Operators
30+
31+
*Note: mainnet node operators must use v0.7.0. Earlier versions are not supported.*
32+
33+
- **[Config] Pending transactions are hidden from RPC by default.** Renamed `--arc.hide-pending-txs` (opt-in to hide) to `--arc.expose-pending-txs` (opt-in to expose) and flipped the default. Added `--public-api`, a convenience flag for externally-exposed nodes that forces hiding and warns if `--http.api` / `--ws.api` expose namespaces outside `{eth, net, web3, rpc}`.
34+
- **[Config] CL default log level changed from `debug` to `info`.** Pass `--log-level debug` explicitly if your monitoring depends on debug-level output.
35+
- **[Config] `--follow` no longer requires `--follow.endpoint` for standard chains.** The CL resolves a default RPC endpoint from the chain id at startup; run `arc-node-consensus start --help` for the per-chain defaults. Explicit `--follow.endpoint` still takes precedence.
36+
- **[CLI] New `--txpool.rebroadcast-interval` flag (EL).** Periodic re-announcement of pending transactions to peers (default `60` seconds, `0` to disable). Recovers from missed gossip announcements.
37+
- **[CLI] New `--pprof.heap-prof` flag (EL and CL).** Enables jemalloc heap profiling on demand when built with `--features pprof`. Heap profiling is now inactive by default.
38+
- **[Config] `--execution-persistence-backpressure-threshold` must be greater than zero** and triggers when the gap *reaches* the threshold (previously *exceeds*). Default is `16` and is unchanged; operators who never set this flag explicitly are unaffected. See [BREAKING_CHANGES.md](./BREAKING_CHANGES.md#v070) for migration details.
39+
- **[API] New `/ready` readiness probe** and `sync_state` field on the CL `/status` endpoint.
40+
- **[CLI] New `arc-node-consensus db rollback` command** (alias: `unwind`) for operator-driven rollback. Dry-run by default; pass `--execute` to commit. `--num-heights` and `--to-height` are mutually exclusive.
41+
- **[Config] Arc mainnet is a named chainspec** (`--chain arc-mainnet`, chain id `5042`).
42+
43+
### For Validators
44+
45+
- **[CLI] `--validator` flag is required** for a CL to participate in block signing and voting. Without it, the node runs as a non-voting full node. This flag did not exist in `v0.6.0`. See [BREAKING_CHANGES.md](./BREAKING_CHANGES.md#v070).
46+
- **[CLI] `--suggested-fee-recipient` is required when `--validator` is set.** It is required that this address be set / non-zero.
47+
48+
```
49+
arc-node-consensus start \
50+
--validator \
51+
--suggested-fee-recipient 0xYOUR_ADDRESS \
52+
...
53+
```
54+
55+
- **[Format] Equivocation evidence log levels raised**: persistence failures promoted from `warn` to `error`, successful persistence from `info` to `warn`. Both include validator addresses for forensics.
56+
- **[API] Validator public key exposed in the CL `/status` endpoint.**
57+
- **[Format] Address and public-key rendering uniformly switched to `0x`-prefixed lowercase hex.** Logs, metrics, and JSON-RPC responses use this single canonical format (signatures continue to use Base64). Tooling that parsed EIP-55 checksummed addresses or non-prefixed hex must be updated.
58+
59+
### Features
60+
61+
- [CL] Add `--validator` configuration flag
62+
- [CL] Require `--suggested-fee-recipient` when `--validator` is set
63+
- [CL] Resolve default follow endpoint from chain id
64+
- [CL] Add `/ready` readiness probe and `sync_state` to `/status`
65+
- [CL] Add `db rollback` command (alias: `unwind`) for operator-driven rollback
66+
- [CL] Raise equivocation evidence log levels
67+
- [CL] Add versioned wire encoding for consensus network messages
68+
- [CL] Harden validator-set decoding against malformed public keys
69+
- [CL] Count and log invalid payloads across all storage paths
70+
- [CL] Model consensus fork history; narrow `ForkCondition` to height-only
71+
- [CL] Use Arc-branded libp2p protocol names on mainnet; see [BREAKING_CHANGES.md](./BREAKING_CHANGES.md#v070) for cross-version peering implications
72+
- [CL] Detect EL crashes over IPC and log a diagnostic instead of silently stalling
73+
- [EL] Implement **Zero7** hardfork: `CallFrom` subcall precompile, `Multicall3From`, `Memo`
74+
- [EL] Apply EIP-2929 warm/cold pricing to precompile account loads; see [BREAKING_CHANGES.md](./BREAKING_CHANGES.md#v070) for the gas-estimation impact
75+
- [EL] Add periodic transaction rebroadcast to recover from missed gossip
76+
- [EL] Unconditionally use validator-provided beneficiary addresses
77+
- [EL] Apply `0xef` non-deployable prefix (EIP-3541) to Arc precompile addresses in genesis, preventing EOAs or contracts from being deployed at those addresses
78+
- [EL] EEST fixture runner for EVM spec test validation
79+
- [EL] Register `arc-mainnet` as a named chainspec (Zero3-Zero6 active at block `0`)
80+
- [EL] Finalize mainnet genesis with USDC admin roles, denylist, prefunded ops wallet
81+
- [Shared] Add `--pprof.heap-prof` flag for on-demand heap profiling
82+
- [Shared] Uniformize address and key rendering to `0x`-prefixed lowercase hex
83+
- [Contracts] ProtocolConfig upgrade scripts; remove `rewardBeneficiary` field (proposer-provided fee recipient is authoritative)
84+
- [Contracts] Deploy denylist contract on testnet (mainnet ships it pre-deployed in genesis)
85+
- [Quake] Testnet orchestrator improvements: web topology viewer, node-group support in `load` / `spam`, mesh/health/performance/sanity test runner with report generation, manifest fields for EL/CL CPU and memory limits and `block_gas_limit`
86+
- [Bench] `arc-engine-bench` with IPC and RPC engine transports
87+
- [Bench] Nightly engine bench workflow
88+
- [Spammer] Cache gas estimates for ERC-20 and Guzzler transactions
89+
- [Spammer] Reuse with parallel nonce resync and reduced request timeout
90+
- [Spammer] Improved send-stall visibility
91+
92+
### Fixes
93+
94+
- [CL] Prevent stream eviction by colluding validators
95+
- [CL] Propagate `pol_round` as `valid_round` in assembled blocks
96+
- [CL] On restream, look up block by hash and preserve `round` / `valid_round`
97+
- [CL] Fetch validator set at `certificate_height - 1` in `get_certificate_info`
98+
- [CL] Align `RemoteSigningProvider` Ed25519 verification with Malachite
99+
- [CL] Bound repeated proto fields to prevent unbounded allocation
100+
- [CL] Use checked arithmetic in `total_voting_power()`
101+
- [CL] Account for EL earliest block in `GetHistoryMinHeight`
102+
- [CL] Skip persistence wait during sync when block is already present or height decided
103+
- [CL] Acknowledge `AppMsg::Decided` so sync advertises a new tip
104+
- [CL] Mark undecided block `Invalid` on engine validation errors; persist verdict
105+
- [CL] Surface duplicate Init/Fin proposal parts as `InsertResult::Invalid`
106+
- [CL] Improve EL/CL height-mismatch error with actionable guidance
107+
- [CL] Update backpressure semantics
108+
- [EL] Suppress pool-based pending-tx leaks in RPC middleware
109+
- [EL] Charge EIP-2929 cold account access cost in `CallFrom` subcalls
110+
- [EL] Blocklist SLOADs are unmetered on native value transfers
111+
- [EL] Consume all gas for subcall in static context
112+
- [EL] Charge gas for subcall completion phase
113+
- [EL] Strictly decode ABI parameters in precompiles
114+
- [EL] Implement EIP-2200 sentry for `SSTORE`
115+
- [EL] Apply new-account surcharge via precompiles
116+
- [EL] Extend early-revert penalty to auth reverts in Zero6
117+
- [EL] Drop redundant `SLOAD` charge in `storeGasValuesCall` under Zero6
118+
- [EL] Align `totalSupply` input validation with other precompiles
119+
- [EL] Revert child state when subcall precompile rejects
120+
- [EL] Resolve EIP-7702 delegation when loading subcall target bytecode
121+
- [EL] Check EIP-7702 authorization-list authorities against the denylist
122+
- [EL] `DenylistedAddressError` should not penalize peers
123+
- [EL] Include base fee in payload builder fee totals
124+
- [EL] Use checked arithmetic for cumulative gas accounting in payload builder
125+
- [EL] Panic on missing subcall continuation instead of reverting
126+
- [Shared] Remediate cargo audit advisories
127+
- [Contracts] Capture `Multicall3From` precompile reverts instead of propagating
128+
- [Quake] Validate manifest flags against consensus binary CLI struct; decouple monitoring lifecycle from `clean` and `restart`
129+
- [Spammer] Lift gas-fee caps above testnet base-fee ceiling
130+
- [Spammer] Fix raw tx encoding, TCP backpressure drain, zero-latency warning
131+
132+
### Docs
133+
134+
Full documentation tree at this release: [`arc-node` v0.7.0 docs](https://github.com/circlefin/arc-node/tree/v0.7.0/docs). New or updated topics in this release:
135+
136+
- Add Docker instructions for running an Arc node
137+
- Add single-host monitoring guide for Arc EL + CL
138+
139+
## [v0.6.0]
140+
141+
**Released:** 2026-04-08 -- [release notes](https://github.com/circlefin/arc-node/releases/tag/v0.6.0)
142+
143+
Initial public open-source release of `arc-node`. Baseline for subsequent changelog entries.

0 commit comments

Comments
 (0)