@lodestar/beacon-node 1.48.0-dev.b71ab45af3 → 1.48.0-dev.bb3ffba9e9

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 (230) 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 -4
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/validator/index.d.ts.map +1 -1
  5. package/lib/api/impl/validator/index.js +39 -39
  6. package/lib/api/impl/validator/index.js.map +1 -1
  7. package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
  8. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  9. package/lib/chain/archiveStore/archiveStore.js +1 -0
  10. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  11. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  12. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  13. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  14. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -1
  15. package/lib/chain/archiveStore/historicalState/metrics.js +12 -1
  16. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  17. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  18. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  19. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  20. package/lib/chain/archiveStore/historicalState/worker.js +4 -1
  21. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  22. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  23. package/lib/chain/archiveStore/utils/archiveBlocks.js +31 -34
  24. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  25. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  26. package/lib/chain/blocks/importBlock.js +0 -13
  27. package/lib/chain/blocks/importBlock.js.map +1 -1
  28. package/lib/chain/blocks/index.d.ts.map +1 -1
  29. package/lib/chain/blocks/index.js +3 -2
  30. package/lib/chain/blocks/index.js.map +1 -1
  31. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  32. package/lib/chain/blocks/writeBlockInputToDb.js +9 -16
  33. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  34. package/lib/chain/chain.d.ts +9 -3
  35. package/lib/chain/chain.d.ts.map +1 -1
  36. package/lib/chain/chain.js +127 -73
  37. package/lib/chain/chain.js.map +1 -1
  38. package/lib/chain/emitter.d.ts +1 -1
  39. package/lib/chain/emitter.js +1 -1
  40. package/lib/chain/errors/blockError.d.ts +19 -7
  41. package/lib/chain/errors/blockError.d.ts.map +1 -1
  42. package/lib/chain/errors/blockError.js +2 -2
  43. package/lib/chain/errors/blockError.js.map +1 -1
  44. package/lib/chain/errors/dataColumnSidecarError.d.ts +15 -2
  45. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
  46. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  47. package/lib/chain/errors/executionPayloadEnvelope.d.ts +10 -11
  48. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  49. package/lib/chain/errors/executionPayloadEnvelope.js +0 -2
  50. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  51. package/lib/chain/interface.d.ts +2 -2
  52. package/lib/chain/interface.d.ts.map +1 -1
  53. package/lib/chain/prepareNextSlot.js +13 -13
  54. package/lib/chain/prepareNextSlot.js.map +1 -1
  55. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  56. package/lib/chain/produceBlock/produceBlockBody.js +46 -64
  57. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  58. package/lib/chain/validation/block.d.ts.map +1 -1
  59. package/lib/chain/validation/block.js +35 -54
  60. package/lib/chain/validation/block.js.map +1 -1
  61. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  62. package/lib/chain/validation/dataColumnSidecar.js +38 -13
  63. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  64. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  65. package/lib/chain/validation/executionPayloadEnvelope.js +10 -29
  66. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  67. package/lib/chain/validatorMonitor.d.ts +7 -1
  68. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  69. package/lib/chain/validatorMonitor.js +22 -5
  70. package/lib/chain/validatorMonitor.js.map +1 -1
  71. package/lib/db/beacon.d.ts +14 -5
  72. package/lib/db/beacon.d.ts.map +1 -1
  73. package/lib/db/beacon.js +17 -3
  74. package/lib/db/beacon.js.map +1 -1
  75. package/lib/db/dataColumnStore.d.ts +39 -0
  76. package/lib/db/dataColumnStore.d.ts.map +1 -0
  77. package/lib/db/dataColumnStore.js +81 -0
  78. package/lib/db/dataColumnStore.js.map +1 -0
  79. package/lib/db/flatFileStore/atomicWrite.d.ts +8 -0
  80. package/lib/db/flatFileStore/atomicWrite.d.ts.map +1 -0
  81. package/lib/db/flatFileStore/atomicWrite.js +61 -0
  82. package/lib/db/flatFileStore/atomicWrite.js.map +1 -0
  83. package/lib/db/flatFileStore/dcolFormat.d.ts +90 -0
  84. package/lib/db/flatFileStore/dcolFormat.d.ts.map +1 -0
  85. package/lib/db/flatFileStore/dcolFormat.js +286 -0
  86. package/lib/db/flatFileStore/dcolFormat.js.map +1 -0
  87. package/lib/db/flatFileStore/errors.d.ts +82 -0
  88. package/lib/db/flatFileStore/errors.d.ts.map +1 -0
  89. package/lib/db/flatFileStore/errors.js +32 -0
  90. package/lib/db/flatFileStore/errors.js.map +1 -0
  91. package/lib/db/flatFileStore/flatFileStore.d.ts +41 -0
  92. package/lib/db/flatFileStore/flatFileStore.d.ts.map +1 -0
  93. package/lib/db/flatFileStore/flatFileStore.js +251 -0
  94. package/lib/db/flatFileStore/flatFileStore.js.map +1 -0
  95. package/lib/db/flatFileStore/index.d.ts +4 -0
  96. package/lib/db/flatFileStore/index.d.ts.map +1 -0
  97. package/lib/db/flatFileStore/index.js +2 -0
  98. package/lib/db/flatFileStore/index.js.map +1 -0
  99. package/lib/db/flatFileStore/interface.d.ts +25 -0
  100. package/lib/db/flatFileStore/interface.d.ts.map +1 -0
  101. package/lib/db/flatFileStore/interface.js +2 -0
  102. package/lib/db/flatFileStore/interface.js.map +1 -0
  103. package/lib/db/flatFileStore/metrics.d.ts +24 -0
  104. package/lib/db/flatFileStore/metrics.d.ts.map +1 -0
  105. package/lib/db/flatFileStore/metrics.js +25 -0
  106. package/lib/db/flatFileStore/metrics.js.map +1 -0
  107. package/lib/db/flatFileStore/path.d.ts +9 -0
  108. package/lib/db/flatFileStore/path.d.ts.map +1 -0
  109. package/lib/db/flatFileStore/path.js +21 -0
  110. package/lib/db/flatFileStore/path.js.map +1 -0
  111. package/lib/db/flatFileStore/slotIndex.d.ts +14 -0
  112. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -0
  113. package/lib/db/flatFileStore/slotIndex.js +46 -0
  114. package/lib/db/flatFileStore/slotIndex.js.map +1 -0
  115. package/lib/db/flatFileStore/snappy.d.ts +3 -0
  116. package/lib/db/flatFileStore/snappy.d.ts.map +1 -0
  117. package/lib/db/flatFileStore/snappy.js +12 -0
  118. package/lib/db/flatFileStore/snappy.js.map +1 -0
  119. package/lib/db/index.d.ts +1 -0
  120. package/lib/db/index.d.ts.map +1 -1
  121. package/lib/db/interface.d.ts +8 -1
  122. package/lib/db/interface.d.ts.map +1 -1
  123. package/lib/db/repositories/blockArchive.d.ts +8 -1
  124. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  125. package/lib/db/repositories/blockArchive.js +65 -28
  126. package/lib/db/repositories/blockArchive.js.map +1 -1
  127. package/lib/db/repositories/blockArchiveIndex.d.ts +1 -2
  128. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  129. package/lib/db/repositories/blockArchiveIndex.js +3 -7
  130. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  131. package/lib/execution/engine/mock.d.ts.map +1 -1
  132. package/lib/execution/engine/mock.js +4 -1
  133. package/lib/execution/engine/mock.js.map +1 -1
  134. package/lib/metrics/metrics/lodestar.d.ts +18 -0
  135. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  136. package/lib/metrics/metrics/lodestar.js +55 -1
  137. package/lib/metrics/metrics/lodestar.js.map +1 -1
  138. package/lib/monitoring/clientStats.js +1 -1
  139. package/lib/monitoring/clientStats.js.map +1 -1
  140. package/lib/network/gossip/encoding.d.ts.map +1 -1
  141. package/lib/network/gossip/encoding.js +0 -7
  142. package/lib/network/gossip/encoding.js.map +1 -1
  143. package/lib/network/gossip/topic.d.ts +2 -1
  144. package/lib/network/gossip/topic.d.ts.map +1 -1
  145. package/lib/network/gossip/topic.js +4 -20
  146. package/lib/network/gossip/topic.js.map +1 -1
  147. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  148. package/lib/network/processor/gossipHandlers.js +6 -7
  149. package/lib/network/processor/gossipHandlers.js.map +1 -1
  150. package/lib/network/processor/index.d.ts +49 -3
  151. package/lib/network/processor/index.d.ts.map +1 -1
  152. package/lib/network/processor/index.js +232 -98
  153. package/lib/network/processor/index.js.map +1 -1
  154. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  155. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +112 -91
  156. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  157. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  158. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +2 -0
  159. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  160. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  161. package/lib/network/reqresp/protocols.js +6 -22
  162. package/lib/network/reqresp/protocols.js.map +1 -1
  163. package/lib/network/reqresp/rateLimit.js +2 -1
  164. package/lib/network/reqresp/rateLimit.js.map +1 -1
  165. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts +2 -1
  166. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -1
  167. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +14 -9
  168. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  169. package/lib/node/nodejs.d.ts +2 -1
  170. package/lib/node/nodejs.d.ts.map +1 -1
  171. package/lib/node/nodejs.js +4 -2
  172. package/lib/node/nodejs.js.map +1 -1
  173. package/lib/util/sszBytes.d.ts +6 -0
  174. package/lib/util/sszBytes.d.ts.map +1 -1
  175. package/lib/util/sszBytes.js +1 -1
  176. package/lib/util/sszBytes.js.map +1 -1
  177. package/package.json +18 -19
  178. package/src/api/impl/beacon/blocks/index.ts +8 -4
  179. package/src/api/impl/validator/index.ts +44 -43
  180. package/src/chain/archiveStore/archiveStore.ts +6 -1
  181. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +1 -0
  182. package/src/chain/archiveStore/historicalState/metrics.ts +14 -1
  183. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  184. package/src/chain/archiveStore/historicalState/worker.ts +4 -1
  185. package/src/chain/archiveStore/utils/archiveBlocks.ts +34 -39
  186. package/src/chain/blocks/importBlock.ts +0 -13
  187. package/src/chain/blocks/index.ts +13 -2
  188. package/src/chain/blocks/writeBlockInputToDb.ts +10 -17
  189. package/src/chain/chain.ts +149 -80
  190. package/src/chain/emitter.ts +1 -1
  191. package/src/chain/errors/blockError.ts +22 -10
  192. package/src/chain/errors/dataColumnSidecarError.ts +24 -8
  193. package/src/chain/errors/executionPayloadEnvelope.ts +14 -11
  194. package/src/chain/interface.ts +2 -2
  195. package/src/chain/prepareNextSlot.ts +16 -16
  196. package/src/chain/produceBlock/produceBlockBody.ts +50 -71
  197. package/src/chain/validation/block.ts +35 -70
  198. package/src/chain/validation/dataColumnSidecar.ts +47 -14
  199. package/src/chain/validation/executionPayloadEnvelope.ts +10 -37
  200. package/src/chain/validatorMonitor.ts +24 -7
  201. package/src/db/beacon.ts +33 -6
  202. package/src/db/dataColumnStore.ts +113 -0
  203. package/src/db/flatFileStore/atomicWrite.ts +65 -0
  204. package/src/db/flatFileStore/dcolFormat.ts +389 -0
  205. package/src/db/flatFileStore/errors.ts +53 -0
  206. package/src/db/flatFileStore/flatFileStore.ts +310 -0
  207. package/src/db/flatFileStore/index.ts +3 -0
  208. package/src/db/flatFileStore/interface.ts +21 -0
  209. package/src/db/flatFileStore/metrics.ts +48 -0
  210. package/src/db/flatFileStore/path.ts +32 -0
  211. package/src/db/flatFileStore/slotIndex.ts +56 -0
  212. package/src/db/flatFileStore/snappy.ts +14 -0
  213. package/src/db/index.ts +1 -0
  214. package/src/db/interface.ts +9 -1
  215. package/src/db/repositories/blockArchive.ts +89 -30
  216. package/src/db/repositories/blockArchiveIndex.ts +4 -9
  217. package/src/execution/engine/mock.ts +4 -1
  218. package/src/metrics/metrics/lodestar.ts +57 -1
  219. package/src/monitoring/clientStats.ts +1 -1
  220. package/src/network/gossip/encoding.ts +0 -7
  221. package/src/network/gossip/topic.ts +3 -25
  222. package/src/network/processor/gossipHandlers.ts +11 -11
  223. package/src/network/processor/index.ts +263 -148
  224. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +139 -105
  225. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +2 -0
  226. package/src/network/reqresp/protocols.ts +7 -24
  227. package/src/network/reqresp/rateLimit.ts +2 -1
  228. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +15 -7
  229. package/src/node/nodejs.ts +6 -1
  230. 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
