@lodestar/beacon-node 1.39.0-dev.2fe8de2346 → 1.39.0-dev.84b481ddb5

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 (132) hide show
  1. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  2. package/lib/chain/blocks/verifyBlock.js +1 -1
  3. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  4. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  5. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -2
  6. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  7. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -1
  8. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  9. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  10. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  11. package/lib/chain/chain.d.ts.map +1 -1
  12. package/lib/chain/chain.js +6 -4
  13. package/lib/chain/chain.js.map +1 -1
  14. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  15. package/lib/chain/forkChoice/index.js +3 -3
  16. package/lib/chain/forkChoice/index.js.map +1 -1
  17. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -4
  18. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  19. package/lib/chain/opPools/aggregatedAttestationPool.js +4 -4
  20. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  21. package/lib/chain/opPools/opPool.d.ts +3 -0
  22. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  23. package/lib/chain/opPools/opPool.js +9 -8
  24. package/lib/chain/opPools/opPool.js.map +1 -1
  25. package/lib/chain/produceBlock/produceBlockBody.js +2 -2
  26. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  27. package/lib/chain/rewards/attestationsRewards.d.ts +2 -1
  28. package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -1
  29. package/lib/chain/rewards/attestationsRewards.js +8 -8
  30. package/lib/chain/rewards/attestationsRewards.js.map +1 -1
  31. package/lib/chain/rewards/blockRewards.d.ts +2 -1
  32. package/lib/chain/rewards/blockRewards.d.ts.map +1 -1
  33. package/lib/chain/rewards/blockRewards.js +5 -5
  34. package/lib/chain/rewards/blockRewards.js.map +1 -1
  35. package/lib/chain/rewards/syncCommitteeRewards.d.ts +2 -1
  36. package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -1
  37. package/lib/chain/rewards/syncCommitteeRewards.js +2 -2
  38. package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -1
  39. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +4 -1
  40. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  41. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -2
  42. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  43. package/lib/chain/validation/attesterSlashing.js +1 -1
  44. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  45. package/lib/chain/validation/block.d.ts.map +1 -1
  46. package/lib/chain/validation/block.js +3 -3
  47. package/lib/chain/validation/block.js.map +1 -1
  48. package/lib/chain/validation/blsToExecutionChange.js +1 -1
  49. package/lib/chain/validation/proposerSlashing.js +1 -1
  50. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  51. package/lib/chain/validation/signatureSets/aggregateAndProof.js +1 -1
  52. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  53. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -1
  54. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  55. package/lib/chain/validation/signatureSets/contributionAndProof.js +2 -2
  56. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  57. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -1
  58. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  59. package/lib/chain/validation/signatureSets/syncCommittee.js +2 -2
  60. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  61. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -1
  62. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  63. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  64. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  65. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -1
  66. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  67. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -2
  68. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  69. package/lib/chain/validation/syncCommittee.js +1 -1
  70. package/lib/chain/validation/syncCommittee.js.map +1 -1
  71. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  72. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -3
  73. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  74. package/lib/chain/validation/voluntaryExit.js +1 -1
  75. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  76. package/lib/db/beacon.d.ts +2 -0
  77. package/lib/db/beacon.d.ts.map +1 -1
  78. package/lib/db/beacon.js +32 -0
  79. package/lib/db/beacon.js.map +1 -1
  80. package/lib/db/buckets.d.ts +12 -0
  81. package/lib/db/buckets.d.ts.map +1 -1
  82. package/lib/db/buckets.js +12 -6
  83. package/lib/db/buckets.js.map +1 -1
  84. package/lib/db/interface.d.ts +1 -0
  85. package/lib/db/interface.d.ts.map +1 -1
  86. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  87. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  88. package/lib/node/nodejs.d.ts.map +1 -1
  89. package/lib/node/nodejs.js +10 -0
  90. package/lib/node/nodejs.js.map +1 -1
  91. package/lib/node/notifier.d.ts.map +1 -1
  92. package/lib/node/notifier.js +9 -6
  93. package/lib/node/notifier.js.map +1 -1
  94. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  95. package/lib/sync/backfill/backfill.js +2 -4
  96. package/lib/sync/backfill/backfill.js.map +1 -1
  97. package/lib/sync/backfill/verify.d.ts +1 -1
  98. package/lib/sync/backfill/verify.d.ts.map +1 -1
  99. package/lib/sync/backfill/verify.js +2 -2
  100. package/lib/sync/backfill/verify.js.map +1 -1
  101. package/package.json +14 -14
  102. package/src/chain/blocks/verifyBlock.ts +1 -0
  103. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
  104. package/src/chain/blocks/verifyBlocksSignatures.ts +3 -1
  105. package/src/chain/chain.ts +6 -4
  106. package/src/chain/forkChoice/index.ts +3 -2
  107. package/src/chain/opPools/aggregatedAttestationPool.ts +7 -7
  108. package/src/chain/opPools/opPool.ts +8 -8
  109. package/src/chain/produceBlock/produceBlockBody.ts +2 -2
  110. package/src/chain/rewards/attestationsRewards.ts +13 -4
  111. package/src/chain/rewards/blockRewards.ts +6 -3
  112. package/src/chain/rewards/syncCommitteeRewards.ts +3 -1
  113. package/src/chain/stateCache/persistentCheckpointsCache.ts +15 -2
  114. package/src/chain/validation/attesterSlashing.ts +1 -1
  115. package/src/chain/validation/block.ts +3 -2
  116. package/src/chain/validation/blsToExecutionChange.ts +1 -1
  117. package/src/chain/validation/proposerSlashing.ts +1 -1
  118. package/src/chain/validation/signatureSets/aggregateAndProof.ts +1 -1
  119. package/src/chain/validation/signatureSets/contributionAndProof.ts +3 -1
  120. package/src/chain/validation/signatureSets/syncCommittee.ts +3 -1
  121. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +3 -1
  122. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -1
  123. package/src/chain/validation/syncCommittee.ts +1 -1
  124. package/src/chain/validation/syncCommitteeContributionAndProof.ts +8 -3
  125. package/src/chain/validation/voluntaryExit.ts +1 -1
  126. package/src/db/beacon.ts +38 -1
  127. package/src/db/buckets.ts +12 -6
  128. package/src/db/interface.ts +2 -0
  129. package/src/node/nodejs.ts +11 -0
  130. package/src/node/notifier.ts +13 -7
  131. package/src/sync/backfill/backfill.ts +8 -3
  132. package/src/sync/backfill/verify.ts +3 -1
