mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-28 23:34:59 +00:00
support EIP4844 LC data format (#4520)
Implements the proposed light client data format for EIP4844: - https://github.com/ethereum/consensus-specs/pull/3151
This commit is contained in:
parent
819e007689
commit
65ca523482
@ -2023,6 +2023,14 @@ OK: 1/1 Fail: 0/1 Skip: 0/1
|
|||||||
+ Testing Withdrawal OK
|
+ Testing Withdrawal OK
|
||||||
```
|
```
|
||||||
OK: 48/48 Fail: 0/48 Skip: 0/48
|
OK: 48/48 Fail: 0/48 Skip: 0/48
|
||||||
|
## EF - EIP4844 - Unittests - Light client - Sync protocol [Preset: mainnet]
|
||||||
|
```diff
|
||||||
|
+ process_light_client_update_finality_updated OK
|
||||||
|
+ process_light_client_update_timeout OK
|
||||||
|
+ test_process_light_client_update_at_period_boundary OK
|
||||||
|
+ test_process_light_client_update_not_timeout OK
|
||||||
|
```
|
||||||
|
OK: 4/4 Fail: 0/4 Skip: 0/4
|
||||||
## EF - Phase 0 - Epoch Processing - Effective balance updates [Preset: mainnet]
|
## EF - Phase 0 - Epoch Processing - Effective balance updates [Preset: mainnet]
|
||||||
```diff
|
```diff
|
||||||
+ Effective balance updates - effective_balance_hysteresis [Preset: mainnet] OK
|
+ Effective balance updates - effective_balance_hysteresis [Preset: mainnet] OK
|
||||||
@ -2588,4 +2596,4 @@ OK: 63/63 Fail: 0/63 Skip: 0/63
|
|||||||
OK: 100/100 Fail: 0/100 Skip: 0/100
|
OK: 100/100 Fail: 0/100 Skip: 0/100
|
||||||
|
|
||||||
---TOTAL---
|
---TOTAL---
|
||||||
OK: 2289/2298 Fail: 0/2298 Skip: 9/2298
|
OK: 2293/2302 Fail: 0/2302 Skip: 9/2302
|
||||||
|
@ -2187,6 +2187,14 @@ OK: 5/5 Fail: 0/5 Skip: 0/5
|
|||||||
+ Testing Withdrawal OK
|
+ Testing Withdrawal OK
|
||||||
```
|
```
|
||||||
OK: 48/48 Fail: 0/48 Skip: 0/48
|
OK: 48/48 Fail: 0/48 Skip: 0/48
|
||||||
|
## EF - EIP4844 - Unittests - Light client - Sync protocol [Preset: minimal]
|
||||||
|
```diff
|
||||||
|
+ process_light_client_update_finality_updated OK
|
||||||
|
+ process_light_client_update_timeout OK
|
||||||
|
+ test_process_light_client_update_at_period_boundary OK
|
||||||
|
+ test_process_light_client_update_not_timeout OK
|
||||||
|
```
|
||||||
|
OK: 4/4 Fail: 0/4 Skip: 0/4
|
||||||
## EF - Phase 0 - Epoch Processing - Effective balance updates [Preset: minimal]
|
## EF - Phase 0 - Epoch Processing - Effective balance updates [Preset: minimal]
|
||||||
```diff
|
```diff
|
||||||
+ Effective balance updates - effective_balance_hysteresis [Preset: minimal] OK
|
+ Effective balance updates - effective_balance_hysteresis [Preset: minimal] OK
|
||||||
@ -2755,4 +2763,4 @@ OK: 68/68 Fail: 0/68 Skip: 0/68
|
|||||||
OK: 102/102 Fail: 0/102 Skip: 0/102
|
OK: 102/102 Fail: 0/102 Skip: 0/102
|
||||||
|
|
||||||
---TOTAL---
|
---TOTAL---
|
||||||
OK: 2440/2449 Fail: 0/2449 Skip: 9/2449
|
OK: 2444/2453 Fail: 0/2453 Skip: 9/2453
|
||||||
|
@ -347,10 +347,6 @@ proc installMessageValidators*(
|
|||||||
|
|
||||||
let forkDigests = lightClient.forkDigests
|
let forkDigests = lightClient.forkDigests
|
||||||
for stateFork in BeaconStateFork:
|
for stateFork in BeaconStateFork:
|
||||||
if stateFork >= BeaconStateFork.EIP4844:
|
|
||||||
# Format is still in development, do not use Gossip at this time.
|
|
||||||
continue
|
|
||||||
|
|
||||||
withLcDataFork(lcDataForkAtStateFork(stateFork)):
|
withLcDataFork(lcDataForkAtStateFork(stateFork)):
|
||||||
when lcDataFork > LightClientDataFork.None:
|
when lcDataFork > LightClientDataFork.None:
|
||||||
let
|
let
|
||||||
@ -420,9 +416,6 @@ proc updateGossipStatus*(
|
|||||||
|
|
||||||
for gossipFork in oldGossipForks:
|
for gossipFork in oldGossipForks:
|
||||||
if gossipFork >= BeaconStateFork.Altair:
|
if gossipFork >= BeaconStateFork.Altair:
|
||||||
if gossipFork >= BeaconStateFork.EIP4844:
|
|
||||||
# Format is still in development, do not use Gossip at this time.
|
|
||||||
continue
|
|
||||||
let forkDigest = lightClient.forkDigests[].atStateFork(gossipFork)
|
let forkDigest = lightClient.forkDigests[].atStateFork(gossipFork)
|
||||||
lightClient.network.unsubscribe(
|
lightClient.network.unsubscribe(
|
||||||
getLightClientFinalityUpdateTopic(forkDigest))
|
getLightClientFinalityUpdateTopic(forkDigest))
|
||||||
@ -431,9 +424,6 @@ proc updateGossipStatus*(
|
|||||||
|
|
||||||
for gossipFork in newGossipForks:
|
for gossipFork in newGossipForks:
|
||||||
if gossipFork >= BeaconStateFork.Altair:
|
if gossipFork >= BeaconStateFork.Altair:
|
||||||
if gossipFork >= BeaconStateFork.EIP4844:
|
|
||||||
# Format is still in development, do not use Gossip at this time.
|
|
||||||
continue
|
|
||||||
let forkDigest = lightClient.forkDigests[].atStateFork(gossipFork)
|
let forkDigest = lightClient.forkDigests[].atStateFork(gossipFork)
|
||||||
lightClient.network.subscribe(
|
lightClient.network.subscribe(
|
||||||
getLightClientFinalityUpdateTopic(forkDigest),
|
getLightClientFinalityUpdateTopic(forkDigest),
|
||||||
|
@ -1430,7 +1430,7 @@ proc installMessageValidators(node: BeaconNode) =
|
|||||||
installPhase0Validators(forkDigests.altair)
|
installPhase0Validators(forkDigests.altair)
|
||||||
installPhase0Validators(forkDigests.bellatrix)
|
installPhase0Validators(forkDigests.bellatrix)
|
||||||
installPhase0Validators(forkDigests.capella)
|
installPhase0Validators(forkDigests.capella)
|
||||||
if node.dag.cfg.EIP4844_FORK_EPOCH != FAR_FUTURE_EPOCH:
|
if node.dag.cfg.EIP4844_FORK_EPOCH != FAR_FUTURE_EPOCH:
|
||||||
installPhase0Validators(forkDigests.eip4844)
|
installPhase0Validators(forkDigests.eip4844)
|
||||||
|
|
||||||
node.network.addValidator(
|
node.network.addValidator(
|
||||||
@ -1466,8 +1466,14 @@ proc installMessageValidators(node: BeaconNode) =
|
|||||||
if node.dag.cfg.EIP4844_FORK_EPOCH != FAR_FUTURE_EPOCH:
|
if node.dag.cfg.EIP4844_FORK_EPOCH != FAR_FUTURE_EPOCH:
|
||||||
node.network.addValidator(
|
node.network.addValidator(
|
||||||
getBeaconBlockAndBlobsSidecarTopic(forkDigests.eip4844),
|
getBeaconBlockAndBlobsSidecarTopic(forkDigests.eip4844),
|
||||||
proc (signedBlock: eip4844.SignedBeaconBlockAndBlobsSidecar): ValidationResult =
|
proc (
|
||||||
# TODO: take into account node.shouldSyncOptimistically(node.currentSlot)
|
signedBlock: eip4844.SignedBeaconBlockAndBlobsSidecar
|
||||||
|
): ValidationResult =
|
||||||
|
if node.shouldSyncOptimistically(node.currentSlot):
|
||||||
|
toValidationResult(
|
||||||
|
node.optimisticProcessor.processSignedBeaconBlock(
|
||||||
|
signedBlock.beacon_block))
|
||||||
|
else:
|
||||||
toValidationResult(node.processor[].processSignedBeaconBlock(
|
toValidationResult(node.processor[].processSignedBeaconBlock(
|
||||||
MsgSource.gossip, signedBlock)))
|
MsgSource.gossip, signedBlock)))
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ import
|
|||||||
./gossip_processing/optimistic_processor,
|
./gossip_processing/optimistic_processor,
|
||||||
./networking/topic_params,
|
./networking/topic_params,
|
||||||
./spec/beaconstate,
|
./spec/beaconstate,
|
||||||
./spec/datatypes/[phase0, altair, bellatrix, capella],
|
./spec/datatypes/[phase0, altair, bellatrix, capella, eip4844],
|
||||||
"."/[filepath, light_client, light_client_db, nimbus_binary_common, version]
|
"."/[filepath, light_client, light_client_db, nimbus_binary_common, version]
|
||||||
|
|
||||||
from ./consensus_object_pools/consensus_manager import runForkchoiceUpdated
|
from ./consensus_object_pools/consensus_manager import runForkchoiceUpdated
|
||||||
@ -156,6 +156,14 @@ programMain:
|
|||||||
proc (signedBlock: capella.SignedBeaconBlock): ValidationResult =
|
proc (signedBlock: capella.SignedBeaconBlock): ValidationResult =
|
||||||
toValidationResult(
|
toValidationResult(
|
||||||
optimisticProcessor.processSignedBeaconBlock(signedBlock)))
|
optimisticProcessor.processSignedBeaconBlock(signedBlock)))
|
||||||
|
network.addValidator(
|
||||||
|
getBeaconBlockAndBlobsSidecarTopic(forkDigests.eip4844),
|
||||||
|
proc (
|
||||||
|
signedBlock: eip4844.SignedBeaconBlockAndBlobsSidecar
|
||||||
|
): ValidationResult =
|
||||||
|
toValidationResult(
|
||||||
|
optimisticProcessor.processSignedBeaconBlock(
|
||||||
|
signedBlock.beacon_block)))
|
||||||
lightClient.installMessageValidators()
|
lightClient.installMessageValidators()
|
||||||
waitFor network.startListening()
|
waitFor network.startListening()
|
||||||
waitFor network.start()
|
waitFor network.start()
|
||||||
@ -252,16 +260,10 @@ programMain:
|
|||||||
oldGossipForks = currentGossipState - targetGossipState
|
oldGossipForks = currentGossipState - targetGossipState
|
||||||
|
|
||||||
for gossipFork in oldGossipForks:
|
for gossipFork in oldGossipForks:
|
||||||
if gossipFork >= BeaconStateFork.EIP4844:
|
|
||||||
# Format is still in development, do not use Gossip at this time.
|
|
||||||
continue
|
|
||||||
let forkDigest = forkDigests[].atStateFork(gossipFork)
|
let forkDigest = forkDigests[].atStateFork(gossipFork)
|
||||||
network.unsubscribe(getBeaconBlocksTopic(forkDigest))
|
network.unsubscribe(getBeaconBlocksTopic(forkDigest))
|
||||||
|
|
||||||
for gossipFork in newGossipForks:
|
for gossipFork in newGossipForks:
|
||||||
if gossipFork >= BeaconStateFork.EIP4844:
|
|
||||||
# Format is still in development, do not use Gossip at this time.
|
|
||||||
continue
|
|
||||||
let forkDigest = forkDigests[].atStateFork(gossipFork)
|
let forkDigest = forkDigests[].atStateFork(gossipFork)
|
||||||
network.subscribe(
|
network.subscribe(
|
||||||
getBeaconBlocksTopic(forkDigest), blocksTopicParams,
|
getBeaconBlocksTopic(forkDigest), blocksTopicParams,
|
||||||
|
@ -19,8 +19,10 @@ else:
|
|||||||
{.push raises: [].}
|
{.push raises: [].}
|
||||||
|
|
||||||
import
|
import
|
||||||
stew/byteutils,
|
chronicles,
|
||||||
|
stew/[bitops2, byteutils],
|
||||||
json_serialization,
|
json_serialization,
|
||||||
|
ssz_serialization/[merkleization, proofs],
|
||||||
ssz_serialization/types as sszTypes,
|
ssz_serialization/types as sszTypes,
|
||||||
../digest,
|
../digest,
|
||||||
"."/[base, phase0, altair, bellatrix, capella]
|
"."/[base, phase0, altair, bellatrix, capella]
|
||||||
@ -108,6 +110,102 @@ type
|
|||||||
ExecutePayload* = proc(
|
ExecutePayload* = proc(
|
||||||
execution_payload: ExecutionPayload): bool {.gcsafe, raises: [Defect].}
|
execution_payload: ExecutionPayload): bool {.gcsafe, raises: [Defect].}
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/capella/light-client/sync-protocol.md#lightclientheader
|
||||||
|
LightClientHeader* = object
|
||||||
|
beacon*: BeaconBlockHeader
|
||||||
|
## Beacon block header
|
||||||
|
|
||||||
|
execution*: ExecutionPayloadHeader
|
||||||
|
## Execution payload header corresponding to `beacon.body_root` (from Capella onward)
|
||||||
|
execution_branch*: capella.ExecutionBranch
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/altair/light-client/sync-protocol.md#lightclientbootstrap
|
||||||
|
LightClientBootstrap* = object
|
||||||
|
header*: LightClientHeader
|
||||||
|
## Header matching the requested beacon block root
|
||||||
|
|
||||||
|
current_sync_committee*: SyncCommittee
|
||||||
|
## Current sync committee corresponding to `header.beacon.state_root`
|
||||||
|
current_sync_committee_branch*: altair.CurrentSyncCommitteeBranch
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/altair/light-client/sync-protocol.md#lightclientupdate
|
||||||
|
LightClientUpdate* = object
|
||||||
|
attested_header*: LightClientHeader
|
||||||
|
## Header attested to by the sync committee
|
||||||
|
|
||||||
|
next_sync_committee*: SyncCommittee
|
||||||
|
## Next sync committee corresponding to `attested_header.beacon.state_root`
|
||||||
|
next_sync_committee_branch*: altair.NextSyncCommitteeBranch
|
||||||
|
|
||||||
|
# Finalized header corresponding to `attested_header.beacon.state_root`
|
||||||
|
finalized_header*: LightClientHeader
|
||||||
|
finality_branch*: altair.FinalityBranch
|
||||||
|
|
||||||
|
sync_aggregate*: SyncAggregate
|
||||||
|
## Sync committee aggregate signature
|
||||||
|
signature_slot*: Slot
|
||||||
|
## Slot at which the aggregate signature was created (untrusted)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/altair/light-client/sync-protocol.md#lightclientfinalityupdate
|
||||||
|
LightClientFinalityUpdate* = object
|
||||||
|
# Header attested to by the sync committee
|
||||||
|
attested_header*: LightClientHeader
|
||||||
|
|
||||||
|
# Finalized header corresponding to `attested_header.beacon.state_root`
|
||||||
|
finalized_header*: LightClientHeader
|
||||||
|
finality_branch*: altair.FinalityBranch
|
||||||
|
|
||||||
|
# Sync committee aggregate signature
|
||||||
|
sync_aggregate*: SyncAggregate
|
||||||
|
# Slot at which the aggregate signature was created (untrusted)
|
||||||
|
signature_slot*: Slot
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/altair/light-client/sync-protocol.md#lightclientoptimisticupdate
|
||||||
|
LightClientOptimisticUpdate* = object
|
||||||
|
# Header attested to by the sync committee
|
||||||
|
attested_header*: LightClientHeader
|
||||||
|
|
||||||
|
# Sync committee aggregate signature
|
||||||
|
sync_aggregate*: SyncAggregate
|
||||||
|
# Slot at which the aggregate signature was created (untrusted)
|
||||||
|
signature_slot*: Slot
|
||||||
|
|
||||||
|
SomeLightClientUpdateWithSyncCommittee* =
|
||||||
|
LightClientUpdate
|
||||||
|
|
||||||
|
SomeLightClientUpdateWithFinality* =
|
||||||
|
LightClientUpdate |
|
||||||
|
LightClientFinalityUpdate
|
||||||
|
|
||||||
|
SomeLightClientUpdate* =
|
||||||
|
LightClientUpdate |
|
||||||
|
LightClientFinalityUpdate |
|
||||||
|
LightClientOptimisticUpdate
|
||||||
|
|
||||||
|
SomeLightClientObject* =
|
||||||
|
LightClientBootstrap |
|
||||||
|
SomeLightClientUpdate
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/altair/light-client/sync-protocol.md#lightclientstore
|
||||||
|
LightClientStore* = object
|
||||||
|
finalized_header*: LightClientHeader
|
||||||
|
## Header that is finalized
|
||||||
|
|
||||||
|
current_sync_committee*: SyncCommittee
|
||||||
|
## Sync committees corresponding to the finalized header
|
||||||
|
next_sync_committee*: SyncCommittee
|
||||||
|
|
||||||
|
best_valid_update*: Opt[LightClientUpdate]
|
||||||
|
## Best available header to switch finalized head to if we see nothing else
|
||||||
|
|
||||||
|
optimistic_header*: LightClientHeader
|
||||||
|
## Most recent available reasonably-safe header
|
||||||
|
|
||||||
|
previous_max_active_participants*: uint64
|
||||||
|
## Max number of active participants in a sync committee (used to compute
|
||||||
|
## safety threshold)
|
||||||
|
current_max_active_participants*: uint64
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/specs/capella/beacon-chain.md#beaconstate
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/specs/capella/beacon-chain.md#beaconstate
|
||||||
# changes indirectly via ExecutionPayloadHeader
|
# changes indirectly via ExecutionPayloadHeader
|
||||||
BeaconState* = object
|
BeaconState* = object
|
||||||
@ -403,6 +501,243 @@ func shortLog*(v: SomeSignedBeaconBlock): auto =
|
|||||||
blck: shortLog(v.message),
|
blck: shortLog(v.message),
|
||||||
signature: shortLog(v.signature)
|
signature: shortLog(v.signature)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/sync-protocol.md#get_lc_execution_root
|
||||||
|
func get_lc_execution_root*(
|
||||||
|
header: LightClientHeader, cfg: RuntimeConfig): Eth2Digest =
|
||||||
|
let epoch = header.beacon.slot.epoch
|
||||||
|
|
||||||
|
if epoch >= cfg.EIP4844_FORK_EPOCH:
|
||||||
|
return hash_tree_root(header.execution)
|
||||||
|
|
||||||
|
if epoch >= cfg.CAPELLA_FORK_EPOCH:
|
||||||
|
let execution_header = capella.ExecutionPayloadHeader(
|
||||||
|
parent_hash: header.execution.parent_hash,
|
||||||
|
fee_recipient: header.execution.fee_recipient,
|
||||||
|
state_root: header.execution.state_root,
|
||||||
|
receipts_root: header.execution.receipts_root,
|
||||||
|
logs_bloom: header.execution.logs_bloom,
|
||||||
|
prev_randao: header.execution.prev_randao,
|
||||||
|
block_number: header.execution.block_number,
|
||||||
|
gas_limit: header.execution.gas_limit,
|
||||||
|
gas_used: header.execution.gas_used,
|
||||||
|
timestamp: header.execution.timestamp,
|
||||||
|
extra_data: header.execution.extra_data,
|
||||||
|
base_fee_per_gas: header.execution.base_fee_per_gas,
|
||||||
|
block_hash: header.execution.block_hash,
|
||||||
|
transactions_root: header.execution.transactions_root,
|
||||||
|
withdrawals_root: header.execution.withdrawals_root)
|
||||||
|
return hash_tree_root(execution_header)
|
||||||
|
|
||||||
|
ZERO_HASH
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/sync-protocol.md#is_valid_light_client_header
|
||||||
|
func is_valid_light_client_header*(
|
||||||
|
header: LightClientHeader, cfg: RuntimeConfig): bool =
|
||||||
|
let epoch = header.beacon.slot.epoch
|
||||||
|
|
||||||
|
if epoch < cfg.EIP4844_FORK_EPOCH:
|
||||||
|
if header.execution.excess_data_gas != 0.u256:
|
||||||
|
return false
|
||||||
|
|
||||||
|
if epoch < cfg.CAPELLA_FORK_EPOCH:
|
||||||
|
return
|
||||||
|
header.execution == default(ExecutionPayloadHeader) and
|
||||||
|
header.execution_branch == default(ExecutionBranch)
|
||||||
|
|
||||||
|
is_valid_merkle_branch(
|
||||||
|
get_lc_execution_root(header, cfg),
|
||||||
|
header.execution_branch,
|
||||||
|
log2trunc(EXECUTION_PAYLOAD_INDEX),
|
||||||
|
get_subtree_index(EXECUTION_PAYLOAD_INDEX),
|
||||||
|
header.beacon.body_root)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/fork.md#upgrade_lc_header_to_eip4844
|
||||||
|
func upgrade_lc_header_to_eip4844*(
|
||||||
|
pre: capella.LightClientHeader): LightClientHeader =
|
||||||
|
LightClientHeader(
|
||||||
|
beacon: pre.beacon,
|
||||||
|
execution: ExecutionPayloadHeader(
|
||||||
|
parent_hash: pre.execution.parent_hash,
|
||||||
|
fee_recipient: pre.execution.fee_recipient,
|
||||||
|
state_root: pre.execution.state_root,
|
||||||
|
receipts_root: pre.execution.receipts_root,
|
||||||
|
logs_bloom: pre.execution.logs_bloom,
|
||||||
|
prev_randao: pre.execution.prev_randao,
|
||||||
|
block_number: pre.execution.block_number,
|
||||||
|
gas_limit: pre.execution.gas_limit,
|
||||||
|
gas_used: pre.execution.gas_used,
|
||||||
|
timestamp: pre.execution.timestamp,
|
||||||
|
extra_data: pre.execution.extra_data,
|
||||||
|
base_fee_per_gas: pre.execution.base_fee_per_gas,
|
||||||
|
block_hash: pre.execution.block_hash,
|
||||||
|
transactions_root: pre.execution.transactions_root,
|
||||||
|
withdrawals_root: pre.execution.withdrawals_root),
|
||||||
|
execution_branch: pre.execution_branch)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/fork.md#upgrade_lc_bootstrap_to_eip4844
|
||||||
|
func upgrade_lc_bootstrap_to_eip4844*(
|
||||||
|
pre: capella.LightClientBootstrap): LightClientBootstrap =
|
||||||
|
LightClientBootstrap(
|
||||||
|
header: upgrade_lc_header_to_eip4844(pre.header),
|
||||||
|
current_sync_committee: pre.current_sync_committee,
|
||||||
|
current_sync_committee_branch: pre.current_sync_committee_branch)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/fork.md#upgrade_lc_update_to_eip4844
|
||||||
|
func upgrade_lc_update_to_eip4844*(
|
||||||
|
pre: capella.LightClientUpdate): LightClientUpdate =
|
||||||
|
LightClientUpdate(
|
||||||
|
attested_header: upgrade_lc_header_to_eip4844(pre.attested_header),
|
||||||
|
next_sync_committee: pre.next_sync_committee,
|
||||||
|
next_sync_committee_branch: pre.next_sync_committee_branch,
|
||||||
|
finalized_header: upgrade_lc_header_to_eip4844(pre.finalized_header),
|
||||||
|
finality_branch: pre.finality_branch,
|
||||||
|
sync_aggregate: pre.sync_aggregate,
|
||||||
|
signature_slot: pre.signature_slot)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/fork.md#upgrade_lc_finality_update_to_eip4844
|
||||||
|
func upgrade_lc_finality_update_to_eip4844*(
|
||||||
|
pre: capella.LightClientFinalityUpdate): LightClientFinalityUpdate =
|
||||||
|
LightClientFinalityUpdate(
|
||||||
|
attested_header: upgrade_lc_header_to_eip4844(pre.attested_header),
|
||||||
|
finalized_header: upgrade_lc_header_to_eip4844(pre.finalized_header),
|
||||||
|
finality_branch: pre.finality_branch,
|
||||||
|
sync_aggregate: pre.sync_aggregate,
|
||||||
|
signature_slot: pre.signature_slot)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/fork.md#upgrade_lc_optimistic_update_to_eip4844
|
||||||
|
func upgrade_lc_optimistic_update_to_eip4844*(
|
||||||
|
pre: capella.LightClientOptimisticUpdate): LightClientOptimisticUpdate =
|
||||||
|
LightClientOptimisticUpdate(
|
||||||
|
attested_header: upgrade_lc_header_to_eip4844(pre.attested_header),
|
||||||
|
sync_aggregate: pre.sync_aggregate,
|
||||||
|
signature_slot: pre.signature_slot)
|
||||||
|
|
||||||
|
func shortLog*(v: LightClientHeader): auto =
|
||||||
|
(
|
||||||
|
beacon: shortLog(v.beacon),
|
||||||
|
execution: (
|
||||||
|
block_hash: v.execution.block_hash,
|
||||||
|
block_number: v.execution.block_number)
|
||||||
|
)
|
||||||
|
|
||||||
|
func shortLog*(v: LightClientBootstrap): auto =
|
||||||
|
(
|
||||||
|
header: shortLog(v.header)
|
||||||
|
)
|
||||||
|
|
||||||
|
func shortLog*(v: LightClientUpdate): auto =
|
||||||
|
(
|
||||||
|
attested: shortLog(v.attested_header),
|
||||||
|
has_next_sync_committee:
|
||||||
|
v.next_sync_committee != default(typeof(v.next_sync_committee)),
|
||||||
|
finalized: shortLog(v.finalized_header),
|
||||||
|
num_active_participants: v.sync_aggregate.num_active_participants,
|
||||||
|
signature_slot: v.signature_slot
|
||||||
|
)
|
||||||
|
|
||||||
|
func shortLog*(v: LightClientFinalityUpdate): auto =
|
||||||
|
(
|
||||||
|
attested: shortLog(v.attested_header),
|
||||||
|
finalized: shortLog(v.finalized_header),
|
||||||
|
num_active_participants: v.sync_aggregate.num_active_participants,
|
||||||
|
signature_slot: v.signature_slot
|
||||||
|
)
|
||||||
|
|
||||||
|
func shortLog*(v: LightClientOptimisticUpdate): auto =
|
||||||
|
(
|
||||||
|
attested: shortLog(v.attested_header),
|
||||||
|
num_active_participants: v.sync_aggregate.num_active_participants,
|
||||||
|
signature_slot: v.signature_slot,
|
||||||
|
)
|
||||||
|
|
||||||
|
chronicles.formatIt LightClientBootstrap: shortLog(it)
|
||||||
|
chronicles.formatIt LightClientUpdate: shortLog(it)
|
||||||
|
chronicles.formatIt LightClientFinalityUpdate: shortLog(it)
|
||||||
|
chronicles.formatIt LightClientOptimisticUpdate: shortLog(it)
|
||||||
|
|
||||||
|
template toFull*(
|
||||||
|
update: SomeLightClientUpdate): LightClientUpdate =
|
||||||
|
when update is LightClientUpdate:
|
||||||
|
update
|
||||||
|
elif update is SomeLightClientUpdateWithFinality:
|
||||||
|
LightClientUpdate(
|
||||||
|
attested_header: update.attested_header,
|
||||||
|
finalized_header: update.finalized_header,
|
||||||
|
finality_branch: update.finality_branch,
|
||||||
|
sync_aggregate: update.sync_aggregate,
|
||||||
|
signature_slot: update.signature_slot)
|
||||||
|
else:
|
||||||
|
LightClientUpdate(
|
||||||
|
attested_header: update.attested_header,
|
||||||
|
sync_aggregate: update.sync_aggregate,
|
||||||
|
signature_slot: update.signature_slot)
|
||||||
|
|
||||||
|
template toFinality*(
|
||||||
|
update: SomeLightClientUpdate): LightClientFinalityUpdate =
|
||||||
|
when update is LightClientFinalityUpdate:
|
||||||
|
update
|
||||||
|
elif update is SomeLightClientUpdateWithFinality:
|
||||||
|
LightClientFinalityUpdate(
|
||||||
|
attested_header: update.attested_header,
|
||||||
|
finalized_header: update.finalized_header,
|
||||||
|
finality_branch: update.finality_branch,
|
||||||
|
sync_aggregate: update.sync_aggregate,
|
||||||
|
signature_slot: update.signature_slot)
|
||||||
|
else:
|
||||||
|
LightClientFinalityUpdate(
|
||||||
|
attested_header: update.attested_header,
|
||||||
|
sync_aggregate: update.sync_aggregate,
|
||||||
|
signature_slot: update.signature_slot)
|
||||||
|
|
||||||
|
template toOptimistic*(
|
||||||
|
update: SomeLightClientUpdate): LightClientOptimisticUpdate =
|
||||||
|
when update is LightClientOptimisticUpdate:
|
||||||
|
update
|
||||||
|
else:
|
||||||
|
LightClientOptimisticUpdate(
|
||||||
|
attested_header: update.attested_header,
|
||||||
|
sync_aggregate: update.sync_aggregate,
|
||||||
|
signature_slot: update.signature_slot)
|
||||||
|
|
||||||
|
func matches*[A, B: SomeLightClientUpdate](a: A, b: B): bool =
|
||||||
|
if a.attested_header != b.attested_header:
|
||||||
|
return false
|
||||||
|
when a is SomeLightClientUpdateWithSyncCommittee and
|
||||||
|
b is SomeLightClientUpdateWithSyncCommittee:
|
||||||
|
if a.next_sync_committee != b.next_sync_committee:
|
||||||
|
return false
|
||||||
|
if a.next_sync_committee_branch != b.next_sync_committee_branch:
|
||||||
|
return false
|
||||||
|
when a is SomeLightClientUpdateWithFinality and
|
||||||
|
b is SomeLightClientUpdateWithFinality:
|
||||||
|
if a.finalized_header != b.finalized_header:
|
||||||
|
return false
|
||||||
|
if a.finality_branch != b.finality_branch:
|
||||||
|
return false
|
||||||
|
if a.sync_aggregate != b.sync_aggregate:
|
||||||
|
return false
|
||||||
|
if a.signature_slot != b.signature_slot:
|
||||||
|
return false
|
||||||
|
true
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/fork.md#upgrade_lc_store_to_eip4844
|
||||||
|
func upgrade_lc_store_to_eip4844*(
|
||||||
|
pre: capella.LightClientStore): LightClientStore =
|
||||||
|
let best_valid_update =
|
||||||
|
if pre.best_valid_update.isNone:
|
||||||
|
Opt.none(LightClientUpdate)
|
||||||
|
else:
|
||||||
|
Opt.some upgrade_lc_update_to_eip4844(pre.best_valid_update.get)
|
||||||
|
LightClientStore(
|
||||||
|
finalized_header: upgrade_lc_header_to_eip4844(pre.finalized_header),
|
||||||
|
current_sync_committee: pre.current_sync_committee,
|
||||||
|
next_sync_committee: pre.next_sync_committee,
|
||||||
|
best_valid_update: best_valid_update,
|
||||||
|
optimistic_header: upgrade_lc_header_to_eip4844(pre.optimistic_header),
|
||||||
|
previous_max_active_participants: pre.previous_max_active_participants,
|
||||||
|
current_max_active_participants: pre.current_max_active_participants)
|
||||||
|
|
||||||
template asSigned*(
|
template asSigned*(
|
||||||
x: SigVerifiedSignedBeaconBlock |
|
x: SigVerifiedSignedBeaconBlock |
|
||||||
MsgTrustedSignedBeaconBlock |
|
MsgTrustedSignedBeaconBlock |
|
||||||
|
@ -927,8 +927,10 @@ func nextForkEpochAtEpoch*(cfg: RuntimeConfig, epoch: Epoch): Epoch =
|
|||||||
of BeaconStateFork.Phase0: cfg.ALTAIR_FORK_EPOCH
|
of BeaconStateFork.Phase0: cfg.ALTAIR_FORK_EPOCH
|
||||||
|
|
||||||
func lcDataForkAtStateFork*(stateFork: BeaconStateFork): LightClientDataFork =
|
func lcDataForkAtStateFork*(stateFork: BeaconStateFork): LightClientDataFork =
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
if stateFork >= BeaconStateFork.Capella:
|
if stateFork >= BeaconStateFork.EIP4844:
|
||||||
|
LightClientDataFork.EIP4844
|
||||||
|
elif stateFork >= BeaconStateFork.Capella:
|
||||||
LightClientDataFork.Capella
|
LightClientDataFork.Capella
|
||||||
elif stateFork >= BeaconStateFork.Altair:
|
elif stateFork >= BeaconStateFork.Altair:
|
||||||
LightClientDataFork.Altair
|
LightClientDataFork.Altair
|
||||||
|
@ -18,27 +18,33 @@ type
|
|||||||
LightClientDataFork* {.pure.} = enum # Append only, used in DB data!
|
LightClientDataFork* {.pure.} = enum # Append only, used in DB data!
|
||||||
None = 0, # only use non-0 in DB to detect accidentally uninitialized data
|
None = 0, # only use non-0 in DB to detect accidentally uninitialized data
|
||||||
Altair = 1,
|
Altair = 1,
|
||||||
Capella = 2
|
Capella = 2,
|
||||||
|
EIP4844 = 3
|
||||||
|
|
||||||
ForkyLightClientHeader* =
|
ForkyLightClientHeader* =
|
||||||
altair.LightClientHeader |
|
altair.LightClientHeader |
|
||||||
capella.LightClientHeader
|
capella.LightClientHeader |
|
||||||
|
eip4844.LightClientHeader
|
||||||
|
|
||||||
ForkyLightClientBootstrap* =
|
ForkyLightClientBootstrap* =
|
||||||
altair.LightClientBootstrap |
|
altair.LightClientBootstrap |
|
||||||
capella.LightClientBootstrap
|
capella.LightClientBootstrap |
|
||||||
|
eip4844.LightClientBootstrap
|
||||||
|
|
||||||
ForkyLightClientUpdate* =
|
ForkyLightClientUpdate* =
|
||||||
altair.LightClientUpdate |
|
altair.LightClientUpdate |
|
||||||
capella.LightClientUpdate
|
capella.LightClientUpdate |
|
||||||
|
eip4844.LightClientUpdate
|
||||||
|
|
||||||
ForkyLightClientFinalityUpdate* =
|
ForkyLightClientFinalityUpdate* =
|
||||||
altair.LightClientFinalityUpdate |
|
altair.LightClientFinalityUpdate |
|
||||||
capella.LightClientFinalityUpdate
|
capella.LightClientFinalityUpdate |
|
||||||
|
eip4844.LightClientFinalityUpdate
|
||||||
|
|
||||||
ForkyLightClientOptimisticUpdate* =
|
ForkyLightClientOptimisticUpdate* =
|
||||||
altair.LightClientOptimisticUpdate |
|
altair.LightClientOptimisticUpdate |
|
||||||
capella.LightClientOptimisticUpdate
|
capella.LightClientOptimisticUpdate |
|
||||||
|
eip4844.LightClientOptimisticUpdate
|
||||||
|
|
||||||
SomeForkyLightClientUpdateWithSyncCommittee* =
|
SomeForkyLightClientUpdateWithSyncCommittee* =
|
||||||
ForkyLightClientUpdate
|
ForkyLightClientUpdate
|
||||||
@ -58,7 +64,8 @@ type
|
|||||||
|
|
||||||
ForkyLightClientStore* =
|
ForkyLightClientStore* =
|
||||||
altair.LightClientStore |
|
altair.LightClientStore |
|
||||||
capella.LightClientStore
|
capella.LightClientStore |
|
||||||
|
eip4844.LightClientStore
|
||||||
|
|
||||||
ForkedLightClientHeader* = object
|
ForkedLightClientHeader* = object
|
||||||
case kind*: LightClientDataFork
|
case kind*: LightClientDataFork
|
||||||
@ -68,6 +75,8 @@ type
|
|||||||
altairData*: altair.LightClientHeader
|
altairData*: altair.LightClientHeader
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
capellaData*: capella.LightClientHeader
|
capellaData*: capella.LightClientHeader
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
eip4844Data*: eip4844.LightClientHeader
|
||||||
|
|
||||||
ForkedLightClientBootstrap* = object
|
ForkedLightClientBootstrap* = object
|
||||||
case kind*: LightClientDataFork
|
case kind*: LightClientDataFork
|
||||||
@ -77,6 +86,8 @@ type
|
|||||||
altairData*: altair.LightClientBootstrap
|
altairData*: altair.LightClientBootstrap
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
capellaData*: capella.LightClientBootstrap
|
capellaData*: capella.LightClientBootstrap
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
eip4844Data*: eip4844.LightClientBootstrap
|
||||||
|
|
||||||
ForkedLightClientUpdate* = object
|
ForkedLightClientUpdate* = object
|
||||||
case kind*: LightClientDataFork
|
case kind*: LightClientDataFork
|
||||||
@ -86,6 +97,8 @@ type
|
|||||||
altairData*: altair.LightClientUpdate
|
altairData*: altair.LightClientUpdate
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
capellaData*: capella.LightClientUpdate
|
capellaData*: capella.LightClientUpdate
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
eip4844Data*: eip4844.LightClientUpdate
|
||||||
|
|
||||||
ForkedLightClientFinalityUpdate* = object
|
ForkedLightClientFinalityUpdate* = object
|
||||||
case kind*: LightClientDataFork
|
case kind*: LightClientDataFork
|
||||||
@ -95,6 +108,8 @@ type
|
|||||||
altairData*: altair.LightClientFinalityUpdate
|
altairData*: altair.LightClientFinalityUpdate
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
capellaData*: capella.LightClientFinalityUpdate
|
capellaData*: capella.LightClientFinalityUpdate
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
eip4844Data*: eip4844.LightClientFinalityUpdate
|
||||||
|
|
||||||
ForkedLightClientOptimisticUpdate* = object
|
ForkedLightClientOptimisticUpdate* = object
|
||||||
case kind*: LightClientDataFork
|
case kind*: LightClientDataFork
|
||||||
@ -104,6 +119,8 @@ type
|
|||||||
altairData*: altair.LightClientOptimisticUpdate
|
altairData*: altair.LightClientOptimisticUpdate
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
capellaData*: capella.LightClientOptimisticUpdate
|
capellaData*: capella.LightClientOptimisticUpdate
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
eip4844Data*: eip4844.LightClientOptimisticUpdate
|
||||||
|
|
||||||
SomeForkedLightClientUpdateWithSyncCommittee* =
|
SomeForkedLightClientUpdateWithSyncCommittee* =
|
||||||
ForkedLightClientUpdate
|
ForkedLightClientUpdate
|
||||||
@ -129,11 +146,15 @@ type
|
|||||||
altairData*: altair.LightClientStore
|
altairData*: altair.LightClientStore
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
capellaData*: capella.LightClientStore
|
capellaData*: capella.LightClientStore
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
eip4844Data*: eip4844.LightClientStore
|
||||||
|
|
||||||
func lcDataForkAtEpoch*(
|
func lcDataForkAtEpoch*(
|
||||||
cfg: RuntimeConfig, epoch: Epoch): LightClientDataFork =
|
cfg: RuntimeConfig, epoch: Epoch): LightClientDataFork =
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
if epoch >= cfg.CAPELLA_FORK_EPOCH:
|
if epoch >= cfg.EIP4844_FORK_EPOCH:
|
||||||
|
LightClientDataFork.EIP4844
|
||||||
|
elif epoch >= cfg.CAPELLA_FORK_EPOCH:
|
||||||
LightClientDataFork.Capella
|
LightClientDataFork.Capella
|
||||||
elif epoch >= cfg.ALTAIR_FORK_EPOCH:
|
elif epoch >= cfg.ALTAIR_FORK_EPOCH:
|
||||||
LightClientDataFork.Altair
|
LightClientDataFork.Altair
|
||||||
@ -160,8 +181,20 @@ template kind*(
|
|||||||
capella.LightClientStore]): LightClientDataFork =
|
capella.LightClientStore]): LightClientDataFork =
|
||||||
LightClientDataFork.Capella
|
LightClientDataFork.Capella
|
||||||
|
|
||||||
|
template kind*(
|
||||||
|
x: typedesc[ # `SomeLightClientObject` doesn't work here (Nim 1.6)
|
||||||
|
eip4844.LightClientHeader |
|
||||||
|
eip4844.LightClientBootstrap |
|
||||||
|
eip4844.LightClientUpdate |
|
||||||
|
eip4844.LightClientFinalityUpdate |
|
||||||
|
eip4844.LightClientOptimisticUpdate |
|
||||||
|
eip4844.LightClientStore]): LightClientDataFork =
|
||||||
|
LightClientDataFork.EIP4844
|
||||||
|
|
||||||
template LightClientHeader*(kind: static LightClientDataFork): auto =
|
template LightClientHeader*(kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
typedesc[eip4844.LightClientHeader]
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
typedesc[capella.LightClientHeader]
|
typedesc[capella.LightClientHeader]
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
typedesc[altair.LightClientHeader]
|
typedesc[altair.LightClientHeader]
|
||||||
@ -169,7 +202,9 @@ template LightClientHeader*(kind: static LightClientDataFork): auto =
|
|||||||
static: raiseAssert "Unreachable"
|
static: raiseAssert "Unreachable"
|
||||||
|
|
||||||
template LightClientBootstrap*(kind: static LightClientDataFork): auto =
|
template LightClientBootstrap*(kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
typedesc[eip4844.LightClientBootstrap]
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
typedesc[capella.LightClientBootstrap]
|
typedesc[capella.LightClientBootstrap]
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
typedesc[altair.LightClientBootstrap]
|
typedesc[altair.LightClientBootstrap]
|
||||||
@ -177,7 +212,9 @@ template LightClientBootstrap*(kind: static LightClientDataFork): auto =
|
|||||||
static: raiseAssert "Unreachable"
|
static: raiseAssert "Unreachable"
|
||||||
|
|
||||||
template LightClientUpdate*(kind: static LightClientDataFork): auto =
|
template LightClientUpdate*(kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
typedesc[eip4844.LightClientUpdate]
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
typedesc[capella.LightClientUpdate]
|
typedesc[capella.LightClientUpdate]
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
typedesc[altair.LightClientUpdate]
|
typedesc[altair.LightClientUpdate]
|
||||||
@ -185,7 +222,9 @@ template LightClientUpdate*(kind: static LightClientDataFork): auto =
|
|||||||
static: raiseAssert "Unreachable"
|
static: raiseAssert "Unreachable"
|
||||||
|
|
||||||
template LightClientFinalityUpdate*(kind: static LightClientDataFork): auto =
|
template LightClientFinalityUpdate*(kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
typedesc[eip4844.LightClientFinalityUpdate]
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
typedesc[capella.LightClientFinalityUpdate]
|
typedesc[capella.LightClientFinalityUpdate]
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
typedesc[altair.LightClientFinalityUpdate]
|
typedesc[altair.LightClientFinalityUpdate]
|
||||||
@ -193,7 +232,9 @@ template LightClientFinalityUpdate*(kind: static LightClientDataFork): auto =
|
|||||||
static: raiseAssert "Unreachable"
|
static: raiseAssert "Unreachable"
|
||||||
|
|
||||||
template LightClientOptimisticUpdate*(kind: static LightClientDataFork): auto =
|
template LightClientOptimisticUpdate*(kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
typedesc[eip4844.LightClientOptimisticUpdate]
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
typedesc[capella.LightClientOptimisticUpdate]
|
typedesc[capella.LightClientOptimisticUpdate]
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
typedesc[altair.LightClientOptimisticUpdate]
|
typedesc[altair.LightClientOptimisticUpdate]
|
||||||
@ -201,7 +242,9 @@ template LightClientOptimisticUpdate*(kind: static LightClientDataFork): auto =
|
|||||||
static: raiseAssert "Unreachable"
|
static: raiseAssert "Unreachable"
|
||||||
|
|
||||||
template LightClientStore*(kind: static LightClientDataFork): auto =
|
template LightClientStore*(kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
typedesc[eip4844.LightClientStore]
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
typedesc[capella.LightClientStore]
|
typedesc[capella.LightClientStore]
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
typedesc[altair.LightClientStore]
|
typedesc[altair.LightClientStore]
|
||||||
@ -258,7 +301,10 @@ template Forked*(x: typedesc[ForkyLightClientStore]): auto =
|
|||||||
|
|
||||||
template withAll*(
|
template withAll*(
|
||||||
x: typedesc[LightClientDataFork], body: untyped): untyped =
|
x: typedesc[LightClientDataFork], body: untyped): untyped =
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
|
block:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
body
|
||||||
block:
|
block:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
body
|
body
|
||||||
@ -272,6 +318,9 @@ template withAll*(
|
|||||||
template withLcDataFork*(
|
template withLcDataFork*(
|
||||||
x: LightClientDataFork, body: untyped): untyped =
|
x: LightClientDataFork, body: untyped): untyped =
|
||||||
case x
|
case x
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
body
|
body
|
||||||
@ -285,6 +334,10 @@ template withLcDataFork*(
|
|||||||
template withForkyHeader*(
|
template withForkyHeader*(
|
||||||
x: ForkedLightClientHeader, body: untyped): untyped =
|
x: ForkedLightClientHeader, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyHeader: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyHeader: untyped {.inject, used.} = x.capellaData
|
template forkyHeader: untyped {.inject, used.} = x.capellaData
|
||||||
@ -300,6 +353,10 @@ template withForkyHeader*(
|
|||||||
template withForkyBootstrap*(
|
template withForkyBootstrap*(
|
||||||
x: ForkedLightClientBootstrap, body: untyped): untyped =
|
x: ForkedLightClientBootstrap, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyBootstrap: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyBootstrap: untyped {.inject, used.} = x.capellaData
|
template forkyBootstrap: untyped {.inject, used.} = x.capellaData
|
||||||
@ -315,6 +372,10 @@ template withForkyBootstrap*(
|
|||||||
template withForkyUpdate*(
|
template withForkyUpdate*(
|
||||||
x: ForkedLightClientUpdate, body: untyped): untyped =
|
x: ForkedLightClientUpdate, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyUpdate: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyUpdate: untyped {.inject, used.} = x.capellaData
|
template forkyUpdate: untyped {.inject, used.} = x.capellaData
|
||||||
@ -330,6 +391,10 @@ template withForkyUpdate*(
|
|||||||
template withForkyFinalityUpdate*(
|
template withForkyFinalityUpdate*(
|
||||||
x: ForkedLightClientFinalityUpdate, body: untyped): untyped =
|
x: ForkedLightClientFinalityUpdate, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyFinalityUpdate: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyFinalityUpdate: untyped {.inject, used.} = x.capellaData
|
template forkyFinalityUpdate: untyped {.inject, used.} = x.capellaData
|
||||||
@ -345,6 +410,10 @@ template withForkyFinalityUpdate*(
|
|||||||
template withForkyOptimisticUpdate*(
|
template withForkyOptimisticUpdate*(
|
||||||
x: ForkedLightClientOptimisticUpdate, body: untyped): untyped =
|
x: ForkedLightClientOptimisticUpdate, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyOptimisticUpdate: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyOptimisticUpdate: untyped {.inject, used.} = x.capellaData
|
template forkyOptimisticUpdate: untyped {.inject, used.} = x.capellaData
|
||||||
@ -360,6 +429,10 @@ template withForkyOptimisticUpdate*(
|
|||||||
template withForkyObject*(
|
template withForkyObject*(
|
||||||
x: SomeForkedLightClientObject, body: untyped): untyped =
|
x: SomeForkedLightClientObject, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyObject: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyObject: untyped {.inject, used.} = x.capellaData
|
template forkyObject: untyped {.inject, used.} = x.capellaData
|
||||||
@ -375,6 +448,10 @@ template withForkyObject*(
|
|||||||
template withForkyStore*(
|
template withForkyStore*(
|
||||||
x: ForkedLightClientStore, body: untyped): untyped =
|
x: ForkedLightClientStore, body: untyped): untyped =
|
||||||
case x.kind
|
case x.kind
|
||||||
|
of LightClientDataFork.EIP4844:
|
||||||
|
const lcDataFork {.inject, used.} = LightClientDataFork.EIP4844
|
||||||
|
template forkyStore: untyped {.inject, used.} = x.eip4844Data
|
||||||
|
body
|
||||||
of LightClientDataFork.Capella:
|
of LightClientDataFork.Capella:
|
||||||
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
const lcDataFork {.inject, used.} = LightClientDataFork.Capella
|
||||||
template forkyStore: untyped {.inject, used.} = x.capellaData
|
template forkyStore: untyped {.inject, used.} = x.capellaData
|
||||||
@ -444,7 +521,9 @@ template forky*(
|
|||||||
SomeForkedLightClientObject |
|
SomeForkedLightClientObject |
|
||||||
ForkedLightClientStore,
|
ForkedLightClientStore,
|
||||||
kind: static LightClientDataFork): untyped =
|
kind: static LightClientDataFork): untyped =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
x.eip4844Data
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
x.capellaData
|
x.capellaData
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
x.altairData
|
x.altairData
|
||||||
@ -475,7 +554,15 @@ func migrateToDataFork*(
|
|||||||
capellaData: upgrade_lc_header_to_capella(
|
capellaData: upgrade_lc_header_to_capella(
|
||||||
x.forky(LightClientDataFork.Altair)))
|
x.forky(LightClientDataFork.Altair)))
|
||||||
|
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
# Upgrade to EIP4844
|
||||||
|
when newKind >= LightClientDataFork.EIP4844:
|
||||||
|
if x.kind == LightClientDataFork.Capella:
|
||||||
|
x = ForkedLightClientHeader(
|
||||||
|
kind: LightClientDataFork.EIP4844,
|
||||||
|
eip4844Data: upgrade_lc_header_to_eip4844(
|
||||||
|
x.forky(LightClientDataFork.Capella)))
|
||||||
|
|
||||||
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
doAssert x.kind == newKind
|
doAssert x.kind == newKind
|
||||||
|
|
||||||
func migrateToDataFork*(
|
func migrateToDataFork*(
|
||||||
@ -502,7 +589,15 @@ func migrateToDataFork*(
|
|||||||
capellaData: upgrade_lc_bootstrap_to_capella(
|
capellaData: upgrade_lc_bootstrap_to_capella(
|
||||||
x.forky(LightClientDataFork.Altair)))
|
x.forky(LightClientDataFork.Altair)))
|
||||||
|
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
# Upgrade to EIP4844
|
||||||
|
when newKind >= LightClientDataFork.EIP4844:
|
||||||
|
if x.kind == LightClientDataFork.Capella:
|
||||||
|
x = ForkedLightClientBootstrap(
|
||||||
|
kind: LightClientDataFork.EIP4844,
|
||||||
|
eip4844Data: upgrade_lc_bootstrap_to_eip4844(
|
||||||
|
x.forky(LightClientDataFork.Capella)))
|
||||||
|
|
||||||
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
doAssert x.kind == newKind
|
doAssert x.kind == newKind
|
||||||
|
|
||||||
func migrateToDataFork*(
|
func migrateToDataFork*(
|
||||||
@ -529,7 +624,15 @@ func migrateToDataFork*(
|
|||||||
capellaData: upgrade_lc_update_to_capella(
|
capellaData: upgrade_lc_update_to_capella(
|
||||||
x.forky(LightClientDataFork.Altair)))
|
x.forky(LightClientDataFork.Altair)))
|
||||||
|
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
# Upgrade to EIP4844
|
||||||
|
when newKind >= LightClientDataFork.EIP4844:
|
||||||
|
if x.kind == LightClientDataFork.Capella:
|
||||||
|
x = ForkedLightClientUpdate(
|
||||||
|
kind: LightClientDataFork.EIP4844,
|
||||||
|
eip4844Data: upgrade_lc_update_to_eip4844(
|
||||||
|
x.forky(LightClientDataFork.Capella)))
|
||||||
|
|
||||||
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
doAssert x.kind == newKind
|
doAssert x.kind == newKind
|
||||||
|
|
||||||
func migrateToDataFork*(
|
func migrateToDataFork*(
|
||||||
@ -556,7 +659,15 @@ func migrateToDataFork*(
|
|||||||
capellaData: upgrade_lc_finality_update_to_capella(
|
capellaData: upgrade_lc_finality_update_to_capella(
|
||||||
x.forky(LightClientDataFork.Altair)))
|
x.forky(LightClientDataFork.Altair)))
|
||||||
|
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
# Upgrade to EIP4844
|
||||||
|
when newKind >= LightClientDataFork.EIP4844:
|
||||||
|
if x.kind == LightClientDataFork.Capella:
|
||||||
|
x = ForkedLightClientFinalityUpdate(
|
||||||
|
kind: LightClientDataFork.EIP4844,
|
||||||
|
eip4844Data: upgrade_lc_finality_update_to_eip4844(
|
||||||
|
x.forky(LightClientDataFork.Capella)))
|
||||||
|
|
||||||
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
doAssert x.kind == newKind
|
doAssert x.kind == newKind
|
||||||
|
|
||||||
func migrateToDataFork*(
|
func migrateToDataFork*(
|
||||||
@ -583,7 +694,15 @@ func migrateToDataFork*(
|
|||||||
capellaData: upgrade_lc_optimistic_update_to_capella(
|
capellaData: upgrade_lc_optimistic_update_to_capella(
|
||||||
x.forky(LightClientDataFork.Altair)))
|
x.forky(LightClientDataFork.Altair)))
|
||||||
|
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
# Upgrade to EIP4844
|
||||||
|
when newKind >= LightClientDataFork.EIP4844:
|
||||||
|
if x.kind == LightClientDataFork.Capella:
|
||||||
|
x = ForkedLightClientOptimisticUpdate(
|
||||||
|
kind: LightClientDataFork.EIP4844,
|
||||||
|
eip4844Data: upgrade_lc_optimistic_update_to_eip4844(
|
||||||
|
x.forky(LightClientDataFork.Capella)))
|
||||||
|
|
||||||
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
doAssert x.kind == newKind
|
doAssert x.kind == newKind
|
||||||
|
|
||||||
func migrateToDataFork*(
|
func migrateToDataFork*(
|
||||||
@ -610,7 +729,15 @@ func migrateToDataFork*(
|
|||||||
capellaData: upgrade_lc_store_to_capella(
|
capellaData: upgrade_lc_store_to_capella(
|
||||||
x.forky(LightClientDataFork.Altair)))
|
x.forky(LightClientDataFork.Altair)))
|
||||||
|
|
||||||
static: doAssert LightClientDataFork.high == LightClientDataFork.Capella
|
# Upgrade to EIP4844
|
||||||
|
when newKind >= LightClientDataFork.EIP4844:
|
||||||
|
if x.kind == LightClientDataFork.Capella:
|
||||||
|
x = ForkedLightClientStore(
|
||||||
|
kind: LightClientDataFork.EIP4844,
|
||||||
|
eip4844Data: upgrade_lc_store_to_eip4844(
|
||||||
|
x.forky(LightClientDataFork.Capella)))
|
||||||
|
|
||||||
|
static: doAssert LightClientDataFork.high == LightClientDataFork.EIP4844
|
||||||
doAssert x.kind == newKind
|
doAssert x.kind == newKind
|
||||||
|
|
||||||
func migratingToDataFork*[
|
func migratingToDataFork*[
|
||||||
@ -651,8 +778,7 @@ func toCapellaLightClientHeader(
|
|||||||
|
|
||||||
func toCapellaLightClientHeader(
|
func toCapellaLightClientHeader(
|
||||||
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
||||||
capella.SignedBeaconBlock | capella.TrustedSignedBeaconBlock |
|
capella.SignedBeaconBlock | capella.TrustedSignedBeaconBlock
|
||||||
eip4844.SignedBeaconBlock | eip4844.TrustedSignedBeaconBlock
|
|
||||||
): capella.LightClientHeader =
|
): capella.LightClientHeader =
|
||||||
template payload: untyped = blck.message.body.execution_payload
|
template payload: untyped = blck.message.body.execution_payload
|
||||||
capella.LightClientHeader(
|
capella.LightClientHeader(
|
||||||
@ -676,6 +802,75 @@ func toCapellaLightClientHeader(
|
|||||||
execution_branch: blck.message.body.build_proof(
|
execution_branch: blck.message.body.build_proof(
|
||||||
capella.EXECUTION_PAYLOAD_INDEX).get)
|
capella.EXECUTION_PAYLOAD_INDEX).get)
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-rc.1/specs/eip4844/light-client/full-node.md#block_to_light_client_header
|
||||||
|
func toEIP4844LightClientHeader(
|
||||||
|
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
||||||
|
phase0.SignedBeaconBlock | phase0.TrustedSignedBeaconBlock |
|
||||||
|
altair.SignedBeaconBlock | altair.TrustedSignedBeaconBlock |
|
||||||
|
bellatrix.SignedBeaconBlock | bellatrix.TrustedSignedBeaconBlock
|
||||||
|
): eip4844.LightClientHeader =
|
||||||
|
# Note that during fork transitions, `finalized_header` may still
|
||||||
|
# point to earlier forks. While Bellatrix blocks also contain an
|
||||||
|
# `ExecutionPayload` (minus `withdrawals_root`), it was not included
|
||||||
|
# in the corresponding light client data. To ensure compatibility
|
||||||
|
# with legacy data going through `upgrade_lc_header_to_capella`,
|
||||||
|
# leave out execution data.
|
||||||
|
eip4844.LightClientHeader(
|
||||||
|
beacon: blck.message.toBeaconBlockHeader())
|
||||||
|
|
||||||
|
func toEIP4844LightClientHeader(
|
||||||
|
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
||||||
|
capella.SignedBeaconBlock | capella.TrustedSignedBeaconBlock
|
||||||
|
): eip4844.LightClientHeader =
|
||||||
|
template payload: untyped = blck.message.body.execution_payload
|
||||||
|
eip4844.LightClientHeader(
|
||||||
|
beacon: blck.message.toBeaconBlockHeader(),
|
||||||
|
execution: eip4844.ExecutionPayloadHeader(
|
||||||
|
parent_hash: payload.parent_hash,
|
||||||
|
fee_recipient: payload.fee_recipient,
|
||||||
|
state_root: payload.state_root,
|
||||||
|
receipts_root: payload.receipts_root,
|
||||||
|
logs_bloom: payload.logs_bloom,
|
||||||
|
prev_randao: payload.prev_randao,
|
||||||
|
block_number: payload.block_number,
|
||||||
|
gas_limit: payload.gas_limit,
|
||||||
|
gas_used: payload.gas_used,
|
||||||
|
timestamp: payload.timestamp,
|
||||||
|
extra_data: payload.extra_data,
|
||||||
|
base_fee_per_gas: payload.base_fee_per_gas,
|
||||||
|
block_hash: payload.block_hash,
|
||||||
|
transactions_root: hash_tree_root(payload.transactions),
|
||||||
|
withdrawals_root: hash_tree_root(payload.withdrawals)),
|
||||||
|
execution_branch: blck.message.body.build_proof(
|
||||||
|
capella.EXECUTION_PAYLOAD_INDEX).get)
|
||||||
|
|
||||||
|
func toEIP4844LightClientHeader(
|
||||||
|
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
||||||
|
eip4844.SignedBeaconBlock | eip4844.TrustedSignedBeaconBlock
|
||||||
|
): eip4844.LightClientHeader =
|
||||||
|
template payload: untyped = blck.message.body.execution_payload
|
||||||
|
eip4844.LightClientHeader(
|
||||||
|
beacon: blck.message.toBeaconBlockHeader(),
|
||||||
|
execution: eip4844.ExecutionPayloadHeader(
|
||||||
|
parent_hash: payload.parent_hash,
|
||||||
|
fee_recipient: payload.fee_recipient,
|
||||||
|
state_root: payload.state_root,
|
||||||
|
receipts_root: payload.receipts_root,
|
||||||
|
logs_bloom: payload.logs_bloom,
|
||||||
|
prev_randao: payload.prev_randao,
|
||||||
|
block_number: payload.block_number,
|
||||||
|
gas_limit: payload.gas_limit,
|
||||||
|
gas_used: payload.gas_used,
|
||||||
|
timestamp: payload.timestamp,
|
||||||
|
extra_data: payload.extra_data,
|
||||||
|
base_fee_per_gas: payload.base_fee_per_gas,
|
||||||
|
excess_data_gas: payload.excess_data_gas,
|
||||||
|
block_hash: payload.block_hash,
|
||||||
|
transactions_root: hash_tree_root(payload.transactions),
|
||||||
|
withdrawals_root: hash_tree_root(payload.withdrawals)),
|
||||||
|
execution_branch: blck.message.body.build_proof(
|
||||||
|
capella.EXECUTION_PAYLOAD_INDEX).get)
|
||||||
|
|
||||||
func toLightClientHeader*(
|
func toLightClientHeader*(
|
||||||
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
blck: # `SomeSignedBeaconBlock` doesn't work here (Nim 1.6)
|
||||||
phase0.SignedBeaconBlock | phase0.TrustedSignedBeaconBlock |
|
phase0.SignedBeaconBlock | phase0.TrustedSignedBeaconBlock |
|
||||||
@ -684,7 +879,9 @@ func toLightClientHeader*(
|
|||||||
capella.SignedBeaconBlock | capella.TrustedSignedBeaconBlock |
|
capella.SignedBeaconBlock | capella.TrustedSignedBeaconBlock |
|
||||||
eip4844.SignedBeaconBlock | eip4844.TrustedSignedBeaconBlock,
|
eip4844.SignedBeaconBlock | eip4844.TrustedSignedBeaconBlock,
|
||||||
kind: static LightClientDataFork): auto =
|
kind: static LightClientDataFork): auto =
|
||||||
when kind == LightClientDataFork.Capella:
|
when kind == LightClientDataFork.EIP4844:
|
||||||
|
blck.toEIP4844LightClientHeader()
|
||||||
|
elif kind == LightClientDataFork.Capella:
|
||||||
blck.toCapellaLightClientHeader()
|
blck.toCapellaLightClientHeader()
|
||||||
elif kind == LightClientDataFork.Altair:
|
elif kind == LightClientDataFork.Altair:
|
||||||
blck.toAltairLightClientHeader()
|
blck.toAltairLightClientHeader()
|
||||||
|
@ -126,15 +126,15 @@ suite "EF - EIP4844 - SSZ consensus objects " & preset():
|
|||||||
of "HistoricalSummary": checkSSZ(HistoricalSummary, path, hash)
|
of "HistoricalSummary": checkSSZ(HistoricalSummary, path, hash)
|
||||||
of "IndexedAttestation": checkSSZ(IndexedAttestation, path, hash)
|
of "IndexedAttestation": checkSSZ(IndexedAttestation, path, hash)
|
||||||
of "LightClientBootstrap":
|
of "LightClientBootstrap":
|
||||||
discard # checkSSZ(capella.LightClientBootstrap, path, hash)
|
discard # checkSSZ(eip4844.LightClientBootstrap, path, hash)
|
||||||
of "LightClientHeader":
|
of "LightClientHeader":
|
||||||
discard # checkSSZ(capella.LightClientHeader, path, hash)
|
discard # checkSSZ(eip4844.LightClientHeader, path, hash)
|
||||||
of "LightClientUpdate":
|
of "LightClientUpdate":
|
||||||
discard # checkSSZ(capella.LightClientUpdate, path, hash)
|
discard # checkSSZ(eip4844.LightClientUpdate, path, hash)
|
||||||
of "LightClientFinalityUpdate":
|
of "LightClientFinalityUpdate":
|
||||||
discard # checkSSZ(capella.LightClientFinalityUpdate, path, hash)
|
discard # checkSSZ(eip4844.LightClientFinalityUpdate, path, hash)
|
||||||
of "LightClientOptimisticUpdate":
|
of "LightClientOptimisticUpdate":
|
||||||
discard # checkSSZ(capella.LightClientOptimisticUpdate, path, hash)
|
discard # checkSSZ(eip4844.LightClientOptimisticUpdate, path, hash)
|
||||||
of "PendingAttestation": checkSSZ(PendingAttestation, path, hash)
|
of "PendingAttestation": checkSSZ(PendingAttestation, path, hash)
|
||||||
of "PowBlock": checkSSZ(PowBlock, path, hash)
|
of "PowBlock": checkSSZ(PowBlock, path, hash)
|
||||||
of "ProposerSlashing": checkSSZ(ProposerSlashing, path, hash)
|
of "ProposerSlashing": checkSSZ(ProposerSlashing, path, hash)
|
||||||
|
@ -151,13 +151,8 @@ suite "Light client processor" & preset():
|
|||||||
applyPeriodWithSupermajority(period)
|
applyPeriodWithSupermajority(period)
|
||||||
|
|
||||||
# Reduce stack size by making this a `proc`
|
# Reduce stack size by making this a `proc`
|
||||||
proc applyPeriodWithoutSupermajority(period: SyncCommitteePeriod) =
|
proc applyPeriodWithoutSupermajority(
|
||||||
let update = newClone(dag.getLightClientUpdateForPeriod(period))
|
period: SyncCommitteePeriod, update: ref ForkedLightClientUpdate) =
|
||||||
check update[].kind > LightClientDataFork.None
|
|
||||||
withForkyUpdate(update[]):
|
|
||||||
when lcDataFork > LightClientDataFork.None:
|
|
||||||
setTimeToSlot(forkyUpdate.signature_slot)
|
|
||||||
|
|
||||||
for i in 0 ..< 2:
|
for i in 0 ..< 2:
|
||||||
res = processor[].storeObject(
|
res = processor[].storeObject(
|
||||||
MsgSource.gossip, getBeaconTime(), update[])
|
MsgSource.gossip, getBeaconTime(), update[])
|
||||||
@ -198,7 +193,8 @@ suite "Light client processor" & preset():
|
|||||||
forkyStore.best_valid_update.isSome
|
forkyStore.best_valid_update.isSome
|
||||||
not forkyStore.best_valid_update.get.matches(forkyUpdate)
|
not forkyStore.best_valid_update.get.matches(forkyUpdate)
|
||||||
|
|
||||||
proc applyDuplicate() = # Reduce stack size by making this a `proc`
|
# Reduce stack size by making this a `proc`
|
||||||
|
proc applyDuplicate(update: ref ForkedLightClientUpdate) =
|
||||||
res = processor[].storeObject(
|
res = processor[].storeObject(
|
||||||
MsgSource.gossip, getBeaconTime(), update[])
|
MsgSource.gossip, getBeaconTime(), update[])
|
||||||
check update[].kind <= store[].kind
|
check update[].kind <= store[].kind
|
||||||
@ -226,10 +222,10 @@ suite "Light client processor" & preset():
|
|||||||
forkyStore.best_valid_update.isSome
|
forkyStore.best_valid_update.isSome
|
||||||
not forkyStore.best_valid_update.get.matches(forkyUpdate)
|
not forkyStore.best_valid_update.get.matches(forkyUpdate)
|
||||||
|
|
||||||
applyDuplicate()
|
applyDuplicate(update)
|
||||||
time += chronos.minutes(15)
|
time += chronos.minutes(15)
|
||||||
for _ in 0 ..< 150:
|
for _ in 0 ..< 150:
|
||||||
applyDuplicate()
|
applyDuplicate(update)
|
||||||
time += chronos.seconds(5)
|
time += chronos.seconds(5)
|
||||||
time += chronos.minutes(15)
|
time += chronos.minutes(15)
|
||||||
|
|
||||||
@ -272,6 +268,16 @@ suite "Light client processor" & preset():
|
|||||||
res.error == VerifierError.MissingParent
|
res.error == VerifierError.MissingParent
|
||||||
forkyStore.best_valid_update.isSome
|
forkyStore.best_valid_update.isSome
|
||||||
not forkyStore.best_valid_update.get.matches(forkyUpdate)
|
not forkyStore.best_valid_update.get.matches(forkyUpdate)
|
||||||
|
|
||||||
|
for period in lastPeriodWithSupermajority + 1 .. highPeriod:
|
||||||
|
let update = newClone(dag.getLightClientUpdateForPeriod(period))
|
||||||
|
check update[].kind > LightClientDataFork.None
|
||||||
|
withForkyUpdate(update[]):
|
||||||
|
when lcDataFork > LightClientDataFork.None:
|
||||||
|
setTimeToSlot(forkyUpdate.signature_slot)
|
||||||
|
|
||||||
|
applyPeriodWithoutSupermajority(period, update)
|
||||||
|
|
||||||
if finalizationMode == LightClientFinalizationMode.Optimistic:
|
if finalizationMode == LightClientFinalizationMode.Optimistic:
|
||||||
withForkyStore(store[]):
|
withForkyStore(store[]):
|
||||||
when lcDataFork > LightClientDataFork.None:
|
when lcDataFork > LightClientDataFork.None:
|
||||||
@ -287,9 +293,6 @@ suite "Light client processor" & preset():
|
|||||||
template forkyUpdate: untyped = upgraded[].forky(lcDataFork)
|
template forkyUpdate: untyped = upgraded[].forky(lcDataFork)
|
||||||
check forkyStore.finalized_header != forkyUpdate.attested_header
|
check forkyStore.finalized_header != forkyUpdate.attested_header
|
||||||
|
|
||||||
for period in lastPeriodWithSupermajority + 1 .. highPeriod:
|
|
||||||
applyPeriodWithoutSupermajority(period)
|
|
||||||
|
|
||||||
var oldFinalized {.noinit.}: ForkedLightClientHeader
|
var oldFinalized {.noinit.}: ForkedLightClientHeader
|
||||||
withForkyStore(store[]):
|
withForkyStore(store[]):
|
||||||
when lcDataFork > LightClientDataFork.None:
|
when lcDataFork > LightClientDataFork.None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user