+ }
@@ -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;
@@ -21,6 +21,7 @@ import {ReprocessStatus} from "../../chain/reprocess.js";
21
21
  import {RejectReason} from "../../chain/seenCache/seenAttestationData.js";
22
22
  import {CacheItemType} from "../../chain/stateCache/types.js";
23
23
  import {OpSource} from "../../chain/validatorMonitor.js";
24
+ import type {FlatFileStoreOperation} from "../../db/flatFileStore/metrics.js";
24
25
  import {ExecutionPayloadStatus} from "../../execution/index.js";
25
26
  import {GossipType} from "../../network/index.js";
26
27
  import {CannotAcceptWorkReason, ReprocessRejectReason} from "../../network/processor/index.js";
@@ -2099,7 +2100,7 @@ export function createLodestarMetrics(
2099
2100
  }),
2100
2101
  dbSizeTotal: register.gauge({
2101
2102
  name: "lodestar_db_size_bytes_total",
2102
- 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",
2103
2104
  }),
2104
2105
  dbApproximateSizeTime: register.histogram({
2105
2106
  name: "lodestar_db_approximate_size_time_seconds",
@@ -2108,6 +2109,61 @@ export function createLodestarMetrics(
2108
2109
  }),
2109
2110
  },
2110
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
+
2111
2167
  pruneHistory: {
2112
2168
  pruneCount: register.gauge({
2113
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
  /**
@@ -27,7 +27,7 @@ import {
27
27
  ssz,
28
28
  sszTypesFor,
29
29
  } from "@lodestar/types";
30
- import {LogLevel, Logger, prettyBytes, toHex, toRootHex} from "@lodestar/utils";
30
+ import {LogLevel, Logger, toHex, toRootHex} from "@lodestar/utils";
31
31
  import {
32
32
  BlockInput,
33
33
  BlockInputColumns,
@@ -157,7 +157,6 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
157
157
  const slot = signedBlock.message.slot;
158
158
  const forkTypes = config.getForkTypes(slot);
159
159
  const blockRootHex = toRootHex(forkTypes.BeaconBlock.hashTreeRoot(signedBlock.message));
160
- const blockShortHex = prettyBytes(blockRootHex);
161
160
  const delaySec = chain.clock.secFromSlot(slot, seenTimestampSec);
162
161
  const recvToValLatency = Date.now() / 1000 - seenTimestampSec;
163
162
 
@@ -167,6 +166,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
167
166
 
168
167
  const logCtx = {
169
168
  slot,
169
+ root: blockRootHex,
170
170
  currentSlot: chain.clock.currentSlot,
171
171
  peerId: peerIdStr,
172
172
  delaySec,
@@ -227,7 +227,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
227
227
  return blockInput;
228
228
  } catch (e) {
229
229
  if (e instanceof BlockGossipError) {
230
- logger.debug("Gossip block has error", {slot, root: blockShortHex, code: e.type.code});
230
+ logger.debug("Gossip block has error", {slot, root: blockRootHex, code: e.type.code});
231
231
  if (
232
232
  (e.type.code === BlockErrorCode.PARENT_BLOCK_UNKNOWN ||
233
233
  e.type.code === BlockErrorCode.PARENT_PAYLOAD_UNKNOWN) &&
@@ -249,7 +249,12 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
249
249
  throw e;
250
250
  }
251
251
 
252
- chain.persistInvalidSszValue(forkTypes.SignedBeaconBlock, signedBlock, `gossip_reject_slot_${slot}`);
252
+ chain.persistInvalidSszValue(
253
+ forkTypes.SignedBeaconBlock,
254
+ signedBlock,
255
+ `gossip_reject_slot_${slot}`,
256
+ blockRootHex
257
+ );
253
258
  }
254
259
 
255
260
  // REJECT or unexpected (non-BlockGossipError) error: drop the optimistically-added entries from
@@ -279,7 +284,6 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
279
284
  const slot = blobBlockHeader.slot;
280
285
  const fork = config.getForkName(slot);
281
286
  const blockRootHex = toRootHex(ssz.phase0.BeaconBlockHeader.hashTreeRoot(blobBlockHeader));
282
- const blockShortHex = prettyBytes(blockRootHex);
283
287
 
284
288
  const delaySec = chain.clock.secFromSlot(slot, seenTimestampSec);
285
289
  const recvToValLatency = Date.now() / 1000 - seenTimestampSec;
@@ -332,7 +336,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
332
336
  if (e instanceof BlobSidecarGossipError) {
333
337
  // Don't trigger this yet if full block and blobs haven't arrived yet
334
338
  if (e.type.code === BlobSidecarErrorCode.PARENT_UNKNOWN) {
335
- logger.debug("Gossip blob has error", {slot, root: blockShortHex, code: e.type.code});
339
+ logger.debug("Gossip blob has error", {slot, root: blockRootHex, code: e.type.code});
336
340
  // no need to trigger `unknownBlockParent` event here, as we already did it in `validateBeaconBlock()`
337
341
  //
338
342
  // TODO(fulu): is this note above correct? Could have random blob that we see that could trigger
@@ -696,11 +700,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
696
700
  logLevel = LogLevel.error;
697
701
  }
698
702
  metrics?.gossipBlock.processBlockErrors.inc({error: e instanceof BlockError ? e.type.code : "NOT_BLOCK_ERROR"});
699
- logger[logLevel](
700
- "Error processing block",
701
- {slot, peer: peerIdStr, blockRoot: prettyBytes(blockInput.blockRootHex)},
702
- e as Error
703
- );
703
+ logger[logLevel]("Error processing block", {slot, root: blockInput.blockRootHex, peer: peerIdStr}, e as Error);
704
704
  // TODO(fulu): Revisit when we prune block inputs
705
705
  chain.seenBlockInputCache.prune(blockInput.blockRootHex);
706
706
  });