@lodestar/beacon-node 1.32.0-peerDAS.a2aa33ab94 → 1.32.0-peerDAS.adb684580d

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 (181) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +32 -13
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/validator/index.js +43 -29
  4. package/lib/api/impl/validator/index.js.map +1 -1
  5. package/lib/chain/archiveStore/archiveStore.js +1 -1
  6. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  7. package/lib/chain/archiveStore/historicalState/metrics.js +8 -0
  8. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  9. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
  10. package/lib/chain/archiveStore/utils/archiveBlocks.js +29 -1
  11. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  12. package/lib/chain/blocks/importBlock.js +1 -21
  13. package/lib/chain/blocks/importBlock.js.map +1 -1
  14. package/lib/chain/blocks/types.d.ts +1 -0
  15. package/lib/chain/blocks/types.js.map +1 -1
  16. package/lib/chain/blocks/verifyBlocksDataAvailability.js +1 -1
  17. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  18. package/lib/chain/chain.d.ts +9 -6
  19. package/lib/chain/chain.js +28 -15
  20. package/lib/chain/chain.js.map +1 -1
  21. package/lib/chain/emitter.d.ts +6 -6
  22. package/lib/chain/emitter.js +4 -4
  23. package/lib/chain/emitter.js.map +1 -1
  24. package/lib/chain/interface.d.ts +4 -4
  25. package/lib/chain/interface.js.map +1 -1
  26. package/lib/chain/options.d.ts +2 -2
  27. package/lib/chain/produceBlock/produceBlockBody.d.ts +1 -1
  28. package/lib/chain/produceBlock/produceBlockBody.js +145 -116
  29. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  30. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +4 -1
  31. package/lib/chain/seenCache/seenGossipBlockInput.js +75 -9
  32. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  33. package/lib/chain/validation/dataColumnSidecar.d.ts +1 -1
  34. package/lib/chain/validation/dataColumnSidecar.js +5 -2
  35. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  36. package/lib/metrics/metrics/beacon.d.ts +3 -0
  37. package/lib/metrics/metrics/beacon.js +17 -1
  38. package/lib/metrics/metrics/beacon.js.map +1 -1
  39. package/lib/metrics/metrics/lodestar.d.ts +15 -0
  40. package/lib/metrics/metrics/lodestar.js +32 -0
  41. package/lib/metrics/metrics/lodestar.js.map +1 -1
  42. package/lib/network/core/networkCore.d.ts +7 -8
  43. package/lib/network/core/networkCore.js +52 -48
  44. package/lib/network/core/networkCore.js.map +1 -1
  45. package/lib/network/core/networkCoreWorker.js +0 -1
  46. package/lib/network/core/networkCoreWorker.js.map +1 -1
  47. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -4
  48. package/lib/network/core/networkCoreWorkerHandler.js +0 -3
  49. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  50. package/lib/network/core/types.d.ts +8 -6
  51. package/lib/network/discv5/index.d.ts +1 -0
  52. package/lib/network/discv5/index.js +1 -0
  53. package/lib/network/discv5/index.js.map +1 -1
  54. package/lib/network/discv5/types.d.ts +1 -0
  55. package/lib/network/discv5/utils.d.ts +3 -1
  56. package/lib/network/discv5/utils.js +12 -2
  57. package/lib/network/discv5/utils.js.map +1 -1
  58. package/lib/network/discv5/worker.js +5 -1
  59. package/lib/network/discv5/worker.js.map +1 -1
  60. package/lib/network/events.d.ts +2 -2
  61. package/lib/network/forks.d.ts +2 -0
  62. package/lib/network/forks.js +4 -0
  63. package/lib/network/forks.js.map +1 -1
  64. package/lib/network/gossip/encoding.js +1 -1
  65. package/lib/network/gossip/encoding.js.map +1 -1
  66. package/lib/network/gossip/gossipsub.js +6 -4
  67. package/lib/network/gossip/gossipsub.js.map +1 -1
  68. package/lib/network/gossip/interface.d.ts +2 -2
  69. package/lib/network/gossip/scoringParameters.js +10 -10
  70. package/lib/network/gossip/scoringParameters.js.map +1 -1
  71. package/lib/network/gossip/topic.js +14 -13
  72. package/lib/network/gossip/topic.js.map +1 -1
  73. package/lib/network/interface.d.ts +2 -2
  74. package/lib/network/metadata.js +1 -1
  75. package/lib/network/metadata.js.map +1 -1
  76. package/lib/network/network.d.ts +4 -5
  77. package/lib/network/network.js +69 -59
  78. package/lib/network/network.js.map +1 -1
  79. package/lib/network/networkConfig.d.ts +0 -1
  80. package/lib/network/networkConfig.js +0 -3
  81. package/lib/network/networkConfig.js.map +1 -1
  82. package/lib/network/options.js +4 -1
  83. package/lib/network/options.js.map +1 -1
  84. package/lib/network/peers/discover.d.ts +0 -6
  85. package/lib/network/peers/discover.js +5 -37
  86. package/lib/network/peers/discover.js.map +1 -1
  87. package/lib/network/peers/peerManager.d.ts +2 -4
  88. package/lib/network/peers/peerManager.js +12 -16
  89. package/lib/network/peers/peerManager.js.map +1 -1
  90. package/lib/network/peers/peersData.d.ts +10 -2
  91. package/lib/network/peers/peersData.js.map +1 -1
  92. package/lib/network/peers/utils/assertPeerRelevance.d.ts +7 -3
  93. package/lib/network/peers/utils/assertPeerRelevance.js +10 -1
  94. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  95. package/lib/network/peers/utils/prioritizePeers.d.ts +6 -6
  96. package/lib/network/peers/utils/prioritizePeers.js +24 -13
  97. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  98. package/lib/network/processor/gossipHandlers.js +30 -25
  99. package/lib/network/processor/gossipHandlers.js.map +1 -1
  100. package/lib/network/processor/gossipQueues/index.js +1 -1
  101. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  102. package/lib/network/processor/index.js +2 -2
  103. package/lib/network/processor/index.js.map +1 -1
  104. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +5 -5
  105. package/lib/network/reqresp/ReqRespBeaconNode.js +20 -15
  106. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  107. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +2 -1
  108. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +6 -2
  109. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  110. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +1 -0
  111. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +25 -5
  112. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  113. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -2
  114. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  115. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +1 -1
  116. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  117. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +1 -1
  118. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  119. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +1 -1
  120. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  121. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -1
  122. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  123. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
  124. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  125. package/lib/network/reqresp/handlers/lightClientBootstrap.js +1 -1
  126. package/lib/network/reqresp/handlers/lightClientBootstrap.js.map +1 -1
  127. package/lib/network/reqresp/handlers/lightClientFinalityUpdate.js +1 -1
  128. package/lib/network/reqresp/handlers/lightClientFinalityUpdate.js.map +1 -1
  129. package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.js +1 -1
  130. package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.js.map +1 -1
  131. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js +1 -1
  132. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js.map +1 -1
  133. package/lib/network/reqresp/handlers/status.js +4 -3
  134. package/lib/network/reqresp/handlers/status.js.map +1 -1
  135. package/lib/network/reqresp/protocols.d.ts +1 -0
  136. package/lib/network/reqresp/protocols.js +5 -0
  137. package/lib/network/reqresp/protocols.js.map +1 -1
  138. package/lib/network/reqresp/types.d.ts +3 -3
  139. package/lib/network/reqresp/types.js +3 -3
  140. package/lib/network/reqresp/types.js.map +1 -1
  141. package/lib/network/statusCache.d.ts +5 -5
  142. package/lib/network/statusCache.js.map +1 -1
  143. package/lib/network/subnets/attnetsService.d.ts +3 -3
  144. package/lib/network/subnets/attnetsService.js +17 -17
  145. package/lib/network/subnets/attnetsService.js.map +1 -1
  146. package/lib/network/subnets/interface.d.ts +3 -3
  147. package/lib/network/subnets/syncnetsService.d.ts +3 -3
  148. package/lib/network/subnets/syncnetsService.js +13 -13
  149. package/lib/network/subnets/syncnetsService.js.map +1 -1
  150. package/lib/network/subscribeBoundary.d.ts +5 -0
  151. package/lib/network/subscribeBoundary.js +4 -0
  152. package/lib/network/subscribeBoundary.js.map +1 -0
  153. package/lib/sync/constants.d.ts +1 -1
  154. package/lib/sync/constants.js +4 -1
  155. package/lib/sync/constants.js.map +1 -1
  156. package/lib/sync/range/batch.d.ts +9 -1
  157. package/lib/sync/range/batch.js +23 -4
  158. package/lib/sync/range/batch.js.map +1 -1
  159. package/lib/sync/range/chain.d.ts +13 -3
  160. package/lib/sync/range/chain.js +79 -23
  161. package/lib/sync/range/chain.js.map +1 -1
  162. package/lib/sync/range/range.d.ts +3 -2
  163. package/lib/sync/range/range.js +10 -4
  164. package/lib/sync/range/range.js.map +1 -1
  165. package/lib/sync/range/utils/chainTarget.d.ts +5 -1
  166. package/lib/sync/range/utils/chainTarget.js +26 -1
  167. package/lib/sync/range/utils/chainTarget.js.map +1 -1
  168. package/lib/sync/range/utils/peerBalancer.d.ts +12 -8
  169. package/lib/sync/range/utils/peerBalancer.js +62 -21
  170. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  171. package/lib/sync/unknownBlock.js +12 -14
  172. package/lib/sync/unknownBlock.js.map +1 -1
  173. package/lib/sync/utils/remoteSyncType.d.ts +4 -4
  174. package/lib/sync/utils/remoteSyncType.js.map +1 -1
  175. package/lib/util/blobs.d.ts +5 -0
  176. package/lib/util/blobs.js +60 -0
  177. package/lib/util/blobs.js.map +1 -1
  178. package/lib/util/dataColumns.d.ts +12 -5
  179. package/lib/util/dataColumns.js +72 -7
  180. package/lib/util/dataColumns.js.map +1 -1
  181. package/package.json +14 -14
