From df0bb13b97231b72ff0aaa7d5fb86aea12328ef9 Mon Sep 17 00:00:00 2001 From: cheatfate Date: Tue, 1 Apr 2025 14:46:52 +0300 Subject: [PATCH 1/3] Disable strict requirement for `eth-consensus-version` header for Deneb fork. --- .../spec/eth2_apis/eth2_rest_serialization.nim | 14 ++++++++++---- beacon_chain/validators/beacon_validators.nim | 6 +++--- beacon_chain/validators/message_router_mev.nim | 6 +++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim index 0660033c54..938b99812e 100644 --- a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim +++ b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim @@ -3282,15 +3282,21 @@ proc decodeBytesJsonOrSsz*( T: typedesc[MevDecodeTypes], data: openArray[byte], contentType: Opt[ContentTypeData], - version: string + version: string, + strictDecode: bool = false ): Result[T, RestErrorMessage] = var res {.noinit.}: T let typeFork = kind(typeof(res.data)) - consensusFork = ConsensusFork.decodeString(version).valueOr: - return err(RestErrorMessage.init(Http400, UnableDecodeVersionError, - [version, $error])) + consensusFork = + if strictDecode: + ConsensusFork.decodeString(version).valueOr: + return err(RestErrorMessage.init(Http400, UnableDecodeVersionError, + [version, $error])) + else: + typeFork + if typeFork != consensusFork: return err( RestErrorMessage.init(Http400, UnexpectedForkVersionError, diff --git a/beacon_chain/validators/beacon_validators.nim b/beacon_chain/validators/beacon_validators.nim index e5453eb850..3ad85fece9 100644 --- a/beacon_chain/validators/beacon_validators.nim +++ b/beacon_chain/validators/beacon_validators.nim @@ -648,7 +648,7 @@ proc getBlindedExecutionPayload[ res = decodeBytesJsonOrSsz( GetHeaderResponseDeneb, response.data, response.contentType, - response.headers.getString("eth-consensus-version")) + response.headers.getString("eth-consensus-version"), false) blindedHeader = res.valueOr: return err( @@ -665,7 +665,7 @@ proc getBlindedExecutionPayload[ res = decodeBytesJsonOrSsz( GetHeaderResponseElectra, response.data, response.contentType, - response.headers.getString("eth-consensus-version")) + response.headers.getString("eth-consensus-version"), true) blindedHeader = res.valueOr: return err( @@ -684,7 +684,7 @@ proc getBlindedExecutionPayload[ res = decodeBytesJsonOrSsz( GetHeaderResponseFulu, response.data, response.contentType, - response.headers.getString("eth-consensus-version")) + response.headers.getString("eth-consensus-version"), true) blindedHeader = res.valueOr: return err( diff --git a/beacon_chain/validators/message_router_mev.nim b/beacon_chain/validators/message_router_mev.nim index b6bf3951cc..8596d83c23 100644 --- a/beacon_chain/validators/message_router_mev.nim +++ b/beacon_chain/validators/message_router_mev.nim @@ -89,15 +89,15 @@ proc unblindAndRouteBlockMEV*( when blindedBlock is deneb_mev.SignedBlindedBeaconBlock: let res = decodeBytesJsonOrSsz( SubmitBlindedBlockResponseDeneb, response.data, response.contentType, - response.headers.getString("eth-consensus-version")) + response.headers.getString("eth-consensus-version"), false) elif blindedBlock is electra_mev.SignedBlindedBeaconBlock: let res = decodeBytesJsonOrSsz( SubmitBlindedBlockResponseElectra, response.data, response.contentType, - response.headers.getString("eth-consensus-version")) + response.headers.getString("eth-consensus-version"), true) elif blindedBlock is fulu_mev.SignedBlindedBeaconBlock: let res = decodeBytesJsonOrSsz( SubmitBlindedBlockResponseFulu, response.data, response.contentType, - response.headers.getString("eth-consensus-version")) + response.headers.getString("eth-consensus-version"), true) else: static: doAssert false From 26043cc96118959908a6824cc9506c1fe210ad8f Mon Sep 17 00:00:00 2001 From: cheatfate Date: Wed, 2 Apr 2025 06:53:55 +0300 Subject: [PATCH 2/3] Making it working with weird specification requirements, with `eth-consensus-version` is not required for JSON responses. --- .../eth2_apis/eth2_rest_serialization.nim | 31 ++++++++----------- beacon_chain/validators/beacon_validators.nim | 6 ++-- .../validators/message_router_mev.nim | 6 ++-- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim index 938b99812e..47c1a1f984 100644 --- a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim +++ b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim @@ -3282,26 +3282,10 @@ proc decodeBytesJsonOrSsz*( T: typedesc[MevDecodeTypes], data: openArray[byte], contentType: Opt[ContentTypeData], - version: string, - strictDecode: bool = false + version: string ): Result[T, RestErrorMessage] = var res {.noinit.}: T - - let - typeFork = kind(typeof(res.data)) - consensusFork = - if strictDecode: - ConsensusFork.decodeString(version).valueOr: - return err(RestErrorMessage.init(Http400, UnableDecodeVersionError, - [version, $error])) - else: - typeFork - - if typeFork != consensusFork: - return err( - RestErrorMessage.init(Http400, UnexpectedForkVersionError, - ["eth-consensus-version", consensusFork.toString(), - typeFork.toString()])) + let typeFork = kind(typeof(res.data)) if contentType == ApplicationJsonMediaType: res = @@ -3327,6 +3311,17 @@ proc decodeBytesJsonOrSsz*( typeFork.toString()])) ok(res) elif contentType == OctetStreamMediaType: + let consensusFork = + ConsensusFork.decodeString(version).valueOr: + return err(RestErrorMessage.init(Http400, UnableDecodeVersionError, + [version, $error])) + if typeFork != consensusFork: + return err( + RestErrorMessage.init( + Http400, UnexpectedForkVersionError, + ["eth-consensus-version", consensusFork.toString(), + typeFork.toString()])) + ok(T( version: newJString(typeFork.toString()), data: diff --git a/beacon_chain/validators/beacon_validators.nim b/beacon_chain/validators/beacon_validators.nim index 3ad85fece9..e5453eb850 100644 --- a/beacon_chain/validators/beacon_validators.nim +++ b/beacon_chain/validators/beacon_validators.nim @@ -648,7 +648,7 @@ proc getBlindedExecutionPayload[ res = decodeBytesJsonOrSsz( GetHeaderResponseDeneb, response.data, response.contentType, - response.headers.getString("eth-consensus-version"), false) + response.headers.getString("eth-consensus-version")) blindedHeader = res.valueOr: return err( @@ -665,7 +665,7 @@ proc getBlindedExecutionPayload[ res = decodeBytesJsonOrSsz( GetHeaderResponseElectra, response.data, response.contentType, - response.headers.getString("eth-consensus-version"), true) + response.headers.getString("eth-consensus-version")) blindedHeader = res.valueOr: return err( @@ -684,7 +684,7 @@ proc getBlindedExecutionPayload[ res = decodeBytesJsonOrSsz( GetHeaderResponseFulu, response.data, response.contentType, - response.headers.getString("eth-consensus-version"), true) + response.headers.getString("eth-consensus-version")) blindedHeader = res.valueOr: return err( diff --git a/beacon_chain/validators/message_router_mev.nim b/beacon_chain/validators/message_router_mev.nim index 8596d83c23..b6bf3951cc 100644 --- a/beacon_chain/validators/message_router_mev.nim +++ b/beacon_chain/validators/message_router_mev.nim @@ -89,15 +89,15 @@ proc unblindAndRouteBlockMEV*( when blindedBlock is deneb_mev.SignedBlindedBeaconBlock: let res = decodeBytesJsonOrSsz( SubmitBlindedBlockResponseDeneb, response.data, response.contentType, - response.headers.getString("eth-consensus-version"), false) + response.headers.getString("eth-consensus-version")) elif blindedBlock is electra_mev.SignedBlindedBeaconBlock: let res = decodeBytesJsonOrSsz( SubmitBlindedBlockResponseElectra, response.data, response.contentType, - response.headers.getString("eth-consensus-version"), true) + response.headers.getString("eth-consensus-version")) elif blindedBlock is fulu_mev.SignedBlindedBeaconBlock: let res = decodeBytesJsonOrSsz( SubmitBlindedBlockResponseFulu, response.data, response.contentType, - response.headers.getString("eth-consensus-version"), true) + response.headers.getString("eth-consensus-version")) else: static: doAssert false From 55e479bc6373c1a98dbe1492b3d339cedec10a0a Mon Sep 17 00:00:00 2001 From: cheatfate Date: Wed, 2 Apr 2025 07:34:05 +0300 Subject: [PATCH 3/3] Address review comments. --- beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim index 47c1a1f984..79999d8616 100644 --- a/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim +++ b/beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim @@ -3285,7 +3285,7 @@ proc decodeBytesJsonOrSsz*( version: string ): Result[T, RestErrorMessage] = var res {.noinit.}: T - let typeFork = kind(typeof(res.data)) + const typeFork = kind(typeof(res.data)) if contentType == ApplicationJsonMediaType: res =