use of tech.pegasys.teku.infrastructure.http.RestApiConstants.RES_SERVICE_UNAVAILABLE in project teku by ConsenSys.
the class PostBlock method handle.
@OpenApi(path = ROUTE, method = HttpMethod.POST, summary = "Publish a signed block", tags = { TAG_BEACON, TAG_VALIDATOR_REQUIRED }, requestBody = @OpenApiRequestBody(content = { @OpenApiContent(from = SignedBlock.class) }), description = "Submit a signed beacon block to the beacon node to be imported." + " The beacon node performs the required validation.", responses = { @OpenApiResponse(status = RES_OK, description = "Block has been successfully broadcast, validated and imported."), @OpenApiResponse(status = RES_ACCEPTED, description = "Block has been successfully broadcast, but failed validation and has not been imported."), @OpenApiResponse(status = RES_BAD_REQUEST, description = "Unable to parse request body."), @OpenApiResponse(status = RES_INTERNAL_ERROR, description = "Beacon node experienced an internal error."), @OpenApiResponse(status = RES_SERVICE_UNAVAILABLE, description = "Beacon node is currently syncing.") })
@Override
public void handle(final Context ctx) throws Exception {
try {
if (syncDataProvider.isSyncing()) {
ctx.status(SC_SERVICE_UNAVAILABLE);
ctx.json(BadRequest.serviceUnavailable(jsonProvider));
return;
}
final SignedBeaconBlock signedBeaconBlock = validatorDataProvider.parseBlock(jsonProvider, ctx.body());
ctx.future(validatorDataProvider.submitSignedBlock(signedBeaconBlock).thenApplyChecked(validatorBlockResult -> handleResponseContext(ctx, validatorBlockResult)));
} catch (final JsonProcessingException ex) {
ctx.status(SC_BAD_REQUEST);
ctx.json(BadRequest.badRequest(jsonProvider, ex.getMessage()));
} catch (final Exception ex) {
LOG.error("Failed to post block due to internal error", ex);
ctx.status(SC_INTERNAL_SERVER_ERROR);
ctx.json(BadRequest.internalError(jsonProvider, ex.getMessage()));
}
}
use of tech.pegasys.teku.infrastructure.http.RestApiConstants.RES_SERVICE_UNAVAILABLE in project teku by ConsenSys.
the class GetNewBlock method handle.
@OpenApi(path = OAPI_ROUTE, deprecated = true, method = HttpMethod.GET, summary = "Produce unsigned block", tags = { TAG_VALIDATOR, TAG_VALIDATOR_REQUIRED }, description = "Requests a beacon node to produce a valid block, which can then be signed by a validator.\n\n" + "__NOTE__: deprecated, switch to using `/eth/v2/validator/blocks/{slot}` for multiple milestone support.", pathParams = { @OpenApiParam(name = SLOT, description = "The slot for which the block should be proposed.") }, queryParams = { @OpenApiParam(name = RANDAO_REVEAL, description = "`BLSSignature Hex` BLS12-381 signature for the current epoch.", required = true), @OpenApiParam(name = GRAFFITI, description = "`Bytes32 Hex` Graffiti.") }, responses = { @OpenApiResponse(status = RES_OK, content = @OpenApiContent(from = GetNewBlockResponse.class)), @OpenApiResponse(status = RES_BAD_REQUEST, description = "Invalid parameter supplied"), @OpenApiResponse(status = RES_INTERNAL_ERROR), @OpenApiResponse(status = RES_SERVICE_UNAVAILABLE, description = SERVICE_UNAVAILABLE) })
@Override
public void handle(final Context ctx) throws Exception {
try {
final Map<String, List<String>> queryParamMap = ctx.queryParamMap();
final Map<String, String> pathParamMap = ctx.pathParamMap();
final UInt64 slot = UInt64.valueOf(pathParamMap.get(SLOT));
final BLSSignature randao = getParameterValueAsBLSSignature(queryParamMap, RANDAO_REVEAL);
final Optional<Bytes32> graffiti = getOptionalParameterValueAsBytes32(queryParamMap, GRAFFITI);
ctx.future(provider.getUnsignedBeaconBlockAtSlot(slot, randao, graffiti).thenApplyChecked(maybeBlock -> {
if (maybeBlock.isEmpty()) {
throw new ChainDataUnavailableException();
}
return produceResultString(maybeBlock.get());
}).exceptionallyCompose(error -> handleError(ctx, error)));
} catch (final IllegalArgumentException e) {
ctx.status(SC_BAD_REQUEST);
ctx.json(jsonProvider.objectToJSON(new BadRequest(e.getMessage())));
}
}
Aggregations