@@ -43,12 +43,13 @@ export var BlobsResultType;
43
43
  BlobsResultType[BlobsResultType["blinded"] = 2] = "blinded";
44
44
  })(BlobsResultType || (BlobsResultType = {}));
45
45
  export async function produceBlockBody(blockType, currentState, blockAttr) {
46
- const { slot: blockSlot, feeRecipient: requestedFeeRecipient, parentBlockRoot, proposerIndex, proposerPubKey, commonBlockBody, } = blockAttr;
46
+ const { slot: blockSlot, feeRecipient: requestedFeeRecipient, parentBlockRoot, proposerIndex, proposerPubKey, commonBlockBodyPromise, } = blockAttr;
47
47
  // Type-safe for blobs variable. Translate 'null' value into 'preDeneb' enum
48
48
  // TODO: Not ideal, but better than just using null.
49
49
  // TODO: Does not guarantee that preDeneb enum goes with a preDeneb block
50
50
  let blobsResult;
51
51
  let executionPayloadValue;
52
+ let blockBody;
52
53
  // even though shouldOverrideBuilder is relevant for the engine response, for simplicity of typing
53
54
  // we just return it undefined for the builder which anyway doesn't get consumed downstream
54
55
  let shouldOverrideBuilder;
@@ -59,27 +60,6 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
59
60
  slot: blockSlot,
60
61
  };
