From 4ab8dfe37515345ce85e99aa73a627910104e9d9 Mon Sep 17 00:00:00 2001 From: Lucas Saldanha Date: Tue, 29 Apr 2025 15:11:51 +1200 Subject: [PATCH 1/4] Returning custody_group_count on node/identity Beacon API --- .../v1/node/GetIdentityIntegrationTest.java | 19 +++++++++++++++++++ .../handlers/v1/node/GetIdentity.java | 5 +++++ .../spec/schemas/SchemaDefinitionsAltair.java | 3 ++- .../spec/schemas/SchemaDefinitionsFulu.java | 9 +++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/data/beaconrestapi/src/integration-test/java/tech/pegasys/teku/beaconrestapi/v1/node/GetIdentityIntegrationTest.java b/data/beaconrestapi/src/integration-test/java/tech/pegasys/teku/beaconrestapi/v1/node/GetIdentityIntegrationTest.java index 4d0f2e83fc8..9564e1f5aa6 100644 --- a/data/beaconrestapi/src/integration-test/java/tech/pegasys/teku/beaconrestapi/v1/node/GetIdentityIntegrationTest.java +++ b/data/beaconrestapi/src/integration-test/java/tech/pegasys/teku/beaconrestapi/v1/node/GetIdentityIntegrationTest.java @@ -84,6 +84,25 @@ public void shouldReturnNetworkIdentityAltair() throws Exception { "{\"seq_number\":\"4666673844721362956\",\"attnets\":\"0x0288000000000000\",\"syncnets\":\"0x0f\"}"); } + @Test + public void shouldReturnNetworkIdentityFulu() throws Exception { + startRestAPIAtGenesis(SpecMilestone.FULU); + + final MetadataMessage metadataMessage = + spec.getGenesisSchemaDefinitions() + .getMetadataMessageSchema() + .create(seqnr, List.of(1, 11, 15), List.of(0, 1, 2, 3), Optional.of(UInt64.valueOf(4))); + + when(eth2P2PNetwork.getMetadata()).thenReturn(metadataMessage); + + final Response response = getResponse(GetIdentity.ROUTE); + assertThat(response.code()).isEqualTo(SC_OK); + checkResponseData( + response, + "{\"seq_number\":\"4666673844721362956\",\"attnets\":\"0x0288000000000000\",\"syncnets\":\"0x0f\"," + + "\"custody_group_count\":\"4\"}"); + } + private void checkResponseData(final Response response, final String metadata) throws IOException { final JsonNode data = getResponseData(response); diff --git a/data/beaconrestapi/src/main/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetIdentity.java b/data/beaconrestapi/src/main/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetIdentity.java index cda8980fb79..d36c23cb73d 100644 --- a/data/beaconrestapi/src/main/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetIdentity.java +++ b/data/beaconrestapi/src/main/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetIdentity.java @@ -139,6 +139,11 @@ private static SerializableTypeDefinition createMetadataType( .withDescription( "Bitvector representing the node's persistent sync committee subnet subscriptions."), MetadataMessage::getOptionalSyncnets) + .withOptionalField( + "custody_group_count", + UINT64_TYPE.withDescription( + "Uint64 representing the node's custody group count. The metadata is present from the Fulu fork."), + MetadataMessage::getOptionalCustodyGroupCount) .build(); } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java index 8cc1fac6433..3b496e074ab 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java @@ -37,6 +37,7 @@ import tech.pegasys.teku.spec.datastructures.lightclient.LightClientHeaderSchema; import tech.pegasys.teku.spec.datastructures.lightclient.LightClientUpdateResponseSchema; import tech.pegasys.teku.spec.datastructures.lightclient.LightClientUpdateSchema; +import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.MetadataMessageSchema; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.versions.altair.MetadataMessageSchemaAltair; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof.AggregateAndProofSchema; import tech.pegasys.teku.spec.datastructures.operations.Attestation; @@ -195,7 +196,7 @@ public BeaconBlockBodyBuilder createBeaconBlockBodyBuilder() { } @Override - public MetadataMessageSchemaAltair getMetadataMessageSchema() { + public MetadataMessageSchema getMetadataMessageSchema() { return metadataMessageSchema; } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java index 7b9c96e2172..54be30726db 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java @@ -20,6 +20,7 @@ import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.DATA_COLUMN_SIDECARS_BY_ROOT_REQUEST_MESSAGE_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.DATA_COLUMN_SIDECAR_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.MATRIX_ENTRY_SCHEMA; +import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.METADATA_MESSAGE_SCHEMA; import java.util.Optional; import tech.pegasys.teku.spec.datastructures.blobs.versions.fulu.CellSchema; @@ -28,6 +29,7 @@ import tech.pegasys.teku.spec.datastructures.blobs.versions.fulu.MatrixEntrySchema; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.DataColumnSidecarsByRangeRequestMessage; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.DataColumnSidecarsByRootRequestMessageSchema; +import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.MetadataMessageSchema; import tech.pegasys.teku.spec.schemas.registry.SchemaRegistry; public class SchemaDefinitionsFulu extends SchemaDefinitionsElectra { @@ -41,6 +43,7 @@ public class SchemaDefinitionsFulu extends SchemaDefinitionsElectra { private final DataColumnSidecarsByRangeRequestMessage .DataColumnSidecarsByRangeRequestMessageSchema dataColumnSidecarsByRangeRequestMessageSchema; + private final MetadataMessageSchema metadataMessageSchema; public SchemaDefinitionsFulu(final SchemaRegistry schemaRegistry) { super(schemaRegistry); @@ -52,6 +55,7 @@ public SchemaDefinitionsFulu(final SchemaRegistry schemaRegistry) { schemaRegistry.get(DATA_COLUMN_SIDECARS_BY_ROOT_REQUEST_MESSAGE_SCHEMA); this.dataColumnSidecarsByRangeRequestMessageSchema = schemaRegistry.get(DATA_COLUMN_SIDECARS_BY_RANGE_REQUEST_MESSAGE_SCHEMA); + this.metadataMessageSchema = schemaRegistry.get(METADATA_MESSAGE_SCHEMA); } public static SchemaDefinitionsFulu required(final SchemaDefinitions schemaDefinitions) { @@ -89,6 +93,11 @@ public MatrixEntrySchema getMatrixEntrySchema() { return dataColumnSidecarsByRangeRequestMessageSchema; } + @Override + public MetadataMessageSchema getMetadataMessageSchema() { + return metadataMessageSchema; + } + @Override public Optional toVersionFulu() { return Optional.of(this); From 5b6fb4f0d9e03884fbd6b4ded2a80c57ef69b12c Mon Sep 17 00:00:00 2001 From: Lucas Saldanha Date: Tue, 29 Apr 2025 16:06:03 +1200 Subject: [PATCH 2/4] Fix MetaData.json --- .../pegasys/teku/beaconrestapi/beacon/schema/MetaData.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/MetaData.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/MetaData.json index bfe838e65ae..044c00c0434 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/MetaData.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/MetaData.json @@ -20,6 +20,12 @@ "pattern" : "^0x[a-fA-F0-9]{2,}$", "description" : "Bitvector representing the node's persistent sync committee subnet subscriptions.", "format" : "bytes" + }, + "custody_group_count" : { + "type" : "string", + "description" : "Uint64 representing the node's custody group count. The metadata is present from the Fulu fork.", + "example" : "1", + "format" : "uint64" } } } \ No newline at end of file From 40873889a5b925b3c770fee00fa3da5aa4a4d653 Mon Sep 17 00:00:00 2001 From: Lucas Saldanha Date: Wed, 30 Apr 2025 14:44:19 +1200 Subject: [PATCH 3/4] Fix schema registry usage --- .../teku/spec/schemas/SchemaDefinitionsAltair.java | 6 +++--- .../pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java | 9 --------- .../teku/spec/schemas/SchemaDefinitionsPhase0.java | 9 +++++---- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java index 3b496e074ab..c9216dad196 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsAltair.java @@ -17,6 +17,7 @@ import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.BEACON_BLOCK_BODY_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.BEACON_BLOCK_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.BEACON_STATE_SCHEMA; +import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.METADATA_MESSAGE_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.SIGNED_AGGREGATE_AND_PROOF_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.SIGNED_BEACON_BLOCK_SCHEMA; @@ -38,7 +39,6 @@ import tech.pegasys.teku.spec.datastructures.lightclient.LightClientUpdateResponseSchema; import tech.pegasys.teku.spec.datastructures.lightclient.LightClientUpdateSchema; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.MetadataMessageSchema; -import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.versions.altair.MetadataMessageSchemaAltair; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof.AggregateAndProofSchema; import tech.pegasys.teku.spec.datastructures.operations.Attestation; import tech.pegasys.teku.spec.datastructures.operations.AttestationSchema; @@ -70,7 +70,7 @@ public class SchemaDefinitionsAltair extends AbstractSchemaDefinitions { private final SyncCommitteeContributionSchema syncCommitteeContributionSchema; private final ContributionAndProofSchema contributionAndProofSchema; private final SignedContributionAndProofSchema signedContributionAndProofSchema; - private final MetadataMessageSchemaAltair metadataMessageSchema; + private final MetadataMessageSchema metadataMessageSchema; private final LightClientHeaderSchema lightClientHeaderSchema; private final LightClientBootstrapSchema lightClientBootstrapSchema; private final LightClientUpdateSchema lightClientUpdateSchema; @@ -93,7 +93,7 @@ public SchemaDefinitionsAltair(final SchemaRegistry schemaRegistry) { ContributionAndProofSchema.create(syncCommitteeContributionSchema); this.signedContributionAndProofSchema = SignedContributionAndProofSchema.create(contributionAndProofSchema); - this.metadataMessageSchema = new MetadataMessageSchemaAltair(specConfig.getNetworkingConfig()); + this.metadataMessageSchema = schemaRegistry.get(METADATA_MESSAGE_SCHEMA); this.lightClientHeaderSchema = new LightClientHeaderSchema(); this.lightClientBootstrapSchema = new LightClientBootstrapSchema(specConfig); this.lightClientUpdateSchema = new LightClientUpdateSchema(specConfig); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java index 54be30726db..7b9c96e2172 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsFulu.java @@ -20,7 +20,6 @@ import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.DATA_COLUMN_SIDECARS_BY_ROOT_REQUEST_MESSAGE_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.DATA_COLUMN_SIDECAR_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.MATRIX_ENTRY_SCHEMA; -import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.METADATA_MESSAGE_SCHEMA; import java.util.Optional; import tech.pegasys.teku.spec.datastructures.blobs.versions.fulu.CellSchema; @@ -29,7 +28,6 @@ import tech.pegasys.teku.spec.datastructures.blobs.versions.fulu.MatrixEntrySchema; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.DataColumnSidecarsByRangeRequestMessage; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.DataColumnSidecarsByRootRequestMessageSchema; -import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.MetadataMessageSchema; import tech.pegasys.teku.spec.schemas.registry.SchemaRegistry; public class SchemaDefinitionsFulu extends SchemaDefinitionsElectra { @@ -43,7 +41,6 @@ public class SchemaDefinitionsFulu extends SchemaDefinitionsElectra { private final DataColumnSidecarsByRangeRequestMessage .DataColumnSidecarsByRangeRequestMessageSchema dataColumnSidecarsByRangeRequestMessageSchema; - private final MetadataMessageSchema metadataMessageSchema; public SchemaDefinitionsFulu(final SchemaRegistry schemaRegistry) { super(schemaRegistry); @@ -55,7 +52,6 @@ public SchemaDefinitionsFulu(final SchemaRegistry schemaRegistry) { schemaRegistry.get(DATA_COLUMN_SIDECARS_BY_ROOT_REQUEST_MESSAGE_SCHEMA); this.dataColumnSidecarsByRangeRequestMessageSchema = schemaRegistry.get(DATA_COLUMN_SIDECARS_BY_RANGE_REQUEST_MESSAGE_SCHEMA); - this.metadataMessageSchema = schemaRegistry.get(METADATA_MESSAGE_SCHEMA); } public static SchemaDefinitionsFulu required(final SchemaDefinitions schemaDefinitions) { @@ -93,11 +89,6 @@ public MatrixEntrySchema getMatrixEntrySchema() { return dataColumnSidecarsByRangeRequestMessageSchema; } - @Override - public MetadataMessageSchema getMetadataMessageSchema() { - return metadataMessageSchema; - } - @Override public Optional toVersionFulu() { return Optional.of(this); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java index 3b4d97934e0..f31376da5ef 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java @@ -17,6 +17,7 @@ import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.BEACON_BLOCK_BODY_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.BEACON_BLOCK_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.BEACON_STATE_SCHEMA; +import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.METADATA_MESSAGE_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.SIGNED_AGGREGATE_AND_PROOF_SCHEMA; import static tech.pegasys.teku.spec.schemas.registry.SchemaTypes.SIGNED_BEACON_BLOCK_SCHEMA; @@ -31,7 +32,7 @@ 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.versions.phase0.BeaconBlockBodyBuilderPhase0; -import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.versions.phase0.MetadataMessageSchemaPhase0; +import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.MetadataMessageSchema; import tech.pegasys.teku.spec.datastructures.operations.AggregateAndProof.AggregateAndProofSchema; import tech.pegasys.teku.spec.datastructures.operations.Attestation; import tech.pegasys.teku.spec.datastructures.operations.AttestationSchema; @@ -53,7 +54,7 @@ public class SchemaDefinitionsPhase0 extends AbstractSchemaDefinitions { private final BeaconStateSchema beaconStateSchema; private final BeaconBlockBodySchema beaconBlockBodySchema; - private final MetadataMessageSchemaPhase0 metadataMessageSchema; + private final MetadataMessageSchema metadataMessageSchema; private final BeaconBlockSchema beaconBlockSchema; private final SignedBeaconBlockSchema signedBeaconBlockSchema; @@ -68,7 +69,7 @@ public SchemaDefinitionsPhase0(final SchemaRegistry schemaRegistry) { this.signedAggregateAndProofSchema = schemaRegistry.get(SIGNED_AGGREGATE_AND_PROOF_SCHEMA); this.beaconStateSchema = schemaRegistry.get(BEACON_STATE_SCHEMA); this.beaconBlockBodySchema = schemaRegistry.get(BEACON_BLOCK_BODY_SCHEMA); - this.metadataMessageSchema = new MetadataMessageSchemaPhase0(specConfig.getNetworkingConfig()); + this.metadataMessageSchema = schemaRegistry.get(METADATA_MESSAGE_SCHEMA); this.beaconBlockSchema = schemaRegistry.get(BEACON_BLOCK_SCHEMA); this.signedBeaconBlockSchema = schemaRegistry.get(SIGNED_BEACON_BLOCK_SCHEMA); } @@ -164,7 +165,7 @@ public BeaconBlockBodyBuilder createBeaconBlockBodyBuilder() { } @Override - public MetadataMessageSchemaPhase0 getMetadataMessageSchema() { + public MetadataMessageSchema getMetadataMessageSchema() { return metadataMessageSchema; } From e22f2e27c0539d478fe914dc1563e8cacb5f2e38 Mon Sep 17 00:00:00 2001 From: Lucas Saldanha Date: Mon, 5 May 2025 11:35:19 +1200 Subject: [PATCH 4/4] removed unused variable --- .../tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java index f31376da5ef..cb532973079 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java @@ -60,7 +60,6 @@ public class SchemaDefinitionsPhase0 extends AbstractSchemaDefinitions { public SchemaDefinitionsPhase0(final SchemaRegistry schemaRegistry) { super(schemaRegistry); - final SpecConfig specConfig = schemaRegistry.getSpecConfig(); this.indexedAttestationSchema = schemaRegistry.get(SchemaTypes.INDEXED_ATTESTATION_SCHEMA); this.attesterSlashingSchema = schemaRegistry.get(SchemaTypes.ATTESTER_SLASHING_SCHEMA);