Skip to content

Commit 412ea71

Browse files
authored
update to current EIP-7685 engine API request format (#6766)
1 parent eb1e809 commit 412ea71

File tree

6 files changed

+64
-32
lines changed

6 files changed

+64
-32
lines changed

beacon_chain/el/el_manager.nim

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ proc sendNewPayloadToSingleEL(
855855
payload: engine_api.ExecutionPayloadV3,
856856
versioned_hashes: seq[engine_api.VersionedHash],
857857
parent_beacon_block_root: FixedBytes[32],
858-
executionRequests: array[3, seq[byte]]
858+
executionRequests: seq[seq[byte]]
859859
): Future[PayloadStatusV1] {.async: (raises: [CatchableError]).} =
860860
let rpcClient = await connection.connectedRpcClient()
861861
await rpcClient.engine_newPayloadV4(
@@ -995,15 +995,30 @@ proc sendNewPayload*(
995995
let req =
996996
when typeof(blck).kind >= ConsensusFork.Electra:
997997
# https://github.com/ethereum/execution-apis/blob/4140e528360fea53c34a766d86a000c6c039100e/src/engine/prague.md#engine_newpayloadv4
998-
let versioned_hashes = mapIt(
999-
blck.body.blob_kzg_commitments,
1000-
engine_api.VersionedHash(kzg_commitment_to_versioned_hash(it)))
998+
let
999+
versioned_hashes = mapIt(
1000+
blck.body.blob_kzg_commitments,
1001+
engine_api.VersionedHash(kzg_commitment_to_versioned_hash(it)))
1002+
# https://github.com/ethereum/execution-apis/blob/7c9772f95c2472ccfc6f6128dc2e1b568284a2da/src/engine/prague.md#request
1003+
# "Each list element is a `requests` byte array as defined by
1004+
# EIP-7685. The first byte of each element is the `request_type`
1005+
# and the remaining bytes are the `request_data`. Elements of
1006+
# the list MUST be ordered by `request_type` in ascending order.
1007+
# Elements with empty `request_data` MUST be excluded from the
1008+
# list."
1009+
execution_requests = block:
1010+
var requests: seq[seq[byte]]
1011+
for request_type, request_data in
1012+
[SSZ.encode(blck.body.execution_requests.deposits),
1013+
SSZ.encode(blck.body.execution_requests.withdrawals),
1014+
SSZ.encode(blck.body.execution_requests.consolidations)]:
1015+
if request_data.len > 0:
1016+
requests.add @[request_type.byte] & request_data
1017+
requests
1018+
10011019
sendNewPayloadToSingleEL(
10021020
it, payload, versioned_hashes,
1003-
FixedBytes[32] blck.parent_root.data,
1004-
[SSZ.encode(blck.body.execution_requests.deposits),
1005-
SSZ.encode(blck.body.execution_requests.withdrawals),
1006-
SSZ.encode(blck.body.execution_requests.consolidations)])
1021+
FixedBytes[32] blck.parent_root.data, execution_requests)
10071022
elif typeof(blck).kind == ConsensusFork.Deneb:
10081023
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-alpha.1/specs/deneb/beacon-chain.md#process_execution_payload
10091024
# Verify the execution payload is valid

beacon_chain/networking/eth2_network.nim

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,6 @@ declareGauge nbc_peers,
284284
declareCounter nbc_successful_discoveries,
285285
"Number of successful discoveries"
286286

287-
declareCounter nbc_failed_discoveries,
288-
"Number of failed discoveries"
289-
290287
declareCounter nbc_cycling_kicked_peers,
291288
"Number of peers kicked for peer cycling"
292289

@@ -2091,21 +2088,21 @@ proc p2pProtocolBackendImpl*(p: P2PProtocol): Backend =
20912088
import ./peer_protocol
20922089
export peer_protocol
20932090

2094-
proc updateMetadataV2ToV3(metadataRes: NetRes[altair.MetaData]):
2091+
func updateMetadataV2ToV3(metadataRes: NetRes[altair.MetaData]):
20952092
NetRes[fulu.MetaData] =
20962093
if metadataRes.isOk:
20972094
let metadata = metadataRes.get
20982095
ok(fulu.MetaData(seq_number: metadata.seq_number,
2099-
attnets: metadata.attnets,
2100-
syncnets: metadata.syncnets))
2096+
attnets: metadata.attnets,
2097+
syncnets: metadata.syncnets))
21012098
else:
21022099
err(metadataRes.error)
21032100

2104-
proc getMetadata_vx(node: Eth2Node, peer: Peer):
2101+
proc getMetadata_vx(node: Eth2Node, peer: Peer):
21052102
Future[NetRes[fulu.MetaData]]
21062103
{.async: (raises: [CancelledError]).} =
21072104
let
2108-
res =
2105+
res =
21092106
if node.getBeaconTime().slotOrZero.epoch >= node.cfg.FULU_FORK_EPOCH:
21102107
# Directly fetch fulu metadata if available
21112108
await getMetadata_v3(peer)
@@ -2438,7 +2435,7 @@ proc lookupCscFromPeer*(peer: Peer): uint64 =
24382435
return metadata.get.custody_subnet_count
24392436

