Skip to content
Merged
Show file tree
Hide file tree
Changes from 119 commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
022d9fb
ExecutionProof container for ZkEVM L2
gfukushima Sep 1, 2025
580af8a
spotless
gfukushima Sep 1, 2025
b6230a8
config and cli options
gfukushima Sep 1, 2025
a0f6f62
spotless
gfukushima Sep 1, 2025
468fa81
add execution proof to the schema registry under phase0 so we can sup…
gfukushima Sep 1, 2025
e8c52bb
spotless
gfukushima Sep 1, 2025
3006324
fix assemble
gfukushima Sep 2, 2025
cd8f5ae
add hidden to flags and fallback values
gfukushima Sep 2, 2025
2f42260
fix fallback values
gfukushima Sep 2, 2025
8d4a101
Merge branch 'master' into zkevm-container
gfukushima Sep 2, 2025
7f4e13e
spotless
gfukushima Sep 2, 2025
6011bc7
move the execution proof to electra
gfukushima Sep 2, 2025
6d24453
spotless
gfukushima Sep 2, 2025
00f8fdf
initial boilerplate
gfukushima Sep 2, 2025
f37f4be
separate schema from class
gfukushima Sep 2, 2025
3323b18
add tests for the cli options
gfukushima Sep 2, 2025
934330f
spotless
gfukushima Sep 2, 2025
84cf649
Merge branch 'master' into zkevm-container
gfukushima Sep 2, 2025
fe3c4ff
ExecutionProof container for ZkEVM L2
gfukushima Sep 1, 2025
e9aa75f
separate schema from class
gfukushima Sep 2, 2025
25a6203
Remove containers from this PR
gfukushima Sep 3, 2025
06d8835
spotless
gfukushima Sep 3, 2025
7e3fffc
remove execution proof schema
gfukushima Sep 3, 2025
58fc879
add default values test
gfukushima Sep 3, 2025
5be132d
spotless
gfukushima Sep 3, 2025
651d50d
Merge branch 'master' into zkevm-container
gfukushima Sep 3, 2025
3b4376b
Merge branch 'refs/heads/zkevm-cli-options' into EP-subnets
gfukushima Sep 3, 2025
cbf2371
subnets boilerplate
gfukushima Sep 4, 2025
2ee1eb0
more boilerplate, missing container
gfukushima Sep 4, 2025
a81ebc7
Merge branch 'master' into EP-subnets
gfukushima Sep 4, 2025
11217cc
Merge branch 'master' into execution-proof-container
gfukushima Sep 4, 2025
53abb23
execution proof container changes and test
gfukushima Sep 4, 2025
a2f0768
Merge branch 'master' into execution-proof-container
gfukushima Sep 5, 2025
7373d63
spotless
gfukushima Sep 5, 2025
ff06fda
Merge remote-tracking branch 'origin/execution-proof-container' into …
gfukushima Sep 5, 2025
dfbeaca
Merge branch 'execution-proof-container' into EP-subnets
gfukushima Sep 5, 2025
b052c91
fix container type
gfukushima Sep 8, 2025
2a0e93c
fix comment
gfukushima Sep 8, 2025
62f53aa
spotless
gfukushima Sep 8, 2025
fa420a8
Merge branch 'execution-proof-container' into EP-subnets
gfukushima Sep 8, 2025
ca71c8f
Merge branch 'master' into EP-subnets
gfukushima Sep 8, 2025
a1318b9
fix config validation
gfukushima Sep 9, 2025
35f9188
fix config validation
gfukushima Sep 9, 2025
efa29cf
add zkconfig into beacon chain controller to initialize the subscribe…
gfukushima Sep 9, 2025
84dd8b7
add an initial gossip validator
gfukushima Sep 9, 2025
a2989d6
spotless
gfukushima Sep 9, 2025
3b256d8
Merge branch 'master' into EP-subnets
gfukushima Sep 9, 2025
06e2fdf
fix assemble
gfukushima Sep 9, 2025
934de8c
spotless
gfukushima Sep 9, 2025
4320861
spotless
gfukushima Sep 9, 2025
7647417
Merge branch 'master' into EP-subnets
gfukushima Sep 9, 2025
dbc906d
Merge remote-tracking branch 'origin/EP-subnets' into EP-subnets
gfukushima Sep 9, 2025
058ce7e
spotless and fix assemble
gfukushima Sep 9, 2025
5008d04
Merge branch 'master' into EP-subnets
gfukushima Sep 9, 2025
d260a0d
remove the bit vector from discovery peer for now
gfukushima Sep 9, 2025
f282971
fix build
gfukushima Sep 9, 2025
73b6b57
fix duplicated line
gfukushima Sep 9, 2025
25c6dfd
fix method name
gfukushima Sep 9, 2025
99c52dc
fix init order
gfukushima Sep 10, 2025
1c75e48
rename classes
gfukushima Sep 10, 2025
c958a32
add execution proof operation processor for electra and newer forks
gfukushima Sep 10, 2025
326e487
get the epoch from recent chain data for the execution proof message
gfukushima Sep 10, 2025
18c4cee
remove comment
gfukushima Sep 10, 2025
f876a73
add execution proof gossip manager
gfukushima Sep 10, 2025
4b521f5
some piping for the operation processor for execution proof
gfukushima Sep 10, 2025
2b55a08
change execution gossip manager to rely on subnetsubscription
gfukushima Sep 11, 2025
d444c68
spotless
gfukushima Sep 11, 2025
f67b45d
spotless
gfukushima Sep 11, 2025
7183bb7
add logger
gfukushima Sep 11, 2025
4d078f8
add p2p config to enable execution proofs topic
gfukushima Sep 15, 2025
8663868
add log and subscribe to valid EP
gfukushima Sep 15, 2025
17cab73
subscribe overrides for electra
gfukushima Sep 15, 2025
2fbcc2d
spotless
gfukushima Sep 15, 2025
8c52ef5
fix executionProof container and schema
gfukushima Sep 18, 2025
3794d36
fix EP manager and add logs to gossip validator
gfukushima Sep 18, 2025
452bda9
add debug log on publish EP
gfukushima Sep 18, 2025
119a957
add log to topic creation
gfukushima Sep 18, 2025
833f803
remove dummy proof creation
gfukushima Sep 18, 2025
d039fcf
subscribe to max subnet for EP
gfukushima Sep 18, 2025
dd715aa
add gossip channel publisher to networkAsync runner
gfukushima Sep 18, 2025
cd0d231
spotless
gfukushima Sep 18, 2025
9bb5afc
fix tests to pass spec to p2p config builder
gfukushima Sep 18, 2025
a27e8e7
remove unnecessary log
gfukushima Sep 18, 2025
b294185
change executionProofGossipManager in GossipForkSubscriptionsElectra …
gfukushima Sep 18, 2025
ff7f802
executionProofGossipManager created based on the p2p flag
gfukushima Sep 18, 2025
43ee8a2
spotless
gfukushima Sep 18, 2025
659f373
Merge branch 'master' into EP-subnets
gfukushima Sep 18, 2025
780a2da
add tests for ExecutionProofs subnets
gfukushima Sep 19, 2025
45bb603
spotless
gfukushima Sep 19, 2025
9501477
PR Review
gfukushima Sep 19, 2025
1327a13
spotless
gfukushima Sep 19, 2025
b981eee
add TODO
gfukushima Sep 19, 2025
0379250
Merge branch 'master' into EP-subnets
gfukushima Sep 19, 2025
0ae1e8a
review part 2
gfukushima Sep 22, 2025
16c520a
spotless
gfukushima Sep 22, 2025
9284650
Merge remote-tracking branch 'origin/EP-subnets' into EP-subnets
gfukushima Sep 22, 2025
2b06395
Merge branch 'master' into EP-subnets
gfukushima Sep 22, 2025
de2a545
rename methods of the interface
gfukushima Sep 27, 2025
bb6ec28
Merge branch 'master' into EP-subnets
gfukushima Sep 27, 2025
db19aa7
spotless
gfukushima Sep 27, 2025
72a6d58
fix test
gfukushima Sep 27, 2025
caee242
change log level
gfukushima Sep 27, 2025
2d65f59
fix size of the set created
gfukushima Sep 27, 2025
eabcd2a
add block hash to log
gfukushima Sep 27, 2025
818ad31
spotless
gfukushima Sep 27, 2025
e389e0f
remove unnecessary comment
gfukushima Sep 28, 2025
3b92c10
remove changes in PeerSubnetSubscriptions
gfukushima Sep 30, 2025
196f27f
PR review part 3
gfukushima Sep 30, 2025
464a820
spotless
gfukushima Sep 30, 2025
36e31c5
spotless
gfukushima Sep 30, 2025
5d73f96
remove unused class
gfukushima Sep 30, 2025
59fcf8d
spotless
gfukushima Sep 30, 2025
4ff2231
Merge branch 'master' into EP-subnets
gfukushima Sep 30, 2025
244ba6d
remove unused variable
gfukushima Sep 30, 2025
ed5eab9
Merge remote-tracking branch 'origin/EP-subnets' into EP-subnets
gfukushima Sep 30, 2025
19bb1ce
remove another unused var
gfukushima Sep 30, 2025
71a5d7b
PR review
gfukushima Oct 7, 2025
142c8f3
spotless
gfukushima Oct 7, 2025
bdd3dae
Merge branch 'master' into EP-subnets
gfukushima Oct 7, 2025
738994c
add null validation check on validate()
gfukushima Oct 7, 2025
2c9ec99
Merge branch 'master' into EP-subnets
gfukushima Oct 8, 2025
837da57
resolve conflicts and merge main into branch
gfukushima Oct 8, 2025
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright Consensys Software Inc., 2025
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/

