@lodestar/beacon-node 1.39.0-dev.882891d89c → 1.39.0-dev.aceb5b7416
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +1 -1
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts +1 -2
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +4 -6
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +4 -4
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts +0 -3
- package/lib/chain/opPools/opPool.d.ts.map +1 -1
- package/lib/chain/opPools/opPool.js +8 -9
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +2 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/rewards/attestationsRewards.d.ts +1 -2
- package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -1
- package/lib/chain/rewards/attestationsRewards.js +8 -8
- package/lib/chain/rewards/attestationsRewards.js.map +1 -1
- package/lib/chain/rewards/blockRewards.d.ts +1 -2
- package/lib/chain/rewards/blockRewards.d.ts.map +1 -1
- package/lib/chain/rewards/blockRewards.js +5 -5
- package/lib/chain/rewards/blockRewards.js.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.d.ts +1 -2
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.js +2 -2
- package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -4
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +2 -4
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +1 -1
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/block.js +1 -1
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.js +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.js +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +1 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js +2 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts +1 -2
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js +2 -2
- package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +1 -2
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +2 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
- package/lib/chain/validation/syncCommittee.js +1 -1
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -3
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +1 -1
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/db/beacon.d.ts +0 -2
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +0 -32
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +0 -12
- package/lib/db/buckets.d.ts.map +1 -1
- package/lib/db/buckets.js +6 -12
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +0 -1
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +0 -10
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +4 -2
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/backfill/verify.d.ts +1 -1
- package/lib/sync/backfill/verify.d.ts.map +1 -1
- package/lib/sync/backfill/verify.js +2 -2
- package/lib/sync/backfill/verify.js.map +1 -1
- package/package.json +14 -14
- package/src/chain/blocks/verifyBlock.ts +0 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +1 -3
- package/src/chain/chain.ts +4 -6
- package/src/chain/opPools/aggregatedAttestationPool.ts +7 -7
- package/src/chain/opPools/opPool.ts +8 -8
- package/src/chain/produceBlock/produceBlockBody.ts +2 -2
- package/src/chain/rewards/attestationsRewards.ts +4 -13
- package/src/chain/rewards/blockRewards.ts +3 -6
- package/src/chain/rewards/syncCommitteeRewards.ts +1 -3
- package/src/chain/stateCache/persistentCheckpointsCache.ts +2 -15
- package/src/chain/validation/attesterSlashing.ts +1 -1
- package/src/chain/validation/block.ts +1 -1
- package/src/chain/validation/blsToExecutionChange.ts +1 -1
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +1 -1
- package/src/chain/validation/signatureSets/contributionAndProof.ts +1 -3
- package/src/chain/validation/signatureSets/syncCommittee.ts +1 -3
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +1 -3
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +1 -2
- package/src/chain/validation/syncCommittee.ts +1 -1
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -8
- package/src/chain/validation/voluntaryExit.ts +1 -1
- package/src/db/beacon.ts +1 -38
- package/src/db/buckets.ts +6 -12
- package/src/db/interface.ts +0 -2
- package/src/node/nodejs.ts +0 -11
- package/src/sync/backfill/backfill.ts +3 -8
- package/src/sync/backfill/verify.ts +1 -3
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
2
1
|
import {Id, Repository} from "@lodestar/db";
|
|
3
2
|
import {
|
|
4
3
|
BLS_WITHDRAWAL_PREFIX,
|
|
@@ -52,8 +51,6 @@ export class OpPool {
|
|
|
52
51
|
/** Map of validator index -> SignedBLSToExecutionChange */
|
|
53
52
|
private readonly blsToExecutionChanges = new Map<ValidatorIndex, SignedBLSToExecutionChangeVersioned>();
|
|
54
53
|
|
|
55
|
-
constructor(private readonly config: BeaconConfig) {}
|
|
56
|
-
|
|
57
54
|
// Getters for metrics
|
|
58
55
|
|
|
59
56
|
get attesterSlashingsSize(): number {
|
|
@@ -194,8 +191,9 @@ export class OpPool {
|
|
|
194
191
|
phase0.SignedVoluntaryExit[],
|
|
195
192
|
capella.SignedBLSToExecutionChange[],
|
|
196
193
|
] {
|
|
194
|
+
const {config} = state;
|
|
197
195
|
const stateEpoch = computeEpochAtSlot(state.slot);
|
|
198
|
-
const stateFork =
|
|
196
|
+
const stateFork = config.getForkSeq(state.slot);
|
|
199
197
|
const toBeSlashedIndices = new Set<ValidatorIndex>();
|
|
200
198
|
const proposerSlashings: phase0.ProposerSlashing[] = [];
|
|
201
199
|
|
|
@@ -267,7 +265,7 @@ export class OpPool {
|
|
|
267
265
|
// a future fork.
|
|
268
266
|
isVoluntaryExitSignatureIncludable(
|
|
269
267
|
stateFork,
|
|
270
|
-
|
|
268
|
+
config.getForkSeq(computeStartSlotAtEpoch(voluntaryExit.message.epoch))
|
|
271
269
|
)
|
|
272
270
|
) {
|
|
273
271
|
voluntaryExits.push(voluntaryExit);
|
|
@@ -370,13 +368,14 @@ export class OpPool {
|
|
|
370
368
|
* Prune if validator has already exited at or before the finalized checkpoint of the head.
|
|
371
369
|
*/
|
|
372
370
|
private pruneVoluntaryExits(headState: CachedBeaconStateAllForks): void {
|
|
373
|
-
const
|
|
371
|
+
const {config} = headState;
|
|
372
|
+
const headStateFork = config.getForkSeq(headState.slot);
|
|
374
373
|
const finalizedEpoch = headState.finalizedCheckpoint.epoch;
|
|
375
374
|
|
|
376
375
|
for (const [key, voluntaryExit] of this.voluntaryExits.entries()) {
|
|
377
376
|
// VoluntaryExit messages signed in the previous fork become invalid and can never be included in any future
|
|
378
377
|
// block, so just drop as the head state advances into the next fork.
|
|
379
|
-
if (
|
|
378
|
+
if (config.getForkSeq(computeStartSlotAtEpoch(voluntaryExit.message.epoch)) < headStateFork) {
|
|
380
379
|
this.voluntaryExits.delete(key);
|
|
381
380
|
}
|
|
382
381
|
|
|
@@ -393,8 +392,9 @@ export class OpPool {
|
|
|
393
392
|
* to opPool once gossipsub seen cache TTL passes.
|
|
394
393
|
*/
|
|
395
394
|
private pruneBlsToExecutionChanges(headBlock: SignedBeaconBlock, headState: CachedBeaconStateAllForks): void {
|
|
395
|
+
const {config} = headState;
|
|
396
396
|
const recentBlsToExecutionChanges =
|
|
397
|
-
|
|
397
|
+
config.getForkSeq(headBlock.message.slot) >= ForkSeq.capella
|
|
398
398
|
? (headBlock as capella.SignedBeaconBlock).message.body.blsToExecutionChanges
|
|
399
399
|
: [];
|
|
400
400
|
|
|
@@ -165,7 +165,7 @@ export async function produceBlockBody<T extends BlockType>(
|
|
|
165
165
|
// even though shouldOverrideBuilder is relevant for the engine response, for simplicity of typing
|
|
166
166
|
// we just return it undefined for the builder which anyway doesn't get consumed downstream
|
|
167
167
|
let shouldOverrideBuilder: boolean | undefined;
|
|
168
|
-
const fork =
|
|
168
|
+
const fork = currentState.config.getForkName(blockSlot);
|
|
169
169
|
const produceResult = {
|
|
170
170
|
type: blockType,
|
|
171
171
|
fork,
|
|
@@ -644,7 +644,7 @@ export async function produceCommonBlockBody<T extends BlockType>(
|
|
|
644
644
|
? this.metrics?.executionBlockProductionTimeSteps
|
|
645
645
|
: this.metrics?.builderBlockProductionTimeSteps;
|
|
646
646
|
|
|
647
|
-
const fork =
|
|
647
|
+
const fork = currentState.config.getForkName(slot);
|
|
648
648
|
|
|
649
649
|
// TODO:
|
|
650
650
|
// Iterate through the naive aggregation pool and ensure all the attestations from there
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
2
2
|
import {routes} from "@lodestar/api";
|
|
3
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
4
3
|
import {
|
|
5
4
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
6
5
|
ForkName,
|
|
@@ -39,12 +38,11 @@ const defaultAttestationsReward = {head: 0, target: 0, source: 0, inclusionDelay
|
|
|
39
38
|
const defaultAttestationsPenalty = {target: 0, source: 0};
|
|
40
39
|
|
|
41
40
|
export async function computeAttestationsRewards(
|
|
42
|
-
config: BeaconConfig,
|
|
43
41
|
pubkey2index: PubkeyIndexMap,
|
|
44
42
|
state: CachedBeaconStateAllForks,
|
|
45
43
|
validatorIds?: (ValidatorIndex | string)[]
|
|
46
44
|
): Promise<AttestationsRewards> {
|
|
47
|
-
const fork = config.getForkName(state.slot);
|
|
45
|
+
const fork = state.config.getForkName(state.slot);
|
|
48
46
|
if (fork === ForkName.phase0) {
|
|
49
47
|
throw Error("Unsupported fork. Attestations rewards calculation is not available in phase0");
|
|
50
48
|
}
|
|
@@ -52,13 +50,8 @@ export async function computeAttestationsRewards(
|
|
|
52
50
|
const stateAltair = state as CachedBeaconStateAltair;
|
|
53
51
|
const transitionCache = beforeProcessEpoch(stateAltair);
|
|
54
52
|
|
|
55
|
-
const [idealRewards, penalties] = computeIdealAttestationsRewardsAndPenaltiesAltair(
|
|
56
|
-
config,
|
|
57
|
-
stateAltair,
|
|
58
|
-
transitionCache
|
|
59
|
-
);
|
|
53
|
+
const [idealRewards, penalties] = computeIdealAttestationsRewardsAndPenaltiesAltair(stateAltair, transitionCache);
|
|
60
54
|
const totalRewards = computeTotalAttestationsRewardsAltair(
|
|
61
|
-
config,
|
|
62
55
|
pubkey2index,
|
|
63
56
|
stateAltair,
|
|
64
57
|
transitionCache,
|
|
@@ -71,13 +64,12 @@ export async function computeAttestationsRewards(
|
|
|
71
64
|
}
|
|
72
65
|
|
|
73
66
|
function computeIdealAttestationsRewardsAndPenaltiesAltair(
|
|
74
|
-
config: BeaconConfig,
|
|
75
67
|
state: CachedBeaconStateAllForks,
|
|
76
68
|
transitionCache: EpochTransitionCache
|
|
77
69
|
): [IdealAttestationsReward[], AttestationsPenalty[]] {
|
|
78
70
|
const baseRewardPerIncrement = transitionCache.baseRewardPerIncrement;
|
|
79
71
|
const activeBalanceByIncrement = transitionCache.totalActiveStakeByIncrement;
|
|
80
|
-
const fork = config.getForkName(state.slot);
|
|
72
|
+
const fork = state.config.getForkName(state.slot);
|
|
81
73
|
const maxEffectiveBalance = isForkPostElectra(fork) ? MAX_EFFECTIVE_BALANCE_ELECTRA : MAX_EFFECTIVE_BALANCE;
|
|
82
74
|
const maxEffectiveBalanceByIncrement = Math.floor(maxEffectiveBalance / EFFECTIVE_BALANCE_INCREMENT);
|
|
83
75
|
|
|
@@ -147,7 +139,6 @@ function computeIdealAttestationsRewardsAndPenaltiesAltair(
|
|
|
147
139
|
|
|
148
140
|
// Same calculation as `getRewardsAndPenaltiesAltair` but returns the breakdown of rewards instead of aggregated
|
|
149
141
|
function computeTotalAttestationsRewardsAltair(
|
|
150
|
-
config: BeaconConfig,
|
|
151
142
|
pubkey2index: PubkeyIndexMap,
|
|
152
143
|
state: CachedBeaconStateAltair,
|
|
153
144
|
transitionCache: EpochTransitionCache,
|
|
@@ -157,7 +148,7 @@ function computeTotalAttestationsRewardsAltair(
|
|
|
157
148
|
): TotalAttestationsReward[] {
|
|
158
149
|
const rewards = [];
|
|
159
150
|
const {flags} = transitionCache;
|
|
160
|
-
const {epochCtx} = state;
|
|
151
|
+
const {epochCtx, config} = state;
|
|
161
152
|
const validatorIndices = validatorIds
|
|
162
153
|
.map((id) => (typeof id === "number" ? id : pubkey2index.get(fromHex(id))))
|
|
163
154
|
.filter((index) => index !== undefined); // Validator indices to include in the result
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
3
2
|
import {
|
|
4
3
|
ForkName,
|
|
5
4
|
WHISTLEBLOWER_REWARD_QUOTIENT,
|
|
@@ -27,12 +26,11 @@ type SubRewardValue = number; // All reward values should be integer
|
|
|
27
26
|
* 3) Reporting slashable behaviours from proposer and attester
|
|
28
27
|
*/
|
|
29
28
|
export async function computeBlockRewards(
|
|
30
|
-
config: BeaconConfig,
|
|
31
29
|
block: BeaconBlock,
|
|
32
30
|
preState: CachedBeaconStateAllForks,
|
|
33
31
|
postState?: CachedBeaconStateAllForks
|
|
34
32
|
): Promise<BlockRewards> {
|
|
35
|
-
const fork = config.getForkName(block.slot);
|
|
33
|
+
const fork = preState.config.getForkName(block.slot);
|
|
36
34
|
const {attestations: cachedAttestationsReward = 0, syncAggregate: cachedSyncAggregateReward = 0} =
|
|
37
35
|
postState?.proposerRewards ?? {};
|
|
38
36
|
let blockAttestationReward = cachedAttestationsReward;
|
|
@@ -42,7 +40,7 @@ export async function computeBlockRewards(
|
|
|
42
40
|
blockAttestationReward =
|
|
43
41
|
fork === ForkName.phase0
|
|
44
42
|
? computeBlockAttestationRewardPhase0(block as phase0.BeaconBlock, preState as CachedBeaconStatePhase0)
|
|
45
|
-
: computeBlockAttestationRewardAltair(
|
|
43
|
+
: computeBlockAttestationRewardAltair(block as altair.BeaconBlock, preState as CachedBeaconStateAltair);
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
if (syncAggregateReward === 0) {
|
|
@@ -80,11 +78,10 @@ function computeBlockAttestationRewardPhase0(
|
|
|
80
78
|
* Reuses `processAttestationsAltair()`. Has dependency on RewardCache
|
|
81
79
|
*/
|
|
82
80
|
function computeBlockAttestationRewardAltair(
|
|
83
|
-
config: BeaconConfig,
|
|
84
81
|
block: altair.BeaconBlock,
|
|
85
82
|
preState: CachedBeaconStateAltair
|
|
86
83
|
): SubRewardValue {
|
|
87
|
-
const fork = config.getForkSeq(block.slot);
|
|
84
|
+
const fork = preState.config.getForkSeq(block.slot);
|
|
88
85
|
const {attestations} = block.body;
|
|
89
86
|
|
|
90
87
|
processAttestationsAltair(fork, preState, attestations, false);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
3
2
|
import {ForkName, SYNC_COMMITTEE_SIZE} from "@lodestar/params";
|
|
4
3
|
import {CachedBeaconStateAllForks, CachedBeaconStateAltair, Index2PubkeyCache} from "@lodestar/state-transition";
|
|
5
4
|
import {BeaconBlock, ValidatorIndex, altair} from "@lodestar/types";
|
|
@@ -8,13 +7,12 @@ export type SyncCommitteeRewards = routes.beacon.SyncCommitteeRewards;
|
|
|
8
7
|
type BalanceRecord = {val: number}; // Use val for convenient way to increment/decrement balance
|
|
9
8
|
|
|
10
9
|
export async function computeSyncCommitteeRewards(
|
|
11
|
-
config: BeaconConfig,
|
|
12
10
|
index2pubkey: Index2PubkeyCache,
|
|
13
11
|
block: BeaconBlock,
|
|
14
12
|
preState: CachedBeaconStateAllForks,
|
|
15
13
|
validatorIds: (ValidatorIndex | string)[] = []
|
|
16
14
|
): Promise<SyncCommitteeRewards> {
|
|
17
|
-
const fork = config.getForkName(block.slot);
|
|
15
|
+
const fork = preState.config.getForkName(block.slot);
|
|
18
16
|
if (fork === ForkName.phase0) {
|
|
19
17
|
throw Error("Cannot get sync rewards as phase0 block does not have sync committee");
|
|
20
18
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
3
2
|
import {
|
|
4
3
|
CachedBeaconStateAllForks,
|
|
5
4
|
computeStartSlotAtEpoch,
|
|
@@ -25,7 +24,6 @@ export type PersistentCheckpointStateCacheOpts = {
|
|
|
25
24
|
};
|
|
26
25
|
|
|
27
26
|
type PersistentCheckpointStateCacheModules = {
|
|
28
|
-
config: BeaconConfig;
|
|
29
27
|
metrics?: Metrics | null;
|
|
30
28
|
logger: Logger;
|
|
31
29
|
clock?: IClock | null;
|
|
@@ -109,7 +107,6 @@ export class PersistentCheckpointStateCache implements CheckpointStateCache {
|
|
|
109
107
|
private readonly cache: MapTracker<CacheKey, CacheItem>;
|
|
110
108
|
/** Epoch -> Set<blockRoot> */
|
|
111
109
|
private readonly epochIndex = new MapDef<Epoch, Set<RootHex>>(() => new Set<string>());
|
|
112
|
-
private readonly config: BeaconConfig;
|
|
113
110
|
private readonly metrics: Metrics | null | undefined;
|
|
114
111
|
private readonly logger: Logger;
|
|
115
112
|
private readonly clock: IClock | null | undefined;
|
|
@@ -123,20 +120,10 @@ export class PersistentCheckpointStateCache implements CheckpointStateCache {
|
|
|
123
120
|
private readonly bufferPool?: BufferPool | null;
|
|
124
121
|
|
|
125
122
|
constructor(
|
|
126
|
-
{
|
|
127
|
-
config,
|
|
128
|
-
metrics,
|
|
129
|
-
logger,
|
|
130
|
-
clock,
|
|
131
|
-
signal,
|
|
132
|
-
datastore,
|
|
133
|
-
blockStateCache,
|
|
134
|
-
bufferPool,
|
|
135
|
-
}: PersistentCheckpointStateCacheModules,
|
|
123
|
+
{metrics, logger, clock, signal, datastore, blockStateCache, bufferPool}: PersistentCheckpointStateCacheModules,
|
|
136
124
|
opts: PersistentCheckpointStateCacheOpts
|
|
137
125
|
) {
|
|
138
126
|
this.cache = new MapTracker(metrics?.cpStateCache);
|
|
139
|
-
this.config = config;
|
|
140
127
|
if (metrics) {
|
|
141
128
|
this.metrics = metrics;
|
|
142
129
|
metrics.cpStateCache.size.addCollect(() => {
|
|
@@ -497,7 +484,7 @@ export class PersistentCheckpointStateCache implements CheckpointStateCache {
|
|
|
497
484
|
}
|
|
498
485
|
|
|
499
486
|
const blockSlot = state.slot;
|
|
500
|
-
const processCPStatesTimeMs =
|
|
487
|
+
const processCPStatesTimeMs = state.config.getSlotComponentDurationMs(PROCESS_CHECKPOINT_STATES_BPS);
|
|
501
488
|
// we always have clock in production, fallback value is only for test
|
|
502
489
|
const msFromSlot = this.clock?.msFromSlot(blockSlot) ?? processCPStatesTimeMs;
|
|
503
490
|
const msToProcessCPStates = processCPStatesTimeMs - msFromSlot;
|
|
@@ -51,7 +51,7 @@ export async function validateAttesterSlashing(
|
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
const signatureSets = getAttesterSlashingSignatureSets(chain.
|
|
54
|
+
const signatureSets = getAttesterSlashingSignatureSets(chain.index2pubkey, state, attesterSlashing);
|
|
55
55
|
if (!(await chain.bls.verifySignatureSets(signatureSets, {batchable: true, priority: prioritizeBls}))) {
|
|
56
56
|
throw new AttesterSlashingError(GossipAction.REJECT, {
|
|
57
57
|
code: AttesterSlashingErrorCode.INVALID,
|
|
@@ -153,7 +153,7 @@ export async function validateGossipBlock(
|
|
|
153
153
|
|
|
154
154
|
// [REJECT] The proposer signature, signed_beacon_block.signature, is valid with respect to the proposer_index pubkey.
|
|
155
155
|
if (!chain.seenBlockInputCache.isVerifiedProposerSignature(blockSlot, blockRoot, signedBlock.signature)) {
|
|
156
|
-
const signatureSet = getBlockProposerSignatureSet(chain.
|
|
156
|
+
const signatureSet = getBlockProposerSignatureSet(chain.index2pubkey, blockState, signedBlock);
|
|
157
157
|
// Don't batch so verification is not delayed
|
|
158
158
|
if (!(await chain.bls.verifySignatureSets([signatureSet], {verifyOnMainThread: true}))) {
|
|
159
159
|
throw new BlockGossipError(GossipAction.REJECT, {
|
|
@@ -41,7 +41,7 @@ async function validateBlsToExecutionChange(
|
|
|
41
41
|
// NOTE: No need to advance head state since the signature's fork is handled with `broadcastedOnFork`,
|
|
42
42
|
// and chanes relevant to `isValidBlsToExecutionChange()` happen only on processBlock(), not processEpoch()
|
|
43
43
|
const state = chain.getHeadState();
|
|
44
|
-
const {config} =
|
|
44
|
+
const {config} = state;
|
|
45
45
|
|
|
46
46
|
// [REJECT] All of the conditions within process_bls_to_execution_change pass validation.
|
|
47
47
|
// verifySignature = false, verified in batch below
|
|
@@ -44,7 +44,7 @@ async function validateProposerSlashing(
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
const signatureSets = getProposerSlashingSignatureSets(chain.
|
|
47
|
+
const signatureSets = getProposerSlashingSignatureSets(chain.index2pubkey, state, proposerSlashing);
|
|
48
48
|
if (!(await chain.bls.verifySignatureSets(signatureSets, {batchable: true, priority: prioritizeBls}))) {
|
|
49
49
|
throw new ProposerSlashingError(GossipAction.REJECT, {
|
|
50
50
|
code: ProposerSlashingErrorCode.INVALID,
|
|
@@ -14,7 +14,7 @@ export function getAggregateAndProofSigningRoot(
|
|
|
14
14
|
epoch: Epoch,
|
|
15
15
|
aggregateAndProof: SignedAggregateAndProof
|
|
16
16
|
): Uint8Array {
|
|
17
|
-
// previously, we call `const aggregatorDomain = config.getDomain(state.slot, DOMAIN_AGGREGATE_AND_PROOF, slot);`
|
|
17
|
+
// previously, we call `const aggregatorDomain = state.config.getDomain(state.slot, DOMAIN_AGGREGATE_AND_PROOF, slot);`
|
|
18
18
|
// at fork boundary, it's required to dial to target epoch https://github.com/ChainSafe/lodestar/blob/v1.11.3/packages/beacon-node/src/chain/validation/attestation.ts#L573
|
|
19
19
|
// instead of that, just use the fork of slot in the attestation data
|
|
20
20
|
const slot = computeStartSlotAtEpoch(epoch);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
2
1
|
import {DOMAIN_CONTRIBUTION_AND_PROOF} from "@lodestar/params";
|
|
3
2
|
import {
|
|
4
3
|
CachedBeaconStateAllForks,
|
|
@@ -10,12 +9,11 @@ import {
|
|
|
10
9
|
import {altair, ssz} from "@lodestar/types";
|
|
11
10
|
|
|
12
11
|
export function getContributionAndProofSignatureSet(
|
|
13
|
-
config: BeaconConfig,
|
|
14
12
|
index2pubkey: Index2PubkeyCache,
|
|
15
13
|
state: CachedBeaconStateAllForks,
|
|
16
14
|
signedContributionAndProof: altair.SignedContributionAndProof
|
|
17
15
|
): ISignatureSet {
|
|
18
|
-
const domain = config.getDomain(
|
|
16
|
+
const domain = state.config.getDomain(
|
|
19
17
|
state.slot,
|
|
20
18
|
DOMAIN_CONTRIBUTION_AND_PROOF,
|
|
21
19
|
signedContributionAndProof.message.contribution.slot
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
2
1
|
import {DOMAIN_SYNC_COMMITTEE} from "@lodestar/params";
|
|
3
2
|
import {
|
|
4
3
|
CachedBeaconStateAllForks,
|
|
@@ -10,12 +9,11 @@ import {
|
|
|
10
9
|
import {altair, ssz} from "@lodestar/types";
|
|
11
10
|
|
|
12
11
|
export function getSyncCommitteeSignatureSet(
|
|
13
|
-
config: BeaconConfig,
|
|
14
12
|
index2pubkey: Index2PubkeyCache,
|
|
15
13
|
state: CachedBeaconStateAllForks,
|
|
16
14
|
syncCommittee: altair.SyncCommitteeMessage
|
|
17
15
|
): ISignatureSet {
|
|
18
|
-
const domain = config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE, syncCommittee.slot);
|
|
16
|
+
const domain = state.config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE, syncCommittee.slot);
|
|
19
17
|
|
|
20
18
|
return {
|
|
21
19
|
type: SignatureSetType.single,
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import {PublicKey} from "@chainsafe/blst";
|
|
2
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
3
2
|
import {DOMAIN_SYNC_COMMITTEE} from "@lodestar/params";
|
|
4
3
|
import {CachedBeaconStateAltair, ISignatureSet, SignatureSetType, computeSigningRoot} from "@lodestar/state-transition";
|
|
5
4
|
import {altair, ssz} from "@lodestar/types";
|
|
6
5
|
|
|
7
6
|
export function getSyncCommitteeContributionSignatureSet(
|
|
8
|
-
config: BeaconConfig,
|
|
9
7
|
state: CachedBeaconStateAltair,
|
|
10
8
|
contribution: altair.SyncCommitteeContribution,
|
|
11
9
|
pubkeys: PublicKey[]
|
|
12
10
|
): ISignatureSet {
|
|
13
|
-
const domain = config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE, contribution.slot);
|
|
11
|
+
const domain = state.config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE, contribution.slot);
|
|
14
12
|
return {
|
|
15
13
|
type: SignatureSetType.aggregate,
|
|
16
14
|
pubkeys,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {BeaconConfig} from "@lodestar/config";
|
|
2
1
|
import {DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF} from "@lodestar/params";
|
|
3
2
|
import {
|
|
4
3
|
CachedBeaconStateAllForks,
|
|
@@ -10,11 +9,11 @@ import {
|
|
|
10
9
|
import {altair, ssz} from "@lodestar/types";
|
|
11
10
|
|
|
12
11
|
export function getSyncCommitteeSelectionProofSignatureSet(
|
|
13
|
-
config: BeaconConfig,
|
|
14
12
|
index2pubkey: Index2PubkeyCache,
|
|
15
13
|
state: CachedBeaconStateAllForks,
|
|
16
14
|
contributionAndProof: altair.ContributionAndProof
|
|
17
15
|
): ISignatureSet {
|
|
16
|
+
const {config} = state;
|
|
18
17
|
const slot = contributionAndProof.contribution.slot;
|
|
19
18
|
const domain = config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF, slot);
|
|
20
19
|
const signingData: altair.SyncAggregatorSelectionData = {
|
|
@@ -89,7 +89,7 @@ async function validateSyncCommitteeSigOnly(
|
|
|
89
89
|
syncCommittee: altair.SyncCommitteeMessage,
|
|
90
90
|
prioritizeBls = false
|
|
91
91
|
): Promise<void> {
|
|
92
|
-
const signatureSet = getSyncCommitteeSignatureSet(chain.
|
|
92
|
+
const signatureSet = getSyncCommitteeSignatureSet(chain.index2pubkey, headState, syncCommittee);
|
|
93
93
|
if (!(await chain.bls.verifySignatureSets([signatureSet], {batchable: true, priority: prioritizeBls}))) {
|
|
94
94
|
throw new SyncCommitteeError(GossipAction.REJECT, {
|
|
95
95
|
code: SyncCommitteeErrorCode.INVALID_SIGNATURE,
|
|
@@ -78,19 +78,14 @@ export async function validateSyncCommitteeGossipContributionAndProof(
|
|
|
78
78
|
const signatureSets = [
|
|
79
79
|
// [REJECT] The contribution_and_proof.selection_proof is a valid signature of the SyncAggregatorSelectionData
|
|
80
80
|
// derived from the contribution by the validator with index contribution_and_proof.aggregator_index.
|
|
81
|
-
getSyncCommitteeSelectionProofSignatureSet(
|
|
81
|
+
getSyncCommitteeSelectionProofSignatureSet(index2pubkey, headState, contributionAndProof),
|
|
82
82
|
|
|
83
83
|
// [REJECT] The aggregator signature, signed_contribution_and_proof.signature, is valid.
|
|
84
|
-
getContributionAndProofSignatureSet(
|
|
84
|
+
getContributionAndProofSignatureSet(index2pubkey, headState, signedContributionAndProof),
|
|
85
85
|
|
|
86
86
|
// [REJECT] The aggregate signature is valid for the message beacon_block_root and aggregate pubkey derived from
|
|
87
87
|
// the participation info in aggregation_bits for the subcommittee specified by the contribution.subcommittee_index.
|
|
88
|
-
getSyncCommitteeContributionSignatureSet(
|
|
89
|
-
chain.config,
|
|
90
|
-
headState as CachedBeaconStateAltair,
|
|
91
|
-
contribution,
|
|
92
|
-
participantPubkeys
|
|
93
|
-
),
|
|
88
|
+
getSyncCommitteeContributionSignatureSet(headState as CachedBeaconStateAltair, contribution, participantPubkeys),
|
|
94
89
|
];
|
|
95
90
|
|
|
96
91
|
if (!(await chain.bls.verifySignatureSets(signatureSets, {batchable: true}))) {
|
|
@@ -59,7 +59,7 @@ async function validateVoluntaryExit(
|
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
const signatureSet = getVoluntaryExitSignatureSet(chain.
|
|
62
|
+
const signatureSet = getVoluntaryExitSignatureSet(chain.index2pubkey, state, voluntaryExit);
|
|
63
63
|
if (!(await chain.bls.verifySignatureSets([signatureSet], {batchable: true, priority: prioritizeBls}))) {
|
|
64
64
|
throw new VoluntaryExitError(GossipAction.REJECT, {
|
|
65
65
|
code: VoluntaryExitErrorCode.INVALID_SIGNATURE,
|
package/src/db/beacon.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {Db, LevelDbControllerMetrics
|
|
3
|
-
import {Bucket} from "./buckets.js";
|
|
2
|
+
import {Db, LevelDbControllerMetrics} from "@lodestar/db";
|
|
4
3
|
import {IBeaconDb} from "./interface.js";
|
|
5
4
|
import {CheckpointStateRepository} from "./repositories/checkpointState.js";
|
|
6
5
|
import {
|
|
@@ -96,40 +95,4 @@ export class BeaconDb implements IBeaconDb {
|
|
|
96
95
|
// TODO: Enable once it's deemed safe
|
|
97
96
|
// await this.block.batchDelete(await this.block.keys());
|
|
98
97
|
}
|
|
99
|
-
|
|
100
|
-
async deleteDeprecatedEth1Data(): Promise<void> {
|
|
101
|
-
const deprecatedBuckets = [
|
|
102
|
-
Bucket.phase0_eth1Data,
|
|
103
|
-
Bucket.index_depositDataRoot,
|
|
104
|
-
Bucket.phase0_depositData,
|
|
105
|
-
Bucket.phase0_depositEvent,
|
|
106
|
-
Bucket.phase0_preGenesisState,
|
|
107
|
-
Bucket.phase0_preGenesisStateLastProcessedBlock,
|
|
108
|
-
];
|
|
109
|
-
|
|
110
|
-
for (const bucket of deprecatedBuckets) {
|
|
111
|
-
await this.deleteBucketData(bucket);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
private async deleteBucketData(bucket: Bucket): Promise<void> {
|
|
116
|
-
const minKey = encodeKey(bucket, Buffer.alloc(0));
|
|
117
|
-
const maxKey = encodeKey(bucket + 1, Buffer.alloc(0));
|
|
118
|
-
|
|
119
|
-
// Batch delete to avoid loading all keys into memory at once
|
|
120
|
-
const BATCH_DELETE_SIZE = 1000;
|
|
121
|
-
let keysBatch: Uint8Array[] = [];
|
|
122
|
-
|
|
123
|
-
for await (const key of this.db.keysStream({gte: minKey, lt: maxKey})) {
|
|
124
|
-
keysBatch.push(key);
|
|
125
|
-
if (keysBatch.length >= BATCH_DELETE_SIZE) {
|
|
126
|
-
await this.db.batchDelete(keysBatch);
|
|
127
|
-
keysBatch = [];
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (keysBatch.length > 0) {
|
|
132
|
-
await this.db.batchDelete(keysBatch);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
98
|
}
|
package/src/db/buckets.ts
CHANGED
|
@@ -16,16 +16,13 @@ export enum Bucket {
|
|
|
16
16
|
index_mainChain = 6, // Slot -> Root<BeaconBlock>
|
|
17
17
|
// justified, finalized state and block hashes
|
|
18
18
|
index_chainInfo = 7, // Key -> Number64 | stateHash | blockHash
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
/** @deprecated Eth1 deposit tracking is not required since electra, only kept around to delete data from existing databases */
|
|
22
|
-
index_depositDataRoot = 9,
|
|
19
|
+
// phase0_eth1Data = 8, // DEPRECATED - eth1 deposit tracking is not required since electra
|
|
20
|
+
// index_depositDataRoot = 9, // DEPRECATED - eth1 deposit tracking is not required since electra
|
|
23
21
|
|
|
24
22
|
// op pool
|
|
25
23
|
// phase0_attestation = 10, // DEPRECATED on v0.25.0
|
|
26
24
|
// phase0_aggregateAndProof = 11, // Root -> AggregateAndProof, DEPRECATED on v.27.0
|
|
27
|
-
|
|
28
|
-
phase0_depositData = 12,
|
|
25
|
+
// phase0_depositData = 12, // DEPRECATED - eth1 deposit tracking is not required since electra
|
|
29
26
|
phase0_exit = 13, // ValidatorIndex -> VoluntaryExit
|
|
30
27
|
phase0_proposerSlashing = 14, // ValidatorIndex -> ProposerSlashing
|
|
31
28
|
allForks_attesterSlashing = 15, // Root -> AttesterSlashing
|
|
@@ -34,18 +31,15 @@ export enum Bucket {
|
|
|
34
31
|
allForks_checkpointState = 17, // Root -> BeaconState
|
|
35
32
|
|
|
36
33
|
// allForks_pendingBlock = 25, // Root -> SignedBeaconBlock // DEPRECATED on v0.30.0
|
|
37
|
-
|
|
38
|
-
phase0_depositEvent = 19,
|
|
34
|
+
// phase0_depositEvent = 19, // DEPRECATED - eth1 deposit tracking is not required since electra
|
|
39
35
|
|
|
40
36
|
index_stateArchiveRootIndex = 26, // State Root -> slot
|
|
41
37
|
|
|
42
38
|
deneb_blobSidecars = 27, // DENEB BeaconBlockRoot -> BlobSidecars
|
|
43
39
|
deneb_blobSidecarsArchive = 28, // DENEB BeaconBlockSlot -> BlobSidecars
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
/** @deprecated Genesis from eth1 is no longer supported, only kept around to delete data from existing databases */
|
|
48
|
-
phase0_preGenesisStateLastProcessedBlock = 31,
|
|
41
|
+
// phase0_preGenesisState = 30, // DEPRECATED - genesis from eth1 is no longer supported
|
|
42
|
+
// phase0_preGenesisStateLastProcessedBlock = 31, // DEPRECATED - genesis from eth1 is no longer supported
|
|
49
43
|
|
|
50
44
|
// Lightclient server
|
|
51
45
|
// altair_bestUpdatePerCommitteePeriod = 30, // DEPRECATED on v0.32.0
|
package/src/db/interface.ts
CHANGED
|
@@ -56,8 +56,6 @@ export interface IBeaconDb {
|
|
|
56
56
|
|
|
57
57
|
pruneHotDb(): Promise<void>;
|
|
58
58
|
|
|
59
|
-
deleteDeprecatedEth1Data(): Promise<void>;
|
|
60
|
-
|
|
61
59
|
/** Close the connection to the db instance and close the db store. */
|
|
62
60
|
close(): Promise<void>;
|
|
63
61
|
/** To inject metrics after CLI initialization */
|
package/src/node/nodejs.ts
CHANGED
|
@@ -197,17 +197,6 @@ export class BeaconNode {
|
|
|
197
197
|
// TODO: Should this call be awaited?
|
|
198
198
|
await db.pruneHotDb();
|
|
199
199
|
|
|
200
|
-
// Delete deprecated eth1 data to free up disk space for users
|
|
201
|
-
logger.debug("Deleting deprecated eth1 data from database");
|
|
202
|
-
const startTime = Date.now();
|
|
203
|
-
db.deleteDeprecatedEth1Data()
|
|
204
|
-
.then(() => {
|
|
205
|
-
logger.debug("Deleted deprecated eth1 data", {durationMs: Date.now() - startTime});
|
|
206
|
-
})
|
|
207
|
-
.catch((e) => {
|
|
208
|
-
logger.error("Failed to delete deprecated eth1 data", {}, e);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
200
|
const monitoring = opts.monitoring.endpoint
|
|
212
201
|
? new MonitoringService(
|
|
213
202
|
"beacon",
|
|
@@ -750,13 +750,9 @@ export class BackfillSync extends (EventEmitter as {new (): BackfillSyncEmitter}
|
|
|
750
750
|
|
|
751
751
|
// GENESIS_SLOT doesn't has valid signature
|
|
752
752
|
if (anchorBlock.message.slot === GENESIS_SLOT) return;
|
|
753
|
-
await verifyBlockProposerSignature(
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
this.chain.bls,
|
|
757
|
-
this.chain.getHeadState(),
|
|
758
|
-
[anchorBlock]
|
|
759
|
-
);
|
|
753
|
+
await verifyBlockProposerSignature(this.chain.index2pubkey, this.chain.bls, this.chain.getHeadState(), [
|
|
754
|
+
anchorBlock,
|
|
755
|
+
]);
|
|
760
756
|
|
|
761
757
|
// We can write to the disk if this is ahead of prevFinalizedCheckpointBlock otherwise
|
|
762
758
|
// we will need to go make checks on the top of sync loop before writing as it might
|
|
@@ -822,7 +818,6 @@ export class BackfillSync extends (EventEmitter as {new (): BackfillSyncEmitter}
|
|
|
822
818
|
// If any of the block's proposer signature fail, we can't trust this peer at all
|
|
823
819
|
if (verifiedBlocks.length > 0) {
|
|
824
820
|
await verifyBlockProposerSignature(
|
|
825
|
-
this.chain.config,
|
|
826
821
|
this.chain.index2pubkey,
|
|
827
822
|
this.chain.bls,
|
|
828
823
|
this.chain.getHeadState(),
|
|
@@ -46,7 +46,6 @@ export function verifyBlockSequence(
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export async function verifyBlockProposerSignature(
|
|
49
|
-
config: BeaconConfig,
|
|
50
49
|
index2pubkey: Index2PubkeyCache,
|
|
51
50
|
bls: IBlsVerifier,
|
|
52
51
|
state: CachedBeaconStateAllForks,
|
|
@@ -55,8 +54,7 @@ export async function verifyBlockProposerSignature(
|
|
|
55
54
|
if (blocks.length === 1 && blocks[0].message.slot === GENESIS_SLOT) return;
|
|
56
55
|
const signatures = blocks.reduce((sigs: ISignatureSet[], block) => {
|
|
57
56
|
// genesis block doesn't have valid signature
|
|
58
|
-
if (block.message.slot !== GENESIS_SLOT)
|
|
59
|
-
sigs.push(getBlockProposerSignatureSet(config, index2pubkey, state, block));
|
|
57
|
+
if (block.message.slot !== GENESIS_SLOT) sigs.push(getBlockProposerSignatureSet(index2pubkey, state, block));
|
|
60
58
|
return sigs;
|
|
61
59
|
}, []);
|
|
62
60
|
|