24402437
# Try getting the custody count from ENR if metadata fetch fails.
2441-
debug "Could not get csc from metadata, trying from ENR",
2438+
debug "Could not get csc from metadata, trying from ENR",
24422439
peer_id = peer.peerId
24432440
let enrOpt = peer.enr
24442441
if not enrOpt.isNone:

beacon_chain/spec/datatypes/electra.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ type
119119
executionPayload*: ExecutionPayload
120120
blockValue*: Wei
121121
blobsBundle*: BlobsBundle
122-
executionRequests*: array[3, seq[byte]]
122+
executionRequests*: seq[seq[byte]]
123123

124124
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.8/specs/deneb/beacon-chain.md#executionpayloadheader
125125
ExecutionPayloadHeader* = object

beacon_chain/spec/datatypes/fulu.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ type
149149
executionPayload*: ExecutionPayload
150150
blockValue*: Wei
151151
blobsBundle*: BlobsBundle
152-
executionRequests*: array[3, seq[byte]]
152+
executionRequests*: seq[seq[byte]]
153153

154154
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.8/specs/deneb/beacon-chain.md#executionpayloadheader
155155
ExecutionPayloadHeader* = object
@@ -684,4 +684,4 @@ template asTrusted*(
684684
x: SignedBeaconBlock |
685685
SigVerifiedSignedBeaconBlock |
686686
MsgTrustedSignedBeaconBlock): TrustedSignedBeaconBlock =
687-
isomorphicCast[TrustedSignedBeaconBlock](x)
687+
isomorphicCast[TrustedSignedBeaconBlock](x)

beacon_chain/validators/beacon_validators.nim

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import
4343
keystore_management, slashing_protection, validator_duties, validator_pool],
4444
".."/spec/mev/[rest_deneb_mev_calls, rest_electra_mev_calls, rest_fulu_mev_calls]
4545

46-
from std/sequtils import countIt, foldl, mapIt
46+
from std/sequtils import countIt, deduplicate, foldl, mapIt
4747
from eth/async_utils import awaitWithTimeout
4848

4949
# Metrics for tracking attestation and beacon block loss
@@ -443,6 +443,8 @@ proc getExecutionPayload(
443443
PayloadType, beaconHead.blck.bid.root, executionHead, latestSafe,
444444
latestFinalized, timestamp, random, feeRecipient, withdrawals)
445445

446+
from std/algorithm import isSorted
447+
446448
# BlockRewards has issues resolving somehow otherwise
447449
import ".."/spec/state_transition_block
448450

@@ -541,19 +543,37 @@ proc makeBeaconBlockForHeadAndSlot*(
541543
let execution_requests_actual =
542544
when PayloadType.kind >= ConsensusFork.Electra:
543545
# Don't want un-decoded SSZ going any further/deeper
546+
var execution_requests_buffer: ExecutionRequests
547+
block:
548+
let request_types = mapIt(payload.executionRequests, it[0])
549+
if not isSorted(request_types):
550+
return err("Execution layer request types not sorted")
551+
if payload.executionRequests.len !=
552+
deduplicate(request_types, isSorted = true).len:
553+
return err("Execution layer request types duplicated")
544554
try:
545-
ExecutionRequests(
546-
deposits: SSZ.decode(
547-
payload.executionRequests[0],
548-
List[DepositRequest, Limit MAX_DEPOSIT_REQUESTS_PER_PAYLOAD]),
549-
withdrawals: SSZ.decode(
550-
payload.executionRequests[1],
551-
List[WithdrawalRequest, Limit MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD]),
552-
consolidations: SSZ.decode(
553-
payload.executionRequests[2],
554-
List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD]))
555+
for request_type_and_payload in payload.executionRequests:
556+
if request_type_and_payload.len < 2:
557+
return err("Execution layer request too short")
558+
template request_payload: untyped =
559+
request_type_and_payload.toOpenArray(
560+
1, request_type_and_payload.len - 1)
561+
case request_type_and_payload[0]
562+
of 0'u8: execution_requests_buffer.deposits = SSZ.decode(
563+
request_payload,
564+
List[DepositRequest, Limit MAX_DEPOSIT_REQUESTS_PER_PAYLOAD])
565+
of 1'u8: execution_requests_buffer.withdrawals = SSZ.decode(
566+
request_payload,
567+
List[WithdrawalRequest, Limit MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD])
568+
of 2'u8: execution_requests_buffer.consolidations = SSZ.decode(
569+
request_payload,
570+
List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD])
571+
else:
572+
return err("Execution layer invalid request type")
555573
except CatchableError:
556574
return err("Unable to deserialize execution layer requests")
575+
576+
execution_requests_buffer
557577
else:
558578
default(ExecutionRequests) # won't be used by block builder
559579

0 commit comments

Comments
 (0)