Skip to content

Commit 7870a5e

Browse files
authored
Use JsonTypeDef for PostAttesterDuties request (Consensys#8023)
1 parent 70b7980 commit 7870a5e

File tree

9 files changed

+103
-258
lines changed

9 files changed

+103
-258
lines changed

Diff for: data/serializer/src/main/java/tech/pegasys/teku/api/response/v1/validator/AttesterDuty.java

-124
This file was deleted.

Diff for: data/serializer/src/main/java/tech/pegasys/teku/api/response/v1/validator/PostAttesterDutiesResponse.java

-78
This file was deleted.

Diff for: validator/remote/src/integration-test/java/tech/pegasys/teku/validator/remote/typedef/OkHttpValidatorTypeDefClientTest.java

+42
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313

1414
package tech.pegasys.teku.validator.remote.typedef;
1515

16+
import static java.nio.charset.StandardCharsets.UTF_8;
1617
import static java.util.Collections.emptyMap;
1718
import static org.assertj.core.api.Assertions.assertThat;
1819
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1920
import static org.assertj.core.api.Assumptions.assumeThat;
2021
import static tech.pegasys.teku.ethereum.json.types.beacon.StateValidatorDataBuilder.STATE_VALIDATORS_RESPONSE_TYPE;
22+
import static tech.pegasys.teku.ethereum.json.types.validator.AttesterDutiesBuilder.ATTESTER_DUTIES_RESPONSE_TYPE;
2123
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_BAD_REQUEST;
2224
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_METHOD_NOT_ALLOWED;
2325
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_NOT_FOUND;
@@ -28,6 +30,7 @@
2830

2931
import com.fasterxml.jackson.core.JsonProcessingException;
3032
import com.fasterxml.jackson.databind.ObjectMapper;
33+
import it.unimi.dsi.fastutil.ints.IntList;
3134
import java.util.List;
3235
import java.util.Optional;
3336
import okhttp3.mockwebserver.MockResponse;
@@ -39,6 +42,8 @@
3942
import tech.pegasys.teku.api.exceptions.RemoteServiceNotAvailableException;
4043
import tech.pegasys.teku.api.response.v1.beacon.ValidatorStatus;
4144
import tech.pegasys.teku.ethereum.json.types.beacon.StateValidatorData;
45+
import tech.pegasys.teku.ethereum.json.types.validator.AttesterDuties;
46+
import tech.pegasys.teku.ethereum.json.types.validator.AttesterDuty;
4247
import tech.pegasys.teku.infrastructure.ssz.SszDataAssert;
4348
import tech.pegasys.teku.infrastructure.ssz.SszList;
4449
import tech.pegasys.teku.infrastructure.unsigned.UInt64;
@@ -410,6 +415,43 @@ private StateValidatorData generateStateValidatorData() {
410415
validator);
411416
}
412417

