@lodestar/beacon-node 1.43.0-dev.ade910fc78 → 1.43.0-dev.b741495bdc

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 (201) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +1 -4
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  5. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts.map +1 -1
  8. package/lib/api/impl/validator/index.js +1 -4
  9. package/lib/api/impl/validator/index.js.map +1 -1
  10. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  11. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  12. package/lib/chain/GetBlobsTracker.js +1 -2
  13. package/lib/chain/GetBlobsTracker.js.map +1 -1
  14. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  15. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  16. package/lib/chain/archiveStore/interface.d.ts +4 -4
  17. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  19. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  20. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
  21. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  22. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  23. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  24. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  25. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  26. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  27. package/lib/chain/blocks/importBlock.js +23 -31
  28. package/lib/chain/blocks/importBlock.js.map +1 -1
  29. package/lib/chain/blocks/importExecutionPayload.d.ts +15 -14
  30. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  31. package/lib/chain/blocks/importExecutionPayload.js +63 -85
  32. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  33. package/lib/chain/blocks/index.d.ts.map +1 -1
  34. package/lib/chain/blocks/index.js +1 -2
  35. package/lib/chain/blocks/index.js.map +1 -1
  36. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +3 -0
  37. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  38. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +20 -0
  39. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  40. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  41. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.js +6 -4
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  44. package/lib/chain/blocks/types.d.ts +15 -21
  45. package/lib/chain/blocks/types.d.ts.map +1 -1
  46. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  47. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  48. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +76 -0
  49. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  50. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  51. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  52. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +25 -0
  53. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  54. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  55. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +1 -1
  56. package/lib/chain/chain.d.ts +3 -3
  57. package/lib/chain/chain.d.ts.map +1 -1
  58. package/lib/chain/chain.js +16 -32
  59. package/lib/chain/chain.js.map +1 -1
  60. package/lib/chain/emitter.d.ts +16 -4
  61. package/lib/chain/emitter.d.ts.map +1 -1
  62. package/lib/chain/emitter.js +5 -0
  63. package/lib/chain/emitter.js.map +1 -1
  64. package/lib/chain/errors/attestationError.d.ts +8 -1
  65. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  66. package/lib/chain/errors/attestationError.js +4 -0
  67. package/lib/chain/errors/attestationError.js.map +1 -1
  68. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  69. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  70. package/lib/chain/errors/executionPayloadBid.js +1 -0
  71. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  72. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  73. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  74. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  75. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  76. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  77. package/lib/chain/forkChoice/index.js +11 -15
  78. package/lib/chain/forkChoice/index.js.map +1 -1
  79. package/lib/chain/interface.d.ts +2 -2
  80. package/lib/chain/interface.d.ts.map +1 -1
  81. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  82. package/lib/chain/prepareNextSlot.js +22 -16
  83. package/lib/chain/prepareNextSlot.js.map +1 -1
  84. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
  85. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  86. package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
  87. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  88. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -8
  89. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  90. package/lib/chain/produceBlock/produceBlockBody.js +30 -19
  91. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  92. package/lib/chain/regen/errors.d.ts +1 -11
  93. package/lib/chain/regen/errors.d.ts.map +1 -1
  94. package/lib/chain/regen/errors.js +0 -2
  95. package/lib/chain/regen/errors.js.map +1 -1
  96. package/lib/chain/regen/interface.d.ts +6 -11
  97. package/lib/chain/regen/interface.d.ts.map +1 -1
  98. package/lib/chain/regen/queued.d.ts +6 -10
  99. package/lib/chain/regen/queued.d.ts.map +1 -1
  100. package/lib/chain/regen/queued.js +3 -10
  101. package/lib/chain/regen/queued.js.map +1 -1
  102. package/lib/chain/regen/regen.d.ts +0 -5
  103. package/lib/chain/regen/regen.d.ts.map +1 -1
  104. package/lib/chain/regen/regen.js +0 -8
  105. package/lib/chain/regen/regen.js.map +1 -1
  106. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -7
  107. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  108. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -9
  109. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  110. package/lib/chain/stateCache/types.d.ts +0 -6
  111. package/lib/chain/stateCache/types.d.ts.map +1 -1
  112. package/lib/chain/stateCache/types.js.map +1 -1
  113. package/lib/chain/validation/aggregateAndProof.js +12 -0
  114. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  115. package/lib/chain/validation/attestation.d.ts.map +1 -1
  116. package/lib/chain/validation/attestation.js +12 -0
  117. package/lib/chain/validation/attestation.js.map +1 -1
  118. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  119. package/lib/chain/validation/executionPayloadBid.js +13 -1
  120. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  121. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  122. package/lib/chain/validation/executionPayloadEnvelope.js +21 -11
  123. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  124. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  125. package/lib/chain/validation/payloadAttestationMessage.js +4 -3
  126. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  127. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  128. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  129. package/lib/execution/engine/http.d.ts.map +1 -1
  130. package/lib/execution/engine/http.js +21 -14
  131. package/lib/execution/engine/http.js.map +1 -1
  132. package/lib/execution/engine/interface.d.ts +1 -0
  133. package/lib/execution/engine/interface.d.ts.map +1 -1
  134. package/lib/execution/engine/mock.d.ts.map +1 -1
  135. package/lib/execution/engine/mock.js +6 -0
  136. package/lib/execution/engine/mock.js.map +1 -1
  137. package/lib/execution/engine/types.d.ts +20 -0
  138. package/lib/execution/engine/types.d.ts.map +1 -1
  139. package/lib/execution/engine/types.js +18 -0
  140. package/lib/execution/engine/types.js.map +1 -1
  141. package/lib/network/gossip/topic.d.ts +3 -2
  142. package/lib/network/gossip/topic.d.ts.map +1 -1
  143. package/lib/network/network.js +1 -1
  144. package/lib/network/network.js.map +1 -1
  145. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  146. package/lib/network/processor/gossipHandlers.js +22 -6
  147. package/lib/network/processor/gossipHandlers.js.map +1 -1
  148. package/lib/node/nodejs.d.ts.map +1 -1
  149. package/lib/node/nodejs.js +4 -2
  150. package/lib/node/nodejs.js.map +1 -1
  151. package/lib/util/sszBytes.d.ts.map +1 -1
  152. package/lib/util/sszBytes.js +16 -3
  153. package/lib/util/sszBytes.js.map +1 -1
  154. package/package.json +16 -16
  155. package/src/api/impl/beacon/blocks/index.ts +1 -4
  156. package/src/api/impl/beacon/state/utils.ts +2 -2
  157. package/src/api/impl/validator/index.ts +3 -6
  158. package/src/chain/GetBlobsTracker.ts +1 -2
  159. package/src/chain/archiveStore/archiveStore.ts +5 -5
  160. package/src/chain/archiveStore/interface.ts +4 -4
  161. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
  162. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  163. package/src/chain/blocks/importBlock.ts +22 -35
  164. package/src/chain/blocks/importExecutionPayload.ts +77 -103
  165. package/src/chain/blocks/index.ts +1 -2
  166. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +27 -0
  167. package/src/chain/blocks/payloadEnvelopeProcessor.ts +6 -5
  168. package/src/chain/blocks/types.ts +15 -26
  169. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +129 -0
  170. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +38 -0
  171. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +1 -1
  172. package/src/chain/chain.ts +23 -48
  173. package/src/chain/emitter.ts +15 -3
  174. package/src/chain/errors/attestationError.ts +6 -1
  175. package/src/chain/errors/executionPayloadBid.ts +6 -0
  176. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  177. package/src/chain/forkChoice/index.ts +8 -20
  178. package/src/chain/interface.ts +2 -2
  179. package/src/chain/prepareNextSlot.ts +25 -16
  180. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
  181. package/src/chain/produceBlock/produceBlockBody.ts +41 -20
  182. package/src/chain/regen/errors.ts +1 -6
  183. package/src/chain/regen/interface.ts +6 -11
  184. package/src/chain/regen/queued.ts +6 -14
  185. package/src/chain/regen/regen.ts +0 -8
  186. package/src/chain/stateCache/persistentCheckpointsCache.ts +5 -15
  187. package/src/chain/stateCache/types.ts +0 -3
  188. package/src/chain/validation/aggregateAndProof.ts +13 -0
  189. package/src/chain/validation/attestation.ts +13 -0
  190. package/src/chain/validation/executionPayloadBid.ts +14 -0
  191. package/src/chain/validation/executionPayloadEnvelope.ts +22 -12
  192. package/src/chain/validation/payloadAttestationMessage.ts +5 -3
  193. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  194. package/src/execution/engine/http.ts +21 -14
  195. package/src/execution/engine/interface.ts +1 -0
  196. package/src/execution/engine/mock.ts +8 -1
  197. package/src/execution/engine/types.ts +41 -0
  198. package/src/network/network.ts +1 -1
  199. package/src/network/processor/gossipHandlers.ts +26 -10
  200. package/src/node/nodejs.ts +4 -2
  201. package/src/util/sszBytes.ts +21 -3
