Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
86bebba
feat: add fulu support
MegaRedHand Mar 2, 2026
f62192a
feat: enable fulu fork
MegaRedHand Mar 2, 2026
3a4ac7d
chore: fix typo
MegaRedHand Mar 2, 2026
0748c38
fix: add missing field to BeaconState
MegaRedHand Mar 3, 2026
500fcc0
refactor: fix compile warnings
MegaRedHand Mar 3, 2026
1d290f1
chore: fmt
MegaRedHand Mar 3, 2026
9fba6e6
chore: fix lint errors
MegaRedHand Mar 3, 2026
004a366
chore: fix dialyzer errors
MegaRedHand Mar 3, 2026
a6cb6d0
fix: dialyzer errors and spectests
MegaRedHand Mar 3, 2026
1fe4e7b
fix: address compilation warnings
MegaRedHand Mar 3, 2026
ea4f5a0
chore: ignore warning
MegaRedHand Mar 3, 2026
c26e4ad
fix: skip
MegaRedHand Mar 3, 2026
8ff879b
fix: make spec-tests pass
MegaRedHand Mar 3, 2026
ffc8d8d
feat: update deposit tree logic
MegaRedHand Mar 3, 2026
fbf7d69
feat: implement status v2 handler
MegaRedHand Mar 4, 2026
2e75f9f
docs: update the specs for Fulu fork
MegaRedHand Mar 4, 2026
53b116a
chore: update config files
MegaRedHand Mar 4, 2026
ea99a03
fixes
MegaRedHand Mar 4, 2026
4cfc428
fix: use Fulu metadata/3
MegaRedHand Mar 4, 2026
7ee8aba
fix: log port stderr to file
MegaRedHand Mar 4, 2026
e0e8328
fix KZG spectests
MegaRedHand Mar 4, 2026
113a873
fix: add missing spectests
MegaRedHand Mar 4, 2026
e366916
fix: take into account BPO forks on fork ID
MegaRedHand Mar 4, 2026
d4c105b
fix: remove deprecated field version in docker-compose
MegaRedHand Mar 4, 2026
beaf75a
feat: implement PeerDAS custody queries
MegaRedHand Mar 4, 2026
2a9ccb1
chore: clean up the grafana dashboard
MegaRedHand Mar 4, 2026
ca56bc4
fixes
MegaRedHand Mar 4, 2026
e293829
chore: fmt and add missing import
MegaRedHand Mar 5, 2026
fb24217
chore: bump checkpoint-sync timeout to 180s
MegaRedHand Mar 5, 2026
9896ad5
fix: use latest data column format
MegaRedHand Mar 5, 2026
27a2ccb
fix: use new package for installing elixir in flake
MegaRedHand Mar 5, 2026
1ccc609
fix: add cmake to flake
MegaRedHand Mar 5, 2026
2ae6bc9
fix: add snappy
MegaRedHand Mar 5, 2026
1e3e426
Revert "fix: add snappy"
MegaRedHand Mar 5, 2026
fcf3274
chore: bump tool versions
MegaRedHand Mar 5, 2026
10e5891
fix: update flake
MegaRedHand Mar 5, 2026
3c808d9
fix: update deprecated pkg
MegaRedHand Mar 5, 2026
73d44e4
fix: handle pruned peer in peerbook
MegaRedHand Mar 5, 2026
3bc058b
fix: add workaround for CMAKE fail
MegaRedHand Mar 5, 2026
4f64cc4
fix: retry on EL payload processing error
MegaRedHand Mar 5, 2026
8a1247b
fix: send iat only to execution engine
MegaRedHand Mar 5, 2026
6a5f2bf
fix: call engine_newPayloadV4
MegaRedHand Mar 6, 2026
ebfb069
fix: update dialyxir
MegaRedHand Mar 6, 2026
95df97f
refactor: add handle_on_block_error/4 on mock
MegaRedHand Mar 6, 2026
55b52ad
fix: rebuild tree on startup and retry column downloads
MegaRedHand Mar 6, 2026
00062c1
fix: periodically retry column downloads
MegaRedHand Mar 6, 2026
e91ecbd
fix parent block not found in tree
MegaRedHand Mar 6, 2026
9ca4058
feat: add timing information to block processing logs
MegaRedHand Mar 6, 2026
037ff09
fix: lint warnings
MegaRedHand Mar 6, 2026
daee652
fix: unpin hex in Dockerfile
MegaRedHand Mar 6, 2026
ed242ef
fix: linter warnings
MegaRedHand Mar 6, 2026
758fbf1
ci: update assertoor to run fulu fork
MegaRedHand Mar 6, 2026
b05bd4f
ci: use lighthouse v8.1.1
MegaRedHand Mar 7, 2026
eb8568c
fix: handle both electra and fulu state types
MegaRedHand Mar 7, 2026
06caead
fix: use struct! to build state at runtime
MegaRedHand Mar 7, 2026
5fb58d4
ci: run spectests with fulu
MegaRedHand Mar 7, 2026
b262881
fixes
MegaRedHand Mar 7, 2026
fba322c
fix: update ethereum-package with fulu support
MegaRedHand Mar 9, 2026
ce0adb8
refactor: fix warning in test
MegaRedHand Mar 9, 2026
a04b603
fix: match generated spec-test filenames in mix.exs
MegaRedHand Mar 9, 2026
13e8027
ci: make lighthouse a supernode
MegaRedHand Mar 9, 2026
abc37fb
fix: update kurtosis version
MegaRedHand Mar 9, 2026
f7a1458
fix: downgrade to version 1.15.2
MegaRedHand Mar 9, 2026
8ec1f72
ci: update go image
MegaRedHand Mar 9, 2026
9e85a72
fix: ignore invalid attestations from blocks
MegaRedHand Mar 9, 2026
e231523
fix: update state cache before storing in DB
MegaRedHand Mar 9, 2026
2db74d5
perf: fix column presence check and retry thundering herd
MegaRedHand Mar 10, 2026
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
32 changes: 32 additions & 0 deletions .dialyzer_ignore.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Dialyzer warnings to ignore.
#
# Most of these are caused by HardForkAliasInjection.fulu?() being a
# compile-time constant (true when .fork_version is "fulu"). This makes
# the non-fulu branches dead code, which dialyzer correctly identifies
# but is intentional by design. These will naturally resolve when the
# fork gate is removed post-Fulu activation.
[
# --- Fork-gate dead code: "Guard test true =:= nil can never succeed" ---
# All from `if HardForkAliasInjection.fulu?()` being always true.
{"lib/lambda_ethereum_consensus/beacon/pending_blocks.ex", :guard_fail},
{"lib/lambda_ethereum_consensus/fork_choice/fork_choice.ex", :guard_fail},
{"lib/lambda_ethereum_consensus/fork_choice/handlers.ex", :guard_fail},
{"lib/lambda_ethereum_consensus/state_transition/misc.ex", :guard_fail},
{"lib/lambda_ethereum_consensus/state_transition/state_transition.ex", :guard_fail},
{"lib/lambda_ethereum_consensus/validator/block_builder.ex", :guard_fail},
{"lib/lambda_ethereum_consensus/validator/validator.ex", :guard_fail},
{"lib/libp2p_port.ex", :guard_fail},
{"lib/types/beacon_chain/beacon_state.ex", :guard_fail},
{"lib/types/p2p/metadata.ex", :guard_fail},
{"test/spec/runners/fork_choice.ex", :guard_fail},
{"test/spec/runners/fork_choice.ex", :pattern_match},

# --- Defensive error-handling: dialyzer infers these branches can't match ---
{"lib/lambda_ethereum_consensus/fork_choice/handlers.ex", :pattern_match_cov},

# --- Fork-gate dead code: unused functions from non-fulu branches ---
{"lib/lambda_ethereum_consensus/beacon/pending_blocks.ex", :unused_fun},
{"lib/lambda_ethereum_consensus/fork_choice/handlers.ex", :unused_fun},
{"lib/lambda_ethereum_consensus/validator/block_builder.ex", :unused_fun},
{"lib/lambda_ethereum_consensus/validator/validator.ex", :unused_fun},
]
2 changes: 1 addition & 1 deletion .fork_version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
electra
fulu
9 changes: 5 additions & 4 deletions .github/config/assertoor/network-params.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
participants:
- el_type: geth
el_image: ethereum/client-go:v1.15.6
el_image: ethereum/client-go:latest
cl_type: lighthouse
cl_image: sigp/lighthouse:v7.0.0-beta.5
cl_image: sigp/lighthouse:v8.1.1
validator_count: 32
supernode: true
count: 2
- el_type: geth
el_image: ethereum/client-go:v1.15.6
el_image: ethereum/client-go:latest
cl_type: lambda
cl_image: lambda_ethereum_consensus:latest
use_separate_vc: false
Expand All @@ -16,7 +17,7 @@ participants:
keymanager_enabled: true