61
62
  this.logger.verbose("Producing beacon block body", logMeta);
62
- const stepsMetrics = blockType === BlockType.Full
63
- ? this.metrics?.executionBlockProductionTimeSteps
64
- : this.metrics?.builderBlockProductionTimeSteps;
65
- const blockBody = commonBlockBody
66
- ? Object.assign({}, commonBlockBody)
67
- : await produceCommonBlockBody.call(this, blockType, currentState, blockAttr);
68
- const { graffiti, attestations, deposits, voluntaryExits, attesterSlashings, proposerSlashings, syncAggregate, blsToExecutionChanges, } = blockBody;
69
- Object.assign(logMeta, {
70
- graffiti: fromGraffitiBytes(graffiti),
71
- attestations: attestations.length,
72
- deposits: deposits.length,
73
- voluntaryExits: voluntaryExits.length,
74
- attesterSlashings: attesterSlashings.length,
75
- proposerSlashings: proposerSlashings.length,
76
- });
77
- if (isForkPostAltair(fork)) {
78
- Object.assign(logMeta, {
79
- syncAggregateParticipants: syncAggregate.syncCommitteeBits.getTrueBitIndexes().length,
80
- });
81
- }
82
- const endExecutionPayload = stepsMetrics?.startTimer();
83
63
  if (isForkPostBellatrix(fork)) {
84
64
  const safeBlockHash = this.forkChoice.getJustifiedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
85
65
  const finalizedBlockHash = this.forkChoice.getFinalizedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
@@ -93,16 +73,33 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
93
73
  if (blockType === BlockType.Blinded) {
94
74
  if (!this.executionBuilder)
95
75
  throw Error("Execution Builder not available");
96
- // This path will not be used in the production, but is here just for merge mock
97
- // tests because merge-mock requires an fcU to be issued prior to fetch payload
98
- // header.
99
- if (this.executionBuilder.issueLocalFcUWithFeeRecipient !== undefined) {
100
- await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, this.executionBuilder.issueLocalFcUWithFeeRecipient);
101
- }
102
- // For MeV boost integration, this is where the execution header will be
103
- // fetched from the payload id and a blinded block will be produced instead of
104
- // fullblock for the validator to sign
105
- const builderRes = await prepareExecutionPayloadHeader(this, fork, currentState, proposerPubKey);
76
+ const executionBuilder = this.executionBuilder;
77
+ const builderPromise = (async () => {
78
+ const endExecutionPayloadHeader = this.metrics?.builderBlockProductionTimeSteps.startTimer();
79
+ // This path will not be used in the production, but is here just for merge mock
80
+ // tests because merge-mock requires an fcU to be issued prior to fetch payload
81
+ // header.
82
+ if (executionBuilder.issueLocalFcUWithFeeRecipient !== undefined) {
83
+ await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, executionBuilder.issueLocalFcUWithFeeRecipient);
84
+ }
85
+ // For MeV boost integration, this is where the execution header will be
86
+ // fetched from the payload id and a blinded block will be produced instead of
87
+ // fullblock for the validator to sign
88
+ this.logger.verbose("Fetching execution payload header from builder", {
89
+ slot: blockSlot,
90
+ proposerPubKey: toHex(proposerPubKey),
91
+ });
92
+ const headerRes = prepareExecutionPayloadHeader(this, fork, currentState, proposerPubKey);
93
+ endExecutionPayloadHeader?.({
94
+ step: BlockProductionStep.executionPayload,
95
+ });
96
+ return headerRes;
97
+ })();
98
+ const [builderRes, commonBlockBody] = await Promise.all([
99
+ builderPromise,
100
+ commonBlockBodyPromise ?? produceCommonBlockBody.call(this, blockType, currentState, blockAttr),
101
+ ]);
102
+ blockBody = Object.assign({}, commonBlockBody);
106
103
  blockBody.executionPayloadHeader = builderRes.header;
