rm Capella builder API bid types and blinded block construction (#6002)
This commit is contained in:
parent
f5e9d3ffe4
commit
f076502e25
|
@ -219,9 +219,7 @@ RestJson.useDefaultSerializationFor(
|
||||||
capella.SignedBeaconBlock,
|
capella.SignedBeaconBlock,
|
||||||
capella_mev.BlindedBeaconBlock,
|
capella_mev.BlindedBeaconBlock,
|
||||||
capella_mev.BlindedBeaconBlockBody,
|
capella_mev.BlindedBeaconBlockBody,
|
||||||
capella_mev.BuilderBid,
|
|
||||||
capella_mev.SignedBlindedBeaconBlock,
|
capella_mev.SignedBlindedBeaconBlock,
|
||||||
capella_mev.SignedBuilderBid,
|
|
||||||
deneb.BeaconBlock,
|
deneb.BeaconBlock,
|
||||||
deneb.BeaconBlockBody,
|
deneb.BeaconBlockBody,
|
||||||
deneb.BeaconState,
|
deneb.BeaconState,
|
||||||
|
|
|
@ -17,12 +17,12 @@ import
|
||||||
block_id, eth2_merkleization, eth2_ssz_serialization,
|
block_id, eth2_merkleization, eth2_ssz_serialization,
|
||||||
forks_light_client, presets],
|
forks_light_client, presets],
|
||||||
./datatypes/[phase0, altair, bellatrix, capella, deneb, electra],
|
./datatypes/[phase0, altair, bellatrix, capella, deneb, electra],
|
||||||
./mev/bellatrix_mev, ./mev/capella_mev, ./mev/deneb_mev
|
./mev/[bellatrix_mev, capella_mev, deneb_mev]
|
||||||
|
|
||||||
export
|
export
|
||||||
extras, block_id, phase0, altair, bellatrix, capella, deneb, electra,
|
extras, block_id, phase0, altair, bellatrix, capella, deneb, electra,
|
||||||
eth2_merkleization, eth2_ssz_serialization, forks_light_client,
|
eth2_merkleization, eth2_ssz_serialization, forks_light_client,
|
||||||
presets, capella_mev, deneb_mev
|
presets, deneb_mev
|
||||||
|
|
||||||
# This file contains helpers for dealing with forks - we have two ways we can
|
# This file contains helpers for dealing with forks - we have two ways we can
|
||||||
# deal with forks:
|
# deal with forks:
|
||||||
|
|
|
@ -13,19 +13,6 @@ from stew/byteutils import to0xHex
|
||||||
from ../eth2_merkleization import hash_tree_root
|
from ../eth2_merkleization import hash_tree_root
|
||||||
|
|
||||||
type
|
type
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#builderbid
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/capella/builder.md#executionpayloadheader
|
|
||||||
BuilderBid* = object
|
|
||||||
header*: capella.ExecutionPayloadHeader # [Modified in Capella]
|
|
||||||
value*: UInt256
|
|
||||||
pubkey*: ValidatorPubKey
|
|
||||||
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#signedbuilderbid
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/capella/builder.md#executionpayloadheader
|
|
||||||
SignedBuilderBid* = object
|
|
||||||
message*: BuilderBid # [Modified in Capella]
|
|
||||||
signature*: ValidatorSig
|
|
||||||
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/capella/builder.md#blindedbeaconblockbody
|
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/capella/builder.md#blindedbeaconblockbody
|
||||||
BlindedBeaconBlockBody* = object
|
BlindedBeaconBlockBody* = object
|
||||||
randao_reveal*: ValidatorSig
|
randao_reveal*: ValidatorSig
|
||||||
|
@ -52,30 +39,12 @@ type
|
||||||
state_root*: Eth2Digest
|
state_root*: Eth2Digest
|
||||||
body*: BlindedBeaconBlockBody # [Modified in Capella]
|
body*: BlindedBeaconBlockBody # [Modified in Capella]
|
||||||
|
|
||||||
MaybeBlindedBeaconBlock* = object
|
|
||||||
case isBlinded*: bool
|
|
||||||
of false:
|
|
||||||
data*: capella.BeaconBlock
|
|
||||||
of true:
|
|
||||||
blindedData*: BlindedBeaconBlock
|
|
||||||
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#signedblindedbeaconblock
|
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#signedblindedbeaconblock
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/capella/builder.md#blindedbeaconblockbody
|
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/capella/builder.md#blindedbeaconblockbody
|
||||||
SignedBlindedBeaconBlock* = object
|
SignedBlindedBeaconBlock* = object
|
||||||
message*: BlindedBeaconBlock
|
message*: BlindedBeaconBlock
|
||||||
signature*: ValidatorSig
|
signature*: ValidatorSig
|
||||||
|
|
||||||
const
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#domain-types
|
|
||||||
DOMAIN_APPLICATION_BUILDER* = DomainType([byte 0x00, 0x00, 0x00, 0x01])
|
|
||||||
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/validator.md#constants
|
|
||||||
EPOCHS_PER_VALIDATOR_REGISTRATION_SUBMISSION* = 1
|
|
||||||
|
|
||||||
# Spec is 1 second, but mev-boost indirection can induce delay when the relay
|
|
||||||
# itself has already consumed the entire second.
|
|
||||||
BUILDER_PROPOSAL_DELAY_TOLERANCE* = 1500.milliseconds
|
|
||||||
|
|
||||||
func shortLog*(v: BlindedBeaconBlock): auto =
|
func shortLog*(v: BlindedBeaconBlock): auto =
|
||||||
(
|
(
|
||||||
slot: shortLog(v.slot),
|
slot: shortLog(v.slot),
|
||||||
|
|
|
@ -89,6 +89,17 @@ type
|
||||||
execution_payload_header*: deneb.ExecutionPayloadHeader
|
execution_payload_header*: deneb.ExecutionPayloadHeader
|
||||||
blob_kzg_commitments*: KzgCommitments # [New in Deneb]
|
blob_kzg_commitments*: KzgCommitments # [New in Deneb]
|
||||||
|
|
||||||
|
const
|
||||||
|
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#domain-types
|
||||||
|
DOMAIN_APPLICATION_BUILDER* = DomainType([byte 0x00, 0x00, 0x00, 0x01])
|
||||||
|
|
||||||
|
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/validator.md#constants
|
||||||
|
EPOCHS_PER_VALIDATOR_REGISTRATION_SUBMISSION* = 1
|
||||||
|
|
||||||
|
# Spec is 1 second, but mev-boost indirection can induce delay when the relay
|
||||||
|
# itself has already consumed the entire second.
|
||||||
|
BUILDER_PROPOSAL_DELAY_TOLERANCE* = 1500.milliseconds
|
||||||
|
|
||||||
func shortLog*(v: BlindedBeaconBlock): auto =
|
func shortLog*(v: BlindedBeaconBlock): auto =
|
||||||
(
|
(
|
||||||
slot: shortLog(v.slot),
|
slot: shortLog(v.slot),
|
||||||
|
|
|
@ -79,9 +79,7 @@ proc verify_epoch_signature*(
|
||||||
|
|
||||||
func compute_block_signing_root*(
|
func compute_block_signing_root*(
|
||||||
fork: Fork, genesis_validators_root: Eth2Digest, slot: Slot,
|
fork: Fork, genesis_validators_root: Eth2Digest, slot: Slot,
|
||||||
blck: Eth2Digest | SomeForkyBeaconBlock | BeaconBlockHeader |
|
blck: Eth2Digest | SomeForkyBeaconBlock | BeaconBlockHeader): Eth2Digest =
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#signing
|
|
||||||
capella_mev.BlindedBeaconBlock): Eth2Digest =
|
|
||||||
let
|
let
|
||||||
epoch = epoch(slot)
|
epoch = epoch(slot)
|
||||||
domain = get_domain(
|
domain = get_domain(
|
||||||
|
@ -373,8 +371,7 @@ proc verify_contribution_and_proof_signature*(
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#signing
|
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/builder.md#signing
|
||||||
func compute_builder_signing_root(
|
func compute_builder_signing_root(
|
||||||
fork: Fork,
|
fork: Fork,
|
||||||
msg: capella_mev.BuilderBid | deneb_mev.BuilderBid |
|
msg: deneb_mev.BuilderBid | ValidatorRegistrationV1): Eth2Digest =
|
||||||
ValidatorRegistrationV1): Eth2Digest =
|
|
||||||
# Uses genesis fork version regardless
|
# Uses genesis fork version regardless
|
||||||
doAssert fork.current_version == fork.previous_version
|
doAssert fork.current_version == fork.previous_version
|
||||||
|
|
||||||
|
@ -389,7 +386,7 @@ proc get_builder_signature*(
|
||||||
blsSign(privkey, signing_root.data)
|
blsSign(privkey, signing_root.data)
|
||||||
|
|
||||||
proc verify_builder_signature*(
|
proc verify_builder_signature*(
|
||||||
fork: Fork, msg: capella_mev.BuilderBid | deneb_mev.BuilderBid,
|
fork: Fork, msg: deneb_mev.BuilderBid,
|
||||||
pubkey: ValidatorPubKey | CookedPubKey, signature: SomeSig): bool =
|
pubkey: ValidatorPubKey | CookedPubKey, signature: SomeSig): bool =
|
||||||
let signing_root = compute_builder_signing_root(fork, msg)
|
let signing_root = compute_builder_signing_root(fork, msg)
|
||||||
blsVerify(pubkey, signing_root.data, signature)
|
blsVerify(pubkey, signing_root.data, signature)
|
||||||
|
|
|
@ -576,11 +576,7 @@ proc getBlindedExecutionPayload[
|
||||||
blindedHeader.data.message.pubkey, blindedHeader.data.signature):
|
blindedHeader.data.message.pubkey, blindedHeader.data.signature):
|
||||||
return err "getBlindedExecutionPayload: signature verification failed"
|
return err "getBlindedExecutionPayload: signature verification failed"
|
||||||
|
|
||||||
when EPH is capella.ExecutionPayloadHeader:
|
when EPH is deneb_mev.BlindedExecutionPayloadAndBlobsBundle:
|
||||||
return ok((
|
|
||||||
blindedBlckPart: blindedHeader.data.message.header,
|
|
||||||
blockValue: blindedHeader.data.message.value))
|
|
||||||
elif EPH is deneb_mev.BlindedExecutionPayloadAndBlobsBundle:
|
|
||||||
template builderBid: untyped = blindedHeader.data.message
|
template builderBid: untyped = blindedHeader.data.message
|
||||||
return ok((
|
return ok((
|
||||||
blindedBlckPart: EPH(
|
blindedBlckPart: EPH(
|
||||||
|
@ -593,24 +589,6 @@ proc getBlindedExecutionPayload[
|
||||||
from ./message_router_mev import
|
from ./message_router_mev import
|
||||||
copyFields, getFieldNames, unblindAndRouteBlockMEV
|
copyFields, getFieldNames, unblindAndRouteBlockMEV
|
||||||
|
|
||||||
func constructSignableBlindedBlock[T: capella_mev.SignedBlindedBeaconBlock](
|
|
||||||
blck: capella.BeaconBlock,
|
|
||||||
executionPayloadHeader: capella.ExecutionPayloadHeader): T =
|
|
||||||
# Leaves signature field default, to be filled in by caller
|
|
||||||
const
|
|
||||||
blckFields = getFieldNames(typeof(blck))
|
|
||||||
blckBodyFields = getFieldNames(typeof(blck.body))
|
|
||||||
|
|
||||||
var blindedBlock: T
|
|
||||||
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/validator.md#block-proposal
|
|
||||||
copyFields(blindedBlock.message, blck, blckFields)
|
|
||||||
copyFields(blindedBlock.message.body, blck.body, blckBodyFields)
|
|
||||||
assign(
|
|
||||||
blindedBlock.message.body.execution_payload_header, executionPayloadHeader)
|
|
||||||
|
|
||||||
blindedBlock
|
|
||||||
|
|
||||||
proc constructSignableBlindedBlock[T: deneb_mev.SignedBlindedBeaconBlock](
|
proc constructSignableBlindedBlock[T: deneb_mev.SignedBlindedBeaconBlock](
|
||||||
blck: deneb.BeaconBlock,
|
blck: deneb.BeaconBlock,
|
||||||
blindedBundle: deneb_mev.BlindedExecutionPayloadAndBlobsBundle): T =
|
blindedBundle: deneb_mev.BlindedExecutionPayloadAndBlobsBundle): T =
|
||||||
|
@ -633,25 +611,6 @@ proc constructSignableBlindedBlock[T: deneb_mev.SignedBlindedBeaconBlock](
|
||||||
|
|
||||||
blindedBlock
|
blindedBlock
|
||||||
|
|
||||||
func constructPlainBlindedBlock[T: capella_mev.BlindedBeaconBlock](
|
|
||||||
blck: ForkyBeaconBlock,
|
|
||||||
executionPayloadHeader: capella.ExecutionPayloadHeader): T =
|
|
||||||
# https://github.com/nim-lang/Nim/issues/23020 workaround
|
|
||||||
static: doAssert T is capella_mev.BlindedBeaconBlock
|
|
||||||
|
|
||||||
const
|
|
||||||
blckFields = getFieldNames(typeof(blck))
|
|
||||||
blckBodyFields = getFieldNames(typeof(blck.body))
|
|
||||||
|
|
||||||
var blindedBlock: T
|
|
||||||
|
|
||||||
# https://github.com/ethereum/builder-specs/blob/v0.4.0/specs/bellatrix/validator.md#block-proposal
|
|
||||||
copyFields(blindedBlock, blck, blckFields)
|
|
||||||
copyFields(blindedBlock.body, blck.body, blckBodyFields)
|
|
||||||
assign(blindedBlock.body.execution_payload_header, executionPayloadHeader)
|
|
||||||
|
|
||||||
blindedBlock
|
|
||||||
|
|
||||||
func constructPlainBlindedBlock[T: deneb_mev.BlindedBeaconBlock](
|
func constructPlainBlindedBlock[T: deneb_mev.BlindedBeaconBlock](
|
||||||
blck: ForkyBeaconBlock,
|
blck: ForkyBeaconBlock,
|
||||||
blindedBundle: deneb_mev.BlindedExecutionPayloadAndBlobsBundle): T =
|
blindedBundle: deneb_mev.BlindedExecutionPayloadAndBlobsBundle): T =
|
||||||
|
@ -676,10 +635,7 @@ func constructPlainBlindedBlock[T: deneb_mev.BlindedBeaconBlock](
|
||||||
|
|
||||||
blindedBlock
|
blindedBlock
|
||||||
|
|
||||||
proc blindedBlockCheckSlashingAndSign[
|
proc blindedBlockCheckSlashingAndSign[T: deneb_mev.SignedBlindedBeaconBlock](
|
||||||
T:
|
|
||||||
capella_mev.SignedBlindedBeaconBlock |
|
|
||||||
deneb_mev.SignedBlindedBeaconBlock](
|
|
||||||
node: BeaconNode, slot: Slot, validator: AttachedValidator,
|
node: BeaconNode, slot: Slot, validator: AttachedValidator,
|
||||||
validator_index: ValidatorIndex, nonsignedBlindedBlock: T):
|
validator_index: ValidatorIndex, nonsignedBlindedBlock: T):
|
||||||
Future[Result[T, string]] {.async: (raises: [CancelledError]).} =
|
Future[Result[T, string]] {.async: (raises: [CancelledError]).} =
|
||||||
|
@ -711,9 +667,7 @@ proc blindedBlockCheckSlashingAndSign[
|
||||||
|
|
||||||
return ok blindedBlock
|
return ok blindedBlock
|
||||||
|
|
||||||
proc getUnsignedBlindedBeaconBlock[
|
proc getUnsignedBlindedBeaconBlock[T: deneb_mev.SignedBlindedBeaconBlock](
|
||||||
T: capella_mev.SignedBlindedBeaconBlock |
|
|
||||||
deneb_mev.SignedBlindedBeaconBlock](
|
|
||||||
node: BeaconNode, slot: Slot,
|
node: BeaconNode, slot: Slot,
|
||||||
validator_index: ValidatorIndex, forkedBlock: ForkedBeaconBlock,
|
validator_index: ValidatorIndex, forkedBlock: ForkedBeaconBlock,
|
||||||
executionPayloadHeader: capella.ExecutionPayloadHeader |
|
executionPayloadHeader: capella.ExecutionPayloadHeader |
|
||||||
|
|
Loading…
Reference in New Issue