@lodestar/state-transition 1.46.0-dev.74a3175f1e → 1.46.0-dev.8b30182711

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 (192) hide show
  1. package/lib/block/externalData.js +2 -4
  2. package/lib/block/externalData.js.map +1 -1
  3. package/lib/block/index.js.map +1 -1
  4. package/lib/block/initiateValidatorExit.js.map +1 -1
  5. package/lib/block/isValidIndexedAttestation.js.map +1 -1
  6. package/lib/block/isValidIndexedPayloadAttestation.js.map +1 -1
  7. package/lib/block/processAttestationPhase0.js.map +1 -1
  8. package/lib/block/processAttestations.js.map +1 -1
  9. package/lib/block/processAttestationsAltair.js.map +1 -1
  10. package/lib/block/processAttesterSlashing.js.map +1 -1
  11. package/lib/block/processBlobKzgCommitments.js.map +1 -1
  12. package/lib/block/processBlockHeader.js.map +1 -1
  13. package/lib/block/processBlsToExecutionChange.js.map +1 -1
  14. package/lib/block/processBuilderDepositRequest.js.map +1 -1
  15. package/lib/block/processBuilderExitRequest.js.map +1 -1
  16. package/lib/block/processConsolidationRequest.js.map +1 -1
  17. package/lib/block/processDeposit.js.map +1 -1
  18. package/lib/block/processDepositRequest.js.map +1 -1
  19. package/lib/block/processEth1Data.js.map +1 -1
  20. package/lib/block/processExecutionPayload.js.map +1 -1
  21. package/lib/block/processExecutionPayloadBid.js.map +1 -1
  22. package/lib/block/processOperations.js.map +1 -1
  23. package/lib/block/processParentExecutionPayload.js.map +1 -1
  24. package/lib/block/processPayloadAttestation.js.map +1 -1
  25. package/lib/block/processProposerSlashing.js.map +1 -1
  26. package/lib/block/processRandao.js.map +1 -1
  27. package/lib/block/processSyncCommittee.js.map +1 -1
  28. package/lib/block/processVoluntaryExit.js +1 -2
  29. package/lib/block/processVoluntaryExit.js.map +1 -1
  30. package/lib/block/processWithdrawalRequest.js.map +1 -1
  31. package/lib/block/processWithdrawals.js.map +1 -1
  32. package/lib/block/slashValidator.js.map +1 -1
  33. package/lib/block/types.js +1 -2
  34. package/lib/block/types.js.map +1 -1
  35. package/lib/cache/effectiveBalanceIncrements.js.map +1 -1
  36. package/lib/cache/epochCache.js +1 -2
  37. package/lib/cache/epochCache.js.map +1 -1
  38. package/lib/cache/epochTransitionCache.js.map +1 -1
  39. package/lib/cache/pubkeyCache.js.map +1 -1
  40. package/lib/cache/rewardCache.js.map +1 -1
  41. package/lib/cache/stateCache.d.ts.map +1 -1
  42. package/lib/cache/stateCache.js +3 -2
  43. package/lib/cache/stateCache.js.map +1 -1
  44. package/lib/cache/syncCommitteeCache.js.map +1 -1
  45. package/lib/epoch/computeUnrealizedCheckpoints.js.map +1 -1
  46. package/lib/epoch/getAttestationDeltas.js.map +1 -1
  47. package/lib/epoch/getRewardsAndPenalties.js.map +1 -1
  48. package/lib/epoch/index.js +1 -2
  49. package/lib/epoch/index.js.map +1 -1
  50. package/lib/epoch/processBuilderPendingPayments.js.map +1 -1
  51. package/lib/epoch/processEffectiveBalanceUpdates.js.map +1 -1
  52. package/lib/epoch/processEth1DataReset.js.map +1 -1
  53. package/lib/epoch/processHistoricalRootsUpdate.js.map +1 -1
  54. package/lib/epoch/processHistoricalSummariesUpdate.js.map +1 -1
  55. package/lib/epoch/processInactivityUpdates.js.map +1 -1
  56. package/lib/epoch/processJustificationAndFinalization.js.map +1 -1
  57. package/lib/epoch/processParticipationFlagUpdates.js.map +1 -1
  58. package/lib/epoch/processParticipationRecordUpdates.js.map +1 -1
  59. package/lib/epoch/processPendingAttestations.js.map +1 -1
  60. package/lib/epoch/processPendingConsolidations.js.map +1 -1
  61. package/lib/epoch/processPendingDeposits.js.map +1 -1
  62. package/lib/epoch/processProposerLookahead.js.map +1 -1
  63. package/lib/epoch/processPtcWindow.js.map +1 -1
  64. package/lib/epoch/processRandaoMixesReset.js.map +1 -1
  65. package/lib/epoch/processRegistryUpdates.js.map +1 -1
  66. package/lib/epoch/processRewardsAndPenalties.js.map +1 -1
  67. package/lib/epoch/processSlashings.js.map +1 -1
  68. package/lib/epoch/processSlashingsReset.js.map +1 -1
  69. package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
  70. package/lib/lightClient/proofs.js.map +1 -1
  71. package/lib/lightClient/spec/index.js.map +1 -1
  72. package/lib/lightClient/spec/isBetterUpdate.js.map +1 -1
  73. package/lib/lightClient/spec/processLightClientUpdate.js.map +1 -1
  74. package/lib/lightClient/spec/store.js.map +1 -1
  75. package/lib/lightClient/spec/utils.d.ts +0 -2
  76. package/lib/lightClient/spec/utils.d.ts.map +1 -1
  77. package/lib/lightClient/spec/utils.js +2 -2
  78. package/lib/lightClient/spec/utils.js.map +1 -1
  79. package/lib/lightClient/spec/validateLightClientBootstrap.js.map +1 -1
  80. package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
  81. package/lib/metrics.d.ts.map +1 -1
  82. package/lib/metrics.js +3 -2
  83. package/lib/metrics.js.map +1 -1
  84. package/lib/rewards/attestationsRewards.js.map +1 -1
  85. package/lib/rewards/blockRewards.js.map +1 -1
  86. package/lib/rewards/syncCommitteeRewards.js.map +1 -1
  87. package/lib/signatureSets/attesterSlashings.js.map +1 -1
  88. package/lib/signatureSets/blsToExecutionChange.js.map +1 -1
  89. package/lib/signatureSets/executionPayloadBid.js.map +1 -1
  90. package/lib/signatureSets/executionPayloadEnvelope.js.map +1 -1
  91. package/lib/signatureSets/index.js.map +1 -1
  92. package/lib/signatureSets/indexedAttestation.js.map +1 -1
  93. package/lib/signatureSets/indexedPayloadAttestation.js.map +1 -1
  94. package/lib/signatureSets/proposer.js.map +1 -1
  95. package/lib/signatureSets/proposerPreferences.js.map +1 -1
  96. package/lib/signatureSets/proposerSlashings.js.map +1 -1
  97. package/lib/signatureSets/randao.js.map +1 -1
  98. package/lib/signatureSets/voluntaryExits.js.map +1 -1
  99. package/lib/slot/index.js.map +1 -1
  100. package/lib/slot/upgradeStateToAltair.js.map +1 -1
  101. package/lib/slot/upgradeStateToBellatrix.js.map +1 -1
  102. package/lib/slot/upgradeStateToCapella.js.map +1 -1
  103. package/lib/slot/upgradeStateToDeneb.js.map +1 -1
  104. package/lib/slot/upgradeStateToElectra.js.map +1 -1
  105. package/lib/slot/upgradeStateToFulu.js.map +1 -1
  106. package/lib/slot/upgradeStateToGloas.js.map +1 -1
  107. package/lib/stateTransition.js +2 -4
  108. package/lib/stateTransition.js.map +1 -1
  109. package/lib/stateView/beaconStateView.js.map +1 -1
  110. package/lib/stateView/interface.js.map +1 -1
  111. package/lib/stateView/nativeBeaconStateView.js.map +1 -1
  112. package/lib/stateView/stateViewFactory.js.map +1 -1
  113. package/lib/testUtils/infura.js.map +1 -1
  114. package/lib/testUtils/interop.js.map +1 -1
  115. package/lib/testUtils/params.d.ts.map +1 -1
  116. package/lib/testUtils/state.js +1 -1
  117. package/lib/testUtils/state.js.map +1 -1
  118. package/lib/testUtils/testFileCache.js.map +1 -1
  119. package/lib/testUtils/util.d.ts +1 -1
  120. package/lib/testUtils/util.d.ts.map +1 -1
  121. package/lib/testUtils/util.js +2 -2
  122. package/lib/testUtils/util.js.map +1 -1
  123. package/lib/util/aggregator.js.map +1 -1
  124. package/lib/util/altair.js.map +1 -1
  125. package/lib/util/array.js.map +1 -1
  126. package/lib/util/attestation.js.map +1 -1
  127. package/lib/util/attesterStatus.js.map +1 -1
  128. package/lib/util/balance.js.map +1 -1
  129. package/lib/util/blindedBlock.js.map +1 -1
  130. package/lib/util/blockRoot.js.map +1 -1
  131. package/lib/util/capella.js.map +1 -1
  132. package/lib/util/clock.d.ts +6 -0
  133. package/lib/util/clock.d.ts.map +1 -1
  134. package/lib/util/clock.js +1 -2
  135. package/lib/util/clock.js.map +1 -1
  136. package/lib/util/computeAnchorCheckpoint.js.map +1 -1
  137. package/lib/util/deposit.d.ts.map +1 -1
  138. package/lib/util/deposit.js +10 -8
  139. package/lib/util/deposit.js.map +1 -1
  140. package/lib/util/domain.js.map +1 -1
  141. package/lib/util/electra.js.map +1 -1
  142. package/lib/util/epoch.js.map +1 -1
  143. package/lib/util/epochShuffling.js.map +1 -1
  144. package/lib/util/execution.js.map +1 -1
  145. package/lib/util/finality.js.map +1 -1
  146. package/lib/util/fulu.js.map +1 -1
  147. package/lib/util/genesis.js +2 -2
  148. package/lib/util/genesis.js.map +1 -1
  149. package/lib/util/gloas.js.map +1 -1
  150. package/lib/util/interop.js.map +1 -1
  151. package/lib/util/loadState/findModifiedInactivityScores.js.map +1 -1
  152. package/lib/util/loadState/findModifiedValidators.js.map +1 -1
  153. package/lib/util/loadState/loadState.d.ts.map +1 -1
  154. package/lib/util/loadState/loadState.js +36 -5
  155. package/lib/util/loadState/loadState.js.map +1 -1
  156. package/lib/util/loadState/loadValidator.js.map +1 -1
  157. package/lib/util/pendingDepositsLookup.js.map +1 -1
  158. package/lib/util/rootCache.js.map +1 -1
  159. package/lib/util/seed.js.map +1 -1
  160. package/lib/util/shuffling.js +1 -2
  161. package/lib/util/shuffling.js.map +1 -1
  162. package/lib/util/signatureSets.js +1 -2
  163. package/lib/util/signatureSets.js.map +1 -1
  164. package/lib/util/signingRoot.js.map +1 -1
  165. package/lib/util/slot.js.map +1 -1
  166. package/lib/util/ssz.d.ts +5 -0
  167. package/lib/util/ssz.d.ts.map +1 -1
  168. package/lib/util/ssz.js +8 -1
  169. package/lib/util/ssz.js.map +1 -1
  170. package/lib/util/sszBytes.js.map +1 -1
  171. package/lib/util/syncCommittee.js.map +1 -1
  172. package/lib/util/targetUnslashedBalance.js.map +1 -1
  173. package/lib/util/validator.d.ts +5 -0
  174. package/lib/util/validator.d.ts.map +1 -1
  175. package/lib/util/validator.js +9 -0
  176. package/lib/util/validator.js.map +1 -1
  177. package/lib/util/weakSubjectivity.d.ts +1 -0
  178. package/lib/util/weakSubjectivity.d.ts.map +1 -1
  179. package/lib/util/weakSubjectivity.js +20 -8
  180. package/lib/util/weakSubjectivity.js.map +1 -1
  181. package/package.json +9 -9
  182. package/src/cache/stateCache.ts +3 -2
  183. package/src/lightClient/spec/utils.ts +2 -2
  184. package/src/metrics.ts +3 -2
  185. package/src/testUtils/state.ts +1 -1
  186. package/src/testUtils/util.ts +2 -2
  187. package/src/util/deposit.ts +11 -9
  188. package/src/util/genesis.ts +2 -2
  189. package/src/util/loadState/loadState.ts +50 -11
  190. package/src/util/ssz.ts +9 -1
  191. package/src/util/validator.ts +17 -0
  192. package/src/util/weakSubjectivity.ts +61 -22