418+
@TestTemplate
419+
public void postAttesterDuties_WhenSuccess_ReturnsResponse()
420+
throws JsonProcessingException, InterruptedException {
421+
final List<AttesterDuty> duties = List.of(randomAttesterDuty(), randomAttesterDuty());
422+
final AttesterDuties response =
423+
new AttesterDuties(true, dataStructureUtil.randomBytes32(), duties);
424+
425+
final String body = serialize(response, ATTESTER_DUTIES_RESPONSE_TYPE);
426+
mockWebServer.enqueue(new MockResponse().setResponseCode(SC_OK).setBody(body));
427+
428+
final UInt64 epoch = UInt64.ONE;
429+
final IntList validatorIndices = IntList.of(1, 2);
430+
Optional<AttesterDuties> result =
431+
okHttpValidatorTypeDefClient.postAttesterDuties(epoch, validatorIndices);
432+
433+
final RecordedRequest recordedRequest = mockWebServer.takeRequest();
434+
assertThat(recordedRequest.getPath()).isEqualTo("/eth/v1/validator/duties/attester/" + epoch);
435+
assertThat(recordedRequest.getMethod()).isEqualTo("POST");
436+
assertThat(recordedRequest.getHeader("Content-Type")).isEqualTo(JSON_CONTENT_TYPE);
437+
assertThat(recordedRequest.getBody().readByteArray())
438+
.isEqualTo("[\"1\",\"2\"]".getBytes(UTF_8));
439+
440+
assertThat(result).isPresent();
441+
assertThat(result.get()).isEqualTo(response);
442+
}
443+
444+
private AttesterDuty randomAttesterDuty() {
445+
return new AttesterDuty(
446+
dataStructureUtil.randomPublicKey(),
447+
dataStructureUtil.randomValidatorIndex().intValue(),
448+
dataStructureUtil.randomPositiveInt(),
449+
dataStructureUtil.randomPositiveInt(),
450+
dataStructureUtil.randomPositiveInt(),
451+
dataStructureUtil.randomPositiveInt(),
452+
dataStructureUtil.randomSlot());
453+
}
454+
413455
private void verifyRegisterValidatorsPostRequest(
414456
final RecordedRequest recordedRequest, final String expectedContentType) {
415457
assertThat(recordedRequest.getPath()).isEqualTo("/eth/v1/validator/register_validator");

Diff for: validator/remote/src/main/java/tech/pegasys/teku/validator/remote/RemoteValidatorApiHandler.java

+1-23
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import tech.pegasys.teku.bls.BLSSignature;
4747
import tech.pegasys.teku.ethereum.json.types.beacon.StateValidatorData;
4848
import tech.pegasys.teku.ethereum.json.types.validator.AttesterDuties;
49-
import tech.pegasys.teku.ethereum.json.types.validator.AttesterDuty;
5049
import tech.pegasys.teku.ethereum.json.types.validator.BeaconCommitteeSelectionProof;
5150
import tech.pegasys.teku.ethereum.json.types.validator.ProposerDuties;
5251
import tech.pegasys.teku.ethereum.json.types.validator.SyncCommitteeDuties;
@@ -208,16 +207,7 @@ private <T> Map<BLSPublicKey, T> convertToValidatorMapTypeDef(
208207
@Override
209208
public SafeFuture<Optional<AttesterDuties>> getAttestationDuties(
210209
final UInt64 epoch, final IntCollection validatorIndices) {
211-
return sendRequest(
212-
() ->
213-
apiClient
214-
.getAttestationDuties(epoch, validatorIndices)
215-
.map(
216-
response ->
217-
new AttesterDuties(
218-
response.executionOptimistic,
219-
response.dependentRoot,
220-
response.data.stream().map(this::mapToApiAttesterDuties).toList())));
210+
return sendRequest(() -> typeDefClient.postAttesterDuties(epoch, validatorIndices));
221211
}
222212

223213
@Override
@@ -249,18 +239,6 @@ public SafeFuture<Optional<ProposerDuties>> getProposerDuties(final UInt64 epoch
249239
return sendRequest(() -> typeDefClient.getProposerDuties(epoch));
250240
}
251241

252-
private AttesterDuty mapToApiAttesterDuties(
253-
final tech.pegasys.teku.api.response.v1.validator.AttesterDuty attesterDuty) {
254-
return new AttesterDuty(
255-
attesterDuty.pubkey.asBLSPublicKey(),
256-
attesterDuty.validatorIndex.intValue(),
257-
attesterDuty.committeeLength.intValue(),
258-
attesterDuty.committeeIndex.intValue(),
259-
attesterDuty.committeesAtSlot.intValue(),
260-
attesterDuty.validatorCommitteeIndex.intValue(),
261-
attesterDuty.slot);
262-
}
263-
264242
@Override
265243
public SafeFuture<Optional<AttestationData>> createAttestationData(
266244
final UInt64 slot, final int committeeIndex) {

Diff for: validator/remote/src/main/java/tech/pegasys/teku/validator/remote/apiclient/OkHttpValidatorRestApiClient.java

-12
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import static java.util.Collections.emptyMap;
1717
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_NOT_FOUND;
1818
import static tech.pegasys.teku.validator.remote.apiclient.ValidatorApiMethod.GET_AGGREGATE;
19-
import static tech.pegasys.teku.validator.remote.apiclient.ValidatorApiMethod.GET_ATTESTATION_DUTIES;
2019
import static tech.pegasys.teku.validator.remote.apiclient.ValidatorApiMethod.GET_BLOCK_HEADER;
2120
import static tech.pegasys.teku.validator.remote.apiclient.ValidatorApiMethod.GET_GENESIS;
2221
import static tech.pegasys.teku.validator.remote.apiclient.ValidatorApiMethod.GET_PROPOSER_DUTIES;
@@ -63,7 +62,6 @@
6362
import tech.pegasys.teku.api.response.v1.validator.GetAggregatedAttestationResponse;
6463
import tech.pegasys.teku.api.response.v1.validator.GetProposerDutiesResponse;
6564
import tech.pegasys.teku.api.response.v1.validator.GetSyncCommitteeContributionResponse;
66-
import tech.pegasys.teku.api.response.v1.validator.PostAttesterDutiesResponse;
6765
import tech.pegasys.teku.api.response.v1.validator.PostSyncDutiesResponse;
6866
import tech.pegasys.teku.api.response.v1.validator.PostValidatorLivenessResponse;
6967
import tech.pegasys.teku.api.schema.Attestation;
@@ -128,16 +126,6 @@ public Optional<List<ValidatorResponse>> getValidators(final List<String> valida
128126
.map(response -> response.data);
129127
}
130128

131-
@Override
132-
public Optional<PostAttesterDutiesResponse> getAttestationDuties(
133-
final UInt64 epoch, final Collection<Integer> validatorIndices) {
134-
return post(
135-
GET_ATTESTATION_DUTIES,
136-
Map.of("epoch", epoch.toString()),
137-
validatorIndices.stream().map(UInt64::valueOf).toList(),
138-
createHandler(PostAttesterDutiesResponse.class));
139-
}
140-
141129
@Override
142130
public Optional<GetProposerDutiesResponse> getProposerDuties(final UInt64 epoch) {
143131
return get(

Diff for: validator/remote/src/main/java/tech/pegasys/teku/validator/remote/apiclient/ValidatorRestApiClient.java

-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import tech.pegasys.teku.api.response.v1.beacon.PostDataFailureResponse;
2323
import tech.pegasys.teku.api.response.v1.beacon.ValidatorResponse;
2424
import tech.pegasys.teku.api.response.v1.validator.GetProposerDutiesResponse;
25-
import tech.pegasys.teku.api.response.v1.validator.PostAttesterDutiesResponse;
2625
import tech.pegasys.teku.api.response.v1.validator.PostSyncDutiesResponse;
2726
import tech.pegasys.teku.api.response.v1.validator.PostValidatorLivenessResponse;
2827
import tech.pegasys.teku.api.schema.Attestation;
@@ -43,9 +42,6 @@ public interface ValidatorRestApiClient {
4342

4443
Optional<List<ValidatorResponse>> getValidators(List<String> validatorIds);
4544

46-
Optional<PostAttesterDutiesResponse> getAttestationDuties(
47-
final UInt64 epoch, final Collection<Integer> validatorIndices);
48-
4945
Optional<GetProposerDutiesResponse> getProposerDuties(final UInt64 epoch);
5046

5147
Optional<PostDataFailureResponse> sendSignedAttestations(List<Attestation> attestation);

0 commit comments

Comments
 (0)