@lodestar/beacon-node 1.39.0-dev.2fe8de2346 → 1.39.0-dev.3bbeaeda6f

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 (156) hide show
  1. package/README.md +1 -1
  2. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  3. package/lib/chain/blocks/verifyBlock.js +1 -1
  4. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  5. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  6. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -2
  7. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  8. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -1
  9. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  10. package/lib/chain/blocks/verifyBlocksSignatures.js +3 -2
  11. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  12. package/lib/chain/chain.d.ts +8 -9
  13. package/lib/chain/chain.d.ts.map +1 -1
  14. package/lib/chain/chain.js +23 -37
  15. package/lib/chain/chain.js.map +1 -1
  16. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  17. package/lib/chain/forkChoice/index.js +3 -3
  18. package/lib/chain/forkChoice/index.js.map +1 -1
  19. package/lib/chain/interface.d.ts +4 -7
  20. package/lib/chain/interface.d.ts.map +1 -1
  21. package/lib/chain/interface.js.map +1 -1
  22. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -4
  23. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  24. package/lib/chain/opPools/aggregatedAttestationPool.js +4 -4
  25. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  26. package/lib/chain/opPools/opPool.d.ts +3 -0
  27. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  28. package/lib/chain/opPools/opPool.js +9 -8
  29. package/lib/chain/opPools/opPool.js.map +1 -1
  30. package/lib/chain/produceBlock/produceBlockBody.js +3 -3
  31. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  32. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +4 -1
  33. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  34. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -2
  35. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  36. package/lib/chain/validation/aggregateAndProof.js +9 -0
  37. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  38. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  39. package/lib/chain/validation/attesterSlashing.js +2 -2
  40. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  41. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  42. package/lib/chain/validation/blobSidecar.js +2 -3
  43. package/lib/chain/validation/blobSidecar.js.map +1 -1
  44. package/lib/chain/validation/block.d.ts.map +1 -1
  45. package/lib/chain/validation/block.js +3 -3
  46. package/lib/chain/validation/block.js.map +1 -1
  47. package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -1
  48. package/lib/chain/validation/blsToExecutionChange.js +10 -3
  49. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  50. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  51. package/lib/chain/validation/dataColumnSidecar.js +2 -3
  52. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  53. package/lib/chain/validation/proposerSlashing.js +3 -2
  54. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  55. package/lib/chain/validation/signatureSets/aggregateAndProof.js +1 -1
  56. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  57. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -1
  58. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  59. package/lib/chain/validation/signatureSets/contributionAndProof.js +2 -2
  60. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  61. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -1
  62. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  63. package/lib/chain/validation/signatureSets/syncCommittee.js +2 -2
  64. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  65. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -1
  66. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  67. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  68. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  69. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -1
  70. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  71. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -2
  72. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  73. package/lib/chain/validation/syncCommittee.js +1 -1
  74. package/lib/chain/validation/syncCommittee.js.map +1 -1
  75. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  76. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -3
  77. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  78. package/lib/chain/validation/voluntaryExit.js +1 -1
  79. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  80. package/lib/db/beacon.d.ts +2 -0
  81. package/lib/db/beacon.d.ts.map +1 -1
  82. package/lib/db/beacon.js +32 -0
  83. package/lib/db/beacon.js.map +1 -1
  84. package/lib/db/buckets.d.ts +12 -0
  85. package/lib/db/buckets.d.ts.map +1 -1
  86. package/lib/db/buckets.js +12 -6
  87. package/lib/db/buckets.js.map +1 -1
  88. package/lib/db/interface.d.ts +1 -0
  89. package/lib/db/interface.d.ts.map +1 -1
  90. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  91. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  92. package/lib/network/peers/discover.d.ts.map +1 -1
  93. package/lib/network/peers/discover.js.map +1 -1
  94. package/lib/node/nodejs.d.ts +6 -3
  95. package/lib/node/nodejs.d.ts.map +1 -1
  96. package/lib/node/nodejs.js +13 -1
  97. package/lib/node/nodejs.js.map +1 -1
  98. package/lib/node/notifier.d.ts.map +1 -1
  99. package/lib/node/notifier.js +9 -6
  100. package/lib/node/notifier.js.map +1 -1
  101. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  102. package/lib/sync/backfill/backfill.js +2 -4
  103. package/lib/sync/backfill/backfill.js.map +1 -1
  104. package/lib/sync/backfill/verify.d.ts +2 -2
  105. package/lib/sync/backfill/verify.d.ts.map +1 -1
  106. package/lib/sync/backfill/verify.js +3 -3
  107. package/lib/sync/backfill/verify.js.map +1 -1
  108. package/package.json +28 -20
  109. package/src/chain/blocks/verifyBlock.ts +1 -0
  110. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
  111. package/src/chain/blocks/verifyBlocksSignatures.ts +13 -3
  112. package/src/chain/chain.ts +33 -42
  113. package/src/chain/forkChoice/index.ts +3 -2
  114. package/src/chain/interface.ts +4 -6
  115. package/src/chain/opPools/aggregatedAttestationPool.ts +7 -7
  116. package/src/chain/opPools/opPool.ts +8 -8
  117. package/src/chain/produceBlock/produceBlockBody.ts +3 -3
  118. package/src/chain/stateCache/persistentCheckpointsCache.ts +15 -2
  119. package/src/chain/validation/aggregateAndProof.ts +12 -0
  120. package/src/chain/validation/attesterSlashing.ts +14 -2
  121. package/src/chain/validation/blobSidecar.ts +3 -3
  122. package/src/chain/validation/block.ts +3 -2
  123. package/src/chain/validation/blsToExecutionChange.ts +10 -8
  124. package/src/chain/validation/dataColumnSidecar.ts +3 -3
  125. package/src/chain/validation/proposerSlashing.ts +8 -2
  126. package/src/chain/validation/signatureSets/aggregateAndProof.ts +1 -1
  127. package/src/chain/validation/signatureSets/contributionAndProof.ts +3 -1
  128. package/src/chain/validation/signatureSets/syncCommittee.ts +3 -1
  129. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +3 -1
  130. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -1
  131. package/src/chain/validation/syncCommittee.ts +1 -1
  132. package/src/chain/validation/syncCommitteeContributionAndProof.ts +8 -3
  133. package/src/chain/validation/voluntaryExit.ts +1 -1
  134. package/src/db/beacon.ts +38 -1
  135. package/src/db/buckets.ts +12 -6
  136. package/src/db/interface.ts +2 -0
  137. package/src/network/peers/discover.ts +3 -3
  138. package/src/node/nodejs.ts +20 -2
  139. package/src/node/notifier.ts +13 -7
  140. package/src/sync/backfill/backfill.ts +2 -9
  141. package/src/sync/backfill/verify.ts +3 -8
  142. package/lib/chain/rewards/attestationsRewards.d.ts +0 -7
  143. package/lib/chain/rewards/attestationsRewards.d.ts.map +0 -1
  144. package/lib/chain/rewards/attestationsRewards.js +0 -112
  145. package/lib/chain/rewards/attestationsRewards.js.map +0 -1
  146. package/lib/chain/rewards/blockRewards.d.ts +0 -14
  147. package/lib/chain/rewards/blockRewards.d.ts.map +0 -1
  148. package/lib/chain/rewards/blockRewards.js +0 -94
  149. package/lib/chain/rewards/blockRewards.js.map +0 -1
  150. package/lib/chain/rewards/syncCommitteeRewards.d.ts +0 -6
  151. package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +0 -1
  152. package/lib/chain/rewards/syncCommitteeRewards.js +0 -36
  153. package/lib/chain/rewards/syncCommitteeRewards.js.map +0 -1
  154. package/src/chain/rewards/attestationsRewards.ts +0 -197
  155. package/src/chain/rewards/blockRewards.ts +0 -150
  156. package/src/chain/rewards/syncCommitteeRewards.ts +0 -58
