mirror of
https://github.com/ChainSafe/lodestar.git
synced 2026-01-09 15:48:08 -05:00
Upgrade light-client data on fork boundaries (#5301)
This commit is contained in:
@@ -9,6 +9,7 @@ import {ATTESTATION_SUBNET_COUNT, ForkName, SYNC_COMMITTEE_SUBNET_COUNT} from "@
|
||||
import {allForks, altair, phase0, capella, deneb} from "@lodestar/types";
|
||||
import {Logger, Map2d, Map2dArr} from "@lodestar/utils";
|
||||
import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
||||
import {upgradeLightClientFinalityUpdate, upgradeLightClientOptimisticUpdate} from "@lodestar/light-client";
|
||||
|
||||
import {Metrics} from "../../metrics/index.js";
|
||||
import {Eth2Context} from "../../chain/index.js";
|
||||
@@ -266,6 +267,10 @@ export class Eth2Gossipsub extends GossipSub implements GossipBeaconNode {
|
||||
|
||||
async publishLightClientFinalityUpdate(lightClientFinalityUpdate: allForks.LightClientFinalityUpdate): Promise<void> {
|
||||
const fork = this.config.getForkName(lightClientFinalityUpdate.signatureSlot);
|
||||
const attestedFork = this.config.getForkName(lightClientFinalityUpdate.attestedHeader.beacon.slot);
|
||||
if (attestedFork !== fork) {
|
||||
lightClientFinalityUpdate = upgradeLightClientFinalityUpdate(this.config, fork, lightClientFinalityUpdate);
|
||||
}
|
||||
await this.publishObject<GossipType.light_client_finality_update>(
|
||||
{type: GossipType.light_client_finality_update, fork},
|
||||
lightClientFinalityUpdate
|
||||
@@ -276,6 +281,10 @@ export class Eth2Gossipsub extends GossipSub implements GossipBeaconNode {
|
||||
lightClientOptimisitcUpdate: allForks.LightClientOptimisticUpdate
|
||||
): Promise<void> {
|
||||
const fork = this.config.getForkName(lightClientOptimisitcUpdate.signatureSlot);
|
||||
const attestedFork = this.config.getForkName(lightClientOptimisitcUpdate.attestedHeader.beacon.slot);
|
||||
if (attestedFork !== fork) {
|
||||
lightClientOptimisitcUpdate = upgradeLightClientOptimisticUpdate(this.config, fork, lightClientOptimisitcUpdate);
|
||||
}
|
||||
await this.publishObject<GossipType.light_client_optimistic_update>(
|
||||
{type: GossipType.light_client_optimistic_update, fork},
|
||||
lightClientOptimisitcUpdate
|
||||
|
||||
@@ -19,6 +19,7 @@ import {LightClientTransport} from "./transport/interface.js";
|
||||
// Re-export types
|
||||
export {LightclientEvent} from "./events.js";
|
||||
export {SyncCommitteeFast} from "./types.js";
|
||||
export {upgradeLightClientFinalityUpdate, upgradeLightClientOptimisticUpdate} from "./spec/utils.js";
|
||||
|
||||
export type GenesisData = {
|
||||
genesisTime: number;
|
||||
|
||||
@@ -8,11 +8,12 @@ import {
|
||||
BLOCK_BODY_EXECUTION_PAYLOAD_DEPTH as EXECUTION_PAYLOAD_DEPTH,
|
||||
BLOCK_BODY_EXECUTION_PAYLOAD_INDEX as EXECUTION_PAYLOAD_INDEX,
|
||||
} from "@lodestar/params";
|
||||
import {altair, phase0, ssz, allForks, capella, deneb} from "@lodestar/types";
|
||||
import {altair, phase0, ssz, allForks, capella, deneb, Slot} from "@lodestar/types";
|
||||
import {ChainForkConfig} from "@lodestar/config";
|
||||
import {computeEpochAtSlot} from "@lodestar/state-transition";
|
||||
|
||||
import {isValidMerkleBranch} from "../utils/verifyMerkleBranch.js";
|
||||
import {isValidMerkleBranch, computeSyncPeriodAtSlot} from "../utils/index.js";
|
||||
import {LightClientStore} from "./store.js";
|
||||
|
||||
export const GENESIS_SLOT = 0;
|
||||
export const ZERO_HASH = new Uint8Array(32);
|
||||
@@ -140,3 +141,62 @@ export function isValidLightClientHeader(config: ChainForkConfig, header: allFor
|
||||
header.beacon.bodyRoot
|
||||
);
|
||||
}
|
||||
|
||||
export function upgradeLightClientUpdate(
|
||||
config: ChainForkConfig,
|
||||
targetFork: ForkName,
|
||||
update: allForks.LightClientUpdate
|
||||
): allForks.LightClientUpdate {
|
||||
update.attestedHeader = upgradeLightClientHeader(config, targetFork, update.attestedHeader);
|
||||
update.finalizedHeader = upgradeLightClientHeader(config, targetFork, update.finalizedHeader);
|
||||
|
||||
return update;
|
||||
}
|
||||
|
||||
export function upgradeLightClientFinalityUpdate(
|
||||
config: ChainForkConfig,
|
||||
targetFork: ForkName,
|
||||
finalityUpdate: allForks.LightClientFinalityUpdate
|
||||
): allForks.LightClientFinalityUpdate {
|
||||
finalityUpdate.attestedHeader = upgradeLightClientHeader(config, targetFork, finalityUpdate.attestedHeader);
|
||||
finalityUpdate.finalizedHeader = upgradeLightClientHeader(config, targetFork, finalityUpdate.finalizedHeader);
|
||||
|
||||
return finalityUpdate;
|
||||
}
|
||||
|
||||
export function upgradeLightClientOptimisticUpdate(
|
||||
config: ChainForkConfig,
|
||||
targetFork: ForkName,
|
||||
optimisticUpdate: allForks.LightClientOptimisticUpdate
|
||||
): allForks.LightClientOptimisticUpdate {
|
||||
optimisticUpdate.attestedHeader = upgradeLightClientHeader(config, targetFork, optimisticUpdate.attestedHeader);
|
||||
|
||||
return optimisticUpdate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently this upgradation is not required because all processing is done based on the
|
||||
* summary that the store generates and maintains. In case store needs to be saved to disk,
|
||||
* this could be required depending on the format the store is saved to the disk
|
||||
*/
|
||||
export function upgradeLightClientStore(
|
||||
config: ChainForkConfig,
|
||||
targetFork: ForkName,
|
||||
store: LightClientStore,
|
||||
signatureSlot: Slot
|
||||
): LightClientStore {
|
||||
const updateSignaturePeriod = computeSyncPeriodAtSlot(signatureSlot);
|
||||
const bestValidUpdate = store.bestValidUpdates.get(updateSignaturePeriod);
|
||||
|
||||
if (bestValidUpdate) {
|
||||
store.bestValidUpdates.set(updateSignaturePeriod, {
|
||||
update: upgradeLightClientUpdate(config, targetFork, bestValidUpdate.update),
|
||||
summary: bestValidUpdate.summary,
|
||||
});
|
||||
}
|
||||
|
||||
store.finalizedHeader = upgradeLightClientHeader(config, targetFork, store.finalizedHeader);
|
||||
store.optimisticHeader = upgradeLightClientHeader(config, targetFork, store.optimisticHeader);
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user