@lodestar/beacon-node 1.39.1 → 1.40.0-dev.1020f27ca9

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 (441) 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 -25
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts +2 -7
  5. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.js +0 -12
  7. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  8. package/lib/api/impl/config/constants.d.ts +3 -0
  9. package/lib/api/impl/config/constants.d.ts.map +1 -1
  10. package/lib/api/impl/config/constants.js +5 -1
  11. package/lib/api/impl/config/constants.js.map +1 -1
  12. package/lib/api/impl/debug/index.d.ts +1 -1
  13. package/lib/api/impl/debug/index.d.ts.map +1 -1
  14. package/lib/api/impl/debug/index.js +3 -6
  15. package/lib/api/impl/debug/index.js.map +1 -1
  16. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  17. package/lib/api/impl/lodestar/index.js +16 -3
  18. package/lib/api/impl/lodestar/index.js.map +1 -1
  19. package/lib/api/impl/proof/index.d.ts.map +1 -1
  20. package/lib/api/impl/proof/index.js +1 -2
  21. package/lib/api/impl/proof/index.js.map +1 -1
  22. package/lib/api/impl/validator/index.d.ts.map +1 -1
  23. package/lib/api/impl/validator/index.js +10 -11
  24. package/lib/api/impl/validator/index.js.map +1 -1
  25. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  26. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  27. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  28. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  29. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +5 -3
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  32. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -14
  34. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts +2 -0
  36. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js +6 -0
  38. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  39. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  40. package/lib/chain/blocks/importBlock.js +14 -9
  41. package/lib/chain/blocks/importBlock.js.map +1 -1
  42. package/lib/chain/blocks/index.d.ts.map +1 -1
  43. package/lib/chain/blocks/index.js +0 -14
  44. package/lib/chain/blocks/index.js.map +1 -1
  45. package/lib/chain/blocks/types.d.ts +0 -2
  46. package/lib/chain/blocks/types.d.ts.map +1 -1
  47. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyBlock.js +9 -9
  49. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  51. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  53. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  54. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  55. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +1 -0
  56. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  57. package/lib/chain/blocks/writeBlockInputToDb.d.ts +1 -4
  58. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  59. package/lib/chain/blocks/writeBlockInputToDb.js +20 -28
  60. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  61. package/lib/chain/bls/multithread/index.d.ts +3 -1
  62. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  63. package/lib/chain/bls/multithread/index.js +5 -3
  64. package/lib/chain/bls/multithread/index.js.map +1 -1
  65. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  66. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  67. package/lib/chain/bls/multithread/jobItem.js +2 -2
  68. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  69. package/lib/chain/bls/singleThread.d.ts +4 -2
  70. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  71. package/lib/chain/bls/singleThread.js +4 -2
  72. package/lib/chain/bls/singleThread.js.map +1 -1
  73. package/lib/chain/bls/utils.d.ts +2 -2
  74. package/lib/chain/bls/utils.d.ts.map +1 -1
  75. package/lib/chain/bls/utils.js +9 -6
  76. package/lib/chain/bls/utils.js.map +1 -1
  77. package/lib/chain/chain.d.ts +24 -6
  78. package/lib/chain/chain.d.ts.map +1 -1
  79. package/lib/chain/chain.js +201 -25
  80. package/lib/chain/chain.js.map +1 -1
  81. package/lib/chain/errors/attestationError.d.ts +14 -1
  82. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  83. package/lib/chain/errors/attestationError.js +8 -0
  84. package/lib/chain/errors/attestationError.js.map +1 -1
  85. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  86. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  87. package/lib/chain/errors/executionPayloadBid.js +15 -0
  88. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  89. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  90. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  91. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  92. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  93. package/lib/chain/errors/index.d.ts +3 -0
  94. package/lib/chain/errors/index.d.ts.map +1 -1
  95. package/lib/chain/errors/index.js +3 -0
  96. package/lib/chain/errors/index.js.map +1 -1
  97. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  98. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  99. package/lib/chain/errors/payloadAttestation.js +13 -0
  100. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  101. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  102. package/lib/chain/forkChoice/index.js +18 -0
  103. package/lib/chain/forkChoice/index.js.map +1 -1
  104. package/lib/chain/initState.d.ts +1 -1
  105. package/lib/chain/initState.d.ts.map +1 -1
  106. package/lib/chain/initState.js +5 -3
  107. package/lib/chain/initState.js.map +1 -1
  108. package/lib/chain/interface.d.ts +23 -5
  109. package/lib/chain/interface.d.ts.map +1 -1
  110. package/lib/chain/interface.js.map +1 -1
  111. package/lib/chain/lightClient/proofs.d.ts.map +1 -1
  112. package/lib/chain/lightClient/proofs.js +0 -2
  113. package/lib/chain/lightClient/proofs.js.map +1 -1
  114. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +5 -9
  115. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  116. package/lib/chain/opPools/aggregatedAttestationPool.js +12 -141
  117. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  118. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  119. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  120. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  121. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  122. package/lib/chain/opPools/index.d.ts +2 -0
  123. package/lib/chain/opPools/index.d.ts.map +1 -1
  124. package/lib/chain/opPools/index.js +2 -0
  125. package/lib/chain/opPools/index.js.map +1 -1
  126. package/lib/chain/opPools/opPool.js +5 -8
  127. package/lib/chain/opPools/opPool.js.map +1 -1
  128. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  129. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  130. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  131. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  132. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  133. package/lib/chain/prepareNextSlot.js +9 -10
  134. package/lib/chain/prepareNextSlot.js.map +1 -1
  135. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  136. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  137. package/lib/chain/produceBlock/produceBlockBody.js +6 -4
  138. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  139. package/lib/chain/regen/interface.d.ts +4 -13
  140. package/lib/chain/regen/interface.d.ts.map +1 -1
  141. package/lib/chain/regen/interface.js +1 -1
  142. package/lib/chain/regen/interface.js.map +1 -1
  143. package/lib/chain/regen/queued.d.ts +5 -9
  144. package/lib/chain/regen/queued.d.ts.map +1 -1
  145. package/lib/chain/regen/queued.js +16 -40
  146. package/lib/chain/regen/queued.js.map +1 -1
  147. package/lib/chain/regen/regen.d.ts +6 -8
  148. package/lib/chain/regen/regen.d.ts.map +1 -1
  149. package/lib/chain/regen/regen.js +20 -34
  150. package/lib/chain/regen/regen.js.map +1 -1
  151. package/lib/chain/seenCache/index.d.ts +3 -1
  152. package/lib/chain/seenCache/index.d.ts.map +1 -1
  153. package/lib/chain/seenCache/index.js +3 -1
  154. package/lib/chain/seenCache/index.js.map +1 -1
  155. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  156. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  157. package/lib/chain/seenCache/seenAttesters.js +5 -0
  158. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  159. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  160. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  161. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  162. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  163. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  164. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  165. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  166. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  167. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  168. package/lib/chain/shufflingCache.d.ts +16 -11
  169. package/lib/chain/shufflingCache.d.ts.map +1 -1
  170. package/lib/chain/shufflingCache.js +47 -41
  171. package/lib/chain/shufflingCache.js.map +1 -1
  172. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +1 -2
  173. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -1
  174. package/lib/chain/stateCache/blockStateCacheImpl.js +2 -2
  175. package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
  176. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -2
  177. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  178. package/lib/chain/stateCache/fifoBlockStateCache.js +4 -4
  179. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  180. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +4 -5
  181. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -1
  182. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +9 -10
  183. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
  184. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +5 -6
  185. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  186. package/lib/chain/stateCache/persistentCheckpointsCache.js +17 -17
  187. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  188. package/lib/chain/stateCache/types.d.ts +5 -6
  189. package/lib/chain/stateCache/types.d.ts.map +1 -1
  190. package/lib/chain/stateCache/types.js.map +1 -1
  191. package/lib/chain/validation/aggregateAndProof.js +35 -14
  192. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  193. package/lib/chain/validation/attestation.d.ts +2 -2
  194. package/lib/chain/validation/attestation.d.ts.map +1 -1
  195. package/lib/chain/validation/attestation.js +28 -9
  196. package/lib/chain/validation/attestation.js.map +1 -1
  197. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  198. package/lib/chain/validation/attesterSlashing.js +2 -2
  199. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  200. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  201. package/lib/chain/validation/blobSidecar.js +3 -3
  202. package/lib/chain/validation/blobSidecar.js.map +1 -1
  203. package/lib/chain/validation/block.d.ts.map +1 -1
  204. package/lib/chain/validation/block.js +7 -4
  205. package/lib/chain/validation/block.js.map +1 -1
  206. package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -1
  207. package/lib/chain/validation/blsToExecutionChange.js +9 -2
  208. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  209. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  210. package/lib/chain/validation/dataColumnSidecar.js +3 -3
  211. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  212. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  213. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  214. package/lib/chain/validation/executionPayloadBid.js +104 -0
  215. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  216. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  217. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  218. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  219. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  220. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  221. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  222. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  223. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  224. package/lib/chain/validation/proposerSlashing.js +3 -2
  225. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  226. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  227. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  228. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  229. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  230. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  231. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  232. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  233. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  234. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  235. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  236. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  237. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  238. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  239. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  240. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  241. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  242. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  243. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  244. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  245. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  246. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  247. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  248. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  249. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  250. package/lib/chain/validation/syncCommittee.js +1 -1
  251. package/lib/chain/validation/syncCommittee.js.map +1 -1
  252. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  253. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  254. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  255. package/lib/chain/validation/voluntaryExit.js +1 -1
  256. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  257. package/lib/chain/validatorMonitor.d.ts +2 -0
  258. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  259. package/lib/chain/validatorMonitor.js +49 -7
  260. package/lib/chain/validatorMonitor.js.map +1 -1
  261. package/lib/db/repositories/checkpointState.d.ts +2 -6
  262. package/lib/db/repositories/checkpointState.d.ts.map +1 -1
  263. package/lib/db/repositories/checkpointState.js +3 -16
  264. package/lib/db/repositories/checkpointState.js.map +1 -1
  265. package/lib/db/repositories/stateArchive.d.ts +9 -9
  266. package/lib/db/repositories/stateArchive.d.ts.map +1 -1
  267. package/lib/db/repositories/stateArchive.js +6 -21
  268. package/lib/db/repositories/stateArchive.js.map +1 -1
  269. package/lib/execution/engine/mock.d.ts +9 -6
  270. package/lib/execution/engine/mock.d.ts.map +1 -1
  271. package/lib/execution/engine/mock.js +34 -7
  272. package/lib/execution/engine/mock.js.map +1 -1
  273. package/lib/index.d.ts +1 -1
  274. package/lib/index.d.ts.map +1 -1
  275. package/lib/index.js +1 -1
  276. package/lib/index.js.map +1 -1
  277. package/lib/metrics/metrics/lodestar.d.ts +28 -6
  278. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  279. package/lib/metrics/metrics/lodestar.js +67 -17
  280. package/lib/metrics/metrics/lodestar.js.map +1 -1
  281. package/lib/network/gossip/interface.d.ts +20 -2
  282. package/lib/network/gossip/interface.d.ts.map +1 -1
  283. package/lib/network/gossip/interface.js +3 -0
  284. package/lib/network/gossip/interface.js.map +1 -1
  285. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  286. package/lib/network/gossip/scoringParameters.js +38 -2
  287. package/lib/network/gossip/scoringParameters.js.map +1 -1
  288. package/lib/network/gossip/topic.d.ts +77 -1
  289. package/lib/network/gossip/topic.d.ts.map +1 -1
  290. package/lib/network/gossip/topic.js +20 -0
  291. package/lib/network/gossip/topic.js.map +1 -1
  292. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  293. package/lib/network/processor/gossipHandlers.js +34 -3
  294. package/lib/network/processor/gossipHandlers.js.map +1 -1
  295. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  296. package/lib/network/processor/gossipQueues/index.js +16 -0
  297. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  298. package/lib/network/processor/index.d.ts.map +1 -1
  299. package/lib/network/processor/index.js +3 -0
  300. package/lib/network/processor/index.js.map +1 -1
  301. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  302. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -4
  303. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  304. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +1 -2
  305. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  306. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +5 -26
  307. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  308. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +1 -2
  309. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  310. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +5 -7
  311. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  312. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  313. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -2
  314. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  315. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  316. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -5
  317. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  318. package/lib/network/reqresp/handlers/index.js +2 -2
  319. package/lib/network/reqresp/handlers/index.js.map +1 -1
  320. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +1 -1
  321. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  322. package/lib/node/nodejs.d.ts.map +1 -1
  323. package/lib/node/nodejs.js +17 -2
  324. package/lib/node/nodejs.js.map +1 -1
  325. package/lib/sync/backfill/backfill.js +2 -2
  326. package/lib/sync/backfill/backfill.js.map +1 -1
  327. package/lib/sync/backfill/verify.d.ts +1 -2
  328. package/lib/sync/backfill/verify.d.ts.map +1 -1
  329. package/lib/sync/backfill/verify.js +2 -2
  330. package/lib/sync/backfill/verify.js.map +1 -1
  331. package/lib/sync/range/chain.d.ts.map +1 -1
  332. package/lib/sync/range/chain.js +0 -1
  333. package/lib/sync/range/chain.js.map +1 -1
  334. package/lib/sync/range/range.d.ts.map +1 -1
  335. package/lib/sync/range/range.js +0 -3
  336. package/lib/sync/range/range.js.map +1 -1
  337. package/lib/sync/unknownBlock.d.ts.map +1 -1
  338. package/lib/sync/unknownBlock.js +0 -3
  339. package/lib/sync/unknownBlock.js.map +1 -1
  340. package/lib/util/sszBytes.js +1 -1
  341. package/lib/util/sszBytes.js.map +1 -1
  342. package/package.json +15 -15
  343. package/src/api/impl/beacon/blocks/index.ts +17 -25
  344. package/src/api/impl/beacon/state/utils.ts +2 -22
  345. package/src/api/impl/config/constants.ts +8 -0
  346. package/src/api/impl/debug/index.ts +2 -6
  347. package/src/api/impl/lodestar/index.ts +19 -4
  348. package/src/api/impl/proof/index.ts +1 -2
  349. package/src/api/impl/validator/index.ts +13 -14
  350. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  351. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -3
  352. package/src/chain/archiveStore/utils/archiveBlocks.ts +25 -14
  353. package/src/chain/blocks/blockInput/blockInput.ts +8 -0
  354. package/src/chain/blocks/importBlock.ts +15 -9
  355. package/src/chain/blocks/index.ts +0 -19
  356. package/src/chain/blocks/types.ts +0 -2
  357. package/src/chain/blocks/verifyBlock.ts +9 -12
  358. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  359. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +1 -0
  360. package/src/chain/blocks/writeBlockInputToDb.ts +24 -30
  361. package/src/chain/bls/multithread/index.ts +7 -4
  362. package/src/chain/bls/multithread/jobItem.ts +7 -3
  363. package/src/chain/bls/singleThread.ts +5 -3
  364. package/src/chain/bls/utils.ts +15 -7
  365. package/src/chain/chain.ts +230 -36
  366. package/src/chain/errors/attestationError.ts +11 -1
  367. package/src/chain/errors/executionPayloadBid.ts +35 -0
  368. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  369. package/src/chain/errors/index.ts +3 -0
  370. package/src/chain/errors/payloadAttestation.ts +25 -0
  371. package/src/chain/forkChoice/index.ts +19 -0
  372. package/src/chain/initState.ts +5 -3
  373. package/src/chain/interface.ts +34 -3
  374. package/src/chain/lightClient/proofs.ts +0 -2
  375. package/src/chain/opPools/aggregatedAttestationPool.ts +19 -191
  376. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  377. package/src/chain/opPools/index.ts +2 -0
  378. package/src/chain/opPools/opPool.ts +5 -7
  379. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  380. package/src/chain/prepareNextSlot.ts +8 -12
  381. package/src/chain/produceBlock/produceBlockBody.ts +13 -6
  382. package/src/chain/regen/interface.ts +3 -17
  383. package/src/chain/regen/queued.ts +17 -56
  384. package/src/chain/regen/regen.ts +22 -43
  385. package/src/chain/seenCache/index.ts +3 -1
  386. package/src/chain/seenCache/seenAttesters.ts +5 -0
  387. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  388. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  389. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  390. package/src/chain/shufflingCache.ts +67 -50
  391. package/src/chain/stateCache/blockStateCacheImpl.ts +2 -3
  392. package/src/chain/stateCache/fifoBlockStateCache.ts +4 -5
  393. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +9 -15
  394. package/src/chain/stateCache/persistentCheckpointsCache.ts +17 -25
  395. package/src/chain/stateCache/types.ts +5 -10
  396. package/src/chain/validation/aggregateAndProof.ts +36 -14
  397. package/src/chain/validation/attestation.ts +36 -19
  398. package/src/chain/validation/attesterSlashing.ts +9 -7
  399. package/src/chain/validation/blobSidecar.ts +2 -7
  400. package/src/chain/validation/block.ts +8 -4
  401. package/src/chain/validation/blsToExecutionChange.ts +9 -7
  402. package/src/chain/validation/dataColumnSidecar.ts +2 -7
  403. package/src/chain/validation/executionPayloadBid.ts +141 -0
  404. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  405. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  406. package/src/chain/validation/proposerSlashing.ts +3 -7
  407. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  408. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  409. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  410. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  411. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  412. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  413. package/src/chain/validation/syncCommittee.ts +1 -1
  414. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  415. package/src/chain/validation/voluntaryExit.ts +1 -1
  416. package/src/chain/validatorMonitor.ts +62 -8
  417. package/src/db/repositories/checkpointState.ts +3 -19
  418. package/src/db/repositories/stateArchive.ts +13 -27
  419. package/src/execution/engine/mock.ts +40 -13
  420. package/src/index.ts +1 -1
  421. package/src/metrics/metrics/lodestar.ts +68 -17
  422. package/src/network/gossip/interface.ts +17 -0
  423. package/src/network/gossip/scoringParameters.ts +44 -2
  424. package/src/network/gossip/topic.ts +21 -0
  425. package/src/network/processor/gossipHandlers.ts +48 -3
  426. package/src/network/processor/gossipQueues/index.ts +16 -0
  427. package/src/network/processor/index.ts +3 -0
  428. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -4
  429. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +5 -32
  430. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +5 -9
  431. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +5 -2
  432. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -5
  433. package/src/network/reqresp/handlers/index.ts +2 -2
  434. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +1 -1
  435. package/src/node/nodejs.ts +18 -3
  436. package/src/sync/backfill/backfill.ts +2 -2
  437. package/src/sync/backfill/verify.ts +2 -3
  438. package/src/sync/range/chain.ts +0 -1
  439. package/src/sync/range/range.ts +0 -3
  440. package/src/sync/unknownBlock.ts +0 -3
  441. package/src/util/sszBytes.ts +1 -1
