From a04f3ff33909018919a82e7092d62f0c831c85e9 Mon Sep 17 00:00:00 2001 From: Mehdi AOUADI Date: Mon, 9 Dec 2024 17:44:11 +0100 Subject: [PATCH] add missing electra attestation processing committee check (#8901) * add missing electra attestation processing committee check --- .../operations/OperationsTestExecutor.java | 9 --------- .../electra/block/BlockProcessorElectra.java | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/OperationsTestExecutor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/OperationsTestExecutor.java index 3651eae033d..df11615cc16 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/OperationsTestExecutor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/OperationsTestExecutor.java @@ -21,7 +21,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableMap; -import java.util.List; import java.util.Optional; import tech.pegasys.teku.ethtests.finder.TestDefinition; import tech.pegasys.teku.infrastructure.ssz.SszData; @@ -68,9 +67,6 @@ public class OperationsTestExecutor implements TestExecutor { public static final String EXPECTED_STATE_FILE = "post.ssz_snappy"; - // TODO remove https://github.com/Consensys/teku/issues/8892 - private static final List IGNORED_TEST = List.of("invalid_nonset_bits_for_one_committee"); - private enum Operation { ATTESTER_SLASHING, PROPOSER_SLASHING, @@ -148,11 +144,6 @@ public OperationsTestExecutor(final String dataFileName, final Operation operati @Override public void runTest(final TestDefinition testDefinition) throws Exception { - // TODO remove https://github.com/Consensys/teku/issues/8892 - if (IGNORED_TEST.contains(testDefinition.getTestName())) { - return; - } - final BeaconState preState = loadStateFromSsz(testDefinition, "pre.ssz_snappy"); final DefaultOperationProcessor standardProcessor = diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/electra/block/BlockProcessorElectra.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/electra/block/BlockProcessorElectra.java index 9bfe1da33b4..8693f37efc0 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/electra/block/BlockProcessorElectra.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/electra/block/BlockProcessorElectra.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; +import java.util.stream.IntStream; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.tuweni.bytes.Bytes32; @@ -725,16 +726,25 @@ private Optional checkCommittees( final BeaconState state, final UInt64 slot, final SszBitlist aggregationBits) { - int participantsCount = 0; + int committeeOffset = 0; for (final UInt64 committeeIndex : committeeIndices) { if (committeeIndex.isGreaterThanOrEqualTo(committeeCountPerSlot)) { return Optional.of(AttestationInvalidReason.COMMITTEE_INDEX_TOO_HIGH); } final IntList committee = beaconStateAccessorsElectra.getBeaconCommittee(state, slot, committeeIndex); - participantsCount += committee.size(); + final int currentCommitteeOffset = committeeOffset; + final boolean committeeHasAtLeastOneAttester = + IntStream.range(0, committee.size()) + .anyMatch( + committeeParticipantIndex -> + aggregationBits.isSet(currentCommitteeOffset + committeeParticipantIndex)); + if (!committeeHasAtLeastOneAttester) { + return Optional.of(AttestationInvalidReason.PARTICIPANTS_COUNT_MISMATCH); + } + committeeOffset += committee.size(); } - if (participantsCount != aggregationBits.size()) { + if (committeeOffset != aggregationBits.size()) { return Optional.of(AttestationInvalidReason.PARTICIPANTS_COUNT_MISMATCH); } return Optional.empty();