@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
@@ -5,7 +5,7 @@ import {
5
5
  defaultTopicScoreParams,
6
6
  } from "@chainsafe/libp2p-gossipsub/score";
7
7
  import {BeaconConfig} from "@lodestar/config";
8
- import {ATTESTATION_SUBNET_COUNT, SLOTS_PER_EPOCH, TARGET_AGGREGATORS_PER_COMMITTEE} from "@lodestar/params";
8
+ import {ATTESTATION_SUBNET_COUNT, PTC_SIZE, SLOTS_PER_EPOCH, TARGET_AGGREGATORS_PER_COMMITTEE} from "@lodestar/params";
9
9
  import {computeCommitteeCount} from "@lodestar/state-transition";
10
10
  import {getActiveForkBoundaries} from "../forks.js";
11
11
  import {Eth2Context} from "./gossipsub.js";
@@ -24,6 +24,9 @@ const VOLUNTARY_EXIT_WEIGHT = 0.05;
24
24
  const PROPOSER_SLASHING_WEIGHT = 0.05;
25
25
  const ATTESTER_SLASHING_WEIGHT = 0.05;
26
26
  const BLS_TO_EXECUTION_CHANGE_WEIGHT = 0.05;
27
+ const EXECUTION_PAYLOAD_WEIGHT = 0.5;
28
+ const PAYLOAD_ATTESTATION_WEIGHT = 0.05;
29
+ const EXECUTION_PAYLOAD_BID_WEIGHT = 0.05;
27
30
 
28
31
  const beaconAttestationSubnetWeight = 1 / ATTESTATION_SUBNET_COUNT;
29
32
  const maxPositiveScore =
@@ -34,7 +37,10 @@ const maxPositiveScore =
34
37
  VOLUNTARY_EXIT_WEIGHT +
35
38
  PROPOSER_SLASHING_WEIGHT +
36
39
  ATTESTER_SLASHING_WEIGHT +
37
- BLS_TO_EXECUTION_CHANGE_WEIGHT);
40
+ BLS_TO_EXECUTION_CHANGE_WEIGHT +
41
+ EXECUTION_PAYLOAD_WEIGHT +
42
+ PAYLOAD_ATTESTATION_WEIGHT +
43
+ EXECUTION_PAYLOAD_BID_WEIGHT);
38
44
 