network_params:
electra_fork_epoch: 0
fulu_fork_epoch: 0

additional_services:
- assertoor
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/assertoor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
uses: ethpandaops/kurtosis-assertoor-github-action@v1
with:
enclave_name: "elixir-consensus-assertoor"
kurtosis_version: "1.6.0"
kurtosis_version: "1.15.2"
ethereum_package_url: 'github.com/lambdaclass/ethereum-package'
ethereum_package_branch: 'lecc-integration-electra'
ethereum_package_branch: 'lecc-integration-fulu'
ethereum_package_args: './.github/config/assertoor/network-params.yml'
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
# NOTE: this action comes with caching by default
uses: actions/setup-go@v5
with:
go-version: "1.24"
go-version: "1.26"
cache-dependency-path: |
native/libp2p_port/go.sum
- name: Cache output artifacts
Expand Down Expand Up @@ -293,7 +293,7 @@ jobs:
strategy:
fail-fast: false
matrix:
fork: ["electra"]
fork: ["fulu"]
config: ["minimal", "general", "mainnet"]
runs-on: ubuntu-24.04
steps:
Expand Down
2 changes: 1 addition & 1 deletion .spectest_version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.5.0-beta.3
v1.6.1
8 changes: 4 additions & 4 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
erlang 26.2
elixir 1.16.2-otp-26
golang 1.24.2
rust 1.81.0
erlang 28.4
elixir 1.19.4-otp-28
golang 1.26.0
rust 1.93.1
protoc 30.2
15 changes: 7 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# libp2p port
FROM golang:1.24 AS libp2p_builder
FROM golang:1.26 AS libp2p_builder
LABEL stage=builder

