Skip to content

Commit 0225f09

Browse files
committed
Update GetGraffiti
1 parent e328b95 commit 0225f09

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

validator/client/src/main/java/tech/pegasys/teku/validator/client/restapi/apis/GetGraffiti.java

+25-15
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import static tech.pegasys.teku.ethereum.json.types.SharedApiTypes.PUBKEY_API_TYPE;
1717
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_NOT_FOUND;
1818
import static tech.pegasys.teku.infrastructure.http.HttpStatusCodes.SC_OK;
19-
import static tech.pegasys.teku.infrastructure.json.types.CoreTypes.STRING_TYPE;
2019
import static tech.pegasys.teku.validator.client.restapi.ValidatorRestApi.TAG_GRAFFITI;
2120
import static tech.pegasys.teku.validator.client.restapi.ValidatorTypes.PARAM_PUBKEY_TYPE;
2221

@@ -25,29 +24,38 @@
2524
import java.util.Objects;
2625
import java.util.Optional;
2726
import java.util.function.Function;
27+
import org.apache.tuweni.bytes.Bytes;
2828
import org.apache.tuweni.bytes.Bytes32;
2929
import tech.pegasys.teku.bls.BLSPublicKey;
30+
import tech.pegasys.teku.infrastructure.json.types.DeserializableTypeDefinition;
3031
import tech.pegasys.teku.infrastructure.json.types.SerializableTypeDefinition;
3132
import tech.pegasys.teku.infrastructure.restapi.endpoints.EndpointMetadata;
3233
import tech.pegasys.teku.infrastructure.restapi.endpoints.RestApiEndpoint;
3334
import tech.pegasys.teku.infrastructure.restapi.endpoints.RestApiRequest;
35+
import tech.pegasys.teku.validator.api.Bytes32Parser;
3436
import tech.pegasys.teku.validator.client.KeyManager;
3537
import tech.pegasys.teku.validator.client.Validator;
3638

