mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-02-18 17:37:33 +00:00
refactor engine API conversions out of EL manager (#6507)
This commit is contained in:
parent
77c36b3c59
commit
44cc72c104
@ -464,16 +464,20 @@ OK: 5/5 Fail: 0/5 Skip: 0/5
|
||||
+ URL parsing OK
|
||||
```
|
||||
OK: 5/5 Fail: 0/5 Skip: 0/5
|
||||
## Eth1 monitor
|
||||
## Engine API conversions
|
||||
```diff
|
||||
+ Deposits chain OK
|
||||
+ Rewrite URLs OK
|
||||
+ Roundtrip engine RPC V1 and bellatrix ExecutionPayload representations OK
|
||||
+ Roundtrip engine RPC V2 and capella ExecutionPayload representations OK
|
||||
+ Roundtrip engine RPC V3 and deneb ExecutionPayload representations OK
|
||||
+ Roundtrip engine RPC V4 and electra ExecutionPayload representations OK
|
||||
```
|
||||
OK: 6/6 Fail: 0/6 Skip: 0/6
|
||||
OK: 4/4 Fail: 0/4 Skip: 0/4
|
||||
## Eth1 monitor
|
||||
```diff
|
||||
+ Deposits chain OK
|
||||
+ Rewrite URLs OK
|
||||
```
|
||||
OK: 2/2 Fail: 0/2 Skip: 0/2
|
||||
## Eth2 specific discovery tests
|
||||
```diff
|
||||
+ Invalid attnets field OK
|
||||
|
@ -15,6 +15,7 @@ import
|
||||
../beacon_clock,
|
||||
./common_tools
|
||||
|
||||
from ../el/engine_api_conversions import asBlockHash
|
||||
from ../spec/beaconstate import
|
||||
get_expected_withdrawals, has_eth1_withdrawal_credential
|
||||
from ../spec/datatypes/capella import Withdrawal
|
||||
|
@ -20,7 +20,7 @@ import
|
||||
../spec/[eth2_merkleization, forks],
|
||||
../networking/network_metadata,
|
||||
".."/beacon_node_status,
|
||||
"."/[eth1_chain, el_conf]
|
||||
"."/[el_conf, engine_api_conversions, eth1_chain]
|
||||
|
||||
from std/times import getTime, inSeconds, initTime, `-`
|
||||
from ../spec/engine_authentication import getSignedIatToken
|
||||
@ -40,6 +40,12 @@ type
|
||||
Int64LeBytes = DynamicBytes[8, 8]
|
||||
WithoutTimeout* = distinct int
|
||||
|
||||
SomeEnginePayloadWithValue =
|
||||
BellatrixExecutionPayloadWithValue |
|
||||
GetPayloadV2Response |
|
||||
GetPayloadV3Response |
|
||||
GetPayloadV4Response
|
||||
|
||||
contract(DepositContract):
|
||||
proc deposit(pubkey: PubKeyBytes,
|
||||
withdrawalCredentials: WithdrawalCredentialsBytes,
|
||||
@ -198,16 +204,6 @@ type
|
||||
merkleTreeIndex: Int64LeBytes,
|
||||
j: JsonNode) {.gcsafe, raises: [].}
|
||||
|
||||
BellatrixExecutionPayloadWithValue* = object
|
||||
executionPayload*: ExecutionPayloadV1
|
||||
blockValue*: UInt256
|
||||
|
||||
SomeEnginePayloadWithValue =
|
||||
BellatrixExecutionPayloadWithValue |
|
||||
GetPayloadV2Response |
|
||||
GetPayloadV3Response |
|
||||
GetPayloadV4Response
|
||||
|
||||
declareCounter failed_web3_requests,
|
||||
"Failed web3 requests"
|
||||
|
||||
@ -376,340 +372,6 @@ template eth1ChainBlocks*(m: ELManager): Deque[Eth1Block] =
|
||||
# doAssert SECONDS_PER_ETH1_BLOCK * cfg.ETH1_FOLLOW_DISTANCE < GENESIS_DELAY,
|
||||
# "Invalid configuration: GENESIS_DELAY is set too low"
|
||||
|
||||
func asConsensusWithdrawal(w: WithdrawalV1): capella.Withdrawal =
|
||||
capella.Withdrawal(
|
||||
index: w.index.uint64,
|
||||
validator_index: w.validatorIndex.uint64,
|
||||
address: ExecutionAddress(data: w.address.distinctBase),
|
||||
amount: Gwei w.amount)
|
||||
|
||||
func asEngineWithdrawal(w: capella.Withdrawal): WithdrawalV1 =
|
||||
WithdrawalV1(
|
||||
index: Quantity(w.index),
|
||||
validatorIndex: Quantity(w.validator_index),
|
||||
address: Address(w.address.data),
|
||||
amount: Quantity(w.amount))
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1):
|
||||
bellatrix.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
bellatrix.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)))
|
||||
|
||||
func asConsensusType*(payloadWithValue: BellatrixExecutionPayloadWithValue):
|
||||
bellatrix.ExecutionPayloadForSigning =
|
||||
bellatrix.ExecutionPayloadForSigning(
|
||||
executionPayload: payloadWithValue.executionPayload.asConsensusType,
|
||||
blockValue: payloadWithValue.blockValue)
|
||||
|
||||
template maybeDeref[T](o: Opt[T]): T = o.get
|
||||
template maybeDeref[V](v: V): V = v
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1OrV2|ExecutionPayloadV2):
|
||||
capella.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
capella.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)),
|
||||
withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(
|
||||
mapIt(maybeDeref rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)))
|
||||
|
||||
func asConsensusType*(payloadWithValue: engine_api.GetPayloadV2Response):
|
||||
capella.ExecutionPayloadForSigning =
|
||||
capella.ExecutionPayloadForSigning(
|
||||
executionPayload: payloadWithValue.executionPayload.asConsensusType,
|
||||
blockValue: payloadWithValue.blockValue)
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV3):
|
||||
deneb.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
deneb.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)),
|
||||
withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)),
|
||||
blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64,
|
||||
excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64)
|
||||
|
||||
func asConsensusType*(payload: engine_api.GetPayloadV3Response):
|
||||
deneb.ExecutionPayloadForSigning =
|
||||
deneb.ExecutionPayloadForSigning(
|
||||
executionPayload: payload.executionPayload.asConsensusType,
|
||||
blockValue: payload.blockValue,
|
||||
# TODO
|
||||
# The `mapIt` calls below are necessary only because we use different distinct
|
||||
# types for KZG commitments and Blobs in the `web3` and the `deneb` spec types.
|
||||
# Both are defined as `array[N, byte]` under the hood.
|
||||
blobsBundle: deneb.BlobsBundle(
|
||||
commitments: KzgCommitments.init(
|
||||
payload.blobsBundle.commitments.mapIt(
|
||||
kzg_abi.KzgCommitment(bytes: it.bytes))),
|
||||
proofs: KzgProofs.init(
|
||||
payload.blobsBundle.proofs.mapIt(
|
||||
kzg_abi.KzgProof(bytes: it.bytes))),
|
||||
blobs: Blobs.init(
|
||||
payload.blobsBundle.blobs.mapIt(it.bytes))))
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV4):
|
||||
electra.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
template getDepositRequest(
|
||||
dr: DepositRequestV1): electra.DepositRequest =
|
||||
electra.DepositRequest(
|
||||
pubkey: ValidatorPubKey(blob: dr.pubkey.distinctBase),
|
||||
withdrawal_credentials: dr.withdrawalCredentials.asEth2Digest,
|
||||
amount: dr.amount.Gwei,
|
||||
signature: ValidatorSig(blob: dr.signature.distinctBase),
|
||||
index: dr.index.uint64)
|
||||
|
||||
template getWithdrawalRequest(
|
||||
wr: WithdrawalRequestV1): electra.WithdrawalRequest =
|
||||
electra.WithdrawalRequest(
|
||||
source_address: ExecutionAddress(data: wr.sourceAddress.distinctBase),
|
||||
validator_pubkey: ValidatorPubKey(blob: wr.validatorPubkey.distinctBase),
|
||||
amount: wr.amount.Gwei)
|
||||
|
||||
template getConsolidationRequest(
|
||||
cr: ConsolidationRequestV1): electra.ConsolidationRequest =
|
||||
electra.ConsolidationRequest(
|
||||
source_address: ExecutionAddress(data: cr.sourceAddress.distinctBase),
|
||||
source_pubkey: ValidatorPubKey(blob: cr.sourcePubkey.distinctBase),
|
||||
target_pubkey: ValidatorPubKey(blob: cr.targetPubkey.distinctBase))
|
||||
|
||||
electra.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(
|
||||
rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)),
|
||||
withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)),
|
||||
blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64,
|
||||
excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64,
|
||||
deposit_requests:
|
||||
List[electra.DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.depositRequests, it.getDepositRequest)),
|
||||
withdrawal_requests: List[electra.WithdrawalRequest,
|
||||
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.withdrawalRequests,
|
||||
it.getWithdrawalRequest)),
|
||||
consolidation_requests: List[electra.ConsolidationRequest,
|
||||
Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.consolidationRequests,
|
||||
it.getConsolidationRequest)))
|
||||
|
||||
func asConsensusType*(payload: engine_api.GetPayloadV4Response):
|
||||
electra.ExecutionPayloadForSigning =
|
||||
electra.ExecutionPayloadForSigning(
|
||||
executionPayload: payload.executionPayload.asConsensusType,
|
||||
blockValue: payload.blockValue,
|
||||
# TODO
|
||||
# The `mapIt` calls below are necessary only because we use different distinct
|
||||
# types for KZG commitments and Blobs in the `web3` and the `deneb` spec types.
|
||||
# Both are defined as `array[N, byte]` under the hood.
|
||||
blobsBundle: deneb.BlobsBundle(
|
||||
commitments: KzgCommitments.init(
|
||||
payload.blobsBundle.commitments.mapIt(
|
||||
kzg_abi.KzgCommitment(bytes: it.bytes))),
|
||||
proofs: KzgProofs.init(
|
||||
payload.blobsBundle.proofs.mapIt(
|
||||
kzg_abi.KzgProof(bytes: it.bytes))),
|
||||
blobs: Blobs.init(
|
||||
payload.blobsBundle.blobs.mapIt(it.bytes))))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: bellatrix.ExecutionPayload):
|
||||
ExecutionPayloadV1 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
|
||||
engine_api.ExecutionPayloadV1(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction))
|
||||
|
||||
template toEngineWithdrawal(w: capella.Withdrawal): WithdrawalV1 =
|
||||
WithdrawalV1(
|
||||
index: Quantity(w.index),
|
||||
validatorIndex: Quantity(w.validator_index),
|
||||
address: Address(w.address.data),
|
||||
amount: Quantity(w.amount))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: capella.ExecutionPayload):
|
||||
ExecutionPayloadV2 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
engine_api.ExecutionPayloadV2(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction),
|
||||
withdrawals: mapIt(executionPayload.withdrawals, it.toEngineWithdrawal))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: deneb.ExecutionPayload):
|
||||
ExecutionPayloadV3 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
|
||||
engine_api.ExecutionPayloadV3(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction),
|
||||
withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal),
|
||||
blobGasUsed: Quantity(executionPayload.blob_gas_used),
|
||||
excessBlobGas: Quantity(executionPayload.excess_blob_gas))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: electra.ExecutionPayload):
|
||||
ExecutionPayloadV4 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
|
||||
template getDepositRequest(
|
||||
dr: electra.DepositRequest): DepositRequestV1 =
|
||||
DepositRequestV1(
|
||||
pubkey: FixedBytes[RawPubKeySize](dr.pubkey.blob),
|
||||
withdrawalCredentials: FixedBytes[32](dr.withdrawal_credentials.data),
|
||||
amount: dr.amount.Quantity,
|
||||
signature: FixedBytes[RawSigSize](dr.signature.blob),
|
||||
index: dr.index.Quantity)
|
||||
|
||||
template getWithdrawalRequest(
|
||||
wr: electra.WithdrawalRequest): WithdrawalRequestV1 =
|
||||
WithdrawalRequestV1(
|
||||
sourceAddress: Address(wr.source_address.data),
|
||||
validatorPubkey: FixedBytes[RawPubKeySize](wr.validator_pubkey.blob),
|
||||
amount: wr.amount.Quantity)
|
||||
|
||||
template getConsolidationRequest(
|
||||
cr: electra.ConsolidationRequest): ConsolidationRequestV1 =
|
||||
ConsolidationRequestV1(
|
||||
sourceAddress: Address(cr.source_address.data),
|
||||
sourcePubkey: FixedBytes[RawPubKeySize](cr.source_pubkey.blob),
|
||||
targetPubkey: FixedBytes[RawPubKeySize](cr.target_pubkey.blob))
|
||||
|
||||
engine_api.ExecutionPayloadV4(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction),
|
||||
withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal),
|
||||
blobGasUsed: Quantity(executionPayload.blob_gas_used),
|
||||
excessBlobGas: Quantity(executionPayload.excess_blob_gas),
|
||||
depositRequests: mapIt(
|
||||
executionPayload.deposit_requests, it.getDepositRequest),
|
||||
withdrawalRequests: mapIt(
|
||||
executionPayload.withdrawal_requests, it.getWithdrawalRequest),
|
||||
consolidationRequests: mapIt(
|
||||
executionPayload.consolidation_requests, it.getConsolidationRequest))
|
||||
|
||||
func isConnected(connection: ELConnection): bool =
|
||||
connection.web3.isSome
|
||||
|
||||
|
359
beacon_chain/el/engine_api_conversions.nim
Normal file
359
beacon_chain/el/engine_api_conversions.nim
Normal file
@ -0,0 +1,359 @@
|
||||
# beacon_chain
|
||||
# Copyright (c) 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
|
||||
../spec/datatypes/[bellatrix, capella, deneb, electra],
|
||||
web3/[engine_api, engine_api_types]
|
||||
|
||||
from std/sequtils import mapIt
|
||||
|
||||
type
|
||||
BellatrixExecutionPayloadWithValue* = object
|
||||
executionPayload*: ExecutionPayloadV1
|
||||
blockValue*: UInt256
|
||||
|
||||
func asEth2Digest*(x: BlockHash): Eth2Digest =
|
||||
Eth2Digest(data: array[32, byte](x))
|
||||
|
||||
template asBlockHash*(x: Eth2Digest): BlockHash =
|
||||
BlockHash(x.data)
|
||||
|
||||
func asConsensusWithdrawal*(w: WithdrawalV1): capella.Withdrawal =
|
||||
capella.Withdrawal(
|
||||
index: w.index.uint64,
|
||||
validator_index: w.validatorIndex.uint64,
|
||||
address: ExecutionAddress(data: w.address.distinctBase),
|
||||
amount: Gwei w.amount)
|
||||
|
||||
func asEngineWithdrawal(w: capella.Withdrawal): WithdrawalV1 =
|
||||
WithdrawalV1(
|
||||
index: Quantity(w.index),
|
||||
validatorIndex: Quantity(w.validator_index),
|
||||
address: Address(w.address.data),
|
||||
amount: Quantity(w.amount))
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1):
|
||||
bellatrix.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
bellatrix.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)))
|
||||
|
||||
func asConsensusType*(payloadWithValue: BellatrixExecutionPayloadWithValue):
|
||||
bellatrix.ExecutionPayloadForSigning =
|
||||
bellatrix.ExecutionPayloadForSigning(
|
||||
executionPayload: payloadWithValue.executionPayload.asConsensusType,
|
||||
blockValue: payloadWithValue.blockValue)
|
||||
|
||||
template maybeDeref*[T](o: Opt[T]): T = o.get
|
||||
template maybeDeref*[V](v: V): V = v
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1OrV2|ExecutionPayloadV2):
|
||||
capella.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
capella.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)),
|
||||
withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(
|
||||
mapIt(maybeDeref rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)))
|
||||
|
||||
func asConsensusType*(payloadWithValue: engine_api.GetPayloadV2Response):
|
||||
capella.ExecutionPayloadForSigning =
|
||||
capella.ExecutionPayloadForSigning(
|
||||
executionPayload: payloadWithValue.executionPayload.asConsensusType,
|
||||
blockValue: payloadWithValue.blockValue)
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV3):
|
||||
deneb.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
deneb.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)),
|
||||
withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)),
|
||||
blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64,
|
||||
excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64)
|
||||
|
||||
func asConsensusType*(payload: engine_api.GetPayloadV3Response):
|
||||
deneb.ExecutionPayloadForSigning =
|
||||
deneb.ExecutionPayloadForSigning(
|
||||
executionPayload: payload.executionPayload.asConsensusType,
|
||||
blockValue: payload.blockValue,
|
||||
# TODO
|
||||
# The `mapIt` calls below are necessary only because we use different distinct
|
||||
# types for KZG commitments and Blobs in the `web3` and the `deneb` spec types.
|
||||
# Both are defined as `array[N, byte]` under the hood.
|
||||
blobsBundle: deneb.BlobsBundle(
|
||||
commitments: KzgCommitments.init(
|
||||
payload.blobsBundle.commitments.mapIt(
|
||||
kzg_abi.KzgCommitment(bytes: it.bytes))),
|
||||
proofs: KzgProofs.init(
|
||||
payload.blobsBundle.proofs.mapIt(
|
||||
kzg_abi.KzgProof(bytes: it.bytes))),
|
||||
blobs: Blobs.init(
|
||||
payload.blobsBundle.blobs.mapIt(it.bytes))))
|
||||
|
||||
func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV4):
|
||||
electra.ExecutionPayload =
|
||||
template getTransaction(tt: TypedTransaction): bellatrix.Transaction =
|
||||
bellatrix.Transaction.init(tt.distinctBase)
|
||||
|
||||
template getDepositRequest(
|
||||
dr: DepositRequestV1): electra.DepositRequest =
|
||||
electra.DepositRequest(
|
||||
pubkey: ValidatorPubKey(blob: dr.pubkey.distinctBase),
|
||||
withdrawal_credentials: dr.withdrawalCredentials.asEth2Digest,
|
||||
amount: dr.amount.Gwei,
|
||||
signature: ValidatorSig(blob: dr.signature.distinctBase),
|
||||
index: dr.index.uint64)
|
||||
|
||||
template getWithdrawalRequest(
|
||||
wr: WithdrawalRequestV1): electra.WithdrawalRequest =
|
||||
electra.WithdrawalRequest(
|
||||
source_address: ExecutionAddress(data: wr.sourceAddress.distinctBase),
|
||||
validator_pubkey: ValidatorPubKey(blob: wr.validatorPubkey.distinctBase),
|
||||
amount: wr.amount.Gwei)
|
||||
|
||||
template getConsolidationRequest(
|
||||
cr: ConsolidationRequestV1): electra.ConsolidationRequest =
|
||||
electra.ConsolidationRequest(
|
||||
source_address: ExecutionAddress(data: cr.sourceAddress.distinctBase),
|
||||
source_pubkey: ValidatorPubKey(blob: cr.sourcePubkey.distinctBase),
|
||||
target_pubkey: ValidatorPubKey(blob: cr.targetPubkey.distinctBase))
|
||||
|
||||
electra.ExecutionPayload(
|
||||
parent_hash: rpcExecutionPayload.parentHash.asEth2Digest,
|
||||
feeRecipient:
|
||||
ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase),
|
||||
state_root: rpcExecutionPayload.stateRoot.asEth2Digest,
|
||||
receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest,
|
||||
logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase),
|
||||
prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest,
|
||||
block_number: rpcExecutionPayload.blockNumber.uint64,
|
||||
gas_limit: rpcExecutionPayload.gasLimit.uint64,
|
||||
gas_used: rpcExecutionPayload.gasUsed.uint64,
|
||||
timestamp: rpcExecutionPayload.timestamp.uint64,
|
||||
extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(
|
||||
rpcExecutionPayload.extraData.bytes),
|
||||
base_fee_per_gas: rpcExecutionPayload.baseFeePerGas,
|
||||
block_hash: rpcExecutionPayload.blockHash.asEth2Digest,
|
||||
transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.transactions, it.getTransaction)),
|
||||
withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)),
|
||||
blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64,
|
||||
excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64,
|
||||
deposit_requests:
|
||||
List[electra.DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.depositRequests, it.getDepositRequest)),
|
||||
withdrawal_requests: List[electra.WithdrawalRequest,
|
||||
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.withdrawalRequests,
|
||||
it.getWithdrawalRequest)),
|
||||
consolidation_requests: List[electra.ConsolidationRequest,
|
||||
Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(
|
||||
mapIt(rpcExecutionPayload.consolidationRequests,
|
||||
it.getConsolidationRequest)))
|
||||
|
||||
func asConsensusType*(payload: engine_api.GetPayloadV4Response):
|
||||
electra.ExecutionPayloadForSigning =
|
||||
electra.ExecutionPayloadForSigning(
|
||||
executionPayload: payload.executionPayload.asConsensusType,
|
||||
blockValue: payload.blockValue,
|
||||
# TODO
|
||||
# The `mapIt` calls below are necessary only because we use different distinct
|
||||
# types for KZG commitments and Blobs in the `web3` and the `deneb` spec types.
|
||||
# Both are defined as `array[N, byte]` under the hood.
|
||||
blobsBundle: deneb.BlobsBundle(
|
||||
commitments: KzgCommitments.init(
|
||||
payload.blobsBundle.commitments.mapIt(
|
||||
kzg_abi.KzgCommitment(bytes: it.bytes))),
|
||||
proofs: KzgProofs.init(
|
||||
payload.blobsBundle.proofs.mapIt(
|
||||
kzg_abi.KzgProof(bytes: it.bytes))),
|
||||
blobs: Blobs.init(
|
||||
payload.blobsBundle.blobs.mapIt(it.bytes))))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: bellatrix.ExecutionPayload):
|
||||
ExecutionPayloadV1 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
|
||||
engine_api.ExecutionPayloadV1(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction))
|
||||
|
||||
template toEngineWithdrawal*(w: capella.Withdrawal): WithdrawalV1 =
|
||||
WithdrawalV1(
|
||||
index: Quantity(w.index),
|
||||
validatorIndex: Quantity(w.validator_index),
|
||||
address: Address(w.address.data),
|
||||
amount: Quantity(w.amount))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: capella.ExecutionPayload):
|
||||
ExecutionPayloadV2 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
engine_api.ExecutionPayloadV2(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction),
|
||||
withdrawals: mapIt(executionPayload.withdrawals, it.toEngineWithdrawal))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: deneb.ExecutionPayload):
|
||||
ExecutionPayloadV3 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
|
||||
engine_api.ExecutionPayloadV3(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction),
|
||||
withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal),
|
||||
blobGasUsed: Quantity(executionPayload.blob_gas_used),
|
||||
excessBlobGas: Quantity(executionPayload.excess_blob_gas))
|
||||
|
||||
func asEngineExecutionPayload*(executionPayload: electra.ExecutionPayload):
|
||||
ExecutionPayloadV4 =
|
||||
template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction =
|
||||
TypedTransaction(tt.distinctBase)
|
||||
|
||||
template getDepositRequest(
|
||||
dr: electra.DepositRequest): DepositRequestV1 =
|
||||
DepositRequestV1(
|
||||
pubkey: FixedBytes[RawPubKeySize](dr.pubkey.blob),
|
||||
withdrawalCredentials: FixedBytes[32](dr.withdrawal_credentials.data),
|
||||
amount: dr.amount.Quantity,
|
||||
signature: FixedBytes[RawSigSize](dr.signature.blob),
|
||||
index: dr.index.Quantity)
|
||||
|
||||
template getWithdrawalRequest(
|
||||
wr: electra.WithdrawalRequest): WithdrawalRequestV1 =
|
||||
WithdrawalRequestV1(
|
||||
sourceAddress: Address(wr.source_address.data),
|
||||
validatorPubkey: FixedBytes[RawPubKeySize](wr.validator_pubkey.blob),
|
||||
amount: wr.amount.Quantity)
|
||||
|
||||
template getConsolidationRequest(
|
||||
cr: electra.ConsolidationRequest): ConsolidationRequestV1 =
|
||||
ConsolidationRequestV1(
|
||||
sourceAddress: Address(cr.source_address.data),
|
||||
sourcePubkey: FixedBytes[RawPubKeySize](cr.source_pubkey.blob),
|
||||
targetPubkey: FixedBytes[RawPubKeySize](cr.target_pubkey.blob))
|
||||
|
||||
engine_api.ExecutionPayloadV4(
|
||||
parentHash: executionPayload.parent_hash.asBlockHash,
|
||||
feeRecipient: Address(executionPayload.fee_recipient.data),
|
||||
stateRoot: executionPayload.state_root.asBlockHash,
|
||||
receiptsRoot: executionPayload.receipts_root.asBlockHash,
|
||||
logsBloom:
|
||||
FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data),
|
||||
prevRandao: executionPayload.prev_randao.asBlockHash,
|
||||
blockNumber: Quantity(executionPayload.block_number),
|
||||
gasLimit: Quantity(executionPayload.gas_limit),
|
||||
gasUsed: Quantity(executionPayload.gas_used),
|
||||
timestamp: Quantity(executionPayload.timestamp),
|
||||
extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data),
|
||||
baseFeePerGas: executionPayload.base_fee_per_gas,
|
||||
blockHash: executionPayload.block_hash.asBlockHash,
|
||||
transactions: mapIt(executionPayload.transactions, it.getTypedTransaction),
|
||||
withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal),
|
||||
blobGasUsed: Quantity(executionPayload.blob_gas_used),
|
||||
excessBlobGas: Quantity(executionPayload.excess_blob_gas),
|
||||
depositRequests: mapIt(
|
||||
executionPayload.deposit_requests, it.getDepositRequest),
|
||||
withdrawalRequests: mapIt(
|
||||
executionPayload.withdrawal_requests, it.getWithdrawalRequest),
|
||||
consolidationRequests: mapIt(
|
||||
executionPayload.consolidation_requests, it.getConsolidationRequest))
|
@ -16,6 +16,8 @@ import
|
||||
web3/[conversions, eth_api_types],
|
||||
./merkle_minimal
|
||||
|
||||
from ./engine_api_conversions import asBlockHash, asEth2Digest
|
||||
|
||||
export beacon_chain_db, deques, digest, base, forks
|
||||
|
||||
logScope:
|
||||
@ -80,12 +82,6 @@ type
|
||||
deposits*: seq[Deposit]
|
||||
hasMissingDeposits*: bool
|
||||
|
||||
func asEth2Digest*(x: BlockHash): Eth2Digest =
|
||||
Eth2Digest(data: array[32, byte](x))
|
||||
|
||||
template asBlockHash*(x: Eth2Digest): BlockHash =
|
||||
BlockHash(x.data)
|
||||
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/validator.md#get_eth1_data
|
||||
func compute_time_at_slot(genesis_time: uint64, slot: Slot): uint64 =
|
||||
genesis_time + slot * SECONDS_PER_SLOT
|
||||
@ -115,7 +111,7 @@ template findBlock(chain: Eth1Chain, eth1Data: Eth1Data): Eth1Block =
|
||||
|
||||
func makeSuccessorWithoutDeposits*(existingBlock: Eth1Block,
|
||||
successor: BlockObject): Eth1Block =
|
||||
result = Eth1Block(
|
||||
Eth1Block(
|
||||
hash: successor.hash.asEth2Digest,
|
||||
number: Eth1BlockNumber successor.number,
|
||||
timestamp: Eth1BlockTimestamp successor.timestamp)
|
||||
|
@ -17,7 +17,7 @@ import
|
||||
json_rpc/jsonmarshal,
|
||||
secp256k1,
|
||||
web3/[engine_api_types, eth_api_types, conversions],
|
||||
../el/eth1_chain,
|
||||
../el/[engine_api_conversions, eth1_chain],
|
||||
../spec/eth2_apis/[eth2_rest_serialization, rest_light_client_calls],
|
||||
../spec/[helpers, light_client_sync],
|
||||
../sync/light_client_sync_helpers,
|
||||
|
@ -24,6 +24,7 @@ import
|
||||
from std/os import changeFileExt, fileExists
|
||||
from std/sequtils import mapIt, toSeq
|
||||
from std/times import toUnix
|
||||
from ../beacon_chain/el/engine_api_conversions import asEth2Digest
|
||||
from ../beacon_chain/spec/beaconstate import initialize_beacon_state_from_eth1
|
||||
from ../tests/mocking/mock_genesis import mockEth1BlockHash
|
||||
|
||||
@ -721,4 +722,4 @@ when isMainModule:
|
||||
# This is handled above before the case statement
|
||||
discard
|
||||
|
||||
waitFor main()
|
||||
waitFor main()
|
@ -25,6 +25,7 @@ import # Unit test
|
||||
./test_datatypes,
|
||||
./test_deposit_snapshots,
|
||||
./test_discovery,
|
||||
./test_engine_api_conversions,
|
||||
./test_engine_authentication,
|
||||
./test_el_manager,
|
||||
./test_el_conf,
|
||||
|
File diff suppressed because it is too large
Load Diff
2782
tests/test_engine_api_conversions.nim
Normal file
2782
tests/test_engine_api_conversions.nim
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user