-
Notifications
You must be signed in to change notification settings - Fork 242
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
integrate light client into beacon node (#3557)
Adds a `LightClient` instance to the beacon node as preparation to accelerate syncing in the future (optimistic sync). - `--light-client-enable` turns on the feature - `--light-client-trusted-block-root` configures block to start from If no block root is configured, light client tracks DAG `finalizedHead`.
- Loading branch information
1 parent
3bd9622
commit 72a46bd
Showing
12 changed files
with
458 additions
and
260 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
# beacon_chain | ||
# Copyright (c) 2022 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: [Defect].} | ||
|
||
# This implements the pre-release proposal of the libp2p based light client sync | ||
# protocol. See https://github.com/ethereum/consensus-specs/pull/2802 | ||
|
||
import | ||
chronicles, | ||
./beacon_node | ||
|
||
logScope: topics = "beacnde" | ||
|
||
proc initLightClient*( | ||
node: BeaconNode, | ||
rng: ref BrHmacDrbgContext, | ||
cfg: RuntimeConfig, | ||
forkDigests: ref ForkDigests, | ||
getBeaconTime: GetBeaconTimeFn, | ||
genesis_validators_root: Eth2Digest) = | ||
template config(): auto = node.config | ||
|
||
# Creating a light client is not dependent on `lightClientEnable` | ||
# because the light client module also handles gossip subscriptions | ||
# for broadcasting light client data as a server. | ||
|
||
let lightClient = createLightClient( | ||
node.network, rng, config, cfg, | ||
forkDigests, getBeaconTime, genesis_validators_root) | ||
|
||
if config.lightClientEnable.get: | ||
lightClient.trustedBlockRoot = config.lightClientTrustedBlockRoot | ||
|
||
elif config.lightClientTrustedBlockRoot.isSome: | ||
warn "Ignoring `lightClientTrustedBlockRoot`, light client not enabled", | ||
lightClientEnable = config.lightClientEnable.get, | ||
lightClientTrustedBlockRoot = config.lightClientTrustedBlockRoot | ||
|
||
node.lightClient = lightClient | ||
|
||
proc startLightClient*(node: BeaconNode) = | ||
if not node.config.lightClientEnable.get: | ||
return | ||
|
||
node.lightClient.start() | ||
|
||
proc installLightClientMessageValidators*(node: BeaconNode) = | ||
let eth2Processor = | ||
if node.config.serveLightClientData.get: | ||
# Process gossip using both full node and light client | ||
node.processor | ||
elif node.config.lightClientEnable.get: | ||
# Only process gossip using light client | ||
nil | ||
else: | ||
# Light client topics will never be subscribed to, no validators needed | ||
return | ||
|
||
node.lightClient.installMessageValidators(eth2Processor) | ||
|
||
proc updateLightClientGossipStatus*( | ||
node: BeaconNode, slot: Slot, dagIsBehind: bool) = | ||
let isBehind = | ||
if node.config.serveLightClientData.get: | ||
# Forward DAG's readiness to handle light client gossip | ||
dagIsBehind | ||
else: | ||
# Full node is not interested in gossip | ||
true | ||
|
||
node.lightClient.updateGossipStatus(slot, some isBehind) | ||
|
||
proc updateLightClientFromDag*(node: BeaconNode) = | ||
if not node.config.lightClientEnable.get: | ||
return | ||
if node.config.lightClientTrustedBlockRoot.isSome: | ||
return | ||
|
||
let | ||
dagHead = node.dag.finalizedHead | ||
dagPeriod = dagHead.slot.sync_committee_period | ||
if dagHead.slot < node.dag.cfg.ALTAIR_FORK_EPOCH.start_slot: | ||
return | ||
|
||
let lcHeader = node.lightClient.finalizedHeader | ||
if lcHeader.isSome: | ||
if dagPeriod <= lcHeader.get.slot.sync_committee_period: | ||
return | ||
|
||
let | ||
bdata = node.dag.getForkedBlock(dagHead.blck.bid).valueOr: | ||
return | ||
header = bdata.toBeaconBlockHeader | ||
current_sync_committee = block: | ||
var tmpState = assignClone(node.dag.headState) | ||
node.dag.currentSyncCommitteeForPeriod(tmpState[], dagPeriod).valueOr: | ||
return | ||
node.lightClient.resetToFinalizedHeader(header, current_sync_committee) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.