package/src/db/beacon.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
- import {Db, LevelDbControllerMetrics} from "@lodestar/db";
2
+ import {Db, LevelDbControllerMetrics, encodeKey} from "@lodestar/db";
3
+ import {Bucket} from "./buckets.js";
3
4
  import {IBeaconDb} from "./interface.js";
4
5
  import {CheckpointStateRepository} from "./repositories/checkpointState.js";
5
6
  import {
@@ -95,4 +96,40 @@ export class BeaconDb implements IBeaconDb {
95
96
  // TODO: Enable once it's deemed safe
96
97
  // await this.block.batchDelete(await this.block.keys());
97
98
  }
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
+ }
98
135
  }
package/src/db/buckets.ts CHANGED
@@ -16,13 +16,16 @@ 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
- // 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
19
+ /** @deprecated Eth1 deposit tracking is not required since electra, only kept around to delete data from existing databases */
20
+ phase0_eth1Data = 8,
21
+ /** @deprecated Eth1 deposit tracking is not required since electra, only kept around to delete data from existing databases */
22
+ index_depositDataRoot = 9,
21
23
 
22
24
  // op pool
23
25
  // phase0_attestation = 10, // DEPRECATED on v0.25.0
24
26
  // phase0_aggregateAndProof = 11, // Root -> AggregateAndProof, DEPRECATED on v.27.0
25
- // phase0_depositData = 12, // DEPRECATED - eth1 deposit tracking is not required since electra
27
+ /** @deprecated Eth1 deposit tracking is not required since electra, only kept around to delete data from existing databases */
28
+ phase0_depositData = 12,
26
29
  phase0_exit = 13, // ValidatorIndex -> VoluntaryExit
27
30
  phase0_proposerSlashing = 14, // ValidatorIndex -> ProposerSlashing
28
31
  allForks_attesterSlashing = 15, // Root -> AttesterSlashing
