Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions beacon_chain/conf.nim
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,11 @@ type
defaultValue: ""
name: "payload-builder-url" .}: string

payloadBuilderGetBidTimeout* {.
desc: "Payload builder get bid request timeout in milliseconds"
defaultValue: 1000
name: "payload-builder-get-bid-timeout" .}: uint32

# Flag name and semantics borrowed from Prysm
# https://github.com/prysmaticlabs/prysm/pull/12227/files
localBlockValueBoost* {.
Expand Down
3 changes: 2 additions & 1 deletion beacon_chain/spec/eth2_apis/eth2_rest_serialization.nim
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ type
seq[RestSyncCommitteeSelection]

MevDecodeTypes* =
GetHeaderResponseFulu
GetHeaderResponseFulu |
GetExecutionPayloadBidResponseGloas

DecodeTypes* =
DataEnclosedObject |
Expand Down
1 change: 1 addition & 0 deletions beacon_chain/spec/eth2_apis/rest_types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,7 @@ type
SubmitBeaconCommitteeSelectionsResponse* = DataEnclosedObject[seq[RestBeaconCommitteeSelection]]
SubmitSyncCommitteeSelectionsResponse* = DataEnclosedObject[seq[RestSyncCommitteeSelection]]
GetHeaderResponseFulu* = DataVersionEnclosedObject[fulu_mev.SignedBuilderBid]
GetExecutionPayloadBidResponseGloas* = DataVersionEnclosedObject[gloas.SignedExecutionPayloadBid]

RestNodeValidity* {.pure.} = enum
valid = "VALID",
Expand Down
4 changes: 3 additions & 1 deletion beacon_chain/spec/forks.nim
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,7 @@ template kind*(
gloas.TrustedBeaconBlockBody |
gloas.SigVerifiedSignedBeaconBlock |
gloas.TrustedSignedBeaconBlock |
gloas.SignedExecutionPayloadBid |
gloas.AggregateAndProof]): ConsensusFork =
ConsensusFork.Gloas

Expand All @@ -552,7 +553,8 @@ template kind*(
heze.SigVerifiedBeaconBlockBody |
heze.TrustedBeaconBlockBody |
heze.SigVerifiedSignedBeaconBlock |
heze.TrustedSignedBeaconBlock]): ConsensusFork =
heze.TrustedSignedBeaconBlock |
heze.SignedExecutionPayloadBid]): ConsensusFork =
ConsensusFork.Heze

template BeaconState*(kind: static ConsensusFork): typedesc =
Expand Down
14 changes: 10 additions & 4 deletions beacon_chain/spec/mev/rest_mev_calls.nim
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ proc getExecutionPayloadBidPlain*(
rest, endpoint:
"/eth/v1/builder/execution_payload_bid/{slot}/{parent_hash}/{parent_root}/{proposer_pubkey}",
meth: MethodPost, connection: {Dedicated, Close}.}
## https://github.com/ethereum/builder-specs/blob/78a5546d9d8253beabf7db8baf988a58abdec87f/apis/builder/execution_payload_bid.yaml
## https://github.com/ethereum/builder-specs/blob/38f11441c194d150386f567b4d7087ec86d4118c/apis/builder/execution_payload_bid.yaml

