@lodestar/beacon-node 1.40.0-dev.1cab20c166 → 1.40.0-dev.2ae7375100

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 (253) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +7 -7
  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 +10 -0
  6. package/lib/api/impl/lodestar/index.js.map +1 -1
  7. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  8. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  9. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  10. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  11. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  12. package/lib/chain/blocks/verifyBlock.js +1 -1
  13. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  14. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  15. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  16. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  17. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  18. package/lib/chain/bls/multithread/index.d.ts +3 -1
  19. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  20. package/lib/chain/bls/multithread/index.js +5 -3
  21. package/lib/chain/bls/multithread/index.js.map +1 -1
  22. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  23. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  24. package/lib/chain/bls/multithread/jobItem.js +2 -2
  25. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  26. package/lib/chain/bls/singleThread.d.ts +4 -2
  27. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  28. package/lib/chain/bls/singleThread.js +4 -2
  29. package/lib/chain/bls/singleThread.js.map +1 -1
  30. package/lib/chain/bls/utils.d.ts +2 -2
  31. package/lib/chain/bls/utils.d.ts.map +1 -1
  32. package/lib/chain/bls/utils.js +9 -6
  33. package/lib/chain/bls/utils.js.map +1 -1
  34. package/lib/chain/chain.d.ts +7 -2
  35. package/lib/chain/chain.d.ts.map +1 -1
  36. package/lib/chain/chain.js +27 -9
  37. package/lib/chain/chain.js.map +1 -1
  38. package/lib/chain/errors/attestationError.d.ts +14 -1
  39. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  40. package/lib/chain/errors/attestationError.js +8 -0
  41. package/lib/chain/errors/attestationError.js.map +1 -1
  42. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  43. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  44. package/lib/chain/errors/executionPayloadBid.js +15 -0
  45. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  46. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  47. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  48. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  49. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  50. package/lib/chain/errors/index.d.ts +3 -0
  51. package/lib/chain/errors/index.d.ts.map +1 -1
  52. package/lib/chain/errors/index.js +3 -0
  53. package/lib/chain/errors/index.js.map +1 -1
  54. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  55. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  56. package/lib/chain/errors/payloadAttestation.js +13 -0
  57. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  58. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  59. package/lib/chain/forkChoice/index.js +18 -0
  60. package/lib/chain/forkChoice/index.js.map +1 -1
  61. package/lib/chain/interface.d.ts +7 -2
  62. package/lib/chain/interface.d.ts.map +1 -1
  63. package/lib/chain/interface.js.map +1 -1
  64. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  65. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  66. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  67. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  68. package/lib/chain/opPools/index.d.ts +2 -0
  69. package/lib/chain/opPools/index.d.ts.map +1 -1
  70. package/lib/chain/opPools/index.js +2 -0
  71. package/lib/chain/opPools/index.js.map +1 -1
  72. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  73. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  74. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  75. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  76. package/lib/chain/regen/interface.d.ts +1 -0
  77. package/lib/chain/regen/interface.d.ts.map +1 -1
  78. package/lib/chain/regen/interface.js +1 -0
  79. package/lib/chain/regen/interface.js.map +1 -1
  80. package/lib/chain/regen/regen.d.ts +2 -0
  81. package/lib/chain/regen/regen.d.ts.map +1 -1
  82. package/lib/chain/regen/regen.js +4 -1
  83. package/lib/chain/regen/regen.js.map +1 -1
  84. package/lib/chain/seenCache/index.d.ts +3 -1
  85. package/lib/chain/seenCache/index.d.ts.map +1 -1
  86. package/lib/chain/seenCache/index.js +3 -1
  87. package/lib/chain/seenCache/index.js.map +1 -1
  88. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  89. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  90. package/lib/chain/seenCache/seenAttesters.js +5 -0
  91. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  92. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  93. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  94. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  95. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  96. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  97. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  98. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  99. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  100. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  101. package/lib/chain/validation/aggregateAndProof.js +35 -14
  102. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  103. package/lib/chain/validation/attestation.d.ts +2 -2
  104. package/lib/chain/validation/attestation.d.ts.map +1 -1
  105. package/lib/chain/validation/attestation.js +27 -8
  106. package/lib/chain/validation/attestation.js.map +1 -1
  107. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  108. package/lib/chain/validation/attesterSlashing.js +1 -1
  109. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  110. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  111. package/lib/chain/validation/blobSidecar.js +2 -2
  112. package/lib/chain/validation/blobSidecar.js.map +1 -1
  113. package/lib/chain/validation/block.d.ts.map +1 -1
  114. package/lib/chain/validation/block.js +5 -4
  115. package/lib/chain/validation/block.js.map +1 -1
  116. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  117. package/lib/chain/validation/dataColumnSidecar.js +2 -2
  118. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  119. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  120. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  121. package/lib/chain/validation/executionPayloadBid.js +104 -0
  122. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  123. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  124. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  125. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  126. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  127. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  128. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  129. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  130. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  131. package/lib/chain/validation/proposerSlashing.js +1 -1
  132. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  133. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  134. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  135. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  136. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  137. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  138. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  139. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  140. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  141. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  142. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  143. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  144. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  145. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  146. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  147. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  148. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  149. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  150. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  151. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  152. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  153. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  154. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  155. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  156. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  157. package/lib/chain/validation/syncCommittee.js +1 -1
  158. package/lib/chain/validation/syncCommittee.js.map +1 -1
  159. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  160. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  161. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  162. package/lib/chain/validation/voluntaryExit.js +1 -1
  163. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  164. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  165. package/lib/chain/validatorMonitor.js +7 -4
  166. package/lib/chain/validatorMonitor.js.map +1 -1
  167. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  168. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  169. package/lib/metrics/metrics/lodestar.js +40 -0
  170. package/lib/metrics/metrics/lodestar.js.map +1 -1
  171. package/lib/network/gossip/interface.d.ts +20 -2
  172. package/lib/network/gossip/interface.d.ts.map +1 -1
  173. package/lib/network/gossip/interface.js +3 -0
  174. package/lib/network/gossip/interface.js.map +1 -1
  175. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  176. package/lib/network/gossip/scoringParameters.js +38 -2
  177. package/lib/network/gossip/scoringParameters.js.map +1 -1
  178. package/lib/network/gossip/topic.d.ts +77 -1
  179. package/lib/network/gossip/topic.d.ts.map +1 -1
  180. package/lib/network/gossip/topic.js +20 -0
  181. package/lib/network/gossip/topic.js.map +1 -1
  182. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  183. package/lib/network/processor/gossipHandlers.js +34 -0
  184. package/lib/network/processor/gossipHandlers.js.map +1 -1
  185. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  186. package/lib/network/processor/gossipQueues/index.js +16 -0
  187. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  188. package/lib/network/processor/index.d.ts.map +1 -1
  189. package/lib/network/processor/index.js +3 -0
  190. package/lib/network/processor/index.js.map +1 -1
  191. package/lib/sync/backfill/backfill.js +2 -2
  192. package/lib/sync/backfill/backfill.js.map +1 -1
  193. package/lib/sync/backfill/verify.d.ts +1 -2
  194. package/lib/sync/backfill/verify.d.ts.map +1 -1
  195. package/lib/sync/backfill/verify.js +2 -2
  196. package/lib/sync/backfill/verify.js.map +1 -1
  197. package/package.json +15 -15
  198. package/src/api/impl/beacon/blocks/index.ts +9 -7
  199. package/src/api/impl/lodestar/index.ts +12 -0
  200. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  201. package/src/chain/blocks/verifyBlock.ts +0 -1
  202. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  203. package/src/chain/bls/multithread/index.ts +7 -4
  204. package/src/chain/bls/multithread/jobItem.ts +7 -3
  205. package/src/chain/bls/singleThread.ts +5 -3
  206. package/src/chain/bls/utils.ts +15 -7
  207. package/src/chain/chain.ts +30 -7
  208. package/src/chain/errors/attestationError.ts +11 -1
  209. package/src/chain/errors/executionPayloadBid.ts +35 -0
  210. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  211. package/src/chain/errors/index.ts +3 -0
  212. package/src/chain/errors/payloadAttestation.ts +25 -0
  213. package/src/chain/forkChoice/index.ts +19 -0
  214. package/src/chain/interface.ts +16 -1
  215. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  216. package/src/chain/opPools/index.ts +2 -0
  217. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  218. package/src/chain/regen/interface.ts +1 -0
  219. package/src/chain/regen/regen.ts +6 -1
  220. package/src/chain/seenCache/index.ts +3 -1
  221. package/src/chain/seenCache/seenAttesters.ts +5 -0
  222. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  223. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  224. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  225. package/src/chain/validation/aggregateAndProof.ts +36 -14
  226. package/src/chain/validation/attestation.ts +33 -16
  227. package/src/chain/validation/attesterSlashing.ts +1 -6
  228. package/src/chain/validation/blobSidecar.ts +1 -6
  229. package/src/chain/validation/block.ts +5 -4
  230. package/src/chain/validation/dataColumnSidecar.ts +1 -6
  231. package/src/chain/validation/executionPayloadBid.ts +141 -0
  232. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  233. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  234. package/src/chain/validation/proposerSlashing.ts +1 -6
  235. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  236. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  237. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  238. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  239. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  240. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  241. package/src/chain/validation/syncCommittee.ts +1 -1
  242. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  243. package/src/chain/validation/voluntaryExit.ts +1 -1
  244. package/src/chain/validatorMonitor.ts +10 -5
  245. package/src/metrics/metrics/lodestar.ts +40 -0
  246. package/src/network/gossip/interface.ts +17 -0
  247. package/src/network/gossip/scoringParameters.ts +44 -2
  248. package/src/network/gossip/topic.ts +21 -0
  249. package/src/network/processor/gossipHandlers.ts +48 -0
  250. package/src/network/processor/gossipQueues/index.ts +16 -0
  251. package/src/network/processor/index.ts +3 -0
  252. package/src/sync/backfill/backfill.ts +2 -2
  253. package/src/sync/backfill/verify.ts +2 -3