@@ -31,15 +34,18 @@ export enum Bucket {
31
34
  allForks_checkpointState = 17, // Root -> BeaconState
32
35
 
33
36
  // allForks_pendingBlock = 25, // Root -> SignedBeaconBlock // DEPRECATED on v0.30.0
34
- // phase0_depositEvent = 19, // DEPRECATED - eth1 deposit tracking is not required since electra
37
+ /** @deprecated Eth1 deposit tracking is not required since electra, only kept around to delete data from existing databases */
38
+ phase0_depositEvent = 19,
35
39
 
36
40
  index_stateArchiveRootIndex = 26, // State Root -> slot
37
41
 
38
42
  deneb_blobSidecars = 27, // DENEB BeaconBlockRoot -> BlobSidecars
39
43
  deneb_blobSidecarsArchive = 28, // DENEB BeaconBlockSlot -> BlobSidecars
40
44
 
41
- // phase0_preGenesisState = 30, // DEPRECATED - genesis from eth1 is no longer supported
42
- // phase0_preGenesisStateLastProcessedBlock = 31, // DEPRECATED - genesis from eth1 is no longer supported
45
+ /** @deprecated Genesis from eth1 is no longer supported, only kept around to delete data from existing databases */
46
+ phase0_preGenesisState = 30,
47
+ /** @deprecated Genesis from eth1 is no longer supported, only kept around to delete data from existing databases */
48
+ phase0_preGenesisStateLastProcessedBlock = 31,
43
49
 
44
50
  // Lightclient server
45
51
  // altair_bestUpdatePerCommitteePeriod = 30, // DEPRECATED on v0.32.0
@@ -56,6 +56,8 @@ export interface IBeaconDb {
56
56
 
57
57
  pruneHotDb(): Promise<void>;
58
58
 
59
+ deleteDeprecatedEth1Data(): Promise<void>;
60
+
59
61
  /** Close the connection to the db instance and close the db store. */
60
62
  close(): Promise<void>;
61
63
  /** To inject metrics after CLI initialization */
@@ -197,6 +197,17 @@ 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
+
200
211
  const monitoring = opts.monitoring.endpoint
201
212
  ? new MonitoringService(
202
213
  "beacon",
@@ -6,6 +6,7 @@ import {
6
6
  computeEpochAtSlot,
7
7
  computeStartSlotAtEpoch,
8
8
  isExecutionCachedStateType,
9
+ isMergeTransitionComplete,
9
10
  } from "@lodestar/state-transition";
10
11
  import {Epoch} from "@lodestar/types";
11
12
  import {ErrorAborted, Logger, prettyBytes, prettyBytesShort, sleep} from "@lodestar/utils";
@@ -171,13 +172,18 @@ function getHeadExecutionInfo(
171
172
 
172
173
  // Add execution status to notifier only if head is on/post bellatrix
173
174
  if (isExecutionCachedStateType(headState)) {
174
- const executionPayloadHashInfo =
175
- headInfo.executionStatus !== ExecutionStatus.PreMerge ? headInfo.executionPayloadBlockHash : "empty";
176
- const executionPayloadNumberInfo =
177
- headInfo.executionStatus !== ExecutionStatus.PreMerge ? headInfo.executionPayloadNumber : NaN;
178
- return [
179
- `exec-block: ${executionStatusStr}(${executionPayloadNumberInfo} ${prettyBytesShort(executionPayloadHashInfo)})`,
180
- ];
175
+ if (isMergeTransitionComplete(headState)) {
176
+ const executionPayloadHashInfo =
177
+ headInfo.executionStatus !== ExecutionStatus.PreMerge ? headInfo.executionPayloadBlockHash : "empty";
178
+ const executionPayloadNumberInfo =
179
+ headInfo.executionStatus !== ExecutionStatus.PreMerge ? headInfo.executionPayloadNumber : NaN;
180
+ return [
181
+ `exec-block: ${executionStatusStr}(${executionPayloadNumberInfo} ${prettyBytesShort(
182
+ executionPayloadHashInfo
183
+ )})`,
184
+ ];
185
+ }
186
+ return [`exec-block: ${executionStatusStr}`];
181
187
  }
182
188
 
183
189
  return [];
@@ -750,9 +750,13 @@ 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(this.chain.index2pubkey, this.chain.bls, this.chain.getHeadState(), [
754
- anchorBlock,
755
- ]);
753
+ await verifyBlockProposerSignature(
754
+ this.chain.config,
755
+ this.chain.index2pubkey,
756
+ this.chain.bls,
757
+ this.chain.getHeadState(),
758
+ [anchorBlock]
759
+ );
756
760
 
757
761
  // We can write to the disk if this is ahead of prevFinalizedCheckpointBlock otherwise
758
762
  // we will need to go make checks on the top of sync loop before writing as it might
@@ -818,6 +822,7 @@ export class BackfillSync extends (EventEmitter as {new (): BackfillSyncEmitter}
818
822
  // If any of the block's proposer signature fail, we can't trust this peer at all
819
823
  if (verifiedBlocks.length > 0) {
820
824
  await verifyBlockProposerSignature(
825
+ this.chain.config,
821
826
  this.chain.index2pubkey,
822
827
  this.chain.bls,
823
828
  this.chain.getHeadState(),
@@ -46,6 +46,7 @@ export function verifyBlockSequence(
46
46
  }
47
47
 
48
48
  export async function verifyBlockProposerSignature(
49
+ config: BeaconConfig,
49
50
  index2pubkey: Index2PubkeyCache,
50
51
  bls: IBlsVerifier,
51
52
  state: CachedBeaconStateAllForks,
@@ -54,7 +55,8 @@ export async function verifyBlockProposerSignature(
54
55
  if (blocks.length === 1 && blocks[0].message.slot === GENESIS_SLOT) return;
55
56
  const signatures = blocks.reduce((sigs: ISignatureSet[], block) => {
56
57
  // genesis block doesn't have valid signature
57
- if (block.message.slot !== GENESIS_SLOT) sigs.push(getBlockProposerSignatureSet(index2pubkey, state, block));
58
+ if (block.message.slot !== GENESIS_SLOT)
59
+ sigs.push(getBlockProposerSignatureSet(config, index2pubkey, state, block));
58
60
  return sigs;
59
61
  }, []);
60
62