forked from Consensys/teku
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implementing /eth/v1/validator/beacon_committee_selections (Consensys…
- Loading branch information
1 parent
ee1e296
commit 917beea
Showing
20 changed files
with
575 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
72 changes: 72 additions & 0 deletions
72
...egasys/teku/beaconrestapi/beacon/paths/_eth_v1_validator_beacon_committee_selections.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
{ | ||
"post" : { | ||
"tags" : [ "Validator" ], | ||
"operationId" : "submitBeaconCommitteeSelections", | ||
"summary" : "Determine if a distributed validator has been selected to aggregate attestations", | ||
"description" : "This endpoint should be used by a validator client running as part of a distributed validator cluster, and is implemented by a distributed validator middleware client. This endpoint is used to exchange partial selection proofs for combined/aggregated selection proofs to allow a validator client to correctly determine if any of its validators has been selected to perform an attestation aggregation duty in a slot. Validator clients running in a distributed validator cluster must query this endpoint at the start of an epoch for the current and lookahead (next) epochs for all validators that have attester duties in the current and lookahead epochs. Consensus clients need not support this endpoint and may return a 501.", | ||
"requestBody" : { | ||
"content" : { | ||
"application/json" : { | ||
"schema" : { | ||
"type" : "array", | ||
"items" : { | ||
"$ref" : "#/components/schemas/BeaconCommitteeSelectionProof" | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
"responses" : { | ||
"200" : { | ||
"description" : "Returns the threshold aggregated beacon committee selection proofs.", | ||
"content" : { | ||
"application/json" : { | ||
"schema" : { | ||
"$ref" : "#/components/schemas/PostBeaconCommitteeSelectionsResponse" | ||
} | ||
} | ||
} | ||
}, | ||
"400" : { | ||
"description" : "Invalid request syntax.", | ||
"content" : { | ||
"application/json" : { | ||
"schema" : { | ||
"$ref" : "#/components/schemas/HttpErrorResponse" | ||
} | ||
} | ||
} | ||
}, | ||
"500" : { | ||
"description" : "Internal server error", | ||
"content" : { | ||
"application/json" : { | ||
"schema" : { | ||
"$ref" : "#/components/schemas/HttpErrorResponse" | ||
} | ||
} | ||
} | ||
}, | ||
"501" : { | ||
"description" : "Not implemented", | ||
"content" : { | ||
"application/json" : { | ||
"schema" : { | ||
"$ref" : "#/components/schemas/HttpErrorResponse" | ||
} | ||
} | ||
} | ||
}, | ||
"503" : { | ||
"description" : "Beacon node is currently syncing and not serving requests.", | ||
"content" : { | ||
"application/json" : { | ||
"schema" : { | ||
"$ref" : "#/components/schemas/HttpErrorResponse" | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
...esources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconCommitteeSelectionProof.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
{ | ||
"title" : "BeaconCommitteeSelectionProof", | ||
"type" : "object", | ||
"required" : [ "validator_index", "slot", "selection_proof" ], | ||
"properties" : { | ||
"validator_index" : { | ||
"type" : "string", | ||
"description" : "integer string", | ||
"example" : "1", | ||
"format" : "integer" | ||
}, | ||
"slot" : { | ||
"type" : "string", | ||
"description" : "unsigned 64 bit integer", | ||
"example" : "1", | ||
"format" : "uint64" | ||
}, | ||
"selection_proof" : { | ||
"type" : "string" | ||
} | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
.../tech/pegasys/teku/beaconrestapi/beacon/schema/PostBeaconCommitteeSelectionsResponse.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
{ | ||
"title" : "PostBeaconCommitteeSelectionsResponse", | ||
"type" : "object", | ||
"required" : [ "data" ], | ||
"properties" : { | ||
"data" : { | ||
"type" : "array", | ||
"items" : { | ||
"$ref" : "#/components/schemas/BeaconCommitteeSelectionProof" | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
75 changes: 75 additions & 0 deletions
75
.../tech/pegasys/teku/beaconrestapi/handlers/v1/validator/PostBeaconCommitteeSelections.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* | ||
* Copyright Consensys Software Inc., 2024 | ||
* | ||
* 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.beaconrestapi.handlers.v1.validator; | ||
|
||
import static tech.pegasys.teku.ethereum.json.types.validator.BeaconCommitteeSelectionProof.BEACON_COMMITTEE_SELECTION_PROOF; | ||
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_NOT_IMPLEMENTED; | ||
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_OK; | ||
import static tech.pegasys.teku.infrastructure.http.RestApiConstants.TAG_VALIDATOR; | ||
import static tech.pegasys.teku.infrastructure.json.types.DeserializableTypeDefinition.listOf; | ||
|
||
import com.fasterxml.jackson.core.JsonProcessingException; | ||
import java.util.List; | ||
import java.util.Optional; | ||
import java.util.function.Function; | ||
import tech.pegasys.teku.ethereum.json.types.validator.BeaconCommitteeSelectionProof; | ||
import tech.pegasys.teku.infrastructure.json.types.SerializableTypeDefinition; | ||
import tech.pegasys.teku.infrastructure.restapi.endpoints.EndpointMetadata; | ||
import tech.pegasys.teku.infrastructure.restapi.endpoints.RestApiEndpoint; | ||
import tech.pegasys.teku.infrastructure.restapi.endpoints.RestApiRequest; | ||
|
||
public class PostBeaconCommitteeSelections extends RestApiEndpoint { | ||
|
||
public static final String ROUTE = "/eth/v1/validator/beacon_committee_selections"; | ||
|
||
private static final SerializableTypeDefinition<List<BeaconCommitteeSelectionProof>> | ||
RESPONSE_TYPE = | ||
SerializableTypeDefinition.<List<BeaconCommitteeSelectionProof>>object() | ||
.name("PostBeaconCommitteeSelectionsResponse") | ||
.withField("data", listOf(BEACON_COMMITTEE_SELECTION_PROOF), Function.identity()) | ||
.build(); | ||
|
||
public PostBeaconCommitteeSelections() { | ||
super( | ||
EndpointMetadata.post(ROUTE) | ||
.operationId("submitBeaconCommitteeSelections") | ||
.summary( | ||
"Determine if a distributed validator has been selected to aggregate attestations") | ||
.description( | ||
"This endpoint should be used by a validator client running as part of a distributed validator cluster, " | ||
+ "and is implemented by a distributed validator middleware client. This endpoint is used to " | ||
+ "exchange partial selection proofs for combined/aggregated selection proofs to allow a validator " | ||
+ "client to correctly determine if any of its validators has been selected to perform an " | ||
+ "attestation aggregation duty in a slot. Validator clients running in a distributed validator " | ||
+ "cluster must query this endpoint at the start of an epoch for the current and lookahead (next) " | ||
+ "epochs for all validators that have attester duties in the current and lookahead epochs. Consensus" | ||
+ " clients need not support this endpoint and may return a 501.") | ||
.tags(TAG_VALIDATOR) | ||
.requestBodyType(listOf(BEACON_COMMITTEE_SELECTION_PROOF)) | ||
.response( | ||
SC_OK, | ||
"Returns the threshold aggregated beacon committee selection proofs.", | ||
RESPONSE_TYPE) | ||
.withBadRequestResponse(Optional.of("Invalid request syntax.")) | ||
.withInternalErrorResponse() | ||
.withNotImplementedResponse() | ||
.withServiceUnavailableResponse() | ||
.build()); | ||
} | ||
|
||
@Override | ||
public void handleRequest(final RestApiRequest request) throws JsonProcessingException { | ||
request.respondError(SC_NOT_IMPLEMENTED, "Method not implemented by the Beacon Node"); | ||
} | ||
} |
118 changes: 118 additions & 0 deletions
118
...n/java/tech/pegasys/teku/ethereum/json/types/validator/BeaconCommitteeSelectionProof.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
/* | ||
* Copyright Consensys Software Inc., 2024 | ||
* | ||
* 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.ethereum.json.types.validator; | ||
|
||
import java.util.Objects; | ||
import tech.pegasys.teku.infrastructure.json.types.CoreTypes; | ||
import tech.pegasys.teku.infrastructure.json.types.DeserializableTypeDefinition; | ||
import tech.pegasys.teku.infrastructure.unsigned.UInt64; | ||
|
||
public class BeaconCommitteeSelectionProof { | ||
|
||
public static final DeserializableTypeDefinition<BeaconCommitteeSelectionProof> | ||
BEACON_COMMITTEE_SELECTION_PROOF = | ||
DeserializableTypeDefinition.object( | ||
BeaconCommitteeSelectionProof.class, BeaconCommitteeSelectionProof.Builder.class) | ||
.name("BeaconCommitteeSelectionProof") | ||
.initializer(BeaconCommitteeSelectionProof::builder) | ||
.finisher(BeaconCommitteeSelectionProof.Builder::build) | ||
.withField( | ||
"validator_index", | ||
CoreTypes.INTEGER_TYPE, | ||
BeaconCommitteeSelectionProof::getValidatorIndex, | ||
BeaconCommitteeSelectionProof.Builder::validatorIndex) | ||
.withField( | ||
"slot", | ||
CoreTypes.UINT64_TYPE, | ||
BeaconCommitteeSelectionProof::getSlot, | ||
BeaconCommitteeSelectionProof.Builder::slot) | ||
.withField( | ||
"selection_proof", | ||
CoreTypes.STRING_TYPE, | ||
BeaconCommitteeSelectionProof::getSelectionProof, | ||
BeaconCommitteeSelectionProof.Builder::selectionProof) | ||
.build(); | ||
|
||
private final int validatorIndex; | ||
private final UInt64 slot; | ||
private final String selectionProof; | ||
|
||
private BeaconCommitteeSelectionProof( | ||
final int validatorIndex, final UInt64 slot, final String selectionProof) { | ||
this.validatorIndex = validatorIndex; | ||
this.slot = slot; | ||
this.selectionProof = selectionProof; | ||
} | ||
|
||
public int getValidatorIndex() { | ||
return validatorIndex; | ||
} | ||
|
||
public UInt64 getSlot() { | ||
return slot; | ||
} | ||
|
||
public String getSelectionProof() { | ||
return selectionProof; | ||
} | ||
|
||
public static BeaconCommitteeSelectionProof.Builder builder() { | ||
return new BeaconCommitteeSelectionProof.Builder(); | ||
} | ||
|
||
@Override | ||
public boolean equals(final Object o) { | ||
if (this == o) { | ||
return true; | ||
} | ||
if (o == null || getClass() != o.getClass()) { | ||
return false; | ||
} | ||
final BeaconCommitteeSelectionProof that = (BeaconCommitteeSelectionProof) o; | ||
return validatorIndex == that.validatorIndex | ||
&& Objects.equals(slot, that.slot) | ||
&& Objects.equals(selectionProof, that.selectionProof); | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
return Objects.hash(validatorIndex, slot, selectionProof); | ||
} | ||
|
||
public static class Builder { | ||
|
||
private int validatorIndex; | ||
private UInt64 slot; | ||
private String selectionProof; | ||
|
||
public Builder validatorIndex(final int validatorIndex) { | ||
this.validatorIndex = validatorIndex; | ||
return this; | ||
} | ||
|
||
public Builder slot(final UInt64 slot) { | ||
this.slot = slot; | ||
return this; | ||
} | ||
|
||
public Builder selectionProof(final String selectionProof) { | ||
this.selectionProof = selectionProof; | ||
return this; | ||
} | ||
|
||
public BeaconCommitteeSelectionProof build() { | ||
return new BeaconCommitteeSelectionProof(validatorIndex, slot, selectionProof); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.