39
45
  /**
40
46
  * The following params is implemented by Lighthouse at
@@ -172,6 +178,26 @@ function getAllTopicsScoreParams(
172
178
  expectedMessageRate: 1 / 5 / SLOTS_PER_EPOCH,
173
179
  firstMessageDecayTime: epochDurationMs * 100,
174
180
  });
181
+ topicsParams[
182
+ stringifyGossipTopic(config, {
183
+ type: GossipType.payload_attestation_message,
184
+ boundary,
185
+ })
186
+ ] = getTopicScoreParams(config, precomputedParams, {
187
+ topicWeight: PAYLOAD_ATTESTATION_WEIGHT,
188
+ expectedMessageRate: PTC_SIZE,
189
+ firstMessageDecayTime: epochDurationMs * 100,
190
+ });
191
+ topicsParams[
192
+ stringifyGossipTopic(config, {
193
+ type: GossipType.execution_payload_bid,
194
+ boundary,
195
+ })
196
+ ] = getTopicScoreParams(config, precomputedParams, {
197
+ topicWeight: EXECUTION_PAYLOAD_BID_WEIGHT,
198
+ expectedMessageRate: 1024, // TODO GLOAS: Need an estimate for this
199
+ firstMessageDecayTime: epochDurationMs * 100,
200
+ });
175
201
 
176
202
  // other topics
177
203
  topicsParams[
@@ -190,6 +216,22 @@ function getAllTopicsScoreParams(
190
216
  currentSlot: eth2Context.currentSlot,
191
217
  },
192
218
  });
219
+ topicsParams[
220
+ stringifyGossipTopic(config, {
221
+ type: GossipType.execution_payload,
222
+ boundary,
223
+ })
224
+ ] = getTopicScoreParams(config, precomputedParams, {
225
+ topicWeight: EXECUTION_PAYLOAD_WEIGHT,
226
+ expectedMessageRate: 1,
227
+ firstMessageDecayTime: epochDurationMs * 20,
228
+ meshMessageInfo: {
229
+ decaySlots: SLOTS_PER_EPOCH * 5,
230
+ capFactor: 3,
231
+ activationWindow: epochDurationMs,
232
+ currentSlot: eth2Context.currentSlot,
233
+ },
234
+ });
193
235
 
194
236
  const activeValidatorCount = eth2Context.activeValidatorCount;
195
237
  const {aggregatorsPerslot, committeesPerSlot} = expectedAggregatorCountPerSlot(activeValidatorCount);
@@ -69,6 +69,9 @@ function stringifyGossipTopicType(topic: GossipTopic): string {
69
69
  case GossipType.light_client_finality_update:
70
70
  case GossipType.light_client_optimistic_update:
71
71
  case GossipType.bls_to_execution_change:
72
+ case GossipType.execution_payload:
73
+ case GossipType.payload_attestation_message:
74
+ case GossipType.execution_payload_bid:
72
75
  return topic.type;
73
76
  case GossipType.beacon_attestation:
74
77
  case GossipType.sync_committee:
@@ -114,6 +117,12 @@ export function getGossipSSZType(topic: GossipTopic) {
114
117
  : ssz.altair.LightClientFinalityUpdate;
115
118
  case GossipType.bls_to_execution_change:
116
119
  return ssz.capella.SignedBLSToExecutionChange;
120
+ case GossipType.execution_payload:
121
+ return ssz.gloas.SignedExecutionPayloadEnvelope;
122
+ case GossipType.payload_attestation_message:
123
+ return ssz.gloas.PayloadAttestationMessage;
124
+ case GossipType.execution_payload_bid:
125
+ return ssz.gloas.SignedExecutionPayloadBid;
117
126
  }
118
127
  }
119
128
 
@@ -190,6 +199,9 @@ export function parseGossipTopic(forkDigestContext: ForkDigestContext, topicStr:
190
199
  case GossipType.light_client_finality_update:
191
200
  case GossipType.light_client_optimistic_update:
192
201
  case GossipType.bls_to_execution_change:
202
+ case GossipType.execution_payload:
203
+ case GossipType.payload_attestation_message:
204
+ case GossipType.execution_payload_bid:
193
205
  return {type: gossipTypeStr, boundary, encoding};
194
206
  }
195
207
 
@@ -240,6 +252,12 @@ export function getCoreTopicsAtFork(
240
252
  {type: GossipType.attester_slashing},
241
253
  ];
242
254
 
255
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
256
+ topics.push({type: GossipType.execution_payload});
257
+ topics.push({type: GossipType.payload_attestation_message});
258
+ topics.push({type: GossipType.execution_payload_bid});
259
+ }
260
+
243
261
  // After fulu also track data_column_sidecar_{index}
244
262
  if (ForkSeq[fork] >= ForkSeq.fulu) {
245
263
  topics.push(...getDataColumnSidecarTopics(networkConfig));
@@ -329,4 +347,7 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
329
347
  [GossipType.light_client_finality_update]: false,
330
348
  [GossipType.light_client_optimistic_update]: false,
331
349
  [GossipType.bls_to_execution_change]: true,
350
+ [GossipType.execution_payload]: true,
351
+ [GossipType.payload_attestation_message]: true,
352
+ [GossipType.execution_payload_bid]: true,
332
353
  };
@@ -48,6 +48,8 @@ import {
48
48
  import {IBeaconChain} from "../../chain/interface.js";
49
49
  import {validateGossipBlobSidecar} from "../../chain/validation/blobSidecar.js";
50
50
  import {validateGossipDataColumnSidecar} from "../../chain/validation/dataColumnSidecar.js";
51
+ import {validateGossipExecutionPayloadBid} from "../../chain/validation/executionPayloadBid.js";
52
+ import {validateGossipExecutionPayloadEnvelope} from "../../chain/validation/executionPayloadEnvelope.js";
51
53
  import {
52
54
  AggregateAndProofValidationResult,
53
55
  GossipAttestation,
@@ -64,6 +66,7 @@ import {
64
66
  } from "../../chain/validation/index.js";
65
67
  import {validateLightClientFinalityUpdate} from "../../chain/validation/lightClientFinalityUpdate.js";
66
68
  import {validateLightClientOptimisticUpdate} from "../../chain/validation/lightClientOptimisticUpdate.js";
69
+ import {validateGossipPayloadAttestationMessage} from "../../chain/validation/payloadAttestationMessage.js";
67
70
  import {OpSource} from "../../chain/validatorMonitor.js";
68
71
  import {Metrics} from "../../metrics/index.js";
69
72
  import {kzgCommitmentToVersionedHash} from "../../util/blobs.js";
@@ -815,6 +818,51 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
815
818
 
816
819
  chain.emitter.emit(routes.events.EventType.blsToExecutionChange, blsToExecutionChange);
817
820
  },
821
+ [GossipType.execution_payload]: async ({
822
+ gossipData,
823
+ topic,
824
+ }: GossipHandlerParamGeneric<GossipType.execution_payload>) => {
825
+ const {serializedData} = gossipData;
826
+ const executionPayloadEnvelope = sszDeserialize(topic, serializedData);
827
+ await validateGossipExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
828
+
829
+ // TODO GLOAS: Handle valid envelope. Need an import flow that calls `processExecutionPayloadEnvelope` and fork choice
830
+ },
831
+ [GossipType.payload_attestation_message]: async ({
832
+ gossipData,
833
+ topic,
834
+ }: GossipHandlerParamGeneric<GossipType.payload_attestation_message>) => {
835
+ const {serializedData} = gossipData;
836
+ const payloadAttestationMessage = sszDeserialize(topic, serializedData);
837
+ const validationResult = await validateGossipPayloadAttestationMessage(chain, payloadAttestationMessage);
838
+
839
+ try {
840
+ const insertOutcome = chain.payloadAttestationPool.add(
841
+ payloadAttestationMessage,
842
+ validationResult.attDataRootHex,
843
+ validationResult.validatorCommitteeIndex
844
+ );
845
+ metrics?.opPool.payloadAttestationPool.gossipInsertOutcome.inc({insertOutcome});
846
+ } catch (e) {
847
+ logger.error("Error adding to payloadAttestation pool", {}, e as Error);
848
+ }
849
+ },
850
+ [GossipType.execution_payload_bid]: async ({
851
+ gossipData,
852
+ topic,
853
+ }: GossipHandlerParamGeneric<GossipType.execution_payload_bid>) => {
854
+ const {serializedData} = gossipData;
855
+ const executionPayloadBid = sszDeserialize(topic, serializedData);
856
+ await validateGossipExecutionPayloadBid(chain, executionPayloadBid);
857
+
858
+ // Handle valid payload bid by storing in a bid pool
859
+ try {
860
+ const insertOutcome = chain.executionPayloadBidPool.add(executionPayloadBid.message);
861
+ metrics?.opPool.executionPayloadBidPool.gossipInsertOutcome.inc({insertOutcome});
862
+ } catch (e) {
863
+ logger.error("Error adding to executionPayloadBid pool", {}, e as Error);
864
+ }
865
+ },
818
866
  };
819
867
  }
820
868
 
@@ -67,6 +67,22 @@ const linearGossipQueueOpts: {
67
67
  type: QueueType.FIFO,
68
68
  dropOpts: {type: DropType.count, count: 1},
69
69
  },
70
+ [GossipType.execution_payload]: {
71
+ maxLength: 1024,
72
+ type: QueueType.FIFO,
73
+ dropOpts: {type: DropType.count, count: 1},
74
+ },
75
+ [GossipType.payload_attestation_message]: {
76
+ maxLength: 1024,
77
+ type: QueueType.FIFO,
78
+ dropOpts: {type: DropType.count, count: 1},
79
+ },
80
+ // TODO GLOAS: It is hard to predict how many bids are there. Put 1024 for max length for now
81
+ [GossipType.execution_payload_bid]: {
82
+ maxLength: 1024,
83
+ type: QueueType.FIFO,
84
+ dropOpts: {type: DropType.count, count: 1},
85
+ },
70
86
  };
71
87
 
72
88
  const indexedGossipQueueOpts: {
@@ -78,6 +78,9 @@ const executeGossipWorkOrderObj: Record<GossipType, WorkOpts> = {
78
78
  [GossipType.sync_committee]: {},
79
79
  [GossipType.light_client_finality_update]: {},
80
80
  [GossipType.light_client_optimistic_update]: {},
81
+ [GossipType.execution_payload]: {bypassQueue: true},
82
+ [GossipType.payload_attestation_message]: {},
83
+ [GossipType.execution_payload_bid]: {},
81
84
  };
82
85
  const executeGossipWorkOrder = Object.keys(executeGossipWorkOrderObj) as (keyof typeof executeGossipWorkOrderObj)[];
83
86
 
@@ -750,7 +750,7 @@ export class BackfillSync extends (EventEmitter as {new (): BackfillSyncEmitter}
750
750
 
751
751
  // GENESIS_SLOT doesn't has valid signature
752
752
  if (anchorBlock.message.slot === GENESIS_SLOT) return;
753
- await verifyBlockProposerSignature(this.chain.config, this.chain.index2pubkey, this.chain.bls, [anchorBlock]);
753
+ await verifyBlockProposerSignature(this.chain.config, this.chain.bls, [anchorBlock]);
754
754
 
755
755
  // We can write to the disk if this is ahead of prevFinalizedCheckpointBlock otherwise
756
756
  // we will need to go make checks on the top of sync loop before writing as it might
@@ -815,7 +815,7 @@ export class BackfillSync extends (EventEmitter as {new (): BackfillSyncEmitter}
815
815
 
816
816
  // If any of the block's proposer signature fail, we can't trust this peer at all
817
817
  if (verifiedBlocks.length > 0) {
818
- await verifyBlockProposerSignature(this.chain.config, this.chain.index2pubkey, this.chain.bls, verifiedBlocks);
818
+ await verifyBlockProposerSignature(this.chain.config, this.chain.bls, verifiedBlocks);
819
819
 
820
820
  // This is bad, like super bad. Abort the backfill
821
821
  if (!nextAnchor)
@@ -1,6 +1,6 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
2
  import {GENESIS_SLOT} from "@lodestar/params";
3
- import {ISignatureSet, Index2PubkeyCache, getBlockProposerSignatureSet} from "@lodestar/state-transition";
3
+ import {ISignatureSet, getBlockProposerSignatureSet} from "@lodestar/state-transition";
4
4
  import {Root, SignedBeaconBlock, Slot, ssz} from "@lodestar/types";
5
5
  import {IBlsVerifier} from "../../chain/bls/index.js";
6
6
  import {BackfillSyncError, BackfillSyncErrorCode} from "./errors.js";
@@ -42,14 +42,13 @@ export function verifyBlockSequence(
42
42
 
43
43
  export async function verifyBlockProposerSignature(
44
44
  config: BeaconConfig,
45
- index2pubkey: Index2PubkeyCache,
46
45
  bls: IBlsVerifier,
47
46
  blocks: SignedBeaconBlock[]
48
47
  ): Promise<void> {
49
48
  if (blocks.length === 1 && blocks[0].message.slot === GENESIS_SLOT) return;
50
49
  const signatures = blocks.reduce((sigs: ISignatureSet[], block) => {
51
50
  // genesis block doesn't have valid signature
52
- if (block.message.slot !== GENESIS_SLOT) sigs.push(getBlockProposerSignatureSet(config, index2pubkey, block));
51
+ if (block.message.slot !== GENESIS_SLOT) sigs.push(getBlockProposerSignatureSet(config, block));
53
52
  return sigs;
54
53
  }, []);
55
54