@lodestar/beacon-node 1.48.0-dev.f22c5ce63e → 1.48.0-rc.0

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 (296) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +4 -11
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/utils.js +14 -0
  6. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  7. package/lib/api/impl/config/index.d.ts.map +1 -1
  8. package/lib/api/impl/config/index.js +4 -1
  9. package/lib/api/impl/config/index.js.map +1 -1
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +39 -39
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
  14. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  15. package/lib/chain/archiveStore/archiveStore.js +5 -1
  16. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  17. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  19. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  20. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -1
  21. package/lib/chain/archiveStore/historicalState/metrics.js +12 -1
  22. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  23. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  24. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  25. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  26. package/lib/chain/archiveStore/historicalState/worker.js +4 -1
  27. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  28. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +9 -1
  29. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  30. package/lib/chain/archiveStore/utils/archiveBlocks.js +68 -38
  31. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  32. package/lib/chain/blocks/importBlock.d.ts +5 -1
  33. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  34. package/lib/chain/blocks/importBlock.js +12 -18
  35. package/lib/chain/blocks/importBlock.js.map +1 -1
  36. package/lib/chain/blocks/index.d.ts +8 -4
  37. package/lib/chain/blocks/index.d.ts.map +1 -1
  38. package/lib/chain/blocks/index.js +83 -17
  39. package/lib/chain/blocks/index.js.map +1 -1
  40. package/lib/chain/blocks/types.d.ts +8 -0
  41. package/lib/chain/blocks/types.d.ts.map +1 -1
  42. package/lib/chain/blocks/types.js.map +1 -1
  43. package/lib/chain/blocks/utils/chainSegment.d.ts +1 -1
  44. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  45. package/lib/chain/blocks/utils/chainSegment.js +26 -11
  46. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  47. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  48. package/lib/chain/blocks/writeBlockInputToDb.js +9 -16
  49. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  50. package/lib/chain/chain.d.ts +11 -5
  51. package/lib/chain/chain.d.ts.map +1 -1
  52. package/lib/chain/chain.js +129 -75
  53. package/lib/chain/chain.js.map +1 -1
  54. package/lib/chain/emitter.d.ts +1 -1
  55. package/lib/chain/emitter.js +1 -1
  56. package/lib/chain/errors/blockError.d.ts +19 -7
  57. package/lib/chain/errors/blockError.d.ts.map +1 -1
  58. package/lib/chain/errors/blockError.js +2 -2
  59. package/lib/chain/errors/blockError.js.map +1 -1
  60. package/lib/chain/errors/dataColumnSidecarError.d.ts +15 -2
  61. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
  62. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  63. package/lib/chain/errors/executionPayloadBid.d.ts +4 -0
  64. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  65. package/lib/chain/errors/executionPayloadBid.js +1 -0
  66. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  67. package/lib/chain/errors/executionPayloadEnvelope.d.ts +10 -11
  68. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  69. package/lib/chain/errors/executionPayloadEnvelope.js +0 -2
  70. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  71. package/lib/chain/errors/gossipValidation.d.ts +2 -1
  72. package/lib/chain/errors/gossipValidation.d.ts.map +1 -1
  73. package/lib/chain/errors/gossipValidation.js +1 -0
  74. package/lib/chain/errors/gossipValidation.js.map +1 -1
  75. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  76. package/lib/chain/forkChoice/index.js +2 -0
  77. package/lib/chain/forkChoice/index.js.map +1 -1
  78. package/lib/chain/interface.d.ts +4 -4
  79. package/lib/chain/interface.d.ts.map +1 -1
  80. package/lib/chain/lightClient/index.d.ts +3 -3
  81. package/lib/chain/lightClient/index.d.ts.map +1 -1
  82. package/lib/chain/lightClient/index.js +21 -23
  83. package/lib/chain/lightClient/index.js.map +1 -1
  84. package/lib/chain/lightClient/proofs.d.ts +2 -1
  85. package/lib/chain/lightClient/proofs.d.ts.map +1 -1
  86. package/lib/chain/lightClient/proofs.js +5 -1
  87. package/lib/chain/lightClient/proofs.js.map +1 -1
  88. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  89. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  90. package/lib/chain/prepareNextSlot.js +13 -13
  91. package/lib/chain/prepareNextSlot.js.map +1 -1
  92. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  93. package/lib/chain/produceBlock/produceBlockBody.js +46 -64
  94. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  95. package/lib/chain/validation/block.d.ts.map +1 -1
  96. package/lib/chain/validation/block.js +35 -54
  97. package/lib/chain/validation/block.js.map +1 -1
  98. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  99. package/lib/chain/validation/dataColumnSidecar.js +38 -13
  100. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  101. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  102. package/lib/chain/validation/executionPayloadBid.js +56 -40
  103. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  104. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  105. package/lib/chain/validation/executionPayloadEnvelope.js +10 -29
  106. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  107. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  108. package/lib/chain/validation/payloadAttestationMessage.js +5 -6
  109. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  110. package/lib/chain/validatorMonitor.d.ts +7 -1
  111. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  112. package/lib/chain/validatorMonitor.js +22 -5
  113. package/lib/chain/validatorMonitor.js.map +1 -1
  114. package/lib/db/beacon.d.ts +14 -5
  115. package/lib/db/beacon.d.ts.map +1 -1
  116. package/lib/db/beacon.js +17 -3
  117. package/lib/db/beacon.js.map +1 -1
  118. package/lib/db/dataColumnStore.d.ts +39 -0
  119. package/lib/db/dataColumnStore.d.ts.map +1 -0
  120. package/lib/db/dataColumnStore.js +81 -0
  121. package/lib/db/dataColumnStore.js.map +1 -0
  122. package/lib/db/flatFileStore/atomicWrite.d.ts +8 -0
  123. package/lib/db/flatFileStore/atomicWrite.d.ts.map +1 -0
  124. package/lib/db/flatFileStore/atomicWrite.js +61 -0
  125. package/lib/db/flatFileStore/atomicWrite.js.map +1 -0
  126. package/lib/db/flatFileStore/dcolFormat.d.ts +90 -0
  127. package/lib/db/flatFileStore/dcolFormat.d.ts.map +1 -0
  128. package/lib/db/flatFileStore/dcolFormat.js +286 -0
  129. package/lib/db/flatFileStore/dcolFormat.js.map +1 -0
  130. package/lib/db/flatFileStore/errors.d.ts +82 -0
  131. package/lib/db/flatFileStore/errors.d.ts.map +1 -0
  132. package/lib/db/flatFileStore/errors.js +32 -0
  133. package/lib/db/flatFileStore/errors.js.map +1 -0
  134. package/lib/db/flatFileStore/flatFileStore.d.ts +41 -0
  135. package/lib/db/flatFileStore/flatFileStore.d.ts.map +1 -0
  136. package/lib/db/flatFileStore/flatFileStore.js +251 -0
  137. package/lib/db/flatFileStore/flatFileStore.js.map +1 -0
  138. package/lib/db/flatFileStore/index.d.ts +4 -0
  139. package/lib/db/flatFileStore/index.d.ts.map +1 -0
  140. package/lib/db/flatFileStore/index.js +2 -0
  141. package/lib/db/flatFileStore/index.js.map +1 -0
  142. package/lib/db/flatFileStore/interface.d.ts +25 -0
  143. package/lib/db/flatFileStore/interface.d.ts.map +1 -0
  144. package/lib/db/flatFileStore/interface.js +2 -0
  145. package/lib/db/flatFileStore/interface.js.map +1 -0
  146. package/lib/db/flatFileStore/metrics.d.ts +24 -0
  147. package/lib/db/flatFileStore/metrics.d.ts.map +1 -0
  148. package/lib/db/flatFileStore/metrics.js +25 -0
  149. package/lib/db/flatFileStore/metrics.js.map +1 -0
  150. package/lib/db/flatFileStore/path.d.ts +9 -0
  151. package/lib/db/flatFileStore/path.d.ts.map +1 -0
  152. package/lib/db/flatFileStore/path.js +21 -0
  153. package/lib/db/flatFileStore/path.js.map +1 -0
  154. package/lib/db/flatFileStore/slotIndex.d.ts +14 -0
  155. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -0
  156. package/lib/db/flatFileStore/slotIndex.js +46 -0
  157. package/lib/db/flatFileStore/slotIndex.js.map +1 -0
  158. package/lib/db/flatFileStore/snappy.d.ts +3 -0
  159. package/lib/db/flatFileStore/snappy.d.ts.map +1 -0
  160. package/lib/db/flatFileStore/snappy.js +12 -0
  161. package/lib/db/flatFileStore/snappy.js.map +1 -0
  162. package/lib/db/index.d.ts +1 -0
  163. package/lib/db/index.d.ts.map +1 -1
  164. package/lib/db/interface.d.ts +8 -1
  165. package/lib/db/interface.d.ts.map +1 -1
  166. package/lib/db/repositories/blockArchive.d.ts +8 -1
  167. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  168. package/lib/db/repositories/blockArchive.js +65 -28
  169. package/lib/db/repositories/blockArchive.js.map +1 -1
  170. package/lib/db/repositories/blockArchiveIndex.d.ts +1 -2
  171. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  172. package/lib/db/repositories/blockArchiveIndex.js +3 -7
  173. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  174. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  175. package/lib/execution/builder/validateBid.js +8 -5
  176. package/lib/execution/builder/validateBid.js.map +1 -1
  177. package/lib/execution/engine/mock.d.ts.map +1 -1
  178. package/lib/execution/engine/mock.js +4 -1
  179. package/lib/execution/engine/mock.js.map +1 -1
  180. package/lib/metrics/metrics/lodestar.d.ts +22 -3
  181. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  182. package/lib/metrics/metrics/lodestar.js +60 -6
  183. package/lib/metrics/metrics/lodestar.js.map +1 -1
  184. package/lib/monitoring/clientStats.js +1 -1
  185. package/lib/monitoring/clientStats.js.map +1 -1
  186. package/lib/network/gossip/encoding.d.ts.map +1 -1
  187. package/lib/network/gossip/encoding.js +0 -7
  188. package/lib/network/gossip/encoding.js.map +1 -1
  189. package/lib/network/gossip/topic.d.ts +2 -1
  190. package/lib/network/gossip/topic.d.ts.map +1 -1
  191. package/lib/network/gossip/topic.js +4 -20
  192. package/lib/network/gossip/topic.js.map +1 -1
  193. package/lib/network/network.js +2 -2
  194. package/lib/network/network.js.map +1 -1
  195. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  196. package/lib/network/processor/gossipHandlers.js +388 -285
  197. package/lib/network/processor/gossipHandlers.js.map +1 -1
  198. package/lib/network/processor/index.d.ts +49 -3
  199. package/lib/network/processor/index.d.ts.map +1 -1
  200. package/lib/network/processor/index.js +254 -114
  201. package/lib/network/processor/index.js.map +1 -1
  202. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  203. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +112 -91
  204. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  205. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  206. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +2 -0
  207. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  208. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  209. package/lib/network/reqresp/protocols.js +6 -22
  210. package/lib/network/reqresp/protocols.js.map +1 -1
  211. package/lib/network/reqresp/rateLimit.js +2 -1
  212. package/lib/network/reqresp/rateLimit.js.map +1 -1
  213. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts +2 -1
  214. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -1
  215. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +14 -9
  216. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  217. package/lib/node/nodejs.d.ts +2 -1
  218. package/lib/node/nodejs.d.ts.map +1 -1
  219. package/lib/node/nodejs.js +4 -2
  220. package/lib/node/nodejs.js.map +1 -1
  221. package/lib/sync/range/range.d.ts.map +1 -1
  222. package/lib/sync/range/range.js +24 -1
  223. package/lib/sync/range/range.js.map +1 -1
  224. package/lib/util/sszBytes.d.ts +6 -0
  225. package/lib/util/sszBytes.d.ts.map +1 -1
  226. package/lib/util/sszBytes.js +1 -1
  227. package/lib/util/sszBytes.js.map +1 -1
  228. package/package.json +18 -19
  229. package/src/api/impl/beacon/blocks/index.ts +8 -14
  230. package/src/api/impl/beacon/state/utils.ts +15 -0
  231. package/src/api/impl/config/index.ts +4 -1
  232. package/src/api/impl/validator/index.ts +44 -43
  233. package/src/chain/archiveStore/archiveStore.ts +12 -1
  234. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +1 -0
  235. package/src/chain/archiveStore/historicalState/metrics.ts +14 -1
  236. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  237. package/src/chain/archiveStore/historicalState/worker.ts +4 -1
  238. package/src/chain/archiveStore/utils/archiveBlocks.ts +73 -42
  239. package/src/chain/blocks/importBlock.ts +25 -20
  240. package/src/chain/blocks/index.ts +120 -23
  241. package/src/chain/blocks/types.ts +9 -0
  242. package/src/chain/blocks/utils/chainSegment.ts +26 -12
  243. package/src/chain/blocks/writeBlockInputToDb.ts +10 -17
  244. package/src/chain/chain.ts +153 -84
  245. package/src/chain/emitter.ts +1 -1
  246. package/src/chain/errors/blockError.ts +22 -10
  247. package/src/chain/errors/dataColumnSidecarError.ts +24 -8
  248. package/src/chain/errors/executionPayloadBid.ts +2 -0
  249. package/src/chain/errors/executionPayloadEnvelope.ts +14 -11
  250. package/src/chain/errors/gossipValidation.ts +1 -0
  251. package/src/chain/forkChoice/index.ts +2 -0
  252. package/src/chain/interface.ts +4 -4
  253. package/src/chain/lightClient/index.ts +32 -36
  254. package/src/chain/lightClient/proofs.ts +10 -0
  255. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  256. package/src/chain/prepareNextSlot.ts +16 -16
  257. package/src/chain/produceBlock/produceBlockBody.ts +50 -71
  258. package/src/chain/validation/block.ts +35 -70
  259. package/src/chain/validation/dataColumnSidecar.ts +47 -14
  260. package/src/chain/validation/executionPayloadBid.ts +62 -44
  261. package/src/chain/validation/executionPayloadEnvelope.ts +10 -37
  262. package/src/chain/validation/payloadAttestationMessage.ts +8 -9
  263. package/src/chain/validatorMonitor.ts +24 -7
  264. package/src/db/beacon.ts +33 -6
  265. package/src/db/dataColumnStore.ts +113 -0
  266. package/src/db/flatFileStore/atomicWrite.ts +65 -0
  267. package/src/db/flatFileStore/dcolFormat.ts +389 -0
  268. package/src/db/flatFileStore/errors.ts +53 -0
  269. package/src/db/flatFileStore/flatFileStore.ts +310 -0
  270. package/src/db/flatFileStore/index.ts +3 -0
  271. package/src/db/flatFileStore/interface.ts +21 -0
  272. package/src/db/flatFileStore/metrics.ts +48 -0
  273. package/src/db/flatFileStore/path.ts +32 -0
  274. package/src/db/flatFileStore/slotIndex.ts +56 -0
  275. package/src/db/flatFileStore/snappy.ts +14 -0
  276. package/src/db/index.ts +1 -0
  277. package/src/db/interface.ts +9 -1
  278. package/src/db/repositories/blockArchive.ts +89 -30
  279. package/src/db/repositories/blockArchiveIndex.ts +4 -9
  280. package/src/execution/builder/validateBid.ts +10 -6
  281. package/src/execution/engine/mock.ts +4 -1
  282. package/src/metrics/metrics/lodestar.ts +63 -6
  283. package/src/monitoring/clientStats.ts +1 -1
  284. package/src/network/gossip/encoding.ts +0 -7
  285. package/src/network/gossip/topic.ts +3 -25
  286. package/src/network/network.ts +2 -2
  287. package/src/network/processor/gossipHandlers.ts +500 -355
  288. package/src/network/processor/index.ts +287 -165
  289. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +139 -105
  290. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +2 -0
  291. package/src/network/reqresp/protocols.ts +7 -24
  292. package/src/network/reqresp/rateLimit.ts +2 -1
  293. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +15 -7
  294. package/src/node/nodejs.ts +6 -1
  295. package/src/sync/range/range.ts +23 -1
  296. package/src/util/sszBytes.ts +1 -1
