@lodestar/beacon-node 1.17.0-dev.3ef43ef0fe → 1.17.0-dev.4857f4354f

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.
Files changed (83) hide show
  1. package/lib/api/impl/beacon/rewards/index.js +5 -0
  2. package/lib/api/impl/beacon/rewards/index.js.map +1 -1
  3. package/lib/chain/archiver/archiveStates.js +21 -6
  4. package/lib/chain/archiver/archiveStates.js.map +1 -1
  5. package/lib/chain/blocks/importBlock.js +2 -1
  6. package/lib/chain/blocks/importBlock.js.map +1 -1
  7. package/lib/chain/blocks/types.d.ts +3 -1
  8. package/lib/chain/blocks/types.js +16 -1
  9. package/lib/chain/blocks/types.js.map +1 -1
  10. package/lib/chain/blocks/verifyBlock.js +1 -0
  11. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  12. package/lib/chain/blocks/verifyBlocksDataAvailability.js +4 -3
  13. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  14. package/lib/chain/chain.d.ts +2 -0
  15. package/lib/chain/chain.js +9 -1
  16. package/lib/chain/chain.js.map +1 -1
  17. package/lib/chain/interface.d.ts +2 -0
  18. package/lib/chain/interface.js.map +1 -1
  19. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -5
  20. package/lib/chain/opPools/aggregatedAttestationPool.js +5 -3
  21. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  22. package/lib/chain/prepareNextSlot.js +1 -0
  23. package/lib/chain/prepareNextSlot.js.map +1 -1
  24. package/lib/chain/produceBlock/produceBlockBody.js +1 -1
  25. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  26. package/lib/chain/regen/errors.d.ts +7 -1
  27. package/lib/chain/regen/errors.js +1 -0
  28. package/lib/chain/regen/errors.js.map +1 -1
  29. package/lib/chain/regen/interface.d.ts +2 -1
  30. package/lib/chain/regen/queued.d.ts +19 -4
  31. package/lib/chain/regen/queued.js +42 -13
  32. package/lib/chain/regen/queued.js.map +1 -1
  33. package/lib/chain/regen/regen.d.ts +15 -6
  34. package/lib/chain/regen/regen.js +62 -24
  35. package/lib/chain/regen/regen.js.map +1 -1
  36. package/lib/chain/rewards/syncCommitteeRewards.d.ts +6 -0
  37. package/lib/chain/rewards/syncCommitteeRewards.js +36 -0
  38. package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -0
  39. package/lib/chain/seenCache/seenAttestationData.d.ts +1 -1
  40. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +6 -1
  41. package/lib/chain/seenCache/seenGossipBlockInput.js +9 -17
  42. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  43. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +2 -1
  44. package/lib/chain/stateCache/fifoBlockStateCache.js +2 -2
  45. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  46. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +6 -5
  47. package/lib/chain/stateCache/persistentCheckpointsCache.js +18 -17
  48. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  49. package/lib/chain/stateCache/stateContextCache.d.ts +2 -1
  50. package/lib/chain/stateCache/stateContextCache.js +2 -2
  51. package/lib/chain/stateCache/stateContextCache.js.map +1 -1
  52. package/lib/chain/stateCache/stateContextCheckpointsCache.d.ts +5 -4
  53. package/lib/chain/stateCache/stateContextCheckpointsCache.js +10 -9
  54. package/lib/chain/stateCache/stateContextCheckpointsCache.js.map +1 -1
  55. package/lib/chain/stateCache/types.d.ts +6 -5
  56. package/lib/chain/stateCache/types.js.map +1 -1
  57. package/lib/chain/validation/aggregateAndProof.d.ts +2 -2
  58. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  59. package/lib/chain/validation/attestation.d.ts +1 -1
  60. package/lib/chain/validation/attestation.js.map +1 -1
  61. package/lib/metrics/metrics/lodestar.d.ts +8 -1
  62. package/lib/metrics/metrics/lodestar.js +10 -0
  63. package/lib/metrics/metrics/lodestar.js.map +1 -1
  64. package/lib/network/events.d.ts +5 -0
  65. package/lib/network/events.js +2 -0
  66. package/lib/network/events.js.map +1 -1
  67. package/lib/network/processor/gossipHandlers.js +7 -4
  68. package/lib/network/processor/gossipHandlers.js.map +1 -1
  69. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +2 -0
  70. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +39 -1
  71. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  72. package/lib/sync/interface.d.ts +15 -4
  73. package/lib/sync/interface.js +1 -0
  74. package/lib/sync/interface.js.map +1 -1
  75. package/lib/sync/unknownBlock.d.ts +9 -0
  76. package/lib/sync/unknownBlock.js +127 -14
  77. package/lib/sync/unknownBlock.js.map +1 -1
  78. package/lib/sync/utils/pendingBlocksTree.js +5 -2
  79. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  80. package/lib/util/multifork.d.ts +2 -1
  81. package/lib/util/multifork.js +4 -1
  82. package/lib/util/multifork.js.map +1 -1
  83. package/package.json +16 -18
