consistently use SignedBlindedBeaconBlockContents; remove more Bellatrix Builder API remnants (#5493)

This commit is contained in:
tersec 2023-10-11 11:48:35 +00:00 committed by GitHub
parent 48197e4d55
commit edc5c03230
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 35 deletions

View File

@ -994,16 +994,16 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
case currentEpochFork
of ConsensusFork.Deneb:
let
restBlock = decodeBodyJsonOrSsz(deneb_mev.SignedBlindedBeaconBlock,
body).valueOr:
restBlockContents = decodeBodyJsonOrSsz(deneb_mev.SignedBlindedBeaconBlockContents,
body).valueOr:
return RestApiResponse.jsonError(error)
payloadBuilderClient = node.getPayloadBuilderClient(
restBlock.message.proposer_index).valueOr:
restBlockContents.signed_blinded_block.message.proposer_index).valueOr:
return RestApiResponse.jsonError(
Http400, "Unable to initialize payload builder client: " & $error)
res = await node.unblindAndRouteBlockMEV(
payloadBuilderClient, restBlock)
payloadBuilderClient, restBlockContents)
if res.isErr():
return RestApiResponse.jsonError(

View File

@ -119,3 +119,10 @@ func shortLog*(v: SignedBlindedBeaconBlock): auto =
blck: shortLog(v.message),
signature: shortLog(v.signature)
)
# needs to match SignedBlindedBeaconBlock
func shortLog*(v: SignedBlindedBeaconBlockContents): auto =
(
blck: shortLog(v.signed_blinded_block.message),
signature: shortLog(v.signed_blinded_block.signature)
)

View File

