@lodestar/beacon-node 1.41.0-dev.f225223000 → 1.41.0-dev.f36ec31497

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 (220) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +3 -2
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/debug/index.d.ts.map +1 -1
  5. package/lib/api/impl/debug/index.js +1 -0
  6. package/lib/api/impl/debug/index.js.map +1 -1
  7. package/lib/api/impl/node/utils.d.ts +1 -1
  8. package/lib/api/impl/node/utils.d.ts.map +1 -1
  9. package/lib/api/impl/node/utils.js.map +1 -1
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +26 -10
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/archiveStore/utils/updateBackfillRange.js +1 -1
  14. package/lib/chain/archiveStore/utils/updateBackfillRange.js.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.d.ts +20 -2
  16. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  17. package/lib/chain/blocks/blockInput/blockInput.js +47 -0
  18. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  19. package/lib/chain/blocks/blockInput/types.d.ts +2 -1
  20. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  21. package/lib/chain/blocks/blockInput/types.js +1 -0
  22. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  23. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  24. package/lib/chain/blocks/importBlock.js +26 -3
  25. package/lib/chain/blocks/importBlock.js.map +1 -1
  26. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  27. package/lib/chain/blocks/verifyBlocksDataAvailability.js +3 -0
  28. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  29. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -0
  30. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  31. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -1
  32. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  33. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  34. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -1
  35. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  36. package/lib/chain/chain.js +6 -6
  37. package/lib/chain/chain.js.map +1 -1
  38. package/lib/chain/emitter.d.ts +3 -3
  39. package/lib/chain/emitter.d.ts.map +1 -1
  40. package/lib/chain/errors/executionPayloadEnvelope.d.ts +2 -2
  41. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  42. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  43. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  44. package/lib/chain/forkChoice/index.js +30 -24
  45. package/lib/chain/forkChoice/index.js.map +1 -1
  46. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  47. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  48. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  49. package/lib/chain/produceBlock/produceBlockBody.js +1 -2
  50. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  51. package/lib/chain/regen/queued.d.ts.map +1 -1
  52. package/lib/chain/regen/queued.js +4 -1
  53. package/lib/chain/regen/queued.js.map +1 -1
  54. package/lib/chain/regen/regen.d.ts.map +1 -1
  55. package/lib/chain/regen/regen.js +5 -1
  56. package/lib/chain/regen/regen.js.map +1 -1
  57. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  58. package/lib/chain/seenCache/seenGossipBlockInput.js +15 -7
  59. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  60. package/lib/chain/validation/aggregateAndProof.js +1 -1
  61. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  62. package/lib/chain/validation/attestation.js +3 -3
  63. package/lib/chain/validation/attestation.js.map +1 -1
  64. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  65. package/lib/chain/validation/attesterSlashing.js +8 -1
  66. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  67. package/lib/chain/validation/blobSidecar.js +2 -2
  68. package/lib/chain/validation/blobSidecar.js.map +1 -1
  69. package/lib/chain/validation/block.d.ts.map +1 -1
  70. package/lib/chain/validation/block.js +6 -3
  71. package/lib/chain/validation/block.js.map +1 -1
  72. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  73. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  74. package/lib/chain/validation/executionPayloadBid.js +1 -2
  75. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  76. package/lib/chain/validation/executionPayloadEnvelope.js +4 -4
  77. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  78. package/lib/chain/validation/payloadAttestationMessage.js +1 -2
  79. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  80. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  81. package/lib/db/repositories/blockArchive.js +1 -2
  82. package/lib/db/repositories/blockArchive.js.map +1 -1
  83. package/lib/execution/engine/http.d.ts +1 -0
  84. package/lib/execution/engine/http.d.ts.map +1 -1
  85. package/lib/execution/engine/http.js +3 -0
  86. package/lib/execution/engine/http.js.map +1 -1
  87. package/lib/metrics/metrics/lodestar.d.ts +3 -0
  88. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  89. package/lib/metrics/metrics/lodestar.js +5 -0
  90. package/lib/metrics/metrics/lodestar.js.map +1 -1
  91. package/lib/monitoring/service.d.ts +2 -2
  92. package/lib/monitoring/service.d.ts.map +1 -1
  93. package/lib/monitoring/service.js +3 -2
  94. package/lib/monitoring/service.js.map +1 -1
  95. package/lib/network/core/networkCore.d.ts +3 -3
  96. package/lib/network/core/networkCore.d.ts.map +1 -1
  97. package/lib/network/core/networkCore.js.map +1 -1
  98. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -3
  99. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  100. package/lib/network/core/types.d.ts +2 -2
  101. package/lib/network/core/types.d.ts.map +1 -1
  102. package/lib/network/events.d.ts +2 -1
  103. package/lib/network/events.d.ts.map +1 -1
  104. package/lib/network/events.js.map +1 -1
  105. package/lib/network/gossip/encoding.d.ts +3 -3
  106. package/lib/network/gossip/encoding.d.ts.map +1 -1
  107. package/lib/network/gossip/encoding.js.map +1 -1
  108. package/lib/network/gossip/gossipsub.d.ts +13 -4
  109. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  110. package/lib/network/gossip/gossipsub.js +47 -20
  111. package/lib/network/gossip/gossipsub.js.map +1 -1
  112. package/lib/network/gossip/interface.d.ts +3 -3
  113. package/lib/network/gossip/interface.d.ts.map +1 -1
  114. package/lib/network/gossip/scoringParameters.d.ts +1 -1
  115. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  116. package/lib/network/gossip/scoringParameters.js +1 -1
  117. package/lib/network/gossip/scoringParameters.js.map +1 -1
  118. package/lib/network/interface.d.ts +3 -3
  119. package/lib/network/interface.d.ts.map +1 -1
  120. package/lib/network/libp2p/index.d.ts +1 -1
  121. package/lib/network/libp2p/index.d.ts.map +1 -1
  122. package/lib/network/libp2p/index.js +7 -2
  123. package/lib/network/libp2p/index.js.map +1 -1
  124. package/lib/network/network.d.ts +2 -2
  125. package/lib/network/network.d.ts.map +1 -1
  126. package/lib/network/network.js.map +1 -1
  127. package/lib/network/options.d.ts.map +1 -1
  128. package/lib/network/options.js +3 -0
  129. package/lib/network/options.js.map +1 -1
  130. package/lib/network/peers/datastore.d.ts +7 -5
  131. package/lib/network/peers/datastore.d.ts.map +1 -1
  132. package/lib/network/peers/datastore.js +10 -10
  133. package/lib/network/peers/datastore.js.map +1 -1
  134. package/lib/network/peers/peerManager.d.ts +3 -0
  135. package/lib/network/peers/peerManager.d.ts.map +1 -1
  136. package/lib/network/peers/peerManager.js +103 -53
  137. package/lib/network/peers/peerManager.js.map +1 -1
  138. package/lib/network/peers/utils/prioritizePeers.d.ts +3 -3
  139. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  140. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  141. package/lib/network/processor/gossipHandlers.js +4 -1
  142. package/lib/network/processor/gossipHandlers.js.map +1 -1
  143. package/lib/network/processor/gossipValidatorFn.js +1 -1
  144. package/lib/network/processor/types.d.ts +1 -1
  145. package/lib/network/processor/types.d.ts.map +1 -1
  146. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +1 -1
  147. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  148. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
  149. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  150. package/lib/network/reqresp/score.d.ts.map +1 -1
  151. package/lib/network/reqresp/score.js +0 -1
  152. package/lib/network/reqresp/score.js.map +1 -1
  153. package/lib/network/util.js +2 -2
  154. package/lib/network/util.js.map +1 -1
  155. package/lib/node/nodejs.d.ts.map +1 -1
  156. package/lib/node/nodejs.js +4 -1
  157. package/lib/node/nodejs.js.map +1 -1
  158. package/lib/util/clock.d.ts +6 -0
  159. package/lib/util/clock.d.ts.map +1 -1
  160. package/lib/util/clock.js +9 -3
  161. package/lib/util/clock.js.map +1 -1
  162. package/package.json +39 -42
  163. package/src/api/impl/beacon/blocks/index.ts +3 -2
  164. package/src/api/impl/debug/index.ts +1 -0
  165. package/src/api/impl/node/utils.ts +3 -3
  166. package/src/api/impl/validator/index.ts +26 -12
  167. package/src/chain/archiveStore/utils/updateBackfillRange.ts +1 -1
  168. package/src/chain/blocks/blockInput/blockInput.ts +68 -3
  169. package/src/chain/blocks/blockInput/types.ts +1 -0
  170. package/src/chain/blocks/importBlock.ts +34 -3
  171. package/src/chain/blocks/verifyBlocksDataAvailability.ts +3 -0
  172. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
  173. package/src/chain/blocks/verifyBlocksSanityChecks.ts +7 -2
  174. package/src/chain/chain.ts +6 -6
  175. package/src/chain/emitter.ts +3 -3
  176. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  177. package/src/chain/forkChoice/index.ts +39 -21
  178. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  179. package/src/chain/produceBlock/produceBlockBody.ts +1 -2
  180. package/src/chain/regen/queued.ts +7 -2
  181. package/src/chain/regen/regen.ts +8 -2
  182. package/src/chain/seenCache/seenGossipBlockInput.ts +16 -7
  183. package/src/chain/validation/aggregateAndProof.ts +1 -1
  184. package/src/chain/validation/attestation.ts +3 -3
  185. package/src/chain/validation/attesterSlashing.ts +9 -0
  186. package/src/chain/validation/blobSidecar.ts +2 -2
  187. package/src/chain/validation/block.ts +9 -4
  188. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  189. package/src/chain/validation/executionPayloadBid.ts +1 -2
  190. package/src/chain/validation/executionPayloadEnvelope.ts +4 -4
  191. package/src/chain/validation/payloadAttestationMessage.ts +1 -2
  192. package/src/db/repositories/blockArchive.ts +1 -2
  193. package/src/execution/engine/http.ts +3 -0
  194. package/src/metrics/metrics/lodestar.ts +5 -0
  195. package/src/monitoring/service.ts +3 -2
  196. package/src/network/core/networkCore.ts +3 -3
  197. package/src/network/core/networkCoreWorkerHandler.ts +3 -3
  198. package/src/network/core/types.ts +2 -2
  199. package/src/network/events.ts +2 -1
  200. package/src/network/gossip/encoding.ts +3 -3
  201. package/src/network/gossip/gossipsub.ts +86 -25
  202. package/src/network/gossip/interface.ts +3 -3
  203. package/src/network/gossip/scoringParameters.ts +4 -4
  204. package/src/network/interface.ts +3 -3
  205. package/src/network/libp2p/index.ts +8 -3
  206. package/src/network/network.ts +3 -3
  207. package/src/network/options.ts +3 -0
  208. package/src/network/peers/datastore.ts +13 -10
  209. package/src/network/peers/peerManager.ts +118 -54
  210. package/src/network/peers/utils/prioritizePeers.ts +3 -3
  211. package/src/network/processor/gossipHandlers.ts +12 -3
  212. package/src/network/processor/gossipValidatorFn.ts +1 -1
  213. package/src/network/processor/types.ts +1 -1
  214. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +1 -1
  215. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -1
  216. package/src/network/reqresp/score.ts +0 -1
  217. package/src/network/util.ts +2 -2
  218. package/src/node/nodejs.ts +4 -1
  219. package/src/util/clock.ts +9 -4
  220. package/src/util/workerEvents.ts +1 -1
