@lodestar/beacon-node 1.40.0-dev.c04ddcbf20 → 1.40.0-dev.c4af2af040

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 (331) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +15 -9
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  5. package/lib/api/impl/lodestar/index.js +24 -0
  6. package/lib/api/impl/lodestar/index.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts.map +1 -1
  8. package/lib/api/impl/validator/index.js.map +1 -1
  9. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  10. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  11. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  12. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  13. package/lib/chain/blocks/blockInput/blockInput.d.ts +28 -0
  14. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.js +36 -1
  16. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  17. package/lib/chain/blocks/importBlock.js +1 -1
  18. package/lib/chain/blocks/importBlock.js.map +1 -1
  19. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  20. package/lib/chain/blocks/verifyBlock.js +1 -1
  21. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  22. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  23. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  24. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  25. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  26. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  27. package/lib/chain/blocks/writeBlockInputToDb.js +8 -0
  28. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  29. package/lib/chain/bls/multithread/index.d.ts +3 -1
  30. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  31. package/lib/chain/bls/multithread/index.js +5 -3
  32. package/lib/chain/bls/multithread/index.js.map +1 -1
  33. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  34. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  35. package/lib/chain/bls/multithread/jobItem.js +2 -2
  36. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  37. package/lib/chain/bls/singleThread.d.ts +4 -2
  38. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  39. package/lib/chain/bls/singleThread.js +4 -2
  40. package/lib/chain/bls/singleThread.js.map +1 -1
  41. package/lib/chain/bls/utils.d.ts +2 -2
  42. package/lib/chain/bls/utils.d.ts.map +1 -1
  43. package/lib/chain/bls/utils.js +9 -6
  44. package/lib/chain/bls/utils.js.map +1 -1
  45. package/lib/chain/chain.d.ts +8 -3
  46. package/lib/chain/chain.d.ts.map +1 -1
  47. package/lib/chain/chain.js +39 -34
  48. package/lib/chain/chain.js.map +1 -1
  49. package/lib/chain/errors/attestationError.d.ts +14 -1
  50. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  51. package/lib/chain/errors/attestationError.js +8 -0
  52. package/lib/chain/errors/attestationError.js.map +1 -1
  53. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  54. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  55. package/lib/chain/errors/executionPayloadBid.js +15 -0
  56. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  57. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  58. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  59. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  60. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  61. package/lib/chain/errors/index.d.ts +3 -0
  62. package/lib/chain/errors/index.d.ts.map +1 -1
  63. package/lib/chain/errors/index.js +3 -0
  64. package/lib/chain/errors/index.js.map +1 -1
  65. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  66. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  67. package/lib/chain/errors/payloadAttestation.js +13 -0
  68. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  69. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  70. package/lib/chain/forkChoice/index.js +18 -0
  71. package/lib/chain/forkChoice/index.js.map +1 -1
  72. package/lib/chain/interface.d.ts +7 -2
  73. package/lib/chain/interface.d.ts.map +1 -1
  74. package/lib/chain/interface.js.map +1 -1
  75. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  76. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  77. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  78. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  79. package/lib/chain/opPools/index.d.ts +2 -0
  80. package/lib/chain/opPools/index.d.ts.map +1 -1
  81. package/lib/chain/opPools/index.js +2 -0
  82. package/lib/chain/opPools/index.js.map +1 -1
  83. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  84. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  85. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  86. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  87. package/lib/chain/options.d.ts +0 -1
  88. package/lib/chain/options.d.ts.map +1 -1
  89. package/lib/chain/options.js +0 -1
  90. package/lib/chain/options.js.map +1 -1
  91. package/lib/chain/regen/interface.d.ts +2 -1
  92. package/lib/chain/regen/interface.d.ts.map +1 -1
  93. package/lib/chain/regen/interface.js +1 -0
  94. package/lib/chain/regen/interface.js.map +1 -1
  95. package/lib/chain/regen/queued.d.ts +1 -1
  96. package/lib/chain/regen/queued.d.ts.map +1 -1
  97. package/lib/chain/regen/queued.js.map +1 -1
  98. package/lib/chain/regen/regen.d.ts +2 -0
  99. package/lib/chain/regen/regen.d.ts.map +1 -1
  100. package/lib/chain/regen/regen.js +4 -1
  101. package/lib/chain/regen/regen.js.map +1 -1
  102. package/lib/chain/seenCache/index.d.ts +3 -1
  103. package/lib/chain/seenCache/index.d.ts.map +1 -1
  104. package/lib/chain/seenCache/index.js +3 -1
  105. package/lib/chain/seenCache/index.js.map +1 -1
  106. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  107. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  108. package/lib/chain/seenCache/seenAttesters.js +5 -0
  109. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  110. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  111. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  112. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  113. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  114. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  115. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  116. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  117. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  118. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  119. package/lib/chain/stateCache/index.d.ts +0 -2
  120. package/lib/chain/stateCache/index.d.ts.map +1 -1
  121. package/lib/chain/stateCache/index.js +0 -2
  122. package/lib/chain/stateCache/index.js.map +1 -1
  123. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +2 -1
  124. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  125. package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
  126. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  127. package/lib/chain/validation/aggregateAndProof.js +35 -14
  128. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  129. package/lib/chain/validation/attestation.d.ts +2 -2
  130. package/lib/chain/validation/attestation.d.ts.map +1 -1
  131. package/lib/chain/validation/attestation.js +27 -8
  132. package/lib/chain/validation/attestation.js.map +1 -1
  133. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  134. package/lib/chain/validation/attesterSlashing.js +1 -1
  135. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  136. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  137. package/lib/chain/validation/blobSidecar.js +2 -2
  138. package/lib/chain/validation/blobSidecar.js.map +1 -1
  139. package/lib/chain/validation/block.d.ts.map +1 -1
  140. package/lib/chain/validation/block.js +6 -6
  141. package/lib/chain/validation/block.js.map +1 -1
  142. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  143. package/lib/chain/validation/dataColumnSidecar.js +2 -2
  144. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  145. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  146. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  147. package/lib/chain/validation/executionPayloadBid.js +104 -0
  148. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  149. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  150. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  151. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  152. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  153. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  154. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  155. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  156. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  157. package/lib/chain/validation/proposerSlashing.js +1 -1
  158. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  159. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  160. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  161. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  162. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  163. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  164. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  165. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  166. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  167. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  168. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  169. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  170. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  171. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  172. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  173. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  174. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  175. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  176. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  177. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  178. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  179. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  180. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  181. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  182. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  183. package/lib/chain/validation/syncCommittee.js +1 -1
  184. package/lib/chain/validation/syncCommittee.js.map +1 -1
  185. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  186. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  187. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  188. package/lib/chain/validation/voluntaryExit.js +1 -1
  189. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  190. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  191. package/lib/chain/validatorMonitor.js +7 -4
  192. package/lib/chain/validatorMonitor.js.map +1 -1
  193. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  194. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  195. package/lib/metrics/metrics/lodestar.js +40 -0
  196. package/lib/metrics/metrics/lodestar.js.map +1 -1
  197. package/lib/network/core/networkCore.d.ts +3 -0
  198. package/lib/network/core/networkCore.d.ts.map +1 -1
  199. package/lib/network/core/networkCore.js +9 -0
  200. package/lib/network/core/networkCore.js.map +1 -1
  201. package/lib/network/core/networkCoreWorker.js +3 -0
  202. package/lib/network/core/networkCoreWorker.js.map +1 -1
  203. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -0
  204. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  205. package/lib/network/core/networkCoreWorkerHandler.js +9 -0
  206. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  207. package/lib/network/core/types.d.ts +3 -0
  208. package/lib/network/core/types.d.ts.map +1 -1
  209. package/lib/network/gossip/gossipsub.d.ts +34 -0
  210. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  211. package/lib/network/gossip/gossipsub.js +123 -0
  212. package/lib/network/gossip/gossipsub.js.map +1 -1
  213. package/lib/network/gossip/interface.d.ts +20 -2
  214. package/lib/network/gossip/interface.d.ts.map +1 -1
  215. package/lib/network/gossip/interface.js +3 -0
  216. package/lib/network/gossip/interface.js.map +1 -1
  217. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  218. package/lib/network/gossip/scoringParameters.js +38 -2
  219. package/lib/network/gossip/scoringParameters.js.map +1 -1
  220. package/lib/network/gossip/topic.d.ts +77 -1
  221. package/lib/network/gossip/topic.d.ts.map +1 -1
  222. package/lib/network/gossip/topic.js +20 -0
  223. package/lib/network/gossip/topic.js.map +1 -1
  224. package/lib/network/network.d.ts +3 -0
  225. package/lib/network/network.d.ts.map +1 -1
  226. package/lib/network/network.js +9 -0
  227. package/lib/network/network.js.map +1 -1
  228. package/lib/network/options.d.ts +6 -0
  229. package/lib/network/options.d.ts.map +1 -1
  230. package/lib/network/options.js.map +1 -1
  231. package/lib/network/peers/peerManager.d.ts.map +1 -1
  232. package/lib/network/peers/peerManager.js +9 -0
  233. package/lib/network/peers/peerManager.js.map +1 -1
  234. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  235. package/lib/network/processor/gossipHandlers.js +35 -1
  236. package/lib/network/processor/gossipHandlers.js.map +1 -1
  237. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  238. package/lib/network/processor/gossipQueues/index.js +16 -0
  239. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  240. package/lib/network/processor/index.d.ts.map +1 -1
  241. package/lib/network/processor/index.js +3 -0
  242. package/lib/network/processor/index.js.map +1 -1
  243. package/lib/sync/backfill/backfill.js +2 -2
  244. package/lib/sync/backfill/backfill.js.map +1 -1
  245. package/lib/sync/backfill/verify.d.ts +1 -2
  246. package/lib/sync/backfill/verify.d.ts.map +1 -1
  247. package/lib/sync/backfill/verify.js +2 -2
  248. package/lib/sync/backfill/verify.js.map +1 -1
  249. package/package.json +15 -15
  250. package/src/api/impl/beacon/blocks/index.ts +31 -19
  251. package/src/api/impl/lodestar/index.ts +29 -0
  252. package/src/api/impl/validator/index.ts +2 -1
  253. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  254. package/src/chain/blocks/blockInput/blockInput.ts +45 -2
  255. package/src/chain/blocks/importBlock.ts +1 -1
  256. package/src/chain/blocks/verifyBlock.ts +0 -1
  257. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  258. package/src/chain/blocks/writeBlockInputToDb.ts +9 -0
  259. package/src/chain/bls/multithread/index.ts +7 -4
  260. package/src/chain/bls/multithread/jobItem.ts +7 -3
  261. package/src/chain/bls/singleThread.ts +5 -3
  262. package/src/chain/bls/utils.ts +15 -7
  263. package/src/chain/chain.ts +47 -36
  264. package/src/chain/errors/attestationError.ts +11 -1
  265. package/src/chain/errors/executionPayloadBid.ts +35 -0
  266. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  267. package/src/chain/errors/index.ts +3 -0
  268. package/src/chain/errors/payloadAttestation.ts +25 -0
  269. package/src/chain/forkChoice/index.ts +19 -0
  270. package/src/chain/interface.ts +16 -1
  271. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  272. package/src/chain/opPools/index.ts +2 -0
  273. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  274. package/src/chain/options.ts +0 -2
  275. package/src/chain/regen/interface.ts +2 -1
  276. package/src/chain/regen/queued.ts +1 -2
  277. package/src/chain/regen/regen.ts +6 -1
  278. package/src/chain/seenCache/index.ts +3 -1
  279. package/src/chain/seenCache/seenAttesters.ts +5 -0
  280. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  281. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  282. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  283. package/src/chain/stateCache/index.ts +0 -2
  284. package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
  285. package/src/chain/validation/aggregateAndProof.ts +36 -14
  286. package/src/chain/validation/attestation.ts +33 -16
  287. package/src/chain/validation/attesterSlashing.ts +1 -6
  288. package/src/chain/validation/blobSidecar.ts +1 -6
  289. package/src/chain/validation/block.ts +6 -6
  290. package/src/chain/validation/dataColumnSidecar.ts +1 -6
  291. package/src/chain/validation/executionPayloadBid.ts +141 -0
  292. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  293. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  294. package/src/chain/validation/proposerSlashing.ts +1 -6
  295. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  296. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  297. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  298. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  299. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  300. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  301. package/src/chain/validation/syncCommittee.ts +1 -1
  302. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  303. package/src/chain/validation/voluntaryExit.ts +1 -1
  304. package/src/chain/validatorMonitor.ts +10 -5
  305. package/src/metrics/metrics/lodestar.ts +40 -0
  306. package/src/network/core/networkCore.ts +12 -0
  307. package/src/network/core/networkCoreWorker.ts +3 -0
  308. package/src/network/core/networkCoreWorkerHandler.ts +9 -0
  309. package/src/network/core/types.ts +6 -0
  310. package/src/network/gossip/gossipsub.ts +147 -1
  311. package/src/network/gossip/interface.ts +17 -0
  312. package/src/network/gossip/scoringParameters.ts +44 -2
  313. package/src/network/gossip/topic.ts +21 -0
  314. package/src/network/network.ts +12 -0
  315. package/src/network/options.ts +6 -0
  316. package/src/network/peers/peerManager.ts +11 -0
  317. package/src/network/processor/gossipHandlers.ts +49 -1
  318. package/src/network/processor/gossipQueues/index.ts +16 -0
  319. package/src/network/processor/index.ts +3 -0
  320. package/src/sync/backfill/backfill.ts +2 -2
  321. package/src/sync/backfill/verify.ts +2 -3
  322. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
  323. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
  324. package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
  325. package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
  326. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -60
  327. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
  328. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
  329. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
  330. package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
  331. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