@@ -1,7 +1,6 @@
1
1
  import {Db, encodeKey} from "@lodestar/db";
2
2
  import {ForkAll} from "@lodestar/params";
3
3
  import {Root, SSZTypesFor, SignedBeaconBlock, Slot, ssz} from "@lodestar/types";
4
- import {intToBytes} from "@lodestar/utils";
5
4
  import {Bucket, getBucketNameByValue} from "../buckets.js";
6
5
 
7
6
  export const rootIndexBucketId = getBucketNameByValue(Bucket.index_blockArchiveRootIndex);
@@ -15,14 +14,6 @@ export async function getParentRootIndex(db: Db, parentRoot: Root): Promise<Uint
15
14
  return db.get(getParentRootIndexKey(parentRoot), {bucketId: parentRootIndexBucketId});
16
15
  }
17
16
 
18
- export async function storeRootIndex(db: Db, slot: Slot, blockRoot: Root): Promise<void> {
19
- return db.put(getRootIndexKey(blockRoot), intToBytes(slot, 8, "be"), {bucketId: rootIndexBucketId});
20
- }
21
-
22
- export async function storeParentRootIndex(db: Db, slot: Slot, parentRoot: Root): Promise<void> {
23
- return db.put(getParentRootIndexKey(parentRoot), intToBytes(slot, 8, "be"), {bucketId: parentRootIndexBucketId});
24
- }
25
-
26
17
  export async function deleteRootIndex(
27
18
  db: Db,
28
19
  signedBeaconBlockType: SSZTypesFor<ForkAll, "SignedBeaconBlock">,
@@ -43,3 +34,7 @@ export function getParentRootIndexKey(parentRoot: Root): Uint8Array {
43
34
  export function getRootIndexKey(root: Root): Uint8Array {
44
35
  return encodeKey(Bucket.index_blockArchiveRootIndex, root);
45
36
  }
37
+
38
+ export function getSlotIndexKey(slot: Slot): Uint8Array {
39
+ return encodeKey(Bucket.index_mainChain, slot);
40
+ }
@@ -56,6 +56,16 @@ export async function validateBuilderApiExecutionPayloadBid(
56
56
  );
57
57
  }
58
58
 
59
+ if (byteArrayEquals(bid.blockHash, bid.parentBlockHash)) {
60
+ throw Error(`Bid block hash ${toRootHex(bid.blockHash)} must not equal its parent block hash`);
61
+ }
62
+
63
+ const blobKzgCommitmentsLen = bid.blobKzgCommitments.length;
64
+ const maxBlobsPerBlock = chain.config.getMaxBlobsPerBlock(computeEpochAtSlot(bid.slot));
65
+ if (blobKzgCommitmentsLen > maxBlobsPerBlock) {
66
+ throw Error(`Bid has too many KZG commitments len=${blobKzgCommitmentsLen} limit=${maxBlobsPerBlock}`);
67
+ }
68
+
59
69
  const totalPayment = getBuilderBidTotalGwei(bid, entry.maxExecutionPayment);
60
70
  if (totalPayment < entry.minBid) {
61
71
  throw Error(
@@ -100,12 +110,6 @@ export async function validateBuilderApiExecutionPayloadBid(
100
110
  );
101
111
  }
102
112
 
103
- const blobKzgCommitmentsLen = bid.blobKzgCommitments.length;
104
- const maxBlobsPerBlock = chain.config.getMaxBlobsPerBlock(computeEpochAtSlot(bid.slot));
105
- if (blobKzgCommitmentsLen > maxBlobsPerBlock) {
106
- throw Error(`Bid has too many KZG commitments len=${blobKzgCommitmentsLen} limit=${maxBlobsPerBlock}`);
107
- }
108
-
109
113
  // The coverage check only applies to the staked collateral payment, a pure execution
110
114
  // layer payment bid has nothing to cover on-chain
111
115
  if (bid.value > 0 && !state.canBuilderCoverBid(bid.builderIndex, bid.value)) {
@@ -296,7 +296,10 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
296
296
 
297
297
  // 5. Client software MUST update its forkchoice state if payloads referenced by forkchoiceState.headBlockHash and
298
298
  // forkchoiceState.finalizedBlockHash are VALID.
299
- if (!this.validBlocks.has(finalizedBlockHash)) {
299
+ //
300
+ // A zero finalizedBlockHash means "no finalized execution block" (e.g. the finalized checkpoint has no execution
301
+ // payload, pre-merge/pre-TTD). Real EL clients accept this, so the mock must not treat it as an unknown block.
302
+ if (finalizedBlockHash !== ZERO_HASH_HEX && !this.validBlocks.has(finalizedBlockHash)) {
300
303
  throw Error(`Unknown finalizedBlockHash ${finalizedBlockHash}`);
301
304
  }
302
305
  this.headBlockHash = headBlockHash;
@@ -2,6 +2,7 @@
2
2
  import {NotReorgedReason} from "@lodestar/fork-choice";
3
3
  import {ArchiveStoreTask} from "../../chain/archiveStore/archiveStore.js";
4
4
  import {FrequencyStateArchiveStep} from "../../chain/archiveStore/strategies/frequencyStateArchiveStrategy.js";
5
+ import type {LateCanonicalBlockReason} from "../../chain/archiveStore/utils/archiveBlocks.js";
5
6
  import {BlockInputSource} from "../../chain/blocks/blockInput/index.js";
6
7
  import {PayloadErrorCode} from "../../chain/blocks/importExecutionPayload.js";
7
8
  import {
@@ -20,6 +21,7 @@ import {ReprocessStatus} from "../../chain/reprocess.js";
20
21
  import {RejectReason} from "../../chain/seenCache/seenAttestationData.js";
21
22
  import {CacheItemType} from "../../chain/stateCache/types.js";
22
23
  import {OpSource} from "../../chain/validatorMonitor.js";
24
+ import type {FlatFileStoreOperation} from "../../db/flatFileStore/metrics.js";
23
25
  import {ExecutionPayloadStatus} from "../../execution/index.js";
24
26
  import {GossipType} from "../../network/index.js";
25
27
  import {CannotAcceptWorkReason, ReprocessRejectReason} from "../../network/processor/index.js";
@@ -1047,6 +1049,11 @@ export function createLodestarMetrics(
1047
1049
  name: "lodestar_import_block_set_head_after_cutoff_total",
1048
1050
  help: "Total times an imported block is set as head after ATTESTATION_DUE_BPS of the slot",
1049
1051
  }),
1052
+ lateCanonicalBlock: register.counter<{reason: LateCanonicalBlockReason}>({
1053
+ name: "lodestar_import_block_late_canonical_total",
1054
+ help: "Total finalized-canonical blocks this node imported after the attestation cutoff; reason distinguishes this node's processing lag (slow_import) from late reception (late_receive)",
1055
+ labelNames: ["reason"],
1056
+ }),
1050
1057
  bySource: register.gauge<{source: BlockInputSource}>({
1051
1058
  name: "lodestar_import_block_by_source_total",
1052
1059
  help: "Total number of imported blocks by source",
@@ -1352,11 +1359,6 @@ export function createLodestarMetrics(
1352
1359
  help: "Total number of InsertOutcome as a result of adding an execution payload bid from gossip to the pool",
1353
1360
  labelNames: ["insertOutcome"],
1354
1361
  }),
1355
- apiInsertOutcome: register.counter<{insertOutcome: InsertOutcome}>({
1356
- name: "lodestar_oppool_execution_payload_bid_pool_api_insert_outcome_total",
1357
- help: "Total number of InsertOutcome as a result of adding an execution payload bid from api to the pool",
1358
- labelNames: ["insertOutcome"],
1359
- }),
1360
1362
  apiValidationTime: register.histogram({
1361
1363
  name: "lodestar_api_execution_payload_bid_validation_time_seconds",
1362
1364
  help: "Time elapsed for signed execution payload bid validation - api path",
@@ -2098,7 +2100,7 @@ export function createLodestarMetrics(
2098
2100
  }),
2099
2101
  dbSizeTotal: register.gauge({
2100
2102
  name: "lodestar_db_size_bytes_total",
2101
- help: "Approximate number of bytes of file system space used by db",
2103
+ help: "Approximate number of bytes of file system space used by LevelDB",
2102
2104
  }),
2103
2105
  dbApproximateSizeTime: register.histogram({
2104
2106
  name: "lodestar_db_approximate_size_time_seconds",
@@ -2107,6 +2109,61 @@ export function createLodestarMetrics(
2107
2109
  }),
2108
2110
  },
2109
2111
 
2112
+ flatFileStore: {
2113
+ operationDuration: {
2114
+ read: register.histogram({
2115
+ name: "lodestar_flat_file_store_read_duration_seconds",
2116
+ help: "Duration of flat file store reads in seconds",
2117
+ buckets: [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05],
2118
+ }),
2119
+ write: register.histogram({
2120
+ name: "lodestar_flat_file_store_write_duration_seconds",
2121
+ help: "Duration of flat file store writes in seconds",
2122
+ buckets: [0.005, 0.01, 0.05, 0.1, 0.5, 1],
2123
+ }),
2124
+ delete: register.histogram({
2125
+ name: "lodestar_flat_file_store_delete_duration_seconds",
2126
+ help: "Duration of flat file store deletions in seconds",
2127
+ buckets: [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05],
2128
+ }),
2129
+ prune: register.histogram({
2130
+ name: "lodestar_flat_file_store_prune_duration_seconds",
2131
+ help: "Duration of flat file store pruning in seconds",
2132
+ buckets: [0.0005, 0.01, 0.05, 0.5, 5, 30],
2133
+ }),
2134
+ },
2135
+ operationErrors: register.counter<{operation: FlatFileStoreOperation}>({
2136
+ name: "lodestar_flat_file_store_operation_errors_total",
2137
+ help: "Total count of failed flat file store operations",
2138
+ labelNames: ["operation"],
2139
+ }),
2140
+ readBytes: register.counter({
2141
+ name: "lodestar_flat_file_store_read_bytes_total",
2142
+ help: "Total bytes read from flat file storage",
2143
+ }),
2144
+ writeBytes: register.counter({
2145
+ name: "lodestar_flat_file_store_write_bytes_total",
2146
+ help: "Total bytes written to flat file storage",
2147
+ }),
2148
+ prunedDirectories: register.counter({
2149
+ name: "lodestar_flat_file_store_pruned_directories_total",
2150
+ help: "Total count of slot directories pruned from flat file storage",
2151
+ }),
2152
+ slotIndexSize: register.gauge({
2153
+ name: "lodestar_flat_file_store_indexed_slots",
2154
+ help: "Count of indexed flat file slot directories, including empty directories awaiting pruning",
2155
+ }),
2156
+ startupDuration: register.histogram({
2157
+ name: "lodestar_flat_file_store_startup_duration_seconds",
2158
+ help: "Duration of flat file store slot index reconstruction in seconds",
2159
+ buckets: [0.1, 0.5, 1, 5, 10, 30, 60, 300],
2160
+ }),
2161
+ startupErrors: register.counter({
2162
+ name: "lodestar_flat_file_store_startup_errors_total",
2163
+ help: "Total count of flat file store startup failures",
2164
+ }),
2165
+ },
2166
+
2110
2167
  pruneHistory: {
2111
2168
  pruneCount: register.gauge({
2112
2169
  name: "lodestar_prune_history_prune_count_total",
@@ -107,7 +107,7 @@ function createBeaconNodeStats(): ClientStats {
107
107
  metricName: "lodestar_db_size_bytes_total",
108
108
  jsonType: JsonType.Number,
109
109
  defaultValue: 0,
110
- description: "Amount of bytes consumed on disk by the beacon node's database",
110
+ description: "Amount of bytes consumed on disk by the beacon node's LevelDB database",
111
111
  }),
112
112
  networkLibp2pBytesTotalReceive: new MetricProperty({
113
113
  jsonKey: "network_libp2p_bytes_total_receive",
@@ -1,7 +1,6 @@
1
1
  import type {Message} from "@libp2p/gossipsub";
2
2
  import type {RPC} from "@libp2p/gossipsub/message";
3
3
  import type {DataTransform} from "@libp2p/gossipsub/types";
4
- // snappyjs is better for compression for smaller payloads
5
4
  import xxhashFactory from "xxhash-wasm";
6
5
  import {digest} from "@chainsafe/as-sha256";
7
6
  import snappyWasm from "@chainsafe/snappy-wasm";
@@ -123,9 +122,6 @@ export class DataTransformSnappy implements DataTransform {
123
122
  if (uncompressedDataLength > maxSize) {
124
123
  throw Error(`ssz_snappy decoded data length ${uncompressedDataLength} > ${maxSize}`);
125
124
  }
126
- if (uncompressedDataLength > sszType.maxSize) {
127
- throw Error(`ssz_snappy decoded data length ${uncompressedDataLength} > ${sszType.maxSize}`);
128
- }
129
125
 
130
126
  // Only after sanity length checks, we can decompress the data
131
127
  // Using Buffer.alloc() instead of Buffer.allocUnsafe() to mitigate high GC pressure observed in some environments
@@ -146,9 +142,6 @@ export class DataTransformSnappy implements DataTransform {
146
142
  if (data.length > maxSize) {
147
143
  throw Error(`ssz_snappy encoded data length ${data.length} > ${maxSize}`);
148
144
  }
149
- if (data.length > sszType.maxSize) {
150
- throw Error(`ssz_snappy encoded data length ${data.length} > ${sszType.maxSize}`);
151
- }
152
145
 
153
146
  // Using Buffer.alloc() instead of Buffer.allocUnsafe() to mitigate high GC pressure observed in some environments
154
147
  const compressedData = Buffer.alloc(snappyWasm.max_compress_len(data.length));
@@ -4,17 +4,11 @@ import {
4
4
  ATTESTATION_SUBNET_COUNT,
5
5
  ForkName,
6
6
  ForkSeq,
7
- MAX_ATTESTER_SLASHING_SIZE,
8
- MAX_DATA_COLUMN_SIDECAR_SIZE,
9
- MAX_SIGNED_AGGREGATE_AND_PROOF_SIZE,
10
- MAX_SIGNED_EXECUTION_PAYLOAD_BID_SIZE,
11
- MAX_SIGNED_EXECUTION_PAYLOAD_BID_SIZE_HEZE,
12
7
  SYNC_COMMITTEE_SUBNET_COUNT,
13
8
  isForkPostAltair,
14
9
  isForkPostElectra,
15
10
  isForkPostFulu,
16
11
  isForkPostGloas,
17
- isForkPostHeze,
18
12
  } from "@lodestar/params";
19
13
  import {Attestation, SingleAttestation, ssz, sszTypesFor} from "@lodestar/types";
20
14
  import {GossipAction, GossipActionError, GossipErrorCode} from "../../chain/errors/gossipValidation.js";
@@ -139,27 +133,11 @@ export function getGossipSSZType(topic: GossipTopic) {
139
133
  }
140
134
 
141
135
  /**
142
- * Return the maximum uncompressed SSZ byte length accepted for a gossip object.
136
+ * Return the maximum uncompressed SSZ byte length accepted for a gossip object, the SSZ type max size
137
+ * or MAX_PAYLOAD_SIZE, whichever is smaller.
143
138
  */
144
139
  export function getGossipSSZMaxSize(topic: GossipTopic, maxPayloadSize: number, sszType?: CompositeTypeAny): number {
145
- const {fork} = topic.boundary;
146
- // Gloas progressive containers have broad theoretical SSZ max sizes; use the preset p2p bounds instead.
147
- switch (topic.type) {
148
- case GossipType.beacon_block:
149
- return maxPayloadSize;
150
- case GossipType.beacon_aggregate_and_proof:
151
- return isForkPostGloas(fork) ? MAX_SIGNED_AGGREGATE_AND_PROOF_SIZE : (sszType ?? getGossipSSZType(topic)).maxSize;
152
- case GossipType.attester_slashing:
153
- return isForkPostGloas(fork) ? MAX_ATTESTER_SLASHING_SIZE : (sszType ?? getGossipSSZType(topic)).maxSize;
154
- case GossipType.data_column_sidecar:
155
- return isForkPostGloas(fork) ? MAX_DATA_COLUMN_SIDECAR_SIZE : (sszType ?? getGossipSSZType(topic)).maxSize;
156
- case GossipType.execution_payload:
157
- return maxPayloadSize;
158
- case GossipType.execution_payload_bid:
159
- return isForkPostHeze(fork) ? MAX_SIGNED_EXECUTION_PAYLOAD_BID_SIZE_HEZE : MAX_SIGNED_EXECUTION_PAYLOAD_BID_SIZE;
160
- default:
161
- return (sszType ?? getGossipSSZType(topic)).maxSize;
162
- }
140
+ return Math.min((sszType ?? getGossipSSZType(topic)).maxSize, maxPayloadSize);
163
141
  }
164
142
 
165
143
  /**
@@ -481,7 +481,7 @@ export class Network implements INetwork {
481
481
  }
482
482
 
483
483
  async publishLightClientFinalityUpdate(update: LightClientFinalityUpdate): Promise<number> {
484
- const epoch = computeEpochAtSlot(update.signatureSlot);
484
+ const epoch = computeEpochAtSlot(update.attestedHeader.beacon.slot);
485
485
  const boundary = this.config.getForkBoundaryAtEpoch(epoch);
486
486
 
487
487
  return this.publishGossip<GossipType.light_client_finality_update>(
@@ -491,7 +491,7 @@ export class Network implements INetwork {
491
491
  }
492
492
 
493
493
  async publishLightClientOptimisticUpdate(update: LightClientOptimisticUpdate): Promise<number> {
494
- const epoch = computeEpochAtSlot(update.signatureSlot);
494
+ const epoch = computeEpochAtSlot(update.attestedHeader.beacon.slot);
495
495
  const boundary = this.config.getForkBoundaryAtEpoch(epoch);
496
496
 
497
497
  return this.publishGossip<GossipType.light_client_optimistic_update>(