@lodestar/beacon-node 1.42.0-dev.b10dfaca8d → 1.42.0-dev.bc0be71fb0

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 (203) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +24 -12
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/debug/index.js.map +1 -1
  5. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -1
  6. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  7. package/lib/chain/ColumnReconstructionTracker.js +5 -5
  8. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  9. package/lib/chain/GetBlobsTracker.d.ts +2 -1
  10. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  11. package/lib/chain/GetBlobsTracker.js +14 -12
  12. package/lib/chain/GetBlobsTracker.js.map +1 -1
  13. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  14. package/lib/chain/archiveStore/archiveStore.js +1 -0
  15. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  16. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -3
  17. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +6 -4
  19. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  20. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  21. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  22. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  23. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  24. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  25. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  26. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  27. package/lib/chain/archiveStore/historicalState/worker.js +1 -4
  28. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  29. package/lib/chain/archiveStore/interface.d.ts +1 -0
  30. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  31. package/lib/chain/blocks/blockInput/blockInput.d.ts +5 -5
  32. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  33. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  34. package/lib/chain/blocks/blockInput/types.d.ts +4 -4
  35. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  36. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  37. package/lib/chain/blocks/importBlock.js +30 -18
  38. package/lib/chain/blocks/importBlock.js.map +1 -1
  39. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
  40. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  41. package/lib/chain/blocks/importExecutionPayload.js +76 -48
  42. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  43. package/lib/chain/blocks/index.d.ts.map +1 -1
  44. package/lib/chain/blocks/index.js +2 -1
  45. package/lib/chain/blocks/index.js.map +1 -1
  46. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +14 -6
  47. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  48. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +33 -2
  49. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  50. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
  51. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  52. package/lib/chain/blocks/types.d.ts +20 -14
  53. package/lib/chain/blocks/types.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +2 -2
  55. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  56. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +1 -1
  57. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  58. package/lib/chain/chain.d.ts +3 -2
  59. package/lib/chain/chain.d.ts.map +1 -1
  60. package/lib/chain/chain.js +55 -20
  61. package/lib/chain/chain.js.map +1 -1
  62. package/lib/chain/emitter.d.ts +29 -7
  63. package/lib/chain/emitter.d.ts.map +1 -1
  64. package/lib/chain/emitter.js +12 -3
  65. package/lib/chain/emitter.js.map +1 -1
  66. package/lib/chain/errors/dataColumnSidecarError.d.ts +31 -1
  67. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
  68. package/lib/chain/errors/dataColumnSidecarError.js +7 -0
  69. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  70. package/lib/chain/interface.d.ts +4 -2
  71. package/lib/chain/interface.d.ts.map +1 -1
  72. package/lib/chain/options.d.ts +1 -0
  73. package/lib/chain/options.d.ts.map +1 -1
  74. package/lib/chain/options.js +1 -0
  75. package/lib/chain/options.js.map +1 -1
  76. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +1 -1
  77. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  78. package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
  79. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  80. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +1 -1
  81. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  82. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +2 -2
  83. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  84. package/lib/chain/validation/dataColumnSidecar.d.ts +11 -4
  85. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  86. package/lib/chain/validation/dataColumnSidecar.js +184 -5
  87. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  88. package/lib/db/buckets.d.ts +2 -2
  89. package/lib/db/buckets.d.ts.map +1 -1
  90. package/lib/db/buckets.js +2 -2
  91. package/lib/db/buckets.js.map +1 -1
  92. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  93. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  94. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
  95. package/lib/db/repositories/dataColumnSidecar.js +4 -2
  96. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  97. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  98. package/lib/db/repositories/dataColumnSidecarArchive.js +4 -2
  99. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  100. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  101. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  102. package/lib/metrics/metrics/lodestar.js +33 -0
  103. package/lib/metrics/metrics/lodestar.js.map +1 -1
  104. package/lib/network/interface.d.ts +3 -2
  105. package/lib/network/interface.d.ts.map +1 -1
  106. package/lib/network/libp2p/index.d.ts.map +1 -1
  107. package/lib/network/libp2p/index.js +22 -11
  108. package/lib/network/libp2p/index.js.map +1 -1
  109. package/lib/network/network.d.ts +3 -2
  110. package/lib/network/network.d.ts.map +1 -1
  111. package/lib/network/network.js +3 -0
  112. package/lib/network/network.js.map +1 -1
  113. package/lib/network/options.d.ts.map +1 -1
  114. package/lib/network/options.js +7 -2
  115. package/lib/network/options.js.map +1 -1
  116. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  117. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  118. package/lib/network/processor/extractSlotRootFns.js +25 -5
  119. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  120. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  121. package/lib/network/processor/gossipHandlers.js +256 -73
  122. package/lib/network/processor/gossipHandlers.js.map +1 -1
  123. package/lib/network/processor/index.d.ts +11 -1
  124. package/lib/network/processor/index.d.ts.map +1 -1
  125. package/lib/network/processor/index.js +234 -22
  126. package/lib/network/processor/index.js.map +1 -1
  127. package/lib/network/reqresp/types.d.ts +3 -3
  128. package/lib/network/reqresp/types.d.ts.map +1 -1
  129. package/lib/network/reqresp/types.js +9 -3
  130. package/lib/network/reqresp/types.js.map +1 -1
  131. package/lib/sync/unknownBlock.js +2 -2
  132. package/lib/sync/unknownBlock.js.map +1 -1
  133. package/lib/sync/utils/downloadByRange.d.ts +3 -3
  134. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  135. package/lib/sync/utils/downloadByRange.js +4 -2
  136. package/lib/sync/utils/downloadByRange.js.map +1 -1
  137. package/lib/sync/utils/downloadByRoot.d.ts +3 -3
  138. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  139. package/lib/sync/utils/downloadByRoot.js +10 -5
  140. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  141. package/lib/util/blobs.d.ts +3 -3
  142. package/lib/util/blobs.d.ts.map +1 -1
  143. package/lib/util/blobs.js +21 -10
  144. package/lib/util/blobs.js.map +1 -1
  145. package/lib/util/dataColumns.d.ts +18 -11
  146. package/lib/util/dataColumns.d.ts.map +1 -1
  147. package/lib/util/dataColumns.js +51 -17
  148. package/lib/util/dataColumns.js.map +1 -1
  149. package/lib/util/execution.d.ts +6 -2
  150. package/lib/util/execution.d.ts.map +1 -1
  151. package/lib/util/execution.js +49 -25
  152. package/lib/util/execution.js.map +1 -1
  153. package/lib/util/sszBytes.d.ts +25 -1
  154. package/lib/util/sszBytes.d.ts.map +1 -1
  155. package/lib/util/sszBytes.js +189 -2
  156. package/lib/util/sszBytes.js.map +1 -1
  157. package/package.json +16 -16
  158. package/src/api/impl/beacon/blocks/index.ts +32 -15
  159. package/src/api/impl/debug/index.ts +2 -2
  160. package/src/chain/ColumnReconstructionTracker.ts +6 -5
  161. package/src/chain/GetBlobsTracker.ts +14 -12
  162. package/src/chain/archiveStore/archiveStore.ts +1 -0
  163. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +6 -5
  164. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  165. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  166. package/src/chain/archiveStore/historicalState/worker.ts +1 -5
  167. package/src/chain/archiveStore/interface.ts +1 -0
  168. package/src/chain/blocks/blockInput/blockInput.ts +8 -8
  169. package/src/chain/blocks/blockInput/types.ts +4 -4
  170. package/src/chain/blocks/importBlock.ts +36 -18
  171. package/src/chain/blocks/importExecutionPayload.ts +84 -53
  172. package/src/chain/blocks/index.ts +2 -1
  173. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +53 -12
  174. package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
  175. package/src/chain/blocks/types.ts +25 -14
  176. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +4 -4
  177. package/src/chain/chain.ts +63 -24
  178. package/src/chain/emitter.ts +25 -7
  179. package/src/chain/errors/dataColumnSidecarError.ts +32 -1
  180. package/src/chain/interface.ts +4 -2
  181. package/src/chain/options.ts +2 -0
  182. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
  183. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +2 -2
  184. package/src/chain/validation/dataColumnSidecar.ts +230 -7
  185. package/src/db/buckets.ts +2 -2
  186. package/src/db/repositories/dataColumnSidecar.ts +4 -2
  187. package/src/db/repositories/dataColumnSidecarArchive.ts +4 -2
  188. package/src/metrics/metrics/lodestar.ts +34 -0
  189. package/src/network/interface.ts +3 -2
  190. package/src/network/libp2p/index.ts +24 -13
  191. package/src/network/network.ts +7 -4
  192. package/src/network/options.ts +7 -2
  193. package/src/network/processor/extractSlotRootFns.ts +32 -6
  194. package/src/network/processor/gossipHandlers.ts +320 -86
  195. package/src/network/processor/index.ts +304 -22
  196. package/src/network/reqresp/types.ts +13 -5
  197. package/src/sync/unknownBlock.ts +3 -3
  198. package/src/sync/utils/downloadByRange.ts +9 -7
  199. package/src/sync/utils/downloadByRoot.ts +16 -12
  200. package/src/util/blobs.ts +35 -15
  201. package/src/util/dataColumns.ts +69 -25
  202. package/src/util/execution.ts +49 -30
  203. package/src/util/sszBytes.ts +245 -3
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.42.0-dev.b10dfaca8d",
14
+ "version": "1.42.0-dev.bc0be71fb0",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -113,7 +113,7 @@
113
113
  "@chainsafe/discv5": "^12.0.1",