@@ -1,5 +1,5 @@
1
1
  import { GENESIS_SLOT } from "@lodestar/params";
2
- import { getBlockProposerSignatureSet, } from "@lodestar/state-transition";
2
+ import { getBlockProposerSignatureSet } from "@lodestar/state-transition";
3
3
  import { ssz } from "@lodestar/types";
4
4
  import { BackfillSyncError, BackfillSyncErrorCode } from "./errors.js";
5
5
  export function verifyBlockSequence(config, blocks, anchorRoot) {
@@ -20,13 +20,13 @@ export function verifyBlockSequence(config, blocks, anchorRoot) {
20
20
  }
21
21
  return { nextAnchor, verifiedBlocks };
22
22
  }
23
- export async function verifyBlockProposerSignature(index2pubkey, bls, state, blocks) {
23
+ export async function verifyBlockProposerSignature(config, index2pubkey, bls, blocks) {
24
24
  if (blocks.length === 1 && blocks[0].message.slot === GENESIS_SLOT)
25
25
  return;
26
26
  const signatures = blocks.reduce((sigs, block) => {
27
27
  // genesis block doesn't have valid signature
28
28
  if (block.message.slot !== GENESIS_SLOT)
29
- sigs.push(getBlockProposerSignatureSet(index2pubkey, state, block));
29
+ sigs.push(getBlockProposerSignatureSet(config, index2pubkey, block));
30
30
  return sigs;
31
31
  }, []);
32
32
  if (!(await bls.verifySignatureSets(signatures, { batchable: true }))) {
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/sync/backfill/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAIL,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAgC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAC,iBAAiB,EAAE,qBAAqB,EAAC,MAAM,aAAa,CAAC;AASrE,MAAM,UAAU,mBAAmB,CACjC,MAAoB,EACpB,MAA2B,EAC3B,UAAgB;IAMhB,IAAI,QAAQ,GAAS,UAAU,CAAC;IAChC,IAAI,UAAU,GAAyB,IAAI,CAAC;IAE5C,MAAM,cAAc,GAAwB,EAAE,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1C,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,iBAAiB,CAAC,EAAC,IAAI,EAAE,qBAAqB,CAAC,YAAY,EAAC,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,CAAC,UAAU,EAAC,CAAC;QAC/E,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,UAAU,GAAG,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;QACtE,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;IACtC,CAAC;IACD,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,YAA+B,EAC/B,GAAiB,EACjB,KAAgC,EAChC,MAA2B;IAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAqB,EAAE,KAAK,EAAE,EAAE;QAChE,6CAA6C;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7G,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,iBAAiB,CAAC,EAAC,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,EAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/sync/backfill/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAmC,4BAA4B,EAAC,MAAM,4BAA4B,CAAC;AAC1G,OAAO,EAAgC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAC,iBAAiB,EAAE,qBAAqB,EAAC,MAAM,aAAa,CAAC;AASrE,MAAM,UAAU,mBAAmB,CACjC,MAAoB,EACpB,MAA2B,EAC3B,UAAgB;IAMhB,IAAI,QAAQ,GAAS,UAAU,CAAC;IAChC,IAAI,UAAU,GAAyB,IAAI,CAAC;IAE5C,MAAM,cAAc,GAAwB,EAAE,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1C,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,iBAAiB,CAAC,EAAC,IAAI,EAAE,qBAAqB,CAAC,YAAY,EAAC,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,CAAC,UAAU,EAAC,CAAC;QAC/E,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,UAAU,GAAG,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;QACtE,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;IACtC,CAAC;IACD,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAoB,EACpB,YAA+B,EAC/B,GAAiB,EACjB,MAA2B;IAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAqB,EAAE,KAAK,EAAE,EAAE;QAChE,6CAA6C;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9G,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,iBAAiB,CAAC,EAAC,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,EAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
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.39.0-dev.2fe8de2346",
14
+ "version": "1.39.0-dev.3bbeaeda6f",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -88,13 +88,13 @@
88
88
  "scripts": {
89
89
  "clean": "rm -rf lib && rm -f *.tsbuildinfo",
90
90
  "build": "tsc -p tsconfig.build.json",
91
- "build:watch": "yarn run build --watch",
92
- "build:release": "yarn clean && yarn run build",
91
+ "build:watch": "pnpm run build --watch",
92
+ "build:release": "pnpm clean && pnpm run build",
93
93
  "check-build": "node -e \"(async function() { await import('./lib/index.js') })()\"",
94
94
  "check-types": "tsc",
95
95
  "lint": "biome check src/ test/",
96
- "lint:fix": "yarn run lint --write",
97
- "test": "yarn test:unit && yarn test:e2e",
96
+ "lint:fix": "pnpm run lint --write",
97
+ "test": "pnpm test:unit && pnpm test:e2e",
98
98
  "test:unit": "vitest run --project unit --project unit-minimal",
99
99
  "test:e2e": "vitest run --project e2e --project e2e-mainnet",
100
100
  "test:sim": "vitest run test/sim/**/*.test.ts",
@@ -104,8 +104,8 @@
104
104
  "test:spec:general": "vitest run --project spec-minimal test/spec/general/",
105
105
  "test:spec:minimal": "vitest run --project spec-minimal test/spec/presets/",
106
106
  "test:spec:mainnet": "vitest run --project spec-mainnet test/spec/presets/",
107
- "test:spec": "yarn test:spec:bls && yarn test:spec:general && yarn test:spec:minimal && yarn test:spec:mainnet",
108
- "check-readme": "typescript-docs-verifier"
107
+ "test:spec": "pnpm test:spec:bls && pnpm test:spec:general && pnpm test:spec:minimal && pnpm test:spec:mainnet",
108
+ "check-readme": "pnpm exec ts-node ../../scripts/check_readme.ts"
109
109
  },
110
110
  "dependencies": {
111
111
  "@chainsafe/as-sha256": "^1.2.0",
@@ -134,18 +134,18 @@
134
134
  "@libp2p/peer-id": "^5.1.0",
135
135
  "@libp2p/prometheus-metrics": "^4.3.15",
136
136
  "@libp2p/tcp": "^10.1.8",
137
- "@lodestar/api": "1.39.0-dev.2fe8de2346",
138
- "@lodestar/config": "1.39.0-dev.2fe8de2346",
139
- "@lodestar/db": "1.39.0-dev.2fe8de2346",
140
- "@lodestar/fork-choice": "1.39.0-dev.2fe8de2346",
141
- "@lodestar/light-client": "1.39.0-dev.2fe8de2346",
142
- "@lodestar/logger": "1.39.0-dev.2fe8de2346",
143
- "@lodestar/params": "1.39.0-dev.2fe8de2346",
144
- "@lodestar/reqresp": "1.39.0-dev.2fe8de2346",
145
- "@lodestar/state-transition": "1.39.0-dev.2fe8de2346",
146
- "@lodestar/types": "1.39.0-dev.2fe8de2346",
147
- "@lodestar/utils": "1.39.0-dev.2fe8de2346",
148
- "@lodestar/validator": "1.39.0-dev.2fe8de2346",
137
+ "@lodestar/api": "^1.39.0-dev.3bbeaeda6f",
138
+ "@lodestar/config": "^1.39.0-dev.3bbeaeda6f",
139
+ "@lodestar/db": "^1.39.0-dev.3bbeaeda6f",
140
+ "@lodestar/fork-choice": "^1.39.0-dev.3bbeaeda6f",
141
+ "@lodestar/light-client": "^1.39.0-dev.3bbeaeda6f",
142
+ "@lodestar/logger": "^1.39.0-dev.3bbeaeda6f",
143
+ "@lodestar/params": "^1.39.0-dev.3bbeaeda6f",
144
+ "@lodestar/reqresp": "^1.39.0-dev.3bbeaeda6f",
145
+ "@lodestar/state-transition": "^1.39.0-dev.3bbeaeda6f",
146
+ "@lodestar/types": "^1.39.0-dev.3bbeaeda6f",
147
+ "@lodestar/utils": "^1.39.0-dev.3bbeaeda6f",
148
+ "@lodestar/validator": "^1.39.0-dev.3bbeaeda6f",
149
149
  "@multiformats/multiaddr": "^12.1.3",
150
150
  "datastore-core": "^10.0.2",
151
151
  "datastore-fs": "^10.0.6",
@@ -166,12 +166,20 @@
166
166
  "xxhash-wasm": "1.0.2"
167
167
  },
168
168
  "devDependencies": {
169
+ "@chainsafe/swap-or-not-shuffle": "^1.2.1",
170
+ "@libp2p/interface-internal": "^2.3.18",
171
+ "@libp2p/logger": "^5.1.21",
172
+ "@lodestar/spec-test-util": "^1.39.0-dev.3bbeaeda6f",
173
+ "@types/js-yaml": "^4.0.5",
169
174
  "@types/qs": "^6.9.7",
170
175
  "@types/tmp": "^0.2.3",
171
176
  "it-drain": "^3.0.3",
172
177
  "it-pair": "^2.0.6",
178
+ "js-yaml": "^4.1.0",
173
179
  "rewiremock": "^3.14.5",
174
180
  "rimraf": "^4.4.1",
181
+ "snappy": "^7.2.2",
182
+ "snappyjs": "^0.7.0",
175
183
  "tmp": "^0.2.1"
176
184
  },
177
185
  "keywords": [
@@ -180,5 +188,5 @@
180
188
  "beacon",
181
189
  "blockchain"
182
190
  ],
183
- "gitHead": "e709e7a20cb375ae2bf8e4bc545a0918ac269629"
191
+ "gitHead": "f77712a03bb71473fe867a800bac6df5781aba8a"
184
192
  }
@@ -139,6 +139,7 @@ export async function verifyBlocksInEpoch(
139
139
  // All signatures at once
140
140
  opts.skipVerifyBlockSignatures !== true
141
141
  ? verifyBlocksSignatures(
142
+ this.config,
142
143
  this.index2pubkey,
143
144
  this.bls,
144
145
  this.logger,
@@ -8,7 +8,12 @@ import {
8
8
  ProtoBlock,
9
9
  } from "@lodestar/fork-choice";
10
10
  import {ForkSeq} from "@lodestar/params";
11
- import {CachedBeaconStateAllForks, isExecutionBlockBodyType, isExecutionStateType} from "@lodestar/state-transition";
11
+ import {
12
+ CachedBeaconStateAllForks,
13
+ isExecutionBlockBodyType,
14
+ isExecutionEnabled,
15
+ isExecutionStateType,
16
+ } from "@lodestar/state-transition";
12
17
  import {bellatrix, electra} from "@lodestar/types";
13
18
  import {ErrorAborted, Logger, toRootHex} from "@lodestar/utils";
14
19
  import {ExecutionPayloadStatus, IExecutionEngine} from "../../execution/engine/interface.js";
@@ -145,7 +150,9 @@ export async function verifyBlockExecutionPayload(
145
150
  const block = blockInput.getBlock();
146
151
  /** Not null if execution is enabled */
147
152
  const executionPayloadEnabled =
148
- isExecutionStateType(preState0) && isExecutionBlockBodyType(block.message.body)
153
+ isExecutionStateType(preState0) &&
154
+ isExecutionBlockBodyType(block.message.body) &&
155
+ isExecutionEnabled(preState0, block.message)
149
156
  ? block.message.body.executionPayload
150
157
  : null;
151
158
 
@@ -1,3 +1,4 @@
1
+ import {BeaconConfig} from "@lodestar/config";
1
2
  import {CachedBeaconStateAllForks, Index2PubkeyCache, getBlockSignatureSets} from "@lodestar/state-transition";
2
3
  import {IndexedAttestation, SignedBeaconBlock} from "@lodestar/types";
3
4
  import {Logger} from "@lodestar/utils";
@@ -15,6 +16,7 @@ import {ImportBlockOpts} from "./types.js";
15
16
  * Since all data is known in advance all signatures are verified at once in parallel.
16
17
  */
17
18
  export async function verifyBlocksSignatures(
19
+ config: BeaconConfig,
18
20
  index2pubkey: Index2PubkeyCache,
19
21
  bls: IBlsVerifier,
20
22
  logger: Logger,
@@ -26,6 +28,7 @@ export async function verifyBlocksSignatures(
26
28
  ): Promise<{verifySignaturesTime: number}> {
27
29
  const isValidPromises: Promise<boolean>[] = [];
28
30
  const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
31
+ const currentSyncCommitteeIndexed = preState0.epochCtx.currentSyncCommitteeIndexed;
29
32
 
30
33
  // Verifies signatures after running state transition, so all SyncCommittee signed roots are known at this point.
31
34
  // We must ensure block.slot <= state.slot before running getAllBlockSignatureSets().
@@ -39,9 +42,16 @@ export async function verifyBlocksSignatures(
39
42
  : //
40
43
  // Verify signatures per block to track which block is invalid
41
44
  bls.verifySignatureSets(
42
- getBlockSignatureSets(index2pubkey, preState0, block, indexedAttestationsByBlock[i], {
43
- skipProposerSignature: opts.validProposerSignature,
44
- })
45
+ getBlockSignatureSets(
46
+ config,
47
+ index2pubkey,
48
+ currentSyncCommitteeIndexed,
49
+ block,
50
+ indexedAttestationsByBlock[i],
51
+ {
52
+ skipProposerSignature: opts.validProposerSignature,
53
+ }
54
+ )
45
55
  );
46
56
 
47
57
  // getBlockSignatureSets() takes 45ms in benchmarks for 2022Q2 mainnet blocks (100 sigs). When syncing a 32 blocks
@@ -14,13 +14,14 @@ import {
14
14
  EpochShuffling,
15
15
  Index2PubkeyCache,
16
16
  computeAnchorCheckpoint,
17
+ computeAttestationsRewards,
18
+ computeBlockRewards,
17
19
  computeEndSlotAtEpoch,
18
20
  computeEpochAtSlot,
19
21
  computeStartSlotAtEpoch,
20
- createCachedBeaconState,
22
+ computeSyncCommitteeRewards,
21
23
  getEffectiveBalanceIncrementsZeroInactive,
22
24
  getEffectiveBalancesFromStateBytes,
23
- isCachedBeaconState,
24
25
  processSlots,
25
26
  } from "@lodestar/state-transition";
26
27
  import {
@@ -38,6 +39,7 @@ import {
38
39
  Wei,
39
40
  isBlindedBeaconBlock,
40
41
  phase0,
42
+ rewards,
41
43
  } from "@lodestar/types";
42
44
  import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
43
45
  import {ProcessShutdownCallback} from "@lodestar/validator";
@@ -79,9 +81,6 @@ import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index
79
81
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
80
82
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
81
83
  import {ReprocessController} from "./reprocess.js";
82
- import {AttestationsRewards, computeAttestationsRewards} from "./rewards/attestationsRewards.js";
83
- import {BlockRewards, computeBlockRewards} from "./rewards/blockRewards.js";
84
- import {SyncCommitteeRewards, computeSyncCommitteeRewards} from "./rewards/syncCommitteeRewards.js";
85
84
  import {
86
85
  SeenAggregators,
87
86
  SeenAttesters,
@@ -142,7 +141,7 @@ export class BeaconChain implements IBeaconChain {
142
141
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
143
142
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
144
143
  readonly syncContributionAndProofPool;
145
- readonly opPool = new OpPool();
144
+ readonly opPool: OpPool;
146
145
 
147
146
  // Gossip seen cache
148
147
  readonly seenAttesters = new SeenAttesters();
@@ -204,6 +203,8 @@ export class BeaconChain implements IBeaconChain {
204
203
  {
205
204
  privateKey,
206
205
  config,
206
+ pubkey2index,
207
+ index2pubkey,
207
208
  db,
208
209
  dbName,
209
210
  dataDir,
@@ -219,6 +220,8 @@ export class BeaconChain implements IBeaconChain {
219
220
  }: {
220
221
  privateKey: PrivateKey;
221
222
  config: BeaconConfig;
223
+ pubkey2index: PubkeyIndexMap;
224
+ index2pubkey: Index2PubkeyCache;
222
225
  db: IBeaconDb;
223
226
  dbName: string;
224
227
  dataDir: string;
@@ -228,7 +231,7 @@ export class BeaconChain implements IBeaconChain {
228
231
  clock?: IClock;
229
232
  metrics: Metrics | null;
230
233
  validatorMonitor: ValidatorMonitor | null;
231
- anchorState: BeaconStateAllForks;
234
+ anchorState: CachedBeaconStateAllForks;
232
235
  isAnchorStateFinalized: boolean;
233
236
  executionEngine: IExecutionEngine;
234
237
  executionBuilder?: IExecutionBuilder;
@@ -260,6 +263,7 @@ export class BeaconChain implements IBeaconChain {
260
263
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
261
264
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
262
265
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
266
+ this.opPool = new OpPool(config);
263
267
 
264
268
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
265
269
  this.seenContributionAndProof = new SeenContributionAndProof(metrics);
@@ -286,39 +290,25 @@ export class BeaconChain implements IBeaconChain {
286
290
  logger,
287
291
  });
288
292
 
289
- // Restore state caches
290
- // anchorState may already by a CachedBeaconState. If so, don't create the cache again, since deserializing all
291
- // pubkeys takes ~30 seconds for 350k keys (mainnet 2022Q2).
292
- // When the BeaconStateCache is created in initializeBeaconStateFromEth1 it may be incorrect. Until we can ensure that
293
- // it's safe to re-use _ANY_ BeaconStateCache, this option is disabled by default and only used in tests.
294
- const cachedState =
295
- isCachedBeaconState(anchorState) && opts.skipCreateStateCacheIfAvailable
296
- ? anchorState
297
- : createCachedBeaconState(anchorState, {
298
- config,
299
- pubkey2index: new PubkeyIndexMap(),
300
- index2pubkey: [],
301
- });
302
- this._earliestAvailableSlot = cachedState.slot;
303
-
304
- this.shufflingCache = cachedState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
293
+ this._earliestAvailableSlot = anchorState.slot;
294
+ this.shufflingCache = anchorState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
305
295
  {
306
- shuffling: cachedState.epochCtx.previousShuffling,
307
- decisionRoot: cachedState.epochCtx.previousDecisionRoot,
296
+ shuffling: anchorState.epochCtx.previousShuffling,
297
+ decisionRoot: anchorState.epochCtx.previousDecisionRoot,
308
298
  },
309
299
  {
310
- shuffling: cachedState.epochCtx.currentShuffling,
311
- decisionRoot: cachedState.epochCtx.currentDecisionRoot,
300
+ shuffling: anchorState.epochCtx.currentShuffling,
301
+ decisionRoot: anchorState.epochCtx.currentDecisionRoot,
312
302
  },
313
303
  {
314
- shuffling: cachedState.epochCtx.nextShuffling,
315
- decisionRoot: cachedState.epochCtx.nextDecisionRoot,
304
+ shuffling: anchorState.epochCtx.nextShuffling,
305
+ decisionRoot: anchorState.epochCtx.nextDecisionRoot,
316
306
  },
317
307
  ]);
318
308
 
319
- // Persist single global instance of state caches
320
- this.pubkey2index = cachedState.epochCtx.pubkey2index;
321
- this.index2pubkey = cachedState.epochCtx.index2pubkey;
309
+ // Global cache of validators pubkey/index mapping
310
+ this.pubkey2index = pubkey2index;
311
+ this.index2pubkey = index2pubkey;
322
312
 
323
313
  const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
324
314
  const blockStateCache = this.opts.nHistoricalStates
@@ -334,6 +324,7 @@ export class BeaconChain implements IBeaconChain {
334
324
  this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
335
325
  checkpointStateCache = new PersistentCheckpointStateCache(
336
326
  {
327
+ config,
337
328
  metrics,
338
329
  logger,
339
330
  clock,
@@ -348,15 +339,15 @@ export class BeaconChain implements IBeaconChain {
348
339
  }
349
340
 
350
341
  const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
351
- blockStateCache.add(cachedState);
352
- blockStateCache.setHeadState(cachedState);
353
- checkpointStateCache.add(checkpoint, cachedState);
342
+ blockStateCache.add(anchorState);
343
+ blockStateCache.setHeadState(anchorState);
344
+ checkpointStateCache.add(checkpoint, anchorState);
354
345
 
355
346
  const forkChoice = initializeForkChoice(
356
347
  config,
357
348
  emitter,
358
349
  clock.currentSlot,
359
- cachedState,
350
+ anchorState,
360
351
  isAnchorStateFinalized,
361
352
  opts,
362
353
  this.justifiedBalancesGetter.bind(this),
@@ -1295,7 +1286,7 @@ export class BeaconChain implements IBeaconChain {
1295
1286
  }
1296
1287
  }
1297
1288
 
1298
- async getBlockRewards(block: BeaconBlock | BlindedBeaconBlock): Promise<BlockRewards> {
1289
+ async getBlockRewards(block: BeaconBlock | BlindedBeaconBlock): Promise<rewards.BlockRewards> {
1299
1290
  let preState = this.regen.getPreStateSync(block);
1300
1291
 
1301
1292
  if (preState === null) {
@@ -1306,13 +1297,13 @@ export class BeaconChain implements IBeaconChain {
1306
1297
 
1307
1298
  const postState = this.regen.getStateSync(toRootHex(block.stateRoot)) ?? undefined;
1308
1299
 
1309
- return computeBlockRewards(block, preState.clone(), postState?.clone());
1300
+ return computeBlockRewards(this.config, block, preState.clone(), postState?.clone());
1310
1301
  }
1311
1302
 
1312
1303
  async getAttestationsRewards(
1313
1304
  epoch: Epoch,
1314
1305
  validatorIds?: (ValidatorIndex | string)[]
1315
- ): Promise<{rewards: AttestationsRewards; executionOptimistic: boolean; finalized: boolean}> {
1306
+ ): Promise<{rewards: rewards.AttestationsRewards; executionOptimistic: boolean; finalized: boolean}> {
1316
1307
  // We use end slot of (epoch + 1) to ensure we have seen all attestations. On-time or late. Any late attestation beyond this slot is not considered
1317
1308
  const slot = computeEndSlotAtEpoch(epoch + 1);
1318
1309
  const stateResult = await this.getStateBySlot(slot, {allowRegen: false}); // No regen if state not in cache
@@ -1330,7 +1321,7 @@ export class BeaconChain implements IBeaconChain {
1330
1321
  throw Error(`State is not in cache for slot ${slot}`);
1331
1322
  }
1332
1323
 
1333
- const rewards = await computeAttestationsRewards(this.pubkey2index, cachedState, validatorIds);
1324
+ const rewards = await computeAttestationsRewards(this.config, this.pubkey2index, cachedState, validatorIds);
1334
1325
 
1335
1326
  return {rewards, executionOptimistic, finalized};
1336
1327
  }
@@ -1338,7 +1329,7 @@ export class BeaconChain implements IBeaconChain {
1338
1329
  async getSyncCommitteeRewards(
1339
1330
  block: BeaconBlock | BlindedBeaconBlock,
1340
1331
  validatorIds?: (ValidatorIndex | string)[]
1341
- ): Promise<SyncCommitteeRewards> {
1332
+ ): Promise<rewards.SyncCommitteeRewards> {
1342
1333
  let preState = this.regen.getPreStateSync(block);
1343
1334
 
1344
1335
  if (preState === null) {
@@ -1347,6 +1338,6 @@ export class BeaconChain implements IBeaconChain {
1347
1338
 
1348
1339
  preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
1349
1340
 
1350
- return computeSyncCommitteeRewards(this.index2pubkey, block, preState.clone(), validatorIds);
1341
+ return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState.clone(), validatorIds);
1351
1342
  }
1352
1343
  }
@@ -18,6 +18,7 @@ import {
18
18
  getBlockRootAtSlot,
19
19
  getEffectiveBalanceIncrementsZeroInactive,
20
20
  isExecutionStateType,
21
+ isMergeTransitionComplete,
21
22
  } from "@lodestar/state-transition";
22
23
  import {Slot, ssz} from "@lodestar/types";
23
24
  import {Logger, toRootHex} from "@lodestar/utils";
@@ -134,7 +135,7 @@ export function initializeForkChoiceFromFinalizedState(
134
135
  unrealizedFinalizedEpoch: finalizedCheckpoint.epoch,
135
136
  unrealizedFinalizedRoot: toRootHex(finalizedCheckpoint.root),
136
137
 
137
- ...(isExecutionStateType(state)
138
+ ...(isExecutionStateType(state) && isMergeTransitionComplete(state)
138
139
  ? {
139
140
  executionPayloadBlockHash: toRootHex(state.latestExecutionPayloadHeader.blockHash),
140
141
  executionPayloadNumber: state.latestExecutionPayloadHeader.blockNumber,
@@ -215,7 +216,7 @@ export function initializeForkChoiceFromUnfinalizedState(
215
216
  unrealizedFinalizedEpoch: finalizedCheckpoint.epoch,
216
217
  unrealizedFinalizedRoot: toRootHex(finalizedCheckpoint.root),
217
218
 
218
- ...(isExecutionStateType(unfinalizedState)
219
+ ...(isExecutionStateType(unfinalizedState) && isMergeTransitionComplete(unfinalizedState)
219
220
  ? {
220
221
  executionPayloadBlockHash: toRootHex(unfinalizedState.latestExecutionPayloadHeader.blockHash),
221
222
  executionPayloadNumber: unfinalizedState.latestExecutionPayloadHeader.blockNumber,
@@ -23,6 +23,7 @@ import {
23
23
  altair,
24
24
  capella,
25
25
  phase0,
26
+ rewards,
26
27
  } from "@lodestar/types";
27
28
  import {Logger} from "@lodestar/utils";
28
29
  import {IExecutionBuilder, IExecutionEngine} from "../execution/index.js";
@@ -48,9 +49,6 @@ import {IChainOptions} from "./options.js";
48
49
  import {AssembledBlockType, BlockAttributes, BlockType, ProduceResult} from "./produceBlock/produceBlockBody.js";
49
50
  import {IStateRegenerator, RegenCaller} from "./regen/index.js";
50
51
  import {ReprocessController} from "./reprocess.js";
51
- import {AttestationsRewards} from "./rewards/attestationsRewards.js";
52
- import {BlockRewards} from "./rewards/blockRewards.js";
53
- import {SyncCommitteeRewards} from "./rewards/syncCommitteeRewards.js";
54
52
  import {
55
53
  SeenAggregators,
56
54
  SeenAttesters,
@@ -255,15 +253,15 @@ export interface IBeaconChain {
255
253
  regenCanAcceptWork(): boolean;
256
254
  blsThreadPoolCanAcceptWork(): boolean;
257
255
 
258
- getBlockRewards(blockRef: BeaconBlock | BlindedBeaconBlock): Promise<BlockRewards>;
256
+ getBlockRewards(blockRef: BeaconBlock | BlindedBeaconBlock): Promise<rewards.BlockRewards>;
259
257
  getAttestationsRewards(
260
258
  epoch: Epoch,
261
259
  validatorIds?: (ValidatorIndex | string)[]
262
- ): Promise<{rewards: AttestationsRewards; executionOptimistic: boolean; finalized: boolean}>;
260
+ ): Promise<{rewards: rewards.AttestationsRewards; executionOptimistic: boolean; finalized: boolean}>;
263
261
  getSyncCommitteeRewards(
264
262
  blockRef: BeaconBlock | BlindedBeaconBlock,
265
263
  validatorIds?: (ValidatorIndex | string)[]
266
- ): Promise<SyncCommitteeRewards>;
264
+ ): Promise<rewards.SyncCommitteeRewards>;
267
265
  }
268
266
 
269
267
  export type SSZObjectType =
@@ -1,6 +1,6 @@
1
1
  import {Signature, aggregateSignatures} from "@chainsafe/blst";
2
2
  import {BitArray} from "@chainsafe/ssz";
3
- import {ChainForkConfig} from "@lodestar/config";
3
+ import {BeaconConfig} from "@lodestar/config";
4
4
  import {IForkChoice} from "@lodestar/fork-choice";
5
5
  import {
6
6
  ForkName,
@@ -162,7 +162,7 @@ export class AggregatedAttestationPool {
162
162
  private lowestPermissibleSlot = 0;
163
163
 
164
164
  constructor(
165
- private readonly config: ChainForkConfig,
165
+ private readonly config: BeaconConfig,
166
166
  private readonly metrics: Metrics | null = null
167
167
  ) {
168
168
  metrics?.opPool.aggregatedAttestationPool.attDataPerSlot.addCollect(() => this.onScrapeMetrics(metrics));
@@ -249,7 +249,7 @@ export class AggregatedAttestationPool {
249
249
  const stateEpoch = state.epochCtx.epoch;
250
250
  const statePrevEpoch = stateEpoch - 1;
251
251
 
252
- const notSeenValidatorsFn = getNotSeenValidatorsFn(state);
252
+ const notSeenValidatorsFn = getNotSeenValidatorsFn(this.config, state);
253
253
  const validateAttestationDataFn = getValidateAttestationDataFn(forkChoice, state);
254
254
 
255
255
  const attestationsByScore: AttestationWithScore[] = [];
@@ -362,7 +362,7 @@ export class AggregatedAttestationPool {
362
362
  const statePrevEpoch = stateEpoch - 1;
363
363
  const rootCache = new RootCache(state);
364
364
 
365
- const notSeenValidatorsFn = getNotSeenValidatorsFn(state);
365
+ const notSeenValidatorsFn = getNotSeenValidatorsFn(this.config, state);
366
366
  const validateAttestationDataFn = getValidateAttestationDataFn(forkChoice, state);
367
367
 
368
368
  const slots = Array.from(this.attestationGroupByIndexByDataHexBySlot.keys()).sort((a, b) => b - a);
@@ -656,7 +656,7 @@ export class MatchingDataAttestationGroup {
656
656
  private readonly attestations: AttestationWithIndex[] = [];
657
657
 
658
658
  constructor(
659
- private readonly config: ChainForkConfig,
659
+ private readonly config: BeaconConfig,
660
660
  readonly committee: Uint32Array,
661
661
  readonly data: phase0.AttestationData
662
662
  ) {}
@@ -864,9 +864,9 @@ export function aggregateConsolidation({byCommittee, attData}: AttestationsConso
864
864
  * Pre-compute participation from a CachedBeaconStateAllForks, for use to check if an attestation's committee
865
865
  * has already attested or not.
866
866
  */
867
- export function getNotSeenValidatorsFn(state: CachedBeaconStateAllForks): GetNotSeenValidatorsFn {
867
+ export function getNotSeenValidatorsFn(config: BeaconConfig, state: CachedBeaconStateAllForks): GetNotSeenValidatorsFn {
868
868
  const stateSlot = state.slot;
869
- if (state.config.getForkName(stateSlot) === ForkName.phase0) {
869
+ if (config.getForkName(stateSlot) === ForkName.phase0) {
870
870
  // Get attestations to be included in a phase0 block.
871
871
  // As we are close to altair, this is not really important, it's mainly for e2e.
872
872
  // The performance is not great due to the different BeaconState data structure to altair.
@@ -1,3 +1,4 @@
1
+ import {BeaconConfig} from "@lodestar/config";
1
2
  import {Id, Repository} from "@lodestar/db";
2
3
  import {
3
4
  BLS_WITHDRAWAL_PREFIX,
@@ -51,6 +52,8 @@ export class OpPool {
51
52
  /** Map of validator index -> SignedBLSToExecutionChange */
52
53
  private readonly blsToExecutionChanges = new Map<ValidatorIndex, SignedBLSToExecutionChangeVersioned>();
53
54
 
55
+ constructor(private readonly config: BeaconConfig) {}
56
+
54
57
  // Getters for metrics
55
58
 
56
59
  get attesterSlashingsSize(): number {
@@ -191,9 +194,8 @@ export class OpPool {
191
194
  phase0.SignedVoluntaryExit[],
192
195
  capella.SignedBLSToExecutionChange[],
193
196
  ] {
194
- const {config} = state;
195
197
  const stateEpoch = computeEpochAtSlot(state.slot);
196
- const stateFork = config.getForkSeq(state.slot);
198
+ const stateFork = this.config.getForkSeq(state.slot);
197
199
  const toBeSlashedIndices = new Set<ValidatorIndex>();
198
200
  const proposerSlashings: phase0.ProposerSlashing[] = [];
199
201
 
@@ -265,7 +267,7 @@ export class OpPool {
265
267
  // a future fork.
266
268
  isVoluntaryExitSignatureIncludable(
267
269
  stateFork,
268
- config.getForkSeq(computeStartSlotAtEpoch(voluntaryExit.message.epoch))
270
+ this.config.getForkSeq(computeStartSlotAtEpoch(voluntaryExit.message.epoch))
269
271
  )
270
272
  ) {
271
273
  voluntaryExits.push(voluntaryExit);
@@ -368,14 +370,13 @@ export class OpPool {
368
370
  * Prune if validator has already exited at or before the finalized checkpoint of the head.
369
371
  */
370
372
  private pruneVoluntaryExits(headState: CachedBeaconStateAllForks): void {
371
- const {config} = headState;
372
- const headStateFork = config.getForkSeq(headState.slot);
373
+ const headStateFork = this.config.getForkSeq(headState.slot);
373
374
  const finalizedEpoch = headState.finalizedCheckpoint.epoch;
374
375
 
375
376
  for (const [key, voluntaryExit] of this.voluntaryExits.entries()) {
376
377
  // VoluntaryExit messages signed in the previous fork become invalid and can never be included in any future
377
378
  // block, so just drop as the head state advances into the next fork.
378
- if (config.getForkSeq(computeStartSlotAtEpoch(voluntaryExit.message.epoch)) < headStateFork) {
379
+ if (this.config.getForkSeq(computeStartSlotAtEpoch(voluntaryExit.message.epoch)) < headStateFork) {
379
380
  this.voluntaryExits.delete(key);
380
381
  }
381
382
 
@@ -392,9 +393,8 @@ export class OpPool {
392
393
  * to opPool once gossipsub seen cache TTL passes.
393
394
  */
394
395
  private pruneBlsToExecutionChanges(headBlock: SignedBeaconBlock, headState: CachedBeaconStateAllForks): void {
395
- const {config} = headState;
396
396
  const recentBlsToExecutionChanges =
397
- config.getForkSeq(headBlock.message.slot) >= ForkSeq.capella
397
+ this.config.getForkSeq(headBlock.message.slot) >= ForkSeq.capella
398
398
  ? (headBlock as capella.SignedBeaconBlock).message.body.blsToExecutionChanges
399
399
  : [];
400
400
 
@@ -165,7 +165,7 @@ export async function produceBlockBody<T extends BlockType>(
165
165
  // even though shouldOverrideBuilder is relevant for the engine response, for simplicity of typing
166
166
  // we just return it undefined for the builder which anyway doesn't get consumed downstream
167
167
  let shouldOverrideBuilder: boolean | undefined;
168
- const fork = currentState.config.getForkName(blockSlot);
168
+ const fork = this.config.getForkName(blockSlot);
169
169
  const produceResult = {
170
170
  type: blockType,
171
171
  fork,
@@ -623,7 +623,7 @@ function preparePayloadAttributes(
623
623
  (payloadAttributes as capella.SSEPayloadAttributes["payloadAttributes"]).withdrawals = getExpectedWithdrawals(
624
624
  ForkSeq[fork],
625
625
  prepareState as CachedBeaconStateCapella
626
- ).withdrawals;
626
+ ).expectedWithdrawals;
627
627
  }
628
628
 
629
629
  if (ForkSeq[fork] >= ForkSeq.deneb) {
@@ -644,7 +644,7 @@ export async function produceCommonBlockBody<T extends BlockType>(
644
644
  ? this.metrics?.executionBlockProductionTimeSteps
645
645
  : this.metrics?.builderBlockProductionTimeSteps;
646
646
 
647
- const fork = currentState.config.getForkName(slot);
647
+ const fork = this.config.getForkName(slot);
648
648
 
649
649
  // TODO:
650
650
  // Iterate through the naive aggregation pool and ensure all the attestations from there