diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/events/EventSubscriptionManagerTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/events/EventSubscriptionManagerTest.java index 6608ba1d0a2..2fc906e5e38 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/events/EventSubscriptionManagerTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/events/EventSubscriptionManagerTest.java @@ -41,6 +41,7 @@ import tech.pegasys.teku.api.schema.Attestation; import tech.pegasys.teku.api.schema.SignedBeaconBlock; import tech.pegasys.teku.api.schema.SignedVoluntaryExit; +import tech.pegasys.teku.api.schema.altair.SignedBeaconBlockAltair; import tech.pegasys.teku.infrastructure.async.StubAsyncRunner; import tech.pegasys.teku.infrastructure.events.EventChannels; import tech.pegasys.teku.infrastructure.unsigned.UInt64; @@ -95,7 +96,7 @@ public class EventSubscriptionManagerTest { private final SyncState sampleSyncState = SyncState.IN_SYNC; private final SignedBeaconBlock sampleBlock = - new SignedBeaconBlock(data.randomSignedBeaconBlock(0)); + new SignedBeaconBlockAltair(data.randomSignedBeaconBlock(0)); private final Attestation sampleAttestation = new Attestation(data.randomAttestation(0)); private final SignedVoluntaryExit sampleVoluntaryExit = new SignedVoluntaryExit(data.randomSignedVoluntaryExit()); diff --git a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/SignedBeaconBlock.java b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/SignedBeaconBlock.java index dcb7f7688ee..d6ca4da83f7 100644 --- a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/SignedBeaconBlock.java +++ b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/SignedBeaconBlock.java @@ -49,7 +49,7 @@ public SignedBeaconBlock( public tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock asInternalSignedBeaconBlock( final Spec spec) { final tech.pegasys.teku.spec.datastructures.blocks.BeaconBlock beaconBlock = - message.asInternalBeaconBlock(spec); + getMessage().asInternalBeaconBlock(spec); return tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock.create( spec, beaconBlock, signature.asInternalBLSSignature()); } diff --git a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/BeaconBlockAltair.java b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/BeaconBlockAltair.java index fb168bd2e28..8d0796c8d7a 100644 --- a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/BeaconBlockAltair.java +++ b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/BeaconBlockAltair.java @@ -19,10 +19,32 @@ import tech.pegasys.teku.api.schema.BeaconBlock; import tech.pegasys.teku.api.schema.interfaces.UnsignedBlock; import tech.pegasys.teku.infrastructure.unsigned.UInt64; +import tech.pegasys.teku.spec.Spec; +import tech.pegasys.teku.spec.SpecVersion; +import tech.pegasys.teku.spec.schemas.SchemaDefinitionsAltair; public class BeaconBlockAltair extends BeaconBlock implements UnsignedBlock { private final BeaconBlockBodyAltair body; + public BeaconBlockAltair(tech.pegasys.teku.spec.datastructures.blocks.BeaconBlock message) { + super(message); + this.body = new BeaconBlockBodyAltair(message.getBody().toVersionAltair().orElseThrow()); + } + + @Override + public tech.pegasys.teku.spec.datastructures.blocks.BeaconBlock asInternalBeaconBlock( + final Spec spec) { + final SpecVersion specVersion = spec.atSlot(slot); + return SchemaDefinitionsAltair.required(specVersion.getSchemaDefinitions()) + .getBeaconBlockSchema() + .create( + slot, + proposer_index, + parent_root, + state_root, + body.asInternalBeaconBlockBody(specVersion)); + } + @JsonProperty("body") @Override public final BeaconBlockBodyAltair getBody() { diff --git a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/SignedBeaconBlockAltair.java b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/SignedBeaconBlockAltair.java index 35a701c92b8..c0c166b3f3a 100644 --- a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/SignedBeaconBlockAltair.java +++ b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/altair/SignedBeaconBlockAltair.java @@ -22,6 +22,12 @@ public class SignedBeaconBlockAltair extends SignedBeaconBlock implements SignedBlock { private final BeaconBlockAltair message; + public SignedBeaconBlockAltair( + tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock internalBlock) { + super(internalBlock); + this.message = new BeaconBlockAltair(internalBlock.getMessage()); + } + @Override public BeaconBlockAltair getMessage() { return message; diff --git a/ethereum/core/src/testFixtures/java/tech/pegasys/teku/core/BlockProposalTestUtil.java b/ethereum/core/src/testFixtures/java/tech/pegasys/teku/core/BlockProposalTestUtil.java index 55e39e215dd..473165779d6 100644 --- a/ethereum/core/src/testFixtures/java/tech/pegasys/teku/core/BlockProposalTestUtil.java +++ b/ethereum/core/src/testFixtures/java/tech/pegasys/teku/core/BlockProposalTestUtil.java @@ -36,14 +36,17 @@ import tech.pegasys.teku.spec.logic.common.statetransition.exceptions.EpochProcessingException; import tech.pegasys.teku.spec.logic.common.statetransition.exceptions.SlotProcessingException; import tech.pegasys.teku.spec.logic.common.statetransition.exceptions.StateTransitionException; +import tech.pegasys.teku.spec.util.DataStructureUtil; import tech.pegasys.teku.ssz.SszList; public class BlockProposalTestUtil { private final Spec spec; + private final DataStructureUtil dataStructureUtil; private final BeaconBlockBodyLists blockBodyLists; public BlockProposalTestUtil(final Spec spec) { this.spec = spec; + this.dataStructureUtil = new DataStructureUtil(spec); blockBodyLists = BeaconBlockBodyLists.ofSpec(spec); } @@ -79,7 +82,10 @@ public SignedBlockAndState createNewBlock( .proposerSlashings(slashings) .attesterSlashings(blockBodyLists.createAttesterSlashings()) .deposits(deposits) - .voluntaryExits(exits)); + .voluntaryExits(exits) + .syncAggregate( + () -> + dataStructureUtil.emptySyncAggregateIfRequiredByState(blockSlotState))); // Sign block and set block signature final BeaconBlock block = newBlockAndState.getBlock(); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodySchemaAltairImpl.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodySchemaAltairImpl.java index 39a3128484d..7795d2cd82a 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodySchemaAltairImpl.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodySchemaAltairImpl.java @@ -113,8 +113,6 @@ static BeaconBlockBodySchemaAltair create( @Override public BeaconBlockBody createBlockBody(final Consumer builderConsumer) { final BeaconBlockBodyBuilderAltair builder = new BeaconBlockBodyBuilderAltair().schema(this); - // Provide a default empty sync aggregate - builder.syncAggregate(getSyncAggregateSchema()::createEmpty); builderConsumer.accept(builder); return builder.build(); } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodySchemaMergeImpl.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodySchemaMergeImpl.java index eec198b8ee1..354c9f1e979 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodySchemaMergeImpl.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodySchemaMergeImpl.java @@ -110,8 +110,6 @@ static BeaconBlockBodySchemaMergeImpl create( @Override public BeaconBlockBody createBlockBody(final Consumer builderConsumer) { final BeaconBlockBodyBuilderMerge builder = new BeaconBlockBodyBuilderMerge().schema(this); - // Provide a default empty sync aggregate - builder.syncAggregate(getSyncAggregateSchema()::createEmpty); builderConsumer.accept(builder); return builder.build(); } diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/common/AbstractBeaconBlockBodyTest.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/common/AbstractBeaconBlockBodyTest.java index 44175683038..e98df81b7b5 100644 --- a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/common/AbstractBeaconBlockBodyTest.java +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/common/AbstractBeaconBlockBodyTest.java @@ -25,12 +25,12 @@ import org.junit.jupiter.api.Test; import tech.pegasys.teku.bls.BLSSignature; import tech.pegasys.teku.spec.Spec; +import tech.pegasys.teku.spec.SpecMilestone; import tech.pegasys.teku.spec.TestSpecFactory; import tech.pegasys.teku.spec.datastructures.blocks.Eth1Data; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBody; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodyBuilder; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodySchema; -import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayload; import tech.pegasys.teku.spec.datastructures.operations.Attestation; import tech.pegasys.teku.spec.datastructures.operations.AttesterSlashing; import tech.pegasys.teku.spec.datastructures.operations.Deposit; @@ -42,37 +42,54 @@ import tech.pegasys.teku.ssz.SszList; public abstract class AbstractBeaconBlockBodyTest { - protected final Spec spec = TestSpecFactory.createMinimalPhase0(); - private final BeaconBlockBodyLists blockBodyLists = BeaconBlockBodyLists.ofSpec(spec); - - protected final DataStructureUtil dataStructureUtil = new DataStructureUtil(spec); - - protected BLSSignature randaoReveal = dataStructureUtil.randomSignature(); - protected Eth1Data eth1Data = dataStructureUtil.randomEth1Data(); - protected Bytes32 graffiti = dataStructureUtil.randomBytes32(); - protected SszList proposerSlashings = - blockBodyLists.createProposerSlashings( - dataStructureUtil.randomProposerSlashing(), - dataStructureUtil.randomProposerSlashing(), - dataStructureUtil.randomProposerSlashing()); - protected SszList attesterSlashings = - blockBodyLists.createAttesterSlashings(dataStructureUtil.randomAttesterSlashing()); - protected SszList attestations = - blockBodyLists.createAttestations( - dataStructureUtil.randomAttestation(), - dataStructureUtil.randomAttestation(), - dataStructureUtil.randomAttestation()); - protected SszList deposits = - blockBodyLists.createDeposits(dataStructureUtil.randomDeposits(2).toArray(new Deposit[0])); - protected SszList voluntaryExits = - blockBodyLists.createVoluntaryExits( - dataStructureUtil.randomSignedVoluntaryExit(), - dataStructureUtil.randomSignedVoluntaryExit(), - dataStructureUtil.randomSignedVoluntaryExit()); - protected ExecutionPayload executionPayload = dataStructureUtil.randomExecutionPayload(); - - private final T defaultBlockBody = createDefaultBlockBody(); - BeaconBlockBodySchema blockBodySchema = defaultBlockBody.getSchema(); + protected Spec spec; + protected DataStructureUtil dataStructureUtil; + + protected BLSSignature randaoReveal; + protected Eth1Data eth1Data; + protected Bytes32 graffiti; + protected SszList proposerSlashings; + protected SszList attesterSlashings; + protected SszList attestations; + protected SszList deposits; + protected SszList voluntaryExits; + + private T defaultBlockBody; + BeaconBlockBodySchema blockBodySchema; + + protected void setUpBaseClass(final SpecMilestone milestone, Runnable additionalSetup) { + spec = TestSpecFactory.createMinimal(milestone); + dataStructureUtil = new DataStructureUtil(spec); + BeaconBlockBodyLists blockBodyLists = BeaconBlockBodyLists.ofSpec(spec); + + voluntaryExits = + blockBodyLists.createVoluntaryExits( + dataStructureUtil.randomSignedVoluntaryExit(), + dataStructureUtil.randomSignedVoluntaryExit(), + dataStructureUtil.randomSignedVoluntaryExit()); + deposits = + blockBodyLists.createDeposits(dataStructureUtil.randomDeposits(2).toArray(new Deposit[0])); + attestations = + blockBodyLists.createAttestations( + dataStructureUtil.randomAttestation(), + dataStructureUtil.randomAttestation(), + dataStructureUtil.randomAttestation()); + attesterSlashings = + blockBodyLists.createAttesterSlashings(dataStructureUtil.randomAttesterSlashing()); + proposerSlashings = + blockBodyLists.createProposerSlashings( + dataStructureUtil.randomProposerSlashing(), + dataStructureUtil.randomProposerSlashing(), + dataStructureUtil.randomProposerSlashing()); + graffiti = dataStructureUtil.randomBytes32(); + eth1Data = dataStructureUtil.randomEth1Data(); + randaoReveal = dataStructureUtil.randomSignature(); + + additionalSetup.run(); + + defaultBlockBody = createDefaultBlockBody(); + blockBodySchema = defaultBlockBody.getSchema(); + } private T createBlockBody() { return createBlockBody(createContentProvider()); diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodyAltairTest.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodyAltairTest.java index 78a6835bfce..c3253381d0c 100644 --- a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodyAltairTest.java +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/altair/BeaconBlockBodyAltairTest.java @@ -13,27 +13,21 @@ package tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair; -import static org.assertj.core.api.Assertions.assertThat; - import java.util.function.Consumer; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import tech.pegasys.teku.spec.SpecMilestone; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodyBuilder; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodySchema; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.common.AbstractBeaconBlockBodyTest; class BeaconBlockBodyAltairTest extends AbstractBeaconBlockBodyTest { - @Test - void shouldCreateWithEmptySyncAggregate() { - // This won't always be true but until we can calculate the actual SyncAggregate, use the empty - // one to make the block valid - - final BeaconBlockBodyAltair blockBody = createDefaultBlockBody(); - final SyncAggregate emptySyncAggregate = - SyncAggregateSchema.create( - spec.getGenesisSpecConfig().toVersionAltair().orElseThrow().getSyncCommitteeSize()) - .createEmpty(); - assertThat(blockBody.getSyncAggregate()).isEqualTo(emptySyncAggregate); + protected SyncAggregate syncAggregate; + + @BeforeEach + void setup() { + super.setUpBaseClass( + SpecMilestone.ALTAIR, () -> syncAggregate = dataStructureUtil.randomSyncAggregate()); } @Override @@ -46,4 +40,10 @@ protected BeaconBlockBodyAltair createBlockBody( protected BeaconBlockBodySchema getBlockBodySchema() { return BeaconBlockBodySchemaAltair.create(spec.getGenesisSpecConfig()); } + + @Override + protected Consumer createContentProvider() { + return super.createContentProvider() + .andThen(builder -> builder.syncAggregate(() -> syncAggregate)); + } } diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodyMergeTest.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodyMergeTest.java index fcba6db154d..3463d100f73 100644 --- a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodyMergeTest.java +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/merge/BeaconBlockBodyMergeTest.java @@ -13,29 +13,28 @@ package tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.merge; -import static org.assertj.core.api.Assertions.assertThat; - import java.util.function.Consumer; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import tech.pegasys.teku.spec.SpecMilestone; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodyBuilder; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodySchema; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.common.AbstractBeaconBlockBodyTest; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.SyncAggregate; -import tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.SyncAggregateSchema; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayload; class BeaconBlockBodyMergeTest extends AbstractBeaconBlockBodyTest { - @Test - void shouldCreateWithEmptySyncAggregate() { - // This won't always be true but until we can calculate the actual SyncAggregate, use the empty - // one to make the block valid - - final BeaconBlockBodyMerge blockBody = createDefaultBlockBody(); - final SyncAggregate emptySyncAggregate = - SyncAggregateSchema.create( - spec.getGenesisSpecConfig().toVersionMerge().orElseThrow().getSyncCommitteeSize()) - .createEmpty(); - assertThat(blockBody.getSyncAggregate()).isEqualTo(emptySyncAggregate); + protected SyncAggregate syncAggregate; + protected ExecutionPayload executionPayload; + + @BeforeEach + void setup() { + super.setUpBaseClass( + SpecMilestone.MERGE, + () -> { + syncAggregate = dataStructureUtil.randomSyncAggregate(); + executionPayload = dataStructureUtil.randomExecutionPayload(); + }); } @Override @@ -52,6 +51,10 @@ protected BeaconBlockBodySchema getBlockBodySche @Override protected Consumer createContentProvider() { return super.createContentProvider() - .andThen(builder -> builder.executionPayload(() -> executionPayload)); + .andThen( + builder -> + builder + .syncAggregate(() -> syncAggregate) + .executionPayload(() -> executionPayload)); } } diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/phase0/BeaconBlockBodyPhase0Test.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/phase0/BeaconBlockBodyPhase0Test.java index e383114971b..0d1d442160a 100644 --- a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/phase0/BeaconBlockBodyPhase0Test.java +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/blocks/blockbody/versions/phase0/BeaconBlockBodyPhase0Test.java @@ -14,12 +14,19 @@ package tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.phase0; import java.util.function.Consumer; +import org.junit.jupiter.api.BeforeEach; +import tech.pegasys.teku.spec.SpecMilestone; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodyBuilder; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodySchema; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.common.AbstractBeaconBlockBodyTest; public class BeaconBlockBodyPhase0Test extends AbstractBeaconBlockBodyTest { + @BeforeEach + void setup() { + super.setUpBaseClass(SpecMilestone.PHASE0, () -> {}); + } + @Override protected BeaconBlockBodyPhase0 createBlockBody( final Consumer contentProvider) { diff --git a/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/util/DataStructureUtil.java b/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/util/DataStructureUtil.java index 51796c19b3c..11818fb634f 100644 --- a/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/util/DataStructureUtil.java +++ b/ethereum/spec/src/testFixtures/java/tech/pegasys/teku/spec/util/DataStructureUtil.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.Random; import java.util.function.Function; import java.util.function.Supplier; @@ -55,7 +56,6 @@ import tech.pegasys.teku.spec.datastructures.blocks.SlotAndBlockRoot; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBody; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBodySchema; -import tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.BeaconBlockBodySchemaAltair; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.SyncAggregate; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.SyncAggregateSchema; import tech.pegasys.teku.spec.datastructures.eth1.Eth1Address; @@ -330,16 +330,43 @@ public Checkpoint randomCheckpoint() { return new Checkpoint(randomEpoch(), randomBytes32()); } + public SyncAggregate randomSyncAggregateIfRequiredBySchema(BeaconBlockBodySchema schema) { + return schema.toVersionAltair().map(__ -> randomSyncAggregate()).orElse(null); + } + + public SyncAggregate randomSyncAggregateIfRequiredByState(BeaconState state) { + return state.toVersionAltair().map(__ -> randomSyncAggregate()).orElse(null); + } + + public SyncAggregate emptySyncAggregateIfRequiredByState(BeaconState state) { + return state.toVersionAltair().map(__ -> emptySyncAggregate()).orElse(null); + } + public SyncAggregate randomSyncAggregate() { return randomSyncAggregate(randomInt(4), randomInt(4)); } + public SyncAggregate emptySyncAggregate() { + SpecVersion specVersionAltair = + Optional.ofNullable(spec.forMilestone(SpecMilestone.ALTAIR)).orElseThrow(); + + return getSyncAggregateSchema(specVersionAltair).createEmpty(); + } + public SyncAggregate randomSyncAggregate(final Integer... participantIndices) { - final SyncAggregateSchema schema = - BeaconBlockBodySchemaAltair.required( - spec.getGenesisSchemaDefinitions().getBeaconBlockBodySchema()) - .getSyncAggregateSchema(); - return schema.create(List.of(participantIndices), randomSignature()); + SpecVersion specVersionAltair = + Optional.ofNullable(spec.forMilestone(SpecMilestone.ALTAIR)).orElseThrow(); + + return getSyncAggregateSchema(specVersionAltair) + .create(List.of(participantIndices), randomSignature()); + } + + private SyncAggregateSchema getSyncAggregateSchema(SpecVersion specVersionAltair) { + return SchemaDefinitionsAltair.required(specVersionAltair.getSchemaDefinitions()) + .getBeaconBlockBodySchema() + .toVersionAltair() + .orElseThrow() + .getSyncAggregateSchema(); } public SyncCommittee randomSyncCommittee() { @@ -387,6 +414,11 @@ public ExecutionPayloadHeader randomExecutionPayloadHeader() { randomBytes32()); } + public ExecutionPayload randomExecutionPayloadIfRequiredBySchema( + BeaconBlockBodySchema schema) { + return schema.toVersionMerge().map(__ -> randomExecutionPayload()).orElse(null); + } + public ExecutionPayload randomExecutionPayload() { return new ExecutionPayload( randomBytes32(), @@ -706,7 +738,9 @@ public BeaconBlockBody randomBeaconBlockBody() { randomSszList(schema.getDepositsSchema(), this::randomDepositWithoutIndex, 1)) .voluntaryExits( randomSszList( - schema.getVoluntaryExitsSchema(), this::randomSignedVoluntaryExit, 1))); + schema.getVoluntaryExitsSchema(), this::randomSignedVoluntaryExit, 1)) + .syncAggregate(() -> this.randomSyncAggregateIfRequiredBySchema(schema)) + .executionPayload(() -> this.randomExecutionPayloadIfRequiredBySchema(schema))); } public BeaconBlockBody randomFullBeaconBlockBody() { diff --git a/storage/src/testFixtures/java/tech/pegasys/teku/storage/storageSystem/StorageSystem.java b/storage/src/testFixtures/java/tech/pegasys/teku/storage/storageSystem/StorageSystem.java index f3fed6d1cc6..1903879d94a 100644 --- a/storage/src/testFixtures/java/tech/pegasys/teku/storage/storageSystem/StorageSystem.java +++ b/storage/src/testFixtures/java/tech/pegasys/teku/storage/storageSystem/StorageSystem.java @@ -57,7 +57,8 @@ private StorageSystem( final RecentChainData recentChainData, final CombinedChainDataClient combinedChainDataClient, final RestartedStorageSupplier restartedSupplier, - final ChainBuilder chainBuilder) { + final ChainBuilder chainBuilder, + final Spec spec) { this.metricsSystem = metricsSystem; this.chainStorage = chainStorage; this.recentChainData = recentChainData; @@ -68,7 +69,7 @@ private StorageSystem( this.restartedSupplier = restartedSupplier; this.chainBuilder = chainBuilder; - chainUpdater = new ChainUpdater(this.recentChainData, this.chainBuilder); + chainUpdater = new ChainUpdater(this.recentChainData, this.chainBuilder, spec); } static StorageSystem create( @@ -114,7 +115,8 @@ static StorageSystem create( recentChainData, combinedChainDataClient, restartedSupplier, - chainBuilder); + chainBuilder, + spec); } public StubMetricsSystem getMetricsSystem() {