mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-09 22:06:21 +00:00
3cdae9f6be
* Dual headed fork choice * fix finalizedEpoch not moving * reduce fork choice verbosity * Add failing tests due to pruning * Properly handle duplicate blocks in sync * test_block_pool also add a test for duplicate blocks * comments addressing review * Fix fork choice v2, was missing integrating block proposed * remove a spurious debug writeStackTrace * update block_sim * Use OrderedTable to ensure that we always load parents before children in fork choice * Load the DAG data in fork choice at init if there is some (can sync witti) * Cluster of quarantined blocks were not properly added to the fork choice * Workaround async gcsafe warnings * Update blockpoool tests * Do the callback before clearing the quarantine * Revert OrderedTable, implement topological sort of DAG, allow forkChoice to be initialized from arbitrary finalized heads * Make it work with latest devel - Altona readyness * Add a recovery mechanism when forkchoice desyncs with blockpool * add the current problematic node to the stack * Fix rebase indentation bug (but still producing invalid block) * Fix cache at epoch boundaries and lateBlock addition
84 lines
2.5 KiB
Nim
84 lines
2.5 KiB
Nim
# beacon_chain
|
|
# Copyright (c) 2018-2020 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.
|
|
|
|
# Common routines for a BeaconNode and a BeaconValidator node
|
|
|
|
import
|
|
# Standard library
|
|
tables,
|
|
|
|
# Nimble packages
|
|
chronos, json_rpc/rpcserver, metrics,
|
|
chronicles,
|
|
|
|
# Local modules
|
|
spec/[datatypes, crypto, digest],
|
|
conf, time, beacon_chain_db,
|
|
attestation_pool, block_pool, eth2_network,
|
|
beacon_node_types, mainchain_monitor, request_manager,
|
|
sync_manager
|
|
|
|
# This removes an invalid Nim warning that the digest module is unused here
|
|
# It's currently used for `shortLog(head.blck.root)`
|
|
type Eth2Digest = digest.Eth2Digest
|
|
|
|
type
|
|
RpcServer* = RpcHttpServer
|
|
KeyPair* = eth2_network.KeyPair
|
|
|
|
BeaconNode* = ref object
|
|
nickname*: string
|
|
network*: Eth2Node
|
|
netKeys*: KeyPair
|
|
requestManager*: RequestManager
|
|
db*: BeaconChainDB
|
|
config*: BeaconNodeConf
|
|
attachedValidators*: ValidatorPool
|
|
blockPool*: BlockPool
|
|
attestationPool*: AttestationPool
|
|
mainchainMonitor*: MainchainMonitor
|
|
beaconClock*: BeaconClock
|
|
rpcServer*: RpcServer
|
|
forkDigest*: ForkDigest
|
|
syncManager*: SyncManager[Peer, PeerID]
|
|
topicBeaconBlocks*: string
|
|
topicAggregateAndProofs*: string
|
|
forwardSyncLoop*: Future[void]
|
|
onSecondLoop*: Future[void]
|
|
|
|
const
|
|
MaxEmptySlotCount* = uint64(10*60) div SECONDS_PER_SLOT
|
|
|
|
# Metrics
|
|
declareGauge beacon_head_root,
|
|
"Root of the head block of the beacon chain"
|
|
|
|
proc updateHead*(node: BeaconNode): BlockRef =
|
|
# Check pending attestations - maybe we found some blocks for them
|
|
node.attestationPool.resolve()
|
|
|
|
# Grab the new head according to our latest attestation data
|
|
let newHead = node.attestationPool.selectHead()
|
|
|
|
# Store the new head in the block pool - this may cause epochs to be
|
|
# justified and finalized
|
|
node.blockPool.updateHead(newHead)
|
|
beacon_head_root.set newHead.root.toGaugeValue
|
|
|
|
# Cleanup the fork choice v2 if we have a finalized head
|
|
node.attestationPool.pruneBefore(node.blockPool.finalizedHead)
|
|
|
|
newHead
|
|
|
|
template findIt*(s: openarray, predicate: untyped): int64 =
|
|
var res = -1
|
|
for i, it {.inject.} in s:
|
|
if predicate:
|
|
res = i
|
|
break
|
|
res
|