package/src/util/ssz.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import {BranchNode, LeafNode, Node, zeroNode} from "@chainsafe/persistent-merkle-tree";
2
2
  import {progressiveSubtreeFillToContents} from "@chainsafe/ssz";
3
3
 
4
- // TODO: move these utils to @chainsafe/ssz (progressive.ts, next to progressiveSubtreeFillToContents)
4
+ // TODO: move these utils to @chainsafe/ssz, see https://github.com/ChainSafe/ssz/issues/542
5
5
 
6
6
  /** Root node (chunks + length mix-in) of a zero-filled ProgressiveListBasicType of `length` items */
7
7
  export function zeroProgressiveListBasicRootNode(itemsPerChunk: number, length: number): Node {
@@ -15,6 +15,14 @@ export function zeroProgressiveListBasicRootNode(itemsPerChunk: number, length:
15
15
  return new BranchNode(zeroProgressiveNode(numSubtrees), LeafNode.fromUint32(length));
16
16
  }
17
17
 
18
+ /**
19
+ * Check if an array-type ViewDU (ListBasic, ListComposite or their progressive equivalents) has its
20
+ * internal nodes cache populated. The flag is a private attribute maintained by all of these classes.
21
+ */
22
+ export function isViewDUNodesPopulated(view: unknown): boolean {
23
+ return (view as {nodesPopulated?: boolean}).nodesPopulated === true;
24
+ }
25
+
18
26
  /**
19
27
  * Root node of a progressive list from its chunk/element nodes + length mix-in.
20
28
  * `nodes` are packed 32-byte chunk leaves for basic lists, or element root nodes for composite lists.
@@ -128,6 +128,23 @@ export function getConsolidationChurnLimit(fork: ForkSeq, epochCtx: EpochCache):
128
128
  return getBalanceChurnLimitFromCache(epochCtx) - getActivationExitChurnLimit(epochCtx);
129
129
  }
130
130
 
131
+ // NOTE: duplicates the quotient/min choices in get{Exit,Activation,Consolidation}ChurnLimit.
132
+ export function getGloasChurnLimits(
133
+ config: ChainForkConfig,
134
+ totalActiveBalanceIncrements: number
135
+ ): {exit: number; activation: number; consolidation: number} {
136
+ const exit = getBalanceChurnLimit(
137
+ totalActiveBalanceIncrements,
138
+ config.CHURN_LIMIT_QUOTIENT_GLOAS,
139
+ config.MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA
140
+ );
141
+ return {
142
+ exit,
143
+ activation: Math.min(config.MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS, exit),
144
+ consolidation: getBalanceChurnLimit(totalActiveBalanceIncrements, config.CONSOLIDATION_CHURN_LIMIT_QUOTIENT, 0),
145
+ };
146
+ }
147
+
131
148
  export function getMaxEffectiveBalance(withdrawalCredentials: Uint8Array): number {
132
149
  // Compounding withdrawal credential only available since Electra
133
150
  if (hasCompoundingWithdrawalCredential(withdrawalCredentials)) {
@@ -1,10 +1,12 @@
1
1
  import {BeaconConfig, ChainForkConfig} from "@lodestar/config";
2
2
  import {
3
3
  EFFECTIVE_BALANCE_INCREMENT,
4
+ ForkSeq,
4
5
  MAX_DEPOSITS,
5
6
  MAX_EFFECTIVE_BALANCE,
6
7
  SLOTS_PER_EPOCH,
7
8
  isForkPostElectra,
9
+ isForkPostGloas,
8
10
  } from "@lodestar/params";
9
11
  import {Epoch, Root, ssz} from "@lodestar/types";
10
12
  import {Checkpoint} from "@lodestar/types/phase0";
@@ -14,10 +16,14 @@ import {BeaconStateAllForks, CachedBeaconStateAllForks} from "../types.js";
14
16
  import {computeCheckpointEpochAtStateSlot, computeEpochAtSlot, getCurrentEpoch} from "./epoch.js";
15
17
  import {getCurrentSlot} from "./slot.js";
16
18
  import {
19
+ getActivationChurnLimit,
17
20
  getActiveValidatorIndices,
18
21
  getBalanceChurnLimit,
19
22
  getBalanceChurnLimitFromCache,
20
23
  getChurnLimit,
24
+ getConsolidationChurnLimit,
25
+ getExitChurnLimit,
26
+ getGloasChurnLimits,
21
27
  } from "./validator.js";
22
28
 
23
29
  export const ETH_TO_GWEI = 10 ** 9;
@@ -49,18 +55,26 @@ export function computeWeakSubjectivityPeriodCachedState(
49
55
  const activeValidatorCount = state.epochCtx.currentShuffling.activeIndices.length;
50
56
  const fork = config.getForkName(state.slot);
51
57
 
52
- return isForkPostElectra(fork)
53
- ? computeWeakSubjectivityPeriodFromConstituentsElectra(
58
+ return isForkPostGloas(fork)
59
+ ? computeWeakSubjectivityPeriodFromConstituentsGloas(
54
60
  state.epochCtx.totalActiveBalanceIncrements,
55
- getBalanceChurnLimitFromCache(state.epochCtx),
61
+ getExitChurnLimit(state.epochCtx),
62
+ getActivationChurnLimit(state.epochCtx),
63
+ getConsolidationChurnLimit(ForkSeq.gloas, state.epochCtx),
56
64
  config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
57
65
  )
58
- : computeWeakSubjectivityPeriodFromConstituentsPhase0(
59
- activeValidatorCount,
60
- state.epochCtx.totalActiveBalanceIncrements,
61
- getChurnLimit(config, activeValidatorCount),
62
- config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
63
- );
66
+ : isForkPostElectra(fork)
67
+ ? computeWeakSubjectivityPeriodFromConstituentsElectra(
68
+ state.epochCtx.totalActiveBalanceIncrements,
69
+ getBalanceChurnLimitFromCache(state.epochCtx),
70
+ config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
71
+ )
72
+ : computeWeakSubjectivityPeriodFromConstituentsPhase0(
73
+ activeValidatorCount,
74
+ state.epochCtx.totalActiveBalanceIncrements,
75
+ getChurnLimit(config, activeValidatorCount),
76
+ config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
77
+ );
64
78
  }
65
79
 
66
80
  /**
@@ -80,22 +94,32 @@ export function computeWeakSubjectivityPeriod(config: ChainForkConfig, state: Be
80
94
  totalActiveBalanceIncrements = 1;
81
95
  }
82
96
 
83
- return isForkPostElectra(fork)
84
- ? computeWeakSubjectivityPeriodFromConstituentsElectra(
97
+ const churnLimitsGloas = getGloasChurnLimits(config, totalActiveBalanceIncrements);
98
+
99
+ return isForkPostGloas(fork)
100
+ ? computeWeakSubjectivityPeriodFromConstituentsGloas(
85
101
  totalActiveBalanceIncrements,
86
- getBalanceChurnLimit(
87
- totalActiveBalanceIncrements,
88
- config.CHURN_LIMIT_QUOTIENT,
89
- config.MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA
90
- ),
102
+ churnLimitsGloas.exit,
103
+ churnLimitsGloas.activation,
104
+ churnLimitsGloas.consolidation,
91
105
  config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
92
106
  )
93
- : computeWeakSubjectivityPeriodFromConstituentsPhase0(
94
- activeIndices.length,
95
- totalActiveBalanceIncrements,
96
- getChurnLimit(config, activeIndices.length),
97
- config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
98
- );
107
+ : isForkPostElectra(fork)
108
+ ? computeWeakSubjectivityPeriodFromConstituentsElectra(
109
+ totalActiveBalanceIncrements,
110
+ getBalanceChurnLimit(
111
+ totalActiveBalanceIncrements,
112
+ config.CHURN_LIMIT_QUOTIENT,
113
+ config.MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA
114
+ ),
115
+ config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
116
+ )
117
+ : computeWeakSubjectivityPeriodFromConstituentsPhase0(
118
+ activeIndices.length,
119
+ totalActiveBalanceIncrements,
120
+ getChurnLimit(config, activeIndices.length),
121
+ config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
122
+ );
99
123
  }
100
124
 
101
125
  export function computeWeakSubjectivityPeriodFromConstituentsPhase0(
@@ -142,6 +166,21 @@ export function computeWeakSubjectivityPeriodFromConstituentsElectra(
142
166
  return minWithdrawabilityDelay + epochsForValidatorSetChurn;
143
167
  }
144
168
 
169
+ export function computeWeakSubjectivityPeriodFromConstituentsGloas(
170
+ totalBalanceByIncrement: number,
171
+ exitChurnLimit: number,
172
+ activationChurnLimit: number,
173
+ consolidationChurnLimit: number,
174
+ minWithdrawabilityDelay: number
175
+ ): number {
176
+ // Keep t as increment for now. Multiply final result by EFFECTIVE_BALANCE_INCREMENT
177
+ const t = totalBalanceByIncrement;
178
+ const delta = Math.floor((2 * exitChurnLimit) / 3) + Math.floor(activationChurnLimit / 3) + consolidationChurnLimit;
179
+ const epochsForValidatorSetChurn = Math.floor(((SAFETY_DECAY * t) / (2 * delta * 100)) * EFFECTIVE_BALANCE_INCREMENT);
180
+
181
+ return minWithdrawabilityDelay + epochsForValidatorSetChurn;
182
+ }
183
+
145
184
  export function getLatestBlockRoot(state: BeaconStateAllForks): Root {
146
185
  const header = ssz.phase0.BeaconBlockHeader.clone(state.latestBlockHeader);
147
186
  if (ssz.Root.equals(header.stateRoot, ZERO_HASH)) {