# Install dependencies
Expand All @@ -19,7 +19,7 @@

# Precompile rust crates
# bls nif
FROM rust:1.81.0 AS bls_nif_builder
FROM rust:1.93.1 AS bls_nif_builder
LABEL stage=builder

RUN mkdir /bls_nif
Expand All @@ -31,7 +31,7 @@
rm -rf target/

# kzg nif
FROM rust:1.81.0 AS kzg_nif_builder
FROM rust:1.93.1 AS kzg_nif_builder
LABEL stage=builder

RUN mkdir /kzg_nif
Expand All @@ -43,7 +43,7 @@
rm -rf target/

# snappy nif
FROM rust:1.81.0 AS snappy_nif_builder
FROM rust:1.93.1 AS snappy_nif_builder
LABEL stage=builder

RUN mkdir /snappy_nif
Expand All @@ -55,7 +55,7 @@
rm -rf target/

# ssz nif
FROM rust:1.81.0 AS ssz_nif_builder
FROM rust:1.93.1 AS ssz_nif_builder
LABEL stage=builder

RUN mkdir /ssz_nif
Expand All @@ -67,7 +67,7 @@
rm -rf target/

# Main image
FROM elixir:1.16.2-otp-26
FROM elixir:1.19.4-otp-28

RUN mkdir /consensus
WORKDIR /consensus
Expand All @@ -76,8 +76,7 @@
# To avoid recompiling rustler NIFs
ENV RUSTLER_SKIP_COMPILE=yes

