94 lines
3.1 KiB
Nim
94 lines
3.1 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
|
# Licensed and distributed under either of
|
|
# * MIT license (license terms in the root directory or at
|
|
# https://opensource.org/licenses/MIT).
|
|
# * Apache v2 license (license terms in the root directory or at
|
|
# https://www.apache.org/licenses/LICENSE-2.0).
|
|
# at your option. This file may not be copied, modified, or distributed
|
|
# except according to those terms.
|
|
|
|
import
|
|
std/times,
|
|
chronicles,
|
|
results,
|
|
eth/common/eth_types,
|
|
../../utils/utils,
|
|
../../db/core_db,
|
|
../../core/chain
|
|
|
|
export eth_types, core_db, chain, chronicles, results, times
|
|
|
|
{.push gcsafe, raises: [].}
|
|
|
|
logScope:
|
|
topics = "skeleton"
|
|
|
|
type
|
|
# Contiguous header chain segment that is backed by the database,
|
|
# but may not be linked to the live chain. The skeleton downloader may produce
|
|
# a new one of these every time it is restarted until the subchain grows large
|
|
# enough to connect with a previous subchain.
|
|
Segment* = ref object
|
|
head*: uint64 # Block number of the newest header in the subchain
|
|
tail*: uint64 # Block number of the oldest header in the subchain
|
|
next*: Hash256 # Block hash of the next oldest header in the subchain
|
|
|
|
# Database entry to allow suspending and resuming a chain sync.
|
|
# As the skeleton header chain is downloaded backwards, restarts can and
|
|
# will produce temporarily disjoint subchains. There is no way to restart a
|
|
# suspended skeleton sync without prior knowledge of all prior suspension points.
|
|
Progress* = ref object
|
|
segments*: seq[Segment]
|
|
linked*: bool
|
|
canonicalHeadReset*: bool
|
|
|
|
SkeletonConfig* = ref object
|
|
fillCanonicalBackStep*: uint64
|
|
subchainMergeMinimum*: uint64
|
|
|
|
# The Skeleton chain class helps support beacon sync by accepting head blocks
|
|
# while backfill syncing the rest of the chain.
|
|
SkeletonRef* = ref object
|
|
progress*: Progress
|
|
pulled*: uint64 # Number of headers downloaded in this run
|
|
filling*: bool # Whether we are actively filling the canonical chain
|
|
started*: Time # Timestamp when the skeleton syncer was created
|
|
logged*: Time # Timestamp when progress was last logged to user
|
|
db*: CoreDbRef
|
|
chain*: ChainRef
|
|
conf*: SkeletonConfig
|
|
fillLogIndex*: uint64
|
|
|
|
SkeletonStatus* = enum
|
|
SkeletonOk
|
|
|
|
# SyncReorged is a signal that the head chain of
|
|
# the current sync cycle was (partially) reorged, thus the skeleton syncer
|
|
# should abort and restart with the new state.
|
|
SyncReorged
|
|
|
|
# ReorgDenied is returned if an attempt is made to extend the beacon chain
|
|
# with a new header, but it does not link up to the existing sync.
|
|
ReorgDenied
|
|
|
|
# SyncMerged is a signal that the current sync cycle merged with
|
|
# a previously aborted subchain, thus the skeleton syncer
|
|
# should abort and restart with the new state.
|
|
SyncMerged
|
|
|
|
# Request to do fillCanonicalChain
|
|
FillCanonical
|
|
|
|
StatusAndNumber* = object
|
|
status*: set[SkeletonStatus]
|
|
number*: uint64
|
|
|
|
StatusAndReorg* = object
|
|
status*: set[SkeletonStatus]
|
|
reorg*: bool
|
|
|
|
BodyRange* = object
|
|
min*: uint64
|
|
max*: uint64
|