mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-02-22 19:28:20 +00:00
Make error messages to be constants.
This commit is contained in:
parent
934cc453d9
commit
b3ad573b1f
@ -140,16 +140,16 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
node.withStateForBlockSlot(bslot):
|
node.withStateForBlockSlot(bslot):
|
||||||
return RestApiResponse.jsonResponse((root: hashedState().root))
|
return RestApiResponse.jsonResponse((root: hashedState().root))
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFork
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFork
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/fork") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/fork") do (
|
||||||
@ -157,11 +157,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
node.withStateForBlockSlot(bslot):
|
node.withStateForBlockSlot(bslot):
|
||||||
@ -172,7 +172,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
epoch: state().fork.epoch
|
epoch: state().fork.epoch
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFinalityCheckpoints
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFinalityCheckpoints
|
||||||
router.api(MethodGet,
|
router.api(MethodGet,
|
||||||
@ -181,11 +181,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
node.withStateForBlockSlot(bslot):
|
node.withStateForBlockSlot(bslot):
|
||||||
@ -196,7 +196,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
finalized: state().finalized_checkpoint
|
finalized: state().finalized_checkpoint
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidators
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidators
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/validators") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/validators") do (
|
||||||
@ -205,33 +205,33 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
let validatorIds =
|
let validatorIds =
|
||||||
block:
|
block:
|
||||||
if id.isErr():
|
if id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Invalid validator identifier(s)")
|
InvalidValidatorIdValueError)
|
||||||
let ires = id.get()
|
let ires = id.get()
|
||||||
if len(ires) > MaximumValidatorIds:
|
if len(ires) > MaximumValidatorIds:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Maximum number of id values exceeded")
|
MaximumNumberOfValidatorIdsError)
|
||||||
ires
|
ires
|
||||||
|
|
||||||
let validatorsMask =
|
let validatorsMask =
|
||||||
block:
|
block:
|
||||||
if status.isErr():
|
if status.isErr():
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Invalid validator status(es)")
|
InvalidValidatorStatusValueError)
|
||||||
let res = validateFilter(status.get())
|
let res = validateFilter(status.get())
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Invalid validator status value",
|
InvalidValidatorStatusValueError,
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
|
|
||||||
@ -243,8 +243,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
case item.kind
|
case item.kind
|
||||||
of ValidatorQueryKind.Key:
|
of ValidatorQueryKind.Key:
|
||||||
if item.key in res1:
|
if item.key in res1:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400, UniqueValidatorKeyError)
|
||||||
"Only unique validator keys allowed")
|
|
||||||
res1.incl(item.key)
|
res1.incl(item.key)
|
||||||
of ValidatorQueryKind.Index:
|
of ValidatorQueryKind.Index:
|
||||||
let vitem =
|
let vitem =
|
||||||
@ -254,15 +253,15 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
case vres.error()
|
case vres.error()
|
||||||
of ValidatorIndexError.TooHighValue:
|
of ValidatorIndexError.TooHighValue:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Incorrect validator index value")
|
TooHighValidatorIndexValueError)
|
||||||
of ValidatorIndexError.UnsupportedValue:
|
of ValidatorIndexError.UnsupportedValue:
|
||||||
return RestApiResponse.jsonError(Http500,
|
return RestApiResponse.jsonError(Http500,
|
||||||
"Unsupported validator index value")
|
UnsupportedValidatorIndexValueError)
|
||||||
vres.get()
|
vres.get()
|
||||||
|
|
||||||
if vitem in res2:
|
if vitem in res2:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Only unique validator indexes allowed")
|
UniqueValidatorIndexError)
|
||||||
res2.incl(vitem)
|
res2.incl(vitem)
|
||||||
(res1, res2)
|
(res1, res2)
|
||||||
|
|
||||||
@ -304,7 +303,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
))
|
))
|
||||||
return RestApiResponse.jsonResponse(res)
|
return RestApiResponse.jsonResponse(res)
|
||||||
|
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidator
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidator
|
||||||
router.api(MethodGet,
|
router.api(MethodGet,
|
||||||
@ -313,16 +312,16 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
if validator_id.isErr():
|
if validator_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid validator_id",
|
return RestApiResponse.jsonError(Http400, InvalidValidatorIdValueError,
|
||||||
$validator_id.error())
|
$validator_id.error())
|
||||||
node.withStateForBlockSlot(bslot):
|
node.withStateForBlockSlot(bslot):
|
||||||
let current_epoch = get_current_epoch(node.chainDag.headState.data.data)
|
let current_epoch = get_current_epoch(node.chainDag.headState.data.data)
|
||||||
let vid = validator_id.get()
|
let vid = validator_id.get()
|
||||||
@ -342,8 +341,8 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Could not obtain validator's status")
|
ValidatorStatusNotFoundError)
|
||||||
return RestApiResponse.jsonError(Http404, "Could not find validator")
|
return RestApiResponse.jsonError(Http404, ValidatorNotFoundError)
|
||||||
of ValidatorQueryKind.Index:
|
of ValidatorQueryKind.Index:
|
||||||
let vindex =
|
let vindex =
|
||||||
block:
|
block:
|
||||||
@ -352,14 +351,14 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
case vres.error()
|
case vres.error()
|
||||||
of ValidatorIndexError.TooHighValue:
|
of ValidatorIndexError.TooHighValue:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Incorrect validator index value")
|
TooHighValidatorIndexValueError)
|
||||||
of ValidatorIndexError.UnsupportedValue:
|
of ValidatorIndexError.UnsupportedValue:
|
||||||
return RestApiResponse.jsonError(Http500,
|
return RestApiResponse.jsonError(Http500,
|
||||||
"Unsupported validator index value")
|
UnsupportedValidatorIndexValueError)
|
||||||
vres.get()
|
vres.get()
|
||||||
|
|
||||||
if uint64(vindex) >= uint64(len(state().validators)):
|
if uint64(vindex) >= uint64(len(state().validators)):
|
||||||
return RestApiResponse.jsonError(Http404, "Could not find validator")
|
return RestApiResponse.jsonError(Http404, ValidatorNotFoundError)
|
||||||
let validator = state().validators[vindex]
|
let validator = state().validators[vindex]
|
||||||
let sres = validator.getStatus(current_epoch)
|
let sres = validator.getStatus(current_epoch)
|
||||||
if sres.isOk():
|
if sres.isOk():
|
||||||
@ -373,8 +372,8 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Could not obtain validator's status")
|
ValidatorStatusNotFoundError)
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidatorBalances
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidatorBalances
|
||||||
router.api(MethodGet,
|
router.api(MethodGet,
|
||||||
@ -383,22 +382,22 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
let validatorIds =
|
let validatorIds =
|
||||||
block:
|
block:
|
||||||
if id.isErr():
|
if id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Invalid validator identifier(s)")
|
InvalidValidatorIdValueError)
|
||||||
let ires = id.get()
|
let ires = id.get()
|
||||||
if len(ires) > MaximumValidatorIds:
|
if len(ires) > MaximumValidatorIds:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Maximum number of id values exceeded")
|
MaximumNumberOfValidatorIdsError)
|
||||||
ires
|
ires
|
||||||
let (keySet, indexSet) =
|
let (keySet, indexSet) =
|
||||||
block:
|
block:
|
||||||
@ -409,7 +408,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
of ValidatorQueryKind.Key:
|
of ValidatorQueryKind.Key:
|
||||||
if item.key in res1:
|
if item.key in res1:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Only unique validator keys allowed")
|
UniqueValidatorKeyError)
|
||||||
res1.incl(item.key)
|
res1.incl(item.key)
|
||||||
of ValidatorQueryKind.Index:
|
of ValidatorQueryKind.Index:
|
||||||
let vitem =
|
let vitem =
|
||||||
@ -419,14 +418,14 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
case vres.error()
|
case vres.error()
|
||||||
of ValidatorIndexError.TooHighValue:
|
of ValidatorIndexError.TooHighValue:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Incorrect validator index value")
|
TooHighValidatorIndexValueError)
|
||||||
of ValidatorIndexError.UnsupportedValue:
|
of ValidatorIndexError.UnsupportedValue:
|
||||||
return RestApiResponse.jsonError(Http500,
|
return RestApiResponse.jsonError(Http500,
|
||||||
"Unsupported validator index value")
|
UnsupportedValidatorIndexValueError)
|
||||||
vres.get()
|
vres.get()
|
||||||
if vitem in res2:
|
if vitem in res2:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Only unique validator indexes allowed")
|
UniqueValidatorIndexError)
|
||||||
res2.incl(vitem)
|
res2.incl(vitem)
|
||||||
(res1, res2)
|
(res1, res2)
|
||||||
node.withStateForBlockSlot(bslot):
|
node.withStateForBlockSlot(bslot):
|
||||||
@ -464,7 +463,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
))
|
))
|
||||||
return RestApiResponse.jsonResponse(res)
|
return RestApiResponse.jsonResponse(res)
|
||||||
|
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getEpochCommittees
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getEpochCommittees
|
||||||
router.api(MethodGet,
|
router.api(MethodGet,
|
||||||
@ -474,23 +473,22 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
let vepoch =
|
let vepoch =
|
||||||
if epoch.isSome():
|
if epoch.isSome():
|
||||||
let repoch = epoch.get()
|
let repoch = epoch.get()
|
||||||
if repoch.isErr():
|
if repoch.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid epoch value",
|
return RestApiResponse.jsonError(Http400, InvalidEpochValueError,
|
||||||
$repoch.error())
|
$repoch.error())
|
||||||
let res = repoch.get()
|
let res = repoch.get()
|
||||||
if res > MaxEpoch:
|
if res > MaxEpoch:
|
||||||
return RestApiResponse.jsonError(Http400, "Requesting epoch for " &
|
return RestApiResponse.jsonError(Http400, EpochOverflowValueError)
|
||||||
"which slot would overflow")
|
|
||||||
some(res)
|
some(res)
|
||||||
else:
|
else:
|
||||||
none[Epoch]()
|
none[Epoch]()
|
||||||
@ -498,7 +496,8 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
if index.isSome():
|
if index.isSome():
|
||||||
let rindex = index.get()
|
let rindex = index.get()
|
||||||
if rindex.isErr():
|
if rindex.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid index value",
|
return RestApiResponse.jsonError(Http400,
|
||||||
|
InvalidCommitteeIndexValueError,
|
||||||
$rindex.error())
|
$rindex.error())
|
||||||
some(rindex.get())
|
some(rindex.get())
|
||||||
else:
|
else:
|
||||||
@ -507,7 +506,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
if slot.isSome():
|
if slot.isSome():
|
||||||
let rslot = slot.get()
|
let rslot = slot.get()
|
||||||
if rslot.isErr():
|
if rslot.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid slot value",
|
return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
|
||||||
$rslot.error())
|
$rslot.error())
|
||||||
some(rslot.get())
|
some(rslot.get())
|
||||||
else:
|
else:
|
||||||
@ -547,7 +546,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
|
|
||||||
return RestApiResponse.jsonResponse(res)
|
return RestApiResponse.jsonResponse(res)
|
||||||
|
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlockHeaders
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlockHeaders
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/headers") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/headers") do (
|
||||||
@ -558,7 +557,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
if slot.isSome():
|
if slot.isSome():
|
||||||
let rslot = slot.get()
|
let rslot = slot.get()
|
||||||
if rslot.isErr():
|
if rslot.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid slot value",
|
return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
|
||||||
$rslot.error())
|
$rslot.error())
|
||||||
rslot.get()
|
rslot.get()
|
||||||
else:
|
else:
|
||||||
@ -567,9 +566,9 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
if parent_root.isSome():
|
if parent_root.isSome():
|
||||||
let rroot = parent_root.get()
|
let rroot = parent_root.get()
|
||||||
if rroot.isErr():
|
if rroot.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid parent_root value",
|
return RestApiResponse.jsonError(Http400, InvalidParentRootValueError,
|
||||||
$rroot.error())
|
$rroot.error())
|
||||||
return RestApiResponse.jsonError(Http500, "Not implemented yet")
|
return RestApiResponse.jsonError(Http500, NoImplementationError)
|
||||||
|
|
||||||
let bdata =
|
let bdata =
|
||||||
block:
|
block:
|
||||||
@ -577,13 +576,12 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
block:
|
block:
|
||||||
let res = node.getCurrentHead(qslot)
|
let res = node.getCurrentHead(qslot)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http404,
|
return RestApiResponse.jsonError(Http404, SlotNotFoundError,
|
||||||
"Slot number is too far away",
|
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let blockSlot = head.atSlot(qslot)
|
let blockSlot = head.atSlot(qslot)
|
||||||
if isNil(blockSlot.blck):
|
if isNil(blockSlot.blck):
|
||||||
return RestApiResponse.jsonError(Http404, "Block header not found")
|
return RestApiResponse.jsonError(Http404, BlockNotFoundError)
|
||||||
node.chainDag.get(blockSlot.blck)
|
node.chainDag.get(blockSlot.blck)
|
||||||
|
|
||||||
return RestApiResponse.jsonResponse(
|
return RestApiResponse.jsonResponse(
|
||||||
@ -609,11 +607,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bdata =
|
let bdata =
|
||||||
block:
|
block:
|
||||||
if block_id.isErr():
|
if block_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid block_id",
|
return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
|
||||||
$block_id.error())
|
$block_id.error())
|
||||||
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "Block not found")
|
return RestApiResponse.jsonError(Http404, BlockNotFoundError)
|
||||||
res.get()
|
res.get()
|
||||||
|
|
||||||
return RestApiResponse.jsonResponse(
|
return RestApiResponse.jsonResponse(
|
||||||
@ -639,32 +637,26 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let blck =
|
let blck =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(SignedBeaconBlock, contentBody.get())
|
let dres = decodeBody(SignedBeaconBlock, contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode block " &
|
return RestApiResponse.jsonError(Http400, InvalidBlockObjectError,
|
||||||
"object", $dres.error())
|
$dres.error())
|
||||||
dres.get()
|
dres.get()
|
||||||
let head = node.chainDag.head
|
let head = node.chainDag.head
|
||||||
if not(node.isSynced(head)):
|
if not(node.isSynced(head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is currently " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"syncing and not serving request on that endpoint")
|
|
||||||
|
|
||||||
if head.slot >= blck.message.slot:
|
if head.slot >= blck.message.slot:
|
||||||
node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck)
|
node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck)
|
||||||
return RestApiResponse.jsonError(Http202, "The block failed " &
|
return RestApiResponse.jsonError(Http202, BlockValidationError)
|
||||||
"validation, but was successfully broadcast anyway. It was not " &
|
|
||||||
"integrated into the beacon node's database.")
|
|
||||||
else:
|
else:
|
||||||
let res = proposeSignedBlock(node, head, AttachedValidator(), blck)
|
let res = proposeSignedBlock(node, head, AttachedValidator(), blck)
|
||||||
if res == head:
|
if res == head:
|
||||||
node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck)
|
node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck)
|
||||||
return RestApiResponse.jsonError(Http202, "The block failed " &
|
return RestApiResponse.jsonError(Http202, BlockValidationError)
|
||||||
"validation, but was successfully broadcast anyway. It was not " &
|
|
||||||
"integrated into the beacon node's database.")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http200, "The block was validated " &
|
return RestApiResponse.jsonError(Http200, BlockValidationSuccess)
|
||||||
"successfully and has been broadcast")
|
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlock
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlock
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/blocks/{block_id}") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/blocks/{block_id}") do (
|
||||||
@ -672,11 +664,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bdata =
|
let bdata =
|
||||||
block:
|
block:
|
||||||
if block_id.isErr():
|
if block_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid block_id",
|
return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
|
||||||
$block_id.error())
|
$block_id.error())
|
||||||
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "Block not found")
|
return RestApiResponse.jsonError(Http404, BlockNotFoundError)
|
||||||
res.get()
|
res.get()
|
||||||
return RestApiResponse.jsonResponse(bdata.data)
|
return RestApiResponse.jsonResponse(bdata.data)
|
||||||
|
|
||||||
@ -686,11 +678,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bdata =
|
let bdata =
|
||||||
block:
|
block:
|
||||||
if block_id.isErr():
|
if block_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid block_id",
|
return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
|
||||||
$block_id.error())
|
$block_id.error())
|
||||||
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "Block not found")
|
return RestApiResponse.jsonError(Http404, BlockNotFoundError)
|
||||||
res.get()
|
res.get()
|
||||||
return RestApiResponse.jsonResponse((root: bdata.data.root))
|
return RestApiResponse.jsonResponse((root: bdata.data.root))
|
||||||
|
|
||||||
@ -701,11 +693,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bdata =
|
let bdata =
|
||||||
block:
|
block:
|
||||||
if block_id.isErr():
|
if block_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid block_id",
|
return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
|
||||||
$block_id.error())
|
$block_id.error())
|
||||||
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
let res = node.getBlockDataFromBlockIdent(block_id.get())
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "Block not found")
|
return RestApiResponse.jsonError(Http404, BlockNotFoundError)
|
||||||
res.get()
|
res.get()
|
||||||
return RestApiResponse.jsonResponse(
|
return RestApiResponse.jsonResponse(
|
||||||
bdata.data.message.body.attestations.asSeq()
|
bdata.data.message.body.attestations.asSeq()
|
||||||
@ -720,7 +712,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let rindex = committee_index.get()
|
let rindex = committee_index.get()
|
||||||
if rindex.isErr():
|
if rindex.isErr():
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Invalid committee_index value",
|
InvalidCommitteeIndexValueError,
|
||||||
$rindex.error())
|
$rindex.error())
|
||||||
some(rindex.get())
|
some(rindex.get())
|
||||||
else:
|
else:
|
||||||
@ -729,7 +721,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
if slot.isSome():
|
if slot.isSome():
|
||||||
let rslot = slot.get()
|
let rslot = slot.get()
|
||||||
if rslot.isErr():
|
if rslot.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid slot value",
|
return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
|
||||||
$rslot.error())
|
$rslot.error())
|
||||||
some(rslot.get())
|
some(rslot.get())
|
||||||
else:
|
else:
|
||||||
@ -745,11 +737,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let attestations =
|
let attestations =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(seq[Attestation], contentBody.get())
|
let dres = decodeBody(seq[Attestation], contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"attestation object(s)",
|
InvalidAttestationObjectError,
|
||||||
$dres.error())
|
$dres.error())
|
||||||
dres.get()
|
dres.get()
|
||||||
|
|
||||||
@ -766,11 +758,10 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
node.sendAttestation(attestation)
|
node.sendAttestation(attestation)
|
||||||
|
|
||||||
if len(failures) > 0:
|
if len(failures) > 0:
|
||||||
return RestApiResponse.jsonErrorList(Http400, "Some failures happened",
|
return RestApiResponse.jsonErrorList(Http400, AttestationValidationError,
|
||||||
failures)
|
failures)
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http200,
|
return RestApiResponse.jsonError(Http200, AttestationValidationSuccess)
|
||||||
"Attestation(s) was broadcasted")
|
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolAttesterSlashings
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolAttesterSlashings
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/pool/attester_slashings") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/pool/attester_slashings") do (
|
||||||
@ -790,21 +781,21 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let slashing =
|
let slashing =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(AttesterSlashing, contentBody.get())
|
let dres = decodeBody(AttesterSlashing, contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"attester slashing object", $dres.error())
|
InvalidAttesterSlashingObjectError,
|
||||||
|
$dres.error())
|
||||||
let res = dres.get()
|
let res = dres.get()
|
||||||
let vres = node.exitPool[].validateAttesterSlashing(res)
|
let vres = node.exitPool[].validateAttesterSlashing(res)
|
||||||
if vres.isErr():
|
if vres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid attester " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"slashing, it will never pass validation so it's rejected",
|
AttesterSlashingValidationError,
|
||||||
$vres.error())
|
$vres.error())
|
||||||
res
|
res
|
||||||
node.sendAttesterSlashing(slashing)
|
node.sendAttesterSlashing(slashing)
|
||||||
return RestApiResponse.jsonError(Http200,
|
return RestApiResponse.jsonError(Http200, AttesterSlashingValidationSuccess)
|
||||||
"Attester slashing was broadcasted")
|
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolProposerSlashings
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolProposerSlashings
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/pool/proposer_slashings") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/pool/proposer_slashings") do (
|
||||||
@ -824,21 +815,21 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let slashing =
|
let slashing =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(ProposerSlashing, contentBody.get())
|
let dres = decodeBody(ProposerSlashing, contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"proposer slashing object", $dres.error())
|
InvalidProposerSlashingObjectError,
|
||||||
|
$dres.error())
|
||||||
let res = dres.get()
|
let res = dres.get()
|
||||||
let vres = node.exitPool[].validateProposerSlashing(res)
|
let vres = node.exitPool[].validateProposerSlashing(res)
|
||||||
if vres.isErr():
|
if vres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid proposer " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"slashing, it will never pass validation so it's rejected",
|
ProposerSlashingValidationError,
|
||||||
$vres.error())
|
$vres.error())
|
||||||
res
|
res
|
||||||
node.sendProposerSlashing(slashing)
|
node.sendProposerSlashing(slashing)
|
||||||
return RestApiResponse.jsonError(Http200,
|
return RestApiResponse.jsonError(Http200, ProposerSlashingValidationSuccess)
|
||||||
"Proposer slashing was broadcasted")
|
|
||||||
|
|
||||||
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolVoluntaryExits
|
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolVoluntaryExits
|
||||||
router.api(MethodGet, "/api/eth/v1/beacon/pool/voluntary_exits") do (
|
router.api(MethodGet, "/api/eth/v1/beacon/pool/voluntary_exits") do (
|
||||||
@ -858,17 +849,18 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let exit =
|
let exit =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(SignedVoluntaryExit, contentBody.get())
|
let dres = decodeBody(SignedVoluntaryExit, contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"voluntary exit object", $dres.error())
|
InvalidVoluntaryExitObjectError,
|
||||||
|
$dres.error())
|
||||||
let res = dres.get()
|
let res = dres.get()
|
||||||
let vres = node.exitPool[].validateVoluntaryExit(res)
|
let vres = node.exitPool[].validateVoluntaryExit(res)
|
||||||
if vres.isErr():
|
if vres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid voluntary exit, " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"it will never pass validation so it's rejected", $vres.error())
|
VoluntaryExitValidationError,
|
||||||
|
$vres.error())
|
||||||
res
|
res
|
||||||
node.sendVoluntaryExit(exit)
|
node.sendVoluntaryExit(exit)
|
||||||
return RestApiResponse.jsonError(Http200,
|
return RestApiResponse.jsonError(Http200, VoluntaryExitValidationSuccess)
|
||||||
"Voluntary exit was broadcasted")
|
|
||||||
|
@ -15,16 +15,16 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let bslot =
|
let bslot =
|
||||||
block:
|
block:
|
||||||
if state_id.isErr():
|
if state_id.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid state_id",
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
||||||
$state_id.error())
|
$state_id.error())
|
||||||
let bres = node.getBlockSlot(state_id.get())
|
let bres = node.getBlockSlot(state_id.get())
|
||||||
if bres.isErr():
|
if bres.isErr():
|
||||||
return RestApiResponse.jsonError(Http404, "State not found",
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
||||||
$bres.error())
|
$bres.error())
|
||||||
bres.get()
|
bres.get()
|
||||||
node.withStateForBlockSlot(bslot):
|
node.withStateForBlockSlot(bslot):
|
||||||
return RestApiResponse.jsonResponse(state())
|
return RestApiResponse.jsonResponse(state())
|
||||||
return RestApiResponse.jsonError(Http500, "Internal server error")
|
return RestApiResponse.jsonError(Http500, InternalServerError)
|
||||||
|
|
||||||
router.api(MethodGet,
|
router.api(MethodGet,
|
||||||
"/api/eth/v1/debug/beacon/heads") do () -> RestApiResponse:
|
"/api/eth/v1/debug/beacon/heads") do () -> RestApiResponse:
|
||||||
|
@ -29,6 +29,90 @@ const
|
|||||||
FarFutureEpochString* = "18446744073709551615"
|
FarFutureEpochString* = "18446744073709551615"
|
||||||
MaxEpoch* = compute_epoch_at_slot(not(0'u64))
|
MaxEpoch* = compute_epoch_at_slot(not(0'u64))
|
||||||
|
|
||||||
|
BlockValidationError* =
|
||||||
|
"The block failed validation, but was successfully broadcast anyway. It " &
|
||||||
|
"was not integrated into the beacon node's database."
|
||||||
|
BlockValidationSuccess* =
|
||||||
|
"The block was validated successfully and has been broadcast"
|
||||||
|
BeaconNodeInSyncError* =
|
||||||
|
"Beacon node is currently syncing and not serving request on that endpoint"
|
||||||
|
BlockNotFoundError* =
|
||||||
|
"Block header/data has not been found"
|
||||||
|
EmptyRequestBodyError* =
|
||||||
|
"Empty request's body"
|
||||||
|
InvalidBlockObjectError* =
|
||||||
|
"Unable to decode block object(s)"
|
||||||
|
InvalidAttestationObjectError* =
|
||||||
|
"Unable to decode attestation object(s)"
|
||||||
|
AttestationValidationError* =
|
||||||
|
"Some errors happened while validating attestation(s)"
|
||||||
|
AttestationValidationSuccess* =
|
||||||
|
"Attestation object(s) was broadcasted"
|
||||||
|
InvalidAttesterSlashingObjectError* =
|
||||||
|
"Unable to decode attester slashing object(s)"
|
||||||
|
AttesterSlashingValidationError* =
|
||||||
|
"Invalid attester slashing, it will never pass validation so it's rejected"
|
||||||
|
AttesterSlashingValidationSuccess* =
|
||||||
|
"Attester slashing object was broadcasted"
|
||||||
|
InvalidProposerSlashingObjectError* =
|
||||||
|
"Unable to decode proposer slashing object(s)"
|
||||||
|
ProposerSlashingValidationError* =
|
||||||
|
"Invalid proposer slashing, it will never pass validation so it's rejected"
|
||||||
|
ProposerSlashingValidationSuccess* =
|
||||||
|
"Proposer slashing object was broadcasted"
|
||||||
|
InvalidVoluntaryExitObjectError* =
|
||||||
|
"Unable to decode voluntary exit object(s)"
|
||||||
|
VoluntaryExitValidationError* =
|
||||||
|
"Invalid voluntary exit, it will never pass validation so it's rejected"
|
||||||
|
VoluntaryExitValidationSuccess* =
|
||||||
|
"Voluntary exit object(s) was broadcasted"
|
||||||
|
InvalidParentRootValueError* =
|
||||||
|
"Invalid parent root value"
|
||||||
|
MissingSlotValueError* =
|
||||||
|
"Missing `slot` value"
|
||||||
|
InvalidSlotValueError* =
|
||||||
|
"Invalid slot value"
|
||||||
|
MissingCommitteeIndexValueError* =
|
||||||
|
"Missing `committee_index` value"
|
||||||
|
InvalidCommitteeIndexValueError* =
|
||||||
|
"Invalid committee index value"
|
||||||
|
InvalidEpochValueError* =
|
||||||
|
"Invalid epoch value"
|
||||||
|
InvalidStateIdValueError* =
|
||||||
|
"Invalid state identifier value"
|
||||||
|
InvalidBlockIdValueError* =
|
||||||
|
"Invalid block identifier value"
|
||||||
|
InvalidValidatorIdValueError* =
|
||||||
|
"Invalid validator's identifier value(s)"
|
||||||
|
MaximumNumberOfValidatorIdsError* =
|
||||||
|
"Maximum number of validator identifier values exceeded"
|
||||||
|
InvalidValidatorStatusValueError* =
|
||||||
|
"Invalid validator's status value error"
|
||||||
|
ValidatorNotFoundError* =
|
||||||
|
"Could not find validator"
|
||||||
|
ValidatorStatusNotFoundError* =
|
||||||
|
"Could not obtain validator's status"
|
||||||
|
UniqueValidatorKeyError* =
|
||||||
|
"Only unique validator's keys are allowed"
|
||||||
|
TooHighValidatorIndexValueError* =
|
||||||
|
"Validator index exceeds maximum number of validators allowed"
|
||||||
|
UnsupportedValidatorIndexValueError* =
|
||||||
|
"Validator index exceeds maximum supported number of validators"
|
||||||
|
UniqueValidatorIndexError* =
|
||||||
|
"Only unique validator's index are allowed"
|
||||||
|
StateNotFoundError* =
|
||||||
|
"State not found"
|
||||||
|
SlotNotFoundError* =
|
||||||
|
"Slot number is too far away"
|
||||||
|
NoHeadForSlotError* =
|
||||||
|
"Cound not find head for slot"
|
||||||
|
EpochOverflowValueError* =
|
||||||
|
"Requesting epoch for which slot would overflow"
|
||||||
|
InternalServerError* =
|
||||||
|
"Internal server error"
|
||||||
|
NoImplementationError* =
|
||||||
|
"Not implemented yet"
|
||||||
|
|
||||||
type
|
type
|
||||||
ValidatorQueryKind* {.pure.} = enum
|
ValidatorQueryKind* {.pure.} = enum
|
||||||
Index, Key
|
Index, Key
|
||||||
|
@ -47,7 +47,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let indexList =
|
let indexList =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(seq[RestValidatorIndex], contentBody.get())
|
let dres = decodeBody(seq[RestValidatorIndex], contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
||||||
@ -60,10 +60,10 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
case vres.error()
|
case vres.error()
|
||||||
of ValidatorIndexError.TooHighValue:
|
of ValidatorIndexError.TooHighValue:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Incorrect validator index value")
|
TooHighValidatorIndexValueError)
|
||||||
of ValidatorIndexError.UnsupportedValue:
|
of ValidatorIndexError.UnsupportedValue:
|
||||||
return RestApiResponse.jsonError(Http500,
|
return RestApiResponse.jsonError(Http500,
|
||||||
"Unsupported validator index value")
|
UnsupportedValidatorIndexValueError)
|
||||||
res.add(vres.get())
|
res.add(vres.get())
|
||||||
if len(res) == 0:
|
if len(res) == 0:
|
||||||
return RestApiResponse.jsonError(Http400, "Empty indexes list")
|
return RestApiResponse.jsonError(Http400, "Empty indexes list")
|
||||||
@ -71,23 +71,20 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let qepoch =
|
let qepoch =
|
||||||
block:
|
block:
|
||||||
if epoch.isErr():
|
if epoch.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Incorrect epoch value",
|
return RestApiResponse.jsonError(Http400, InvalidEpochValueError,
|
||||||
$epoch.error())
|
$epoch.error())
|
||||||
let res = epoch.get()
|
let res = epoch.get()
|
||||||
if res > MaxEpoch:
|
if res > MaxEpoch:
|
||||||
return RestApiResponse.jsonError(Http400, "Requesting epoch for " &
|
return RestApiResponse.jsonError(Http400, EpochOverflowValueError)
|
||||||
"which slot would overflow")
|
|
||||||
res
|
res
|
||||||
let qhead =
|
let qhead =
|
||||||
block:
|
block:
|
||||||
let res = node.getCurrentHead(qepoch)
|
let res = node.getCurrentHead(qepoch)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
|
||||||
"Cound not find head for slot",
|
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let droot =
|
let droot =
|
||||||
@ -97,8 +94,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
)
|
)
|
||||||
if isNil(bref):
|
if isNil(bref):
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Cound not find slot data")
|
"Cound not find slot data")
|
||||||
@ -141,23 +137,20 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let qepoch =
|
let qepoch =
|
||||||
block:
|
block:
|
||||||
if epoch.isErr():
|
if epoch.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Incorrect epoch value",
|
return RestApiResponse.jsonError(Http400, InvalidEpochValueError,
|
||||||
$epoch.error())
|
$epoch.error())
|
||||||
let res = epoch.get()
|
let res = epoch.get()
|
||||||
if res > MaxEpoch:
|
if res > MaxEpoch:
|
||||||
return RestApiResponse.jsonError(Http400, "Requesting epoch for " &
|
return RestApiResponse.jsonError(Http400, EpochOverflowValueError)
|
||||||
"which slot would overflow")
|
|
||||||
res
|
res
|
||||||
let qhead =
|
let qhead =
|
||||||
block:
|
block:
|
||||||
let res = node.getCurrentHead(qepoch)
|
let res = node.getCurrentHead(qepoch)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
|
||||||
"Cound not find head for slot",
|
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let droot =
|
let droot =
|
||||||
@ -167,11 +160,9 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
)
|
)
|
||||||
if isNil(bref):
|
if isNil(bref):
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400, BlockNotFoundError)
|
||||||
"Cound not find slot data")
|
|
||||||
bref.root
|
bref.root
|
||||||
else:
|
else:
|
||||||
node.chainDag.genesis.root
|
node.chainDag.genesis.root
|
||||||
@ -201,7 +192,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let qslot =
|
let qslot =
|
||||||
block:
|
block:
|
||||||
if slot.isErr():
|
if slot.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Incorrect slot value",
|
return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
|
||||||
$slot.error())
|
$slot.error())
|
||||||
slot.get()
|
slot.get()
|
||||||
let qrandao =
|
let qrandao =
|
||||||
@ -230,11 +221,9 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let res = node.getCurrentHead(qslot)
|
let res = node.getCurrentHead(qslot)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
|
||||||
"Cound not find head for slot",
|
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let proposer = node.chainDag.getProposer(qhead, qslot)
|
let proposer = node.chainDag.getProposer(qhead, qslot)
|
||||||
@ -258,21 +247,21 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let qslot =
|
let qslot =
|
||||||
block:
|
block:
|
||||||
if slot.isNone():
|
if slot.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Missing slot value")
|
return RestApiResponse.jsonError(Http400, MissingSlotValueError)
|
||||||
let res = slot.get()
|
let res = slot.get()
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Incorrect slot value",
|
return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let qindex =
|
let qindex =
|
||||||
block:
|
block:
|
||||||
if committee_index.isNone():
|
if committee_index.isNone():
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400,
|
||||||
"Missing committee_index value")
|
MissingCommitteeIndexValueError)
|
||||||
let res = committee_index.get()
|
let res = committee_index.get()
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Incorrect " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"committee_index value",
|
InvalidCommitteeIndexValueError,
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let qhead =
|
let qhead =
|
||||||
@ -280,11 +269,9 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let res = node.getCurrentHead(qslot)
|
let res = node.getCurrentHead(qslot)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
else:
|
else:
|
||||||
return RestApiResponse.jsonError(Http400,
|
return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
|
||||||
"Cound not find head for slot",
|
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let epochRef = node.chainDag.getEpochRef(qhead, qslot.epoch)
|
let epochRef = node.chainDag.getEpochRef(qhead, qslot.epoch)
|
||||||
@ -300,10 +287,10 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let qslot =
|
let qslot =
|
||||||
block:
|
block:
|
||||||
if slot.isNone():
|
if slot.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Missing slot value")
|
return RestApiResponse.jsonError(Http400, MissingSlotValueError)
|
||||||
let res = slot.get()
|
let res = slot.get()
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Incorrect slot value",
|
return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
|
||||||
$res.error())
|
$res.error())
|
||||||
res.get()
|
res.get()
|
||||||
let qroot =
|
let qroot =
|
||||||
@ -330,7 +317,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let payload =
|
let payload =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(SignedAggregateAndProof, contentBody.get())
|
let dres = decodeBody(SignedAggregateAndProof, contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
return RestApiResponse.jsonError(Http400, "Unable to decode " &
|
||||||
@ -357,7 +344,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
let requests =
|
let requests =
|
||||||
block:
|
block:
|
||||||
if contentBody.isNone():
|
if contentBody.isNone():
|
||||||
return RestApiResponse.jsonError(Http400, "Empty request's body")
|
return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
|
||||||
let dres = decodeBody(seq[RestCommitteeSubscriptionTuple],
|
let dres = decodeBody(seq[RestCommitteeSubscriptionTuple],
|
||||||
contentBody.get())
|
contentBody.get())
|
||||||
if dres.isErr():
|
if dres.isErr():
|
||||||
@ -365,13 +352,12 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
"subscription request(s)")
|
"subscription request(s)")
|
||||||
dres.get()
|
dres.get()
|
||||||
if not(node.isSynced(node.chainDag.head)):
|
if not(node.isSynced(node.chainDag.head)):
|
||||||
return RestApiResponse.jsonError(Http503, "Beacon node is " &
|
return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
|
||||||
"currently syncing and not serving request on that endpoint")
|
|
||||||
|
|
||||||
for request in requests:
|
for request in requests:
|
||||||
if uint64(request.committee_index) >= uint64(ATTESTATION_SUBNET_COUNT):
|
if uint64(request.committee_index) >= uint64(ATTESTATION_SUBNET_COUNT):
|
||||||
return RestApiResponse.jsonError(Http400, "Invalid committee_index " &
|
return RestApiResponse.jsonError(Http400,
|
||||||
"value")
|
InvalidCommitteeIndexValueError)
|
||||||
let validator_pubkey =
|
let validator_pubkey =
|
||||||
block:
|
block:
|
||||||
let idx = request.validator_index
|
let idx = request.validator_index
|
||||||
@ -400,4 +386,4 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||||||
get_committee_count_per_slot(epochRef), request.slot,
|
get_committee_count_per_slot(epochRef), request.slot,
|
||||||
request.committee_index)
|
request.committee_index)
|
||||||
)
|
)
|
||||||
return RestApiResponse.jsonError(Http500, "Not implemented yet")
|
return RestApiResponse.jsonError(Http500, NoImplementationError)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user