# https://github.com/hexpm/hex/issues/1029#issuecomment-2124545292
RUN mix local.hex 2.0.6 --force
RUN mix local.hex --force

# Install dependencies
RUN apt-get update && apt-get install -y cmake protobuf-compiler
Expand Down Expand Up @@ -120,4 +119,4 @@
# TODO: This could be an issue regarding OS signals, we should use JSONArgs but shell form is the
# only way to pass args to ENTRYPOINT, specially important because of the cookie. Best
# solution would be to move to releases and avoid starting the node manually through iex.
ENTRYPOINT iex $IEX_ARGS_VALUE -S mix run -- $0 $@

Check warning on line 122 in Dockerfile

View workflow job for this annotation

GitHub Actions / ethereum-testnet

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for ENTRYPOINT to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/

Check warning on line 122 in Dockerfile

View workflow job for this annotation

GitHub Actions / Build Docker image

JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals

JSONArgsRecommended: JSON arguments recommended for ENTRYPOINT to prevent unintended behavior related to OS signals More info: https://docs.docker.com/go/dockerfile/rule/json-args-recommended/
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ $(CONFIG_FILE): $(FORK_VERSION_FILE)

$(SPECTEST_ROOTDIR)/%_${SPECTEST_VERSION}.tar.gz:
curl -L -o "$@" \
"https://github.com/ethereum/consensus-spec-tests/releases/download/${SPECTEST_VERSION}/$*.tar.gz"
"https://github.com/ethereum/consensus-specs/releases/download/${SPECTEST_VERSION}/$*.tar.gz"

$(VECTORS_DIR)/%: $(SPECTEST_ROOTDIR)/%_${SPECTEST_VERSION}.tar.gz .spectest_version
-rm -rf $@
Expand Down
26 changes: 0 additions & 26 deletions bench/deposit_tree.exs

This file was deleted.

1 change: 1 addition & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ fork =
case fork_raw do
"deneb" -> :deneb
"electra" -> :electra
"fulu" -> :fulu
v -> raise "Invalid fork specified: #{v}"
end

Expand Down
65 changes: 50 additions & 15 deletions config/networks/gnosis/config.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
PRESET_BASE: "gnosis"
PRESET_BASE: 'gnosis'

# Free-form short name of the network that this configuration applies to - known
# canonical network names include:
# * 'mainnet' - there can be only one
# * 'prater' - testnet
# Must match the regex: [a-z0-9\-]
CONFIG_NAME: "gnosis"
CONFIG_NAME: 'gnosis'

# Transition
# ---------------------------------------------------------------
Expand All @@ -15,6 +15,7 @@ TERMINAL_TOTAL_DIFFICULTY: 8626000000000000000000058750000000000000000000
TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615


# Genesis
# ---------------------------------------------------------------
# `2**12` (= 4,096)
Expand All @@ -26,6 +27,7 @@ GENESIS_FORK_VERSION: 0x00000064
# Customized for GBC: ~1 hour
GENESIS_DELAY: 6000