@@ -87,6 +87,7 @@ export type PayloadAttributes = {
87
87
  suggestedFeeRecipient: string;
88
88
  withdrawals?: capella.Withdrawal[];
89
89
  parentBeaconBlockRoot?: Uint8Array;
90
+ slotNumber?: number; // EIP-7843
90
91
  };
91
92
 
92
93
  export type VersionedHashes = Uint8Array[];
@@ -11,7 +11,7 @@ import {
11
11
  SLOTS_PER_EPOCH,
12
12
  } from "@lodestar/params";
13
13
  import {computeTimeAtSlot} from "@lodestar/state-transition";
14
- import {ExecutionPayload, RootHex, bellatrix, deneb, ssz} from "@lodestar/types";
14
+ import {ExecutionPayload, RootHex, bellatrix, deneb, gloas, ssz} from "@lodestar/types";
15
15
  import {fromHex, toRootHex} from "@lodestar/utils";
16
16
  import {ZERO_HASH_HEX} from "../../constants/index.js";
17
17
  import {INTEROP_BLOCK_HASH} from "../../node/utils/interop/state.js";
@@ -132,14 +132,17 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
132
132
  engine_newPayloadV2: this.notifyNewPayload.bind(this),
133
133
  engine_newPayloadV3: this.notifyNewPayload.bind(this),