package tech.pegasys.teku.statetransition.executionproofs;

import java.util.Optional;
import tech.pegasys.teku.infrastructure.async.SafeFuture;
import tech.pegasys.teku.infrastructure.unsigned.UInt64;
import tech.pegasys.teku.spec.datastructures.execution.ExecutionProof;
import tech.pegasys.teku.statetransition.blobs.RemoteOrigin;
import tech.pegasys.teku.statetransition.validation.InternalValidationResult;

public interface ExecutionProofManager {

ExecutionProofManager NOOP =
new ExecutionProofManager() {
@Override
public SafeFuture<InternalValidationResult> onExecutionProofGossip(
ExecutionProof executionProof, Optional<UInt64> arrivalTimestamp) {
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
}

@Override
public void onExecutionProofPublish(
final ExecutionProof executionProof, final RemoteOrigin remoteOrigin) {}

@Override
public void subscribeToValidExecutionProofs(
final ValidExecutionProofListener sidecarsListener) {}
};

void onExecutionProofPublish(ExecutionProof executionProof, RemoteOrigin remoteOrigin);

SafeFuture<InternalValidationResult> onExecutionProofGossip(
ExecutionProof executionProof, Optional<UInt64> arrivalTimestamp);

void subscribeToValidExecutionProofs(
ExecutionProofManager.ValidExecutionProofListener executionProofListener);

interface ValidExecutionProofListener {
void onNewValidExecutionProof(ExecutionProof executionProof, RemoteOrigin remoteOrigin);

Check notice

Code scanning / CodeQL

Useless parameter Note

The parameter 'remoteOrigin' is never used.
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright Consensys Software Inc., 2025
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/

package tech.pegasys.teku.statetransition.executionproofs;

import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import tech.pegasys.teku.infrastructure.async.SafeFuture;
import tech.pegasys.teku.infrastructure.subscribers.Subscribers;
import tech.pegasys.teku.infrastructure.unsigned.UInt64;
import tech.pegasys.teku.spec.datastructures.execution.ExecutionProof;
import tech.pegasys.teku.statetransition.blobs.RemoteOrigin;
import tech.pegasys.teku.statetransition.validation.ExecutionProofGossipValidator;
import tech.pegasys.teku.statetransition.validation.InternalValidationResult;

public class ExecutionProofManagerImpl implements ExecutionProofManager {

final ExecutionProofGossipValidator executionProofGossipValidator;
private final Subscribers<ValidExecutionProofListener> receivedExecutionProofSubscribers =
Subscribers.create(true);

private static final Logger LOG = LogManager.getLogger();

public ExecutionProofManagerImpl(
final ExecutionProofGossipValidator executionProofGossipValidator) {
this.executionProofGossipValidator = executionProofGossipValidator;
}

@Override
public void onExecutionProofPublish(
final ExecutionProof executionProof, final RemoteOrigin remoteOrigin) {
LOG.trace("Published execution proof {}", executionProof);
}

@Override
public SafeFuture<InternalValidationResult> onExecutionProofGossip(
final ExecutionProof executionProof, final Optional<UInt64> arrivalTimestamp) {
LOG.debug("Received execution proof for block {}", executionProof);
// TODO fix this as this needs to obtain subnetId from the topic we received the proof from?
// this is probably a validation that only makes sense for the stub we're doing
return executionProofGossipValidator.validate(
executionProof, executionProof.getSubnetId().get());
}

@Override
public void subscribeToValidExecutionProofs(
final ValidExecutionProofListener executionProofListener) {
receivedExecutionProofSubscribers.subscribe(executionProofListener);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright Consensys Software Inc., 2025
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/

package tech.pegasys.teku.statetransition.validation;

import static tech.pegasys.teku.spec.config.Constants.MAX_EXECUTION_PROOF_SUBNETS;

import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import tech.pegasys.teku.infrastructure.async.SafeFuture;
import tech.pegasys.teku.infrastructure.collections.LimitedSet;
import tech.pegasys.teku.infrastructure.unsigned.UInt64;
import tech.pegasys.teku.spec.datastructures.execution.ExecutionProof;

public class ExecutionProofGossipValidator {
private static final Logger LOG = LogManager.getLogger();

private final Set<ExecutionProof> receivedValidExecutionProofSet;

public static ExecutionProofGossipValidator create() {
return new ExecutionProofGossipValidator(
// max subnets * 2 epochs * slots per epoch 32 based on mainnet for now
LimitedSet.createSynchronized(MAX_EXECUTION_PROOF_SUBNETS.intValue() * 64));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Cache Size Miscalculation in Epoch-Specific Code

The LimitedSet size calculation in ExecutionProofGossipValidator hardcodes 64 for slots per epoch. This value is mainnet-specific and doesn't adapt to different network configurations, potentially leading to incorrect cache sizing.

Fix in Cursor Fix in Web

}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Code-Comment Mismatch in LimitedSet Size Calculation

The LimitedSet size is calculated as MAX_EXECUTION_PROOF_SUBNETS.intValue() * 64, but the accompanying comment describes a different calculation: max subnets * 2 epochs * 32 slots per epoch. This creates a discrepancy between the code and its documentation.

Fix in Cursor Fix in Web


public ExecutionProofGossipValidator(final Set<ExecutionProof> receivedValidExecutionProofSet) {

this.receivedValidExecutionProofSet = receivedValidExecutionProofSet;
}

public SafeFuture<InternalValidationResult> validate(
final ExecutionProof executionProof, final UInt64 subnetId) {

// TODO need to check for other validations done in the prototype and spec
if (!executionProof.getSubnetId().get().equals(subnetId)) {
LOG.trace(
"ExecutionProof for block root {} / block hash {} does not match the gossip subnetId",
executionProof.getBlockRoot(),
executionProof.getBlockHash());
return SafeFuture.completedFuture(InternalValidationResult.reject("SubnetId mismatch"));
}

// Already seen and valid
if (receivedValidExecutionProofSet.contains(executionProof)) {
LOG.trace("Received duplicate execution proof {}", executionProof);
return SafeFuture.completedFuture(InternalValidationResult.IGNORE);
}

// Validated the execution proof
LOG.trace(
"Received and validated execution proof for block root {}, block hash {}",
executionProof.getBlockRoot(),
executionProof.getBlockHash());
receivedValidExecutionProofSet.add(executionProof);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
}
}
1 change: 1 addition & 0 deletions networking/eth2/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies {
implementation project(':infrastructure:ssz')
implementation project(':storage')
implementation project(':storage:api')
implementation project(':services:zkchain')
implementation project(':infrastructure:serviceutils')

implementation 'io.libp2p:jvm-libp2p'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import tech.pegasys.teku.networking.eth2.gossip.BlobSidecarGossipChannel;
import tech.pegasys.teku.networking.eth2.gossip.BlockGossipChannel;
import tech.pegasys.teku.networking.eth2.gossip.DataColumnSidecarGossipChannel;
import tech.pegasys.teku.networking.eth2.gossip.ExecutionProofGossipChannel;
import tech.pegasys.teku.networking.eth2.gossip.config.Eth2Context;
import tech.pegasys.teku.networking.eth2.gossip.config.GossipConfigurator;
import tech.pegasys.teku.networking.eth2.gossip.encoding.GossipEncoding;
Expand Down Expand Up @@ -72,6 +73,7 @@ public class ActiveEth2P2PNetwork extends DelegatingP2PNetwork<Eth2Peer> impleme
private final SubnetSubscriptionService attestationSubnetService;
private final SubnetSubscriptionService syncCommitteeSubnetService;
private final SubnetSubscriptionService dataColumnSidecarSubnetService;
private final SubnetSubscriptionService executionProofSubnetService;
private final ProcessedAttestationSubscriptionProvider processedAttestationSubscriptionProvider;
private final AtomicBoolean gossipStarted = new AtomicBoolean(false);
private final int dasTotalCustodySubnetCount;
Expand All @@ -97,6 +99,7 @@ public ActiveEth2P2PNetwork(
final SubnetSubscriptionService attestationSubnetService,
final SubnetSubscriptionService syncCommitteeSubnetService,
final SubnetSubscriptionService dataColumnSidecarSubnetService,
final SubnetSubscriptionService executionProofSubnetService,
final GossipEncoding gossipEncoding,
final GossipConfigurator gossipConfigurator,
final ProcessedAttestationSubscriptionProvider processedAttestationSubscriptionProvider,
Expand All @@ -115,6 +118,7 @@ public ActiveEth2P2PNetwork(
this.attestationSubnetService = attestationSubnetService;
this.syncCommitteeSubnetService = syncCommitteeSubnetService;
this.dataColumnSidecarSubnetService = dataColumnSidecarSubnetService;
this.executionProofSubnetService = executionProofSubnetService;
this.processedAttestationSubscriptionProvider = processedAttestationSubscriptionProvider;
this.dasTotalCustodySubnetCount = dasTotalCustodySubnetCount;
this.allTopicsFilterEnabled = allTopicsFilterEnabled;
Expand Down Expand Up @@ -144,6 +148,9 @@ private synchronized void startup() {
eventChannels.subscribe(
DataColumnSidecarGossipChannel.class,
(sidecar, __) -> gossipForkManager.publishDataColumnSidecar(sidecar));
eventChannels.subscribe(
ExecutionProofGossipChannel.class, gossipForkManager::publishExecutionProof);

if (recentChainData.isCloseToInSync()) {
startGossip();
}
Expand Down Expand Up @@ -361,6 +368,18 @@ public void unsubscribeFromDataColumnSidecarSubnetId(final int subnetId) {
dataColumnSidecarSubnetService.removeSubscription(subnetId);
}

@Override
public void subscribeToExecutionProofSubnetId(final int subnetId) {
gossipForkManager.subscribeToExecutionProofSubnetId(subnetId);
executionProofSubnetService.addSubscription(subnetId);
}

@Override
public void unsubscribeFromExecutionProofSubnetId(final int subnetId) {
gossipForkManager.unsubscribeFromExecutionProofSubnetId(subnetId);
executionProofSubnetService.removeSubscription(subnetId);
}

@Override
public MetadataMessage getMetadata() {
return peerManager.getMetadataMessage();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ public interface Eth2P2PNetwork extends P2PNetwork<Eth2Peer> {

void unsubscribeFromDataColumnSidecarSubnetId(int subnetId);

void subscribeToExecutionProofSubnetId(int subnetId);

void unsubscribeFromExecutionProofSubnetId(int subnetId);

MetadataMessage getMetadata();

void publishSyncCommitteeMessage(ValidatableSyncCommitteeMessage message);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar;
import tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock;
import tech.pegasys.teku.spec.datastructures.epbs.versions.gloas.PayloadAttestationMessage;
import tech.pegasys.teku.spec.datastructures.execution.ExecutionProof;
import tech.pegasys.teku.spec.datastructures.operations.AttesterSlashing;
import tech.pegasys.teku.spec.datastructures.operations.ProposerSlashing;
import tech.pegasys.teku.spec.datastructures.operations.SignedBlsToExecutionChange;
Expand Down Expand Up @@ -148,6 +149,7 @@ public class Eth2P2PNetworkBuilder {
protected OperationProcessor<ValidatableSyncCommitteeMessage>
gossipedSyncCommitteeMessageProcessor;
protected OperationProcessor<DataColumnSidecar> dataColumnSidecarOperationProcessor;
protected OperationProcessor<ExecutionProof> executionProofOperationProcessor;
protected StatusMessageFactory statusMessageFactory;
protected KZG kzg;
protected boolean recordMessageArrival;
Expand All @@ -169,6 +171,7 @@ public Eth2P2PNetwork build() {
final SubnetSubscriptionService syncCommitteeSubnetService = new SubnetSubscriptionService();
final SubnetSubscriptionService dataColumnSidecarSubnetService =
new SubnetSubscriptionService();
final SubnetSubscriptionService executionProofSubnetService = new SubnetSubscriptionService();
final DiscoveryNodeIdExtractor discoveryNodeIdExtractor = new LibP2PDiscoveryNodeIdExtractor();
final RpcEncoding rpcEncoding =
RpcEncoding.createSszSnappyEncoding(spec.getNetworkingConfig().getMaxPayloadSize());
Expand Down Expand Up @@ -232,6 +235,7 @@ public Eth2P2PNetwork build() {
attestationSubnetService,
syncCommitteeSubnetService,
dataColumnSidecarSubnetService,
executionProofSubnetService,
gossipEncoding,
config.getGossipConfigurator(),
processedAttestationSubscriptionProvider,
Expand Down Expand Up @@ -381,7 +385,9 @@ private GossipForkSubscriptions createSubscriptions(
gossipedSignedContributionAndProofProcessor,
gossipedSyncCommitteeMessageProcessor,
gossipedSignedBlsToExecutionChangeProcessor,
debugDataDumper);
debugDataDumper,
executionProofOperationProcessor,
config.isExecutionProofTopicEnabled());
case FULU ->
new GossipForkSubscriptionsFulu(
forkAndSpecMilestone.getFork(),
Expand All @@ -403,7 +409,9 @@ private GossipForkSubscriptions createSubscriptions(
gossipedSignedBlsToExecutionChangeProcessor,
dataColumnSidecarOperationProcessor,
debugDataDumper,
dasGossipLogger);
dasGossipLogger,
executionProofOperationProcessor,
config.isExecutionProofTopicEnabled());
case GLOAS ->
new GossipForkSubscriptionsGloas(
forkAndSpecMilestone.getFork(),
Expand All @@ -426,7 +434,9 @@ private GossipForkSubscriptions createSubscriptions(
dataColumnSidecarOperationProcessor,
payloadAttestationMessageProcessor,
debugDataDumper,
dasGossipLogger);
dasGossipLogger,
executionProofOperationProcessor,
config.isExecutionProofTopicEnabled());
};
}

Expand Down Expand Up @@ -456,9 +466,11 @@ private GossipForkSubscriptions createBpoSubscriptions(
gossipedSyncCommitteeMessageProcessor,
gossipedSignedBlsToExecutionChangeProcessor,
dataColumnSidecarOperationProcessor,
executionProofOperationProcessor,
debugDataDumper,
dasGossipLogger,
bpo);
bpo,
config.isExecutionProofTopicEnabled());
case GLOAS ->
new GossipForkSubscriptionsGloasBpo(
forkAndSpecMilestone.getFork(),
Expand All @@ -479,10 +491,12 @@ private GossipForkSubscriptions createBpoSubscriptions(
gossipedSyncCommitteeMessageProcessor,
gossipedSignedBlsToExecutionChangeProcessor,
dataColumnSidecarOperationProcessor,
executionProofOperationProcessor,
payloadAttestationMessageProcessor,
debugDataDumper,
dasGossipLogger,
bpo);
bpo,
config.isExecutionProofTopicEnabled());
default ->
throw new IllegalStateException(
"BPO is not supported for: " + forkAndSpecMilestone.getSpecMilestone());
Expand All @@ -502,7 +516,7 @@ protected DiscoveryNetwork<?> buildNetwork(
combinedChainDataClient.getRecentChainData()::getMilestoneByForkDigest);
final GossipTopicFilter gossipTopicsFilter =
new Eth2GossipTopicFilter(
combinedChainDataClient.getRecentChainData(), gossipEncoding, spec);
combinedChainDataClient.getRecentChainData(), gossipEncoding, spec, config);
final NetworkConfig networkConfig = config.getNetworkConfig();
final DiscoveryConfig discoConfig = config.getDiscoveryConfig();

Expand Down Expand Up @@ -615,6 +629,7 @@ private void validate() {
"gossipedSignedBlsToExecutionChangeProcessor", gossipedSignedBlsToExecutionChangeProcessor);
assertNotNull(
"gossipedDataColumnSidecarOperationProcessor", dataColumnSidecarOperationProcessor);
// TODO maybe add an assertion here for EP Op Processor?
assertNotNull("gossipedPayloadAttestationMessageProcessor", payloadAttestationMessageProcessor);
}

Expand Down Expand Up @@ -755,6 +770,13 @@ public Eth2P2PNetworkBuilder gossipedDataColumnSidecarOperationProcessor(
return this;
}

public Eth2P2PNetworkBuilder gossipedExecutionProofOperationProcessor(
final OperationProcessor<ExecutionProof> executionProofOperationProcessor) {
checkNotNull(executionProofOperationProcessor);
this.executionProofOperationProcessor = executionProofOperationProcessor;
return this;
}

public Eth2P2PNetworkBuilder gossipedPayloadAttestationMessageProcessor(
final OperationProcessor<PayloadAttestationMessage>
gossipedPayloadAttestationMessageProcessor) {
Expand Down
Loading