@lodestar/beacon-node 1.43.0-rc.5 → 1.44.0-dev.00facd40a8

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 (164) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +30 -0
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +46 -5
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/debug/index.d.ts.map +1 -1
  8. package/lib/api/impl/debug/index.js +69 -12
  9. package/lib/api/impl/debug/index.js.map +1 -1
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +119 -53
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  14. package/lib/chain/blocks/importBlock.js +5 -2
  15. package/lib/chain/blocks/importBlock.js.map +1 -1
  16. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  17. package/lib/chain/blocks/importExecutionPayload.js +5 -3
  18. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  19. package/lib/chain/chain.d.ts +3 -2
  20. package/lib/chain/chain.d.ts.map +1 -1
  21. package/lib/chain/chain.js +5 -2
  22. package/lib/chain/chain.js.map +1 -1
  23. package/lib/chain/errors/executionPayloadBid.d.ts +29 -1
  24. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  25. package/lib/chain/errors/executionPayloadBid.js +5 -0
  26. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  27. package/lib/chain/errors/payloadAttestation.d.ts +6 -0
  28. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -1
  29. package/lib/chain/errors/payloadAttestation.js +1 -0
  30. package/lib/chain/errors/payloadAttestation.js.map +1 -1
  31. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  32. package/lib/chain/forkChoice/index.js +14 -4
  33. package/lib/chain/forkChoice/index.js.map +1 -1
  34. package/lib/chain/interface.d.ts +2 -1
  35. package/lib/chain/interface.d.ts.map +1 -1
  36. package/lib/chain/interface.js.map +1 -1
  37. package/lib/chain/lightClient/index.d.ts.map +1 -1
  38. package/lib/chain/lightClient/index.js +1 -1
  39. package/lib/chain/lightClient/index.js.map +1 -1
  40. package/lib/chain/opPools/executionPayloadBidPool.d.ts +4 -4
  41. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
  42. package/lib/chain/opPools/executionPayloadBidPool.js +6 -4
  43. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
  44. package/lib/chain/opPools/index.d.ts +1 -0
  45. package/lib/chain/opPools/index.d.ts.map +1 -1
  46. package/lib/chain/opPools/index.js +1 -0
  47. package/lib/chain/opPools/index.js.map +1 -1
  48. package/lib/chain/opPools/payloadAttestationPool.d.ts +1 -1
  49. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  50. package/lib/chain/opPools/payloadAttestationPool.js +30 -10
  51. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  52. package/lib/chain/opPools/proposerPreferencesPool.d.ts +29 -0
  53. package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -0
  54. package/lib/chain/opPools/proposerPreferencesPool.js +56 -0
  55. package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -0
  56. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  57. package/lib/chain/prepareNextSlot.js +2 -1
  58. package/lib/chain/prepareNextSlot.js.map +1 -1
  59. package/lib/chain/produceBlock/produceBlockBody.d.ts +7 -1
  60. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  61. package/lib/chain/produceBlock/produceBlockBody.js +107 -18
  62. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  63. package/lib/chain/regen/interface.d.ts +2 -0
  64. package/lib/chain/regen/interface.d.ts.map +1 -1
  65. package/lib/chain/regen/interface.js +2 -0
  66. package/lib/chain/regen/interface.js.map +1 -1
  67. package/lib/chain/validation/executionPayloadBid.d.ts +7 -3
  68. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  69. package/lib/chain/validation/executionPayloadBid.js +119 -28
  70. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  71. package/lib/chain/validation/payloadAttestationMessage.d.ts +1 -1
  72. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  73. package/lib/chain/validation/payloadAttestationMessage.js +29 -7
  74. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  75. package/lib/chain/validatorMonitor.d.ts +1 -0
  76. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  77. package/lib/chain/validatorMonitor.js +16 -0
  78. package/lib/chain/validatorMonitor.js.map +1 -1
  79. package/lib/execution/builder/index.d.ts +1 -2
  80. package/lib/execution/builder/index.d.ts.map +1 -1
  81. package/lib/execution/builder/index.js +0 -1
  82. package/lib/execution/builder/index.js.map +1 -1
  83. package/lib/execution/engine/interface.d.ts +1 -0
  84. package/lib/execution/engine/interface.d.ts.map +1 -1
  85. package/lib/execution/engine/types.d.ts +2 -0
  86. package/lib/execution/engine/types.d.ts.map +1 -1
  87. package/lib/execution/engine/types.js +2 -0
  88. package/lib/execution/engine/types.js.map +1 -1
  89. package/lib/metrics/metrics/lodestar.d.ts +1 -1
  90. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  91. package/lib/metrics/metrics/lodestar.js +4 -3
  92. package/lib/metrics/metrics/lodestar.js.map +1 -1
  93. package/lib/network/gossip/topic.d.ts +1 -1
  94. package/lib/network/interface.d.ts +2 -0
  95. package/lib/network/interface.d.ts.map +1 -1
  96. package/lib/network/network.d.ts +2 -0
  97. package/lib/network/network.d.ts.map +1 -1
  98. package/lib/network/network.js +10 -0
  99. package/lib/network/network.js.map +1 -1
  100. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  101. package/lib/network/processor/gossipHandlers.js +19 -6
  102. package/lib/network/processor/gossipHandlers.js.map +1 -1
  103. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  104. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +5 -0
  105. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  106. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
  107. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  108. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +3 -3
  109. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  110. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +2 -1
  111. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -1
  112. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +15 -1
  113. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -1
  114. package/lib/network/reqresp/handlers/index.js +2 -2
  115. package/lib/network/reqresp/handlers/index.js.map +1 -1
  116. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -1
  117. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +8 -0
  118. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  119. package/lib/util/dependentRoot.d.ts +6 -2
  120. package/lib/util/dependentRoot.d.ts.map +1 -1
  121. package/lib/util/dependentRoot.js +20 -16
  122. package/lib/util/dependentRoot.js.map +1 -1
  123. package/package.json +14 -15
  124. package/src/api/impl/beacon/blocks/index.ts +36 -0
  125. package/src/api/impl/beacon/pool/index.ts +59 -4
  126. package/src/api/impl/debug/index.ts +73 -12
  127. package/src/api/impl/validator/index.ts +131 -54
  128. package/src/chain/blocks/importBlock.ts +10 -2
  129. package/src/chain/blocks/importExecutionPayload.ts +8 -2
  130. package/src/chain/chain.ts +5 -0
  131. package/src/chain/errors/executionPayloadBid.ts +27 -1
  132. package/src/chain/errors/payloadAttestation.ts +2 -0
  133. package/src/chain/forkChoice/index.ts +14 -4
  134. package/src/chain/interface.ts +2 -0
  135. package/src/chain/lightClient/index.ts +6 -6
  136. package/src/chain/opPools/executionPayloadBidPool.ts +10 -9
  137. package/src/chain/opPools/index.ts +1 -0
  138. package/src/chain/opPools/payloadAttestationPool.ts +34 -10
  139. package/src/chain/opPools/proposerPreferencesPool.ts +59 -0
  140. package/src/chain/prepareNextSlot.ts +2 -1
  141. package/src/chain/produceBlock/produceBlockBody.ts +158 -25
  142. package/src/chain/regen/interface.ts +2 -0
  143. package/src/chain/validation/executionPayloadBid.ts +130 -33
  144. package/src/chain/validation/payloadAttestationMessage.ts +32 -8
  145. package/src/chain/validatorMonitor.ts +18 -0
  146. package/src/execution/builder/index.ts +1 -4
  147. package/src/execution/engine/interface.ts +1 -0
  148. package/src/execution/engine/types.ts +4 -0
  149. package/src/metrics/metrics/lodestar.ts +4 -3
  150. package/src/network/interface.ts +2 -0
  151. package/src/network/network.ts +22 -0
  152. package/src/network/processor/gossipHandlers.ts +25 -6
  153. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +6 -0
  154. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -1
  155. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +3 -3
  156. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +20 -1
  157. package/src/network/reqresp/handlers/index.ts +2 -2
  158. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +8 -0
  159. package/src/util/dependentRoot.ts +22 -18
  160. package/lib/execution/builder/utils.d.ts +0 -5
  161. package/lib/execution/builder/utils.d.ts.map +0 -1
  162. package/lib/execution/builder/utils.js +0 -17
  163. package/lib/execution/builder/utils.js.map +0 -1
  164. package/src/execution/builder/utils.ts +0 -19