proc getExecutionPayloadBid*(
client: RestClientRef,
Expand All @@ -66,14 +66,20 @@ proc getExecutionPayloadBid*(
parent_root: Eth2Digest,
proposer_pubkey: ValidatorPubKey,
consensus_version: ConsensusFork,
body: SignedBuilderRequestAuth
req_started_at: Moment,
timeout_ms: Duration,
body: SignedBuilderRequestAuth,
): Future[RestPlainResponse] {.
async: (raises: [CancelledError, RestEncodingError, RestDnsResolveError,
RestCommunicationError], raw: true).} =
client.getExecutionPayloadBidPlain(
slot, parent_hash, parent_root, proposer_pubkey, body,
restAcceptType = "application/octet-stream",
extraHeaders = @[("eth-consensus-version", toString(consensus_version))]
restAcceptType = "application/octet-stream,application/json;q=0.5",
extraHeaders = @[
("eth-consensus-version", toString(consensus_version)),
("date-milliseconds", $req_started_at.epochNanoSeconds().nanoseconds().milliseconds()),
("x-timeout-ms", $timeout_ms.milliseconds())
]
)

proc submitBlindedBlockV2Plain*(
Expand Down
53 changes: 32 additions & 21 deletions beacon_chain/validators/block_payloads.nim
Original file line number Diff line number Diff line change
Expand Up @@ -470,14 +470,16 @@ proc makeSignedRequestAuth*(
message: msg,
signature: sig))

# https://github.com/ethereum/builder-specs/blob/78a5546d9d8253beabf7db8baf988a58abdec87f/apis/builder/execution_payload_bid.yaml
# https://github.com/ethereum/builder-specs/blob/38f11441c194d150386f567b4d7087ec86d4118c/apis/builder/execution_payload_bid.yaml
proc getExecutionPayloadBidFromBuilder*(
payloadBuilderClient: RestClientRef,
slot: Slot,
parent_hash: Eth2Digest,
parent_root: Eth2Digest,
proposer_pubkey: ValidatorPubKey,
consensus_version: ConsensusFork,
req_started_at: Moment,
timeout_ms: Duration,
request_auth: SignedBuilderRequestAuth,
): Future[Result[gloas.SignedExecutionPayloadBid, string]] {.
async: (raises: [CancelledError]).} =
Expand All @@ -488,7 +490,7 @@ proc getExecutionPayloadBidFromBuilder*(
try:
await payloadBuilderClient.getExecutionPayloadBid(
slot, parent_hash, parent_root, proposer_pubkey,
consensus_version, request_auth)
consensus_version, req_started_at, timeout_ms, request_auth)
except RestDecodingError as exc:
return err("getExecutionPayloadBid REST decoding error: " & exc.msg)
except RestError as exc:
Expand All @@ -499,12 +501,19 @@ proc getExecutionPayloadBidFromBuilder*(
if response.status != 200:
return err("getExecutionPayloadBid: HTTP error " & $response.status)

let bid =
try:
SSZ.decode(response.data, gloas.SignedExecutionPayloadBid)
except SerializationError as exc:
return err("getExecutionPayloadBid SSZ decode error: " & exc.msg)
ok(bid)
debugHezeComment("")
let res = decodeBytesJsonOrSsz(
GetExecutionPayloadBidResponseGloas,
response.data,
response.contentType,
response.headers.getString("eth-consensus-version"),
).valueOr:
return err(
"Unable to decode bid response from builder: " & $error & " with HTTP status " &
$response.status & ", Content-Type " & $response.contentType & " and content " &
$response.data
)
ok(res.data)

proc getBuilderExecutionPayloadBid*(
node: BeaconNode,
Expand All @@ -518,20 +527,22 @@ proc getBuilderExecutionPayloadBid*(
): Future[Opt[gloas.SignedExecutionPayloadBid]] {.
async: (raises: [CancelledError]).} =
let
requestAuth = block:
let builderUrl = node.getPayloadBuilderAddress(proposer.pubkey).valueOr:
return Opt.none(gloas.SignedExecutionPayloadBid)
(await makeSignedRequestAuth(
proposer, builderUrl, slot,
node.dag.cfg.GENESIS_FORK_VERSION)).valueOr:
return Opt.none(gloas.SignedExecutionPayloadBid)
builderUrl = node.getPayloadBuilderAddress(proposer.pubkey).valueOr:
return Opt.none(gloas.SignedExecutionPayloadBid)
requestAuth = (await makeSignedRequestAuth(
proposer, builderUrl, slot,
node.dag.cfg.GENESIS_FORK_VERSION)).valueOr:
return Opt.none(gloas.SignedExecutionPayloadBid)
timeoutMs = node.config.payloadBuilderGetBidTimeout.milliseconds
reqStartedAt = Moment.now()
bidRes = awaitWithTimeout(
getExecutionPayloadBidFromBuilder(
payloadBuilderClient, slot, parent_block_hash, parent_block_root,
proposer.pubkey, node.dag.cfg.consensusForkAtEpoch(slot.epoch()),
requestAuth),
BUILDER_PROPOSAL_DELAY_TOLERANCE):
return Opt.none(gloas.SignedExecutionPayloadBid)
getExecutionPayloadBidFromBuilder(
payloadBuilderClient, slot, parent_block_hash, parent_block_root,
proposer.pubkey, node.dag.cfg.consensusForkAtEpoch(slot.epoch()),
reqStartedAt, timeoutMs, requestAuth),
timeoutMs):
debug "Builder-API execution payload bid request timeout", builderUrl, slot
return Opt.none(gloas.SignedExecutionPayloadBid)

signedBid = bidRes.valueOr:
debug "No builder-API execution payload bid", slot, err = error
Expand Down
1 change: 1 addition & 0 deletions docs/the_nimbus_book/src/options.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ The following options are available:
--suggested-gas-limit Suggested gas limit [=60000000].
--payload-builder Enable external payload builder [=false].
--payload-builder-url Payload builder URL.
--payload-builder-get-bid-timeout Payload builder get bid request timeout in milliseconds [=1000].
--local-block-value-boost Increase execution layer block values for builder bid comparison by a percentage
[=10].
--history Retention strategy for historical data (archive/prune) [=prune].
Expand Down
Loading