3739
public class GetGraffiti extends RestApiEndpoint {
38-
public static final String ROUTE = "/eth/v1/validator/{pubkey}/graffiti";
40+
static final String ROUTE = "/eth/v1/validator/{pubkey}/graffiti";
3941
private final KeyManager keyManager;
4042

41-
private static final SerializableTypeDefinition<GraffitiResponse> GRAFFITI_TYPE =
43+
public static final DeserializableTypeDefinition<Bytes32> GRAFFITI_TYPE =
44+
DeserializableTypeDefinition.string(Bytes32.class)
45+
.formatter(GetGraffiti::processGraffitiString)
46+
.parser(Bytes32Parser::toBytes32)
47+
.build();
48+
49+
private static final SerializableTypeDefinition<GraffitiResponse> GRAFFITI_RESPONSE_TYPE =
4250
SerializableTypeDefinition.object(GraffitiResponse.class)
4351
.withOptionalField("pubkey", PUBKEY_API_TYPE, GraffitiResponse::getPublicKey)
44-
.withField("graffiti", STRING_TYPE, GraffitiResponse::getGraffiti)
52+
.withField("graffiti", GRAFFITI_TYPE, GraffitiResponse::getGraffiti)
4553
.build();
4654

4755
private static final SerializableTypeDefinition<GraffitiResponse> RESPONSE_TYPE =
4856
SerializableTypeDefinition.object(GraffitiResponse.class)
4957
.name("GraffitiResponse")
50-
.withField("data", GRAFFITI_TYPE, Function.identity())
58+
.withField("data", GRAFFITI_RESPONSE_TYPE, Function.identity())
5159
.build();
5260

5361
public GetGraffiti(final KeyManager keyManager) {
@@ -68,7 +76,7 @@ public GetGraffiti(final KeyManager keyManager) {
6876
}
6977

7078
@Override
71-
public void handleRequest(RestApiRequest request) throws JsonProcessingException {
79+
public void handleRequest(final RestApiRequest request) throws JsonProcessingException {
7280
final BLSPublicKey publicKey = request.getPathParameter(PARAM_PUBKEY_TYPE);
7381

7482
final Optional<Validator> maybeValidator = keyManager.getValidatorByPublicKey(publicKey);
@@ -77,20 +85,22 @@ public void handleRequest(RestApiRequest request) throws JsonProcessingException
7785
return;
7886
}
7987

80-
final String graffiti =
81-
maybeValidator.get().getGraffiti().map(this::processGraffitiBytes).orElse("");
82-
request.respondOk(new GraffitiResponse(publicKey, graffiti));
88+
request.respondOk(new GraffitiResponse(publicKey, maybeValidator.get().getGraffiti()));
8389
}
8490

85-
private String processGraffitiBytes(final Bytes32 graffiti) {
91+
private static String processGraffitiString(final Bytes32 graffiti) {
8692
return new String(graffiti.toArrayUnsafe(), StandardCharsets.UTF_8).strip().replace("\0", "");
8793
}
8894

8995
static class GraffitiResponse {
9096
private final Optional<BLSPublicKey> publicKey;
91-
private final String graffiti;
97+
private final Bytes32 graffiti;
98+
99+
GraffitiResponse(final BLSPublicKey publicKey, final Optional<Bytes32> graffiti) {
100+
this(publicKey, graffiti.orElse(Bytes32Parser.toBytes32(Bytes.EMPTY.toArray())));
101+
}
92102

93-
GraffitiResponse(final BLSPublicKey publicKey, final String graffiti) {
103+
GraffitiResponse(final BLSPublicKey publicKey, final Bytes32 graffiti) {
94104
this.publicKey = Optional.of(publicKey);
95105
this.graffiti = graffiti;
96106
}
@@ -99,19 +109,19 @@ Optional<BLSPublicKey> getPublicKey() {
99109
return publicKey;
100110
}
101111

102-
String getGraffiti() {
112+
Bytes32 getGraffiti() {
103113
return graffiti;
104114
}
105115

106116
@Override
107-
public boolean equals(Object o) {
117+
public boolean equals(final Object o) {
108118
if (this == o) {
109119
return true;
110120
}
111121
if (o == null || getClass() != o.getClass()) {
112122
return false;
113123
}
114-
GraffitiResponse that = (GraffitiResponse) o;
124+
final GraffitiResponse that = (GraffitiResponse) o;
115125
return Objects.equals(publicKey, that.publicKey) && Objects.equals(graffiti, that.graffiti);
116126
}
117127

validator/client/src/test/java/tech/pegasys/teku/validator/client/restapi/apis/GetGraffitiTest.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,20 @@ class GetGraffitiTest {
4848
private final GetGraffiti handler = new GetGraffiti(keyManager);
4949
private StubRestApiRequest request;
5050

51+
final String stringGraffiti = "Test graffiti";
52+
final Bytes32 bytesGraffiti = Bytes32Parser.toBytes32(stringGraffiti);
53+
5154
private final DataStructureUtil dataStructureUtil =
5255
new DataStructureUtil(TestSpecFactory.createDefault());
5356

5457
@Test
5558
void shouldGetGraffiti() throws JsonProcessingException {
56-
final String stringGraffiti = "Test graffiti";
57-
final Bytes32 graffiti = Bytes32Parser.toBytes32(stringGraffiti);
58-
checkGraffiti(() -> Optional.of(graffiti), stringGraffiti);
59+
checkGraffiti(Optional.of(bytesGraffiti));
5960
}
6061

6162
@Test
6263
void shouldGetEmptyGraffiti() throws JsonProcessingException {
63-
checkGraffiti(Optional::empty, "");
64+
checkGraffiti(Optional.empty());
6465
}
6566

6667
@Test
@@ -82,7 +83,7 @@ void shouldHandleValidatorNotFound() throws IOException {
8283
@Test
8384
void metadata_shouldHandle200() throws JsonProcessingException {
8485
final GetGraffiti.GraffitiResponse response =
85-
new GetGraffiti.GraffitiResponse(dataStructureUtil.randomPublicKey(), "Test graffiti");
86+
new GetGraffiti.GraffitiResponse(dataStructureUtil.randomPublicKey(), bytesGraffiti);
8687
final String responseData = getResponseStringFromMetadata(handler, SC_OK, response);
8788
assertThat(responseData)
8889
.isEqualTo(
@@ -111,22 +112,22 @@ void metadata_shouldHandle500() throws JsonProcessingException {
111112
verifyMetadataErrorResponse(handler, SC_INTERNAL_SERVER_ERROR);
112113
}
113114

114-
private void checkGraffiti(final GraffitiProvider graffitiProvider, final String expectedGraffiti)
115-
throws JsonProcessingException {
115+
private void checkGraffiti(final Optional<Bytes32> graffiti) throws JsonProcessingException {
116+
final GraffitiProvider provider = () -> graffiti;
116117
final BLSPublicKey publicKey = dataStructureUtil.randomPublicKey();
117118
request =
118119
StubRestApiRequest.builder()
119120
.metadata(handler.getMetadata())
120121
.pathParameter("pubkey", publicKey.toHexString())
121122
.build();
122123

123-
final Validator validator = new Validator(publicKey, NO_OP_SIGNER, graffitiProvider);
124+
final Validator validator = new Validator(publicKey, NO_OP_SIGNER, provider);
124125
when(keyManager.getValidatorByPublicKey(eq(publicKey))).thenReturn(Optional.of(validator));
125126

126127
handler.handleRequest(request);
127128

128129
final GetGraffiti.GraffitiResponse expectedResponse =
129-
new GetGraffiti.GraffitiResponse(publicKey, expectedGraffiti);
130+
new GetGraffiti.GraffitiResponse(publicKey, graffiti);
130131
assertThat(request.getResponseCode()).isEqualTo(SC_OK);
131132
assertThat(request.getResponseBody()).isEqualTo(expectedResponse);
132133
}

0 commit comments

Comments
 (0)