107
104
  executionPayloadValue = builderRes.executionPayloadValue;
108
105
  const fetchedTime = Date.now() / 1000 - computeTimeAtSlot(this.config, blockSlot, this.genesisTime);
@@ -114,7 +111,7 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
114
111
  prepType,
115
112
  fetchedTime,
116
113
  });
117
- const targetGasLimit = this.executionBuilder.getValidatorRegistration(proposerPubKey)?.gasLimit;
114
+ const targetGasLimit = executionBuilder.getValidatorRegistration(proposerPubKey)?.gasLimit;
118
115
  if (!targetGasLimit) {
119
116
  // This should only happen if cache was cleared due to restart of beacon node
120
117
  this.logger.warn("Failed to get validator registration, could not check header gas limit", {
@@ -164,114 +161,146 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
164
161
  }
165
162
  // blockType === BlockType.Full
166
163
  else {
167
- // try catch payload fetch here, because there is still a recovery path possible if we
168
- // are pre-merge. We don't care the same for builder segment as the execution block
169
- // will takeover if the builder flow was activated and errors
170
- try {
171
- // https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#constructing-the-beaconblockbody
164
+ const enginePromise = (async () => {
165
+ const endExecutionPayload = this.metrics?.executionBlockProductionTimeSteps.startTimer();
166
+ this.logger.verbose("Preparing execution payload from engine", {
167
+ slot: blockSlot,
168
+ parentBlockRoot: toRootHex(parentBlockRoot),
169
+ feeRecipient,
170
+ });
171
+ // https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/validator.md#constructing-the-beaconblockbody
172
172
  const prepareRes = await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, feeRecipient);
173
173
  if (prepareRes.isPremerge) {
174
- blockBody.executionPayload =
175
- sszTypesFor(fork).ExecutionPayload.defaultValue();
176
- blobsResult = { type: BlobsResultType.preDeneb };
177
- executionPayloadValue = BigInt(0);
174
+ return {
175
+ ...prepareRes,
176
+ executionPayload: sszTypesFor(fork).ExecutionPayload.defaultValue(),
177
+ executionPayloadValue: BigInt(0),
178
+ };
178
179
  }
179
- else {
180
- const { prepType, payloadId } = prepareRes;
181
- Object.assign(logMeta, { executionPayloadPrepType: prepType });
182
- if (prepType !== PayloadPreparationType.Cached) {
183
- // Wait for 500ms to allow EL to add some txs to the payload
184
- // the pitfalls of this have been put forward here, but 500ms delay for block proposal
185
- // seems marginal even with unhealthy network
186
- //
187
- // See: https://discord.com/channels/595666850260713488/892088344438255616/1009882079632314469
188
- await sleep(PAYLOAD_GENERATION_TIME_MS);
189
- }
190
- const engineRes = await this.executionEngine.getPayload(fork, payloadId);
191
- const { executionPayload, blobsBundle, executionRequests } = engineRes;
192
- shouldOverrideBuilder = engineRes.shouldOverrideBuilder;
193
- blockBody.executionPayload = executionPayload;
194
- executionPayloadValue = engineRes.executionPayloadValue;
195
- Object.assign(logMeta, { transactions: executionPayload.transactions.length, shouldOverrideBuilder });
196
- const fetchedTime = Date.now() / 1000 - computeTimeAtSlot(this.config, blockSlot, this.genesisTime);
197
- this.metrics?.blockPayload.payloadFetchedTime.observe({ prepType }, fetchedTime);
198
- this.logger.verbose("Fetched execution payload from engine", {
199
- slot: blockSlot,
200
- executionPayloadValue,
201
- prepType,
202
- payloadId,
203
- fetchedTime,
204
- executionHeadBlockHash: toRootHex(engineRes.executionPayload.blockHash),
205
- });
206
- if (executionPayload.transactions.length === 0) {
207
- this.metrics?.blockPayload.emptyPayloads.inc({ prepType });
208
- }
209
- if (ForkSeq[fork] >= ForkSeq.deneb) {
210
- if (blobsBundle === undefined) {
211
- throw Error(`Missing blobsBundle response from getPayload at fork=${fork}`);
212
- }
213
- let cells;
214
- if (ForkSeq[fork] >= ForkSeq.fulu) {
215
- cells = blobsBundle.blobs.map((blob) => kzg.computeCells(blob));
216
- }
217
- if (this.opts.sanityCheckExecutionEngineBlobs) {
218
- await validateBlobsAndKzgCommitments(fork, executionPayload, blobsBundle, cells);
219
- }
220
- blockBody.blobKzgCommitments = blobsBundle.commitments;
221
- const blockHash = toRootHex(executionPayload.blockHash);
222
- const contents = {
223
- kzgProofs: blobsBundle.proofs,
224
- blobs: blobsBundle.blobs,
225
- cells,
226
- };
227
- blobsResult = { type: BlobsResultType.produced, contents, blockHash };
228
- Object.assign(logMeta, { blobs: blobsBundle.commitments.length });
229
- }
230
- else {
231
- blobsResult = { type: BlobsResultType.preDeneb };
232
- }
233
- if (ForkSeq[fork] >= ForkSeq.electra) {
234
- if (executionRequests === undefined) {
235
- throw Error(`Missing executionRequests response from getPayload at fork=${fork}`);
236
- }
237
- blockBody.executionRequests = executionRequests;
238
- }
180
+ const { prepType, payloadId } = prepareRes;
181
+ Object.assign(logMeta, { executionPayloadPrepType: prepType });
182
+ if (prepType !== PayloadPreparationType.Cached) {
183
+ // Wait for 500ms to allow EL to add some txs to the payload
184
+ // the pitfalls of this have been put forward here, but 500ms delay for block proposal
185
+ // seems marginal even with unhealthy network
186
+ //
187
+ // See: https://discord.com/channels/595666850260713488/892088344438255616/1009882079632314469
188
+ await sleep(PAYLOAD_GENERATION_TIME_MS);
239
189
  }
240
- }
241
- catch (e) {
190
+ this.logger.verbose("Fetching execution payload from engine", { slot: blockSlot, payloadId });
191
+ const payloadRes = await this.executionEngine.getPayload(fork, payloadId);
192
+ endExecutionPayload?.({
193
+ step: BlockProductionStep.executionPayload,
194
+ });
195
+ return { ...prepareRes, ...payloadRes };
196
+ })().catch((e) => {
197
+ // catch payload fetch here, because there is still a recovery path possible if we
198
+ // are pre-merge. We don't care the same for builder segment as the execution block
199
+ // will takeover if the builder flow was activated and errors
242
200
  this.metrics?.blockPayload.payloadFetchErrors.inc();
243
- // ok we don't have an execution payload here, so we can assign an empty one
244
- // if pre-merge
245
201
  if (!isMergeTransitionComplete(currentState)) {
246
202
  this.logger?.warn("Fetch payload from the execution failed, however since we are still pre-merge proceeding with an empty one.", {}, e);
247
- blockBody.executionPayload =
248
- sszTypesFor(fork).ExecutionPayload.defaultValue();
249
- blobsResult = { type: BlobsResultType.preDeneb };
250
- executionPayloadValue = BigInt(0);
203
+ // ok we don't have an execution payload here, so we can assign an empty one
204
+ // if pre-merge
205
+ return {
206
+ isPremerge: true,
207
+ executionPayload: sszTypesFor(fork).ExecutionPayload.defaultValue(),
208
+ executionPayloadValue: BigInt(0),
209
+ };
210
+ }
211
+ // since merge transition is complete, we need a valid payload even if with an
212
+ // empty (transactions) one. defaultValue isn't gonna cut it!
213
+ throw e;
214
+ });
215
+ const [engineRes, commonBlockBody] = await Promise.all([
216
+ enginePromise,
217
+ commonBlockBodyPromise ?? produceCommonBlockBody.call(this, blockType, currentState, blockAttr),
218
+ ]);
219
+ blockBody = Object.assign({}, commonBlockBody);
220
+ if (engineRes.isPremerge) {
221
+ blockBody.executionPayload = engineRes.executionPayload;
222
+ blobsResult = { type: BlobsResultType.preDeneb };
223
+ executionPayloadValue = engineRes.executionPayloadValue;
224
+ }
225
+ else {
226
+ const { prepType, payloadId, executionPayload, blobsBundle, executionRequests } = engineRes;
227
+ shouldOverrideBuilder = engineRes.shouldOverrideBuilder;
228
+ blockBody.executionPayload = executionPayload;
229
+ executionPayloadValue = engineRes.executionPayloadValue;
230
+ Object.assign(logMeta, { transactions: executionPayload.transactions.length, shouldOverrideBuilder });
231
+ const fetchedTime = Date.now() / 1000 - computeTimeAtSlot(this.config, blockSlot, this.genesisTime);
232
+ this.metrics?.blockPayload.payloadFetchedTime.observe({ prepType }, fetchedTime);
233
+ this.logger.verbose("Fetched execution payload from engine", {
234
+ slot: blockSlot,
235
+ executionPayloadValue,
236
+ prepType,
237
+ payloadId,
238
+ fetchedTime,
239
+ executionHeadBlockHash: toRootHex(engineRes.executionPayload.blockHash),
240
+ });
241
+ if (executionPayload.transactions.length === 0) {
242
+ this.metrics?.blockPayload.emptyPayloads.inc({ prepType });
243
+ }
244
+ if (ForkSeq[fork] >= ForkSeq.deneb) {
245
+ if (blobsBundle === undefined) {
246
+ throw Error(`Missing blobsBundle response from getPayload at fork=${fork}`);
247
+ }
248
+ let cells;
249
+ if (ForkSeq[fork] >= ForkSeq.fulu) {
250
+ cells = blobsBundle.blobs.map((blob) => kzg.computeCells(blob));
251
+ }
252
+ if (this.opts.sanityCheckExecutionEngineBlobs) {
253
+ await validateBlobsAndKzgCommitments(fork, executionPayload, blobsBundle, cells);
254
+ }
255
+ blockBody.blobKzgCommitments = blobsBundle.commitments;
256
+ const blockHash = toRootHex(executionPayload.blockHash);
257
+ const contents = { kzgProofs: blobsBundle.proofs, blobs: blobsBundle.blobs, cells };
258
+ blobsResult = { type: BlobsResultType.produced, contents, blockHash };
259
+ Object.assign(logMeta, { blobs: blobsBundle.commitments.length });
251
260
  }
252
261
  else {
253
- // since merge transition is complete, we need a valid payload even if with an
254
- // empty (transactions) one. defaultValue isn't gonna cut it!
255
- throw e;
262
+ blobsResult = { type: BlobsResultType.preDeneb };
263
+ }
264
+ if (ForkSeq[fork] >= ForkSeq.electra) {
265
+ if (executionRequests === undefined) {
266
+ throw Error(`Missing executionRequests response from getPayload at fork=${fork}`);
267
+ }
268
+ blockBody.executionRequests = executionRequests;
256
269
  }
257
270
  }
258
271
  }
259
272
  }
260
273
  else {
274
+ const commonBlockBody = await (commonBlockBodyPromise ??
275
+ produceCommonBlockBody.call(this, blockType, currentState, blockAttr));
276
+ blockBody = Object.assign({}, commonBlockBody);
261
277
  blobsResult = { type: BlobsResultType.preDeneb };
262
278
  executionPayloadValue = BigInt(0);
263
279
  }
264
- endExecutionPayload?.({
265
- step: BlockProductionStep.executionPayload,
280
+ const { graffiti, attestations, deposits, voluntaryExits, attesterSlashings, proposerSlashings } = blockBody;
281
+ Object.assign(logMeta, {
282
+ graffiti: fromGraffitiBytes(graffiti),
283
+ attestations: attestations.length,
284
+ deposits: deposits.length,
285
+ voluntaryExits: voluntaryExits.length,
286
+ attesterSlashings: attesterSlashings.length,
287
+ proposerSlashings: proposerSlashings.length,
266
288
  });
289
+ if (isForkPostAltair(fork)) {
290
+ const { syncAggregate } = blockBody;
291
+ Object.assign(logMeta, {
292
+ syncAggregateParticipants: syncAggregate.syncCommitteeBits.getTrueBitIndexes().length,
293
+ });
294
+ }
267
295
  if (ForkSeq[fork] >= ForkSeq.capella) {
296
+ const { blsToExecutionChanges, executionPayload } = blockBody;
268
297
  Object.assign(logMeta, {
269
298
  blsToExecutionChanges: blsToExecutionChanges.length,
270
299
  });
271
300
  // withdrawals are only available in full body
272
301
  if (blockType === BlockType.Full) {
273
302
  Object.assign(logMeta, {
274
- withdrawals: blockBody.executionPayload.withdrawals.length,
303
+ withdrawals: executionPayload.withdrawals.length,
275
304
  });
276
305
  }
277
306
  }
@@ -1 +1 @@
1
- {"version":3,"file":"produceBlockBody.js","sourceRoot":"","sources":["../../../src/chain/produceBlock/produceBlockBody.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"produceBlockBody.js","sourceRoot":"","sources":["../../../src/chain/produceBlock/produceBlockBody.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,13 @@ import { RootHex, SignedBeaconBlock, deneb, fulu } from "@lodestar/types";
4
4
  import { Logger } from "@lodestar/utils";
5
5
  import { IExecutionEngine } from "../../execution/index.js";
6
6
  import { Metrics } from "../../metrics/index.js";
7
+ import { IClock } from "../../util/clock.js";
7
8
  import { CustodyConfig } from "../../util/dataColumns.js";
8
9
  import { BlockInput, CachedData, GossipedInputType, NullBlockInput } from "../blocks/types.js";
9
10
  import { ChainEventEmitter } from "../emitter.js";
10
11
  export declare enum BlockInputAvailabilitySource {
11
12
  GOSSIP = "gossip",
13
+ RECOVERED = "recovered",
12
14
  UNKNOWN_SYNC = "unknown_sync"
13
15
  }
14
16
  type GossipedBlockInput = {
@@ -72,9 +74,10 @@ export declare class SeenGossipBlockInput {
72
74
  private readonly blockInputCache;
73
75
  private readonly custodyConfig;
74
76
  private readonly executionEngine;
77
+ private readonly clock;
75
78
  private readonly emitter;
76
79
  private readonly logger;
77
- constructor(custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, logger: Logger);
80
+ constructor(custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, clock: IClock, logger: Logger);
78
81
  globalCacheId: number;
79
82
  prune(): void;
80
83
  hasBlock(blockRoot: RootHex): boolean;
@@ -2,16 +2,20 @@ import { toHexString } from "@chainsafe/ssz";
2
2
  import { ForkName, NUMBER_OF_COLUMNS, isForkPostDeneb } from "@lodestar/params";
3
3
  import { ssz } from "@lodestar/types";
4
4
  import { pruneSetToMax } from "@lodestar/utils";
5
- import { getDataColumnsFromExecution, hasSampledDataColumns } from "../../util/dataColumns.js";
5
+ import { RecoverResult, getDataColumnsFromExecution, hasSampledDataColumns, recoverDataColumnSidecars, } from "../../util/dataColumns.js";
6
6
  import { callInNextEventLoop } from "../../util/eventLoop.js";
7
7
  import { BlobsSource, BlockSource, DataColumnsSource, GossipedInputType, getBlockInput, getBlockInputBlobs, getBlockInputDataColumns, } from "../blocks/types.js";
8
+ import { ChainEvent } from "../emitter.js";
8
9
  import { DataColumnSidecarErrorCode, DataColumnSidecarGossipError } from "../errors/dataColumnSidecarError.js";
9
10
  import { GossipAction } from "../errors/gossipValidation.js";
10
11
  export var BlockInputAvailabilitySource;
11
12
  (function (BlockInputAvailabilitySource) {
12
13
  BlockInputAvailabilitySource["GOSSIP"] = "gossip";
14
+ BlockInputAvailabilitySource["RECOVERED"] = "recovered";
13
15
  BlockInputAvailabilitySource["UNKNOWN_SYNC"] = "unknown_sync";
14
16
  })(BlockInputAvailabilitySource || (BlockInputAvailabilitySource = {}));
17
+ // TODO(fulu): dedup with gossipHandlers.ts
18
+ const BLOCK_AVAILABILITY_CUTOFF_MS = 3_000;
15
19
  const MAX_GOSSIPINPUT_CACHE = 5;
16
20
  /**
17
21
  * For predeneb, SeenGossipBlockInput only tracks and caches block so that we don't need to download known block
@@ -25,11 +29,12 @@ const MAX_GOSSIPINPUT_CACHE = 5;
25
29
  * block are seen by SeenGossipBlockInput
26
30
  */
27
31
  export class SeenGossipBlockInput {
28
- constructor(custodyConfig, executionEngine, emitter, logger) {
32
+ constructor(custodyConfig, executionEngine, emitter, clock, logger) {
29
33
  this.blockInputCache = new Map();
30
34
  this.globalCacheId = 0;
31
35
  this.custodyConfig = custodyConfig;
32
36
  this.executionEngine = executionEngine;
37
+ this.clock = clock;
33
38
  this.emitter = emitter;
34
39
  this.logger = logger;
35
40
  }
@@ -80,8 +85,8 @@ export class SeenGossipBlockInput {
80
85
  fork = config.getForkName(blobSidecar.signedBlockHeader.message.slot);
81
86
  blockHex = toHexString(blockRoot);
82
87
  blockCache = this.blockInputCache.get(blockHex) ?? getEmptyBlockInputCacheEntry(fork, ++this.globalCacheId);
83
- if (blockCache.cachedData?.fork !== ForkName.deneb) {
84
- throw Error(`blob data at non deneb fork=${blockCache.fork}`);
88
+ if (blockCache.cachedData?.fork !== ForkName.deneb && blockCache.cachedData?.fork !== ForkName.electra) {
89
+ throw Error(`blob data at non deneb/electra fork=${blockCache.fork}`);
85
90
  }
86
91
  // TODO: freetheblobs check if its the same blob or a duplicate and throw/take actions
87
92
  blockCache.cachedData?.blobsCache.set(blobSidecar.index, blobSidecar);
@@ -173,7 +178,7 @@ export class SeenGossipBlockInput {
173
178
  };
174
179
  }
175
180
  if (cachedData.fork === ForkName.fulu) {
176
- const { dataColumnsCache, resolveAvailability } = cachedData;
181
+ const { dataColumnsCache, resolveAvailability, calledRecover } = cachedData;
177
182
  // block is available, check if all blobs have shown up
178
183
  const { slot } = signedBlock.message;
179
184
  const blockInfo = `blockHex=${blockHex}, slot=${slot}`;
@@ -198,19 +203,79 @@ export class SeenGossipBlockInput {
198
203
  blockInputMeta: { pending: null, haveColumns: 0, expectedColumns: 0 },
199
204
  };
200
205
  }
201
- if (hasSampledDataColumns(this.custodyConfig, dataColumnsCache)) {
206
+ const resolveAvailabilityAndBlockInput = (source) => {
202
207
  const allDataColumns = getBlockInputDataColumns(dataColumnsCache, this.custodyConfig.sampledColumns);
203
- metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({ source: BlockInputAvailabilitySource.GOSSIP });
204
- const { dataColumns } = allDataColumns;
205
208
  const blockData = {
206
209
  fork: cachedData.fork,
207
210
  ...allDataColumns,
208
211
  dataColumnsSource: DataColumnsSource.gossip,
209
212
  };
210
213
  resolveAvailability(blockData);
211
- metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({ source: BlockInputAvailabilitySource.GOSSIP });
214
+ // TODO(das): should not use syncUnknownBlock metrics here
215
+ metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({ source });
212
216
  const blockInput = getBlockInput.availableData(config, signedBlock, BlockSource.gossip, blockData);
213
217
  resolveBlockInput(blockInput);
218
+ return blockInput;
219
+ };
220
+ const columnCount = dataColumnsCache.size;
221
+ if (
222
+ // only try to recover all columns with "--supernode"
223
+ this.custodyConfig.sampledColumns.length === NUMBER_OF_COLUMNS &&
224
+ columnCount >= NUMBER_OF_COLUMNS / 2 &&
225
+ columnCount < NUMBER_OF_COLUMNS &&
226
+ !calledRecover &&
227
+ // doing recover right away is not efficient because it may delay data_column_sidecar validation
228
+ this.clock.secFromSlot(slot) * 1000 >= BLOCK_AVAILABILITY_CUTOFF_MS) {
229
+ // should call once per slot
230
+ cachedData.calledRecover = true;
231
+ callInNextEventLoop(async () => {
232
+ const logCtx = {
233
+ blockHex,
234
+ slot,
235
+ dataColumns: dataColumnsCache.size,
236
+ };
237
+ const recoverResult = await recoverDataColumnSidecars(dataColumnsCache, this.clock, metrics).catch((e) => {
238
+ this.logger.error("Error recovering data column sidecars", logCtx, e);
239
+ return RecoverResult.Failed;
240
+ });
241
+ metrics?.recoverDataColumnSidecars.result.inc({ result: recoverResult });
242
+ switch (recoverResult) {
243
+ case RecoverResult.SuccessResolved: {
244
+ resolveAvailabilityAndBlockInput(BlockInputAvailabilitySource.RECOVERED);
245
+ // Publish columns if and only if subscribed to them
246
+ const sampledColumns = this.custodyConfig.sampledColumns.map((columnIndex) => {
247
+ const dataColumn = dataColumnsCache.get(columnIndex)?.dataColumn;
248
+ if (!dataColumn) {
249
+ throw Error(`After recover, missing data column for index=${columnIndex} in cache`);
250
+ }
251
+ return dataColumn;
252
+ });
253
+ // for columns that we already seen, it will be ignored through `ignoreDuplicatePublishError` gossip option
254
+ this.emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
255
+ this.logger.verbose("Recovered data column sidecars and resolved availability", logCtx);
256
+ break;
257
+ }
258
+ case RecoverResult.SuccessLate:
259
+ this.logger.verbose("Recovered data column sidecars but it's late to resolve availability", logCtx);
260
+ break;
261
+ case RecoverResult.Failed:
262
+ this.logger.verbose("Failed to recover data column sidecars", logCtx);
263
+ break;
264
+ case RecoverResult.NotAttemptedFull:
265
+ this.logger.verbose("Did not attempt because we have full column sidecars", logCtx);
266
+ break;
267
+ case RecoverResult.NotAttemptedLessThanHalf:
268
+ this.logger.verbose("Did not attempt because we have too few column sidecars", logCtx);
269
+ break;
270
+ default:
271
+ break;
272
+ }
273
+ });
274
+ }
275
+ if (hasSampledDataColumns(this.custodyConfig, dataColumnsCache)) {
276
+ const blockInput = resolveAvailabilityAndBlockInput(BlockInputAvailabilitySource.GOSSIP);
277
+ const allDataColumns = getBlockInputDataColumns(dataColumnsCache, this.custodyConfig.sampledColumns);
278
+ const { dataColumns } = allDataColumns;
214
279
  return {
215
280
  blockInput,
216
281
  blockInputMeta: {
@@ -330,6 +395,7 @@ export function getEmptyBlockInputCacheEntry(fork, globalCacheId) {
330
395
  availabilityPromise,
331
396
  resolveAvailability,
332
397
  cacheId: ++globalCacheId,
398
+ calledRecover: false,
333
399
  };
334
400
  return { fork, blockInputPromise, resolveBlockInput, cachedData };
335
401
  }