@@ -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
+ }
@@ -45,12 +45,7 @@ async function validateProposerSlashing(
45
45
  });
46
46
  }
47
47
 
48
- const signatureSets = getProposerSlashingSignatureSets(
49
- chain.config,
50
- chain.index2pubkey,
51
- state.slot,
52
- proposerSlashing
53
- );
48
+ const signatureSets = getProposerSlashingSignatureSets(chain.config, state.slot, proposerSlashing);
54
49
  if (!(await chain.bls.verifySignatureSets(signatureSets, {batchable: true, priority: prioritizeBls}))) {
55
50
  throw new ProposerSlashingError(GossipAction.REJECT, {
56
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,
@@ -347,6 +347,9 @@ export function createValidatorMonitor(
347
347
  return;
348
348
  }
349
349
 
350
+ // Track total balance instead of per-validator balance to reduce metric cardinality
351
+ let totalBalance = 0;
352
+
350
353
  for (const [index, monitoredValidator] of validators.entries()) {
351
354
  // We subtract two from the state of the epoch that generated these summaries.
352
355
  //
@@ -405,7 +408,7 @@ export function createValidatorMonitor(
405
408
 
406
409
  const balance = balances?.[index];
407
410
  if (balance !== undefined) {
408
- validatorMonitorMetrics?.prevEpochOnChainBalance.set({index}, balance);
411
+ totalBalance += balance;
409
412
  }
410
413
 
411
414
  if (!summary.isPrevSourceAttester || !summary.isPrevTargetAttester || !summary.isPrevHeadAttester) {
@@ -420,6 +423,10 @@ export function createValidatorMonitor(
420
423
  });
421
424
  }
422
425
  }
426
+
427
+ if (balances !== undefined) {
428
+ validatorMonitorMetrics?.prevEpochOnChainBalance.set(totalBalance);
429
+ }
423
430
  },
424
431
 
425
432
  registerBeaconBlock(src, delaySec, block) {
@@ -1153,11 +1160,9 @@ function createValidatorMonitorMetrics(register: RegistryMetricCreator) {
1153
1160
  }),
1154
1161
 
1155
1162
  // Validator Monitor Metrics (per-epoch summaries)
1156
- // Only track prevEpochOnChainBalance per index
1157
- prevEpochOnChainBalance: register.gauge<{index: number}>({
1163
+ prevEpochOnChainBalance: register.gauge({
1158
1164
  name: "validator_monitor_prev_epoch_on_chain_balance",
1159
- help: "Balance of validator after an epoch",
1160
- labelNames: ["index"],
1165
+ help: "Total balance of all monitored validators after an epoch",
1161
1166
  }),
1162
1167
  prevEpochOnChainAttesterHit: register.gauge({
1163
1168
  name: "validator_monitor_prev_epoch_on_chain_attester_hit_total",
@@ -1141,6 +1141,46 @@ export function createLodestarMetrics(
1141
1141
  help: "Total number of empty returns in SyncContributionAndProofPool.getAggregate(slot, root)",
1142
1142
  }),
1143
1143
  },
1144
+ payloadAttestationPool: {
1145
+ size: register.gauge({
1146
+ name: "lodestar_oppool_payload_attestation_pool_size",
1147
+ help: "Current size of the PayloadAttestationPool = total payload attestations unique by data and slot",
1148
+ }),
1149
+ payloadAttDataPerSlot: register.gauge({
1150
+ name: "lodestar_oppool_payload_attestation_pool_payload_attestation_data_per_slot_total",
1151
+ help: "Total number of payload attestation data per slot in PayloadAttestationPool",
1152
+ }),
1153
+ gossipInsertOutcome: register.counter<{insertOutcome: InsertOutcome}>({
1154
+ name: "lodestar_oppool_payload_attestation_pool_gossip_insert_outcome_total",
1155
+ help: "Total number of InsertOutcome as a result of adding a payload attestation message from gossip to the pool",
1156
+ labelNames: ["insertOutcome"],
1157
+ }),
1158
+ apiInsertOutcome: register.counter<{insertOutcome: InsertOutcome}>({
1159
+ name: "lodestar_oppool_payload_attestation_pool_api_insert_outcome_total",
1160
+ help: "Total number of InsertOutcome as a result of adding a payload attestation message from api to the pool",
1161
+ labelNames: ["insertOutcome"],
1162
+ }),
1163
+ getPayloadAttestationsCacheMisses: register.counter({
1164
+ name: "lodestar_oppool_payload_attestation_pool_get_payload_attestations_cache_misses_total",
1165
+ help: "Total number of getPayloadAttestationsForBlock calls with no aggregate for slot and payload attestation data root",
1166
+ }),
1167
+ },
1168
+ executionPayloadBidPool: {
1169
+ size: register.gauge({
1170
+ name: "lodestar_oppool_execution_payload_bid_pool_size",
1171
+ help: "Current size of the ExecutionPayloadBidPool = total number of bids",
1172
+ }),
1173
+ gossipInsertOutcome: register.counter<{insertOutcome: InsertOutcome}>({
1174
+ name: "lodestar_oppool_execution_payload_bid_pool_gossip_insert_outcome_total",
1175
+ help: "Total number of InsertOutcome as a result of adding an execution payload bid from gossip to the pool",
1176
+ labelNames: ["insertOutcome"],
1177
+ }),
1178
+ apiInsertOutcome: register.counter<{insertOutcome: InsertOutcome}>({
1179
+ name: "lodestar_oppool_execution_payload_bid_pool_api_insert_outcome_total",
1180
+ help: "Total number of InsertOutcome as a result of adding an execution payload bid from api to the pool",
1181
+ labelNames: ["insertOutcome"],
1182
+ }),
1183
+ },
1144
1184
  },
1145
1185
 
1146
1186
  chain: {
@@ -15,6 +15,7 @@ import {
15
15
  capella,
16
16
  deneb,
17
17
  fulu,
18
+ gloas,
18
19
  phase0,
19
20
  } from "@lodestar/types";
20
21
  import {Logger} from "@lodestar/utils";
@@ -37,6 +38,9 @@ export enum GossipType {
37
38
  light_client_finality_update = "light_client_finality_update",
38
39
  light_client_optimistic_update = "light_client_optimistic_update",
39
40
  bls_to_execution_change = "bls_to_execution_change",
41
+ execution_payload = "execution_payload",
42
+ payload_attestation_message = "payload_attestation_message",
43
+ execution_payload_bid = "execution_payload_bid",
40
44
  }
41
45
 
42
46
  export type SequentialGossipType = Exclude<GossipType, GossipType.beacon_attestation>;
@@ -71,6 +75,9 @@ export type GossipTopicTypeMap = {
71
75
  [GossipType.light_client_finality_update]: {type: GossipType.light_client_finality_update};
72
76
  [GossipType.light_client_optimistic_update]: {type: GossipType.light_client_optimistic_update};
73
77
  [GossipType.bls_to_execution_change]: {type: GossipType.bls_to_execution_change};
78
+ [GossipType.execution_payload]: {type: GossipType.execution_payload};
79
+ [GossipType.payload_attestation_message]: {type: GossipType.payload_attestation_message};
80
+ [GossipType.execution_payload_bid]: {type: GossipType.execution_payload_bid};
74
81
  };
75
82
 
76
83
  export type GossipTopicMap = {
@@ -100,6 +107,9 @@ export type GossipTypeMap = {
100
107
  [GossipType.light_client_finality_update]: LightClientFinalityUpdate;
101
108
  [GossipType.light_client_optimistic_update]: LightClientOptimisticUpdate;
102
109
  [GossipType.bls_to_execution_change]: capella.SignedBLSToExecutionChange;
110
+ [GossipType.execution_payload]: gloas.SignedExecutionPayloadEnvelope;
111
+ [GossipType.payload_attestation_message]: gloas.PayloadAttestationMessage;
112
+ [GossipType.execution_payload_bid]: gloas.SignedExecutionPayloadBid;
103
113
  };
104
114
 
105
115
  export type GossipFnByType = {
@@ -124,6 +134,13 @@ export type GossipFnByType = {
124
134
  [GossipType.bls_to_execution_change]: (
125
135
  blsToExecutionChange: capella.SignedBLSToExecutionChange
126
136
  ) => Promise<void> | void;
137
+ [GossipType.execution_payload]: (
138
+ executionPayloadEnvelope: gloas.SignedExecutionPayloadEnvelope
139
+ ) => Promise<void> | void;
140
+ [GossipType.payload_attestation_message]: (
141
+ payloadAttestationMessage: gloas.PayloadAttestationMessage
142
+ ) => Promise<void> | void;
143
+ [GossipType.execution_payload_bid]: (executionPayloadBid: gloas.SignedExecutionPayloadBid) => Promise<void> | void;
127
144
  };
128
145
 
129
146
  export type GossipFn = GossipFnByType[keyof GossipFnByType];