@ -15,7 +15,7 @@
import
# Standard library
std/[os, tables, sequtils],
std/[os, tables],
# Nimble packages
stew/[assign2, byteutils],
@ -41,8 +41,9 @@ import
".."/[conf, beacon_clock, beacon_node],
"."/[
keystore_management, slashing_protection, validator_duties, validator_pool],
".."/spec/mev/rest_capella_mev_calls
".."/spec/mev/[rest_capella_mev_calls, rest_deneb_mev_calls]
from std/sequtils import mapIt
from eth/async_utils import awaitWithTimeout
const
@ -563,25 +564,20 @@ proc makeBeaconBlockForHeadAndSlot*(
withdrawals_root = Opt.none(Eth2Digest))
proc getBlindedExecutionPayload[
EPH: bellatrix.ExecutionPayloadHeader | capella.ExecutionPayloadHeader |
deneb.ExecutionPayloadHeader](
EPH: capella.ExecutionPayloadHeader | deneb.ExecutionPayloadHeader](
node: BeaconNode, payloadBuilderClient: RestClientRef, slot: Slot,
executionBlockRoot: Eth2Digest, pubkey: ValidatorPubKey):
Future[BlindedBlockResult[EPH]] {.async.} =
when EPH is deneb.ExecutionPayloadHeader:
let blindedHeader = default(RestResponse[GetHeaderResponseDeneb])
debugRaiseAssert $denebImplementationMissing &
": makeBlindedBeaconBlockForHeadAndSlot"
let blindedHeader = awaitWithTimeout(
payloadBuilderClient.getHeaderDeneb(slot, executionBlockRoot, pubkey),
BUILDER_PROPOSAL_DELAY_TOLERANCE):
return err "Timeout obtaining Deneb blinded header from builder"
elif EPH is capella.ExecutionPayloadHeader:
let blindedHeader = awaitWithTimeout(
payloadBuilderClient.getHeaderCapella(slot, executionBlockRoot, pubkey),
BUILDER_PROPOSAL_DELAY_TOLERANCE):
return err "Timeout obtaining Capella blinded header from builder"
elif EPH is bellatrix.ExecutionPayloadHeader:
let blindedHeader = awaitWithTimeout(
payloadBuilderClient.getHeaderBellatrix(slot, executionBlockRoot, pubkey),
BUILDER_PROPOSAL_DELAY_TOLERANCE):
return err "Timeout obtaining Bellatrix blinded header from builder"
else:
static: doAssert false
@ -636,7 +632,7 @@ func constructPlainBlindedBlock[
blindedBlock
proc blindedBlockCheckSlashingAndSign[T](
proc blindedBlockCheckSlashingAndSign[T: capella_mev.SignedBlindedBeaconBlock](
node: BeaconNode, slot: Slot, validator: AttachedValidator,
validator_index: ValidatorIndex, nonsignedBlindedBlock: T):
Future[Result[T, string]] {.async.} =
@ -671,19 +667,25 @@ proc blindedBlockCheckSlashingAndSign[T](
return ok blindedBlock
proc blindedBlockCheckSlashingAndSign[
T: deneb_mev.SignedBlindedBeaconBlockContents](
node: BeaconNode, slot: Slot, validator: AttachedValidator,
validator_index: ValidatorIndex, nonsignedBlindedBlock: T):
Future[Result[T, string]] {.async.} =
debugRaiseAssert $denebImplementationMissing
proc getUnsignedBlindedBeaconBlock[
T: capella_mev.SignedBlindedBeaconBlock |
deneb_mev.SignedBlindedBeaconBlock](
node: BeaconNode, slot: Slot, validator: AttachedValidator,
validator_index: ValidatorIndex, forkedBlock: ForkedBeaconBlock,
executionPayloadHeader: bellatrix.ExecutionPayloadHeader |
capella.ExecutionPayloadHeader |
executionPayloadHeader: capella.ExecutionPayloadHeader |
deneb.ExecutionPayloadHeader): Result[T, string] =
withBlck(forkedBlock):
when consensusFork >= ConsensusFork.Deneb:
debugRaiseAssert $denebImplementationMissing & ": getUnsignedBlindedBeaconBlock"
return err("getUnsignedBlindedBeaconBlock: Deneb blinded block creation not implemented")
elif consensusFork >= ConsensusFork.Bellatrix:
elif consensusFork >= ConsensusFork.Capella:
when not (
(T is capella_mev.SignedBlindedBeaconBlock and
consensusFork == ConsensusFork.Capella)):
@ -692,7 +694,7 @@ proc getUnsignedBlindedBeaconBlock[
return ok constructSignableBlindedBlock[T](
forkyBlck, executionPayloadHeader)
else:
return err("getUnsignedBlindedBeaconBlock: attempt to construct pre-Bellatrix blinded block")
return err("getUnsignedBlindedBeaconBlock: attempt to construct pre-Capella blinded block")
proc getBlindedBlockParts[EPH: ForkyExecutionPayloadHeader](
node: BeaconNode, payloadBuilderClient: RestClientRef, head: BlockRef,
@ -772,7 +774,7 @@ proc getBlindedBlockParts[EPH: ForkyExecutionPayloadHeader](
proc getBuilderBid[
SBBB: capella_mev.SignedBlindedBeaconBlock |
deneb_mev.SignedBlindedBeaconBlock](
deneb_mev.SignedBlindedBeaconBlockContents](
node: BeaconNode, payloadBuilderClient: RestClientRef, head: BlockRef,
validator: AttachedValidator, slot: Slot, randao: ValidatorSig,
validator_index: ValidatorIndex):
@ -781,7 +783,7 @@ proc getBuilderBid[
## Used by the BN's own validators, but not the REST server
when SBBB is capella_mev.SignedBlindedBeaconBlock:
type EPH = capella.ExecutionPayloadHeader
elif SBBB is deneb_mev.SignedBlindedBeaconBlock:
elif SBBB is deneb_mev.SignedBlindedBeaconBlockContents:
type EPH = deneb.ExecutionPayloadHeader
else:
static: doAssert false
@ -884,11 +886,9 @@ proc makeBlindedBeaconBlockForHeadAndSlot*[
let (executionPayloadHeader, bidValue, forkedBlck) = blindedBlockParts.get
withBlck(forkedBlck):
when consensusFork >= ConsensusFork.Deneb:
debugRaiseAssert $denebImplementationMissing & ": makeBlindedBeaconBlockForHeadAndSlot"
elif consensusFork >= ConsensusFork.Bellatrix:
when ((consensusFork == ConsensusFork.Bellatrix and
EPH is bellatrix.ExecutionPayloadHeader) or
when consensusFork >= ConsensusFork.Capella:
when ((consensusFork == ConsensusFork.Deneb and
EPH is deneb.ExecutionPayloadHeader) or
(consensusFork == ConsensusFork.Capella and
EPH is capella.ExecutionPayloadHeader)):
return ok (constructPlainBlindedBlock[BBB, EPH](
@ -896,7 +896,7 @@ proc makeBlindedBeaconBlockForHeadAndSlot*[
else:
return err("makeBlindedBeaconBlockForHeadAndSlot: mismatched block/payload types")
else:
return err("Attempt to create pre-Bellatrix blinded block")
return err("Attempt to create pre-Capella blinded block")
proc collectBidFutures(
SBBB: typedesc, EPS: typedesc, node: BeaconNode,
@ -1190,7 +1190,8 @@ proc proposeBlock(node: BeaconNode,
return
if slot.epoch >= node.dag.cfg.DENEB_FORK_EPOCH:
proposeBlockContinuation(
deneb_mev.SignedBlindedBeaconBlock, deneb.ExecutionPayloadForSigning)
deneb_mev.SignedBlindedBeaconBlockContents,
deneb.ExecutionPayloadForSigning)
elif slot.epoch >= node.dag.cfg.CAPELLA_FORK_EPOCH:
proposeBlockContinuation(
capella_mev.SignedBlindedBeaconBlock, capella.ExecutionPayloadForSigning)

View File

@ -16,7 +16,7 @@ from ../spec/datatypes/bellatrix import SignedBeaconBlock
from ../spec/mev/rest_capella_mev_calls import submitBlindedBlock
const
BUILDER_BLOCK_SUBMISSION_DELAY_TOLERANCE = 4.seconds
BUILDER_BLOCK_SUBMISSION_DELAY_TOLERANCE = 5.seconds
declareCounter beacon_block_builder_proposed,
"Number of beacon chain blocks produced using an external block builder"
@ -76,7 +76,7 @@ proc unblindAndRouteBlockMEV*(
else:
# Signature provided is consistent with unblinded execution payload,
# so construct full beacon block
# https://github.com/ethereum/builder-specs/blob/v0.2.0/specs/validator.md#block-proposal
# https://github.com/ethereum/builder-specs/blob/v0.3.0/specs/bellatrix/validator.md#block-proposal
var signedBlock = capella.SignedBeaconBlock(
signature: blindedBlock.signature)
copyFields(
@ -111,17 +111,17 @@ proc unblindAndRouteBlockMEV*(
debug "unblindAndRouteBlockMEV: submitBlindedBlock failed",
blindedBlock, payloadStatus = unblindedPayload.status
# https://github.com/ethereum/builder-specs/blob/v0.2.0/specs/validator.md#proposer-slashing
# https://github.com/ethereum/builder-specs/blob/v0.3.0/specs/bellatrix/validator.md#proposer-slashing
# This means if a validator publishes a signature for a
# `BlindedBeaconBlock` (via a dissemination of a
# `SignedBlindedBeaconBlock`) then the validator **MUST** not use the
# local build process as a fallback, even in the event of some failure
# with the external buildernetwork.
# with the external builder network.
return err("unblindAndRouteBlockMEV error")
# TODO currently cannot be combined into one generic function
proc unblindAndRouteBlockMEV*(
node: BeaconNode, payloadBuilderRestClient: RestClientRef,
blindedBlock: deneb_mev.SignedBlindedBeaconBlock):
blindedBlockContents: deneb_mev.SignedBlindedBeaconBlockContents):
Future[Result[Opt[BlockRef], string]] {.async.} =
debugRaiseAssert $denebImplementationMissing & ": makeBlindedBeaconBlockForHeadAndSlot"