@@ -1,3 +1,4 @@
1
+ import { ForkSeq } from "@lodestar/params";
1
2
  import { RespStatus, ResponseError } from "@lodestar/reqresp";
2
3
  import { prettyBytes, prettyPrintIndices, toRootHex } from "@lodestar/utils";
3
4
  import { getBlobKzgCommitmentsCountFromSignedBeaconBlockSerialized } from "../../../util/sszBytes.js";
@@ -12,6 +13,13 @@ export async function handleColumnSidecarUnavailability({ chain, db, metrics, un
12
13
  logData.blockRoot = prettyBytes(blockRoot);
13
14
  }
14
15
  chain.logger.debug("dataColumnSidecar requested unavailable", logData);
16
+ // Post-gloas, columns exist only for FULL blocks; a finalized block is FULL if its envelope was
17
+ // archived. Bid blobsCount is unreliable here since an EMPTY block's bid may still commit to blobs
18
+ if (blockRoot === undefined && chain.config.getForkSeq(slot) >= ForkSeq.gloas) {
19
+ const envelopeBytes = await db.executionPayloadEnvelopeArchive.getBinary(slot);
20
+ if (!envelopeBytes)
21
+ return;
22
+ }
15
23
  const blockBytes = blockRoot ? await db.block.getBinary(blockRoot) : await db.blockArchive.getBinary(slot);
16
24
  if (!blockBytes) {
17
25
  chain.logger.verbose(`Expected ${blockRoot ? "unfinalized" : "finalized"} block not found while handling unavailable dataColumnSidecar`, {
@@ -1 +1 @@
1
- {"version":3,"file":"dataColumnResponseValidation.js","sourceRoot":"","sources":["../../../../src/network/reqresp/utils/dataColumnResponseValidation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dataColumnResponseValidation.js","sourceRoot":"","sources":["../../../../src/network/reqresp/utils/dataColumnResponseValidation.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  import { IForkChoice, ProtoBlock } from "@lodestar/fork-choice";
2
2
  import { Epoch, RootHex } from "@lodestar/types";
3
3
  /**
4
- * Get dependent root of a shuffling given attestation epoch and head block.
4
+ * Get dependent root of a shuffling given a message epoch and a proto block.
5
+ *
6
+ * Pre-gloas, this is used for attestation validation
7
+ * Post-gloas, this is also used for execution_payload_bid validation because post-fulu,
8
+ * a dependent root of a proposal duties is 1-epoch look ahead (instead of 0 as of pre-fulu)
5
9
  */
6
- export declare function getShufflingDependentRoot(forkChoice: IForkChoice, attEpoch: Epoch, blockEpoch: Epoch, attHeadBlock: ProtoBlock): RootHex;
10
+ export declare function getShufflingDependentRoot(forkChoice: IForkChoice, msgEpoch: Epoch, protoBlockEpoch: Epoch, protoBlock: ProtoBlock): RootHex;
7
11
  //# sourceMappingURL=dependentRoot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependentRoot.d.ts","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAC,KAAK,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,WAAW,EACvB,QAAQ,EAAE,KAAK,EACf,UAAU,EAAE,KAAK,EACjB,YAAY,EAAE,UAAU,GACvB,OAAO,CAmCT"}
1
+ {"version":3,"file":"dependentRoot.d.ts","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAC,KAAK,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,WAAW,EACvB,QAAQ,EAAE,KAAK,EACf,eAAe,EAAE,KAAK,EACtB,UAAU,EAAE,UAAU,GACrB,OAAO,CAmCT"}
@@ -1,42 +1,46 @@
1
1
  import { EpochDifference } from "@lodestar/fork-choice";
2
2
  /**
3
- * Get dependent root of a shuffling given attestation epoch and head block.
3
+ * Get dependent root of a shuffling given a message epoch and a proto block.
4
+ *
5
+ * Pre-gloas, this is used for attestation validation
6
+ * Post-gloas, this is also used for execution_payload_bid validation because post-fulu,
7
+ * a dependent root of a proposal duties is 1-epoch look ahead (instead of 0 as of pre-fulu)
4
8
  */
5
- export function getShufflingDependentRoot(forkChoice, attEpoch, blockEpoch, attHeadBlock) {
9
+ export function getShufflingDependentRoot(forkChoice, msgEpoch, protoBlockEpoch, protoBlock) {
6
10
  let shufflingDependentRoot;
7
- if (blockEpoch === attEpoch) {
11
+ if (protoBlockEpoch === msgEpoch) {
8
12
  // current shuffling, this is equivalent to `headState.currentShuffling`
9
- // given blockEpoch = attEpoch = n
13
+ // given protoBlockEpoch = msgEpoch = n
10
14
  // epoch: (n-2) (n-1) n (n+1)
11
15
  // |-------|-------|-------|-------|
12
- // attHeadBlock ------------------------^
16
+ // protoBlock ------------------------^
13
17
  // shufflingDependentRoot ------^
14
- shufflingDependentRoot = forkChoice.getDependentRoot(attHeadBlock, EpochDifference.previous);
18
+ shufflingDependentRoot = forkChoice.getDependentRoot(protoBlock, EpochDifference.previous);
15
19
  }
16
- else if (blockEpoch === attEpoch - 1) {
20
+ else if (protoBlockEpoch === msgEpoch - 1) {
17
21
  // next shuffling, this is equivalent to `headState.nextShuffling`
18
- // given blockEpoch = n-1, attEpoch = n
22
+ // given protoBlockEpoch = n-1, msgEpoch = n
19
23
  // epoch: (n-2) (n-1) n (n+1)
20
24
  // |-------|-------|-------|-------|
21
- // attHeadBlock -------------------^
25
+ // protoBlock -------------------^
22
26
  // shufflingDependentRoot ------^
23
- shufflingDependentRoot = forkChoice.getDependentRoot(attHeadBlock, EpochDifference.current);
27
+ shufflingDependentRoot = forkChoice.getDependentRoot(protoBlock, EpochDifference.current);
24
28
  }
25
- else if (blockEpoch < attEpoch - 1) {
29
+ else if (protoBlockEpoch < msgEpoch - 1) {
26
30
  // this never happens with default chain option of maxSkipSlots = 32, however we still need to handle it
27
31
  // check the verifyHeadBlockAndTargetRoot() function above
28
- // given blockEpoch = n-2, attEpoch = n
32
+ // given protoBlockEpoch = n-2, msgEpoch = n
29
33
  // epoch: (n-2) (n-1) n (n+1)
30
34
  // |-------|-------|-------|-------|
31
- // attHeadBlock -----------^
35
+ // protoBlock -----------^
32
36
  // shufflingDependentRoot -----^
33
- shufflingDependentRoot = attHeadBlock.blockRoot;
37
+ shufflingDependentRoot = protoBlock.blockRoot;
34
38
  // use lodestar_gossip_attestation_head_slot_to_attestation_slot metric to track this case
35
39
  }
36
40
  else {
37
- // blockEpoch > attEpoch
41
+ // protoBlockEpoch > msgEpoch
38
42
  // should not happen, handled in verifyAttestationTargetRoot
39
- throw Error(`attestation epoch ${attEpoch} is before head block epoch ${blockEpoch}`);
43
+ throw Error(`message epoch ${msgEpoch} is before proto block epoch ${protoBlockEpoch}`);
40
44
  }
41
45
  return shufflingDependentRoot;
42
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dependentRoot.js","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAG/E;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAuB,EACvB,QAAe,EACf,UAAiB,EACjB,YAAwB,EACf;IACT,IAAI,sBAA+B,CAAC;IACpC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,wEAAwE;QACxE,kCAAkC;QAClC,oDAAoD;QACpD,kDAAkD;QAClD,6CAA6C;QAC7C,iCAAiC;QACjC,sBAAsB,GAAG,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/F,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,GAAG,CAAC,EAAE,CAAC;QACvC,kEAAkE;QAClE,uCAAuC;QACvC,oDAAoD;QACpD,kDAAkD;QAClD,wCAAwC;QACxC,iCAAiC;QACjC,sBAAsB,GAAG,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9F,CAAC;SAAM,IAAI,UAAU,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QACrC,wGAAwG;QACxG,0DAA0D;QAC1D,uCAAuC;QACvC,oDAAoD;QACpD,kDAAkD;QAClD,gCAAgC;QAChC,gCAAgC;QAChC,sBAAsB,GAAG,YAAY,CAAC,SAAS,CAAC;QAChD,0FAA0F;IAC5F,CAAC;SAAM,CAAC;QACN,wBAAwB;QACxB,4DAA4D;QAC5D,MAAM,KAAK,CAAC,qBAAqB,QAAQ,+BAA+B,UAAU,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,sBAAsB,CAAC;AAAA,CAC/B"}
1
+ {"version":3,"file":"dependentRoot.js","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAG/E;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAuB,EACvB,QAAe,EACf,eAAsB,EACtB,UAAsB,EACb;IACT,IAAI,sBAA+B,CAAC;IACpC,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;QACjC,wEAAwE;QACxE,uCAAuC;QACvC,oDAAoD;QACpD,kDAAkD;QAClD,6CAA6C;QAC7C,iCAAiC;QACjC,sBAAsB,GAAG,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC7F,CAAC;SAAM,IAAI,eAAe,KAAK,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC5C,kEAAkE;QAClE,4CAA4C;QAC5C,oDAAoD;QACpD,kDAAkD;QAClD,wCAAwC;QACxC,iCAAiC;QACjC,sBAAsB,GAAG,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5F,CAAC;SAAM,IAAI,eAAe,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC1C,wGAAwG;QACxG,0DAA0D;QAC1D,4CAA4C;QAC5C,oDAAoD;QACpD,kDAAkD;QAClD,gCAAgC;QAChC,gCAAgC;QAChC,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC;QAC9C,0FAA0F;IAC5F,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,4DAA4D;QAC5D,MAAM,KAAK,CAAC,iBAAiB,QAAQ,gCAAgC,eAAe,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,sBAAsB,CAAC;AAAA,CAC/B"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.43.0-rc.5",
14
+ "version": "1.44.0-dev.00facd40a8",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -135,18 +135,17 @@
135
135
  "@libp2p/peer-id": "^6.0.4",
136
136
  "@libp2p/prometheus-metrics": "^5.0.14",
137
137
  "@libp2p/tcp": "^11.0.13",
138
- "@lodestar/api": "^1.43.0-rc.5",
139
- "@lodestar/config": "^1.43.0-rc.5",
140
- "@lodestar/db": "^1.43.0-rc.5",
141
- "@lodestar/fork-choice": "^1.43.0-rc.5",
142
- "@lodestar/light-client": "^1.43.0-rc.5",
143
- "@lodestar/logger": "^1.43.0-rc.5",
144
- "@lodestar/params": "^1.43.0-rc.5",
145
- "@lodestar/reqresp": "^1.43.0-rc.5",
146
- "@lodestar/state-transition": "^1.43.0-rc.5",
147
- "@lodestar/types": "^1.43.0-rc.5",
148
- "@lodestar/utils": "^1.43.0-rc.5",
149
- "@lodestar/validator": "^1.43.0-rc.5",
138
+ "@lodestar/api": "^1.44.0-dev.00facd40a8",
139
+ "@lodestar/config": "^1.44.0-dev.00facd40a8",
140
+ "@lodestar/db": "^1.44.0-dev.00facd40a8",
141
+ "@lodestar/fork-choice": "^1.44.0-dev.00facd40a8",
142
+ "@lodestar/logger": "^1.44.0-dev.00facd40a8",
143
+ "@lodestar/params": "^1.44.0-dev.00facd40a8",
144
+ "@lodestar/reqresp": "^1.44.0-dev.00facd40a8",
145
+ "@lodestar/state-transition": "^1.44.0-dev.00facd40a8",
146
+ "@lodestar/types": "^1.44.0-dev.00facd40a8",
147
+ "@lodestar/utils": "^1.44.0-dev.00facd40a8",
148
+ "@lodestar/validator": "^1.44.0-dev.00facd40a8",
150
149
  "@multiformats/multiaddr": "^13.0.1",
151
150
  "datastore-core": "^11.0.2",
152
151
  "datastore-fs": "^11.0.2",
@@ -169,7 +168,7 @@
169
168
  "@libp2p/interface-internal": "^3.0.13",
170
169
  "@libp2p/logger": "^6.2.2",
171
170
  "@libp2p/utils": "^7.0.13",
172
- "@lodestar/spec-test-util": "^1.43.0-rc.5",
171
+ "@lodestar/spec-test-util": "^1.44.0-dev.00facd40a8",
173
172
  "@types/js-yaml": "^4.0.5",
174
173
  "@types/qs": "^6.9.7",
175
174
  "@types/tmp": "^0.2.3",
@@ -187,5 +186,5 @@
187
186
  "beacon",
188
187
  "blockchain"
189
188
  ],
190
- "gitHead": "d7caddaad924496813904b3049464c02a99d7c46"
189
+ "gitHead": "62bc70996cb95d7ff64f264cf62c956ba28223aa"
191
190
  }
@@ -50,6 +50,7 @@ import {
50
50
  ProduceFullGloas,
51
51
  } from "../../../../chain/produceBlock/index.js";
52
52
  import {validateGossipBlock} from "../../../../chain/validation/block.js";
53
+ import {validateApiExecutionPayloadBid} from "../../../../chain/validation/executionPayloadBid.js";
53
54
  import {validateApiExecutionPayloadEnvelope} from "../../../../chain/validation/executionPayloadEnvelope.js";
54
55
  import {OpSource} from "../../../../chain/validatorMonitor.js";
55
56
  import {
@@ -825,6 +826,41 @@ export function getBeaconBlockApi({
825
826
  });
826
827
  },
827
828
 
829
+ async publishExecutionPayloadBid({signedExecutionPayloadBid}) {
830
+ const bid = signedExecutionPayloadBid.message;
831
+ const slot = bid.slot;
832
+ const fork = config.getForkName(slot);
833
+
834
+ if (!isForkPostGloas(fork)) {
835
+ throw new ApiError(400, `publishExecutionPayloadBid not supported for pre-gloas fork=${fork}`);
836
+ }
837
+
838
+ await validateApiExecutionPayloadBid(chain, signedExecutionPayloadBid);
839
+
840
+ try {
841
+ const insertOutcome = chain.executionPayloadBidPool.add(signedExecutionPayloadBid);
842
+ metrics?.opPool.executionPayloadBidPool.apiInsertOutcome.inc({insertOutcome});
843
+ } catch (e) {
844
+ chain.logger.error("Error adding to executionPayloadBid pool", {}, e as Error);
845
+ }
846
+
847
+ const sentPeers = await network.publishSignedExecutionPayloadBid(signedExecutionPayloadBid);
848
+
849
+ chain.emitter.emit(routes.events.EventType.executionPayloadBid, {
850
+ version: fork,
851
+ data: signedExecutionPayloadBid,
852
+ });
853
+
854
+ chain.logger.info("Published execution payload bid", {
855
+ slot,
856
+ builderIndex: bid.builderIndex,
857
+ blockHash: toRootHex(bid.blockHash),
858
+ parentBlockHash: toRootHex(bid.parentBlockHash),
859
+ value: bid.value,
860
+ sentPeers,
861
+ });
862
+ },
863
+
828
864
  async getSignedExecutionPayloadEnvelope({blockId}, context) {
829
865
  const {block, executionOptimistic, finalized} = await getBlockResponse(chain, blockId);
830
866
  const slot = block.message.slot;
@@ -1,6 +1,7 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ApplicationMethods} from "@lodestar/api/server";
3
3
  import {
4
+ ForkName,
4
5
  ForkPostElectra,
5
6
  ForkPreElectra,
6
7
  SYNC_COMMITTEE_SUBNET_SIZE,
@@ -16,12 +17,15 @@ import {
16
17
  GossipAction,
17
18
  PayloadAttestationError,
18
19
  PayloadAttestationErrorCode,
20
+ ProposerPreferencesError,
21
+ ProposerPreferencesErrorCode,
19
22
  SyncCommitteeError,
20
23
  } from "../../../../chain/errors/index.js";
21
24
  import {validateApiAttesterSlashing} from "../../../../chain/validation/attesterSlashing.js";
22
25
  import {validateApiBlsToExecutionChange} from "../../../../chain/validation/blsToExecutionChange.js";
23
26
  import {toElectraSingleAttestation, validateApiAttestation} from "../../../../chain/validation/index.js";
24
27
  import {validateApiPayloadAttestationMessage} from "../../../../chain/validation/payloadAttestationMessage.js";
28
+ import {validateGossipProposerPreferences} from "../../../../chain/validation/proposerPreferences.js";
25
29
  import {validateApiProposerSlashing} from "../../../../chain/validation/proposerSlashing.js";
26
30
  import {validateApiSyncCommittee} from "../../../../chain/validation/syncCommittee.js";
27
31
  import {validateApiVoluntaryExit} from "../../../../chain/validation/voluntaryExit.js";
@@ -81,6 +85,55 @@ export function getBeaconPoolApi({
81
85
  return {data: chain.payloadAttestationPool.getAll(slot), meta: {version: fork}};
82
86
  },
83
87
 
88
+ async getPoolProposerPreferences({slot}) {
89
+ const fork = chain.config.getForkName(slot ?? chain.clock.currentSlot);
90
+ if (!isForkPostGloas(fork)) {
91
+ throw new ApiError(400, `Proposer preferences pool is not supported before Gloas fork=${fork}`);
92
+ }
93
+
94
+ return {data: chain.proposerPreferencesPool.getAll(slot), meta: {version: fork}};
95
+ },
96
+
97
+ async submitSignedProposerPreferences({signedProposerPreferences}) {
98
+ const failures: FailureList = [];
99
+
100
+ await Promise.all(
101
+ signedProposerPreferences.map(async (signed, i) => {
102
+ try {
103
+ await validateGossipProposerPreferences(chain, signed);
104
+
105
+ chain.proposerPreferencesPool.add(signed);
106
+ await network.publishProposerPreferences(signed);
107
+ chain.emitter.emit(routes.events.EventType.proposerPreferences, {
108
+ version: ForkName.gloas,
109
+ data: signed,
110
+ });
111
+ } catch (e) {
112
+ const logCtx = {
113
+ slot: signed.message.proposalSlot,
114
+ validatorIndex: signed.message.validatorIndex,
115
+ dependentRoot: toRootHex(signed.message.dependentRoot),
116
+ };
117
+
118
+ if (e instanceof ProposerPreferencesError && e.type.code === ProposerPreferencesErrorCode.ALREADY_KNOWN) {
119
+ logger.debug("Ignoring known signed proposer preferences", logCtx);
120
+ return;
121
+ }
122
+
123
+ failures.push({index: i, message: (e as Error).message});
124
+ logger.verbose(`Error on submitSignedProposerPreferences [${i}]`, logCtx, e as Error);
125
+ if (e instanceof ProposerPreferencesError && e.action === GossipAction.REJECT) {
126
+ chain.persistInvalidSszValue(ssz.gloas.SignedProposerPreferences, signed, "api_reject");
127
+ }
128
+ }
129
+ })
130
+ );
131
+
132
+ if (failures.length > 0) {
133
+ throw new IndexedError("Error processing signed proposer preferences", failures);
134
+ }
135
+ },
136
+
84
137
  async getPoolAttesterSlashings() {
85
138
  const fork = chain.config.getForkName(chain.clock.currentSlot);
86
139
 
@@ -258,7 +311,7 @@ export function getBeaconPoolApi({
258
311
  try {
259
312
  const validateFn = () => validateApiPayloadAttestationMessage(chain, payloadAttestationMessage);
260
313
  const {slot, beaconBlockRoot} = payloadAttestationMessage.data;
261
- const {attDataRootHex, validatorCommitteeIndex} = await validateGossipFnRetryUnknownRoot(
314
+ const {attDataRootHex, validatorCommitteeIndices} = await validateGossipFnRetryUnknownRoot(
262
315
  validateFn,
263
316
  network,
264
317
  chain,
@@ -269,14 +322,16 @@ export function getBeaconPoolApi({
269
322
  const insertOutcome = chain.payloadAttestationPool.add(
270
323
  payloadAttestationMessage,
271
324
  attDataRootHex,
272
- validatorCommitteeIndex
325
+ validatorCommitteeIndices
273
326
  );
274
327
  metrics?.opPool.payloadAttestationPool.apiInsertOutcome.inc({insertOutcome});
275
328
 
276
329
  chain.forkChoice.notifyPtcMessages(
277
330
  toRootHex(payloadAttestationMessage.data.beaconBlockRoot),
278
- [validatorCommitteeIndex],
279
- payloadAttestationMessage.data.payloadPresent
331
+ payloadAttestationMessage.data.slot,
332
+ validatorCommitteeIndices,
333
+ payloadAttestationMessage.data.payloadPresent,
334
+ payloadAttestationMessage.data.blobDataAvailable
280
335
  );
281
336
 
282
337
  await network.publishPayloadAttestationMessage(payloadAttestationMessage);
@@ -1,7 +1,8 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ApplicationMethods} from "@lodestar/api/server";
3
- import {ExecutionStatus} from "@lodestar/fork-choice";
3
+ import {ExecutionStatus, PayloadStatus} from "@lodestar/fork-choice";
4
4
  import {ForkPostDeneb, ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
5
+ import {computeTimeAtSlot} from "@lodestar/state-transition";
5
6
  import {BeaconState, DataColumnSidecar, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
6
7
  import {toRootHex} from "@lodestar/utils";
7
8
  import {getBlobKzgCommitments} from "../../../util/dataColumns.js";
@@ -12,6 +13,29 @@ import {getStateResponseWithRegen} from "../beacon/state/utils.js";
12
13
  import {ApiModules} from "../types.js";
13
14
  import {assertUniqueItems} from "../utils.js";
14
15
 
16
+ function toForkChoiceValidity(status: ExecutionStatus): "valid" | "invalid" | "optimistic" {
17
+ switch (status) {
18
+ case ExecutionStatus.Valid:
19
+ return "valid";
20
+ case ExecutionStatus.Invalid:
21
+ return "invalid";
22
+ case ExecutionStatus.Syncing:
23
+ case ExecutionStatus.PreMerge:
24
+ return "optimistic";
25
+ }
26
+ }
27
+
28
+ function toPayloadStatusName(status: PayloadStatus): "pending" | "empty" | "full" {
29
+ switch (status) {
30
+ case PayloadStatus.PENDING:
31
+ return "pending";
32
+ case PayloadStatus.EMPTY:
33
+ return "empty";
34
+ case PayloadStatus.FULL:
35
+ return "full";
36
+ }
37
+ }
38
+
15
39
  export function getDebugApi({
16
40
  chain,
17
41
  config,
@@ -40,23 +64,60 @@ export function getDebugApi({
40
64
  justifiedEpoch: node.justifiedEpoch,
41
65
  finalizedEpoch: node.finalizedEpoch,
42
66
  weight: node.weight,
43
- validity: (() => {
44
- switch (node.executionStatus) {
45
- case ExecutionStatus.Valid:
46
- return "valid";
47
- case ExecutionStatus.Invalid:
48
- return "invalid";
49
- case ExecutionStatus.Syncing:
50
- case ExecutionStatus.PreMerge:
51
- return "optimistic";
52
- }
53
- })(),
67
+ validity: toForkChoiceValidity(node.executionStatus),
54
68
  executionBlockHash: node.executionPayloadBlockHash ?? ZERO_HASH_HEX,
55
69
  })),
56
70
  },
57
71
  };
58
72
  },
59
73
 
74
+ async getDebugForkChoiceV2() {
75
+ const {forkChoice} = chain;
76
+ return {
77
+ data: {
78
+ justifiedCheckpoint: forkChoice.getJustifiedCheckpoint(),
79
+ finalizedCheckpoint: forkChoice.getFinalizedCheckpoint(),
80
+ forkChoiceNodes: forkChoice.getAllNodes().map((node) => {
81
+ // Payload-specific fields apply only to a revealed Gloas payload = the FULL variant of a
82
+ // Gloas block
83
+ const ptc = node.payloadStatus === PayloadStatus.FULL ? forkChoice.getPTCVoteCounts(node.blockRoot) : null;
84
+ return {
85
+ payloadStatus: toPayloadStatusName(node.payloadStatus),
86
+ slot: node.slot,
87
+ blockRoot: node.blockRoot,
88
+ parentRoot: node.parentRoot,
89
+ weight: node.weight,
90
+ validity: toForkChoiceValidity(node.executionStatus),
91
+ executionBlockHash: node.executionPayloadBlockHash ?? ZERO_HASH_HEX,
92
+ extraData: {
93
+ executionOptimistic: isOptimisticBlock(node),
94
+ timestamp: computeTimeAtSlot(config, node.slot, chain.genesisTime),
95
+ target: node.targetRoot,
96
+ justifiedEpoch: node.justifiedEpoch,
97
+ finalizedEpoch: node.finalizedEpoch,
98
+ unrealizedJustifiedEpoch: node.unrealizedJustifiedEpoch,
99
+ unrealizedFinalizedEpoch: node.unrealizedFinalizedEpoch,
100
+ payloadAttesterCount: ptc?.attesterCount ?? null,
101
+ payloadAvailabilityYesCount: ptc?.payloadPresentCount ?? null,
102
+ payloadDataAvailabilityYesCount: ptc?.dataAvailableCount ?? null,
103
+ gasLimit:
104
+ node.payloadStatus === PayloadStatus.FULL && "executionPayloadGasLimit" in node
105
+ ? node.executionPayloadGasLimit
106
+ : null,
107
+ },
108
+ };
109
+ }),
110
+ extraData: {
111
+ unrealizedJustifiedCheckpoint: forkChoice.getUnrealizedJustifiedCheckpoint(),
112
+ unrealizedFinalizedCheckpoint: forkChoice.getUnrealizedFinalizedCheckpoint(),
113
+ proposerBoostRoot: forkChoice.getProposerBoostRoot(),
114
+ previousProposerBoostRoot: forkChoice.getPreviousProposerBoostRoot(),
115
+ headRoot: forkChoice.getHeadRoot(),
116
+ },
117
+ },
118
+ };
119
+ },
120
+
60
121
  async getProtoArrayNodes() {
61
122
  const nodes = chain.forkChoice.getAllNodes().map((node) => ({
62
123
  // if node has executionPayloadNumber, it will overwrite the below default