# Forking
# ---------------------------------------------------------------
# Some forks are disabled for now:
Expand All @@ -37,13 +39,20 @@ ALTAIR_FORK_VERSION: 0x01000064
ALTAIR_FORK_EPOCH: 512
# Bellatrix
BELLATRIX_FORK_VERSION: 0x02000064
BELLATRIX_FORK_EPOCH: 385536 # 2022-11-30T19:23:40.000Z
BELLATRIX_FORK_EPOCH: 385536 # 2022-11-30T19:23:40.000Z
# Capella
CAPELLA_FORK_VERSION: 0x03000064
CAPELLA_FORK_EPOCH: 648704 # 2023-08-01T11:34:20.000Z
CAPELLA_FORK_EPOCH: 648704 # 2023-08-01T11:34:20.000Z
# Deneb
DENEB_FORK_VERSION: 0x04000064
DENEB_FORK_EPOCH: 889856 # 2024-03-11T18:30:20.000Z
DENEB_FORK_EPOCH: 889856 # 2024-03-11T18:30:20.000Z
# Electra
ELECTRA_FORK_VERSION: 0x05000064
ELECTRA_FORK_EPOCH: 1337856 # 2025-04-30T14:03:40.000Z
# Fulu
FULU_FORK_VERSION: 0x06000064
FULU_FORK_EPOCH: 18446744073709551615 # temporary stub


# Time parameters
# ---------------------------------------------------------------
Expand All @@ -58,6 +67,7 @@ SHARD_COMMITTEE_PERIOD: 256
# 2**10 (= 1024) ~1.4 hour
ETH1_FOLLOW_DISTANCE: 1024


# Validator cycle
# ---------------------------------------------------------------
# 2**2 (= 4)
Expand All @@ -84,6 +94,7 @@ REORG_PARENT_WEIGHT_THRESHOLD: 160
# `2` epochs
REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2


# Deposit contract
# ---------------------------------------------------------------
# xDai Mainnet
Expand All @@ -94,19 +105,13 @@ DEPOSIT_CONTRACT_ADDRESS: 0x0B98057eA310F4d31F2a452B414647007d1645d9
# Networking
# ---------------------------------------------------------------
# `10 * 2**20` (= 10485760, 10 MiB)
GOSSIP_MAX_SIZE: 10485760
MAX_PAYLOAD_SIZE: 10485760
# `2**10` (= 1024)
MAX_REQUEST_BLOCKS: 1024
# `2**8` (= 256)
EPOCHS_PER_SUBNET_SUBSCRIPTION: 256
# 33024, ~31 days
MIN_EPOCHS_FOR_BLOCK_REQUESTS: 33024
# `10 * 2**20` (=10485760, 10 MiB)
MAX_CHUNK_SIZE: 10485760
# 5s
TTFB_TIMEOUT: 5
# 10s
RESP_TIMEOUT: 10
ATTESTATION_PROPAGATION_SLOT_RANGE: 32
# 500ms
MAXIMUM_GOSSIP_CLOCK_DISPARITY: 500
Expand All @@ -123,9 +128,39 @@ ATTESTATION_SUBNET_PREFIX_BITS: 6
# Deneb
# `2**7` (=128)
MAX_REQUEST_BLOCKS_DENEB: 128
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
MAX_REQUEST_BLOB_SIDECARS: 768
# `2**14` (= 16384 epochs, ~15 days)
# `2**14` (= 16384 epochs, ~18 days)
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 16384
# `6`
BLOB_SIDECAR_SUBNET_COUNT: 6
# `uint64(2)`
MAX_BLOBS_PER_BLOCK: 2
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
MAX_REQUEST_BLOB_SIDECARS: 768

# Electra
# 2**7 * 10**9 (= 128,000,000,000)
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000
# 2**6 * 10**9 (= 64,000,000,000)
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 64000000000
# `2`
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: 2
# `uint64(2)`
MAX_BLOBS_PER_BLOCK_ELECTRA: 2
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA
MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 256

# Fulu
NUMBER_OF_COLUMNS: 128
NUMBER_OF_CUSTODY_GROUPS: 128
DATA_COLUMN_SIDECAR_SUBNET_COUNT: 128
MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384
SAMPLES_PER_SLOT: 8
CUSTODY_REQUIREMENT: 4
VALIDATOR_CUSTODY_REQUIREMENT: 8
BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: 32000000000
MAX_BLOBS_PER_BLOCK_FULU: 2
# `2**14` (= 16384 epochs, ~18 days)
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: 16384

# EIP7732
MAX_REQUEST_PAYLOADS: 128
Loading
Loading