@@ -7,6 +7,10 @@ import { ChainEvent } from "../emitter.js";
7
7
  import { RegenError, RegenErrorCode } from "./errors.js";
8
8
  /**
9
9
  * Regenerates states that have already been processed by the fork choice
10
+ * Since Feb 2024, we support reloading checkpoint state from disk via allowDiskReload flag. Due to its performance impact
11
+ * this flag is only set to true in this case:
12
+ * - getPreState: this is for block processing, it's important to reload state in unfinality time
13
+ * - updateHeadState: rarely happen, but it's important to make sure we always can regen head state
10
14
  */
11
15
  export class StateRegenerator {
12
16
  constructor(modules) {
@@ -16,8 +20,9 @@ export class StateRegenerator {
16
20
  * Get the state to run with `block`. May be:
17
21
  * - If parent is in same epoch -> Exact state at `block.parentRoot`
18
22
  * - If parent is in prev epoch -> State after `block.parentRoot` dialed forward through epoch transition
23
+ * - reload state if needed in this flow
19
24
  */
20
- async getPreState(block, opts, rCaller) {
25
+ async getPreState(block, opts, regenCaller) {
21
26
  const parentBlock = this.modules.forkChoice.getBlock(block.parentRoot);
22
27
  if (!parentBlock) {
23
28
  throw new RegenError({
@@ -27,28 +32,30 @@ export class StateRegenerator {
27
32
  }
28
33
  const parentEpoch = computeEpochAtSlot(parentBlock.slot);
29
34
  const blockEpoch = computeEpochAtSlot(block.slot);
35
+ const allowDiskReload = true;
30
36
  // This may save us at least one epoch transition.
31
37
  // If the requested state crosses an epoch boundary
32
38
  // then we may use the checkpoint state before the block
33
39
  // We may have the checkpoint state with parent root inside the checkpoint state cache
34
40
  // through gossip validation.
35
41
  if (parentEpoch < blockEpoch) {
36
- return this.getCheckpointState({ root: block.parentRoot, epoch: blockEpoch }, opts, rCaller);
42
+ return this.getCheckpointState({ root: block.parentRoot, epoch: blockEpoch }, opts, regenCaller, allowDiskReload);
37
43
  }
38
44
  // Otherwise, get the state normally.
39
- return this.getState(parentBlock.stateRoot, rCaller);
45
+ return this.getState(parentBlock.stateRoot, regenCaller, opts, allowDiskReload);
40
46
  }
41
47
  /**
42
48
  * Get state after block `cp.root` dialed forward to first slot of `cp.epoch`
43
49
  */
44
- async getCheckpointState(cp, opts, rCaller) {
50
+ async getCheckpointState(cp, opts, regenCaller, allowDiskReload = false) {
45
51
  const checkpointStartSlot = computeStartSlotAtEpoch(cp.epoch);
46
- return this.getBlockSlotState(toHexString(cp.root), checkpointStartSlot, opts, rCaller);
52
+ return this.getBlockSlotState(toHexString(cp.root), checkpointStartSlot, opts, regenCaller, allowDiskReload);
47
53
  }
48
54
  /**
49
55
  * Get state after block `blockRoot` dialed forward to `slot`
56
+ * - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
50
57
  */
51
- async getBlockSlotState(blockRoot, slot, opts, rCaller) {
58
+ async getBlockSlotState(blockRoot, slot, opts, regenCaller, allowDiskReload = false) {
52
59
  const block = this.modules.forkChoice.getBlockHex(blockRoot);
53
60
  if (!block) {
54
61
  throw new RegenError({
@@ -63,25 +70,32 @@ export class StateRegenerator {
63
70
  blockSlot: block.slot,
64
71
  });
65
72
  }
66
- const latestCheckpointStateCtx = this.modules.checkpointStateCache.getLatest(blockRoot, computeEpochAtSlot(slot));
73
+ const { checkpointStateCache } = this.modules;
74
+ const epoch = computeEpochAtSlot(slot);
75
+ const latestCheckpointStateCtx = allowDiskReload
76
+ ? await checkpointStateCache.getOrReloadLatest(blockRoot, epoch, opts)
77
+ : checkpointStateCache.getLatest(blockRoot, epoch, opts);
67
78
  // If a checkpoint state exists with the given checkpoint root, it either is in requested epoch
68
79
  // or needs to have empty slots processed until the requested epoch
69
80
  if (latestCheckpointStateCtx) {
70
- return processSlotsByCheckpoint(this.modules, latestCheckpointStateCtx, slot, opts);
81
+ return processSlotsByCheckpoint(this.modules, latestCheckpointStateCtx, slot, regenCaller, opts);
71
82
  }
72
83
  // Otherwise, use the fork choice to get the stateRoot from block at the checkpoint root
73
84
  // regenerate that state,
74
85
  // then process empty slots until the requested epoch
75
- const blockStateCtx = await this.getState(block.stateRoot, rCaller);
76
- return processSlotsByCheckpoint(this.modules, blockStateCtx, slot, opts);
86
+ const blockStateCtx = await this.getState(block.stateRoot, regenCaller, opts, allowDiskReload);
87
+ return processSlotsByCheckpoint(this.modules, blockStateCtx, slot, regenCaller, opts);
77
88
  }
78
89
  /**
79
90
  * Get state by exact root. If not in cache directly, requires finding the block that references the state from the
80
91
  * forkchoice and replaying blocks to get to it.
92
+ * - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
81
93
  */
82
- async getState(stateRoot, _rCaller) {
94
+ async getState(stateRoot, _rCaller, opts,
95
+ // internal option, don't want to expose to external caller
96
+ allowDiskReload = false) {
83
97
  // Trivial case, state at stateRoot is already cached
84
- const cachedStateCtx = this.modules.stateCache.get(stateRoot);
98
+ const cachedStateCtx = this.modules.stateCache.get(stateRoot, opts);
85
99
  if (cachedStateCtx) {
86
100
  return cachedStateCtx;
87
101
  }
@@ -93,12 +107,17 @@ export class StateRegenerator {
93
107
  // gets reversed when replayed
94
108
  const blocksToReplay = [block];
95
109
  let state = null;
96
- for (const b of this.modules.forkChoice.iterateAncestorBlocks(block.parentRoot)) {
97
- state = this.modules.stateCache.get(b.stateRoot);
110
+ const { checkpointStateCache } = this.modules;
111
+ // iterateAncestorBlocks only returns ancestor blocks, not the block itself
112
+ for (const b of this.modules.forkChoice.iterateAncestorBlocks(block.blockRoot)) {
113
+ state = this.modules.stateCache.get(b.stateRoot, opts);
98
114
  if (state) {
99
115
  break;
100
116
  }
101
- state = this.modules.checkpointStateCache.getLatest(b.blockRoot, computeEpochAtSlot(blocksToReplay[blocksToReplay.length - 1].slot - 1));
117
+ const epoch = computeEpochAtSlot(blocksToReplay[blocksToReplay.length - 1].slot - 1);
118
+ state = allowDiskReload
119
+ ? await checkpointStateCache.getOrReloadLatest(b.blockRoot, epoch, opts)
120
+ : checkpointStateCache.getLatest(b.blockRoot, epoch, opts);
102
121
  if (state) {
103
122
  break;
104
123
  }
@@ -116,6 +135,8 @@ export class StateRegenerator {
116
135
  stateRoot,
117
136
  });
118
137
  }
138
+ const replaySlots = blocksToReplay.map((b) => b.slot).join(",");
139
+ this.modules.logger.debug("Replaying blocks to get state", { stateRoot, replaySlots });
119
140
  for (const b of blocksToReplay.reverse()) {
120
141
  const block = await this.modules.db.block.get(fromHexString(b.blockRoot));
121
142
  if (!block) {
@@ -134,9 +155,20 @@ export class StateRegenerator {
134
155
  verifyStateRoot: false,
135
156
  verifyProposer: false,
136
157
  verifySignatures: false,
137
- }, null);
138
- // TODO: Persist states, note that regen could be triggered by old states.
139
- // Should those take a place in the cache?
158
+ }, this.modules.metrics);
159
+ const stateRoot = toHexString(state.hashTreeRoot());
160
+ if (b.stateRoot !== stateRoot) {
161
+ throw new RegenError({
162
+ slot: b.slot,
163
+ code: RegenErrorCode.INVALID_STATE_ROOT,
164
+ actual: stateRoot,
165
+ expected: b.stateRoot,
166
+ });
167
+ }
168
+ if (allowDiskReload) {
169
+ // also with allowDiskReload flag, we "reload" it to the state cache too
170
+ this.modules.stateCache.add(state);
171
+ }
140
172
  // this avoids keeping our node busy processing blocks
141
173
  await sleep(0);
142
174
  }
@@ -147,11 +179,12 @@ export class StateRegenerator {
147
179
  });
148
180
  }
149
181
  }
182
+ this.modules.logger.debug("Replayed blocks to get state", { stateRoot, replaySlots });
150
183
  return state;
151
184
  }
152
185
  findFirstStateBlock(stateRoot) {
153
186
  for (const block of this.modules.forkChoice.forwarditerateAncestorBlocks()) {
154
- if (block !== undefined) {
187
+ if (block.stateRoot === stateRoot) {
155
188
  return block;
156
189
  }
157
190
  }
@@ -166,8 +199,8 @@ export class StateRegenerator {
166
199
  * process slots forward towards `slot`,
167
200
  * emitting "checkpoint" events after every epoch processed.
168
201
  */
169
- async function processSlotsByCheckpoint(modules, preState, slot, opts) {
170
- let postState = await processSlotsToNearestCheckpoint(modules, preState, slot, opts);
202
+ async function processSlotsByCheckpoint(modules, preState, slot, regenCaller, opts) {
203
+ let postState = await processSlotsToNearestCheckpoint(modules, preState, slot, regenCaller, opts);
171
204
  if (postState.slot < slot) {
172
205
  postState = processSlots(postState, slot, opts, modules.metrics);
173
206
  }
@@ -180,7 +213,7 @@ async function processSlotsByCheckpoint(modules, preState, slot, opts) {
180
213
  *
181
214
  * Stops processing after no more full epochs can be processed.
182
215
  */
183
- async function processSlotsToNearestCheckpoint(modules, preState, slot, opts) {
216
+ async function processSlotsToNearestCheckpoint(modules, preState, slot, regenCaller, opts) {
184
217
  const preSlot = preState.slot;
185
218
  const postSlot = slot;
186
219
  const preEpoch = computeEpochAtSlot(preSlot);
@@ -189,11 +222,16 @@ async function processSlotsToNearestCheckpoint(modules, preState, slot, opts) {
189
222
  for (let nextEpochSlot = computeStartSlotAtEpoch(preEpoch + 1); nextEpochSlot <= postSlot; nextEpochSlot += SLOTS_PER_EPOCH) {
190
223
  // processSlots calls .clone() before mutating
191
224
  postState = processSlots(postState, nextEpochSlot, opts, metrics);
192
- // Cache state to preserve epoch transition work
225
+ modules.metrics?.epochTransitionByCaller.inc({ caller: regenCaller });
226
+ // this is usually added when we prepare for next slot or validate gossip block
227
+ // then when we process the 1st block of epoch, we don't have to do state transition again
228
+ // This adds Previous Root Checkpoint State to the checkpoint state cache
229
+ // This may becomes the "official" checkpoint state if the 1st block of epoch is skipped
193
230
  const checkpointState = postState;
194
231
  const cp = getCheckpointFromState(checkpointState);
195
232
  checkpointStateCache.add(cp, checkpointState);
196
- emitter.emit(ChainEvent.checkpoint, cp, checkpointState);
233
+ // consumers should not mutate or get the transfered cache
234
+ emitter.emit(ChainEvent.checkpoint, cp, checkpointState.clone(true));
197
235
  // this avoids keeping our node busy processing blocks
198
236
  await sleep(0);
199
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"regen.js","sourceRoot":"","sources":["../../../src/chain/regen/regen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"regen.js","sourceRoot":"","sources":["../../../src/chain/regen/regen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
2
+ import { ValidatorIndex, allForks } from "@lodestar/types";
3
+ import { routes } from "@lodestar/api";
4
+ export type SyncCommitteeRewards = routes.beacon.SyncCommitteeRewards;
5
+ export declare function computeSyncCommitteeRewards(block: allForks.BeaconBlock, preState: CachedBeaconStateAllForks, validatorIds?: (ValidatorIndex | string)[]): Promise<SyncCommitteeRewards>;
6
+ //# sourceMappingURL=syncCommitteeRewards.d.ts.map
@@ -0,0 +1,36 @@
1
+ import { ForkName, SYNC_COMMITTEE_SIZE } from "@lodestar/params";
2
+ export async function computeSyncCommitteeRewards(block, preState, validatorIds) {
3
+ const fork = preState.config.getForkName(block.slot);
4
+ if (fork === ForkName.phase0) {
5
+ throw Error("Cannot get sync rewards as phase0 block does not have sync committee");
6
+ }
7
+ const altairBlock = block;
8
+ const preStateAltair = preState;
9
+ const { index2pubkey } = preStateAltair.epochCtx;
10
+ // Bound committeeIndices in case it goes beyond SYNC_COMMITTEE_SIZE just to be safe
11
+ const committeeIndices = preStateAltair.epochCtx.currentSyncCommitteeIndexed.validatorIndices.slice(0, SYNC_COMMITTEE_SIZE);
12
+ const { syncParticipantReward } = preStateAltair.epochCtx;
13
+ const { syncCommitteeBits } = altairBlock.body.syncAggregate;
14
+ // Use balance of each committee as starting point such that we cap the penalty to avoid balance dropping below 0
15
+ const balances = new Map(committeeIndices.map((i) => [i, { val: preStateAltair.balances.get(i) }]));
16
+ for (const i of committeeIndices) {
17
+ const balanceRecord = balances.get(i);
18
+ if (syncCommitteeBits.get(i)) {
19
+ // Positive rewards for participants
20
+ balanceRecord.val += syncParticipantReward;
21
+ }
22
+ else {
23
+ // Negative rewards for non participants
24
+ balanceRecord.val = Math.max(0, balanceRecord.val - syncParticipantReward);
25
+ }
26
+ }
27
+ const rewards = Array.from(balances, ([validatorIndex, v]) => ({ validatorIndex, reward: v.val }));
28
+ if (validatorIds !== undefined) {
29
+ const filtersSet = new Set(validatorIds);
30
+ return rewards.filter((reward) => filtersSet.has(reward.validatorIndex) || filtersSet.has(index2pubkey[reward.validatorIndex].toHex()));
31
+ }
32
+ else {
33
+ return rewards;
34
+ }
35
+ }
36
+ //# sourceMappingURL=syncCommitteeRewards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncCommitteeRewards.js","sourceRoot":"","sources":["../../../src/chain/rewards/syncCommitteeRewards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAM/D,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAA2B,EAC3B,QAAmC,EACnC,YAA0C;IAE1C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,WAAW,GAAG,KAA2B,CAAC;IAChD,MAAM,cAAc,GAAG,QAAmC,CAAC;IAC3D,MAAM,EAAC,YAAY,EAAC,GAAG,cAAc,CAAC,QAAQ,CAAC;IAE/C,oFAAoF;IACpF,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,KAAK,CACjG,CAAC,EACD,mBAAmB,CACpB,CAAC;IACF,MAAM,EAAC,qBAAqB,EAAC,GAAG,cAAc,CAAC,QAAQ,CAAC;IACxD,MAAM,EAAC,iBAAiB,EAAC,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;IAE3D,iHAAiH;IACjH,MAAM,QAAQ,GAAuC,IAAI,GAAG,CAC1D,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CACxE,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAkB,CAAC;QACvD,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,oCAAoC;YACpC,aAAa,CAAC,GAAG,IAAI,qBAAqB,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,GAAG,qBAAqB,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC;IAEjG,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,CACjH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -3,7 +3,7 @@ import { Metrics } from "../../metrics/metrics.js";
3
3
  import { AttDataBase64 } from "../../util/sszBytes.js";
4
4
  import { InsertOutcome } from "../opPools/types.js";
5
5
  export type AttestationDataCacheEntry = {
6
- committeeIndices: number[];
6
+ committeeIndices: Uint32Array;
7
7
  signingRoot: Uint8Array;
8
8
  attDataRootHex: RootHex;
9
9
  attestationData: phase0.AttestationData;
@@ -1,6 +1,11 @@
1
1
  import { deneb, RootHex, allForks } from "@lodestar/types";
2
2
  import { ChainForkConfig } from "@lodestar/config";
3
3
  import { BlockInput, GossipedInputType } from "../blocks/types.js";
4
+ import { Metrics } from "../../metrics/index.js";
5
+ export declare enum BlockInputAvailabilitySource {
6
+ GOSSIP = "gossip",
7
+ UNKNOWN_SYNC = "unknown_sync"
8
+ }
4
9
  type GossipedBlockInput = {
5
10
  type: GossipedInputType.block;
6
11
  signedBlock: allForks.SignedBeaconBlock;
@@ -25,7 +30,7 @@ export declare class SeenGossipBlockInput {
25
30
  private blockInputCache;
26
31
  prune(): void;
27
32
  hasBlock(blockRoot: RootHex): boolean;
28
- getGossipBlockInput(config: ChainForkConfig, gossipedInput: GossipedBlockInput): {
33
+ getGossipBlockInput(config: ChainForkConfig, gossipedInput: GossipedBlockInput, metrics: Metrics | null): {
29
34
  blockInput: BlockInput;
30
35
  blockInputMeta: {
31
36
  pending: GossipedInputType.blob | null;
@@ -2,7 +2,12 @@ import { toHexString } from "@chainsafe/ssz";
2
2
  import { ssz } from "@lodestar/types";
3
3
  import { pruneSetToMax } from "@lodestar/utils";
4
4
  import { BLOBSIDECAR_FIXED_SIZE, ForkSeq } from "@lodestar/params";
5
- import { getBlockInput, BlockSource, GossipedInputType, } from "../blocks/types.js";
5
+ import { getBlockInput, BlockSource, GossipedInputType, getBlockInputBlobs, } from "../blocks/types.js";
6
+ export var BlockInputAvailabilitySource;
7
+ (function (BlockInputAvailabilitySource) {
8
+ BlockInputAvailabilitySource["GOSSIP"] = "gossip";
9
+ BlockInputAvailabilitySource["UNKNOWN_SYNC"] = "unknown_sync";
10
+ })(BlockInputAvailabilitySource || (BlockInputAvailabilitySource = {}));
6
11
  const MAX_GOSSIPINPUT_CACHE = 5;
7
12
  /**
8
13
  * For predeneb, SeenGossipBlockInput only tracks and caches block so that we don't need to download known block
@@ -25,7 +30,7 @@ export class SeenGossipBlockInput {
25
30
  hasBlock(blockRoot) {
26
31
  return this.blockInputCache.has(blockRoot);
27
32
  }
28
- getGossipBlockInput(config, gossipedInput) {
33
+ getGossipBlockInput(config, gossipedInput, metrics) {
29
34
  let blockHex;
30
35
  let blockCache;
31
36
  if (gossipedInput.type === GossipedInputType.block) {
@@ -68,6 +73,7 @@ export class SeenGossipBlockInput {
68
73
  if (blobKzgCommitments.length === blobsCache.size) {
69
74
  const allBlobs = getBlockInputBlobs(blobsCache);
70
75
  resolveAvailability(allBlobs);
76
+ metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({ source: BlockInputAvailabilitySource.GOSSIP });
71
77
  const { blobs, blobsBytes } = allBlobs;
72
78
  return {
73
79
  blockInput: getBlockInput.postDeneb(config, signedBlock, BlockSource.gossip, blobs, blockBytes ?? null, blobsBytes),
@@ -76,7 +82,7 @@ export class SeenGossipBlockInput {
76
82
  }
77
83
  else {
78
84
  return {
79
- blockInput: getBlockInput.blobsPromise(config, signedBlock, BlockSource.gossip, blobsCache, blockBytes ?? null, availabilityPromise),
85
+ blockInput: getBlockInput.blobsPromise(config, signedBlock, BlockSource.gossip, blobsCache, blockBytes ?? null, availabilityPromise, resolveAvailability),
80
86
  blockInputMeta: {
81
87
  pending: GossipedInputType.blob,
82
88
  haveBlobs: blobsCache.size,
@@ -107,18 +113,4 @@ function getEmptyBlockInputCacheEntry() {
107
113
  const blobsCache = new Map();
108
114
  return { availabilityPromise, resolveAvailability, blobsCache };
109
115
  }
110
- function getBlockInputBlobs(blobsCache) {
111
- const blobs = [];
112
- const blobsBytes = [];
113
- for (let index = 0; index < blobsCache.size; index++) {
114
- const blobCache = blobsCache.get(index);
115
- if (blobCache === undefined) {
116
- throw Error(`Missing blobSidecar at index=${index}`);
117
- }
118
- const { blobSidecar, blobBytes } = blobCache;
119
- blobs.push(blobSidecar);
120
- blobsBytes.push(blobBytes);
121
- }
122
- return { blobs, blobsBytes };
123
- }
124
116
  //# sourceMappingURL=seenGossipBlockInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"seenGossipBlockInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenGossipBlockInput.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seenGossipBlockInput.js","sourceRoot":"","sources":["../../../src/chain/seenCache/seenGossipBlockInput.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { RootHex } from "@lodestar/types";
2
2
  import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
3
3
  import { routes } from "@lodestar/api";
4
4
  import { Metrics } from "../../metrics/index.js";
5
+ import { StateCloneOpts } from "../regen/interface.js";
5
6
  import { BlockStateCache } from "./types.js";
6
7
  export type FIFOBlockStateCacheOpts = {
7
8
  maxBlockStates?: number;
@@ -50,7 +51,7 @@ export declare class FIFOBlockStateCache implements BlockStateCache {
50
51
  /**
51
52
  * Get a state from this cache given a state root hex.
52
53
  */
53
- get(rootHex: RootHex): CachedBeaconStateAllForks | null;
54
+ get(rootHex: RootHex, opts?: StateCloneOpts): CachedBeaconStateAllForks | null;
54
55
  /**
55
56
  * Add a state to this cache.
56
57
  * @param isHead if true, move it to the head of the list. Otherwise add to the 2nd position.
@@ -45,7 +45,7 @@ export class FIFOBlockStateCache {
45
45
  /**
46
46
  * Get a state from this cache given a state root hex.
47
47
  */
48
- get(rootHex) {
48
+ get(rootHex, opts) {
49
49
  this.metrics?.lookups.inc();
50
50
  const item = this.cache.get(rootHex);
51
51
  if (!item) {
@@ -53,7 +53,7 @@ export class FIFOBlockStateCache {
53
53
  }
54
54
  this.metrics?.hits.inc();
55
55
  this.metrics?.stateClonedCount.observe(item.clonedCount);
56
- return item;
56
+ return item.clone(opts?.dontTransferCache);
57
57
  }
58
58
  /**
59
59
  * Add a state to this cache.
@@ -1 +1 @@
1
- {"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fifoBlockStateCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/fifoBlockStateCache.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { Metrics } from "../../metrics/index.js";
6
6
  import { IClock } from "../../util/clock.js";
7
7
  import { ShufflingCache } from "../shufflingCache.js";
8
8
  import { BufferPool } from "../../util/bufferPool.js";
9
+ import { StateCloneOpts } from "../regen/interface.js";
9
10
  import { CPStateDatastore, DatastoreKey } from "./datastore/index.js";
10
11
  import { CheckpointHex, CheckpointStateCache } from "./types.js";
11
12
  export type PersistentCheckpointStateCacheOpts = {
@@ -92,7 +93,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
92
93
  * - Get block for processing
93
94
  * - Regen head state
94
95
  */
95
- getOrReload(cp: CheckpointHex): Promise<CachedBeaconStateAllForks | null>;
96
+ getOrReload(cp: CheckpointHex, opts?: StateCloneOpts): Promise<CachedBeaconStateAllForks | null>;
96
97
  /**
97
98
  * Return either state or state bytes loaded from db.
98
99
  */
@@ -100,11 +101,11 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
100
101
  /**
101
102
  * Return either state or state bytes with persisted key loaded from db.
102
103
  */
103
- getStateOrLoadDb(cp: CheckpointHex): Promise<CachedBeaconStateAllForks | LoadedStateBytesData | null>;
104
+ getStateOrLoadDb(cp: CheckpointHex, opts?: StateCloneOpts): Promise<CachedBeaconStateAllForks | LoadedStateBytesData | null>;
104
105
  /**
105
106
  * Similar to get() api without reloading from disk
106
107
  */
107
- get(cpOrKey: CheckpointHex | string): CachedBeaconStateAllForks | null;
108
+ get(cpOrKey: CheckpointHex | string, opts?: StateCloneOpts): CachedBeaconStateAllForks | null;
108
109
  /**
109
110
  * Add a state of a checkpoint to this cache, prune from memory if necessary.
110
111
  */
@@ -112,7 +113,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
112
113
  /**
113
114
  * Searches in-memory state for the latest cached state with a `root` without reload, starting with `epoch` and descending
114
115
  */
115
- getLatest(rootHex: RootHex, maxEpoch: Epoch): CachedBeaconStateAllForks | null;
116
+ getLatest(rootHex: RootHex, maxEpoch: Epoch, opts?: StateCloneOpts): CachedBeaconStateAllForks | null;
116
117
  /**
117
118
  * Searches state for the latest cached state with a `root`, reload if needed, starting with `epoch` and descending
118
119
  * This is expensive api, should only be called in some important flows:
@@ -120,7 +121,7 @@ export declare class PersistentCheckpointStateCache implements CheckpointStateCa
120
121
  * - Get block for processing
121
122
  * - Regen head state
122
123
  */
123
- getOrReloadLatest(rootHex: RootHex, maxEpoch: Epoch): Promise<CachedBeaconStateAllForks | null>;
124
+ getOrReloadLatest(rootHex: RootHex, maxEpoch: Epoch, opts?: StateCloneOpts): Promise<CachedBeaconStateAllForks | null>;
124
125
  /**
125
126
  * Update the precomputed checkpoint and return the number of his for the
126
127
  * previous one (if any).
@@ -156,10 +156,10 @@ export class PersistentCheckpointStateCache {
156
156
  * - Get block for processing
157
157
  * - Regen head state
158
158
  */
159
- async getOrReload(cp) {
160
- const stateOrStateBytesData = await this.getStateOrLoadDb(cp);
159
+ async getOrReload(cp, opts) {
160
+ const stateOrStateBytesData = await this.getStateOrLoadDb(cp, opts);
161
161
  if (stateOrStateBytesData === null || isCachedBeaconState(stateOrStateBytesData)) {
162
- return stateOrStateBytesData;
162
+ return stateOrStateBytesData?.clone(opts?.dontTransferCache) ?? null;
163
163
  }
164
164
  const { persistedKey, stateBytes } = stateOrStateBytesData;
165
165
  const logMeta = { persistedKey: toHexString(persistedKey) };
@@ -209,7 +209,7 @@ export class PersistentCheckpointStateCache {
209
209
  this.cache.set(cpKey, { type: CacheItemType.inMemory, state: newCachedState, persistedKey });
210
210
  this.epochIndex.getOrDefault(cp.epoch).add(cp.rootHex);
211
211
  // don't prune from memory here, call it at the last 1/3 of slot 0 of an epoch
212
- return newCachedState;
212
+ return newCachedState.clone(opts?.dontTransferCache);
213
213
  }
214
214
  catch (e_1) {
215
215
  env_1.error = e_1;
@@ -228,7 +228,8 @@ export class PersistentCheckpointStateCache {
228
228
  * Return either state or state bytes loaded from db.
229
229
  */
230
230
  async getStateOrBytes(cp) {
231
- const stateOrLoadedState = await this.getStateOrLoadDb(cp);
231
+ // don't have to transfer cache for this specific api
232
+ const stateOrLoadedState = await this.getStateOrLoadDb(cp, { dontTransferCache: true });
232
233
  if (stateOrLoadedState === null || isCachedBeaconState(stateOrLoadedState)) {
233
234
  return stateOrLoadedState;
234
235
  }
@@ -237,9 +238,9 @@ export class PersistentCheckpointStateCache {
237
238
  /**
238
239
  * Return either state or state bytes with persisted key loaded from db.
239
240
  */
240
- async getStateOrLoadDb(cp) {
241
+ async getStateOrLoadDb(cp, opts) {
241
242
  const cpKey = toCacheKey(cp);
242
- const inMemoryState = this.get(cpKey);
243
+ const inMemoryState = this.get(cpKey, opts);
243
244
  if (inMemoryState) {
244
245
  return inMemoryState;
245
246
  }
@@ -263,7 +264,7 @@ export class PersistentCheckpointStateCache {
263
264
  /**
264
265
  * Similar to get() api without reloading from disk
265
266
  */
266
- get(cpOrKey) {
267
+ get(cpOrKey, opts) {
267
268
  this.metrics?.lookups.inc();
268
269
  const cpKey = typeof cpOrKey === "string" ? cpOrKey : toCacheKey(cpOrKey);
269
270
  const cacheItem = this.cache.get(cpKey);
@@ -277,7 +278,7 @@ export class PersistentCheckpointStateCache {
277
278
  if (isInMemoryCacheItem(cacheItem)) {
278
279
  const { state } = cacheItem;
279
280
  this.metrics?.stateClonedCount.observe(state.clonedCount);
280
- return state;
281
+ return state.clone(opts?.dontTransferCache);
281
282
  }
282
283
  return null;
283
284
  }
@@ -308,16 +309,16 @@ export class PersistentCheckpointStateCache {
308
309
  /**
309
310
  * Searches in-memory state for the latest cached state with a `root` without reload, starting with `epoch` and descending
310
311
  */
311
- getLatest(rootHex, maxEpoch) {
312
+ getLatest(rootHex, maxEpoch, opts) {
312
313
  // sort epochs in descending order, only consider epochs lte `epoch`
313
314
  const epochs = Array.from(this.epochIndex.keys())
314
315
  .sort((a, b) => b - a)
315
316
  .filter((e) => e <= maxEpoch);
316
317
  for (const epoch of epochs) {
317
318
  if (this.epochIndex.get(epoch)?.has(rootHex)) {
318
- const inMemoryState = this.get({ rootHex, epoch });
319
- if (inMemoryState) {
320
- return inMemoryState;
319
+ const inMemoryClonedState = this.get({ rootHex, epoch }, opts);
320
+ if (inMemoryClonedState) {
321
+ return inMemoryClonedState;
321
322
  }
322
323
  }
323
324
  }
@@ -330,7 +331,7 @@ export class PersistentCheckpointStateCache {
330
331
  * - Get block for processing
331
332
  * - Regen head state
332
333
  */
333
- async getOrReloadLatest(rootHex, maxEpoch) {
334
+ async getOrReloadLatest(rootHex, maxEpoch, opts) {
334
335
  // sort epochs in descending order, only consider epochs lte `epoch`
335
336
  const epochs = Array.from(this.epochIndex.keys())
336
337
  .sort((a, b) => b - a)
@@ -338,9 +339,9 @@ export class PersistentCheckpointStateCache {
338
339
  for (const epoch of epochs) {
339
340
  if (this.epochIndex.get(epoch)?.has(rootHex)) {
340
341
  try {
341
- const state = await this.getOrReload({ rootHex, epoch });
342
- if (state) {
343
- return state;
342
+ const clonedState = await this.getOrReload({ rootHex, epoch }, opts);
343
+ if (clonedState) {
344
+ return clonedState;
344
345
  }
345
346
  }
346
347
  catch (e) {