@lodestar/beacon-node 1.17.0-dev.c999e4a353 → 1.17.0-dev.cae26be359

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 (306) hide show
  1. package/README.md +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/beacon/blocks/utils.js.map +1 -1
  4. package/lib/api/impl/beacon/index.js +3 -0
  5. package/lib/api/impl/beacon/index.js.map +1 -1
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/rewards/index.d.ts +4 -0
  8. package/lib/api/impl/beacon/rewards/index.js +16 -0
  9. package/lib/api/impl/beacon/rewards/index.js.map +1 -0
  10. package/lib/api/impl/beacon/state/index.js.map +1 -1
  11. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/events/index.js.map +1 -1
  14. package/lib/api/impl/lightclient/index.js.map +1 -1
  15. package/lib/api/impl/lodestar/index.js.map +1 -1
  16. package/lib/api/impl/node/index.js.map +1 -1
  17. package/lib/api/impl/node/utils.js.map +1 -1
  18. package/lib/api/impl/proof/index.js.map +1 -1
  19. package/lib/api/impl/validator/index.js.map +1 -1
  20. package/lib/api/impl/validator/utils.js.map +1 -1
  21. package/lib/api/rest/activeSockets.js.map +1 -1
  22. package/lib/api/rest/base.js.map +1 -1
  23. package/lib/api/rest/index.js +1 -1
  24. package/lib/api/rest/index.js.map +1 -1
  25. package/lib/api/rest/swaggerUI.js.map +1 -1
  26. package/lib/chain/archiver/archiveBlocks.js.map +1 -1
  27. package/lib/chain/archiver/archiveStates.js +21 -6
  28. package/lib/chain/archiver/archiveStates.js.map +1 -1
  29. package/lib/chain/archiver/index.js.map +1 -1
  30. package/lib/chain/balancesCache.js.map +1 -1
  31. package/lib/chain/beaconProposerCache.js.map +1 -1
  32. package/lib/chain/blocks/importBlock.js +2 -1
  33. package/lib/chain/blocks/importBlock.js.map +1 -1
  34. package/lib/chain/blocks/index.js.map +1 -1
  35. package/lib/chain/blocks/types.d.ts +3 -1
  36. package/lib/chain/blocks/types.js +16 -1
  37. package/lib/chain/blocks/types.js.map +1 -1
  38. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  39. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  40. package/lib/chain/blocks/verifyBlock.js +1 -0
  41. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  42. package/lib/chain/blocks/verifyBlocksDataAvailability.js +4 -3
  43. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  44. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  45. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  46. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  47. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  48. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  49. package/lib/chain/bls/maybeBatch.js.map +1 -1
  50. package/lib/chain/bls/multithread/index.js.map +1 -1
  51. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  52. package/lib/chain/bls/multithread/poolSize.js.map +1 -1
  53. package/lib/chain/bls/multithread/utils.js.map +1 -1
  54. package/lib/chain/bls/multithread/worker.js.map +1 -1
  55. package/lib/chain/bls/singleThread.js.map +1 -1
  56. package/lib/chain/bls/utils.js.map +1 -1
  57. package/lib/chain/chain.d.ts +4 -0
  58. package/lib/chain/chain.js +17 -0
  59. package/lib/chain/chain.js.map +1 -1
  60. package/lib/chain/emitter.d.ts +1 -0
  61. package/lib/chain/errors/attestationError.js.map +1 -1
  62. package/lib/chain/errors/blockError.js.map +1 -1
  63. package/lib/chain/genesis/genesis.js.map +1 -1
  64. package/lib/chain/initState.js.map +1 -1
  65. package/lib/chain/interface.d.ts +4 -0
  66. package/lib/chain/interface.js.map +1 -1
  67. package/lib/chain/lightClient/index.js.map +1 -1
  68. package/lib/chain/lightClient/proofs.js +3 -3
  69. package/lib/chain/lightClient/proofs.js.map +1 -1
  70. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -5
  71. package/lib/chain/opPools/aggregatedAttestationPool.js +5 -3
  72. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  73. package/lib/chain/opPools/attestationPool.js.map +1 -1
  74. package/lib/chain/opPools/opPool.js.map +1 -1
  75. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  76. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  77. package/lib/chain/opPools/utils.js.map +1 -1
  78. package/lib/chain/prepareNextSlot.js +1 -0
  79. package/lib/chain/prepareNextSlot.js.map +1 -1
  80. package/lib/chain/produceBlock/produceBlockBody.js +2 -2
  81. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  82. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  83. package/lib/chain/regen/errors.d.ts +7 -1
  84. package/lib/chain/regen/errors.js +1 -0
  85. package/lib/chain/regen/errors.js.map +1 -1
  86. package/lib/chain/regen/interface.d.ts +3 -1
  87. package/lib/chain/regen/queued.d.ts +19 -3
  88. package/lib/chain/regen/queued.js +70 -34
  89. package/lib/chain/regen/queued.js.map +1 -1
  90. package/lib/chain/regen/regen.d.ts +15 -6
  91. package/lib/chain/regen/regen.js +62 -24
  92. package/lib/chain/regen/regen.js.map +1 -1
  93. package/lib/chain/reprocess.js.map +1 -1
  94. package/lib/chain/rewards/blockRewards.d.ts +14 -0
  95. package/lib/chain/rewards/blockRewards.js +90 -0
  96. package/lib/chain/rewards/blockRewards.js.map +1 -0
  97. package/lib/chain/rewards/syncCommitteeRewards.d.ts +6 -0
  98. package/lib/chain/rewards/syncCommitteeRewards.js +36 -0
  99. package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -0
  100. package/lib/chain/seenCache/seenAggregateAndProof.js.map +1 -1
  101. package/lib/chain/seenCache/seenAttestationData.d.ts +1 -1
  102. package/lib/chain/seenCache/seenAttestationData.js.map +1 -1
  103. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  104. package/lib/chain/seenCache/seenBlockAttesters.js.map +1 -1
  105. package/lib/chain/seenCache/seenBlockProposers.js.map +1 -1
  106. package/lib/chain/seenCache/seenCommittee.js.map +1 -1
  107. package/lib/chain/seenCache/seenCommitteeContribution.js.map +1 -1
  108. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +6 -1
  109. package/lib/chain/seenCache/seenGossipBlockInput.js +9 -17
  110. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  111. package/lib/chain/shufflingCache.js.map +1 -1
  112. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  113. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +2 -1
  114. package/lib/chain/stateCache/fifoBlockStateCache.js +2 -2
  115. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  116. package/lib/chain/stateCache/mapMetrics.js.map +1 -1
  117. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +6 -5
  118. package/lib/chain/stateCache/persistentCheckpointsCache.js +18 -17
  119. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  120. package/lib/chain/stateCache/stateContextCache.d.ts +2 -1
  121. package/lib/chain/stateCache/stateContextCache.js +2 -2
  122. package/lib/chain/stateCache/stateContextCache.js.map +1 -1
  123. package/lib/chain/stateCache/stateContextCheckpointsCache.d.ts +5 -4
  124. package/lib/chain/stateCache/stateContextCheckpointsCache.js +10 -9
  125. package/lib/chain/stateCache/stateContextCheckpointsCache.js.map +1 -1
  126. package/lib/chain/stateCache/types.d.ts +6 -5
  127. package/lib/chain/stateCache/types.js.map +1 -1
  128. package/lib/chain/validation/aggregateAndProof.d.ts +2 -2
  129. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  130. package/lib/chain/validation/attestation.d.ts +1 -1
  131. package/lib/chain/validation/attestation.js.map +1 -1
  132. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  133. package/lib/chain/validation/blobSidecar.js.map +1 -1
  134. package/lib/chain/validation/block.js.map +1 -1
  135. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  136. package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
  137. package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
  138. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  139. package/lib/chain/validation/syncCommittee.js.map +1 -1
  140. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  141. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  142. package/lib/db/buckets.d.ts +25 -25
  143. package/lib/db/buckets.js.map +1 -1
  144. package/lib/db/repositories/attesterSlashing.js.map +1 -1
  145. package/lib/db/repositories/blockArchive.js.map +1 -1
  146. package/lib/db/repositories/depositDataRoot.js.map +1 -1
  147. package/lib/db/repositories/depositEvent.js.map +1 -1
  148. package/lib/db/repositories/stateArchive.js.map +1 -1
  149. package/lib/eth1/eth1DepositDataTracker.js.map +1 -1
  150. package/lib/eth1/eth1DepositsCache.js.map +1 -1
  151. package/lib/eth1/eth1MergeBlockTracker.js.map +1 -1
  152. package/lib/eth1/index.js.map +1 -1
  153. package/lib/eth1/provider/eth1Provider.js.map +1 -1
  154. package/lib/eth1/provider/jsonRpcHttpClient.d.ts +1 -0
  155. package/lib/eth1/provider/jsonRpcHttpClient.js +1 -1
  156. package/lib/eth1/provider/jsonRpcHttpClient.js.map +1 -1
  157. package/lib/eth1/provider/utils.js.map +1 -1
  158. package/lib/eth1/stream.js.map +1 -1
  159. package/lib/eth1/utils/deposits.js.map +1 -1
  160. package/lib/eth1/utils/eth1Data.js.map +1 -1
  161. package/lib/eth1/utils/eth1DepositEvent.js.map +1 -1
  162. package/lib/eth1/utils/eth1Vote.js +0 -1
  163. package/lib/eth1/utils/eth1Vote.js.map +1 -1
  164. package/lib/eth1/utils/groupDepositEventsByBlock.js.map +1 -1
  165. package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js.map +1 -1
  166. package/lib/execution/builder/http.js +5 -8
  167. package/lib/execution/builder/http.js.map +1 -1
  168. package/lib/execution/builder/index.js.map +1 -1
  169. package/lib/execution/engine/http.js.map +1 -1
  170. package/lib/execution/engine/index.js.map +1 -1
  171. package/lib/execution/engine/mock.js.map +1 -1
  172. package/lib/execution/engine/types.js.map +1 -1
  173. package/lib/execution/engine/utils.js.map +1 -1
  174. package/lib/metrics/metrics/lodestar.d.ts +8 -1
  175. package/lib/metrics/metrics/lodestar.js +10 -0
  176. package/lib/metrics/metrics/lodestar.js.map +1 -1
  177. package/lib/metrics/metrics.js.map +1 -1
  178. package/lib/metrics/server/http.js.map +1 -1
  179. package/lib/metrics/utils/avgMinMax.js.map +1 -1
  180. package/lib/metrics/utils/gauge.js.map +1 -1
  181. package/lib/metrics/validatorMonitor.js.map +1 -1
  182. package/lib/monitoring/clientStats.js.map +1 -1
  183. package/lib/monitoring/properties.js.map +1 -1
  184. package/lib/monitoring/service.js.map +1 -1
  185. package/lib/monitoring/system.js.map +1 -1
  186. package/lib/network/core/networkCore.js.map +1 -1
  187. package/lib/network/core/networkCoreWorker.js.map +1 -1
  188. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  189. package/lib/network/discv5/index.d.ts +1 -0
  190. package/lib/network/discv5/index.js.map +1 -1
  191. package/lib/network/discv5/utils.js.map +1 -1
  192. package/lib/network/discv5/worker.js.map +1 -1
  193. package/lib/network/events.d.ts +5 -0
  194. package/lib/network/events.js +3 -1
  195. package/lib/network/events.js.map +1 -1
  196. package/lib/network/forks.js.map +1 -1
  197. package/lib/network/gossip/encoding.js.map +1 -1
  198. package/lib/network/gossip/gossipsub.js +1 -1
  199. package/lib/network/gossip/gossipsub.js.map +1 -1
  200. package/lib/network/gossip/scoringParameters.js.map +1 -1
  201. package/lib/network/gossip/topic.js +1 -1
  202. package/lib/network/gossip/topic.js.map +1 -1
  203. package/lib/network/libp2p/index.js.map +1 -1
  204. package/lib/network/metadata.js.map +1 -1
  205. package/lib/network/network.js.map +1 -1
  206. package/lib/network/options.js +1 -1
  207. package/lib/network/options.js.map +1 -1
  208. package/lib/network/peers/datastore.js.map +1 -1
  209. package/lib/network/peers/discover.js +1 -1
  210. package/lib/network/peers/discover.js.map +1 -1
  211. package/lib/network/peers/peerManager.js.map +1 -1
  212. package/lib/network/peers/peersData.js.map +1 -1
  213. package/lib/network/peers/score/score.js.map +1 -1
  214. package/lib/network/peers/score/store.js.map +1 -1
  215. package/lib/network/peers/score/utils.js.map +1 -1
  216. package/lib/network/peers/utils/assertPeerRelevance.js +1 -1
  217. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  218. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  219. package/lib/network/peers/utils/getConnectedPeerIds.js.map +1 -1
  220. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  221. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  222. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  223. package/lib/network/processor/gossipHandlers.js +7 -4
  224. package/lib/network/processor/gossipHandlers.js.map +1 -1
  225. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  226. package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
  227. package/lib/network/processor/gossipQueues/indexedAvgTime.js.map +1 -1
  228. package/lib/network/processor/gossipQueues/linear.js.map +1 -1
  229. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  230. package/lib/network/processor/index.js.map +1 -1
  231. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  232. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  233. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +2 -0
  234. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +39 -1
  235. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  236. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  237. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  238. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  239. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  240. package/lib/network/reqresp/handlers/lightClientBootstrap.js.map +1 -1
  241. package/lib/network/reqresp/handlers/lightClientFinalityUpdate.js.map +1 -1
  242. package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.js.map +1 -1
  243. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js.map +1 -1
  244. package/lib/network/reqresp/protocols.js.map +1 -1
  245. package/lib/network/reqresp/rateLimit.js.map +1 -1
  246. package/lib/network/reqresp/score.js.map +1 -1
  247. package/lib/network/reqresp/types.js.map +1 -1
  248. package/lib/network/reqresp/utils/collect.js.map +1 -1
  249. package/lib/network/reqresp/utils/collectSequentialBlocksInRange.js.map +1 -1
  250. package/lib/network/subnets/attnetsService.js.map +1 -1
  251. package/lib/network/subnets/dllAttnetsService.js.map +1 -1
  252. package/lib/network/subnets/syncnetsService.js.map +1 -1
  253. package/lib/network/subnets/util.js.map +1 -1
  254. package/lib/node/nodejs.js.map +1 -1
  255. package/lib/node/notifier.js.map +1 -1
  256. package/lib/node/utils/state.js.map +1 -1
  257. package/lib/sync/backfill/backfill.js.map +1 -1
  258. package/lib/sync/backfill/verify.js.map +1 -1
  259. package/lib/sync/interface.d.ts +15 -4
  260. package/lib/sync/interface.js +1 -0
  261. package/lib/sync/interface.js.map +1 -1
  262. package/lib/sync/range/batch.js.map +1 -1
  263. package/lib/sync/range/chain.js.map +1 -1
  264. package/lib/sync/range/range.js.map +1 -1
  265. package/lib/sync/range/utils/batches.js.map +1 -1
  266. package/lib/sync/range/utils/chainTarget.js.map +1 -1
  267. package/lib/sync/range/utils/hashBlocks.js.map +1 -1
  268. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  269. package/lib/sync/range/utils/updateChains.js.map +1 -1
  270. package/lib/sync/sync.js.map +1 -1
  271. package/lib/sync/unknownBlock.d.ts +9 -0
  272. package/lib/sync/unknownBlock.js +127 -14
  273. package/lib/sync/unknownBlock.js.map +1 -1
  274. package/lib/sync/utils/pendingBlocksTree.js +5 -2
  275. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  276. package/lib/sync/utils/remoteSyncType.js.map +1 -1
  277. package/lib/util/array.js.map +1 -1
  278. package/lib/util/asyncIterableToEvents.js.map +1 -1
  279. package/lib/util/binarySearch.js.map +1 -1
  280. package/lib/util/bitArray.js.map +1 -1
  281. package/lib/util/blobs.js.map +1 -1
  282. package/lib/util/bufferPool.js.map +1 -1
  283. package/lib/util/bytes.js.map +1 -1
  284. package/lib/util/chunkify.js.map +1 -1
  285. package/lib/util/clock.js.map +1 -1
  286. package/lib/util/dependentRoot.js.map +1 -1
  287. package/lib/util/error.js.map +1 -1
  288. package/lib/util/file.js.map +1 -1
  289. package/lib/util/forkName.js.map +1 -1
  290. package/lib/util/itTrigger.js.map +1 -1
  291. package/lib/util/kzg.js.map +1 -1
  292. package/lib/util/map.js.map +1 -1
  293. package/lib/util/multifork.d.ts +2 -1
  294. package/lib/util/multifork.js +4 -1
  295. package/lib/util/multifork.js.map +1 -1
  296. package/lib/util/profile.js.map +1 -1
  297. package/lib/util/promises.js.map +1 -1
  298. package/lib/util/queue/itemQueue.js.map +1 -1
  299. package/lib/util/set.js.map +1 -1
  300. package/lib/util/shuffle.js.map +1 -1
  301. package/lib/util/sortBy.js.map +1 -1
  302. package/lib/util/sszBytes.js.map +1 -1
  303. package/lib/util/timeSeries.js.map +1 -1
  304. package/lib/util/workerEvents.js.map +1 -1
  305. package/lib/util/wrapError.js.map +1 -1
  306. package/package.json +17 -25