134
134
  engine_newPayloadV4: this.notifyNewPayload.bind(this),
135
+ engine_newPayloadV5: this.notifyNewPayload.bind(this),
135
136
  engine_forkchoiceUpdatedV1: this.notifyForkchoiceUpdate.bind(this),
136
137
  engine_forkchoiceUpdatedV2: this.notifyForkchoiceUpdate.bind(this),
137
138
  engine_forkchoiceUpdatedV3: this.notifyForkchoiceUpdate.bind(this),
139
+ engine_forkchoiceUpdatedV4: this.notifyForkchoiceUpdate.bind(this),
138
140
  engine_getPayloadV1: this.getPayloadV1.bind(this),
139
141
  engine_getPayloadV2: this.getPayloadV5.bind(this),
140
142
  engine_getPayloadV3: this.getPayloadV5.bind(this),
141
143
  engine_getPayloadV4: this.getPayloadV5.bind(this),
142
144
  engine_getPayloadV5: this.getPayloadV5.bind(this),
145
+ engine_getPayloadV6: this.getPayloadV5.bind(this),
143
146
  engine_getPayloadBodiesByHashV1: this.getPayloadBodiesByHash.bind(this),
144
147
  engine_getPayloadBodiesByRangeV1: this.getPayloadBodiesByRange.bind(this),
145
148
  engine_getClientVersionV1: this.getClientVersionV1.bind(this),
@@ -379,6 +382,10 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
379
382
  (executionPayload as ExecutionPayload<ForkPostCapella>).withdrawals = ssz.capella.Withdrawals.defaultValue();
380
383
  }
381
384
 
