rm Capella builder API REST calls (#5997)
This commit is contained in:
parent
728f65080f
commit
5da2bcd243
|
@ -84,7 +84,6 @@ RestJson.useDefaultSerializationFor(
|
||||||
GetForkChoiceResponse,
|
GetForkChoiceResponse,
|
||||||
GetForkScheduleResponse,
|
GetForkScheduleResponse,
|
||||||
GetGenesisResponse,
|
GetGenesisResponse,
|
||||||
GetHeaderResponseCapella,
|
|
||||||
GetHeaderResponseDeneb,
|
GetHeaderResponseDeneb,
|
||||||
GetKeystoresResponse,
|
GetKeystoresResponse,
|
||||||
GetNextWithdrawalsResponse,
|
GetNextWithdrawalsResponse,
|
||||||
|
@ -168,7 +167,6 @@ RestJson.useDefaultSerializationFor(
|
||||||
SignedContributionAndProof,
|
SignedContributionAndProof,
|
||||||
SignedValidatorRegistrationV1,
|
SignedValidatorRegistrationV1,
|
||||||
SignedVoluntaryExit,
|
SignedVoluntaryExit,
|
||||||
SubmitBlindedBlockResponseCapella,
|
|
||||||
SubmitBlindedBlockResponseDeneb,
|
SubmitBlindedBlockResponseDeneb,
|
||||||
SyncAggregate,
|
SyncAggregate,
|
||||||
SyncAggregatorSelectionData,
|
SyncAggregatorSelectionData,
|
||||||
|
|
|
@ -553,7 +553,6 @@ type
|
||||||
GetEpochCommitteesResponse* = DataEnclosedObject[seq[RestBeaconStatesCommittees]]
|
GetEpochCommitteesResponse* = DataEnclosedObject[seq[RestBeaconStatesCommittees]]
|
||||||
GetForkScheduleResponse* = DataEnclosedObject[seq[Fork]]
|
GetForkScheduleResponse* = DataEnclosedObject[seq[Fork]]
|
||||||
GetGenesisResponse* = DataEnclosedObject[RestGenesis]
|
GetGenesisResponse* = DataEnclosedObject[RestGenesis]
|
||||||
GetHeaderResponseCapella* = DataVersionEnclosedObject[capella_mev.SignedBuilderBid]
|
|
||||||
GetHeaderResponseDeneb* = DataVersionEnclosedObject[deneb_mev.SignedBuilderBid]
|
GetHeaderResponseDeneb* = DataVersionEnclosedObject[deneb_mev.SignedBuilderBid]
|
||||||
GetNetworkIdentityResponse* = DataEnclosedObject[RestNetworkIdentity]
|
GetNetworkIdentityResponse* = DataEnclosedObject[RestNetworkIdentity]
|
||||||
GetPeerCountResponse* = DataMetaEnclosedObject[RestPeerCount]
|
GetPeerCountResponse* = DataMetaEnclosedObject[RestPeerCount]
|
||||||
|
@ -580,7 +579,6 @@ type
|
||||||
ProduceAttestationDataResponse* = DataEnclosedObject[AttestationData]
|
ProduceAttestationDataResponse* = DataEnclosedObject[AttestationData]
|
||||||
ProduceBlindedBlockResponse* = ForkedBlindedBeaconBlock
|
ProduceBlindedBlockResponse* = ForkedBlindedBeaconBlock
|
||||||
ProduceSyncCommitteeContributionResponse* = DataEnclosedObject[SyncCommitteeContribution]
|
ProduceSyncCommitteeContributionResponse* = DataEnclosedObject[SyncCommitteeContribution]
|
||||||
SubmitBlindedBlockResponseCapella* = DataEnclosedObject[capella.ExecutionPayload]
|
|
||||||
SubmitBlindedBlockResponseDeneb* = DataEnclosedObject[deneb_mev.ExecutionPayloadAndBlobsBundle]
|
SubmitBlindedBlockResponseDeneb* = DataEnclosedObject[deneb_mev.ExecutionPayloadAndBlobsBundle]
|
||||||
GetValidatorsActivityResponse* = DataEnclosedObject[seq[RestActivityItem]]
|
GetValidatorsActivityResponse* = DataEnclosedObject[seq[RestActivityItem]]
|
||||||
GetValidatorsLivenessResponse* = DataEnclosedObject[seq[RestLivenessItem]]
|
GetValidatorsLivenessResponse* = DataEnclosedObject[seq[RestLivenessItem]]
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
# beacon_chain
|
|
||||||
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
|
||||||
# Licensed and distributed under either of
|
|
||||||
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
||||||
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
|
||||||
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
||||||
|
|
||||||
{.push raises: [].}
|
|
||||||
|
|
||||||
import
|
|
||||||
chronos, presto/client,
|
|
||||||
".."/eth2_apis/[rest_types, eth2_rest_serialization]
|
|
||||||
|
|
||||||
export chronos, client, rest_types, eth2_rest_serialization
|
|
||||||
|
|
||||||
proc registerValidator*(body: seq[SignedValidatorRegistrationV1]
|
|
||||||
): RestPlainResponse {.
|
|
||||||
rest, endpoint: "/eth/v1/builder/validators",
|
|
||||||
meth: MethodPost, connection: {Dedicated, Close}.}
|
|
||||||
## https://github.com/ethereum/builder-specs/blob/v0.4.0/apis/builder/validators.yaml
|
|
||||||
## https://github.com/ethereum/beacon-APIs/blob/v2.3.0/apis/validator/register_validator.yaml
|
|
||||||
|
|
||||||
proc getHeaderCapella*(slot: Slot,
|
|
||||||
parent_hash: Eth2Digest,
|
|
||||||
pubkey: ValidatorPubKey
|
|
||||||
): RestPlainResponse {.
|
|
||||||
rest, endpoint: "/eth/v1/builder/header/{slot}/{parent_hash}/{pubkey}",
|
|
||||||
meth: MethodGet, connection: {Dedicated, Close}.}
|
|
||||||
## https://github.com/ethereum/builder-specs/blob/v0.4.0/apis/builder/header.yaml
|
|
||||||
|
|
||||||
proc submitBlindedBlock*(body: capella_mev.SignedBlindedBeaconBlock
|
|
||||||
): RestPlainResponse {.
|
|
||||||
rest, endpoint: "/eth/v1/builder/blinded_blocks",
|
|
||||||
meth: MethodPost, connection: {Dedicated, Close}.}
|
|
||||||
## https://github.com/ethereum/builder-specs/blob/v0.4.0/apis/builder/blinded_blocks.yaml
|
|
|
@ -13,6 +13,13 @@ import
|
||||||
|
|
||||||
export chronos, client, rest_types, eth2_rest_serialization
|
export chronos, client, rest_types, eth2_rest_serialization
|
||||||
|
|
||||||
|
proc registerValidator*(body: seq[SignedValidatorRegistrationV1]
|
||||||
|
): RestPlainResponse {.
|
||||||
|
rest, endpoint: "/eth/v1/builder/validators",
|
||||||
|
meth: MethodPost, connection: {Dedicated, Close}.}
|
||||||
|
## https://github.com/ethereum/builder-specs/blob/v0.4.0/apis/builder/validators.yaml
|
||||||
|
## https://github.com/ethereum/beacon-APIs/blob/v2.3.0/apis/validator/register_validator.yaml
|
||||||
|
|
||||||
proc getHeaderDeneb*(slot: Slot,
|
proc getHeaderDeneb*(slot: Slot,
|
||||||
parent_hash: Eth2Digest,
|
parent_hash: Eth2Digest,
|
||||||
pubkey: ValidatorPubKey
|
pubkey: ValidatorPubKey
|
||||||
|
|
|
@ -429,29 +429,9 @@ proc makeBeaconBlock*(
|
||||||
# Override for Builder API
|
# Override for Builder API
|
||||||
if transactions_root.isSome and execution_payload_root.isSome:
|
if transactions_root.isSome and execution_payload_root.isSome:
|
||||||
withState(state):
|
withState(state):
|
||||||
when consensusFork < ConsensusFork.Capella:
|
when consensusFork < ConsensusFork.Deneb:
|
||||||
# Nimbus doesn't support pre-Capella builder API
|
# Nimbus doesn't support pre-Deneb builder API
|
||||||
discard
|
discard
|
||||||
elif consensusFork == ConsensusFork.Capella:
|
|
||||||
forkyState.data.latest_execution_payload_header.transactions_root =
|
|
||||||
transactions_root.get
|
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/capella/beacon-chain.md#beaconblockbody
|
|
||||||
# Effectively hash_tree_root(ExecutionPayload) with the beacon block
|
|
||||||
# body, with the execution payload replaced by the execution payload
|
|
||||||
# header. htr(payload) == htr(payload header), so substitute.
|
|
||||||
forkyState.data.latest_block_header.body_root = hash_tree_root(
|
|
||||||
[hash_tree_root(randao_reveal),
|
|
||||||
hash_tree_root(eth1_data),
|
|
||||||
hash_tree_root(graffiti),
|
|
||||||
hash_tree_root(validator_changes.proposer_slashings),
|
|
||||||
hash_tree_root(validator_changes.attester_slashings),
|
|
||||||
hash_tree_root(List[Attestation, Limit MAX_ATTESTATIONS](attestations)),
|
|
||||||
hash_tree_root(List[Deposit, Limit MAX_DEPOSITS](deposits)),
|
|
||||||
hash_tree_root(validator_changes.voluntary_exits),
|
|
||||||
hash_tree_root(sync_aggregate),
|
|
||||||
execution_payload_root.get,
|
|
||||||
hash_tree_root(validator_changes.bls_to_execution_changes)])
|
|
||||||
elif consensusFork == ConsensusFork.Deneb:
|
elif consensusFork == ConsensusFork.Deneb:
|
||||||
forkyState.data.latest_execution_payload_header.transactions_root =
|
forkyState.data.latest_execution_payload_header.transactions_root =
|
||||||
transactions_root.get
|
transactions_root.get
|
||||||
|
|
|
@ -41,7 +41,7 @@ import
|
||||||
".."/[conf, beacon_clock, beacon_node],
|
".."/[conf, beacon_clock, beacon_node],
|
||||||
"."/[
|
"."/[
|
||||||
keystore_management, slashing_protection, validator_duties, validator_pool],
|
keystore_management, slashing_protection, validator_duties, validator_pool],
|
||||||
".."/spec/mev/[rest_capella_mev_calls, rest_deneb_mev_calls]
|
".."/spec/mev/rest_deneb_mev_calls
|
||||||
|
|
||||||
from std/sequtils import mapIt
|
from std/sequtils import mapIt
|
||||||
from eth/async_utils import awaitWithTimeout
|
from eth/async_utils import awaitWithTimeout
|
||||||
|
@ -542,30 +542,13 @@ proc makeBeaconBlockForHeadAndSlot*(
|
||||||
kzg_commitments = Opt.none(KzgCommitments))
|
kzg_commitments = Opt.none(KzgCommitments))
|
||||||
|
|
||||||
proc getBlindedExecutionPayload[
|
proc getBlindedExecutionPayload[
|
||||||
EPH: capella.ExecutionPayloadHeader |
|
EPH: deneb_mev.BlindedExecutionPayloadAndBlobsBundle](
|
||||||
deneb_mev.BlindedExecutionPayloadAndBlobsBundle](
|
|
||||||
node: BeaconNode, payloadBuilderClient: RestClientRef, slot: Slot,
|
node: BeaconNode, payloadBuilderClient: RestClientRef, slot: Slot,
|
||||||
executionBlockHash: Eth2Digest, pubkey: ValidatorPubKey):
|
executionBlockHash: Eth2Digest, pubkey: ValidatorPubKey):
|
||||||
Future[BlindedBlockResult[EPH]] {.async: (raises: [CancelledError, RestError]).} =
|
Future[BlindedBlockResult[EPH]] {.async: (raises: [CancelledError, RestError]).} =
|
||||||
# Not ideal to use `when` where instead of splitting into separate functions,
|
# Not ideal to use `when` where instead of splitting into separate functions,
|
||||||
# but Nim doesn't overload on generic EPH type parameter.
|
# but Nim doesn't overload on generic EPH type parameter.
|
||||||
when EPH is capella.ExecutionPayloadHeader:
|
when EPH is deneb_mev.BlindedExecutionPayloadAndBlobsBundle:
|
||||||
let
|
|
||||||
response = awaitWithTimeout(
|
|
||||||
payloadBuilderClient.getHeaderCapella(
|
|
||||||
slot, executionBlockHash, pubkey),
|
|
||||||
BUILDER_PROPOSAL_DELAY_TOLERANCE):
|
|
||||||
return err "Timeout obtaining Capella blinded header from builder"
|
|
||||||
|
|
||||||
res = decodeBytes(
|
|
||||||
GetHeaderResponseCapella, response.data, response.contentType)
|
|
||||||
|
|
||||||
blindedHeader = res.valueOr:
|
|
||||||
return err(
|
|
||||||
"Unable to decode Capella blinded header: " & $res.error &
|
|
||||||
" with HTTP status " & $response.status & ", Content-Type " &
|
|
||||||
$response.contentType & " and content " & $response.data)
|
|
||||||
elif EPH is deneb_mev.BlindedExecutionPayloadAndBlobsBundle:
|
|
||||||
let
|
let
|
||||||
response = awaitWithTimeout(
|
response = awaitWithTimeout(
|
||||||
payloadBuilderClient.getHeaderDeneb(
|
payloadBuilderClient.getHeaderDeneb(
|
||||||
|
|
|
@ -14,7 +14,6 @@ import ../beacon_node
|
||||||
|
|
||||||
from eth/async_utils import awaitWithTimeout
|
from eth/async_utils import awaitWithTimeout
|
||||||
from ../spec/datatypes/bellatrix import SignedBeaconBlock
|
from ../spec/datatypes/bellatrix import SignedBeaconBlock
|
||||||
from ../spec/mev/rest_capella_mev_calls import submitBlindedBlock
|
|
||||||
from ../spec/mev/rest_deneb_mev_calls import submitBlindedBlock
|
from ../spec/mev/rest_deneb_mev_calls import submitBlindedBlock
|
||||||
|
|
||||||
const
|
const
|
||||||
|
@ -44,9 +43,7 @@ macro copyFields*(
|
||||||
|
|
||||||
proc unblindAndRouteBlockMEV*(
|
proc unblindAndRouteBlockMEV*(
|
||||||
node: BeaconNode, payloadBuilderRestClient: RestClientRef,
|
node: BeaconNode, payloadBuilderRestClient: RestClientRef,
|
||||||
blindedBlock:
|
blindedBlock: deneb_mev.SignedBlindedBeaconBlock):
|
||||||
capella_mev.SignedBlindedBeaconBlock |
|
|
||||||
deneb_mev.SignedBlindedBeaconBlock):
|
|
||||||
Future[Result[Opt[BlockRef], string]] {.async: (raises: [CancelledError]).} =
|
Future[Result[Opt[BlockRef], string]] {.async: (raises: [CancelledError]).} =
|
||||||
const consensusFork = typeof(blindedBlock).kind
|
const consensusFork = typeof(blindedBlock).kind
|
||||||
|
|
||||||
|
@ -79,28 +76,16 @@ proc unblindAndRouteBlockMEV*(
|
||||||
return err("submitBlindedBlock failed with HTTP error code " &
|
return err("submitBlindedBlock failed with HTTP error code " &
|
||||||
$response.status & ": " & $shortLog(blindedBlock))
|
$response.status & ": " & $shortLog(blindedBlock))
|
||||||
|
|
||||||
when consensusFork >= ConsensusFork.Deneb:
|
let
|
||||||
let
|
res = decodeBytes(
|
||||||
res = decodeBytes(
|
SubmitBlindedBlockResponseDeneb, response.data, response.contentType)
|
||||||
SubmitBlindedBlockResponseDeneb, response.data, response.contentType)
|
|
||||||
|
|
||||||
bundle = res.valueOr:
|
bundle = res.valueOr:
|
||||||
return err("Could not decode Deneb blinded block: " & $res.error &
|
return err("Could not decode " & $consensusFork & " blinded block: " & $res.error &
|
||||||
" with HTTP status " & $response.status & ", Content-Type " &
|
" with HTTP status " & $response.status & ", Content-Type " &
|
||||||
$response.contentType & " and content " & $response.data)
|
$response.contentType & " and content " & $response.data)
|
||||||
|
|
||||||
template execution_payload: untyped = bundle.data.execution_payload
|
template execution_payload: untyped = bundle.data.execution_payload
|
||||||
else:
|
|
||||||
let
|
|
||||||
res = decodeBytes(
|
|
||||||
SubmitBlindedBlockResponseCapella, response.data, response.contentType)
|
|
||||||
|
|
||||||
bundle = res.valueOr:
|
|
||||||
return err("Could not decode Capella blinded block: " & $res.error &
|
|
||||||
" with HTTP status " & $response.status & ", Content-Type " &
|
|
||||||
$response.contentType & " and content " & $response.data)
|
|
||||||
|
|
||||||
template execution_payload: untyped = bundle.data
|
|
||||||
|
|
||||||
if hash_tree_root(blindedBlock.message.body.execution_payload_header) !=
|
if hash_tree_root(blindedBlock.message.body.execution_payload_header) !=
|
||||||
hash_tree_root(execution_payload):
|
hash_tree_root(execution_payload):
|
||||||
|
|
Loading…
Reference in New Issue