@@ -51,6 +51,11 @@ export class QueuedStateRegenerator {
51
51
  this.metrics = modules.metrics;
52
52
  this.logger = modules.logger;
53
53
  }
54
+ async init() {
55
+ if (this.checkpointStateCache.init) {
56
+ return this.checkpointStateCache.init();
57
+ }
58
+ }
54
59
  canAcceptWork() {
55
60
  return this.jobQueue.jobLen < REGEN_CAN_ACCEPT_WORK_THRESHOLD;
56
61
  }
@@ -61,14 +66,62 @@ export class QueuedStateRegenerator {
61
66
  dumpCacheSummary() {
62
67
  return [...this.stateCache.dumpSummary(), ...this.checkpointStateCache.dumpSummary()];
63
68
  }
69
+ /**
70
+ * Get a state from block state cache.
71
+ * This is not for block processing so don't transfer cache
72
+ */
64
73
  getStateSync(stateRoot) {
65
- return this.stateCache.get(stateRoot);
74
+ return this.stateCache.get(stateRoot, { dontTransferCache: true });
66
75
  }
76
+ /**
77
+ * Get state for block processing.
78
+ * By default, do not transfer cache except for the block at clock slot
79
+ * which is usually the gossip block.
80
+ */
81
+ getPreStateSync(block, opts = { dontTransferCache: true }) {
82
+ const parentRoot = toHexString(block.parentRoot);
83
+ const parentBlock = this.forkChoice.getBlockHex(parentRoot);
84
+ if (!parentBlock) {
85
+ throw new RegenError({
86
+ code: RegenErrorCode.BLOCK_NOT_IN_FORKCHOICE,
87
+ blockRoot: block.parentRoot,
88
+ });
89
+ }
90
+ const parentEpoch = computeEpochAtSlot(parentBlock.slot);
91
+ const blockEpoch = computeEpochAtSlot(block.slot);
92
+ // Check the checkpoint cache (if the pre-state is a checkpoint state)
93
+ if (parentEpoch < blockEpoch) {
94
+ const checkpointState = this.checkpointStateCache.getLatest(parentRoot, blockEpoch, opts);
95
+ if (checkpointState && computeEpochAtSlot(checkpointState.slot) === blockEpoch) {
96
+ return checkpointState;
97
+ }
98
+ }
99
+ // Check the state cache, only if the state doesn't need to go through an epoch transition.
100
+ // Otherwise the state transition may not be cached and wasted. Queue for regen since the
101
+ // work required will still be significant.
102
+ if (parentEpoch === blockEpoch) {
103
+ const state = this.stateCache.get(parentBlock.stateRoot, opts);
104
+ if (state) {
105
+ return state;
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ async getCheckpointStateOrBytes(cp) {
111
+ return this.checkpointStateCache.getStateOrBytes(cp);
112
+ }
113
+ /**
114
+ * Get checkpoint state from cache, this function is not for block processing so don't transfer cache
115
+ */
67
116
  getCheckpointStateSync(cp) {
68
- return this.checkpointStateCache.get(cp);
117
+ return this.checkpointStateCache.get(cp, { dontTransferCache: true });
69
118
  }
119
+ /**
120
+ * Get state closest to head, this function is not for block processing so don't transfer cache
121
+ */
70
122
  getClosestHeadState(head) {
71
- return this.checkpointStateCache.getLatest(head.blockRoot, Infinity) || this.stateCache.get(head.stateRoot);
123
+ const opts = { dontTransferCache: true };
124
+ return (this.checkpointStateCache.getLatest(head.blockRoot, Infinity, opts) || this.stateCache.get(head.stateRoot, opts));
72
125
  }
73
126
  pruneOnCheckpoint(finalizedEpoch, justifiedEpoch, headStateRoot) {
74
127
  this.checkpointStateCache.prune(finalizedEpoch, justifiedEpoch);
@@ -88,19 +141,24 @@ export class QueuedStateRegenerator {
88
141
  this.checkpointStateCache.add(cp, item);
89
142
  }
90
143
  updateHeadState(newHeadStateRoot, maybeHeadState) {
144
+ // the resulting state will be added to block state cache so we transfer the cache in this flow
145
+ const cloneOpts = { dontTransferCache: true };
91
146
  const headState = newHeadStateRoot === toHexString(maybeHeadState.hashTreeRoot())
92
147
  ? maybeHeadState
93
- : this.stateCache.get(newHeadStateRoot);
148
+ : this.stateCache.get(newHeadStateRoot, cloneOpts);
94
149
  if (headState) {
95
150
  this.stateCache.setHeadState(headState);
96
151
  }
97
152
  else {
98
153
  // Trigger regen on head change if necessary
99
154
  this.logger.warn("Head state not available, triggering regen", { stateRoot: newHeadStateRoot });
155
+ // it's important to reload state to regen head state here
156
+ const allowDiskReload = true;
100
157
  // head has changed, so the existing cached head state is no longer useful. Set strong reference to null to free
101
158
  // up memory for regen step below. During regen, node won't be functional but eventually head will be available
159
+ // for legacy StateContextCache only
102
160
  this.stateCache.setHeadState(null);
103
- this.regen.getState(newHeadStateRoot, RegenCaller.processBlock).then((headStateRegen) => this.stateCache.setHeadState(headStateRegen), (e) => this.logger.error("Error on head state regen", {}, e));
161
+ this.regen.getState(newHeadStateRoot, RegenCaller.processBlock, cloneOpts, allowDiskReload).then((headStateRegen) => this.stateCache.setHeadState(headStateRegen), (e) => this.logger.error("Error on head state regen", {}, e));
104
162
  }
105
163
  }
106
164
  updatePreComputedCheckpoint(rootHex, epoch) {
@@ -113,31 +171,9 @@ export class QueuedStateRegenerator {
113
171
  async getPreState(block, opts, rCaller) {
114
172
  this.metrics?.regenFnCallTotal.inc({ caller: rCaller, entrypoint: RegenFnName.getPreState });
115
173
  // First attempt to fetch the state from caches before queueing
116
- const parentRoot = toHexString(block.parentRoot);
117
- const parentBlock = this.forkChoice.getBlockHex(parentRoot);
118
- if (!parentBlock) {
119
- throw new RegenError({
120
- code: RegenErrorCode.BLOCK_NOT_IN_FORKCHOICE,
121
- blockRoot: block.parentRoot,
122
- });
123
- }
124
- const parentEpoch = computeEpochAtSlot(parentBlock.slot);
125
- const blockEpoch = computeEpochAtSlot(block.slot);
126
- // Check the checkpoint cache (if the pre-state is a checkpoint state)
127
- if (parentEpoch < blockEpoch) {
128
- const checkpointState = this.checkpointStateCache.getLatest(parentRoot, blockEpoch);
129
- if (checkpointState && computeEpochAtSlot(checkpointState.slot) === blockEpoch) {
130
- return checkpointState;
131
- }
132
- }
133
- // Check the state cache, only if the state doesn't need to go through an epoch transition.
134
- // Otherwise the state transition may not be cached and wasted. Queue for regen since the
135
- // work required will still be significant.
136
- if (parentEpoch === blockEpoch) {
137
- const state = this.stateCache.get(parentBlock.stateRoot);
138
- if (state) {
139
- return state;
140
- }
174
+ const cachedState = this.getPreStateSync(block, opts);
175
+ if (cachedState !== null) {
176
+ return cachedState;
141
177
  }
142
178
  // The state is not immediately available in the caches, enqueue the job
143
179
  this.metrics?.regenFnQueuedTotal.inc({ caller: rCaller, entrypoint: RegenFnName.getPreState });
@@ -146,7 +182,7 @@ export class QueuedStateRegenerator {
146
182
  async getCheckpointState(cp, opts, rCaller) {
147
183
  this.metrics?.regenFnCallTotal.inc({ caller: rCaller, entrypoint: RegenFnName.getCheckpointState });
148
184
  // First attempt to fetch the state from cache before queueing
149
- const checkpointState = this.checkpointStateCache.get(toCheckpointHex(cp));
185
+ const checkpointState = this.checkpointStateCache.get(toCheckpointHex(cp), opts);
150
186
  if (checkpointState) {
151
187
  return checkpointState;
152
188
  }
@@ -165,16 +201,16 @@ export class QueuedStateRegenerator {
165
201
  // The state is not immediately available in the caches, enqueue the job
166
202
  return this.jobQueue.push({ key: "getBlockSlotState", args: [blockRoot, slot, opts, rCaller] });
167
203
  }
168
- async getState(stateRoot, rCaller) {
204
+ async getState(stateRoot, rCaller, opts = { dontTransferCache: true }) {
169
205
  this.metrics?.regenFnCallTotal.inc({ caller: rCaller, entrypoint: RegenFnName.getState });
170
206
  // First attempt to fetch the state from cache before queueing
171
- const state = this.stateCache.get(stateRoot);
207
+ const state = this.stateCache.get(stateRoot, opts);
172
208
  if (state) {
173
209
  return state;
174
210
  }
175
211
  // The state is not immediately available in the cache, enqueue the job
176
212
  this.metrics?.regenFnQueuedTotal.inc({ caller: rCaller, entrypoint: RegenFnName.getState });
177
- return this.jobQueue.push({ key: "getState", args: [stateRoot, rCaller] });
213
+ return this.jobQueue.push({ key: "getState", args: [stateRoot, rCaller, opts] });
178
214
  }
179
215
  }
180
216
  //# sourceMappingURL=queued.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queued.js","sourceRoot":"","sources":["../../../src/chain/regen/queued.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queued.js","sourceRoot":"","sources":["../../../src/chain/regen/queued.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,29 @@
1
1
  import { allForks, phase0, Slot, RootHex } from "@lodestar/types";
2
2
  import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
3
3
  import { IForkChoice } from "@lodestar/fork-choice";
4
+ import { Logger } from "@lodestar/utils";
4
5
  import { ChainForkConfig } from "@lodestar/config";
5
6
  import { Metrics } from "../../metrics/index.js";
6
7
  import { IBeaconDb } from "../../db/index.js";
7
- import { CheckpointStateCache, StateContextCache } from "../stateCache/index.js";
8
8
  import { ChainEventEmitter } from "../emitter.js";
9
+ import { CheckpointStateCache, BlockStateCache } from "../stateCache/types.js";
9
10
  import { IStateRegeneratorInternal, RegenCaller, StateCloneOpts } from "./interface.js";
10
11
  export type RegenModules = {
11
12
  db: IBeaconDb;
12
13
  forkChoice: IForkChoice;
13
- stateCache: StateContextCache;
14
+ stateCache: BlockStateCache;
14
15
  checkpointStateCache: CheckpointStateCache;
15
16
  config: ChainForkConfig;
16
17
  emitter: ChainEventEmitter;
18
+ logger: Logger;
17
19
  metrics: Metrics | null;
18
20
  };
19
21
  /**
20
22
  * Regenerates states that have already been processed by the fork choice
23
+ * Since Feb 2024, we support reloading checkpoint state from disk via allowDiskReload flag. Due to its performance impact
24
+ * this flag is only set to true in this case:
25
+ * - getPreState: this is for block processing, it's important to reload state in unfinality time
26
+ * - updateHeadState: rarely happen, but it's important to make sure we always can regen head state
21
27
  */
22
28
  export declare class StateRegenerator implements IStateRegeneratorInternal {
23
29
  private readonly modules;
@@ -26,21 +32,24 @@ export declare class StateRegenerator implements IStateRegeneratorInternal {
26
32
  * Get the state to run with `block`. May be:
27
33
  * - If parent is in same epoch -> Exact state at `block.parentRoot`
28
34
  * - If parent is in prev epoch -> State after `block.parentRoot` dialed forward through epoch transition
35
+ * - reload state if needed in this flow
29
36
  */
30
- getPreState(block: allForks.BeaconBlock, opts: StateCloneOpts, rCaller: RegenCaller): Promise<CachedBeaconStateAllForks>;
37
+ getPreState(block: allForks.BeaconBlock, opts: StateCloneOpts, regenCaller: RegenCaller): Promise<CachedBeaconStateAllForks>;
31
38
  /**
32
39
  * Get state after block `cp.root` dialed forward to first slot of `cp.epoch`
33
40
  */
34
- getCheckpointState(cp: phase0.Checkpoint, opts: StateCloneOpts, rCaller: RegenCaller): Promise<CachedBeaconStateAllForks>;
41
+ getCheckpointState(cp: phase0.Checkpoint, opts: StateCloneOpts, regenCaller: RegenCaller, allowDiskReload?: boolean): Promise<CachedBeaconStateAllForks>;
35
42
  /**
36
43
  * Get state after block `blockRoot` dialed forward to `slot`
44
+ * - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
37
45
  */
38
- getBlockSlotState(blockRoot: RootHex, slot: Slot, opts: StateCloneOpts, rCaller: RegenCaller): Promise<CachedBeaconStateAllForks>;
46
+ getBlockSlotState(blockRoot: RootHex, slot: Slot, opts: StateCloneOpts, regenCaller: RegenCaller, allowDiskReload?: boolean): Promise<CachedBeaconStateAllForks>;
39
47
  /**
40
48
  * Get state by exact root. If not in cache directly, requires finding the block that references the state from the
41
49
  * forkchoice and replaying blocks to get to it.
50
+ * - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
42
51
  */
43
- getState(stateRoot: RootHex, _rCaller: RegenCaller): Promise<CachedBeaconStateAllForks>;
52
+ getState(stateRoot: RootHex, _rCaller: RegenCaller, opts?: StateCloneOpts, allowDiskReload?: boolean): Promise<CachedBeaconStateAllForks>;
44
53
  private findFirstStateBlock;
45
54
  }
46
55
  //# sourceMappingURL=regen.d.ts.map
@@ -7,6 +7,10 @@ import { ChainEvent } from "../emitter.js";
7
7
  import { RegenError, RegenErrorCode } from "./errors.js";
8
8
  /**
9
9
  * Regenerates states that have already been processed by the fork choice
10
+ * Since Feb 2024, we support reloading checkpoint state from disk via allowDiskReload flag. Due to its performance impact
11
+ * this flag is only set to true in this case:
12
+ * - getPreState: this is for block processing, it's important to reload state in unfinality time
13
+ * - updateHeadState: rarely happen, but it's important to make sure we always can regen head state
10
14
  */
11
15
  export class StateRegenerator {
12
16
  constructor(modules) {
@@ -16,8 +20,9 @@ export class StateRegenerator {
16
20
  * Get the state to run with `block`. May be:
17
21
  * - If parent is in same epoch -> Exact state at `block.parentRoot`
18
22
  * - If parent is in prev epoch -> State after `block.parentRoot` dialed forward through epoch transition
23
+ * - reload state if needed in this flow
19
24
  */
20
- async getPreState(block, opts, rCaller) {
25
+ async getPreState(block, opts, regenCaller) {
21
26
  const parentBlock = this.modules.forkChoice.getBlock(block.parentRoot);
22
27
  if (!parentBlock) {
23
28
  throw new RegenError({
@@ -27,28 +32,30 @@ export class StateRegenerator {
27
32
  }
28
33
  const parentEpoch = computeEpochAtSlot(parentBlock.slot);
29
34
  const blockEpoch = computeEpochAtSlot(block.slot);
35
+ const allowDiskReload = true;
30
36
  // This may save us at least one epoch transition.
31
37
  // If the requested state crosses an epoch boundary
32
38
  // then we may use the checkpoint state before the block
33
39
  // We may have the checkpoint state with parent root inside the checkpoint state cache
34
40
  // through gossip validation.
35
41
  if (parentEpoch < blockEpoch) {
36
- return this.getCheckpointState({ root: block.parentRoot, epoch: blockEpoch }, opts, rCaller);
42
+ return this.getCheckpointState({ root: block.parentRoot, epoch: blockEpoch }, opts, regenCaller, allowDiskReload);
37
43
  }
38
44
  // Otherwise, get the state normally.
39
- return this.getState(parentBlock.stateRoot, rCaller);
45
+ return this.getState(parentBlock.stateRoot, regenCaller, opts, allowDiskReload);
40
46
  }
41
47
  /**
42
48
  * Get state after block `cp.root` dialed forward to first slot of `cp.epoch`
43
49
  */
44
- async getCheckpointState(cp, opts, rCaller) {
50
+ async getCheckpointState(cp, opts, regenCaller, allowDiskReload = false) {
45
51
  const checkpointStartSlot = computeStartSlotAtEpoch(cp.epoch);
46
- return this.getBlockSlotState(toHexString(cp.root), checkpointStartSlot, opts, rCaller);
52
+ return this.getBlockSlotState(toHexString(cp.root), checkpointStartSlot, opts, regenCaller, allowDiskReload);
47
53
  }
48
54
  /**
49
55
  * Get state after block `blockRoot` dialed forward to `slot`
56
+ * - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
50
57
  */
51
- async getBlockSlotState(blockRoot, slot, opts, rCaller) {
58
+ async getBlockSlotState(blockRoot, slot, opts, regenCaller, allowDiskReload = false) {
52
59
  const block = this.modules.forkChoice.getBlockHex(blockRoot);
53
60
  if (!block) {
54
61
  throw new RegenError({
@@ -63,25 +70,32 @@ export class StateRegenerator {
63
70
  blockSlot: block.slot,
64
71
  });
65
72
  }
66
- const latestCheckpointStateCtx = this.modules.checkpointStateCache.getLatest(blockRoot, computeEpochAtSlot(slot));
73
+ const { checkpointStateCache } = this.modules;
74
+ const epoch = computeEpochAtSlot(slot);
75
+ const latestCheckpointStateCtx = allowDiskReload
76
+ ? await checkpointStateCache.getOrReloadLatest(blockRoot, epoch, opts)
77
+ : checkpointStateCache.getLatest(blockRoot, epoch, opts);
67
78
  // If a checkpoint state exists with the given checkpoint root, it either is in requested epoch
68
79
  // or needs to have empty slots processed until the requested epoch
69
80
  if (latestCheckpointStateCtx) {
70
- return processSlotsByCheckpoint(this.modules, latestCheckpointStateCtx, slot, opts);
81
+ return processSlotsByCheckpoint(this.modules, latestCheckpointStateCtx, slot, regenCaller, opts);
71
82
  }
72
83
  // Otherwise, use the fork choice to get the stateRoot from block at the checkpoint root
73
84
  // regenerate that state,
74
85
  // then process empty slots until the requested epoch
75
- const blockStateCtx = await this.getState(block.stateRoot, rCaller);
76
- return processSlotsByCheckpoint(this.modules, blockStateCtx, slot, opts);
86
+ const blockStateCtx = await this.getState(block.stateRoot, regenCaller, opts, allowDiskReload);
87
+ return processSlotsByCheckpoint(this.modules, blockStateCtx, slot, regenCaller, opts);
77
88
  }
78
89
  /**
79
90
  * Get state by exact root. If not in cache directly, requires finding the block that references the state from the
80
91
  * forkchoice and replaying blocks to get to it.
92
+ * - allowDiskReload should be used with care, as it will cause the state to be reloaded from disk
81
93
  */
82
- async getState(stateRoot, _rCaller) {
94
+ async getState(stateRoot, _rCaller, opts,
95
+ // internal option, don't want to expose to external caller
96
+ allowDiskReload = false) {
83
97
  // Trivial case, state at stateRoot is already cached
84
- const cachedStateCtx = this.modules.stateCache.get(stateRoot);
98
+ const cachedStateCtx = this.modules.stateCache.get(stateRoot, opts);
85
99
  if (cachedStateCtx) {
86
100
  return cachedStateCtx;
87
101
  }
@@ -93,12 +107,17 @@ export class StateRegenerator {
93
107
  // gets reversed when replayed
94
108
  const blocksToReplay = [block];
95
109
  let state = null;
96
- for (const b of this.modules.forkChoice.iterateAncestorBlocks(block.parentRoot)) {
97
- state = this.modules.stateCache.get(b.stateRoot);
110
+ const { checkpointStateCache } = this.modules;
111
+ // iterateAncestorBlocks only returns ancestor blocks, not the block itself
112
+ for (const b of this.modules.forkChoice.iterateAncestorBlocks(block.blockRoot)) {
113
+ state = this.modules.stateCache.get(b.stateRoot, opts);
98
114
  if (state) {
99
115
  break;
100
116
  }
101
- state = this.modules.checkpointStateCache.getLatest(b.blockRoot, computeEpochAtSlot(blocksToReplay[blocksToReplay.length - 1].slot - 1));
117
+ const epoch = computeEpochAtSlot(blocksToReplay[blocksToReplay.length - 1].slot - 1);
118
+ state = allowDiskReload
119
+ ? await checkpointStateCache.getOrReloadLatest(b.blockRoot, epoch, opts)
120
+ : checkpointStateCache.getLatest(b.blockRoot, epoch, opts);
102
121
  if (state) {
103
122
  break;
104
123
  }
@@ -116,6 +135,8 @@ export class StateRegenerator {
116
135
  stateRoot,
117
136
  });
118
137
  }
138
+ const replaySlots = blocksToReplay.map((b) => b.slot).join(",");
139
+ this.modules.logger.debug("Replaying blocks to get state", { stateRoot, replaySlots });
119
140
  for (const b of blocksToReplay.reverse()) {
120
141
  const block = await this.modules.db.block.get(fromHexString(b.blockRoot));
121
142
  if (!block) {
@@ -134,9 +155,20 @@ export class StateRegenerator {
134
155
  verifyStateRoot: false,
135
156
  verifyProposer: false,
136
157
  verifySignatures: false,
137
- }, null);
138
- // TODO: Persist states, note that regen could be triggered by old states.
139
- // Should those take a place in the cache?
158
+ }, this.modules.metrics);
159
+ const stateRoot = toHexString(state.hashTreeRoot());
160
+ if (b.stateRoot !== stateRoot) {
161
+ throw new RegenError({
162
+ slot: b.slot,
163
+ code: RegenErrorCode.INVALID_STATE_ROOT,
164
+ actual: stateRoot,
165
+ expected: b.stateRoot,
166
+ });
167
+ }
168
+ if (allowDiskReload) {
169
+ // also with allowDiskReload flag, we "reload" it to the state cache too
170
+ this.modules.stateCache.add(state);
171
+ }
140
172
  // this avoids keeping our node busy processing blocks
141
173
  await sleep(0);
142
174
  }
@@ -147,11 +179,12 @@ export class StateRegenerator {
147
179
  });
148
180
  }
149
181
  }
182
+ this.modules.logger.debug("Replayed blocks to get state", { stateRoot, replaySlots });
150
183
  return state;
151
184
  }
152
185
  findFirstStateBlock(stateRoot) {
153
186
  for (const block of this.modules.forkChoice.forwarditerateAncestorBlocks()) {
154
- if (block !== undefined) {
187
+ if (block.stateRoot === stateRoot) {
155
188
  return block;
156
189
  }
157
190
  }
@@ -166,8 +199,8 @@ export class StateRegenerator {
166
199
  * process slots forward towards `slot`,
167
200
  * emitting "checkpoint" events after every epoch processed.
168
201
  */
169
- async function processSlotsByCheckpoint(modules, preState, slot, opts) {
170
- let postState = await processSlotsToNearestCheckpoint(modules, preState, slot, opts);
202
+ async function processSlotsByCheckpoint(modules, preState, slot, regenCaller, opts) {
203
+ let postState = await processSlotsToNearestCheckpoint(modules, preState, slot, regenCaller, opts);
171
204
  if (postState.slot < slot) {
172
205
  postState = processSlots(postState, slot, opts, modules.metrics);
173
206
  }
@@ -180,7 +213,7 @@ async function processSlotsByCheckpoint(modules, preState, slot, opts) {
180
213
  *
181
214
  * Stops processing after no more full epochs can be processed.
182
215
  */
183
- async function processSlotsToNearestCheckpoint(modules, preState, slot, opts) {
216
+ async function processSlotsToNearestCheckpoint(modules, preState, slot, regenCaller, opts) {
184
217
  const preSlot = preState.slot;
185
218
  const postSlot = slot;
186
219
  const preEpoch = computeEpochAtSlot(preSlot);
@@ -189,11 +222,16 @@ async function processSlotsToNearestCheckpoint(modules, preState, slot, opts) {
189
222
  for (let nextEpochSlot = computeStartSlotAtEpoch(preEpoch + 1); nextEpochSlot <= postSlot; nextEpochSlot += SLOTS_PER_EPOCH) {
190
223
  // processSlots calls .clone() before mutating
191
224
  postState = processSlots(postState, nextEpochSlot, opts, metrics);
192
- // Cache state to preserve epoch transition work
225
+ modules.metrics?.epochTransitionByCaller.inc({ caller: regenCaller });
226
+ // this is usually added when we prepare for next slot or validate gossip block
227
+ // then when we process the 1st block of epoch, we don't have to do state transition again
228
+ // This adds Previous Root Checkpoint State to the checkpoint state cache
229
+ // This may becomes the "official" checkpoint state if the 1st block of epoch is skipped
193
230
  const checkpointState = postState;
194
231
  const cp = getCheckpointFromState(checkpointState);
195
232
  checkpointStateCache.add(cp, checkpointState);
196
- emitter.emit(ChainEvent.checkpoint, cp, checkpointState);
233
+ // consumers should not mutate or get the transfered cache
234
+ emitter.emit(ChainEvent.checkpoint, cp, checkpointState.clone(true));
197
235
  // this avoids keeping our node busy processing blocks
198
236
  await sleep(0);
199
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"regen.js","sourceRoot":"","sources":["../../../src/chain/regen/regen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"regen.js","sourceRoot":"","sources":["../../../src/chain/regen/regen.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reprocess.js","sourceRoot":"","sources":["../../src/chain/reprocess.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reprocess.js","sourceRoot":"","sources":["../../src/chain/reprocess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
2
+ import { allForks } from "@lodestar/types";
3
+ import { routes } from "@lodestar/api";
4
+ export type BlockRewards = routes.beacon.BlockRewards;
5
+ /**
6
+ * Calculate total proposer block rewards given block and the beacon state of the same slot before the block is applied (preState)
7
+ * postState can be passed in to read reward cache if available
8
+ * Standard (Non MEV) rewards for proposing a block consists of:
9
+ * 1) Including attestations from (beacon) committee
10
+ * 2) Including attestations from sync committee
11
+ * 3) Reporting slashable behaviours from proposer and attester
12
+ */
13
+ export declare function computeBlockRewards(block: allForks.BeaconBlock, preState: CachedBeaconStateAllForks, postState?: CachedBeaconStateAllForks): Promise<BlockRewards>;
14
+ //# sourceMappingURL=blockRewards.d.ts.map
@@ -0,0 +1,90 @@
1
+ import { getAttesterSlashableIndices, processAttestationsAltair, } from "@lodestar/state-transition";
2
+ import { ForkName, WHISTLEBLOWER_REWARD_QUOTIENT } from "@lodestar/params";
3
+ /**
4
+ * Calculate total proposer block rewards given block and the beacon state of the same slot before the block is applied (preState)
5
+ * postState can be passed in to read reward cache if available
6
+ * Standard (Non MEV) rewards for proposing a block consists of:
7
+ * 1) Including attestations from (beacon) committee
8
+ * 2) Including attestations from sync committee
9
+ * 3) Reporting slashable behaviours from proposer and attester
10
+ */
11
+ export async function computeBlockRewards(block, preState, postState) {
12
+ const fork = preState.config.getForkName(block.slot);
13
+ const { attestations: cachedAttestationsReward = 0, syncAggregate: cachedSyncAggregateReward = 0 } = postState?.proposerRewards ?? {};
14
+ let blockAttestationReward = cachedAttestationsReward;
15
+ let syncAggregateReward = cachedSyncAggregateReward;
16
+ if (blockAttestationReward === 0) {
17
+ blockAttestationReward =
18
+ fork === ForkName.phase0
19
+ ? computeBlockAttestationRewardPhase0(block, preState)
20
+ : computeBlockAttestationRewardAltair(block, preState);
21
+ }
22
+ if (syncAggregateReward === 0) {
23
+ syncAggregateReward = computeSyncAggregateReward(block, preState);
24
+ }
25
+ const blockProposerSlashingReward = computeBlockProposerSlashingReward(block, preState);
26
+ const blockAttesterSlashingReward = computeBlockAttesterSlashingReward(block, preState);
27
+ const total = blockAttestationReward + syncAggregateReward + blockProposerSlashingReward + blockAttesterSlashingReward;
28
+ return {
29
+ proposerIndex: block.proposerIndex,
30
+ total,
31
+ attestations: blockAttestationReward,
32
+ syncAggregate: syncAggregateReward,
33
+ proposerSlashings: blockProposerSlashingReward,
34
+ attesterSlashings: blockAttesterSlashingReward,
35
+ };
36
+ }
37
+ /**
38
+ * TODO: Calculate rewards received by block proposer for including attestations.
39
+ */
40
+ function computeBlockAttestationRewardPhase0(_block, _preState) {
41
+ throw new Error("Unsupported fork! Block attestation reward calculation is not available in phase0");
42
+ }
43
+ /**
44
+ * Calculate rewards received by block proposer for including attestations since Altair.
45
+ * Reuses `processAttestationsAltair()`. Has dependency on RewardCache
46
+ */
47
+ function computeBlockAttestationRewardAltair(block, preState) {
48
+ const fork = preState.config.getForkSeq(block.slot);
49
+ const { attestations } = block.body;
50
+ processAttestationsAltair(fork, preState, attestations, false);
51
+ return preState.proposerRewards.attestations;
52
+ }
53
+ function computeSyncAggregateReward(block, preState) {
54
+ if (block.body.syncAggregate !== undefined) {
55
+ const { syncCommitteeBits } = block.body.syncAggregate;
56
+ const { syncProposerReward } = preState.epochCtx;
57
+ return syncCommitteeBits.getTrueBitIndexes().length * Math.floor(syncProposerReward); // syncProposerReward should already be integer
58
+ }
59
+ else {
60
+ return 0; // phase0 block does not have syncAggregate
61
+ }
62
+ }
63
+ /**
64
+ * Calculate rewards received by block proposer for including proposer slashings.
65
+ * All proposer slashing rewards go to block proposer and none to whistleblower as of Deneb
66
+ */
67
+ function computeBlockProposerSlashingReward(block, state) {
68
+ let proposerSlashingReward = 0;
69
+ for (const proposerSlashing of block.body.proposerSlashings) {
70
+ const offendingProposerIndex = proposerSlashing.signedHeader1.message.proposerIndex;
71
+ const offendingProposerBalance = state.validators.getReadonly(offendingProposerIndex).effectiveBalance;
72
+ proposerSlashingReward += Math.floor(offendingProposerBalance / WHISTLEBLOWER_REWARD_QUOTIENT);
73
+ }
74
+ return proposerSlashingReward;
75
+ }
76
+ /**
77
+ * Calculate rewards received by block proposer for including attester slashings.
78
+ * All attester slashing rewards go to block proposer and none to whistleblower as of Deneb
79
+ */
80
+ function computeBlockAttesterSlashingReward(block, preState) {
81
+ let attesterSlashingReward = 0;
82
+ for (const attesterSlashing of block.body.attesterSlashings) {
83
+ for (const offendingAttesterIndex of getAttesterSlashableIndices(attesterSlashing)) {
84
+ const offendingAttesterBalance = preState.validators.getReadonly(offendingAttesterIndex).effectiveBalance;
85
+ attesterSlashingReward += Math.floor(offendingAttesterBalance / WHISTLEBLOWER_REWARD_QUOTIENT);
86
+ }
87
+ }
88
+ return attesterSlashingReward;
89
+ }
90
+ //# sourceMappingURL=blockRewards.js.map