385
+ if (ForkSeq[fork] >= ForkSeq.gloas && payloadAttributes.slotNumber != null) {
386
+ (executionPayload as gloas.ExecutionPayload).slotNumber = payloadAttributes.slotNumber;
387
+ }
388
+
382
389
  this.preparingPayloads.set(payloadId, {
383
390
  executionPayload: serializeExecutionPayload(fork, executionPayload),
384
391
  blobsBundle: serializeBlobsBundle({
@@ -19,6 +19,7 @@ import {
19
19
  capella,
20
20
  deneb,
21
21
  electra,
22
+ gloas,
22
23
  ssz,
23
24
  } from "@lodestar/types";
24
25
  import {BlobAndProof} from "@lodestar/types/deneb";
@@ -50,6 +51,7 @@ export type EngineApiRpcParamTypes = {
50
51
  engine_newPayloadV2: [ExecutionPayloadRpc];
51
52
  engine_newPayloadV3: [ExecutionPayloadRpc, VersionedHashesRpc, DATA];
52
53
  engine_newPayloadV4: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
54
+ engine_newPayloadV5: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
53
55
  /**
54
56
  * 1. Object - Payload validity status with respect to the consensus rules:
55
57
  * - blockHash: DATA, 32 Bytes - block hash value of the payload
@@ -67,6 +69,10 @@ export type EngineApiRpcParamTypes = {
67
69
  forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
68
70
  payloadAttributes?: PayloadAttributesRpc,
69
71
  ];
72
+ engine_forkchoiceUpdatedV4: [
73
+ forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
74
+ payloadAttributes?: PayloadAttributesRpc,
75
+ ];
70
76
  /**
71
77
  * 1. payloadId: QUANTITY, 64 Bits - Identifier of the payload building process
72
78
  */
@@ -75,6 +81,7 @@ export type EngineApiRpcParamTypes = {
75
81
  engine_getPayloadV3: [QUANTITY];
76
82
  engine_getPayloadV4: [QUANTITY];
77
83
  engine_getPayloadV5: [QUANTITY];
84
+ engine_getPayloadV6: [QUANTITY];
78
85
 
79
86
  /**
80
87
  * 1. Array of DATA - Array of block_hash field values of the ExecutionPayload structure
@@ -111,6 +118,7 @@ export type EngineApiRpcReturnTypes = {
111
118
  engine_newPayloadV2: PayloadStatus;
112
119
  engine_newPayloadV3: PayloadStatus;
113
120
  engine_newPayloadV4: PayloadStatus;
121
+ engine_newPayloadV5: PayloadStatus;
114
122
  engine_forkchoiceUpdatedV1: {
115
123
  payloadStatus: PayloadStatus;
116
124
  payloadId: QUANTITY | null;
@@ -123,6 +131,10 @@ export type EngineApiRpcReturnTypes = {
123
131
  payloadStatus: PayloadStatus;
124
132
  payloadId: QUANTITY | null;
125
133
  };
134
+ engine_forkchoiceUpdatedV4: {
135
+ payloadStatus: PayloadStatus;
136
+ payloadId: QUANTITY | null;
137
+ };
126
138
  /**
127
139
  * payloadId | Error: QUANTITY, 64 Bits - Identifier of the payload building process
128
140
  */
@@ -131,6 +143,7 @@ export type EngineApiRpcReturnTypes = {
131
143
  engine_getPayloadV3: ExecutionPayloadResponse;
132
144
  engine_getPayloadV4: ExecutionPayloadResponse;
133
145
  engine_getPayloadV5: ExecutionPayloadResponse;
146
+ engine_getPayloadV6: ExecutionPayloadResponse;
134
147
 
135
148
  engine_getPayloadBodiesByHashV1: (ExecutionPayloadBodyRpc | null)[];
136
149
 
@@ -180,6 +193,8 @@ export type ExecutionPayloadRpc = {
180
193
  withdrawals?: WithdrawalRpc[]; // Capella hardfork
181
194
  blobGasUsed?: QUANTITY; // DENEB
182
195
  excessBlobGas?: QUANTITY; // DENEB
196
+ blockAccessList?: DATA; // GLOAS:EIP-7928
197
+ slotNumber?: QUANTITY; // GLOAS:EIP-7843
183
198
  };
184
199
 
185
200
  export type WithdrawalRpc = {
@@ -228,6 +243,8 @@ export type PayloadAttributesRpc = {
228
243
  withdrawals?: WithdrawalRpc[];
229
244
  /** DATA, 32 Bytes - value for the parentBeaconBlockRoot to be used for building block */
230
245
  parentBeaconBlockRoot?: DATA;
246
+ /** QUANTITY, 64 Bits - value for the slot number field of the new payload (EIP-7843) */
247
+ slotNumber?: QUANTITY;
231
248
  };
232
249
 
233
250
  export type ClientVersionRpc = {
@@ -280,6 +297,12 @@ export function serializeExecutionPayload(fork: ForkName, data: ExecutionPayload
280
297
 
281
298
  // No changes in Electra
282
299
 
300
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
301
+ const {blockAccessList, slotNumber} = data as gloas.ExecutionPayload;
302
+ payload.blockAccessList = bytesToData(blockAccessList);
303
+ payload.slotNumber = numToQuantity(slotNumber);
304
+ }
305
+
283
306
  return payload;
284
307
  }
285
308
 
@@ -375,6 +398,22 @@ export function parseExecutionPayload(
375
398
 
376
399
  // No changes in Electra
377
400
 
401
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
402
+ const {blockAccessList, slotNumber} = data;
403
+ if (blockAccessList == null) {
404
+ throw Error(
405
+ `blockAccessList missing for ${fork} >= gloas executionPayload number=${executionPayload.blockNumber} hash=${data.blockHash}`
406
+ );
407
+ }
408
+ if (slotNumber == null) {
409
+ throw Error(
410
+ `slotNumber missing for ${fork} >= gloas executionPayload number=${executionPayload.blockNumber} hash=${data.blockHash}`
411
+ );
412
+ }
413
+ (executionPayload as gloas.ExecutionPayload).blockAccessList = dataToBytes(blockAccessList, null);
414
+ (executionPayload as gloas.ExecutionPayload).slotNumber = quantityToNum(slotNumber);
415
+ }
416
+
378
417
  return {executionPayload, executionPayloadValue, blobsBundle, executionRequests, shouldOverrideBuilder};
379
418
  }
380
419
 
@@ -385,6 +424,7 @@ export function serializePayloadAttributes(data: PayloadAttributes): PayloadAttr
385
424
  suggestedFeeRecipient: data.suggestedFeeRecipient,
386
425
  withdrawals: data.withdrawals?.map(serializeWithdrawal),
387
426
  parentBeaconBlockRoot: data.parentBeaconBlockRoot ? bytesToData(data.parentBeaconBlockRoot) : undefined,
427
+ slotNumber: data.slotNumber !== undefined ? numToQuantity(data.slotNumber) : undefined,
388
428
  };
389
429
  }
390
430
 
@@ -401,6 +441,7 @@ export function deserializePayloadAttributes(data: PayloadAttributesRpc): Payloa
401
441
  suggestedFeeRecipient: data.suggestedFeeRecipient,
402
442
  withdrawals: data.withdrawals?.map((withdrawal) => deserializeWithdrawal(withdrawal)),
403
443
  parentBeaconBlockRoot: data.parentBeaconBlockRoot ? dataToBytes(data.parentBeaconBlockRoot, 32) : undefined,
444
+ slotNumber: data.slotNumber !== undefined ? quantityToNum(data.slotNumber) : undefined,
404
445
  };
405
446
  }
406
447
 
@@ -505,7 +505,7 @@ export class Network implements INetwork {
505
505
  }
506
506
 
507
507
  async publishSignedExecutionPayloadEnvelope(signedEnvelope: gloas.SignedExecutionPayloadEnvelope): Promise<number> {
508
- const epoch = computeEpochAtSlot(signedEnvelope.message.slot);
508
+ const epoch = computeEpochAtSlot(signedEnvelope.message.payload.slotNumber);
509
509
  const boundary = this.config.getForkBoundaryAtEpoch(epoch);
510
510
 
511
511
  return this.publishGossip<GossipType.execution_payload>(
@@ -745,13 +745,29 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
745
745
  });
746
746
  }
747
747
 
748
- chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
749
- chain.logger.debug(
750
- "Error processing execution payload from gossip data column",
751
- {slot: dataColumnSlot, root: payloadInput.blockRootHex},
752
- e as Error
753
- );
754
- });
748
+ // NOTE: we do NOT call chain.processExecutionPayload here. That is triggered only by
749
+ // envelope arrival (gossip or API). An in-flight importExecutionPayload is awaiting
750
+ // payloadInput.waitForAllData(); addColumn above will resolve it once hasAllData flips.
751
+
752
+ if (!payloadInput.isComplete()) {
753
+ const cutoffTimeMs = getCutoffTimeMs(chain, dataColumnSlot, BLOCK_AVAILABILITY_CUTOFF_MS);
754
+ // do not await here to not delay gossip validation
755
+ payloadInput.waitForEnvelopeAndAllData(cutoffTimeMs).catch((_e) => {
756
+ chain.logger.debug(
757
+ "Waited for envelope and data after receiving gossip column. Cut-off reached so emitting incompletePayloadEnvelope",
758
+ {
759
+ dataColumnIndex: index,
760
+ ...payloadInputMeta,
761
+ }
762
+ );
763
+ // TODO GLOAS: UnknownBlockSync to handle this event
764
+ chain.emitter.emit(ChainEvent.incompletePayloadEnvelope, {
765
+ payloadInput,
766
+ peer: peerIdStr,
767
+ source: BlockInputSource.gossip,
768
+ });
769
+ });
770
+ }
755
771
  } else {
756
772
  if (config.getForkSeq(dataColumnSlot) < ForkSeq.fulu) {
757
773
  throw new GossipActionError(GossipAction.REJECT, {code: "PRE_FULU_BLOCK"});
@@ -1049,7 +1065,8 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
1049
1065
  await validateGossipExecutionPayloadEnvelope(chain, signedEnvelope);
1050
1066
  } catch (e) {
1051
1067
  if (e instanceof ExecutionPayloadEnvelopeError) {
1052
- const {slot, beaconBlockRoot} = signedEnvelope.message;
1068
+ const {beaconBlockRoot} = signedEnvelope.message;
1069
+ const slot = signedEnvelope.message.payload.slotNumber;
1053
1070
  logger.debug("Gossip envelope has error", {slot, root: toRootHex(beaconBlockRoot), code: e.type.code});
1054
1071
  if (e.type.code === ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN) {
1055
1072
  // TODO GLOAS: UnknownBlockSync to handle this
@@ -1072,7 +1089,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
1072
1089
  throw e;
1073
1090
  }
1074
1091
 
1075
- const slot = envelope.slot;
1092
+ const slot = envelope.payload.slotNumber;
1076
1093
  const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
1077
1094
  metrics?.gossipExecutionPayloadEnvelope.elapsedTimeTillReceived.observe({source: OpSource.gossip}, delaySec);
1078
1095
  chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, signedEnvelope);
@@ -1102,7 +1119,6 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
1102
1119
  builderIndex: envelope.builderIndex,
1103
1120
  blockHash: toRootHex(envelope.payload.blockHash),
1104
1121
  blockRoot: blockRootHex,
1105
- stateRoot: toRootHex(envelope.stateRoot),
1106
1122
  });