package/lib/util/clock.js CHANGED
@@ -43,11 +43,14 @@ export class Clock extends EventEmitter {
43
43
  /**
44
44
  * If it's too close to next slot given MAXIMUM_GOSSIP_CLOCK_DISPARITY, return currentSlot + 1.
45
45
  * Otherwise return currentSlot
46
+ *
47
+ * Spec: phase0/p2p-interface.md - gossip validation uses `current_time + MAXIMUM_GOSSIP_CLOCK_DISPARITY < message_time`
48
+ * to reject future messages (strict `<`), so the boundary (exactly equal) is accepted, hence `<=` here.
46
49
  */
47
50
  get currentSlotWithGossipDisparity() {
48
51
  const currentSlot = this.currentSlot;
49
52
  const nextSlotTime = computeTimeAtSlot(this.config, currentSlot + 1, this.genesisTime) * 1000;
50
- return nextSlotTime - Date.now() < this.config.MAXIMUM_GOSSIP_CLOCK_DISPARITY ? currentSlot + 1 : currentSlot;
53
+ return nextSlotTime - Date.now() <= this.config.MAXIMUM_GOSSIP_CLOCK_DISPARITY ? currentSlot + 1 : currentSlot;
51
54
  }
52
55
  get currentEpoch() {
53
56
  return computeEpochAtSlot(this.currentSlot);
@@ -64,6 +67,9 @@ export class Clock extends EventEmitter {
64
67
  }
65
68
  /**
66
69
  * Check if a slot is current slot given MAXIMUM_GOSSIP_CLOCK_DISPARITY.
70
+ *
71
+ * Uses `<=` for disparity checks because the spec rejects with strict `<`
72
+ * (phase0/p2p-interface.md), meaning the boundary (exactly equal) is accepted.
67
73
  */
68
74
  isCurrentSlotGivenGossipDisparity(slot) {
69
75
  const currentSlot = this.currentSlot;
@@ -72,12 +78,12 @@ export class Clock extends EventEmitter {
72
78
  }
73
79
  const nextSlotTime = computeTimeAtSlot(this.config, currentSlot + 1, this.genesisTime) * 1000;
74
80
  // we're too close to next slot, accept next slot
75
- if (nextSlotTime - Date.now() < this.config.MAXIMUM_GOSSIP_CLOCK_DISPARITY) {
81
+ if (nextSlotTime - Date.now() <= this.config.MAXIMUM_GOSSIP_CLOCK_DISPARITY) {
76
82
  return slot === currentSlot + 1;
77
83
  }
78
84
  const currentSlotTime = computeTimeAtSlot(this.config, currentSlot, this.genesisTime) * 1000;
79
85
  // we've just passed the current slot, accept previous slot
80
- if (Date.now() - currentSlotTime < this.config.MAXIMUM_GOSSIP_CLOCK_DISPARITY) {
86
+ if (Date.now() - currentSlotTime <= this.config.MAXIMUM_GOSSIP_CLOCK_DISPARITY) {
81
87
  return slot === currentSlot - 1;
82
88
  }
83
89
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAGvC,OAAO,EAAC,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,4BAA4B,CAAC;AAEjG,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAN,IAAY,UAWX;AAXD,WAAY,UAAU;IACpB;;;OAGG;IACH,iCAAmB,CAAA;IACnB;;;OAGG;IACH,mCAAqB,CAAA;AACvB,CAAC,EAXW,UAAU,KAAV,UAAU,QAWrB;AA+CD;;GAEG;AACH,MAAM,OAAO,KAAM,SAAQ,YAAY;IAC5B,WAAW,CAAS;IACZ,MAAM,CAAkB;IACjC,SAAS,CAA0B;IAC1B,MAAM,CAAc;IAC7B,YAAY,CAAS;IAE7B,YAAY,EAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAsE;QAC5G,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,WAAW;QACb,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;;OAMG;IACH,IAAI,8BAA8B;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAC9F,OAAO,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IACjH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,8EAA8E;IAC9E,uBAAuB,CAAC,YAAoB;QAC1C,yDAAyD;QACzD,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;IACtE,CAAC;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,YAAoB;QACxC,yDAAyD;QACzD,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;IACtE,CAAC;IAED;;;;;OAKG;IACH,iCAAiC,CAAC,IAAU;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAC9F,iDAAiD;QACjD,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAC;YAC5E,OAAO,IAAI,KAAK,WAAW,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAC7F,2DAA2D;QAC3D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAC;YAC/E,OAAO,IAAI,KAAK,WAAW,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAU;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,YAAY,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,CAAC,SAAe,EAAQ,EAAE;gBACvC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;oBACtB,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,GAAS,EAAE;gBACxB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAClD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,IAAU,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;QAC/C,OAAO,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,UAAU,CAAC,IAAU,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;QACtC,OAAO,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAC9E,CAAC;IAEO,UAAU,GAAG,CAAC,IAAW,EAAQ,EAAE;QACzC,MAAM,SAAS,GAAG,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxE,qGAAqG;QACrG,OAAO,IAAI,CAAC,YAAY,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,YAAY,EAAE,CAAC;YAEpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAE9C,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE3D,IAAI,aAAa,GAAG,YAAY,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,+BAA+B;YAC/B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC;IAEM,eAAe;QACrB,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAChE,OAAO,mBAAmB,GAAG,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,CAAC;IAC1E,CAAC;CACF"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.41.0-dev.f225223000",
14
+ "version": "1.41.0-dev.f36ec31497",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -110,10 +110,9 @@
110
110
  "dependencies": {
111
111
  "@chainsafe/as-sha256": "^1.2.0",
112
112
  "@chainsafe/blst": "^2.2.0",
113
- "@chainsafe/discv5": "^11.0.4",
114
- "@chainsafe/enr": "^5.0.1",
115
- "@chainsafe/libp2p-gossipsub": "^14.1.2",
116
- "@chainsafe/libp2p-noise": "^16.1.5",
113
+ "@chainsafe/discv5": "^12.0.0",
114
+ "@chainsafe/enr": "^6.0.0",
115
+ "@chainsafe/libp2p-noise": "^17.0.0",
117
116
  "@chainsafe/persistent-merkle-tree": "^1.2.1",
118
117
  "@chainsafe/prometheus-gc-stats": "^1.0.0",
119
118
  "@chainsafe/pubkey-index-map": "^3.0.0",
@@ -125,39 +124,38 @@
125
124
  "@fastify/cors": "^10.0.1",
126
125
  "@fastify/swagger": "^9.0.0",
127
126
  "@fastify/swagger-ui": "^5.0.1",
128
- "@libp2p/bootstrap": "^11.0.32",
129
- "@libp2p/crypto": "^5.0.15",
130
- "@libp2p/identify": "^3.0.27",
131
- "@libp2p/interface": "^2.7.0",
132
- "@libp2p/mdns": "^11.0.32",
133
- "@libp2p/mplex": "^11.0.32",
134
- "@libp2p/peer-id": "^5.1.0",
135
- "@libp2p/prometheus-metrics": "^4.3.15",
136
- "@libp2p/tcp": "^10.1.8",
137
- "@lodestar/api": "^1.41.0-dev.f225223000",
138
- "@lodestar/config": "^1.41.0-dev.f225223000",
139
- "@lodestar/db": "^1.41.0-dev.f225223000",
140
- "@lodestar/fork-choice": "^1.41.0-dev.f225223000",
141
- "@lodestar/light-client": "^1.41.0-dev.f225223000",
142
- "@lodestar/logger": "^1.41.0-dev.f225223000",
143
- "@lodestar/params": "^1.41.0-dev.f225223000",
144
- "@lodestar/reqresp": "^1.41.0-dev.f225223000",
145
- "@lodestar/state-transition": "^1.41.0-dev.f225223000",
146
- "@lodestar/types": "^1.41.0-dev.f225223000",
147
- "@lodestar/utils": "^1.41.0-dev.f225223000",
148
- "@lodestar/validator": "^1.41.0-dev.f225223000",
149
- "@multiformats/multiaddr": "^12.1.3",
150
- "datastore-core": "^10.0.2",
151
- "datastore-fs": "^10.0.6",
152
- "datastore-level": "^11.0.3",
127
+ "@libp2p/bootstrap": "^12.0.13",
128
+ "@libp2p/crypto": "^5.1.13",
129
+ "@libp2p/gossipsub": "^15.0.14",
130
+ "@libp2p/identify": "^4.0.12",
131
+ "@libp2p/interface": "^3.1.0",
132
+ "@libp2p/mdns": "^12.0.13",
133
+ "@libp2p/mplex": "^12.0.13",
134
+ "@libp2p/peer-id": "^6.0.4",
135
+ "@libp2p/prometheus-metrics": "^5.0.13",
136
+ "@libp2p/tcp": "^11.0.12",
137
+ "@lodestar/api": "^1.41.0-dev.f36ec31497",
138
+ "@lodestar/config": "^1.41.0-dev.f36ec31497",
139
+ "@lodestar/db": "^1.41.0-dev.f36ec31497",
140
+ "@lodestar/fork-choice": "^1.41.0-dev.f36ec31497",
141
+ "@lodestar/light-client": "^1.41.0-dev.f36ec31497",
142
+ "@lodestar/logger": "^1.41.0-dev.f36ec31497",
143
+ "@lodestar/params": "^1.41.0-dev.f36ec31497",
144
+ "@lodestar/reqresp": "^1.41.0-dev.f36ec31497",
145
+ "@lodestar/state-transition": "^1.41.0-dev.f36ec31497",
146
+ "@lodestar/types": "^1.41.0-dev.f36ec31497",
147
+ "@lodestar/utils": "^1.41.0-dev.f36ec31497",
148
+ "@lodestar/validator": "^1.41.0-dev.f36ec31497",
149
+ "@multiformats/multiaddr": "^13.0.1",
150
+ "datastore-core": "^11.0.2",
151
+ "datastore-fs": "^11.0.2",
152
+ "datastore-level": "^12.0.2",
153
153
  "deepmerge": "^4.3.1",
154
- "fastify": "^5.7.4",
155
- "interface-datastore": "^8.3.0",
156
- "it-all": "^3.0.4",
157
- "it-pipe": "^3.0.1",
154
+ "fastify": "^5.8.1",
155
+ "interface-datastore": "^9.0.2",
158
156
  "jwt-simple": "0.5.6",
159
- "libp2p": "2.9.0",
160
- "multiformats": "^11.0.1",
157
+ "libp2p": "3.1.5",
158
+ "multiformats": "^13.4.2",
161
159
  "prom-client": "^15.1.0",
162
160
  "qs": "^6.11.1",
163
161
  "strict-event-emitter-types": "^2.0.0",
@@ -167,14 +165,13 @@
167
165
  },
168
166
  "devDependencies": {
169
167
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
170
- "@libp2p/interface-internal": "^2.3.18",
171
- "@libp2p/logger": "^5.1.21",
172
- "@lodestar/spec-test-util": "^1.41.0-dev.f225223000",
168
+ "@libp2p/interface-internal": "^3.0.12",
169
+ "@libp2p/logger": "^6.2.2",
170
+ "@libp2p/utils": "^7.0.12",
171
+ "@lodestar/spec-test-util": "^1.41.0-dev.f36ec31497",
173
172
  "@types/js-yaml": "^4.0.5",
174
173
  "@types/qs": "^6.9.7",
175
174
  "@types/tmp": "^0.2.3",
176
- "it-drain": "^3.0.3",
177
- "it-pair": "^2.0.6",
178
175
  "js-yaml": "^4.1.0",
179
176
  "rewiremock": "^3.14.5",
180
177
  "rimraf": "^4.4.1",
@@ -188,5 +185,5 @@
188
185
  "beacon",
189
186
  "blockchain"
190
187
  ],
191
- "gitHead": "2aa1d42fb2bdca26a2d93338129c593a816f2b97"
188
+ "gitHead": "9c929ad4b7b1b1ba94960007698cce0dd6536c17"
192
189
  }
@@ -1,5 +1,6 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ApiError, ApplicationMethods} from "@lodestar/api/server";
3
+ import {PayloadStatus} from "@lodestar/fork-choice";
3
4
  import {
4
5
  BUILDER_INDEX_SELF_BUILD,
5
6
  ForkPostBellatrix,
@@ -205,7 +206,7 @@ export function getBeaconBlockApi({
205
206
  case routes.beacon.BroadcastValidation.consensus: {
206
207
  // check if this beacon node produced the block else run validations
207
208
  if (!blockLocallyProduced) {
208
- const parentBlock = chain.forkChoice.getBlock(signedBlock.message.parentRoot);
209
+ const parentBlock = chain.forkChoice.getBlockDefaultStatus(signedBlock.message.parentRoot);
209
210
  if (parentBlock === null) {
210
211
  chain.emitter.emit(ChainEvent.unknownParent, {
211
212
  blockInput: blockForImport,
@@ -650,7 +651,7 @@ export function getBeaconBlockApi({
650
651
  }
651
652
 
652
653
  // TODO GLOAS: review checks, do we want to implement `broadcast_validation`?
653
- const block = chain.forkChoice.getBlockHex(blockRootHex);
654
+ const block = chain.forkChoice.getBlockHex(blockRootHex, PayloadStatus.EMPTY);
654
655
  if (block === null) {
655
656
  throw new ApiError(404, `Block not found for beacon block root ${blockRootHex}`);
656
657
  }
@@ -43,6 +43,7 @@ export function getDebugApi({
43
43
  validity: (() => {
44
44
  switch (node.executionStatus) {
45
45
  case ExecutionStatus.Valid:
46
+ case ExecutionStatus.PayloadSeparated:
46
47
  return "valid";
47
48
  case ExecutionStatus.Invalid:
48
49
  return "invalid";
@@ -1,4 +1,4 @@
1
- import {Connection, StreamStatus} from "@libp2p/interface";
1
+ import type {Connection, ConnectionStatus} from "@libp2p/interface";
2
2
  import {routes} from "@lodestar/api";
3
3
 
4
4
  /**
@@ -24,7 +24,7 @@ export function formatNodePeer(peerIdStr: string, connections: Connection[]): ro
24
24
  * - Otherwise, the first closed connection
25
25
  */
26
26
  export function getRelevantConnection(connections: Connection[]): Connection | null {
27
- const byStatus = new Map<StreamStatus, Connection>();
27
+ const byStatus = new Map<ConnectionStatus, Connection>();
28
28
  for (const conn of connections) {
29
29
  if (conn.status === "open") return conn;
30
30
  if (!byStatus.has(conn.status)) byStatus.set(conn.status, conn);
@@ -37,7 +37,7 @@ export function getRelevantConnection(connections: Connection[]): Connection | n
37
37
  * Map libp2p connection status to the API's peer state notation
38
38
  * @param status
39
39
  */
40
- function getPeerState(status: StreamStatus): routes.node.PeerState {
40
+ function getPeerState(status: ConnectionStatus): routes.node.PeerState {
41
41
  switch (status) {
42
42
  case "open":
43
43
  return "connected";
@@ -1,6 +1,6 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ApplicationMethods} from "@lodestar/api/server";
3
- import {ExecutionStatus, ProtoBlock} from "@lodestar/fork-choice";
3
+ import {ExecutionStatus, PayloadStatus, ProtoBlock} from "@lodestar/fork-choice";
4
4
  import {
5
5
  BUILDER_INDEX_SELF_BUILD,
6
6
  ForkName,
@@ -389,7 +389,7 @@ export function getValidatorApi(
389
389
  */
390
390
 
391
391
  function notOnOptimisticBlockRoot(beaconBlockRoot: Root): void {
392
- const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
392
+ const protoBeaconBlock = chain.forkChoice.getBlockDefaultStatus(beaconBlockRoot);
393
393
  if (!protoBeaconBlock) {
394
394
  throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
395
395
  }
@@ -401,7 +401,7 @@ export function getValidatorApi(
401
401
  }
402
402
 
403
403
  function notOnOutOfRangeData(beaconBlockRoot: Root): void {
404
- const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
404
+ const protoBeaconBlock = chain.forkChoice.getBlockDefaultStatus(beaconBlockRoot);
405
405
  if (!protoBeaconBlock) {
406
406
  throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
407
407
  }
@@ -989,8 +989,30 @@ export function getValidatorApi(
989
989
  const headBlockRoot = fromHex(headBlockRootHex);
990
990
  const fork = config.getForkName(slot);
991
991
 
992
+ const beaconBlockRoot =
993
+ slot >= headSlot
994
+ ? // When attesting to the head slot or later, always use the head of the chain.
995
+ headBlockRoot
996
+ : // Permit attesting to slots *prior* to the current head. This is desirable when
997
+ // the VC and BN are out-of-sync due to time issues or overloading.
998
+ getBlockRootAtSlot(headState, slot);
999
+
992
1000
  let index: CommitteeIndex;
993
- if (isForkPostElectra(fork)) {
1001
+ if (isForkPostGloas(fork)) {
1002
+ const canonicalBlock = chain.forkChoice.getCanonicalBlockByRoot(beaconBlockRoot);
1003
+ if (!canonicalBlock) {
1004
+ // This should never happen
1005
+ throw Error(`Block not found in fork choice for slot=${slot}, root=${toRootHex(beaconBlockRoot)}`);
1006
+ }
1007
+ // After Gloas, attestation.data.index signals payload status in fork-choice:
1008
+ // - 0 = EMPTY / not present, 1 = FULL / present
1009
+ // - same-slot attestations must always use index = 0
1010
+ if (canonicalBlock.slot !== slot) {
1011
+ index = canonicalBlock.payloadStatus === PayloadStatus.FULL ? 1 : 0;
1012
+ } else {
1013
+ index = 0;
1014
+ }
1015
+ } else if (isForkPostElectra(fork)) {
994
1016
  index = 0;
995
1017
  } else {
996
1018
  if (committeeIndex === undefined) {
@@ -999,14 +1021,6 @@ export function getValidatorApi(
999
1021
  index = committeeIndex;
1000
1022
  }
1001
1023
 
1002
- const beaconBlockRoot =
1003
- slot >= headSlot
1004
- ? // When attesting to the head slot or later, always use the head of the chain.
1005
- headBlockRoot
1006
- : // Permit attesting to slots *prior* to the current head. This is desirable when
1007
- // the VC and BN are out-of-sync due to time issues or overloading.
1008
- getBlockRootAtSlot(headState, slot);
1009
-
1010
1024
  const targetSlot = computeStartSlotAtEpoch(attEpoch);
1011
1025
  const targetRoot =
1012
1026
  targetSlot >= headSlot
@@ -20,7 +20,7 @@ export async function updateBackfillRange(
20
20
  try {
21
21
  // Mark the sequence in backfill db from finalized block's slot till anchor slot as
22
22
  // filled.
23
- const finalizedBlockFC = chain.forkChoice.getBlockHex(finalized.rootHex);
23
+ const finalizedBlockFC = chain.forkChoice.getBlockHexDefaultStatus(finalized.rootHex);
24
24
  if (finalizedBlockFC && finalizedBlockFC.slot > chain.anchorStateLatestBlockSlot) {
25
25
  await db.backfilledRanges.put(finalizedBlockFC.slot, chain.anchorStateLatestBlockSlot);
26
26
 
@@ -1,5 +1,5 @@
1
- import {ForkName, ForkPostFulu, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
- import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
1
+ import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
+ import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
3
3
  import {byteArrayEquals, fromHex, prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
4
4
  import {VersionedHashes} from "../../../execution/index.js";
5
5
  import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
@@ -24,7 +24,7 @@ import {
24
24
  SourceMeta,
25
25
  } from "./types.js";
26
26
 
27
- export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns;
27
+ export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns | BlockInputNoData;
28
28
 
29
29
  export function isBlockInputPreDeneb(blockInput: IBlockInput): blockInput is BlockInputPreData {
30
30
  return blockInput.type === DAType.PreData;
@@ -37,6 +37,10 @@ export function isBlockInputColumns(blockInput: IBlockInput): blockInput is Bloc
37
37
  return blockInput.type === DAType.Columns;
38
38
  }
39
39
 
40
+ export function isBlockInputNoData(blockInput: IBlockInput): blockInput is BlockInputNoData {
41
+ return blockInput.type === DAType.NoData;
42
+ }
43
+
40
44
  function createPromise<T>(): PromiseParts<T> {
41
45
  let resolve!: (value: T) => void;
42
46
  let reject!: (e: Error) => void;
@@ -903,3 +907,64 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
903
907
  return Promise.resolve(this.getSampledColumns());
904
908
  }
905
909
  }
910
+
911
+ type BlockInputNoDataState = {
912
+ hasBlock: true;
913
+ hasAllData: true;
914
+ block: SignedBeaconBlock<ForkPostGloas>;
915
+ source: SourceMeta;
916
+ timeCompleteSec: number;
917
+ };
918
+
919
+ export class BlockInputNoData extends AbstractBlockInput<ForkPostGloas, null> {
920
+ type = DAType.NoData as const;
921
+
922
+ state: BlockInputNoDataState;
923
+
924
+ private constructor(init: BlockInputInit, state: BlockInputNoDataState) {
925
+ super(init);
926
+ this.state = state;
927
+ this.dataPromise.resolve(null);
928
+ this.blockPromise.resolve(state.block);
929
+ }
930
+
931
+ static createFromBlock(props: AddBlock<ForkPostGloas> & CreateBlockInputMeta): BlockInputNoData {
932
+ const init: BlockInputInit = {
933
+ daOutOfRange: props.daOutOfRange,
934
+ timeCreated: props.seenTimestampSec,
935
+ forkName: props.forkName,
936
+ slot: props.block.message.slot,
937
+ blockRootHex: props.blockRootHex,
938
+ parentRootHex: toRootHex(props.block.message.parentRoot),
939
+ };
940
+ const state: BlockInputNoDataState = {
941
+ hasBlock: true,
942
+ hasAllData: true,
943
+ block: props.block,
944
+ source: {
945
+ source: props.source,
946
+ seenTimestampSec: props.seenTimestampSec,
947
+ peerIdStr: props.peerIdStr,
948
+ },
949
+ timeCompleteSec: props.seenTimestampSec,
950
+ };
951
+ return new BlockInputNoData(init, state);
952
+ }
953
+
954
+ addBlock(_: AddBlock<ForkPostGloas>, opts = {throwOnDuplicateAdd: true}): void {
955
+ if (opts.throwOnDuplicateAdd) {
956
+ throw new BlockInputError(
957
+ {
958
+ code: BlockInputErrorCode.INVALID_CONSTRUCTION,
959
+ blockRoot: this.blockRootHex,
960
+ },
961
+ "Cannot addBlock to BlockInputNoData - block already exists"
962
+ );
963
+ }
964
+ }
965
+
966
+ getBlobKzgCommitments(): deneb.BlobKzgCommitments {
967
+ return (this.state.block.message.body as gloas.BeaconBlockBody).signedExecutionPayloadBid.message
968
+ .blobKzgCommitments;
969
+ }
970
+ }
@@ -6,6 +6,7 @@ export enum DAType {
6
6
  PreData = "pre-data",
7
7
  Blobs = "blobs",
8
8
  Columns = "columns",
9
+ NoData = "no-data",
9
10
  }
10
11
 
11
12
  export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecars;
@@ -20,7 +20,7 @@ import {
20
20
  isStartSlotOfEpoch,
21
21
  isStateValidatorsNodesPopulated,
22
22
  } from "@lodestar/state-transition";
23
- import {Attestation, BeaconBlock, altair, capella, electra, phase0, ssz} from "@lodestar/types";
23
+ import {Attestation, BeaconBlock, altair, capella, electra, isGloasBeaconBlock, phase0, ssz} from "@lodestar/types";
24
24
  import {isErrorAborted, toRootHex} from "@lodestar/utils";
25
25
  import {ZERO_HASH_HEX} from "../../constants/index.js";
26
26
  import {callInNextEventLoop} from "../../util/eventLoop.js";
@@ -230,6 +230,32 @@ export async function importBlock(
230
230
  }
231
231
  }
232
232
 
233
+ // 4.5. Import payload attestations to fork choice (Gloas)
234
+ //
235
+ if (isGloasBeaconBlock(block.message)) {
236
+ for (const payloadAttestation of block.message.body.payloadAttestations) {
237
+ try {
238
+ // Extract PTC indices from aggregation bits
239
+ const ptcIndices: number[] = [];
240
+ for (let i = 0; i < payloadAttestation.aggregationBits.bitLen; i++) {
241
+ if (payloadAttestation.aggregationBits.get(i)) {
242
+ ptcIndices.push(i);
243
+ }
244
+ }
245
+
246
+ if (ptcIndices.length > 0) {
247
+ this.forkChoice.notifyPtcMessages(
248
+ toRootHex(payloadAttestation.data.beaconBlockRoot),
249
+ ptcIndices,
250
+ payloadAttestation.data.payloadPresent
251
+ );
252
+ }
253
+ } catch (e) {
254
+ this.logger.warn("Error processing PayloadAttestation from block", {slot: blockSlot}, e as Error);
255
+ }
256
+ }
257
+ }
258
+
233
259
  // 5. Compute head. If new head, immediately stateCache.setHeadState()
234
260
 
235
261
  const oldHead = this.forkChoice.getHead();
@@ -345,7 +371,7 @@ export async function importBlock(
345
371
  // 3) Proposer boost reorg related flag is turned on (this is checked inside the function)
346
372
  // 4) Block meets the criteria of being re-orged out (this is also checked inside the function)
347
373
  const result = this.forkChoice.shouldOverrideForkChoiceUpdate(
348
- blockSummary.blockRoot,
374
+ blockSummary,
349
375
  this.clock.secFromSlot(currentSlot),
350
376
  currentSlot
351
377
  );
@@ -441,7 +467,12 @@ export async function importBlock(
441
467
  this.metrics?.currentActiveValidators.set(activeValidatorsCount);
442
468
  this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
443
469
 
444
- const parentBlockSummary = this.forkChoice.getBlock(checkpointState.latestBlockHeader.parentRoot);
470
+ const parentBlockSummary = isGloasBeaconBlock(block.message)
471
+ ? this.forkChoice.getBlockHexAndBlockHash(
472
+ toRootHex(checkpointState.latestBlockHeader.parentRoot),
473
+ toRootHex(block.message.body.signedExecutionPayloadBid.message.parentBlockHash)
474
+ )
475
+ : this.forkChoice.getBlockDefaultStatus(checkpointState.latestBlockHeader.parentRoot);
445
476
 
446
477
  if (parentBlockSummary) {
447
478
  const justifiedCheckpoint = checkpointState.currentJustifiedCheckpoint;
@@ -29,6 +29,9 @@ export async function verifyBlocksDataAvailability(
29
29
 
30
30
  const availableTime = Math.max(0, Math.max(...blocks.map((blockInput) => blockInput.getTimeComplete())));
31
31
  const dataAvailabilityStatuses: DataAvailabilityStatus[] = blocks.map((blockInput) => {
32
+ if (blockInput.type === DAType.NoData) {
33
+ return DataAvailabilityStatus.NotRequired;
34
+ }
32
35
  if (blockInput.type === DAType.PreData) {
33
36
  return DataAvailabilityStatus.PreData;
34
37
  }
@@ -21,7 +21,7 @@ import {Metrics} from "../../metrics/metrics.js";
21
21
  import {IClock} from "../../util/clock.js";
22
22
  import {BlockError, BlockErrorCode} from "../errors/index.js";
23
23
  import {BlockProcessOpts} from "../options.js";
24
- import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
24
+ import {isBlockInputBlobs, isBlockInputColumns, isBlockInputNoData} from "./blockInput/blockInput.js";
25
25
  import {IBlockInput} from "./blockInput/types.js";
26
26
  import {ImportBlockOpts} from "./types.js";
27
27
 
@@ -51,7 +51,8 @@ type VerifyBlockExecutionResponse =
51
51
  | VerifyExecutionErrorResponse
52
52
  | {executionStatus: ExecutionStatus.Valid; lvhResponse: LVHValidResponse; execError: null}
53
53
  | {executionStatus: ExecutionStatus.Syncing; lvhResponse?: LVHValidResponse; execError: null}
54
- | {executionStatus: ExecutionStatus.PreMerge; lvhResponse: undefined; execError: null};
54
+ | {executionStatus: ExecutionStatus.PreMerge; lvhResponse: undefined; execError: null}
55
+ | {executionStatus: ExecutionStatus.PayloadSeparated; lvhResponse: undefined; execError: null};
55
56
 
56
57
  /**
57
58
  * Verifies 1 or more execution payloads from a linear sequence of blocks.
@@ -148,6 +149,12 @@ export async function verifyBlockExecutionPayload(
148
149
  preState0: CachedBeaconStateAllForks
149
150
  ): Promise<VerifyBlockExecutionResponse> {
150
151
  const block = blockInput.getBlock();
152
+
153
+ // Gloas block doesn't have execution payload. Return right away
154
+ if (isBlockInputNoData(blockInput)) {
155
+ return {executionStatus: ExecutionStatus.PayloadSeparated, lvhResponse: undefined, execError: null};
156
+ }
157
+
151
158
  /** Not null if execution is enabled */
152
159
  const executionPayloadEnabled =
153
160
  isExecutionStateType(preState0) &&
@@ -1,7 +1,7 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
3
3
  import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
4
- import {RootHex, Slot} from "@lodestar/types";
4
+ import {RootHex, Slot, isGloasBeaconBlock} from "@lodestar/types";
5
5
  import {toRootHex} from "@lodestar/utils";
6
6
  import {IClock} from "../../util/clock.js";
7
7
  import {BlockError, BlockErrorCode} from "../errors/index.js";
@@ -90,7 +90,12 @@ export function verifyBlocksSanityChecks(
90
90
  } else {
91
91
  // When importing a block segment, only the first NON-IGNORED block must be known to the fork-choice.
92
92
  const parentRoot = toRootHex(block.message.parentRoot);
93
- parentBlock = chain.forkChoice.getBlockHex(parentRoot);
93
+ parentBlock = isGloasBeaconBlock(block.message)
94
+ ? chain.forkChoice.getBlockHexAndBlockHash(
95
+ parentRoot,
96
+ toRootHex(block.message.body.signedExecutionPayloadBid.message.parentBlockHash)
97
+ )
98
+ : chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
94
99
  if (!parentBlock) {
95
100
  throw new BlockError(block, {code: BlockErrorCode.PARENT_UNKNOWN, parentRoot});
96
101
  }
@@ -600,7 +600,7 @@ export class BeaconChain implements IBeaconChain {
600
600
  ): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
601
601
  if (opts?.allowRegen) {
602
602
  const state = await this.regen.getState(stateRoot, RegenCaller.restApi);
603
- const block = this.forkChoice.getBlock(state.latestBlockHeader.hashTreeRoot());
603
+ const block = this.forkChoice.getBlockDefaultStatus(state.latestBlockHeader.hashTreeRoot());
604
604
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
605
605
  return {
606
606
  state,
@@ -616,7 +616,7 @@ export class BeaconChain implements IBeaconChain {
616
616
  // TODO: This is very inneficient for debug requests of serialized content, since it deserializes to serialize again
617
617
  const cachedStateCtx = this.regen.getStateSync(stateRoot);
618
618
  if (cachedStateCtx) {
619
- const block = this.forkChoice.getBlock(cachedStateCtx.latestBlockHeader.hashTreeRoot());
619
+ const block = this.forkChoice.getBlockDefaultStatus(cachedStateCtx.latestBlockHeader.hashTreeRoot());
620
620
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
621
621
  return {
622
622
  state: cachedStateCtx,
@@ -650,7 +650,7 @@ export class BeaconChain implements IBeaconChain {
650
650
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
651
651
  const cachedStateCtx = this.regen.getCheckpointStateSync(checkpoint);
652
652
  if (cachedStateCtx) {
653
- const block = this.forkChoice.getBlock(cachedStateCtx.latestBlockHeader.hashTreeRoot());
653
+ const block = this.forkChoice.getBlockDefaultStatus(cachedStateCtx.latestBlockHeader.hashTreeRoot());
654
654
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
655
655
  return {
656
656
  state: cachedStateCtx,
@@ -667,7 +667,7 @@ export class BeaconChain implements IBeaconChain {
667
667
  ): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
668
668
  const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpoint);
669
669
  if (cachedStateCtx) {
670
- const block = this.forkChoice.getBlock(checkpoint.root);
670
+ const block = this.forkChoice.getBlockDefaultStatus(checkpoint.root);
671
671
  const finalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
672
672
  return {
673
673
  state: cachedStateCtx,
@@ -711,7 +711,7 @@ export class BeaconChain implements IBeaconChain {
711
711
  async getBlockByRoot(
712
712
  root: string
713
713
  ): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
714
- const block = this.forkChoice.getBlockHex(root);
714
+ const block = this.forkChoice.getBlockHexDefaultStatus(root);
715
715
  if (block) {
716
716
  // Block found in fork-choice.
717
717
  // It may be in the block input cache, awaiting full DA reconstruction, check there first
@@ -735,7 +735,7 @@ export class BeaconChain implements IBeaconChain {
735
735
  async getSerializedBlockByRoot(
736
736
  root: string
737
737
  ): Promise<{block: Uint8Array; executionOptimistic: boolean; finalized: boolean; slot: Slot} | null> {
738
- const block = this.forkChoice.getBlockHex(root);
738
+ const block = this.forkChoice.getBlockHexDefaultStatus(root);
739
739
  if (block) {
740
740
  // Block found in fork-choice.
741
741
  // It may be in the block input cache, awaiting full DA reconstruction, check there first
@@ -1,7 +1,7 @@
1
1
  import {EventEmitter} from "node:events";
2
2
  import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
- import {CheckpointWithHex} from "@lodestar/fork-choice";
4
+ import {CheckpointWithPayload} from "@lodestar/fork-choice";
5
5
  import {CachedBeaconStateAllForks} from "@lodestar/state-transition";
6
6
  import {DataColumnSidecars, RootHex, deneb, phase0} from "@lodestar/types";
7
7
  import {PeerIdStr} from "../util/peerId.js";
@@ -83,8 +83,8 @@ export type ChainEventData = {
83
83
  export type IChainEvents = ApiEvents & {
84
84
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: CachedBeaconStateAllForks) => void;
85
85
 
86
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
87
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
86
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayload) => void;
87
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayload) => void;
88
88
 
89
89
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
90
90