@@ -7,7 +7,7 @@ import {Worker, spawn} from "@chainsafe/threads";
7
7
  self = undefined;
8
8
 
9
9
  import {PublicKey} from "@chainsafe/blst";
10
- import {ISignatureSet} from "@lodestar/state-transition";
10
+ import {ISignatureSet, Index2PubkeyCache} from "@lodestar/state-transition";
11
11
  import {Logger} from "@lodestar/utils";
12
12
  import {Metrics} from "../../../metrics/index.js";
13
13
  import {LinkedList} from "../../../util/array.js";
@@ -34,6 +34,7 @@ const workerDir = process.env.NODE_ENV === "test" ? "../../../../lib/chain/bls/m
34
34
  export type BlsMultiThreadWorkerPoolModules = {
35
35
  logger: Logger;
36
36
  metrics: Metrics | null;
37
+ index2pubkey: Index2PubkeyCache;
37
38
  };
38
39
 
39
40
  export type BlsMultiThreadWorkerPoolOptions = {
@@ -113,6 +114,7 @@ type WorkerDescriptor = {
113
114
  export class BlsMultiThreadWorkerPool implements IBlsVerifier {
114
115
  private readonly logger: Logger;
115
116
  private readonly metrics: Metrics | null;
117
+ private readonly index2pubkey: Index2PubkeyCache;
116
118
 
117
119
  private readonly workers: WorkerDescriptor[];
118
120
  private readonly jobs = new LinkedList<JobQueueItem>();
@@ -128,9 +130,10 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
128
130
  private workersBusy = 0;
129
131
 
130
132
  constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
131
- const {logger, metrics} = modules;
133
+ const {logger, metrics, index2pubkey} = modules;
132
134
  this.logger = logger;
133
135
  this.metrics = metrics;
136
+ this.index2pubkey = index2pubkey;
134
137
  this.blsVerifyAllMultiThread = options.blsVerifyAllMultiThread ?? false;
135
138
 
136
139
  // Use compressed for herumi for now.
@@ -170,7 +173,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
170
173
  try {
171
174
  return verifySignatureSetsMaybeBatch(
172
175
  sets.map((set) => ({
173
- publicKey: getAggregatedPubkey(set),
176
+ publicKey: getAggregatedPubkey(set, this.index2pubkey),
174
177
  message: set.signingRoot.valueOf(),
175
178
  signature: set.signature,
176
179
  }))
@@ -395,7 +398,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
395
398
  try {
396
399
  // Note: This can throw, must be handled per-job.
397
400
  // Pubkey and signature aggregation is defered here
398
- workReq = await jobItemWorkReq(job, this.metrics);
401
+ workReq = await jobItemWorkReq(job, this.index2pubkey, this.metrics);
399
402
  } catch (e) {
400
403
  this.metrics?.blsThreadPool.errorAggregateSignatureSetsCount.inc({type: job.type});
401
404
 
@@ -1,5 +1,5 @@
1
1
  import {PublicKey, asyncAggregateWithRandomness} from "@chainsafe/blst";
2
- import {ISignatureSet, SignatureSetType} from "@lodestar/state-transition";
2
+ import {ISignatureSet, Index2PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../../metrics/metrics.js";
4
4
  import {LinkedList} from "../../../util/array.js";
5
5
  import {VerifySignatureOpts} from "../interface.js";
@@ -48,14 +48,18 @@ export function jobItemSigSets(job: JobQueueItem): number {
48
48
  * Prepare BlsWorkReq from JobQueueItem
49
49
  * WARNING: May throw with untrusted user input
50
50
  */
51
- export async function jobItemWorkReq(job: JobQueueItem, metrics: Metrics | null): Promise<BlsWorkReq> {
51
+ export async function jobItemWorkReq(
52
+ job: JobQueueItem,
53
+ index2pubkey: Index2PubkeyCache,
54
+ metrics: Metrics | null
55
+ ): Promise<BlsWorkReq> {
52
56
  switch (job.type) {
53
57
  case JobQueueItemType.default:
54
58
  return {
55
59
  opts: job.opts,
56
60
  sets: job.sets.map((set) => ({
57
61
  // this can throw, handled in the consumer code
58
- publicKey: getAggregatedPubkey(set, metrics).toBytes(),
62
+ publicKey: getAggregatedPubkey(set, index2pubkey, metrics).toBytes(),
59
63
  signature: set.signature,
60
64
  message: set.signingRoot,
61
65
  })),
@@ -1,5 +1,5 @@
1
1
  import {PublicKey, Signature, aggregatePublicKeys, aggregateSignatures, verify} from "@chainsafe/blst";
2
- import {ISignatureSet} from "@lodestar/state-transition";
2
+ import {ISignatureSet, Index2PubkeyCache} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/index.js";
4
4
  import {IBlsVerifier} from "./interface.js";
5
5
  import {verifySignatureSetsMaybeBatch} from "./maybeBatch.js";
@@ -7,16 +7,18 @@ import {getAggregatedPubkey, getAggregatedPubkeysCount} from "./utils.js";
7
7
 
8
8
  export class BlsSingleThreadVerifier implements IBlsVerifier {
9
9
  private readonly metrics: Metrics | null;
10
+ private readonly index2pubkey: Index2PubkeyCache;
10
11
 
11
- constructor({metrics = null}: {metrics: Metrics | null}) {
12
+ constructor({metrics = null, index2pubkey}: {metrics: Metrics | null; index2pubkey: Index2PubkeyCache}) {
12
13
  this.metrics = metrics;
14
+ this.index2pubkey = index2pubkey;
13
15
  }
14
16
 
15
17
  async verifySignatureSets(sets: ISignatureSet[]): Promise<boolean> {
16
18
  this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
17
19
 
18
20
  const setsAggregated = sets.map((set) => ({
19
- publicKey: getAggregatedPubkey(set),
21
+ publicKey: getAggregatedPubkey(set, this.index2pubkey, this.metrics),
20
22
  message: set.signingRoot,
21
23
  signature: set.signature,
22
24
  }));
@@ -1,17 +1,25 @@
1
1
  import {PublicKey, aggregatePublicKeys} from "@chainsafe/blst";
2
- import {ISignatureSet, SignatureSetType} from "@lodestar/state-transition";
2
+ import {ISignatureSet, Index2PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/metrics.js";
4
4
 
5
- export function getAggregatedPubkey(signatureSet: ISignatureSet, metrics: Metrics | null = null): PublicKey {
5
+ export function getAggregatedPubkey(
6
+ signatureSet: ISignatureSet,
7
+ index2pubkey: Index2PubkeyCache,
8
+ metrics: Metrics | null = null
9
+ ): PublicKey {
6
10
  switch (signatureSet.type) {
7
11
  case SignatureSetType.single:
8
12
  return signatureSet.pubkey;
9
13
 
14
+ case SignatureSetType.indexed:
15
+ return index2pubkey[signatureSet.index];
16
+
10
17
  case SignatureSetType.aggregate: {
11
18
  const timer = metrics?.blsThreadPool.pubkeysAggregationMainThreadDuration.startTimer();
12
- const pubkeys = aggregatePublicKeys(signatureSet.pubkeys);
19
+ const pubkeys = signatureSet.indices.map((i) => index2pubkey[i]);
20
+ const aggregated = aggregatePublicKeys(pubkeys);
13
21
  timer?.();
14
- return pubkeys;
22
+ return aggregated;
15
23
  }
16
24
 
17
25
  default:
@@ -20,11 +28,11 @@ export function getAggregatedPubkey(signatureSet: ISignatureSet, metrics: Metric
20
28
  }
21
29
 
22
30
  export function getAggregatedPubkeysCount(signatureSets: ISignatureSet[]): number {
23
- let pubkeysConut = 0;
31
+ let pubkeysCount = 0;
24
32
  for (const set of signatureSets) {
25
33
  if (set.type === SignatureSetType.aggregate) {
26
- pubkeysConut += set.pubkeys.length;
34
+ pubkeysCount += set.indices.length;
27
35
  }
28
36
  }
29
- return pubkeysConut;
37
+ return pubkeysCount;
30
38
  }
@@ -79,7 +79,9 @@ import {LightClientServer} from "./lightClient/index.js";
79
79
  import {
80
80
  AggregatedAttestationPool,
81
81
  AttestationPool,
82
+ ExecutionPayloadBidPool,
82
83
  OpPool,
84
+ PayloadAttestationPool,
83
85
  SyncCommitteeMessagePool,
84
86
  SyncContributionAndProofPool,
85
87
  } from "./opPools/index.js";
@@ -95,6 +97,9 @@ import {
95
97
  SeenAttesters,
96
98
  SeenBlockProposers,
97
99
  SeenContributionAndProof,
100
+ SeenExecutionPayloadBids,
101
+ SeenExecutionPayloadEnvelopes,
102
+ SeenPayloadAttesters,
98
103
  SeenSyncCommitteeMessages,
99
104
  } from "./seenCache/index.js";
100
105
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -102,12 +107,10 @@ import {SeenAttestationDatas} from "./seenCache/seenAttestationData.js";
102
107
  import {SeenBlockAttesters} from "./seenCache/seenBlockAttesters.js";
103
108
  import {SeenBlockInput} from "./seenCache/seenGossipBlockInput.js";
104
109
  import {ShufflingCache} from "./shufflingCache.js";
105
- import {BlockStateCacheImpl} from "./stateCache/blockStateCacheImpl.js";
106
110
  import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datastore/db.js";
107
111
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
108
112
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
109
113
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
110
- import {InMemoryCheckpointStateCache} from "./stateCache/inMemoryCheckpointsCache.js";
111
114
  import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
112
115
  import {CheckpointStateCache} from "./stateCache/types.js";
113
116
  import {ValidatorMonitor} from "./validatorMonitor.js";
@@ -137,7 +140,7 @@ export class BeaconChain implements IBeaconChain {
137
140
  readonly logger: Logger;
138
141
  readonly metrics: Metrics | null;
139
142
  readonly validatorMonitor: ValidatorMonitor | null;
140
- readonly bufferPool: BufferPool | null;
143
+ readonly bufferPool: BufferPool;
141
144
 
142
145
  readonly anchorStateLatestBlockSlot: Slot;
143
146
 
@@ -156,12 +159,17 @@ export class BeaconChain implements IBeaconChain {
156
159
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
157
160
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
158
161
  readonly syncContributionAndProofPool;
162
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
163
+ readonly payloadAttestationPool: PayloadAttestationPool;
159
164
  readonly opPool: OpPool;
160
165
 
161
166
  // Gossip seen cache
162
167
  readonly seenAttesters = new SeenAttesters();
163
168
  readonly seenAggregators = new SeenAggregators();
169
+ readonly seenPayloadAttesters = new SeenPayloadAttesters();
164
170
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
171
+ readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
172
+ readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
165
173
  readonly seenBlockProposers = new SeenBlockProposers();
166
174
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
167
175
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -268,8 +276,8 @@ export class BeaconChain implements IBeaconChain {
268
276
  const emitter = new ChainEventEmitter();
269
277
  // by default, verify signatures on both main threads and worker threads
270
278
  const bls = opts.blsVerifyAllMainThread
271
- ? new BlsSingleThreadVerifier({metrics})
272
- : new BlsMultiThreadWorkerPool(opts, {logger, metrics});
279
+ ? new BlsSingleThreadVerifier({metrics, index2pubkey})
280
+ : new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
273
281
 
274
282
  if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
275
283
 
@@ -278,6 +286,8 @@ export class BeaconChain implements IBeaconChain {
278
286
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
279
287
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
280
288
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
289
+ this.executionPayloadBidPool = new ExecutionPayloadBidPool();
290
+ this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
281
291
  this.opPool = new OpPool(config);
282
292
 
283
293
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
@@ -327,32 +337,22 @@ export class BeaconChain implements IBeaconChain {
327
337
  this.index2pubkey = index2pubkey;
328
338
 
329
339
  const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
330
- const blockStateCache = this.opts.nHistoricalStates
331
- ? new FIFOBlockStateCache(this.opts, {metrics})
332
- : new BlockStateCacheImpl({metrics});
333
- this.bufferPool = this.opts.nHistoricalStates
334
- ? new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics)
335
- : null;
336
-
337
- let checkpointStateCache: CheckpointStateCache;
338
- this.cpStateDatastore = undefined;
339
- if (this.opts.nHistoricalStates) {
340
- this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
341
- checkpointStateCache = new PersistentCheckpointStateCache(
342
- {
343
- config,
344
- metrics,
345
- logger,
346
- clock,
347
- blockStateCache,
348
- bufferPool: this.bufferPool,
349
- datastore: this.cpStateDatastore,
350
- },
351
- this.opts
352
- );
353
- } else {
354
- checkpointStateCache = new InMemoryCheckpointStateCache({metrics});
355
- }
340
+ const blockStateCache = new FIFOBlockStateCache(this.opts, {metrics});
341
+ this.bufferPool = new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics);
342
+
343
+ this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
344
+ const checkpointStateCache: CheckpointStateCache = new PersistentCheckpointStateCache(
345
+ {
346
+ config,
347
+ metrics,
348
+ logger,
349
+ clock,
350
+ blockStateCache,
351
+ bufferPool: this.bufferPool,
352
+ datastore: this.cpStateDatastore,
353
+ },
354
+ this.opts
355
+ );
356
356
 
357
357
  const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
358
358
  blockStateCache.add(anchorState);
@@ -375,6 +375,7 @@ export class BeaconChain implements IBeaconChain {
375
375
  forkChoice,
376
376
  blockStateCache,
377
377
  checkpointStateCache,
378
+ seenBlockInputCache: this.seenBlockInputCache,
378
379
  db,
379
380
  metrics,
380
381
  validatorMonitor,
@@ -488,6 +489,8 @@ export class BeaconChain implements IBeaconChain {
488
489
  this.seenAttesters.isKnown(epoch, index) ||
489
490
  // seenAggregators = single aggregator index, not participants of the aggregate
490
491
  this.seenAggregators.isKnown(epoch, index) ||
492
+ // seenPayloadAttesters = single signer of payload attestation message
493
+ this.seenPayloadAttesters.isKnown(epoch, index) ||
491
494
  // seenBlockProposers = single block proposer
492
495
  this.seenBlockProposers.seenAtEpoch(epoch, index)
493
496
  );
@@ -1262,6 +1265,8 @@ export class BeaconChain implements IBeaconChain {
1262
1265
  metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
1263
1266
  metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
1264
1267
  metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
1268
+ metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
1269
+ metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
1265
1270
  // syncContributionAndProofPool tracks metrics on its own
1266
1271
  metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
1267
1272
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
@@ -1292,6 +1297,9 @@ export class BeaconChain implements IBeaconChain {
1292
1297
  this.aggregatedAttestationPool.prune(slot);
1293
1298
  this.syncCommitteeMessagePool.prune(slot);
1294
1299
  this.seenSyncCommitteeMessages.prune(slot);
1300
+ this.payloadAttestationPool.prune(slot);
1301
+ this.executionPayloadBidPool.prune(slot);
1302
+ this.seenExecutionPayloadBids.prune(slot);
1295
1303
  this.seenAttestationDatas.onSlot(slot);
1296
1304
  this.reprocessController.onSlot(slot);
1297
1305
 
@@ -1315,6 +1323,7 @@ export class BeaconChain implements IBeaconChain {
1315
1323
 
1316
1324
  this.seenAttesters.prune(epoch);
1317
1325
  this.seenAggregators.prune(epoch);
1326
+ this.seenPayloadAttesters.prune(epoch);
1318
1327
  this.seenAggregatedAttestations.prune(epoch);
1319
1328
  this.seenBlockAttesters.prune(epoch);
1320
1329
  this.beaconProposerCache.prune(epoch);
@@ -1338,7 +1347,9 @@ export class BeaconChain implements IBeaconChain {
1338
1347
 
1339
1348
  private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1340
1349
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1341
- this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
1350
+ const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1351
+ this.seenBlockProposers.prune(finalizedSlot);
1352
+ this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
1342
1353
 
1343
1354
  // Update validator custody to account for effective balance changes
1344
1355
  await this.updateValidatorsCustodyRequirement(cp);
@@ -1346,13 +1357,13 @@ export class BeaconChain implements IBeaconChain {
1346
1357
  // TODO: Improve using regen here
1347
1358
  const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
1348
1359
  const headState = this.regen.getStateSync(stateRoot);
1349
- const headBlock = await this.db.block.get(fromHex(blockRoot));
1350
- if (headBlock == null) {
1351
- throw Error(`Head block ${slot} ${headBlock} is not available in database`);
1360
+ const blockResult = await this.getBlockByRoot(blockRoot);
1361
+ if (blockResult == null) {
1362
+ throw Error(`Head block for ${slot} is not available in cache or database`);
1352
1363
  }
1353
1364
 
1354
1365
  if (headState) {
1355
- this.opPool.pruneAll(headBlock, headState);
1366
+ this.opPool.pruneAll(blockResult.block, headState);
1356
1367
  }
1357
1368
 
1358
1369
  if (headState === null) {
@@ -139,6 +139,14 @@ export enum AttestationErrorCode {
139
139
  * Electra: Attester not in committee
140
140
  */
141
141
  ATTESTER_NOT_IN_COMMITTEE = "ATTESTATION_ERROR_ATTESTER_NOT_IN_COMMITTEE",
142
+ /**
143
+ * Gloas: Invalid attestationData index: is non-zero and non-one
144
+ */
145
+ INVALID_PAYLOAD_STATUS_VALUE = "ATTESTATION_ERROR_INVALID_PAYLOAD_STATUS_VALUE",
146
+ /**
147
+ * Gloas: Current slot attestation is marking payload as present
148
+ */
149
+ PREMATURELY_INDICATED_PAYLOAD_PRESENT = "ATTESTATION_ERROR_PREMATURELY_INDICATED_PAYLOAD_PRESENT",
142
150
  }
143
151
 
144
152
  export type AttestationErrorType =
@@ -175,7 +183,9 @@ export type AttestationErrorType =
175
183
  | {code: AttestationErrorCode.TOO_MANY_SKIPPED_SLOTS; headBlockSlot: Slot; attestationSlot: Slot}
176
184
  | {code: AttestationErrorCode.NOT_EXACTLY_ONE_COMMITTEE_BIT_SET}
177
185
  | {code: AttestationErrorCode.NON_ZERO_ATTESTATION_DATA_INDEX}
178
- | {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE};
186
+ | {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE}
187
+ | {code: AttestationErrorCode.INVALID_PAYLOAD_STATUS_VALUE; attDataIndex: number}
188
+ | {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT};
179
189
 
180
190
  export class AttestationError extends GossipActionError<AttestationErrorType> {
181
191
  getMetadata(): Record<string, string | number | null> {
@@ -0,0 +1,35 @@
1
+ import {BuilderIndex, RootHex, Slot} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.ts";
3
+
4
+ export enum ExecutionPayloadBidErrorCode {
5
+ BUILDER_NOT_ELIGIBLE = "EXECUTION_PAYLOAD_BID_ERROR_BUILDER_NOT_ELIGIBLE",
6
+ NON_ZERO_EXECUTION_PAYMENT = "EXECUTION_PAYLOAD_BID_ERROR_NON_ZERO_EXECUTION_PAYMENT",
7
+ BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
+ BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
9
+ BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
10
+ UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
11
+ INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
12
+ INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
13
+ }
14
+
15
+ export type ExecutionPayloadBidErrorType =
16
+ | {code: ExecutionPayloadBidErrorCode.BUILDER_NOT_ELIGIBLE; builderIndex: BuilderIndex}
17
+ | {
18
+ code: ExecutionPayloadBidErrorCode.NON_ZERO_EXECUTION_PAYMENT;
19
+ builderIndex: BuilderIndex;
20
+ executionPayment: number;
21
+ }
22
+ | {
23
+ code: ExecutionPayloadBidErrorCode.BID_ALREADY_KNOWN;
24
+ builderIndex: BuilderIndex;
25
+ slot: Slot;
26
+ parentBlockRoot: RootHex;
27
+ parentBlockHash: RootHex;
28
+ }
29
+ | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
+ | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
31
+ | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
+ | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
+ | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
34
+
35
+ export class ExecutionPayloadBidError extends GossipActionError<ExecutionPayloadBidErrorType> {}
@@ -0,0 +1,34 @@
1
+ import {BuilderIndex, RootHex, Slot} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.js";
3
+
4
+ export enum ExecutionPayloadEnvelopeErrorCode {
5
+ BELONG_TO_FINALIZED_BLOCK = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BELONG_TO_FINALIZED_BLOCK",
6
+ BLOCK_ROOT_UNKNOWN = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_ROOT_UNKNOWN",
7
+ ENVELOPE_ALREADY_KNOWN = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_ALREADY_KNOWN",
8
+ INVALID_BLOCK = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_BLOCK",
9
+ SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
10
+ BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
11
+ BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
12
+ INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
13
+ CACHE_FAIL = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_CACHE_FAIL",
14
+ }
15
+ export type ExecutionPayloadEnvelopeErrorType =
16
+ | {code: ExecutionPayloadEnvelopeErrorCode.BELONG_TO_FINALIZED_BLOCK; envelopeSlot: Slot; finalizedSlot: Slot}
17
+ | {code: ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN; blockRoot: RootHex}
18
+ | {
19
+ code: ExecutionPayloadEnvelopeErrorCode.ENVELOPE_ALREADY_KNOWN;
20
+ blockRoot: RootHex;
21
+ slot: Slot;
22
+ }
23
+ | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_BLOCK; blockRoot: RootHex}
24
+ | {code: ExecutionPayloadEnvelopeErrorCode.SLOT_MISMATCH; envelopeSlot: Slot; blockSlot: Slot}
25
+ | {
26
+ code: ExecutionPayloadEnvelopeErrorCode.BUILDER_INDEX_MISMATCH;
27
+ envelopeBuilderIndex: BuilderIndex;
28
+ bidBuilderIndex: BuilderIndex;
29
+ }
30
+ | {code: ExecutionPayloadEnvelopeErrorCode.BLOCK_HASH_MISMATCH; envelopeBlockHash: RootHex; bidBlockHash: RootHex}
31
+ | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
32
+ | {code: ExecutionPayloadEnvelopeErrorCode.CACHE_FAIL; blockRoot: RootHex};
33
+
34
+ export class ExecutionPayloadEnvelopeError extends GossipActionError<ExecutionPayloadEnvelopeErrorType> {}
@@ -4,7 +4,10 @@ export * from "./blobSidecarError.js";
4
4
  export * from "./blockError.js";
5
5
  export * from "./blsToExecutionChangeError.js";
6
6
  export * from "./dataColumnSidecarError.js";
7
+ export * from "./executionPayloadBid.js";
8
+ export * from "./executionPayloadEnvelope.js";
7
9
  export * from "./gossipValidation.js";
10
+ export * from "./payloadAttestation.js";
8
11
  export * from "./proposerSlashingError.js";
9
12
  export * from "./syncCommitteeError.js";
10
13
  export * from "./voluntaryExitError.js";
@@ -0,0 +1,25 @@
1
+ import {RootHex, Slot, ValidatorIndex} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.ts";
3
+
4
+ export enum PayloadAttestationErrorCode {
5
+ NOT_CURRENT_SLOT = "PAYLOAD_ATTESTATION_ERROR_NOT_CURRENT_SLOT",
6
+ PAYLOAD_ATTESTATION_ALREADY_KNOWN = "PAYLOAD_ATTESTATION_ERROR_PAYLOAD_ATTESTATION_ALREADY_KNOWN",
7
+ UNKNOWN_BLOCK_ROOT = "PAYLOAD_ATTESTATION_ERROR_UNKNOWN_BLOCK_ROOT",
8
+ INVALID_BLOCK = "PAYLOAD_ATTESTATION_ERROR_INVALID_BLOCK",
9
+ INVALID_ATTESTER = "PAYLOAD_ATTESTATION_ERROR_INVALID_ATTESTER",
10
+ INVALID_SIGNATURE = "PAYLOAD_ATTESTATION_ERROR_INVALID_SIGNATURE",
11
+ }
12
+ export type PayloadAttestationErrorType =
13
+ | {code: PayloadAttestationErrorCode.NOT_CURRENT_SLOT; currentSlot: Slot; slot: Slot}
14
+ | {
15
+ code: PayloadAttestationErrorCode.PAYLOAD_ATTESTATION_ALREADY_KNOWN;
16
+ validatorIndex: ValidatorIndex;
17
+ slot: Slot;
18
+ blockRoot: RootHex;
19
+ }
20
+ | {code: PayloadAttestationErrorCode.UNKNOWN_BLOCK_ROOT; blockRoot: RootHex}
21
+ | {code: PayloadAttestationErrorCode.INVALID_BLOCK; blockRoot: RootHex}
22
+ | {code: PayloadAttestationErrorCode.INVALID_ATTESTER; attesterIndex: ValidatorIndex}
23
+ | {code: PayloadAttestationErrorCode.INVALID_SIGNATURE};
24
+
25
+ export class PayloadAttestationError extends GossipActionError<PayloadAttestationErrorType> {}
@@ -11,6 +11,7 @@ import {
11
11
  import {ZERO_HASH_HEX} from "@lodestar/params";
12
12
  import {
13
13
  CachedBeaconStateAllForks,
14
+ CachedBeaconStateGloas,
14
15
  DataAvailabilityStatus,
15
16
  computeAnchorCheckpoint,
16
17
  computeEpochAtSlot,
@@ -144,6 +145,15 @@ export function initializeForkChoiceFromFinalizedState(
144
145
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
145
146
 
146
147
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
148
+ ...(computeEpochAtSlot(blockHeader.slot) < state.config.GLOAS_FORK_EPOCH
149
+ ? {
150
+ builderIndex: undefined,
151
+ blockHashHex: undefined,
152
+ }
153
+ : {
154
+ builderIndex: (state as CachedBeaconStateGloas).latestExecutionPayloadBid.builderIndex,
155
+ blockHashHex: toRootHex((state as CachedBeaconStateGloas).latestExecutionPayloadBid.blockHash),
156
+ }),
147
157
  },
148
158
  currentSlot
149
159
  ),
@@ -225,6 +235,15 @@ export function initializeForkChoiceFromUnfinalizedState(
225
235
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
226
236
 
227
237
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
238
+ ...(computeEpochAtSlot(blockHeader.slot) < unfinalizedState.config.GLOAS_FORK_EPOCH
239
+ ? {
240
+ builderIndex: undefined,
241
+ blockHashHex: undefined,
242
+ }
243
+ : {
244
+ builderIndex: (unfinalizedState as CachedBeaconStateGloas).latestExecutionPayloadBid.builderIndex,
245
+ blockHashHex: toRootHex((unfinalizedState as CachedBeaconStateGloas).latestExecutionPayloadBid.blockHash),
246
+ }),
228
247
  };
229
248
 
230
249
  const parentSlot = blockHeader.slot - 1;
@@ -46,7 +46,14 @@ import {ForkchoiceCaller} from "./forkChoice/index.js";
46
46
  import {GetBlobsTracker} from "./GetBlobsTracker.js";
47
47
  import {LightClientServer} from "./lightClient/index.js";
48
48
  import {AggregatedAttestationPool} from "./opPools/aggregatedAttestationPool.js";
49
- import {AttestationPool, OpPool, SyncCommitteeMessagePool, SyncContributionAndProofPool} from "./opPools/index.js";
49
+ import {
50
+ AttestationPool,
51
+ ExecutionPayloadBidPool,
52
+ OpPool,
53
+ PayloadAttestationPool,
54
+ SyncCommitteeMessagePool,
55
+ SyncContributionAndProofPool,
56
+ } from "./opPools/index.js";
50
57
  import {IChainOptions} from "./options.js";
51
58
  import {AssembledBlockType, BlockAttributes, BlockType, ProduceResult} from "./produceBlock/produceBlockBody.js";
52
59
  import {IStateRegenerator, RegenCaller} from "./regen/index.js";
@@ -56,6 +63,9 @@ import {
56
63
  SeenAttesters,
57
64
  SeenBlockProposers,
58
65
  SeenContributionAndProof,
66
+ SeenExecutionPayloadBids,
67
+ SeenExecutionPayloadEnvelopes,
68
+ SeenPayloadAttesters,
59
69
  SeenSyncCommitteeMessages,
60
70
  } from "./seenCache/index.js";
61
71
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -116,12 +126,17 @@ export interface IBeaconChain {
116
126
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
117
127
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
118
128
  readonly syncContributionAndProofPool: SyncContributionAndProofPool;
129
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
130
+ readonly payloadAttestationPool: PayloadAttestationPool;
119
131
  readonly opPool: OpPool;
120
132
 
121
133
  // Gossip seen cache
122
134
  readonly seenAttesters: SeenAttesters;
123
135
  readonly seenAggregators: SeenAggregators;
136
+ readonly seenPayloadAttesters: SeenPayloadAttesters;
124
137
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
138
+ readonly seenExecutionPayloadEnvelopes: SeenExecutionPayloadEnvelopes;
139
+ readonly seenExecutionPayloadBids: SeenExecutionPayloadBids;
125
140
  readonly seenBlockProposers: SeenBlockProposers;
126
141
  readonly seenSyncCommitteeMessages: SeenSyncCommitteeMessages;
127
142
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -0,0 +1,77 @@
1
+ import {Slot, gloas} from "@lodestar/types";
2
+ import {MapDef, toRootHex} from "@lodestar/utils";
3
+ import {InsertOutcome} from "./types.js";
4
+ import {pruneBySlot} from "./utils.js";
5
+
6
+ /**
7
+ * TODO GLOAS: Revisit this value and add rational for choosing it
8
+ */
9
+ const SLOTS_RETAINED = 2;
10
+
11
+ type BlockRootHex = string;
12
+ type BlockHashHex = string;
13
+
14
+ /**
15
+ * Store the best execution payload bid per slot / (parent block root, parent block hash).
16
+ */
17
+ export class ExecutionPayloadBidPool {
18
+ private readonly bidByParentHashByParentRootBySlot = new MapDef<
19
+ Slot,
20
+ MapDef<BlockRootHex, Map<BlockHashHex, gloas.ExecutionPayloadBid>>
21
+ >(() => new MapDef<BlockRootHex, Map<BlockHashHex, gloas.ExecutionPayloadBid>>(() => new Map()));
22
+ private lowestPermissibleSlot = 0;
23
+
24
+ get size(): number {
25
+ let count = 0;
26
+ for (const byParentRoot of this.bidByParentHashByParentRootBySlot.values()) {
27
+ for (const byParentHash of byParentRoot.values()) {
28
+ count += byParentHash.size;
29
+ }
30
+ }
31
+ return count;
32
+ }
33
+
34
+ add(bid: gloas.ExecutionPayloadBid): InsertOutcome {
35
+ const {slot, parentBlockRoot, parentBlockHash, value} = bid;
36
+ const lowestPermissibleSlot = this.lowestPermissibleSlot;
37
+
38
+ if (slot < lowestPermissibleSlot) {
39
+ return InsertOutcome.Old;
40
+ }
41
+
42
+ const parentRootHex = toRootHex(parentBlockRoot);
43
+ const parentHashHex = toRootHex(parentBlockHash);
44
+ const bidByParentHash = this.bidByParentHashByParentRootBySlot.getOrDefault(slot).getOrDefault(parentRootHex);
45
+ const existing = bidByParentHash.get(parentHashHex);
46
+
47
+ if (existing) {
48
+ const existingValue = existing.value;
49
+ const newValue = value;
50
+ if (newValue > existingValue) {
51
+ bidByParentHash.set(parentHashHex, bid);
52
+ return InsertOutcome.NewData;
53
+ }
54
+ return newValue === existingValue ? InsertOutcome.AlreadyKnown : InsertOutcome.NotBetterThan;
55
+ }
56
+
57
+ bidByParentHash.set(parentHashHex, bid);
58
+ return InsertOutcome.NewData;
59
+ }
60
+
61
+ /**
62
+ * Return the highest-value bid matching slot, parent block root, and parent block hash.
63
+ * Used for gossip validation and block production.
64
+ */
65
+ getBestBid(
66
+ parentBlockRoot: BlockRootHex,
67
+ parentBlockHash: BlockHashHex,
68
+ slot: Slot
69
+ ): gloas.ExecutionPayloadBid | null {
70
+ const bidByParentHash = this.bidByParentHashByParentRootBySlot.get(slot)?.get(parentBlockRoot);
71
+ return bidByParentHash?.get(parentBlockHash) ?? null;
72
+ }
73
+
74
+ prune(clockSlot: Slot): void {
75
+ this.lowestPermissibleSlot = pruneBySlot(this.bidByParentHashByParentRootBySlot, clockSlot, SLOTS_RETAINED);
76
+ }
77
+ }
@@ -1,5 +1,7 @@
1
1
  export {AggregatedAttestationPool} from "./aggregatedAttestationPool.js";
2
2
  export {AttestationPool} from "./attestationPool.js";
3
+ export {ExecutionPayloadBidPool} from "./executionPayloadBidPool.js";
3
4
  export {OpPool} from "./opPool.js";
5
+ export {PayloadAttestationPool} from "./payloadAttestationPool.js";
4
6
  export {SyncCommitteeMessagePool} from "./syncCommitteeMessagePool.js";
5
7
  export {SyncContributionAndProofPool} from "./syncContributionAndProofPool.js";