Upgrade light-client data on fork boundaries (#5301)

This commit is contained in:
g11tech
2023-03-25 05:36:53 +05:30
committed by GitHub
parent 4b62e2b053
commit 6d3ec2b5ec
3 changed files with 72 additions and 2 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
}