1107
1123
 
1108
1124
  chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
@@ -6,7 +6,7 @@ import {BeaconApiMethods} from "@lodestar/api/beacon/server";
6
6
  import {BeaconConfig} from "@lodestar/config";
7
7
  import type {LoggerNode} from "@lodestar/logger/node";
8
8
  import {ZERO_HASH_HEX} from "@lodestar/params";
9
- import {IBeaconStateView, PubkeyCache, isStatePostBellatrix} from "@lodestar/state-transition";
9
+ import {IBeaconStateView, PubkeyCache, isStatePostBellatrix, isStatePostGloas} from "@lodestar/state-transition";
10
10
  import {phase0} from "@lodestar/types";
11
11
  import {sleep, toRootHex} from "@lodestar/utils";
12
12
  import {ProcessShutdownCallback} from "@lodestar/validator";
@@ -223,7 +223,9 @@ export class BeaconNode {
223
223
  if (opts.executionEngine.mode === "mock") {
224
224
  const eth1BlockHash =
225
225
  isStatePostBellatrix(anchorState) && anchorState.isExecutionStateType
226
- ? toRootHex(anchorState.latestBlockHash)
226
+ ? isStatePostGloas(anchorState)
227
+ ? toRootHex(anchorState.latestBlockHash)
228
+ : toRootHex(anchorState.latestExecutionPayloadHeader.blockHash)
227
229
  : undefined;
228
230
  executionEngineOpts = {
229
231
  ...opts.executionEngine,
@@ -560,8 +560,8 @@ export function getBeaconBlockRootFromDataColumnSidecarSerialized(data: Uint8Arr
560
560
  * ├─ 4 bytes: executionRequests offset
561
561
  * ├─ 8 bytes: builderIndex (offset 108-115)
562
562
  * ├─ 32 bytes: beaconBlockRoot (offset 116-147)
563
- * ├─ 8 bytes: slot (offset 148-155)
564
- * └─ 32 bytes: stateRoot (offset 156-187)
563
+ * └─ variable: payload data (starts at envelope + 48)
564
+ * └─ ExecutionPayload fixed portion includes slotNumber at offset 532
565
565
  */
566
566
  const SIGNED_EXECUTION_PAYLOAD_ENVELOPE_MESSAGE_OFFSET = 4;
567
567
  const SIGNED_EXECUTION_PAYLOAD_ENVELOPE_SIGNATURE_SIZE = 96;
@@ -576,8 +576,26 @@ const BEACON_BLOCK_ROOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE =
576
576
  EXECUTION_PAYLOAD_ENVELOPE_REQUESTS_OFFSET +
577
577
  EXECUTION_PAYLOAD_ENVELOPE_BUILDER_INDEX_SIZE; // 116
578
578
 
579
+ // Envelope fixed portion (without slot): payload_offset(4) + requests_offset(4) + builderIndex(8) + beaconBlockRoot(32) = 48
580
+ const EXECUTION_PAYLOAD_ENVELOPE_FIXED_SIZE =
581
+ EXECUTION_PAYLOAD_ENVELOPE_PAYLOAD_OFFSET +
582
+ EXECUTION_PAYLOAD_ENVELOPE_REQUESTS_OFFSET +
583
+ EXECUTION_PAYLOAD_ENVELOPE_BUILDER_INDEX_SIZE +
584
+ ROOT_SIZE; // 48
585
+
586
+ // slotNumber offset within ExecutionPayload fixed portion:
587
+ // parentHash(32) + feeRecipient(20) + stateRoot(32) + receiptsRoot(32) + logsBloom(256) +
588
+ // prevRandao(32) + blockNumber(8) + gasLimit(8) + gasUsed(8) + timestamp(8) +
589
+ // extraData_offset(4) + baseFeePerGas(32) + blockHash(32) + transactions_offset(4) +
590
+ // withdrawals_offset(4) + blobGasUsed(8) + excessBlobGas(8) + blockAccessList_offset(4) = 532
591
+ const SLOT_NUMBER_OFFSET_IN_EXECUTION_PAYLOAD = 532;
592
+
593
+ // Payload data starts right after the envelope's fixed portion
594
+ const ENVELOPE_START_IN_SIGNED =
595
+ SIGNED_EXECUTION_PAYLOAD_ENVELOPE_MESSAGE_OFFSET + SIGNED_EXECUTION_PAYLOAD_ENVELOPE_SIGNATURE_SIZE; // 100
596
+
579
597
  const SLOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE =
580
- BEACON_BLOCK_ROOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE + ROOT_SIZE; // 148
598
+ ENVELOPE_START_IN_SIGNED + EXECUTION_PAYLOAD_ENVELOPE_FIXED_SIZE + SLOT_NUMBER_OFFSET_IN_EXECUTION_PAYLOAD; // 100 + 48 + 532 = 680
581
599
 
582
600
  export function getSlotFromExecutionPayloadEnvelopeSerialized(data: Uint8Array): Slot | null {
583
601
  if (data.length < SLOT_OFFSET_IN_SIGNED_EXECUTION_PAYLOAD_ENVELOPE + SLOT_SIZE) {