Skip to content

Commit

Permalink
add some electra support to REST JSON decoding; rm unused code (#6549)
Browse files Browse the repository at this point in the history
  • Loading branch information
tersec committed Sep 15, 2024
1 parent bd47f62 commit 72b5c2b
Showing 1 changed file with 46 additions and 85 deletions.
131 changes: 46 additions & 85 deletions beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,11 @@ import results, stew/[assign2, base10, byteutils, endians2], presto/common,
stint, chronicles
import ".."/[eth2_ssz_serialization, forks, keystore],
".."/../consensus_object_pools/block_pools_types,
".."/datatypes/[phase0, altair, bellatrix],
".."/mev/[bellatrix_mev, capella_mev],
".."/../validators/slashing_protection_common,
"."/[rest_types, rest_keymanager_types]
import nimcrypto/utils as ncrutils

from ".."/datatypes/capella import SignedBeaconBlock
from ".."/datatypes/deneb import BeaconState

export
eth2_ssz_serialization, results, peerid, common, serialization, chronicles,
json_serialization, net, sets, rest_types, slashing_protection_common,
Expand Down Expand Up @@ -311,7 +307,7 @@ template writeValue*(w: JsonWriter[RestJson], value: tuple) =
## TODO nim-json-serializations should allow setting up this policy per format
##
## This also means that when new fields are introduced to the object definitions
## below, one must use the `Option[T]` type.
## below, one must use the `Opt[T]` type.

const
DecimalSet = {'0' .. '9'}
Expand Down Expand Up @@ -1516,20 +1512,8 @@ proc readValue*[BlockType: ForkedBlindedBeaconBlock](
exc.formatMsg("BlindedBlock") & "]")
value = ForkedBlindedBeaconBlock(kind: ConsensusFork.Altair,
altairData: res)
of ConsensusFork.Bellatrix:
reader.raiseUnexpectedValue("Bellatrix blinded block format unsupported")
of ConsensusFork.Capella:
let res =
try:
RestJson.decode(string(data.get()),
capella_mev.BlindedBeaconBlock,
requireAllFields = true,
allowUnknownFields = true)
except SerializationError as exc:
reader.raiseUnexpectedValue("Incorrect capella block format, [" &
exc.formatMsg("BlindedBlock") & "]")
value = ForkedBlindedBeaconBlock(kind: ConsensusFork.Capella,
capellaData: res)
of ConsensusFork.Bellatrix .. ConsensusFork.Capella:
reader.raiseUnexpectedValue("pre-Deneb blinded block formats unsupported")
of ConsensusFork.Deneb:
let res =
try:
Expand Down Expand Up @@ -1592,34 +1576,6 @@ proc writeValue*[BlockType: Web3SignerForkedBeaconBlock](
writer.writeField("block_header", value.data)
writer.endRecord()

proc writeValue*[BlockType: ForkedBeaconBlock](
writer: var JsonWriter[RestJson], value: BlockType) {.raises: [IOError].} =

template forkIdentifier(id: string): auto =
when BlockType is ForkedBeaconBlock:
id
else:
(static toUpperAscii id)

writer.beginRecord()
case value.kind
of ConsensusFork.Phase0:
writer.writeField("version", forkIdentifier "phase0")
writer.writeField("data", value.phase0Data)
of ConsensusFork.Altair:
writer.writeField("version", forkIdentifier "altair")
writer.writeField("data", value.altairData)
of ConsensusFork.Bellatrix:
writer.writeField("version", forkIdentifier "bellatrix")
writer.writeField("data", value.bellatrixData)
of ConsensusFork.Capella:
writer.writeField("version", forkIdentifier "capella")
writer.writeField("data", value.capellaData)
of ConsensusFork.Deneb:
writer.writeField("version", forkIdentifier "deneb")
writer.writeField("data", value.denebData)
writer.endRecord()

## RestPublishedBeaconBlockBody
proc readValue*(reader: var JsonReader[RestJson],
value: var RestPublishedBeaconBlockBody) {.
Expand Down Expand Up @@ -2161,6 +2117,7 @@ proc readValue*(reader: var JsonReader[RestJson],
reader.raiseUnexpectedField("Multiple version fields found",
"ForkedSignedBeaconBlock")
let vres = reader.readValue(string)
static: doAssert ConsensusFork.high == ConsensusFork.Electra
case vres
of "phase0":
version = Opt.some(ConsensusFork.Phase0)
Expand All @@ -2172,6 +2129,8 @@ proc readValue*(reader: var JsonReader[RestJson],
version = Opt.some(ConsensusFork.Capella)
of "deneb":
version = Opt.some(ConsensusFork.Deneb)
of "electra":
version = Opt.some(ConsensusFork.Electra)
else:
reader.raiseUnexpectedValue("Incorrect version field value")
of "data":
Expand Down Expand Up @@ -3908,10 +3867,10 @@ proc decodeBytes*[T: DecodeTypes](
else:
err("Content-Type not supported")

proc encodeString*(value: string): RestResult[string] =
func encodeString*(value: string): RestResult[string] =
ok(value)

proc encodeString*(
func encodeString*(
value:
uint64 |
SyncCommitteePeriod |
Expand All @@ -3921,26 +3880,26 @@ proc encodeString*(
SyncSubcommitteeIndex): RestResult[string] =
ok(Base10.toString(uint64(value)))

proc encodeString*(value: ValidatorSig): RestResult[string] =
func encodeString*(value: ValidatorSig): RestResult[string] =
ok(hexOriginal(toRaw(value)))

proc encodeString*(value: GraffitiBytes): RestResult[string] =
func encodeString*(value: GraffitiBytes): RestResult[string] =
ok(hexOriginal(distinctBase(value)))

proc encodeString*(value: Eth2Digest): RestResult[string] =
func encodeString*(value: Eth2Digest): RestResult[string] =
ok(hexOriginal(value.data))

proc encodeString*(value: ValidatorIdent): RestResult[string] =
func encodeString*(value: ValidatorIdent): RestResult[string] =
case value.kind
of ValidatorQueryKind.Index:
ok(Base10.toString(uint64(value.index)))
of ValidatorQueryKind.Key:
ok(hexOriginal(toRaw(value.key)))

proc encodeString*(value: ValidatorPubKey): RestResult[string] =
func encodeString*(value: ValidatorPubKey): RestResult[string] =
ok(hexOriginal(toRaw(value)))

proc encodeString*(value: StateIdent): RestResult[string] =
func encodeString*(value: StateIdent): RestResult[string] =
case value.kind
of StateQueryKind.Slot:
ok(Base10.toString(uint64(value.slot)))
Expand All @@ -3957,7 +3916,7 @@ proc encodeString*(value: StateIdent): RestResult[string] =
of StateIdentType.Justified:
ok("justified")

proc encodeString*(value: BroadcastValidationType): RestResult[string] =
func encodeString*(value: BroadcastValidationType): RestResult[string] =
case value
of BroadcastValidationType.Gossip:
ok("gossip")
Expand All @@ -3966,7 +3925,7 @@ proc encodeString*(value: BroadcastValidationType): RestResult[string] =
of BroadcastValidationType.ConsensusAndEquivocation:
ok("consensus_and_equivocation")

proc encodeString*(value: BlockIdent): RestResult[string] =
func encodeString*(value: BlockIdent): RestResult[string] =
case value.kind
of BlockQueryKind.Slot:
ok(Base10.toString(uint64(value.slot)))
Expand All @@ -3981,7 +3940,7 @@ proc encodeString*(value: BlockIdent): RestResult[string] =
of BlockIdentType.Finalized:
ok("finalized")

proc decodeString*(t: typedesc[PeerStateKind],
func decodeString*(t: typedesc[PeerStateKind],
value: string): Result[PeerStateKind, cstring] =
case value
of "disconnected":
Expand All @@ -3993,9 +3952,9 @@ proc decodeString*(t: typedesc[PeerStateKind],
of "disconnecting":
ok(PeerStateKind.Disconnecting)
else:
err("Incorrect peer's state value")
err("Incorrect peer state value")

proc encodeString*(value: PeerStateKind): Result[string, cstring] =
func encodeString*(value: PeerStateKind): Result[string, cstring] =
case value
of PeerStateKind.Disconnected:
ok("disconnected")
Expand All @@ -4006,27 +3965,27 @@ proc encodeString*(value: PeerStateKind): Result[string, cstring] =
of PeerStateKind.Disconnecting:
ok("disconnecting")

proc decodeString*(t: typedesc[PeerDirectKind],
func decodeString*(t: typedesc[PeerDirectKind],
value: string): Result[PeerDirectKind, cstring] =
case value
of "inbound":
ok(PeerDirectKind.Inbound)
of "outbound":
ok(PeerDirectKind.Outbound)
else:
err("Incorrect peer's direction value")
err("Incorrect peer direction value")

proc encodeString*(value: PeerDirectKind): Result[string, cstring] =
func encodeString*(value: PeerDirectKind): Result[string, cstring] =
case value
of PeerDirectKind.Inbound:
ok("inbound")
of PeerDirectKind.Outbound:
ok("outbound")

proc encodeString*(peerid: PeerId): Result[string, cstring] =
func encodeString*(peerid: PeerId): Result[string, cstring] =
ok($peerid)

proc decodeString*(t: typedesc[EventTopic],
func decodeString*(t: typedesc[EventTopic],
value: string): Result[EventTopic, cstring] =
case value
of "head":
Expand Down Expand Up @@ -4058,7 +4017,7 @@ proc decodeString*(t: typedesc[EventTopic],
else:
err("Incorrect event's topic value")

proc encodeString*(value: set[EventTopic]): Result[string, cstring] =
func encodeString*(value: set[EventTopic]): Result[string, cstring] =
var res: string
if EventTopic.Head in value:
res.add("head,")
Expand Down Expand Up @@ -4091,7 +4050,7 @@ proc encodeString*(value: set[EventTopic]): Result[string, cstring] =
res.setLen(len(res) - 1)
ok(res)

proc toList*(value: set[ValidatorFilterKind]): seq[string] =
func toList*(value: set[ValidatorFilterKind]): seq[string] =
const
pendingSet = {ValidatorFilterKind.PendingInitialized,
ValidatorFilterKind.PendingQueued}
Expand Down Expand Up @@ -4130,15 +4089,15 @@ proc toList*(value: set[ValidatorFilterKind]): seq[string] =
processSingle(ValidatorFilterKind.WithdrawalDone, "withdrawal_done")
res

proc decodeString*(t: typedesc[ValidatorSig],
func decodeString*(t: typedesc[ValidatorSig],
value: string): Result[ValidatorSig, cstring] =
if len(value) != ValidatorSigSize + 2:
return err("Incorrect validator signature value length")
if value[0] != '0' and value[1] != 'x':
return err("Incorrect validator signature encoding")
ValidatorSig.fromHex(value)

proc decodeString*(t: typedesc[ValidatorPubKey],
func decodeString*(t: typedesc[ValidatorPubKey],
value: string): Result[ValidatorPubKey, cstring] =
if len(value) != ValidatorKeySize + 2:
return err("Incorrect validator's key value length")
Expand All @@ -4147,35 +4106,35 @@ proc decodeString*(t: typedesc[ValidatorPubKey],
else:
ValidatorPubKey.fromHex(value)

proc decodeString*(t: typedesc[GraffitiBytes],
func decodeString*(t: typedesc[GraffitiBytes],
value: string): Result[GraffitiBytes, cstring] =
try:
ok(GraffitiBytes.init(value))
except ValueError:
err("Unable to decode graffiti value")

proc decodeString*(t: typedesc[string],
func decodeString*(t: typedesc[string],
value: string): Result[string, cstring] =
ok(value)

proc decodeString*(t: typedesc[Slot], value: string): Result[Slot, cstring] =
func decodeString*(t: typedesc[Slot], value: string): Result[Slot, cstring] =
let res = ? Base10.decode(uint64, value)
ok(Slot(res))

proc decodeString*(t: typedesc[Epoch], value: string): Result[Epoch, cstring] =
func decodeString*(t: typedesc[Epoch], value: string): Result[Epoch, cstring] =
let res = ? Base10.decode(uint64, value)
ok(Epoch(res))

proc decodeString*(t: typedesc[SyncCommitteePeriod],
func decodeString*(t: typedesc[SyncCommitteePeriod],
value: string): Result[SyncCommitteePeriod, cstring] =
let res = ? Base10.decode(uint64, value)
ok(SyncCommitteePeriod(res))

proc decodeString*(t: typedesc[uint64],
func decodeString*(t: typedesc[uint64],
value: string): Result[uint64, cstring] =
Base10.decode(uint64, value)

proc decodeString*(t: typedesc[StateIdent],
func decodeString*(t: typedesc[StateIdent],
value: string): Result[StateIdent, cstring] =
if len(value) > 2:
if (value[0] == '0') and (value[1] == 'x'):
Expand Down Expand Up @@ -4207,7 +4166,7 @@ proc decodeString*(t: typedesc[StateIdent],
let res = ? Base10.decode(uint64, value)
ok(StateIdent(kind: StateQueryKind.Slot, slot: Slot(res)))

proc decodeString*(t: typedesc[BlockIdent],
func decodeString*(t: typedesc[BlockIdent],
value: string): Result[BlockIdent, cstring] =
if len(value) > 2:
if (value[0] == '0') and (value[1] == 'x'):
Expand Down Expand Up @@ -4236,7 +4195,7 @@ proc decodeString*(t: typedesc[BlockIdent],
let res = ? Base10.decode(uint64, value)
ok(BlockIdent(kind: BlockQueryKind.Slot, slot: Slot(res)))

proc decodeString*(t: typedesc[BroadcastValidationType],
func decodeString*(t: typedesc[BroadcastValidationType],
value: string): Result[BroadcastValidationType, cstring] =
case value
of "gossip":
Expand All @@ -4248,7 +4207,7 @@ proc decodeString*(t: typedesc[BroadcastValidationType],
else:
err("Incorrect broadcast validation type value")

proc decodeString*(t: typedesc[ValidatorIdent],
func decodeString*(t: typedesc[ValidatorIdent],
value: string): Result[ValidatorIdent, cstring] =
if len(value) > 2:
if (value[0] == '0') and (value[1] == 'x'):
Expand All @@ -4269,29 +4228,29 @@ proc decodeString*(t: typedesc[ValidatorIdent],
ok(ValidatorIdent(kind: ValidatorQueryKind.Index,
index: RestValidatorIndex(res)))

proc decodeString*(t: typedesc[PeerId],
func decodeString*(t: typedesc[PeerId],
value: string): Result[PeerId, cstring] =
PeerId.init(value)

proc decodeString*(t: typedesc[CommitteeIndex],
func decodeString*(t: typedesc[CommitteeIndex],
value: string): Result[CommitteeIndex, cstring] =
let res = ? Base10.decode(uint64, value)
CommitteeIndex.init(res)

proc decodeString*(t: typedesc[SyncSubcommitteeIndex],
func decodeString*(t: typedesc[SyncSubcommitteeIndex],
value: string): Result[SyncSubcommitteeIndex, cstring] =
let res = ? Base10.decode(uint64, value)
SyncSubcommitteeIndex.init(res)

proc decodeString*(t: typedesc[Eth2Digest],
func decodeString*(t: typedesc[Eth2Digest],
value: string): Result[Eth2Digest, cstring] =
if len(value) != RootHashSize + 2:
return err("Incorrect root value length")
if value[0] != '0' and value[1] != 'x':
return err("Incorrect root value encoding")
parseRoot(value)

proc decodeString*(t: typedesc[ValidatorFilter],
func decodeString*(t: typedesc[ValidatorFilter],
value: string): Result[ValidatorFilter, cstring] =
case value
of "pending_initialized":
Expand Down Expand Up @@ -4336,14 +4295,16 @@ proc decodeString*(t: typedesc[ValidatorFilter],
else:
err("Incorrect validator state identifier value")

proc decodeString*(t: typedesc[ConsensusFork],
func decodeString*(t: typedesc[ConsensusFork],
value: string): Result[ConsensusFork, cstring] =
static: doAssert ConsensusFork.high == ConsensusFork.Electra
case toLowerAscii(value)
of "phase0": ok(ConsensusFork.Phase0)
of "altair": ok(ConsensusFork.Altair)
of "bellatrix": ok(ConsensusFork.Bellatrix)
of "capella": ok(ConsensusFork.Capella)
of "deneb": ok(ConsensusFork.Deneb)
of "electra": ok(ConsensusFork.Electra)
else: err("Unsupported or invalid beacon block fork version")

proc decodeString*(t: typedesc[EventBeaconBlockObject],
Expand Down

0 comments on commit 72b5c2b

Please sign in to comment.