114
114
  "@chainsafe/enr": "^6.0.1",
115
115
  "@chainsafe/libp2p-noise": "^17.0.0",
116
- "@chainsafe/libp2p-quic": "^2.0.0",
116
+ "@chainsafe/libp2p-quic": "^2.0.1",
117
117
  "@chainsafe/persistent-merkle-tree": "^1.2.1",
118
118
  "@chainsafe/prometheus-gc-stats": "^1.0.0",
119
119
  "@chainsafe/pubkey-index-map": "^3.0.0",
@@ -135,18 +135,18 @@
135
135
  "@libp2p/peer-id": "^6.0.4",
136
136
  "@libp2p/prometheus-metrics": "^5.0.14",
137
137
  "@libp2p/tcp": "^11.0.13",
138
- "@lodestar/api": "^1.42.0-dev.b10dfaca8d",
139
- "@lodestar/config": "^1.42.0-dev.b10dfaca8d",
140
- "@lodestar/db": "^1.42.0-dev.b10dfaca8d",
141
- "@lodestar/fork-choice": "^1.42.0-dev.b10dfaca8d",
142
- "@lodestar/light-client": "^1.42.0-dev.b10dfaca8d",
143
- "@lodestar/logger": "^1.42.0-dev.b10dfaca8d",
144
- "@lodestar/params": "^1.42.0-dev.b10dfaca8d",
145
- "@lodestar/reqresp": "^1.42.0-dev.b10dfaca8d",
146
- "@lodestar/state-transition": "^1.42.0-dev.b10dfaca8d",
147
- "@lodestar/types": "^1.42.0-dev.b10dfaca8d",
148
- "@lodestar/utils": "^1.42.0-dev.b10dfaca8d",
149
- "@lodestar/validator": "^1.42.0-dev.b10dfaca8d",
138
+ "@lodestar/api": "^1.42.0-dev.bc0be71fb0",
139
+ "@lodestar/config": "^1.42.0-dev.bc0be71fb0",
140
+ "@lodestar/db": "^1.42.0-dev.bc0be71fb0",
141
+ "@lodestar/fork-choice": "^1.42.0-dev.bc0be71fb0",
142
+ "@lodestar/light-client": "^1.42.0-dev.bc0be71fb0",
143
+ "@lodestar/logger": "^1.42.0-dev.bc0be71fb0",
144
+ "@lodestar/params": "^1.42.0-dev.bc0be71fb0",
145
+ "@lodestar/reqresp": "^1.42.0-dev.bc0be71fb0",
146
+ "@lodestar/state-transition": "^1.42.0-dev.bc0be71fb0",
147
+ "@lodestar/types": "^1.42.0-dev.bc0be71fb0",
148
+ "@lodestar/utils": "^1.42.0-dev.bc0be71fb0",
149
+ "@lodestar/validator": "^1.42.0-dev.bc0be71fb0",
150
150
  "@multiformats/multiaddr": "^13.0.1",
