2626 jsonSerializationResults, rest_keymanager_types
2727
2828from web3/ primitives import Hash32 , Quantity
29+ from json import getStr, newJString
2930export primitives.Hash32 , primitives.Quantity
3031
3132func decodeMediaType * (
@@ -82,8 +83,6 @@ RestJson.useDefaultSerializationFor(
8283 GetForkChoiceResponse ,
8384 GetForkScheduleResponse ,
8485 GetGenesisResponse ,
85- GetHeaderResponseDeneb ,
86- GetHeaderResponseElectra ,
8786 GetKeystoresResponse ,
8887 GetNextWithdrawalsResponse ,
8988 GetPoolAttesterSlashingsResponse ,
@@ -168,8 +167,6 @@ RestJson.useDefaultSerializationFor(
168167 SignedContributionAndProof ,
169168 SignedValidatorRegistrationV1 ,
170169 SignedVoluntaryExit ,
171- SubmitBlindedBlockResponseDeneb ,
172- SubmitBlindedBlockResponseElectra ,
173170 SyncAggregate ,
174171 SyncAggregatorSelectionData ,
175172 SyncCommittee ,
@@ -341,6 +338,8 @@ const
341338 UnableDecodeVersionError = " Unable to decode version"
342339 UnableDecodeError = " Unable to decode data"
343340 UnexpectedDecodeError = " Unexpected decoding error"
341+ InvalidContentTypeError * = " Invalid content type"
342+ UnexpectedForkVersionError * = " Unexpected fork version received"
344343
345344type
346345 EncodeTypes * =
356355 SetGasLimitRequest |
357356 bellatrix_mev.SignedBlindedBeaconBlock |
358357 capella_mev.SignedBlindedBeaconBlock |
359- deneb_mev.SignedBlindedBeaconBlock |
360- electra_mev.SignedBlindedBeaconBlock |
361- fulu_mev.SignedBlindedBeaconBlock |
362358 phase0.AttesterSlashing |
363359 SignedValidatorRegistrationV1 |
364360 SignedVoluntaryExit |
@@ -374,7 +370,10 @@ type
374370 DenebSignedBlockContents |
375371 ElectraSignedBlockContents |
376372 FuluSignedBlockContents |
377- ForkedMaybeBlindedBeaconBlock
373+ ForkedMaybeBlindedBeaconBlock |
374+ deneb_mev.SignedBlindedBeaconBlock |
375+ electra_mev.SignedBlindedBeaconBlock |
376+ fulu_mev.SignedBlindedBeaconBlock
378377
379378 EncodeArrays * =
380379 seq [phase0.Attestation ] |
@@ -392,6 +391,14 @@ type
392391 seq [RestBeaconCommitteeSelection ] |
393392 seq [RestSyncCommitteeSelection ]
394393
394+ MevDecodeTypes * =
395+ GetHeaderResponseDeneb |
396+ GetHeaderResponseElectra |
397+ GetHeaderResponseFulu |
398+ SubmitBlindedBlockResponseDeneb |
399+ SubmitBlindedBlockResponseElectra |
400+ SubmitBlindedBlockResponseFulu
401+
395402 DecodeTypes * =
396403 DataEnclosedObject |
397404 DataMetaEnclosedObject |
@@ -3266,11 +3273,67 @@ proc decodeBodyJsonOrSsz*(
32663273 return err (
32673274 RestErrorMessage .init (Http400 , UnableDecodeError ,
32683275 [exc.formatMsg (" <data>" )]))
3269- ok (data.toSeq )
3276+ ok (data.asSeq )
32703277 else :
32713278 err (RestErrorMessage .init (Http415 , InvalidContentTypeError ,
32723279 [$ body.contentType]))
32733280
3281+ proc decodeBytesJsonOrSsz * (
3282+ T: typedesc [MevDecodeTypes ],
3283+ data: openArray [byte ],
3284+ contentType: Opt [ContentTypeData ],
3285+ version: string
3286+ ): Result [T, RestErrorMessage ] =
3287+ var res {.noinit .}: T
3288+
3289+ let
3290+ typeFork = kind (typeof (res.data))
3291+ consensusFork = ConsensusFork .decodeString (version).valueOr:
3292+ return err (RestErrorMessage .init (Http400 , UnableDecodeVersionError ,
3293+ [version, $ error]))
3294+ if typeFork != consensusFork:
3295+ return err (
3296+ RestErrorMessage .init (Http400 , UnexpectedForkVersionError ,
3297+ [" eth-consensus-version" , consensusFork.toString (),
3298+ typeFork.toString ()]))
3299+
3300+ if contentType == ApplicationJsonMediaType :
3301+ res =
3302+ try :
3303+ RestJson .decode (
3304+ data,
3305+ T,
3306+ requireAllFields = true ,
3307+ allowUnknownFields = true )
3308+ except SerializationError as exc:
3309+ debug " Failed to deserialize REST JSON data" ,
3310+ err = exc.formatMsg (" <data>" )
3311+ return err (
3312+ RestErrorMessage .init (Http400 , UnableDecodeError ,
3313+ [exc.formatMsg (" <data>" )]))
3314+ let jsonFork = ConsensusFork .decodeString (res.version.getStr ()).valueOr:
3315+ return err (RestErrorMessage .init (Http400 , UnableDecodeVersionError ,
3316+ [res.version.getStr (), $ error]))
3317+ if typeFork != jsonFork:
3318+ return err (
3319+ RestErrorMessage .init (Http400 , UnexpectedForkVersionError ,
3320+ [" json-version" , res.version.getStr (),
3321+ typeFork.toString ()]))
3322+ ok (res)
3323+ elif contentType == OctetStreamMediaType :
3324+ ok (T (
3325+ version: newJString (typeFork.toString ()),
3326+ data:
3327+ try :
3328+ SSZ .decode (data, typeof (res.data))
3329+ except SerializationError as exc:
3330+ return err (
3331+ RestErrorMessage .init (Http400 , UnableDecodeError ,
3332+ [exc.formatMsg (" <data>" )]))))
3333+ else :
3334+ err (RestErrorMessage .init (Http415 , InvalidContentTypeError ,
3335+ [$ contentType]))
3336+
32743337proc decodeBody * [T](t: typedesc [T],
32753338 body: ContentBody ): Result [T, cstring ] =
32763339 if body.contentType != ApplicationJsonMediaType :
@@ -3324,6 +3387,31 @@ proc decodeBodyJsonOrSsz*[T](t: typedesc[T],
33243387 err (RestErrorMessage .init (Http415 , InvalidContentTypeError ,
33253388 [$ body.contentType]))
33263389
3390+ proc encodeBytes * (value: seq [SignedValidatorRegistrationV1 ],
3391+ contentType: string ): RestResult [seq [byte ]] =
3392+ case contentType
3393+ of " application/json" :
3394+ try :
3395+ var
3396+ stream = memoryOutput ()
3397+ writer = JsonWriter [RestJson ].init (stream)
3398+ writer.writeArray (value)
3399+ ok (stream.getOutput (seq [byte ]))
3400+ except IOError :
3401+ return err (" Input/output error" )
3402+ except SerializationError :
3403+ return err (" Serialization error" )
3404+ of " application/octet-stream" :
3405+ try :
3406+ ok (SSZ .encode (
3407+ init (
3408+ List [SignedValidatorRegistrationV1 , Limit VALIDATOR_REGISTRY_LIMIT ],
3409+ value)))
3410+ except SerializationError :
3411+ return err (" Serialization error" )
3412+ else :
3413+ err (" Content-Type not supported" )
3414+
33273415proc encodeBytes * [T: EncodeTypes ](value: T,
33283416 contentType: string ): RestResult [seq [byte ]] =
33293417 case contentType
@@ -3363,29 +3451,26 @@ proc encodeBytes*[T: EncodeArrays](value: T,
33633451 err (" Content-Type not supported" )
33643452
33653453proc encodeBytes * [T: EncodeOctetTypes ](
3366- value: T,
3367- contentType: string
3368- ): RestResult [seq [byte ]] =
3454+ value: T,
3455+ contentType: string
3456+ ): RestResult [seq [byte ]] =
33693457 case contentType
33703458 of " application/json" :
3371- let data =
3372- try :
3373- var stream = memoryOutput ()
3374- var writer = JsonWriter [RestJson ].init (stream)
3375- writer.writeValue (value)
3376- stream.getOutput (seq [byte ])
3377- except IOError :
3378- return err (" Input/output error" )
3379- except SerializationError :
3380- return err (" Serialization error" )
3381- ok (data)
3459+ try :
3460+ var
3461+ stream = memoryOutput ()
3462+ writer = JsonWriter [RestJson ].init (stream)
3463+ writer.writeValue (value)
3464+ ok (stream.getOutput (seq [byte ]))
3465+ except IOError :
3466+ err (" Input/output error" )
3467+ except SerializationError :
3468+ err (" Serialization error" )
33823469 of " application/octet-stream" :
3383- let data =
3384- try :
3385- SSZ .encode (value)
3386- except CatchableError :
3387- return err (" Serialization error" )
3388- ok (data)
3470+ try :
3471+ ok (SSZ .encode (value))
3472+ except CatchableError :
3473+ err (" Serialization error" )
33893474 else :
33903475 err (" Content-Type not supported" )
33913476
0 commit comments