-
Notifications
You must be signed in to change notification settings - Fork 140
Description
With ethereum/builder-specs#104 accepted to the spec, we should update with the required changes.
Note that I'm not overly familiar with the relay codebase, so take all of the below with a grain of salt, but this is my proposed set of changes:
Overall Goal
So to reiterate the above builder-spec PR, the goal is to support SSZ for these endpoints in a backwards compatible way:
- before SSZ support lands, the relay should return appropriate 4xx error codes
getHeadershould allow SSZ encoding of the response.submitBlindedBlockshould allow both SSZ requests and responses.
Milestone 0: Housekeeping (GetPayload vs SubmitBlindedBlock)
When researching the required changes, one thing that threw me off is that the builder-spec refers to the /eth/v1/builder/blinded_blocks endpoint as the submitBlindedBlock operation here: https://github.com/ethereum/builder-specs/blob/main/apis/builder/blinded_blocks.yaml#L2
However the mev-boost-relay codebase uses the term getPayload for that operation. IMO we should consider updating the code to use submitBlindedBlock instead. However, the term "Get Payload" is used in DB schemas and metrics, so this might not be practical.
Milestone 1: Explicitly reject SSZ
Accept header parsing
So, the first step is IMO to parse the suggested Accept header, and explicitly reject any that resolve to anything other than application/json.
The logic should largely involve:
- Update
handleGetHeaderandhandleGetPayload(orhandleSubmitBlindedBlockif milestone 0 occurs) to parse theAcceptheader. - Be sure to handle the weighted case as outlined at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept
- If the
Acceptheader does not containapplication/json(at any weight) then return status 406 as outlined here: https://github.com/ethereum/builder-specs/blob/main/types/http.yaml#L24
Content-Type parsing
Next, the handleGetPayload/handleSubmitBlindedBlock handler should correctly reject SSZ (or any non-JSON Content-Type):
- If Content-Type is omitted, assume JSON.
- If Content-Type is included but contains any value other than
application/jsonthe endpoint should return a 415 as outlined here: https://github.com/ethereum/builder-specs/blob/main/types/http.yaml#L47
The above is the minimal change required to be "in spec" with the SSZ updates, but of course we should continue on to actually supporting SSZ.
Milestone 2: SSZ Support
With Milestone 1 in place, we can go forward with actually supporting SSZ, which would entail:
In handleGetPayload:
- Allowing
application/octet-streamin theContent-Typeheader. - Requiring the
Eth-Consensus-Versionheader ifContent-Type: application/octet-streamis included. - Decode the payload as either SSZ or JSON based on the
Content-Typeheader.
And in both handleGetHeader and handleGetPayload:
- Allow
application/octet-streamin theAcceptheader. - Add a new
RespondWithContentTypeor similarly named method that can respond w/ both JSON and SSZ, use this instead ofRespondOK(RespondErrorand continue to only send JSON).
Also note that Milestone 2 must be deployed atomically since allowing Accept: octet-stream in the handleGetPayload handlers is how relays signal that they support SSZ for both endpoints.