fix `/eth/v1/debug/fork_choice` output (#4810)

Two fixes to `/eth/v1/debug/fork_choice`:

- `validity` enum is expected to be serialized as string instead of int
- `data` wrapper is not expected for this endpoint
This commit is contained in:
Etan Kissling 2023-04-12 01:17:48 +02:00 committed by GitHub
parent c3d043c0e1
commit dc22244b3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 40 deletions

View File

@ -85,40 +85,6 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) =
if node.config.debugForkChoice or experimental in node.dag.updateFlags: if node.config.debugForkChoice or experimental in node.dag.updateFlags:
router.api(MethodGet, router.api(MethodGet,
"/eth/v1/debug/fork_choice") do () -> RestApiResponse: "/eth/v1/debug/fork_choice") do () -> RestApiResponse:
type
NodeValidity {.pure.} = enum
valid = "VALID",
invalid = "INVALID",
optimistic = "OPTIMISTIC"
NodeExtraData = object
justified_root: Eth2Digest
finalized_root: Eth2Digest
u_justified_checkpoint: Option[Checkpoint]
u_finalized_checkpoint: Option[Checkpoint]
best_child: Eth2Digest
best_descendant: Eth2Digest
Node = object
slot: Slot
block_root: Eth2Digest
parent_root: Eth2Digest
justified_epoch: Epoch
finalized_epoch: Epoch
weight: uint64
validity: NodeValidity
execution_block_hash: Eth2Digest
extra_data: Option[NodeExtraData]
ExtraData = object
discard
GetForkChoiceResponse = object
justified_checkpoint: Checkpoint
finalized_checkpoint: Checkpoint
fork_choice_nodes: seq[Node]
extra_data: ExtraData
template forkChoice: auto = node.attestationPool[].forkChoice template forkChoice: auto = node.attestationPool[].forkChoice
var response = GetForkChoiceResponse( var response = GetForkChoiceResponse(
@ -139,7 +105,7 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) =
else: else:
none(Checkpoint) none(Checkpoint)
response.fork_choice_nodes.add Node( response.fork_choice_nodes.add RestNode(
slot: item.bid.slot, slot: item.bid.slot,
block_root: item.bid.root, block_root: item.bid.root,
parent_root: item.parent, parent_root: item.parent,
@ -148,13 +114,13 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) =
weight: cast[uint64](item.weight), weight: cast[uint64](item.weight),
validity: validity:
if item.invalid: if item.invalid:
NodeValidity.invalid RestNodeValidity.invalid
elif node.dag.is_optimistic(item.bid.root): elif node.dag.is_optimistic(item.bid.root):
NodeValidity.optimistic RestNodeValidity.optimistic
else: else:
NodeValidity.valid, RestNodeValidity.valid,
execution_block_hash: node.dag.loadExecutionBlockHash(item.bid), execution_block_hash: node.dag.loadExecutionBlockHash(item.bid),
extra_data: some NodeExtraData( extra_data: some RestNodeExtraData(
justified_root: item.checkpoints.justified.root, justified_root: item.checkpoints.justified.root,
finalized_root: item.checkpoints.finalized.root, finalized_root: item.checkpoints.finalized.root,
u_justified_checkpoint: u_justified_checkpoint, u_justified_checkpoint: u_justified_checkpoint,
@ -162,4 +128,4 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) =
best_child: item.bestChild, best_child: item.bestChild,
bestDescendant: item.bestDescendant)) bestDescendant: item.bestDescendant))
return RestApiResponse.jsonResponse(response) return RestApiResponse.jsonResponsePlain(response)

View File

@ -2667,6 +2667,12 @@ proc writeValue*(writer: var JsonWriter[RestJson],
writer.writeField("execution_optimistic", value.optimistic.get()) writer.writeField("execution_optimistic", value.optimistic.get())
writer.endRecord() writer.endRecord()
## RestNodeValidity
proc writeValue*(writer: var JsonWriter[RestJson],
value: RestNodeValidity) {.
raises: [IOError, Defect].} =
writer.writeValue($value)
## RestSyncInfo ## RestSyncInfo
proc writeValue*(writer: var JsonWriter[RestJson], proc writeValue*(writer: var JsonWriter[RestJson],
value: RestSyncInfo) {. value: RestSyncInfo) {.

View File

@ -671,6 +671,39 @@ type
GetValidatorsActivityResponse* = DataEnclosedObject[seq[RestActivityItem]] GetValidatorsActivityResponse* = DataEnclosedObject[seq[RestActivityItem]]
GetValidatorsLivenessResponse* = DataEnclosedObject[seq[RestLivenessItem]] GetValidatorsLivenessResponse* = DataEnclosedObject[seq[RestLivenessItem]]
RestNodeValidity* {.pure.} = enum
valid = "VALID",
invalid = "INVALID",
optimistic = "OPTIMISTIC"
RestNodeExtraData* = object
justified_root*: Eth2Digest
finalized_root*: Eth2Digest
u_justified_checkpoint*: Option[Checkpoint]
u_finalized_checkpoint*: Option[Checkpoint]
best_child*: Eth2Digest
best_descendant*: Eth2Digest
RestNode* = object
slot*: Slot
block_root*: Eth2Digest
parent_root*: Eth2Digest
justified_epoch*: Epoch
finalized_epoch*: Epoch
weight*: uint64
validity*: RestNodeValidity
execution_block_hash*: Eth2Digest
extra_data*: Option[RestNodeExtraData]
RestExtraData* = object
discard
GetForkChoiceResponse* = object
justified_checkpoint*: Checkpoint
finalized_checkpoint*: Checkpoint
fork_choice_nodes*: seq[RestNode]
extra_data*: RestExtraData
func `==`*(a, b: RestValidatorIndex): bool = func `==`*(a, b: RestValidatorIndex): bool =
uint64(a) == uint64(b) uint64(a) == uint64(b)