@@ -0,0 +1,141 @@
1
+ import {PublicKey} from "@chainsafe/blst";
2
+ import {
3
+ CachedBeaconStateGloas,
4
+ canBuilderCoverBid,
5
+ createSingleSignatureSetFromComponents,
6
+ getExecutionPayloadBidSigningRoot,
7
+ isActiveBuilder,
8
+ } from "@lodestar/state-transition";
9
+ import {gloas} from "@lodestar/types";
10
+ import {toRootHex} from "@lodestar/utils";
11
+ import {ExecutionPayloadBidError, ExecutionPayloadBidErrorCode, GossipAction} from "../errors/index.js";
12
+ import {IBeaconChain} from "../index.js";
13
+ import {RegenCaller} from "../regen/index.js";
14
+
15
+ export async function validateApiExecutionPayloadBid(
16
+ chain: IBeaconChain,
17
+ signedExecutionPayloadBid: gloas.SignedExecutionPayloadBid
18
+ ): Promise<void> {
19
+ return validateExecutionPayloadBid(chain, signedExecutionPayloadBid);
20
+ }
21
+
22
+ export async function validateGossipExecutionPayloadBid(
23
+ chain: IBeaconChain,
24
+ signedExecutionPayloadBid: gloas.SignedExecutionPayloadBid
25
+ ): Promise<void> {
26
+ return validateExecutionPayloadBid(chain, signedExecutionPayloadBid);
27
+ }
28
+
29
+ async function validateExecutionPayloadBid(
30
+ chain: IBeaconChain,
31
+ signedExecutionPayloadBid: gloas.SignedExecutionPayloadBid
32
+ ): Promise<void> {
33
+ const bid = signedExecutionPayloadBid.message;
34
+ const parentBlockRootHex = toRootHex(bid.parentBlockRoot);
35
+ const parentBlockHashHex = toRootHex(bid.parentBlockHash);
36
+ const state = (await chain.getHeadStateAtCurrentEpoch(
37
+ RegenCaller.validateGossipExecutionPayloadBid
38
+ )) as CachedBeaconStateGloas;
39
+
40
+ // [IGNORE] `bid.slot` is the current slot or the next slot.
41
+ const currentSlot = chain.clock.currentSlot;
42
+ if (bid.slot !== currentSlot && bid.slot !== currentSlot + 1) {
43
+ throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
44
+ code: ExecutionPayloadBidErrorCode.INVALID_SLOT,
45
+ builderIndex: bid.builderIndex,
46
+ slot: bid.slot,
47
+ });
48
+ }
49
+
50
+ // [IGNORE] the `SignedProposerPreferences` where `preferences.proposal_slot`
51
+ // is equal to `bid.slot` has been seen.
52
+ // TODO GLOAS: Implement this along with proposer preference
53
+
54
+ // [REJECT] `bid.builder_index` is a valid/active builder index -- i.e.
55
+ // `is_active_builder(state, bid.builder_index)` returns `True`.
56
+ const builder = state.builders.getReadonly(bid.builderIndex);
57
+ if (!isActiveBuilder(builder, state.finalizedCheckpoint.epoch)) {
58
+ throw new ExecutionPayloadBidError(GossipAction.REJECT, {
59
+ code: ExecutionPayloadBidErrorCode.BUILDER_NOT_ELIGIBLE,
60
+ builderIndex: bid.builderIndex,
61
+ });
62
+ }
63
+
64
+ // [REJECT] `bid.execution_payment` is zero.
65
+ if (bid.executionPayment !== 0) {
66
+ throw new ExecutionPayloadBidError(GossipAction.REJECT, {
67
+ code: ExecutionPayloadBidErrorCode.NON_ZERO_EXECUTION_PAYMENT,
68
+ builderIndex: bid.builderIndex,
69
+ executionPayment: bid.executionPayment,
70
+ });
71
+ }
72
+
73
+ // [REJECT] `bid.fee_recipient` matches the `fee_recipient` from the proposer's
74
+ // `SignedProposerPreferences` associated with `bid.slot`.
75
+ // [REJECT] `bid.gas_limit` matches the `gas_limit` from the proposer's
76
+ // `SignedProposerPreferences` associated with `bid.slot`.
77
+ // TODO GLOAS: Implement this along with proposer preference
78
+
79
+ // [IGNORE] this is the first signed bid seen with a valid signature from the given builder for this slot.
80
+ if (chain.seenExecutionPayloadBids.isKnown(bid.slot, bid.builderIndex)) {
81
+ throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
82
+ code: ExecutionPayloadBidErrorCode.BID_ALREADY_KNOWN,
83
+ builderIndex: bid.builderIndex,
84
+ slot: bid.slot,
85
+ parentBlockRoot: parentBlockRootHex,
86
+ parentBlockHash: parentBlockHashHex,
87
+ });
88
+ }
89
+
90
+ // [IGNORE] this bid is the highest value bid seen for the corresponding slot
91
+ // and the given parent block hash.
92
+ const bestBid = chain.executionPayloadBidPool.getBestBid(parentBlockRootHex, parentBlockHashHex, bid.slot);
93
+ if (bestBid !== null && bestBid.value >= bid.value) {
94
+ throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
95
+ code: ExecutionPayloadBidErrorCode.BID_TOO_LOW,
96
+ bidValue: bid.value,
97
+ currentHighestBid: bestBid.value,
98
+ });
99
+ }
100
+ // [IGNORE] `bid.value` is less or equal than the builder's excess balance --
101
+ // i.e. `can_builder_cover_bid(state, builder_index, amount)` returns `True`.
102
+ if (!canBuilderCoverBid(state, bid.builderIndex, bid.value)) {
103
+ throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
104
+ code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH,
105
+ bidValue: bid.value,
106
+ builderBalance: builder.balance,
107
+ });
108
+ }
109
+
110
+ // [IGNORE] `bid.parent_block_hash` is the block hash of a known execution
111
+ // payload in fork choice.
112
+ // TODO GLOAS: implement this
113
+
114
+ // [IGNORE] `bid.parent_block_root` is the hash tree root of a known beacon
115
+ // block in fork choice.
116
+ const block = chain.forkChoice.getBlock(bid.parentBlockRoot);
117
+ if (block === null) {
118
+ throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
119
+ code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT,
120
+ parentBlockRoot: parentBlockRootHex,
121
+ });
122
+ }
123
+
124
+ // [REJECT] `signed_execution_payload_bid.signature` is valid with respect to the `bid.builder_index`.
125
+ const signatureSet = createSingleSignatureSetFromComponents(
126
+ PublicKey.fromBytes(builder.pubkey),
127
+ getExecutionPayloadBidSigningRoot(chain.config, state.slot, bid),
128
+ signedExecutionPayloadBid.signature
129
+ );
130
+
131
+ if (!(await chain.bls.verifySignatureSets([signatureSet]))) {
132
+ throw new ExecutionPayloadBidError(GossipAction.REJECT, {
133
+ code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE,
134
+ builderIndex: bid.builderIndex,
135
+ slot: bid.slot,
136
+ });
137
+ }
138
+
139
+ // Valid
140
+ chain.seenExecutionPayloadBids.add(bid.slot, bid.builderIndex);
141
+ }
@@ -0,0 +1,122 @@
1
+ import {PublicKey} from "@chainsafe/blst";
2
+ import {
3
+ CachedBeaconStateGloas,
4
+ computeStartSlotAtEpoch,
5
+ createSingleSignatureSetFromComponents,
6
+ getExecutionPayloadEnvelopeSigningRoot,
7
+ } from "@lodestar/state-transition";
8
+ import {gloas} from "@lodestar/types";
9
+ import {toRootHex} from "@lodestar/utils";
10
+ import {ExecutionPayloadEnvelopeError, ExecutionPayloadEnvelopeErrorCode, GossipAction} from "../errors/index.js";
11
+ import {IBeaconChain} from "../index.js";
12
+
13
+ export async function validateApiExecutionPayloadEnvelope(
14
+ chain: IBeaconChain,
15
+ executionPayloadEnvelope: gloas.SignedExecutionPayloadEnvelope
16
+ ): Promise<void> {
17
+ return validateExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
18
+ }
19
+
20
+ export async function validateGossipExecutionPayloadEnvelope(
21
+ chain: IBeaconChain,
22
+ executionPayloadEnvelope: gloas.SignedExecutionPayloadEnvelope
23
+ ): Promise<void> {
24
+ return validateExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
25
+ }
26
+
27
+ async function validateExecutionPayloadEnvelope(
28
+ chain: IBeaconChain,
29
+ executionPayloadEnvelope: gloas.SignedExecutionPayloadEnvelope
30
+ ): Promise<void> {
31
+ const envelope = executionPayloadEnvelope.message;
32
+ const {payload} = envelope;
33
+ const blockRootHex = toRootHex(envelope.beaconBlockRoot);
34
+
35
+ // [IGNORE] The envelope's block root `envelope.block_root` has been seen (via
36
+ // gossip or non-gossip sources) (a client MAY queue payload for processing once
37
+ // the block is retrieved).
38
+ // TODO GLOAS: Need to review this
39
+ const block = chain.forkChoice.getBlock(envelope.beaconBlockRoot);
40
+ if (block === null) {
41
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
42
+ code: ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN,
43
+ blockRoot: blockRootHex,
44
+ });
45
+ }
46
+
47
+ // [IGNORE] The node has not seen another valid
48
+ // `SignedExecutionPayloadEnvelope` for this block root from this builder.
49
+ if (chain.seenExecutionPayloadEnvelopes.isKnown(blockRootHex)) {
50
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
51
+ code: ExecutionPayloadEnvelopeErrorCode.ENVELOPE_ALREADY_KNOWN,
52
+ blockRoot: blockRootHex,
53
+ slot: envelope.slot,
54
+ });
55
+ }
56
+
57
+ // [IGNORE] The envelope is from a slot greater than or equal to the latest finalized slot -- i.e. validate that `envelope.slot >= compute_start_slot_at_epoch(store.finalized_checkpoint.epoch)`
58
+ const finalizedCheckpoint = chain.forkChoice.getFinalizedCheckpoint();
59
+ const finalizedSlot = computeStartSlotAtEpoch(finalizedCheckpoint.epoch);
60
+ if (envelope.slot < finalizedSlot) {
61
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
62
+ code: ExecutionPayloadEnvelopeErrorCode.BELONG_TO_FINALIZED_BLOCK,
63
+ envelopeSlot: envelope.slot,
64
+ finalizedSlot,
65
+ });
66
+ }
67
+
68
+ // [REJECT] `block` passes validation.
69
+ // TODO GLOAS: implement this. Technically if we cannot get proto block from fork choice,
70
+ // it is possible that the block didn't pass the validation
71
+
72
+ // [REJECT] `block.slot` equals `envelope.slot`.
73
+ if (block.slot !== envelope.slot) {
74
+ throw new ExecutionPayloadEnvelopeError(GossipAction.REJECT, {
75
+ code: ExecutionPayloadEnvelopeErrorCode.SLOT_MISMATCH,
76
+ envelopeSlot: envelope.slot,
77
+ blockSlot: block.slot,
78
+ });
79
+ }
80
+
81
+ if (block.builderIndex === undefined || block.blockHashHex === undefined) {
82
+ // This indicates this block is a pre-gloas block which is wrong
83
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
84
+ code: ExecutionPayloadEnvelopeErrorCode.CACHE_FAIL,
85
+ blockRoot: blockRootHex,
86
+ });
87
+ }
88
+
89
+ // [REJECT] `envelope.builder_index == bid.builder_index`
90
+ if (envelope.builderIndex !== block.builderIndex) {
91
+ throw new ExecutionPayloadEnvelopeError(GossipAction.REJECT, {
92
+ code: ExecutionPayloadEnvelopeErrorCode.BUILDER_INDEX_MISMATCH,
93
+ envelopeBuilderIndex: envelope.builderIndex,
94
+ bidBuilderIndex: block.builderIndex,
95
+ });
96
+ }
97
+
98
+ // [REJECT] `payload.block_hash == bid.block_hash`
99
+ if (toRootHex(payload.blockHash) !== block.blockHashHex) {
100
+ throw new ExecutionPayloadEnvelopeError(GossipAction.REJECT, {
101
+ code: ExecutionPayloadEnvelopeErrorCode.BLOCK_HASH_MISMATCH,
102
+ envelopeBlockHash: toRootHex(payload.blockHash),
103
+ bidBlockHash: block.blockHashHex,
104
+ });
105
+ }
106
+
107
+ // [REJECT] `signed_execution_payload_envelope.signature` is valid with respect to the builder's public key.
108
+ const state = chain.getHeadState() as CachedBeaconStateGloas;
109
+ const signatureSet = createSingleSignatureSetFromComponents(
110
+ PublicKey.fromBytes(state.builders.getReadonly(envelope.builderIndex).pubkey),
111
+ getExecutionPayloadEnvelopeSigningRoot(chain.config, envelope),
112
+ executionPayloadEnvelope.signature
113
+ );
114
+
115
+ if (!(await chain.bls.verifySignatureSets([signatureSet]))) {
116
+ throw new ExecutionPayloadEnvelopeError(GossipAction.REJECT, {
117
+ code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE,
118
+ });
119
+ }
120
+
121
+ chain.seenExecutionPayloadEnvelopes.add(blockRootHex, envelope.slot);
122
+ }
@@ -0,0 +1,109 @@
1
+ import {
2
+ CachedBeaconStateGloas,
3
+ computeEpochAtSlot,
4
+ createSingleSignatureSetFromComponents,
5
+ getPayloadAttestationDataSigningRoot,
6
+ } from "@lodestar/state-transition";
7
+ import {RootHex, gloas, ssz} from "@lodestar/types";
8
+ import {toRootHex} from "@lodestar/utils";
9
+ import {GossipAction, PayloadAttestationError, PayloadAttestationErrorCode} from "../errors/index.js";
10
+ import {IBeaconChain} from "../index.js";
11
+
12
+ export type PayloadAttestationValidationResult = {
13
+ attDataRootHex: RootHex;
14
+ validatorCommitteeIndex: number;
15
+ };
16
+
17
+ export async function validateApiPayloadAttestationMessage(
18
+ chain: IBeaconChain,
19
+ payloadAttestationMessage: gloas.PayloadAttestationMessage
20
+ ): Promise<PayloadAttestationValidationResult> {
21
+ return validatePayloadAttestationMessage(chain, payloadAttestationMessage);
22
+ }
23
+
24
+ export async function validateGossipPayloadAttestationMessage(
25
+ chain: IBeaconChain,
26
+ payloadAttestationMessage: gloas.PayloadAttestationMessage
27
+ ): Promise<PayloadAttestationValidationResult> {
28
+ return validatePayloadAttestationMessage(chain, payloadAttestationMessage);
29
+ }
30
+
31
+ async function validatePayloadAttestationMessage(
32
+ chain: IBeaconChain,
33
+ payloadAttestationMessage: gloas.PayloadAttestationMessage
34
+ ): Promise<PayloadAttestationValidationResult> {
35
+ const {data, validatorIndex} = payloadAttestationMessage;
36
+ const epoch = computeEpochAtSlot(data.slot);
37
+
38
+ // [IGNORE] The message's slot is for the current slot (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance), i.e. `data.slot == current_slot`.
39
+ if (!chain.clock.isCurrentSlotGivenGossipDisparity(data.slot)) {
40
+ throw new PayloadAttestationError(GossipAction.IGNORE, {
41
+ code: PayloadAttestationErrorCode.NOT_CURRENT_SLOT,
42
+ currentSlot: chain.clock.currentSlot,
43
+ slot: data.slot,
44
+ });
45
+ }
46
+
47
+ // [IGNORE] The `payload_attestation_message` is the first valid message received
48
+ // from the validator with index `payload_attestation_message.validator_index`.
49
+ // A single validator can participate PTC at most once per epoch
50
+ if (chain.seenPayloadAttesters.isKnown(epoch, validatorIndex)) {
51
+ throw new PayloadAttestationError(GossipAction.IGNORE, {
52
+ code: PayloadAttestationErrorCode.PAYLOAD_ATTESTATION_ALREADY_KNOWN,
53
+ validatorIndex,
54
+ slot: data.slot,
55
+ blockRoot: toRootHex(data.beaconBlockRoot),
56
+ });
57
+ }
58
+
59
+ // [IGNORE] The message's block `data.beacon_block_root` has been seen (via
60
+ // gossip or non-gossip sources) (a client MAY queue attestation for processing
61
+ // once the block is retrieved. Note a client might want to request payload after).
62
+ const block = chain.forkChoice.getBlock(data.beaconBlockRoot);
63
+ if (block === null) {
64
+ throw new PayloadAttestationError(GossipAction.IGNORE, {
65
+ code: PayloadAttestationErrorCode.UNKNOWN_BLOCK_ROOT,
66
+ blockRoot: toRootHex(data.beaconBlockRoot),
67
+ });
68
+ }
69
+
70
+ const state = chain.getHeadState() as CachedBeaconStateGloas;
71
+
72
+ // [REJECT] The message's block `data.beacon_block_root` passes validation.
73
+ // TODO GLOAS: implement this. Technically if we cannot get proto block from fork choice,
74
+ // it is possible that the block didn't pass the validation
75
+
76
+ // [REJECT] The message's validator index is within the payload committee in
77
+ // `get_ptc(state, data.slot)`. The `state` is the head state corresponding to
78
+ // processing the block up to the current slot as determined by the fork choice.
79
+ const ptc = state.epochCtx.getPayloadTimelinessCommittee(data.slot);
80
+ const validatorCommitteeIndex = ptc.indexOf(validatorIndex);
81
+
82
+ if (validatorCommitteeIndex === -1) {
83
+ throw new PayloadAttestationError(GossipAction.REJECT, {
84
+ code: PayloadAttestationErrorCode.INVALID_ATTESTER,
85
+ attesterIndex: validatorIndex,
86
+ });
87
+ }
88
+
89
+ // [REJECT] `payload_attestation_message.signature` is valid with respect to the validator's public key.
90
+ const signatureSet = createSingleSignatureSetFromComponents(
91
+ chain.index2pubkey[validatorIndex],
92
+ getPayloadAttestationDataSigningRoot(chain.config, state.slot, data),
93
+ payloadAttestationMessage.signature
94
+ );
95
+
96
+ if (!(await chain.bls.verifySignatureSets([signatureSet]))) {
97
+ throw new PayloadAttestationError(GossipAction.REJECT, {
98
+ code: PayloadAttestationErrorCode.INVALID_SIGNATURE,
99
+ });
100
+ }
101
+
102
+ // Valid
103
+ chain.seenPayloadAttesters.add(epoch, validatorIndex);
104
+
105
+ return {
106
+ attDataRootHex: toRootHex(ssz.gloas.PayloadAttestationData.hashTreeRoot(data)),
107
+ validatorCommitteeIndex,
108
+ };
109
+ }
@@ -35,8 +35,9 @@ async function validateProposerSlashing(
35
35
 
36
36
  // [REJECT] All of the conditions within process_proposer_slashing pass validation.
37
37
  try {
38
+ const proposer = state.validators.getReadonly(proposerSlashing.signedHeader1.message.proposerIndex);
38
39
  // verifySignature = false, verified in batch below
39
- assertValidProposerSlashing(state, proposerSlashing, false);
40
+ assertValidProposerSlashing(chain.config, chain.index2pubkey, state.slot, proposerSlashing, proposer, false);
40
41
  } catch (e) {
41
42
  throw new ProposerSlashingError(GossipAction.REJECT, {
42
43
  code: ProposerSlashingErrorCode.INVALID,
@@ -44,12 +45,7 @@ async function validateProposerSlashing(
44
45
  });
45
46
  }
46
47
 
47
- const signatureSets = getProposerSlashingSignatureSets(
48
- chain.config,
49
- chain.index2pubkey,
50
- state.slot,
51
- proposerSlashing
52
- );
48
+ const signatureSets = getProposerSlashingSignatureSets(chain.config, state.slot, proposerSlashing);
53
49
  if (!(await chain.bls.verifySignatureSets(signatureSets, {batchable: true, priority: prioritizeBls}))) {
54
50
  throw new ProposerSlashingError(GossipAction.REJECT, {
55
51
  code: ProposerSlashingErrorCode.INVALID,
@@ -1,13 +1,7 @@
1
- import {PublicKey} from "@chainsafe/blst";
2
1
  import {BeaconConfig} from "@lodestar/config";
3
2
  import {DOMAIN_AGGREGATE_AND_PROOF, ForkSeq} from "@lodestar/params";
4
- import {
5
- ISignatureSet,
6
- computeSigningRoot,
7
- computeStartSlotAtEpoch,
8
- createSingleSignatureSetFromComponents,
9
- } from "@lodestar/state-transition";
10
- import {Epoch, SignedAggregateAndProof, ssz} from "@lodestar/types";
3
+ import {ISignatureSet, SignatureSetType, computeSigningRoot, computeStartSlotAtEpoch} from "@lodestar/state-transition";
4
+ import {Epoch, SignedAggregateAndProof, ValidatorIndex, ssz} from "@lodestar/types";
11
5
 
12
6
  export function getAggregateAndProofSigningRoot(
13
7
  config: BeaconConfig,
@@ -27,12 +21,13 @@ export function getAggregateAndProofSigningRoot(
27
21
  export function getAggregateAndProofSignatureSet(
28
22
  config: BeaconConfig,
29
23
  epoch: Epoch,
30
- aggregator: PublicKey,
24
+ aggregatorIndex: ValidatorIndex,
31
25
  aggregateAndProof: SignedAggregateAndProof
32
26
  ): ISignatureSet {
33
- return createSingleSignatureSetFromComponents(
34
- aggregator,
35
- getAggregateAndProofSigningRoot(config, epoch, aggregateAndProof),
36
- aggregateAndProof.signature
37
- );
27
+ return {
28
+ type: SignatureSetType.indexed,
29
+ index: aggregatorIndex,
30
+ signingRoot: getAggregateAndProofSigningRoot(config, epoch, aggregateAndProof),
31
+ signature: aggregateAndProof.signature,
32
+ };
38
33
  }
@@ -3,7 +3,6 @@ import {DOMAIN_CONTRIBUTION_AND_PROOF} from "@lodestar/params";
3
3
  import {
4
4
  CachedBeaconStateAllForks,
5
5
  ISignatureSet,
6
- Index2PubkeyCache,
7
6
  SignatureSetType,
8
7
  computeSigningRoot,
9
8
  } from "@lodestar/state-transition";
@@ -11,7 +10,6 @@ import {altair, ssz} from "@lodestar/types";
11
10
 
12
11
  export function getContributionAndProofSignatureSet(
13
12
  config: BeaconConfig,
14
- index2pubkey: Index2PubkeyCache,
15
13
  state: CachedBeaconStateAllForks,
16
14
  signedContributionAndProof: altair.SignedContributionAndProof
17
15
  ): ISignatureSet {
@@ -22,8 +20,8 @@ export function getContributionAndProofSignatureSet(
22
20
  );
23
21
  const signingData = signedContributionAndProof.message;
24
22
  return {
25
- type: SignatureSetType.single,
26
- pubkey: index2pubkey[signedContributionAndProof.message.aggregatorIndex],
23
+ type: SignatureSetType.indexed,
24
+ index: signedContributionAndProof.message.aggregatorIndex,
27
25
  signingRoot: computeSigningRoot(ssz.altair.ContributionAndProof, signingData, domain),
28
26
  signature: signedContributionAndProof.signature,
29
27
  };
@@ -1,8 +1,7 @@
1
- import {PublicKey} from "@chainsafe/blst";
2
1
  import {BeaconConfig} from "@lodestar/config";
3
2
  import {DOMAIN_SELECTION_PROOF} from "@lodestar/params";
4
- import {ISignatureSet, computeSigningRoot, createSingleSignatureSetFromComponents} from "@lodestar/state-transition";
5
- import {Slot, phase0, ssz} from "@lodestar/types";
3
+ import {ISignatureSet, SignatureSetType, computeSigningRoot} from "@lodestar/state-transition";
4
+ import {Slot, ValidatorIndex, phase0, ssz} from "@lodestar/types";
6
5
 
7
6
  export function getSelectionProofSigningRoot(config: BeaconConfig, slot: Slot): Uint8Array {
8
7
  // previously, we call `const selectionProofDomain = config.getDomain(state.slot, DOMAIN_SELECTION_PROOF, slot)`
@@ -16,12 +15,13 @@ export function getSelectionProofSigningRoot(config: BeaconConfig, slot: Slot):
16
15
  export function getSelectionProofSignatureSet(
17
16
  config: BeaconConfig,
18
17
  slot: Slot,
19
- aggregator: PublicKey,
18
+ aggregatorIndex: ValidatorIndex,
20
19
  aggregateAndProof: phase0.SignedAggregateAndProof
21
20
  ): ISignatureSet {
22
- return createSingleSignatureSetFromComponents(
23
- aggregator,
24
- getSelectionProofSigningRoot(config, slot),
25
- aggregateAndProof.message.selectionProof
26
- );
21
+ return {
22
+ type: SignatureSetType.indexed,
23
+ index: aggregatorIndex,
24
+ signingRoot: getSelectionProofSigningRoot(config, slot),
25
+ signature: aggregateAndProof.message.selectionProof,
26
+ };
27
27
  }
@@ -3,7 +3,6 @@ import {DOMAIN_SYNC_COMMITTEE} from "@lodestar/params";
3
3
  import {
4
4
  CachedBeaconStateAllForks,
5
5
  ISignatureSet,
6
- Index2PubkeyCache,
7
6
  SignatureSetType,
8
7
  computeSigningRoot,
9
8
  } from "@lodestar/state-transition";
@@ -11,15 +10,14 @@ import {altair, ssz} from "@lodestar/types";
11
10
 
12
11
  export function getSyncCommitteeSignatureSet(
13
12
  config: BeaconConfig,
14
- index2pubkey: Index2PubkeyCache,
15
13
  state: CachedBeaconStateAllForks,
16
14
  syncCommittee: altair.SyncCommitteeMessage
17
15
  ): ISignatureSet {
18
16
  const domain = config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE, syncCommittee.slot);
19
17
 
20
18
  return {
21
- type: SignatureSetType.single,
22
- pubkey: index2pubkey[syncCommittee.validatorIndex],
19
+ type: SignatureSetType.indexed,
20
+ index: syncCommittee.validatorIndex,
23
21
  signingRoot: computeSigningRoot(ssz.Root, syncCommittee.beaconBlockRoot, domain),
24
22
  signature: syncCommittee.signature,
25
23
  };
@@ -1,4 +1,3 @@
1
- import {PublicKey} from "@chainsafe/blst";
2
1
  import {BeaconConfig} from "@lodestar/config";
3
2
  import {DOMAIN_SYNC_COMMITTEE} from "@lodestar/params";
4
3
  import {CachedBeaconStateAltair, ISignatureSet, SignatureSetType, computeSigningRoot} from "@lodestar/state-transition";
@@ -8,12 +7,12 @@ export function getSyncCommitteeContributionSignatureSet(
8
7
  config: BeaconConfig,
9
8
  state: CachedBeaconStateAltair,
10
9
  contribution: altair.SyncCommitteeContribution,
11
- pubkeys: PublicKey[]
10
+ participantIndices: number[]
12
11
  ): ISignatureSet {
13
12
  const domain = config.getDomain(state.slot, DOMAIN_SYNC_COMMITTEE, contribution.slot);
14
13
  return {
15
14
  type: SignatureSetType.aggregate,
16
- pubkeys,
15
+ indices: participantIndices,
17
16
  signingRoot: computeSigningRoot(ssz.Root, contribution.beaconBlockRoot, domain),
18
17
  signature: contribution.signature,
19
18
  };
@@ -3,7 +3,6 @@ import {DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF} from "@lodestar/params";
3
3
  import {
4
4
  CachedBeaconStateAllForks,
5
5
  ISignatureSet,
6
- Index2PubkeyCache,
7
6
  SignatureSetType,
8
7
  computeSigningRoot,
9
8
  } from "@lodestar/state-transition";
@@ -11,7 +10,6 @@ import {altair, ssz} from "@lodestar/types";
11
10
 
12
11
  export function getSyncCommitteeSelectionProofSignatureSet(
13
12
  config: BeaconConfig,
14
- index2pubkey: Index2PubkeyCache,
15
13
  state: CachedBeaconStateAllForks,
16
14
  contributionAndProof: altair.ContributionAndProof
17
15
  ): ISignatureSet {
@@ -22,8 +20,8 @@ export function getSyncCommitteeSelectionProofSignatureSet(
22
20
  subcommitteeIndex: contributionAndProof.contribution.subcommitteeIndex,
23
21
  };
24
22
  return {
25
- type: SignatureSetType.single,
26
- pubkey: index2pubkey[contributionAndProof.aggregatorIndex],
23
+ type: SignatureSetType.indexed,
24
+ index: contributionAndProof.aggregatorIndex,
27
25
  signingRoot: computeSigningRoot(ssz.altair.SyncAggregatorSelectionData, signingData, domain),
28
26
  signature: contributionAndProof.selectionProof,
29
27
  };
@@ -89,7 +89,7 @@ async function validateSyncCommitteeSigOnly(
89
89
  syncCommittee: altair.SyncCommitteeMessage,
90
90
  prioritizeBls = false
91
91
  ): Promise<void> {
92
- const signatureSet = getSyncCommitteeSignatureSet(chain.config, chain.index2pubkey, headState, syncCommittee);
92
+ const signatureSet = getSyncCommitteeSignatureSet(chain.config, headState, syncCommittee);
93
93
  if (!(await chain.bls.verifySignatureSets([signatureSet], {batchable: true, priority: prioritizeBls}))) {
94
94
  throw new SyncCommitteeError(GossipAction.REJECT, {
95
95
  code: SyncCommitteeErrorCode.INVALID_SIGNATURE,
@@ -21,7 +21,6 @@ export async function validateSyncCommitteeGossipContributionAndProof(
21
21
  const contributionAndProof = signedContributionAndProof.message;
22
22
  const {contribution, aggregatorIndex} = contributionAndProof;
23
23
  const {subcommitteeIndex, slot} = contribution;
24
- const {index2pubkey} = chain;
25
24
 
26
25
  const headState = chain.getHeadState();
27
26
  validateGossipSyncCommitteeExceptSig(chain, headState, subcommitteeIndex, {
@@ -74,14 +73,13 @@ export async function validateSyncCommitteeGossipContributionAndProof(
74
73
  // i.e. state.validators[contribution_and_proof.aggregator_index].pubkey in get_sync_subcommittee_pubkeys(state, contribution.subcommittee_index).
75
74
  // > Checked in validateGossipSyncCommitteeExceptSig()
76
75
 
77
- const participantPubkeys = syncCommitteeParticipantIndices.map((validatorIndex) => index2pubkey[validatorIndex]);
78
76
  const signatureSets = [
79
77
  // [REJECT] The contribution_and_proof.selection_proof is a valid signature of the SyncAggregatorSelectionData
80
78
  // derived from the contribution by the validator with index contribution_and_proof.aggregator_index.
81
- getSyncCommitteeSelectionProofSignatureSet(chain.config, index2pubkey, headState, contributionAndProof),
79
+ getSyncCommitteeSelectionProofSignatureSet(chain.config, headState, contributionAndProof),
82
80
 
83
81
  // [REJECT] The aggregator signature, signed_contribution_and_proof.signature, is valid.
84
- getContributionAndProofSignatureSet(chain.config, index2pubkey, headState, signedContributionAndProof),
82
+ getContributionAndProofSignatureSet(chain.config, headState, signedContributionAndProof),
85
83
 
86
84
  // [REJECT] The aggregate signature is valid for the message beacon_block_root and aggregate pubkey derived from
87
85
  // the participation info in aggregation_bits for the subcommittee specified by the contribution.subcommittee_index.
@@ -89,7 +87,7 @@ export async function validateSyncCommitteeGossipContributionAndProof(
89
87
  chain.config,
90
88
  headState as CachedBeaconStateAltair,
91
89
  contribution,
92
- participantPubkeys
90
+ syncCommitteeParticipantIndices
93
91
  ),
94
92
  ];
95
93
 
@@ -59,7 +59,7 @@ async function validateVoluntaryExit(
59
59
  });
60
60
  }
61
61
 
62
- const signatureSet = getVoluntaryExitSignatureSet(chain.config, chain.index2pubkey, state.slot, voluntaryExit);
62
+ const signatureSet = getVoluntaryExitSignatureSet(chain.config, state.slot, voluntaryExit);
63
63
  if (!(await chain.bls.verifySignatureSets([signatureSet], {batchable: true, priority: prioritizeBls}))) {
64
64
  throw new VoluntaryExitError(GossipAction.REJECT, {
65
65
  code: VoluntaryExitErrorCode.INVALID_SIGNATURE,