151
151
  "datastore-core": "^11.0.2",
152
152
  "datastore-fs": "^11.0.2",
@@ -169,7 +169,7 @@
169
169
  "@libp2p/interface-internal": "^3.0.13",
170
170
  "@libp2p/logger": "^6.2.2",
171
171
  "@libp2p/utils": "^7.0.13",
172
- "@lodestar/spec-test-util": "^1.42.0-dev.b10dfaca8d",
172
+ "@lodestar/spec-test-util": "^1.42.0-dev.bc0be71fb0",
173
173
  "@types/js-yaml": "^4.0.5",
174
174
  "@types/qs": "^6.9.7",
175
175
  "@types/tmp": "^0.2.3",
@@ -186,5 +186,5 @@
186
186
  "beacon",
187
187
  "blockchain"
188
188
  ],
189
- "gitHead": "a8a22c99e8c5e8c860d776ffbdb72c1c1e563186"
189
+ "gitHead": "978992da6a57cef64da93d07d0e3badba4c4b6b9"
190
190
  }
@@ -57,7 +57,11 @@ import {
57
57
  kzgCommitmentToVersionedHash,
58
58
  reconstructBlobs,
59
59
  } from "../../../../util/blobs.js";
60
- import {getDataColumnSidecarsForGloas, getDataColumnSidecarsFromBlock} from "../../../../util/dataColumns.js";
60
+ import {
61
+ getBlobKzgCommitments,
62
+ getDataColumnSidecarsFromBlock,
63
+ getGloasDataColumnSidecars,
64
+ } from "../../../../util/dataColumns.js";
61
65
  import {isOptimisticBlock} from "../../../../util/forkChoice.js";
62
66
  import {kzg} from "../../../../util/kzg.js";
63
67
  import {promiseAllMaybeAsync} from "../../../../util/promises.js";
