Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
905656a
Add IL committee duties endpoint types and client to eth2
conache Aug 2, 2026
aaccd5f
Scaffold task for tracking IL comittee responsibilities for locally-m…
conache Aug 2, 2026
3528720
Add il duties polling for current and next epoch
conache Aug 2, 2026
0c21010
Add missing metrics
conache Aug 4, 2026
8fe7be0
Add missing metrics
conache Aug 4, 2026
ac487d5
Add more fixes and metrics
conache Aug 4, 2026
e518754
Cleanup
conache Aug 4, 2026
8bc782f
Add method for fetching IL duties for slot
conache Aug 13, 2026
341a380
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 13, 2026
a8539f1
Return dependent root for each il duties list for slot
conache Aug 13, 2026
577c048
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 16, 2026
f4ed28b
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 17, 2026
cf12bf1
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 18, 2026
9ca87ef
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 18, 2026
e93dd6a
Remove inclusion_list_committee_root from the il duty type
conache Aug 21, 2026
e766740
Add inclusion_list_due wiring to the chain specs
conache Aug 12, 2026
cb4f498
Add basic il service and basic wiring to the validator client
conache Aug 13, 2026
4153d76
Setup il tasks per slot
conache Aug 13, 2026
3fe2945
Add client support for publishing inclusion lists
conache Aug 14, 2026
5d02da0
Update endpoints
conache Aug 14, 2026
a8e5867
Correct publish path function to be aligned with the spec
conache Aug 14, 2026
8f78f90
Implement sign and publish logic in the inclusion list service
conache Aug 14, 2026
f8e7a96
Add signature wiring
conache Aug 14, 2026
84c9ec1
Scaffold test harness and add tests for slot advancement and producti…
conache Aug 14, 2026
26b9319
Add publish tests
conache Aug 14, 2026
1995a48
Add signature check tests
conache Aug 16, 2026
66d0a9e
Cleanup
conache Aug 16, 2026
d651d8e
Drop inclusion_list_committee_root
conache Aug 21, 2026
1a53af2
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 24, 2026
4d0704c
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 24, 2026
c6b196d
Merge branch 'unstable' into focil-vc-il-duties-service
conache Aug 24, 2026
7b388ed
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Aug 24, 2026
3777e87
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 27, 2026
ffee40d
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Aug 30, 2026
8e3f276
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 2, 2026
07611c6
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 3, 2026
77eae3c
Use fully spelled out metric name for IL committee count
conache Sep 3, 2026
c95581e
Remove redundant epoch checks for both heze and gloas
conache Sep 3, 2026
33e3294
Cleanup logic for detecting if we need to update validators il duties…
conache Sep 3, 2026
aec8bc3
Consolidate PTC and IL duties polling into a single generic function
conache Sep 3, 2026
e21d738
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 3, 2026
eee62e4
Remove unnecessary comments
conache Sep 3, 2026
16de50b
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 4, 2026
6953262
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 8, 2026
c803fa0
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Sep 8, 2026
c14b2fd
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 10, 2026
4ce0b27
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Sep 10, 2026
64df47e
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 15, 2026
d8fa3ce
Cleanup: use correct error name and remove redundant validator indice…
conache Sep 15, 2026
2afb95f
Consolidate the PTC and IL duties polling into a single generic function
conache Sep 15, 2026
26c2da8
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 16, 2026
70922a3
Fix forks scheduled checks
conache Sep 16, 2026
0a39a0e
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 17, 2026
92f0590
Add unit tests for poll_lookahead_duties_for_epoch
conache Sep 17, 2026
d8a1e09
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 18, 2026
124e2aa
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 19, 2026
2cc1de8
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 23, 2026
a87f189
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 26, 2026
de28921
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Sep 28, 2026
27a130e
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 29, 2026
59d9dbf
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Sep 29, 2026
68d38c3
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Sep 30, 2026
87536d1
Add optimization to produce inclusion lists shortly before the inclus…
conache Sep 30, 2026
13fcdc9
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Sep 30, 2026
5ba7f02
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Oct 1, 2026
7ff15d2
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Oct 1, 2026
b818e85
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Oct 6, 2026
dafffa2
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Oct 6, 2026
a7c38f7
Revert the execution proof availability gate (#10233)
dapplion Oct 6, 2026
6360bbb
Fix Web3Signer Gloas request types for remote-signing-api v1.4.0 (#10…
NikhilSharmaWe Oct 7, 2026
c8efbe7
Split up EF tests to run each preset separately (#10237)
macladson Oct 7, 2026
3d82387
Bump PTC SSE queue (#10239)
michaelsproul Oct 7, 2026
20a7476
Fix PTC duties at the Gloas fork boundary (#10193)
eserilev Oct 7, 2026
4939a94
Fix blob ordering when filtering blobs by versioned hash (#9944)
conache Oct 7, 2026
322d34d
Align the EIP-8025 proof types and gossip rules with the spec (#10236)
dapplion Oct 7, 2026
784408d
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Oct 7, 2026
2d8475e
Merge branch 'unstable' into focil-vc-il-duties-service
conache Oct 7, 2026
95206a0
Add inclusion_list_bits to ExecutionPayloadBid (#9729)
conache Oct 7, 2026
22f43dc
Produce inclusion lists for the current slot when the clock didn't pa…
conache Oct 7, 2026
0b33a78
Merge branch 'unstable' into focil-vc-il-duties-polling
conache Oct 7, 2026
fe193a3
Use ProgressiveTransactions for inclusion list transactions in the se…
conache Oct 7, 2026
fec8ebc
Merge branch 'unstable' into focil-vc-il-duties-service
conache Oct 7, 2026
1ffb3c1
Cleanup
conache Oct 7, 2026
e129935
Merge branch 'focil-vc-il-duties-polling' into focil-vc-il-duties-ser…
conache Oct 7, 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
42 changes: 32 additions & 10 deletions .github/workflows/test-suite.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,12 @@ jobs:
runs-on: ${{ github.repository == 'sigp/lighthouse' && 'warp-ubuntu-latest-x64-8x;snapshot.key=lighthouse-ubuntu-latest-v1' || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v5
# Set Java version to 21. (required since Web3Signer 24.12.0).
# On sigp/lighthouse, Java 21 is baked into the snapshot.
- if: github.repository != 'sigp/lighthouse'
uses: actions/setup-java@v4
# Set Java version to 25. (required since Web3Signer 26.7.0).
# Always install; do not rely on the WarpBuild snapshot containing Java 25.
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
java-version: '25'
- if: github.repository != 'sigp/lighthouse'
name: Get latest version of stable Rust
uses: moonrepo/setup-rust@v1
Expand Down Expand Up @@ -310,8 +309,30 @@ jobs:
cache-target: release
- name: Run state_transition_vectors in release.
run: make run-state-transition-tests
ef-tests-ubuntu:
name: ef-tests-ubuntu
ef-tests-mainnet-ubuntu:
name: ef-tests-mainnet-ubuntu
needs: [check-labels]
if: needs.check-labels.outputs.skip_ci != 'true'
runs-on: ${{ github.repository == 'sigp/lighthouse' && 'warp-ubuntu-latest-x64-8x;snapshot.key=lighthouse-ubuntu-latest-v1' || 'ubuntu-latest' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v5
- if: github.repository != 'sigp/lighthouse'
name: Get latest version of stable Rust
uses: moonrepo/setup-rust@v1
with:
channel: stable
cache-target: release
bins: cargo-nextest
- if: github.repository == 'sigp/lighthouse'
uses: Swatinem/rust-cache@v2
with:
cache-provider: warpbuild
- name: Run mainnet consensus-spec-tests with blst and fake_crypto
run: make test-ef-mainnet
ef-tests-minimal-ubuntu:
name: ef-tests-minimal-ubuntu
needs: [check-labels]
if: needs.check-labels.outputs.skip_ci != 'true'
runs-on: ${{ github.repository == 'sigp/lighthouse' && 'warp-ubuntu-latest-x64-8x;snapshot.key=lighthouse-ubuntu-latest-v1' || 'ubuntu-latest' }}
Expand All @@ -330,8 +351,8 @@ jobs:
uses: Swatinem/rust-cache@v2
with:
cache-provider: warpbuild
- name: Run consensus-spec-tests with blst and fake_crypto
run: make test-ef
- name: Run minimal consensus-spec-tests with blst and fake_crypto
run: make test-ef-minimal
basic-simulator-ubuntu:
name: basic-simulator-ubuntu
needs: [check-labels]
Expand Down Expand Up @@ -549,7 +570,8 @@ jobs:
'http-api-tests',
'debug-tests-ubuntu',
'state-transition-vectors-ubuntu',
'ef-tests-ubuntu',
'ef-tests-mainnet-ubuntu',
'ef-tests-minimal-ubuntu',
'basic-simulator-ubuntu',
'fallback-simulator-ubuntu',
'execution-engine-integration-ubuntu',
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/warpbuild-ubuntu-latest-snapshot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ jobs:
cargo install --locked cargo-sort
cargo install --locked cargo-hack

- name: Install Java (Temurin 21)
- name: Install Java (Temurin 25)
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
java-version: '25'

- name: Save snapshot
uses: WarpBuilds/snapshot-save@v1
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 19 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,22 @@ check-benches:

# Runs EF test vectors
run-ef-tests:
$(MAKE) run-ef-tests-mainnet
$(MAKE) run-ef-tests-minimal

# Runs the mainnet EF test vectors
run-ef-tests-mainnet:
rm -rf $(EF_TESTS)/.accessed_file_log.txt
cargo nextest run --release -p ef_tests --features "ef_tests,$(EF_TEST_FEATURES)"
cargo nextest run --release -p ef_tests --features "ef_tests,$(EF_TEST_FEATURES),fake_crypto"
./$(EF_TESTS)/check_all_files_accessed.py $(EF_TESTS)/.accessed_file_log.txt $(EF_TESTS)/consensus-spec-tests
./$(EF_TESTS)/check_all_files_accessed.py $(EF_TESTS)/.accessed_file_log.txt $(EF_TESTS)/consensus-spec-tests "tests/minimal/"

# Runs the minimal EF test vectors
run-ef-tests-minimal:
rm -rf $(EF_TESTS)/.accessed_file_log.txt
cargo nextest run --release -p ef_tests --features "ef_tests,spec-minimal,$(EF_TEST_FEATURES)"
cargo nextest run --release -p ef_tests --features "ef_tests,spec-minimal,$(EF_TEST_FEATURES),fake_crypto"
./$(EF_TESTS)/check_all_files_accessed.py $(EF_TESTS)/.accessed_file_log.txt $(EF_TESTS)/consensus-spec-tests "tests/mainnet/"

# Run the tests in the `beacon_chain` crate for all known forks.
test-beacon-chain: $(patsubst %,test-beacon-chain-%,$(RECENT_FORKS))
Expand Down Expand Up @@ -259,6 +271,12 @@ run-state-transition-tests:
# Downloads and runs the EF test vectors.
test-ef: make-ef-tests run-ef-tests

# Downloads and runs the mainnet EF test vectors.
test-ef-mainnet: make-ef-tests run-ef-tests-mainnet

# Downloads and runs the minimal EF test vectors.
test-ef-minimal: make-ef-tests run-ef-tests-minimal

# Downloads and runs the nightly EF test vectors.
test-ef-nightly: make-ef-tests-nightly run-ef-tests

Expand Down
10 changes: 5 additions & 5 deletions beacon_node/beacon_chain/src/beacon_block_reward.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
let bid_parent_block_hash = block
.body()
.signed_execution_payload_bid()?
.message
.parent_block_hash;
if bid_parent_block_hash == parent_bid.block_hash {
.message()
.parent_block_hash();
if bid_parent_block_hash == parent_bid.block_hash() {
let availability_index = parent_bid
.slot
.slot()
.as_usize()
.safe_rem(T::EthSpec::slots_per_historical_root())?;
state
Expand Down Expand Up @@ -291,7 +291,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
let parent_slot = state
.latest_execution_payload_bid()
.ok()
.map(|bid| bid.slot);
.map(|bid| bid.slot());

for attestation in block.body().attestations() {
let data = attestation.data();
Expand Down
35 changes: 14 additions & 21 deletions beacon_node/beacon_chain/src/beacon_chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ use crate::envelope_times_cache::EnvelopeTimesCache;
use crate::errors::{BeaconChainError as Error, BlockProductionError};
use crate::events::ServerSentEventHandler;
use crate::execution_payload::{NotifyExecutionLayer, PreparePayloadHandle, get_execution_payload};
use crate::execution_proof_verification::{GossipVerifiedExecutionProof, ObservedExecutionProofs};
use crate::execution_proof_verification::ObservedExecutionProofs;
use crate::fork_choice_signal::{ForkChoiceSignalRx, ForkChoiceSignalTx};
use crate::graffiti_calculator::{GraffitiCalculator, GraffitiSettings};
use crate::inclusion_list_store::{DependentRoot, InclusionListStore};
Expand Down Expand Up @@ -1768,8 +1768,18 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
let relative_epoch = RelativeEpoch::from_epoch(state.current_epoch(), epoch)
.map_err(Error::IncorrectStateForAttestation)?;

let dependent_root =
state.attester_shuffling_decision_root(dependent_block_root, relative_epoch)?;
let dependent_root = if self.spec.gloas_fork_epoch == Some(epoch) {
let decision_slot = epoch
.start_slot(T::EthSpec::slots_per_epoch())
.saturating_sub(1_u64);
if state.slot() == decision_slot {
dependent_block_root
} else {
*state.get_block_root(decision_slot)?
}
} else {
state.attester_shuffling_decision_root(dependent_block_root, relative_epoch)?
};

let pubkey_cache = self.validator_pubkey_cache.read();

Expand Down Expand Up @@ -3925,7 +3935,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
.message()
.body()
.signed_execution_payload_bid()?
.clone(),
.clone_as_signed_execution_payload_bid(),
);
chain.pending_payload_cache.insert_bid(block_root, bid);
}
Expand Down Expand Up @@ -4230,23 +4240,6 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
}
}

/// Caches an execution proof, importing the payload envelope if that was the last piece.
pub async fn check_execution_proof_availability_and_import(
self: &Arc<Self>,
verified_proof: GossipVerifiedExecutionProof,
) -> Result<AvailabilityProcessingStatus, BlockError> {
let GossipVerifiedExecutionProof { proof, block_slot } = verified_proof;
let bid = self
.get_or_load_gloas_payload_bid(proof.beacon_block_root())
.await?;
let availability = self
.pending_payload_cache
.put_execution_proof(proof, &bid)
.map_err(BlockError::from)?;
self.process_payload_envelope_availability(block_slot, availability, || Ok(()))
.await
}

/// Load a persisted Gloas bid without blocking the async runtime.
pub(crate) async fn get_or_load_gloas_payload_bid(
self: &Arc<Self>,
Expand Down
40 changes: 21 additions & 19 deletions beacon_node/beacon_chain/src/block_production/bid_selection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,15 +153,15 @@ impl<E: EthSpec> BidCandidate<E> {
/// terms are far below `Uint256::MAX`, so it is exact (a u64 gwei sum could saturate under a
/// hostile `execution_payment` with the cap disabled).
fn trusted_value(&self) -> Uint256 {
let bid = &self.signed_bid.message;
let bid = self.signed_bid.message();
match &self.source {
BidSource::Local { block_value, .. } => *block_value,
BidSource::Gossip => gwei_to_wei(bid.value), // gossip `execution_payment` is zero
BidSource::Gossip => gwei_to_wei(bid.value()), // gossip `execution_payment` is zero
BidSource::Direct {
max_execution_payment,
..
} => gwei_to_wei(bid.value).saturating_add(gwei_to_wei(
bid.execution_payment.min(*max_execution_payment),
} => gwei_to_wei(bid.value()).saturating_add(gwei_to_wei(
bid.execution_payment().min(*max_execution_payment),
)),
}
}
Expand Down Expand Up @@ -197,10 +197,10 @@ impl<E: EthSpec> BidCandidate<E> {
/// or the **unclamped** `value + execution_payment` (the proposer's real revenue; the clamp is a
/// ranking-only trust bound).
pub fn payload_value(&self) -> Uint256 {
let bid = &self.signed_bid.message;
let bid = self.signed_bid.message();
match &self.source {
BidSource::Local { block_value, .. } => *block_value,
_ => gwei_to_wei(bid.value.saturating_add(bid.execution_payment)),
_ => gwei_to_wei(bid.value().saturating_add(bid.execution_payment())),
}
}

Expand Down Expand Up @@ -252,7 +252,7 @@ mod tests {
use super::*;
use bls::Signature;
use ssz_types::VariableList;
use types::{ExecutionPayloadBid, MainnetEthSpec};
use types::{ExecutionPayloadBidGloas, MainnetEthSpec, SignedExecutionPayloadBidGloas};

type TestSpec = MainnetEthSpec;

Expand All @@ -277,15 +277,17 @@ mod tests {
value_gwei: u64,
payment_gwei: u64,
) -> Arc<SignedExecutionPayloadBid<TestSpec>> {
Arc::new(SignedExecutionPayloadBid {
message: ExecutionPayloadBid {
builder_index,
value: value_gwei,
execution_payment: payment_gwei,
..Default::default()
Arc::new(SignedExecutionPayloadBid::Gloas(
SignedExecutionPayloadBidGloas {
message: ExecutionPayloadBidGloas {
builder_index,
value: value_gwei,
execution_payment: payment_gwei,
..Default::default()
},
signature: Signature::empty(),
},
signature: Signature::empty(),
})
))
}

fn gossip(value_gwei: u64, boost: u64) -> BidCandidate<TestSpec> {
Expand Down Expand Up @@ -327,13 +329,13 @@ mod tests {

fn local(block_value_gwei: u64, should_override_builder: bool) -> BidCandidate<TestSpec> {
BidCandidate::local(
SignedExecutionPayloadBid {
message: ExecutionPayloadBid {
SignedExecutionPayloadBid::Gloas(SignedExecutionPayloadBidGloas {
message: ExecutionPayloadBidGloas {
builder_index: LOCAL_BUILDER,
..Default::default()
},
signature: Signature::empty(),
},
}),
ExecutionPayloadData {
payload: ExecutionPayloadGloas::default(),
execution_requests: ExecutionRequestsGloas::default(),
Expand All @@ -354,7 +356,7 @@ mod tests {
BidSource::Direct { .. } => "direct",
};
(
win.signed_bid.message.builder_index,
win.signed_bid.message().builder_index(),
win.is_local(),
win.payload_value(),
source,
Expand Down
Loading
Loading