@@ -99,17 +103,20 @@ export function getBeaconBlockApi({
99
103
  const fork = config.getForkName(slot);
100
104
  const blockRoot = toRootHex(chain.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(signedBlock.message));
101
105
 
102
- // TODO GLOAS: handle new BlockInput type
103
106
  const blockForImport = chain.seenBlockInputCache.getByBlock({
104
107
  block: signedBlock,
105
108
  source: BlockInputSource.api,
106
109
  seenTimestampSec,
107
110
  blockRootHex: blockRoot,
108
111
  });
109
- let blobSidecars: deneb.BlobSidecars, dataColumnSidecars: fulu.DataColumnSidecars;
112
+ let blobSidecars: deneb.BlobSidecars, dataColumnSidecars: fulu.DataColumnSidecar[];
110
113
 
111
114
  if (isDenebBlockContents(signedBlockContents)) {
112
- if (isForkPostFulu(fork)) {
115
+ if (isForkPostGloas(fork)) {
116
+ // After gloas, data columns are not published with the block but when publishing the execution payload envelope
117
+ blobSidecars = [];
118
+ dataColumnSidecars = [];
119
+ } else if (isForkPostFulu(fork)) {
113
120
  const timer = metrics?.peerDas.dataColumnSidecarComputationTime.startTimer();
114
121
  // If the block was produced by this node, we will already have computed cells
115
122
  // Otherwise, we will compute them from the blobs in this function
@@ -124,7 +131,7 @@ export function getBeaconBlockApi({
124
131
  config,
125
132
  signedBlock as SignedBeaconBlock<ForkPostFulu>,
126
133
  cellsAndProofs
127
- );
134
+ ) as fulu.DataColumnSidecar[];
128
135
  timer?.();
129
136
  blobSidecars = [];
130
137
  } else if (isForkPostDeneb(fork)) {
@@ -210,7 +217,7 @@ export function getBeaconBlockApi({
210
217
  if (!blockLocallyProduced) {
211
218
  const parentBlock = chain.forkChoice.getBlockDefaultStatus(signedBlock.message.parentRoot);
212
219
  if (parentBlock === null) {
213
- chain.emitter.emit(ChainEvent.unknownParent, {
220
+ chain.emitter.emit(ChainEvent.blockUnknownParent, {
214
221
  blockInput: blockForImport,
215
222
  peer: IDENTITY_PEER_ID,
216
223
  source: BlockInputSource.api,
@@ -305,7 +312,7 @@ export function getBeaconBlockApi({
305
312
  .processBlock(blockForImport, opts)
306
313
  .catch((e) => {
307
314
  if (e instanceof BlockError && e.type.code === BlockErrorCode.PARENT_UNKNOWN) {
308
- chain.emitter.emit(ChainEvent.unknownParent, {
315
+ chain.emitter.emit(ChainEvent.blockUnknownParent, {
309
316
  blockInput: blockForImport,
310
317
  peer: IDENTITY_PEER_ID,
311
318
  source: BlockInputSource.api,
@@ -647,6 +654,8 @@ export function getBeaconBlockApi({
647
654
  const slot = envelope.slot;
648
655
  const fork = config.getForkName(slot);
649
656
  const blockRootHex = toRootHex(envelope.beaconBlockRoot);
657
+ const blockHashHex = toRootHex(envelope.payload.blockHash);
658
+ const stateRootHex = toRootHex(envelope.stateRoot);
650
659
 
651
660
  if (!isForkPostGloas(fork)) {
652
661
  throw new ApiError(400, `publishExecutionPayloadEnvelope not supported for pre-gloas fork=${fork}`);
@@ -664,7 +673,7 @@ export function getBeaconBlockApi({
664
673
  await validateApiExecutionPayloadEnvelope(chain, signedExecutionPayloadEnvelope);
665
674
 
666
675
  const isSelfBuild = envelope.builderIndex === BUILDER_INDEX_SELF_BUILD;
667
- let dataColumnSidecars: gloas.DataColumnSidecars = [];
676
+ let dataColumnSidecars: gloas.DataColumnSidecar[] = [];
668
677
 
669
678
  if (isSelfBuild) {
670
679
  // For self-builds, construct and publish data column sidecars from cached block production data
@@ -689,7 +698,7 @@ export function getBeaconBlockApi({
689
698
  ),
690
699
  }));
691
700
 
692
- dataColumnSidecars = getDataColumnSidecarsForGloas(slot, envelope.beaconBlockRoot, cellsAndProofs);
701
+ dataColumnSidecars = getGloasDataColumnSidecars(slot, envelope.beaconBlockRoot, cellsAndProofs);
693
702
  timer?.();
694
703
  }
695
704
  } else {
@@ -730,6 +739,8 @@ export function getBeaconBlockApi({
730
739
  const valLogMeta = {
731
740
  slot,
732
741
  blockRoot: blockRootHex,
742
+ blockHash: blockHashHex,
743
+ stateRoot: stateRootHex,
733
744
  builderIndex: envelope.builderIndex,
734
745
  isSelfBuild,
735
746
  dataColumns: dataColumnSidecars.length,
@@ -750,7 +761,17 @@ export function getBeaconBlockApi({
750
761
  () => chain.processExecutionPayload(payloadInput, {validSignature: true}),
751
762
  ];
752
763
 
753
- const sentPeersArr = await promiseAllMaybeAsync<number | void>(publishPromises);
764
+ const publishPromise = promiseAllMaybeAsync<number | void>(publishPromises);
765
+
766
+ chain.emitter.emit(routes.events.EventType.executionPayloadGossip, {
767
+ slot,
768
+ builderIndex: envelope.builderIndex,
769
+ blockHash: blockHashHex,
770
+ blockRoot: blockRootHex,
771
+ stateRoot: stateRootHex,
772
+ });
773
+
774
+ const sentPeersArr = await publishPromise;
754
775
 
755
776
  // Track metrics for data column publishing
756
777
  if (dataColumnSidecars.length > 0) {
@@ -774,15 +795,11 @@ export function getBeaconBlockApi({
774
795
  metrics?.dataColumns.bySource.inc({source: BlockInputSource.api}, dataColumnSidecars.length);
775
796
 
776
797
  if (chain.emitter.listenerCount(routes.events.EventType.dataColumnSidecar)) {
777
- // TODO GLOAS: revisit this, we likely don't wanna emit KZG commitments anymore
778
- const cachedResult = chain.blockProductionCache.get(blockRootHex) as ProduceFullGloas | undefined;
779
- const kzgCommitments = cachedResult?.blobsBundle.commitments.map(toHex) ?? [];
780
798
  for (const dataColumnSidecar of dataColumnSidecars) {
781
799
  chain.emitter.emit(routes.events.EventType.dataColumnSidecar, {
782
800
  blockRoot: blockRootHex,
783
801
  slot,
784
802
  index: dataColumnSidecar.index,
785
- kzgCommitments,
786
803
  });
787
804
  }
788
805
  }
@@ -906,7 +923,7 @@ export function getBeaconBlockApi({
906
923
  );
907
924
  }
908
925
 
909
- const blobKzgCommitments = (block.message.body as deneb.BeaconBlockBody).blobKzgCommitments;
926
+ const blobKzgCommitments = getBlobKzgCommitments(fork, block as SignedBeaconBlock<ForkPostFulu>);
910
927
  const blobCount = blobKzgCommitments.length;
911
928
 
912
929
  if (blobCount > 0) {
@@ -2,7 +2,7 @@ import {routes} from "@lodestar/api";
2
2
  import {ApplicationMethods} from "@lodestar/api/server";
3
3
  import {ExecutionStatus} from "@lodestar/fork-choice";
4
4
  import {ForkPostDeneb, ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
5
- import {BeaconState, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
5
+ import {BeaconState, DataColumnSidecar, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
6
6
  import {toRootHex} from "@lodestar/utils";
7
7
  import {getBlobKzgCommitments} from "../../../util/dataColumns.js";
8
8
  import {isOptimisticBlock} from "../../../util/forkChoice.js";
@@ -98,7 +98,7 @@ export function getDebugApi({
98
98
  const fork = config.getForkName(block.message.slot);
99
99
  const blockRoot = sszTypesFor(fork).BeaconBlock.hashTreeRoot(block.message);
100
100
 
101
- let dataColumnSidecars: DataColumnSidecars;
101
+ let dataColumnSidecars: DataColumnSidecar[];
102
102
 
103
103
  const blobCount = isForkPostDeneb(fork)
104
104
  ? getBlobKzgCommitments(fork, block as SignedBeaconBlock<ForkPostDeneb>).length
@@ -3,6 +3,7 @@ import {Logger, sleep} from "@lodestar/utils";
3
3
  import {Metrics} from "../metrics/metrics.js";
4
4
  import {DataColumnReconstructionCode, recoverDataColumnSidecars} from "../util/dataColumns.js";
5
5
  import {BlockInputColumns} from "./blocks/blockInput/index.js";
6
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/index.js";
6
7
  import {ChainEventEmitter} from "./emitter.js";
7
8
 
8
9
  /**
@@ -53,25 +54,25 @@ export class ColumnReconstructionTracker {
53
54
  this.maxDelayMs = this.config.getSlotComponentDurationMs(RECONSTRUCTION_DELAY_MAX_BPS);
54
55
  }
55
56
 
56
- triggerColumnReconstruction(blockInput: BlockInputColumns): void {
57
+ triggerColumnReconstruction(input: BlockInputColumns | PayloadEnvelopeInput): void {
57
58
  if (this.running) {
58
59
  return;
59
60
  }
60
61
 
61
- if (this.lastBlockRootHex === blockInput.blockRootHex) {
62
+ if (this.lastBlockRootHex === input.blockRootHex) {
62
63
  return;
63
64
  }
64
65
 
65
66
  // We don't care about the outcome of this call,
66
67
  // just that it has been triggered for this block root.
67
68
  this.running = true;
68
- this.lastBlockRootHex = blockInput.blockRootHex;
69
+ this.lastBlockRootHex = input.blockRootHex;
69
70
  const delay = this.minDelayMs + Math.random() * (this.maxDelayMs - this.minDelayMs);
70
71
  sleep(delay)
71
72
  .then(() => {
72
- const logCtx = {slot: blockInput.slot, root: blockInput.blockRootHex};
73
+ const logCtx = {slot: input.slot, root: input.blockRootHex};
73
74
  this.logger.debug("Attempting data column sidecar reconstruction", logCtx);
74
- recoverDataColumnSidecars(blockInput, this.emitter, this.metrics)
75
+ recoverDataColumnSidecars(input, this.emitter, this.metrics)
75
76
  .then((result) => {
76
77
  this.metrics?.recoverDataColumnSidecars.reconstructionResult.inc({result});
77
78
  this.logger.debug("Data column sidecar reconstruction complete", {...logCtx, result});
@@ -11,6 +11,7 @@ import {
11
11
  getDataColumnSidecarsFromExecution,
12
12
  } from "../util/execution.js";
13
13
  import {IBlockInput, isBlockInputBlobs} from "./blocks/blockInput/index.js";
14
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/index.js";
14
15
  import {ChainEventEmitter} from "./emitter.js";
15
16
 
16
17
  export type GetBlobsTrackerInit = {
@@ -43,22 +44,22 @@ export class GetBlobsTracker {
43
44
  this.config = init.config;
44
45
  }
45
46
 
46
- triggerGetBlobs(blockInput: IBlockInput): void {
47
- if (this.activeReconstructions.has(blockInput.blockRootHex)) {
47
+ triggerGetBlobs(input: IBlockInput | PayloadEnvelopeInput, onComplete?: () => void): void {
48
+ if (this.activeReconstructions.has(input.blockRootHex)) {
48
49
  return;
49
50
  }
50
51
 
51
- if (isBlockInputBlobs(blockInput)) {
52
+ if (!(input instanceof PayloadEnvelopeInput) && isBlockInputBlobs(input)) {
52
53
  // there is not preallocation for blob sidecars like there is for columns sidecars so no need to
53
54
  // store the index for the preallocated buffers
54
- this.activeReconstructions.add(blockInput.blockRootHex);
55
+ this.activeReconstructions.add(input.blockRootHex);
55
56
  callInNextEventLoop(() => {
56
- const logCtx = {slot: blockInput.slot, root: blockInput.blockRootHex};
57
+ const logCtx = {slot: input.slot, root: input.blockRootHex};
57
58
  this.logger.verbose("Trigger getBlobsV1 for block", logCtx);
58
- getBlobSidecarsFromExecution(this.config, this.executionEngine, this.metrics, this.emitter, blockInput).finally(
59
+ getBlobSidecarsFromExecution(this.config, this.executionEngine, this.metrics, this.emitter, input).finally(
59
60
  () => {
60
61
  this.logger.verbose("Completed getBlobsV1 for block", logCtx);
61
- this.activeReconstructions.delete(blockInput.blockRootHex);
62
+ this.activeReconstructions.delete(input.blockRootHex);
62
63
  }
63
64
  );
64
65
  });
@@ -72,7 +73,7 @@ export class GetBlobsTracker {
72
73
  this.blobsAndProofsBuffers[freeIndex] = {inUse: false, buffers: []};
73
74
  }
74
75
 
75
- const maxBlobs = this.config.getMaxBlobsPerBlock(computeEpochAtSlot(blockInput.slot));
76
+ const maxBlobs = this.config.getMaxBlobsPerBlock(computeEpochAtSlot(input.slot));
76
77
  // double check that there is enough pre-allocated space (blob schedule may have changed since the last use)
77
78
  const timer = this.metrics?.peerDas.getBlobsV2PreAllocationTime.startTimer();
78
79
  for (let i = 0; i < maxBlobs; i++) {
@@ -84,22 +85,23 @@ export class GetBlobsTracker {
84
85
 
85
86
  // We don't care about the outcome of this call,
86
87
  // just that it has been triggered for this block root.
87
- this.activeReconstructions.add(blockInput.blockRootHex);
88
+ this.activeReconstructions.add(input.blockRootHex);
88
89
  this.blobsAndProofsBuffers[freeIndex].inUse = true;
89
90
  callInNextEventLoop(() => {
90
- const logCtx = {slot: blockInput.slot, root: blockInput.blockRootHex};
91
+ const logCtx = {slot: input.slot, root: input.blockRootHex};
91
92
  this.logger.verbose("Trigger getBlobsV2 for block", logCtx);
92
93
  getDataColumnSidecarsFromExecution(
93
94
  this.config,
94
95
  this.executionEngine,
95
96
  this.emitter,
96
- blockInput,
97
+ input,
97
98
  this.metrics,
98
99
  this.blobsAndProofsBuffers[freeIndex].buffers
99
100
  )
100
101
  .then((result) => {
101
102
  this.logger.debug("getBlobsV2 result for block", {...logCtx, result});
102
103
  this.metrics?.dataColumns.dataColumnEngineResult.inc({result});
104
+ onComplete?.();
103
105
  })
104
106
  .catch((error) => {
105
107
  this.logger.debug("Error during getBlobsV2 for block", logCtx, error as Error);
@@ -107,7 +109,7 @@ export class GetBlobsTracker {
107
109
  })
108
110
  .finally(() => {
109
111
  this.logger.verbose("Completed getBlobsV2 for block", logCtx);
110
- this.activeReconstructions.delete(blockInput.blockRootHex);
112
+ this.activeReconstructions.delete(input.blockRootHex);
111
113
  this.blobsAndProofsBuffers[freeIndex].inUse = false;
112
114
  });
113
115
  });
@@ -120,6 +120,7 @@ export class ArchiveStore {
120
120
  opts: {
121
121
  genesisTime: this.chain.clock.genesisTime,
122
122
  dbLocation: this.opts.dbName,
123
+ nativeStateView: this.opts.nativeStateView ?? false,
123
124
  },
124
125
  config: this.chain.config,
125
126
  metrics: this.metrics,
@@ -3,7 +3,6 @@ import {
3
3
  DataAvailabilityStatus,
4
4
  ExecutionPayloadStatus,
5
5
  IBeaconStateView,
6
- type PubkeyCache,
7
6
  createBeaconStateViewForHistoricalRegen,
8
7
  } from "@lodestar/state-transition";
9
8
  import {byteArrayEquals} from "@lodestar/utils";
@@ -18,7 +17,7 @@ export async function getNearestState(
18
17
  slot: number,
19
18
  config: BeaconConfig,
20
19
  db: IBeaconDb,
21
- pubkeyCache: PubkeyCache
20
+ nativeStateView: boolean
22
21
  ): Promise<IBeaconStateView> {
23
22
  const stateBytesArr = await db.stateArchive.binaries({limit: 1, lte: slot, reverse: true});
24
23
  if (!stateBytesArr.length) {
@@ -26,7 +25,9 @@ export async function getNearestState(
26
25
  }
27
26
 
28
27
  const stateBytes = stateBytesArr[0];
29
- return createBeaconStateViewForHistoricalRegen(config, stateBytes, pubkeyCache);
28
+ return nativeStateView
29
+ ? createBeaconStateViewForHistoricalRegen({useNative: true, stateBytes})
30
+ : createBeaconStateViewForHistoricalRegen({useNative: false, config, stateBytes});
30
31
  }
31
32
 
32
33
  /**
@@ -36,13 +37,13 @@ export async function getHistoricalState(
36
37
  slot: number,
37
38
  config: BeaconConfig,
38
39
  db: IBeaconDb,
39
- pubkeyCache: PubkeyCache,
40
+ nativeStateView: boolean,
40
41
  metrics?: HistoricalStateRegenMetrics
41
42
  ): Promise<Uint8Array> {
42
43
  const regenTimer = metrics?.regenTime.startTimer();
43
44
 
44
45
  const loadStateTimer = metrics?.loadStateTime.startTimer();
45
- let state = await getNearestState(slot, config, db, pubkeyCache).catch((e) => {
46
+ let state = await getNearestState(slot, config, db, nativeStateView).catch((e) => {
46
47
  metrics?.regenErrorCount.inc({reason: RegenErrorType.loadState});
47
48
  throw e;
48
49
  });
@@ -20,7 +20,7 @@ export class HistoricalStateRegen implements HistoricalStateWorkerApi {
20
20
  private readonly api: ModuleThread<HistoricalStateWorkerApi>;
21
21
  private readonly logger: LoggerNode;
22
22
 
23
- constructor(modules: HistoricalStateRegenModules) {
23
+ private constructor(modules: HistoricalStateRegenModules) {
24
24
  this.api = modules.api;
25
25
  this.logger = modules.logger;
26
26
  modules.signal?.addEventListener("abort", () => this.close(), {once: true});
@@ -35,6 +35,7 @@ export class HistoricalStateRegen implements HistoricalStateWorkerApi {
35
35
  dbLocation: modules.opts.dbLocation,
36
36
  metricsEnabled: Boolean(modules.metrics),
37
37
  loggerOpts: modules.logger.toOpts(),
38
+ nativeStateView: modules.opts.nativeStateView,
38
39
  };
39
40
 
40
41
  const worker = new Worker(path.join(WORKER_DIR, "worker.js"), {
@@ -7,6 +7,7 @@ export type HistoricalStateRegenInitModules = {
7
7
  opts: {
8
8
  genesisTime: number;
9
9
  dbLocation: string;
10
+ nativeStateView: boolean;
10
11
  };
11
12
  config: BeaconConfig;
12
13
  logger: LoggerNode;
@@ -26,6 +27,7 @@ export type HistoricalStateWorkerData = {
26
27
  dbLocation: string;
27
28
  metricsEnabled: boolean;
28
29
  loggerOpts: LoggerNodeOpts;
30
+ nativeStateView: boolean;
29
31
  };
30
32
 
31
33
  export type HistoricalStateWorkerApi = {
@@ -3,7 +3,6 @@ import {Transfer, expose} from "@chainsafe/threads/worker";
3
3
  import {chainConfigFromJson, createBeaconConfig} from "@lodestar/config";
4
4
  import {LevelDbController} from "@lodestar/db/controller/level";
5
5
  import {getNodeLogger} from "@lodestar/logger/node";
6
- import {createPubkeyCache} from "@lodestar/state-transition";
7
6
  import {BeaconDb} from "../../../db/index.js";
8
7
  import {RegistryMetricCreator, collectNodeJSMetrics} from "../../../metrics/index.js";
9
8
  import {JobFnQueue} from "../../../util/queue/fnQueue.js";
@@ -52,9 +51,6 @@ const queue = new JobFnQueue(
52
51
  queueMetrics
53
52
  );
54
53
 
55
- // Reuse a single pubkey cache across all historical state regen calls in this worker
56
- const pubkeyCache = createPubkeyCache();
57
-
58
54
  const api: HistoricalStateWorkerApi = {
59
55
  async close() {
60
56
  abortController.abort();
@@ -66,7 +62,7 @@ const api: HistoricalStateWorkerApi = {
66
62
  historicalStateRegenMetrics?.regenRequestCount.inc();
67
63
 
68
64
  const stateBytes = await queue.push<Uint8Array>(() =>
69
- getHistoricalState(slot, config, db, pubkeyCache, historicalStateRegenMetrics)
65
+ getHistoricalState(slot, config, db, workerData.nativeStateView, historicalStateRegenMetrics)
70
66
  );
71
67
  const result = Transfer(stateBytes, [stateBytes.buffer]) as unknown as Uint8Array;
72
68
 
@@ -25,6 +25,7 @@ export type ArchiveStoreOpts = StatesArchiveOpts & {
25
25
  archiveDataEpochs?: number;
26
26
  pruneHistory?: boolean;
27
27
  serveHistoricalState?: boolean;
28
+ nativeStateView?: boolean;
28
29
  };
29
30
 
30
31
  export type ProposalStats = {
@@ -617,7 +617,7 @@ type BlockInputColumnsState =
617
617
  * - The block is not yet seen and all required sampled columns are seen
618
618
  * - The block is not yet seen and all required sampled columns are not yet seen
619
619
  */
620
- export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.DataColumnSidecars> {
620
+ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.DataColumnSidecar[]> {
621
621
  type = DAType.Columns as const;
622
622
 
623
623
  state: BlockInputColumnsState;
@@ -630,7 +630,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
630
630
  *
631
631
  * This is different from `dataPromise` which resolves when all data is available or could become available (e.g. through reconstruction)
632
632
  */
633
- protected computedDataPromise = createPromise<fulu.DataColumnSidecars>();
633
+ protected computedDataPromise = createPromise<fulu.DataColumnSidecar[]>();
634
634
 
635
635
  private constructor(
636
636
  init: BlockInputInit,
@@ -854,8 +854,8 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
854
854
  return this.state.versionedHashes;
855
855
  }
856
856
 
857
- getCustodyColumns(): fulu.DataColumnSidecars {
858
- const columns: fulu.DataColumnSidecars = [];
857
+ getCustodyColumns(): fulu.DataColumnSidecar[] {
858
+ const columns: fulu.DataColumnSidecar[] = [];
859
859
  for (const index of this.custodyColumns) {
860
860
  const column = this.columnsCache.get(index);
861
861
  if (column) {
@@ -876,8 +876,8 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
876
876
  return columns;
877
877
  }
878
878
 
879
- getSampledColumns(): fulu.DataColumnSidecars {
880
- const columns: fulu.DataColumnSidecars = [];
879
+ getSampledColumns(): fulu.DataColumnSidecar[] {
880
+ const columns: fulu.DataColumnSidecar[] = [];
881
881
  for (const index of this.sampledColumns) {
882
882
  const column = this.columnsCache.get(index);
883
883
  if (column) {
@@ -891,7 +891,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
891
891
  return [...this.columnsCache.values()];
892
892
  }
893
893
 
894
- getAllColumns(): fulu.DataColumnSidecars {
894
+ getAllColumns(): fulu.DataColumnSidecar[] {
895
895
  return this.getAllColumnsWithSource().map(({columnSidecar}) => columnSidecar);
896
896
  }
897
897
 
@@ -919,7 +919,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
919
919
  return this.state.hasComputedAllData;
920
920
  }
921
921
 
922
- waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<fulu.DataColumnSidecars> {
922
+ waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<fulu.DataColumnSidecar[]> {
923
923
  if (!this.state.hasComputedAllData) {
924
924
  return withTimeout(() => this.computedDataPromise.promise, timeout, signal);
925
925
  }
@@ -1,5 +1,5 @@
1
1
  import {ForkName} from "@lodestar/params";
2
- import {ColumnIndex, DataColumnSidecars, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
2
+ import {ColumnIndex, DataColumnSidecar, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
3
3
  import {VersionedHashes} from "../../../execution/index.js";
4
4
 
5
5
  export enum DAType {
@@ -9,7 +9,7 @@ export enum DAType {
9
9
  NoData = "no-data",
10
10
  }
11
11
 
12
- export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecars;
12
+ export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecar[];
13
13
 
14
14
  /**
15
15
  * Represents were input originated. Blocks and Data can come from different
@@ -108,9 +108,9 @@ export type MissingColumnMeta = {
108
108
  export interface IDataColumnsInput {
109
109
  readonly slot: Slot;
110
110
  readonly blockRootHex: string;
111
- getCustodyColumns(): DataColumnSidecars;
111
+ getCustodyColumns(): DataColumnSidecar[];
112
112
  hasComputedAllData(): boolean;
113
- waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<DataColumnSidecars>;
113
+ waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<DataColumnSidecar[]>;
114
114
  }
115
115
 
116
116
  /**