@lodestar/state-transition 1.41.0-dev.bb273175f2 → 1.41.0-dev.be5acbb8f7

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 (60) hide show
  1. package/lib/block/index.d.ts +3 -3
  2. package/lib/block/processExecutionPayloadBid.d.ts +1 -1
  3. package/lib/block/processExecutionPayloadEnvelope.d.ts +5 -2
  4. package/lib/block/processExecutionPayloadEnvelope.d.ts.map +1 -1
  5. package/lib/block/processExecutionPayloadEnvelope.js +20 -14
  6. package/lib/block/processExecutionPayloadEnvelope.js.map +1 -1
  7. package/lib/block/processPayloadAttestation.d.ts +1 -1
  8. package/lib/epoch/index.d.ts +1 -1
  9. package/lib/epoch/processBuilderPendingPayments.d.ts +1 -1
  10. package/lib/testUtils/cache.d.ts +2 -0
  11. package/lib/testUtils/cache.d.ts.map +1 -0
  12. package/lib/testUtils/cache.js +7 -0
  13. package/lib/testUtils/cache.js.map +1 -0
  14. package/lib/testUtils/index.d.ts +6 -0
  15. package/lib/testUtils/index.d.ts.map +1 -0
  16. package/lib/testUtils/index.js +6 -0
  17. package/lib/testUtils/index.js.map +1 -0
  18. package/lib/testUtils/infura.d.ts +3 -0
  19. package/lib/testUtils/infura.d.ts.map +1 -0
  20. package/lib/testUtils/infura.js +8 -0
  21. package/lib/testUtils/infura.js.map +1 -0
  22. package/lib/testUtils/interop.d.ts +2 -0
  23. package/lib/testUtils/interop.d.ts.map +1 -0
  24. package/lib/testUtils/interop.js +24 -0
  25. package/lib/testUtils/interop.js.map +1 -0
  26. package/lib/testUtils/params.d.ts +18 -0
  27. package/lib/testUtils/params.d.ts.map +1 -0
  28. package/lib/testUtils/params.js +20 -0
  29. package/lib/testUtils/params.js.map +1 -0
  30. package/lib/testUtils/state.d.ts +20 -0
  31. package/lib/testUtils/state.d.ts.map +1 -0
  32. package/lib/testUtils/state.js +78 -0
  33. package/lib/testUtils/state.js.map +1 -0
  34. package/lib/testUtils/testFileCache.d.ts +17 -0
  35. package/lib/testUtils/testFileCache.d.ts.map +1 -0
  36. package/lib/testUtils/testFileCache.js +96 -0
  37. package/lib/testUtils/testFileCache.js.map +1 -0
  38. package/lib/testUtils/util.d.ts +50 -0
  39. package/lib/testUtils/util.d.ts.map +1 -0
  40. package/lib/testUtils/util.js +329 -0
  41. package/lib/testUtils/util.js.map +1 -0
  42. package/package.json +12 -7
  43. package/src/block/index.ts +3 -3
  44. package/src/block/isValidIndexedPayloadAttestation.ts +2 -2
  45. package/src/block/processAttestationsAltair.ts +1 -1
  46. package/src/block/processExecutionPayloadBid.ts +4 -4
  47. package/src/block/processExecutionPayloadEnvelope.ts +35 -21
  48. package/src/block/processOperations.ts +1 -1
  49. package/src/block/processPayloadAttestation.ts +2 -2
  50. package/src/block/processWithdrawals.ts +1 -1
  51. package/src/epoch/index.ts +1 -1
  52. package/src/epoch/processBuilderPendingPayments.ts +2 -2
  53. package/src/testUtils/cache.ts +8 -0
  54. package/src/testUtils/index.ts +5 -0
  55. package/src/testUtils/infura.ts +10 -0
  56. package/src/testUtils/interop.ts +29 -0
  57. package/src/testUtils/params.ts +23 -0
  58. package/src/testUtils/state.ts +110 -0
  59. package/src/testUtils/testFileCache.ts +127 -0
  60. package/src/testUtils/util.ts +429 -0
@@ -0,0 +1,329 @@
1
+ import { PublicKey } from "@chainsafe/blst";
2
+ import { BitArray, fromHexString } from "@chainsafe/ssz";
3
+ import { createBeaconConfig, createChainForkConfig } from "@lodestar/config";
4
+ import { config } from "@lodestar/config/default";
5
+ import { EPOCHS_PER_ETH1_VOTING_PERIOD, EPOCHS_PER_HISTORICAL_VECTOR, ForkSeq, MAX_ATTESTATIONS, MAX_EFFECTIVE_BALANCE, SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT, } from "@lodestar/params";
6
+ import { ssz } from "@lodestar/types";
7
+ import { getEffectiveBalanceIncrements } from "../cache/effectiveBalanceIncrements.js";
8
+ import { computeCommitteeCount, computeEpochAtSlot, createCachedBeaconState, createPubkeyCache, interopSecretKey, newFilledArray, processSlots, } from "../index.js";
9
+ import { getNextSyncCommittee } from "../util/syncCommittee.js";
10
+ import { getActiveValidatorIndices } from "../util/validator.js";
11
+ import { interopPubkeysCached } from "./interop.js";
12
+ let phase0State = null;
13
+ let phase0CachedState23637 = null;
14
+ let phase0CachedState23638 = null;
15
+ let phase0SignedBlock = null;
16
+ let altairState = null;
17
+ let altairCachedState23637 = null;
18
+ let altairCachedState23638 = null;
19
+ /**
20
+ * Number of validators in prater is 210000 as of May 2021
21
+ */
22
+ export const numValidators = 250000;
23
+ export const keypairsMod = 100;
24
+ /**
25
+ * As of Jul 07 2021, the performance state has
26
+ * out.prevEpochUnslashedStake.targetStake 7750000000000000n
27
+ * out.currEpochUnslashedTargetStake 7750000000000000n
28
+ * This prefix represent the total stake in Peta Wei
29
+ */
30
+ export const perfStateId = `${numValidators} vs - 7PWei`;
31
+ /** Cache interop secret keys */
32
+ const secretKeyByModIndex = new Map();
33
+ const epoch = 23638;
34
+ export const perfStateEpoch = epoch;
35
+ export function getPubkeys(vc = numValidators) {
36
+ const pubkeysMod = interopPubkeysCached(keypairsMod);
37
+ const pubkeysModObj = pubkeysMod.map((pk) => PublicKey.fromBytes(pk));
38
+ const pubkeys = Array.from({ length: vc }, (_, i) => pubkeysMod[i % keypairsMod]);
39
+ return { pubkeysMod, pubkeysModObj, pubkeys };
40
+ }
41
+ /** Get secret key of a validatorIndex, if the pubkeys are generated with `getPubkeys()` */
42
+ export function getSecretKeyFromIndex(validatorIndex) {
43
+ return interopSecretKey(validatorIndex % keypairsMod);
44
+ }
45
+ /** Get secret key of a validatorIndex, if the pubkeys are generated with `getPubkeys()` */
46
+ export function getSecretKeyFromIndexCached(validatorIndex) {
47
+ const keyIndex = validatorIndex % keypairsMod;
48
+ let sk = secretKeyByModIndex.get(keyIndex);
49
+ if (!sk) {
50
+ sk = interopSecretKey(keyIndex);
51
+ secretKeyByModIndex.set(keyIndex, sk);
52
+ }
53
+ return sk;
54
+ }
55
+ function getPubkeyCaches({ pubkeysMod }) {
56
+ // Manually sync pubkeys to prevent doing BLS opts 110_000 times
57
+ const pubkeyCache = createPubkeyCache();
58
+ for (let i = 0; i < numValidators; i++) {
59
+ const pubkey = pubkeysMod[i % keypairsMod];
60
+ pubkeyCache.set(i, pubkey);
61
+ }
62
+ return { pubkeyCache };
63
+ }
64
+ export function generatePerfTestCachedStatePhase0(opts) {
65
+ // Generate only some publicKeys
66
+ const { pubkeys, pubkeysMod, pubkeysModObj } = getPubkeys();
67
+ const { pubkeyCache } = getPubkeyCaches({ pubkeys, pubkeysMod, pubkeysModObj });
68
+ if (!phase0State) {
69
+ const state = buildPerformanceStatePhase0();
70
+ // no justificationBits
71
+ phase0State = ssz.phase0.BeaconState.toViewDU(state);
72
+ // cache roots
73
+ phase0State.hashTreeRoot();
74
+ }
75
+ if (!phase0CachedState23637) {
76
+ const state = phase0State.clone();
77
+ state.slot -= 1;
78
+ phase0CachedState23637 = createCachedBeaconState(state, {
79
+ config: createBeaconConfig(config, state.genesisValidatorsRoot),
80
+ pubkeyCache,
81
+ });
82
+ const currentEpoch = computeEpochAtSlot(state.slot - 1);
83
+ const previousEpoch = currentEpoch - 1;
84
+ // previous epoch attestations
85
+ const numPrevAttestations = SLOTS_PER_EPOCH * MAX_ATTESTATIONS;
86
+ const activeValidatorCount = pubkeys.length;
87
+ const committeesPerSlot = computeCommitteeCount(activeValidatorCount);
88
+ for (let i = 0; i < numPrevAttestations; i++) {
89
+ const slotInEpoch = i % SLOTS_PER_EPOCH;
90
+ const slot = previousEpoch * SLOTS_PER_EPOCH + slotInEpoch;
91
+ const index = i % committeesPerSlot;
92
+ const shuffling = phase0CachedState23637.epochCtx.getShufflingAtEpoch(previousEpoch);
93
+ const committee = shuffling.committees[slotInEpoch][index];
94
+ phase0CachedState23637.previousEpochAttestations.push(ssz.phase0.PendingAttestation.toViewDU({
95
+ aggregationBits: BitArray.fromBoolArray(Array.from({ length: committee.length }, () => true)),
96
+ data: {
97
+ beaconBlockRoot: phase0CachedState23637.blockRoots.get(slotInEpoch % SLOTS_PER_HISTORICAL_ROOT),
98
+ index,
99
+ slot,
100
+ source: state.previousJustifiedCheckpoint,
101
+ target: state.currentJustifiedCheckpoint,
102
+ },
103
+ inclusionDelay: 1,
104
+ proposerIndex: i,
105
+ }));
106
+ }
107
+ // current epoch attestations
108
+ const numCurAttestations = (SLOTS_PER_EPOCH - 1) * MAX_ATTESTATIONS;
109
+ for (let i = 0; i < numCurAttestations; i++) {
110
+ const slotInEpoch = i % SLOTS_PER_EPOCH;
111
+ const slot = currentEpoch * SLOTS_PER_EPOCH + slotInEpoch;
112
+ const index = i % committeesPerSlot;
113
+ const shuffling = phase0CachedState23637.epochCtx.getShufflingAtEpoch(previousEpoch);
114
+ const committee = shuffling.committees[slotInEpoch][index];
115
+ phase0CachedState23637.currentEpochAttestations.push(ssz.phase0.PendingAttestation.toViewDU({
116
+ aggregationBits: BitArray.fromBoolArray(Array.from({ length: committee.length }, () => true)),
117
+ data: {
118
+ beaconBlockRoot: phase0CachedState23637.blockRoots.get(slotInEpoch % SLOTS_PER_HISTORICAL_ROOT),
119
+ index,
120
+ slot,
121
+ source: state.currentJustifiedCheckpoint,
122
+ target: {
123
+ epoch: currentEpoch,
124
+ root: phase0CachedState23637.blockRoots.get((currentEpoch * SLOTS_PER_EPOCH) % SLOTS_PER_HISTORICAL_ROOT),
125
+ },
126
+ },
127
+ inclusionDelay: 1,
128
+ proposerIndex: i,
129
+ }));
130
+ }
131
+ }
132
+ if (!phase0CachedState23638) {
133
+ phase0CachedState23638 = processSlots(phase0CachedState23637, phase0CachedState23637.slot + 1);
134
+ phase0CachedState23638.slot += 1;
135
+ }
136
+ const resultingState = opts?.goBackOneSlot ? phase0CachedState23637 : phase0CachedState23638;
137
+ return resultingState.clone();
138
+ }
139
+ export function cachedStateAltairPopulateCaches(state) {
140
+ // Populate caches
141
+ state.blockRoots.getAllReadonly();
142
+ state.eth1DataVotes.getAllReadonly();
143
+ state.validators.getAllReadonly();
144
+ state.balances.getAll();
145
+ state.previousEpochParticipation.getAll();
146
+ state.currentEpochParticipation.getAll();
147
+ state.inactivityScores.getAll();
148
+ }
149
+ /**
150
+ * Warning: This function has side effects on the cached state
151
+ * The order in which the caches are populated is important and can cause stable tests to fail.
152
+ */
153
+ export function generatePerfTestCachedStateAltair(opts) {
154
+ const { pubkeys, pubkeysMod, pubkeysModObj } = getPubkeys(opts?.vc);
155
+ const { pubkeyCache } = getPubkeyCaches({ pubkeys, pubkeysMod, pubkeysModObj });
156
+ const altairConfig = createChainForkConfig({ ALTAIR_FORK_EPOCH: 0 });
157
+ const origState = generatePerformanceStateAltair(pubkeys);
158
+ if (!altairCachedState23637) {
159
+ const state = origState.clone();
160
+ state.slot -= 1;
161
+ altairCachedState23637 = createCachedBeaconState(state, {
162
+ config: createBeaconConfig(altairConfig, state.genesisValidatorsRoot),
163
+ pubkeyCache,
164
+ });
165
+ }
166
+ if (!altairCachedState23638) {
167
+ altairCachedState23638 = processSlots(altairCachedState23637, altairCachedState23637.slot + 1);
168
+ altairCachedState23638.slot += 1;
169
+ }
170
+ const resultingState = opts?.goBackOneSlot ? altairCachedState23637 : altairCachedState23638;
171
+ return resultingState.clone();
172
+ }
173
+ /**
174
+ * This is generated from Medalla state 756416
175
+ */
176
+ export function generatePerformanceStateAltair(pubkeysArg) {
177
+ if (!altairState) {
178
+ const pubkeys = pubkeysArg || getPubkeys().pubkeys;
179
+ const statePhase0 = buildPerformanceStatePhase0(pubkeys);
180
+ const state = statePhase0;
181
+ state.previousEpochParticipation = newFilledArray(pubkeys.length, 0b111);
182
+ state.currentEpochParticipation = state.previousEpochParticipation;
183
+ state.inactivityScores = Array.from({ length: pubkeys.length }, (_, i) => i % 2);
184
+ // Placeholder syncCommittees
185
+ state.currentSyncCommittee = ssz.altair.SyncCommittee.defaultValue();
186
+ state.nextSyncCommittee = state.currentSyncCommittee;
187
+ // Now the state is fully populated to convert to ViewDU
188
+ altairState = ssz.altair.BeaconState.toViewDU(state);
189
+ // Now set correct syncCommittees
190
+ const epoch = computeEpochAtSlot(state.slot);
191
+ const activeValidatorIndices = getActiveValidatorIndices(altairState, epoch);
192
+ const effectiveBalanceIncrements = getEffectiveBalanceIncrements(altairState);
193
+ const { syncCommittee } = getNextSyncCommittee(ForkSeq.altair, altairState, activeValidatorIndices, effectiveBalanceIncrements);
194
+ state.currentSyncCommittee = syncCommittee;
195
+ state.nextSyncCommittee = syncCommittee;
196
+ altairState = ssz.altair.BeaconState.toViewDU(state);
197
+ // cache roots
198
+ altairState.hashTreeRoot();
199
+ }
200
+ return altairState.clone();
201
+ }
202
+ /**
203
+ * This is generated from Medalla block 756417
204
+ */
205
+ export function generatePerformanceBlockPhase0() {
206
+ if (!phase0SignedBlock) {
207
+ const block = ssz.phase0.SignedBeaconBlock.defaultValue();
208
+ const parentState = generatePerfTestCachedStatePhase0();
209
+ block.message.slot = parentState.slot;
210
+ block.message.proposerIndex = parentState.epochCtx.getBeaconProposer(parentState.slot);
211
+ block.message.parentRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(parentState.latestBlockHeader);
212
+ block.message.stateRoot = fromHexString("0x6c86ca3c4c6688cf189421b8a68bf2dbc91521609965e6f4e207d44347061fee");
213
+ block.message.body.randaoReveal = fromHexString("0x8a5d2673c48f22f6ed19462efec35645db490df29eed2f56321dbe4a89b2463b0c902095a7ab74a2dc5b7f67edb1a19507ea3d4361d5af9cb0a524945c91638dfd6568841486813a2c45142659d6d9403f5081febb123a7931edbc248b9d0025");
214
+ // eth1Data, graffiti, attestations
215
+ phase0SignedBlock = block;
216
+ }
217
+ return phase0SignedBlock;
218
+ }
219
+ function buildPerformanceStatePhase0(pubkeysArg) {
220
+ const slot = epoch * SLOTS_PER_EPOCH;
221
+ const pubkeys = pubkeysArg || getPubkeys().pubkeys;
222
+ const currentEpoch = computeEpochAtSlot(slot - 1);
223
+ return {
224
+ // Misc
225
+ genesisTime: 1596546008,
226
+ genesisValidatorsRoot: fromHexString("0x04700007fabc8282644aed6d1c7c9e21d38a03a0c4ba193f3afe428824b3a673"),
227
+ slot: epoch * SLOTS_PER_EPOCH,
228
+ fork: {
229
+ currentVersion: fromHexString("0x00000001"),
230
+ previousVersion: fromHexString("0x00000001"),
231
+ epoch: 0,
232
+ },
233
+ // History
234
+ latestBlockHeader: {
235
+ slot: slot - 1,
236
+ proposerIndex: 80882,
237
+ parentRoot: fromHexString("0x5b83c3078e474b86af60043eda82a34c3c2e5ebf83146b14d9d909aea4163ef2"),
238
+ stateRoot: fromHexString("0x2761ae355e8a53c11e0e37d5e417f8984db0c53fa83f1bc65f89c6af35a196a7"),
239
+ bodyRoot: fromHexString("0x249a1962eef90e122fa2447040bfac102798b1dba9c73e5593bc5aa32eb92bfd"),
240
+ },
241
+ blockRoots: Array.from({ length: SLOTS_PER_HISTORICAL_ROOT }, (_, i) => Buffer.alloc(32, i)),
242
+ stateRoots: Array.from({ length: SLOTS_PER_HISTORICAL_ROOT }, (_, i) => Buffer.alloc(32, i)),
243
+ historicalRoots: [],
244
+ // Eth1
245
+ eth1Data: {
246
+ depositCount: pubkeys.length,
247
+ depositRoot: fromHexString("0xcb1f89a924cfd31224823db5a41b1643f10faa7aedf231f1e28887f6ee98c047"),
248
+ blockHash: fromHexString("0x701fb2869ce16d0f1d14f6705725adb0dec6799da29006dfc6fff83960298f21"),
249
+ },
250
+ // minus one so that inserting 1 from block works
251
+ eth1DataVotes: newFilledArray(EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH - 1, {
252
+ depositCount: 1,
253
+ depositRoot: Buffer.alloc(32, 1),
254
+ blockHash: Buffer.alloc(32, 1),
255
+ }),
256
+ eth1DepositIndex: pubkeys.length,
257
+ // Registry
258
+ validators: pubkeys.map((_, i) => ({
259
+ pubkey: pubkeys[i],
260
+ withdrawalCredentials: Buffer.alloc(32, i),
261
+ effectiveBalance: 31000000000,
262
+ slashed: false,
263
+ activationEligibilityEpoch: 0,
264
+ activationEpoch: 0,
265
+ exitEpoch: Infinity,
266
+ withdrawableEpoch: Infinity,
267
+ })),
268
+ balances: Array.from({ length: pubkeys.length }, () => 31217089836),
269
+ randaoMixes: Array.from({ length: EPOCHS_PER_HISTORICAL_VECTOR }, (_, i) => Buffer.alloc(32, i)),
270
+ // Slashings
271
+ slashings: ssz.phase0.Slashings.defaultValue(),
272
+ previousEpochAttestations: [],
273
+ currentEpochAttestations: [],
274
+ // Finality
275
+ justificationBits: BitArray.fromBitLen(4),
276
+ previousJustifiedCheckpoint: {
277
+ epoch: currentEpoch - 2,
278
+ root: fromHexString("0x3fe60bf06a57b0956cd1f8181d26649cf8bf79e48bf82f55562e04b33d4785d4"),
279
+ },
280
+ currentJustifiedCheckpoint: {
281
+ epoch: currentEpoch - 1,
282
+ root: fromHexString("0x3ba0913d2fb5e4cbcfb0d39eb15803157c1e769d63b8619285d8fdabbd8181c7"),
283
+ },
284
+ finalizedCheckpoint: {
285
+ epoch: currentEpoch - 3,
286
+ root: fromHexString("0x122b8ff579d0c8f8a8b66326bdfec3f685007d2842f01615a0768870961ccc17"),
287
+ },
288
+ };
289
+ }
290
+ export function generateTestCachedBeaconStateOnlyValidators({ vc, slot, }) {
291
+ // Generate only some publicKeys
292
+ const { pubkeys, pubkeysMod } = getPubkeys(vc);
293
+ // Manually sync pubkeys to prevent doing BLS opts 110_000 times
294
+ const pubkeyCache = createPubkeyCache();
295
+ for (let i = 0; i < vc; i++) {
296
+ const pubkey = pubkeysMod[i % keypairsMod];
297
+ pubkeyCache.set(i, pubkey);
298
+ }
299
+ const state = ssz.phase0.BeaconState.defaultViewDU();
300
+ state.slot = slot;
301
+ const activeValidator = ssz.phase0.Validator.toViewDU({
302
+ pubkey: Buffer.alloc(48, 0),
303
+ withdrawalCredentials: Buffer.alloc(32, 0),
304
+ effectiveBalance: MAX_EFFECTIVE_BALANCE,
305
+ slashed: false,
306
+ activationEligibilityEpoch: 0,
307
+ activationEpoch: 0,
308
+ exitEpoch: Infinity,
309
+ withdrawableEpoch: Infinity,
310
+ });
311
+ for (let i = 0; i < vc; i++) {
312
+ const validator = activeValidator.clone();
313
+ validator.pubkey = pubkeys[i];
314
+ state.validators.push(validator);
315
+ }
316
+ state.balances = ssz.phase0.Balances.toViewDU(newFilledArray(pubkeys.length, MAX_EFFECTIVE_BALANCE));
317
+ state.randaoMixes = ssz.phase0.RandaoMixes.toViewDU(newFilledArray(EPOCHS_PER_HISTORICAL_VECTOR, Buffer.alloc(32, 0xdd)));
318
+ // Commit ViewDU changes
319
+ state.commit();
320
+ // Sanity check for .commit() above
321
+ if (state.validators.length !== vc) {
322
+ throw Error(`Wrong number of validators in the state: ${state.validators.length} !== ${vc}`);
323
+ }
324
+ return createCachedBeaconState(state, {
325
+ config: createBeaconConfig(config, state.genesisValidatorsRoot),
326
+ pubkeyCache,
327
+ }, { skipSyncPubkeys: true });
328
+ }
329
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/testUtils/util.ts"],"names":[],"mappings":"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"}
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.41.0-dev.bb273175f2",
14
+ "version": "1.41.0-dev.be5acbb8f7",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -33,6 +33,11 @@
33
33
  "bun": "./src/slot/index.ts",
34
34
  "types": "./lib/slot/index.d.ts",
35
35
  "import": "./lib/slot/index.js"
36
+ },
37
+ "./test-utils": {
38
+ "bun": "./src/testUtils/index.ts",
39
+ "types": "./lib/testUtils/index.d.ts",
40
+ "import": "./lib/testUtils/index.js"
36
41
  }
37
42
  },
38
43
  "files": [
@@ -62,14 +67,14 @@
62
67
  "@chainsafe/pubkey-index-map": "^3.0.0",
63
68
  "@chainsafe/ssz": "^1.2.2",
64
69
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
65
- "@lodestar/config": "^1.41.0-dev.bb273175f2",
66
- "@lodestar/params": "^1.41.0-dev.bb273175f2",
67
- "@lodestar/types": "^1.41.0-dev.bb273175f2",
68
- "@lodestar/utils": "^1.41.0-dev.bb273175f2",
70
+ "@lodestar/config": "^1.41.0-dev.be5acbb8f7",
71
+ "@lodestar/params": "^1.41.0-dev.be5acbb8f7",
72
+ "@lodestar/types": "^1.41.0-dev.be5acbb8f7",
73
+ "@lodestar/utils": "^1.41.0-dev.be5acbb8f7",
69
74
  "@vekexasia/bigint-buffer2": "^1.1.0"
70
75
  },
71
76
  "devDependencies": {
72
- "@lodestar/api": "^1.41.0-dev.bb273175f2"
77
+ "@lodestar/api": "^1.41.0-dev.be5acbb8f7"
73
78
  },
74
79
  "keywords": [
75
80
  "ethereum",
@@ -77,5 +82,5 @@
77
82
  "beacon",
78
83
  "blockchain"
79
84
  ],
80
- "gitHead": "33bc8284a7ac0a15d6b6dac387bd5567f819ed19"
85
+ "gitHead": "daf32e31b38dd272b28016e37de0d0419ce72864"
81
86
  }
@@ -13,10 +13,10 @@ import {processBlobKzgCommitments} from "./processBlobKzgCommitments.js";
13
13
  import {processBlockHeader} from "./processBlockHeader.js";
14
14
  import {processEth1Data} from "./processEth1Data.js";
15
15
  import {processExecutionPayload} from "./processExecutionPayload.js";
16
- import {processExecutionPayloadBid} from "./processExecutionPayloadBid.ts";
17
- import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.ts";
16
+ import {processExecutionPayloadBid} from "./processExecutionPayloadBid.js";
17
+ import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.js";
18
18
  import {processOperations} from "./processOperations.js";
19
- import {processPayloadAttestation} from "./processPayloadAttestation.ts";
19
+ import {processPayloadAttestation} from "./processPayloadAttestation.js";
20
20
  import {processRandao} from "./processRandao.js";
21
21
  import {processSyncAggregate} from "./processSyncCommittee.js";
22
22
  import {processWithdrawals} from "./processWithdrawals.js";
@@ -1,7 +1,7 @@
1
1
  import {gloas} from "@lodestar/types";
2
- import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.ts";
2
+ import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.js";
3
3
  import {CachedBeaconStateGloas} from "../types.js";
4
- import {verifySignatureSet} from "../util/index.ts";
4
+ import {verifySignatureSet} from "../util/index.js";
5
5
 
6
6
  export function isValidIndexedPayloadAttestation(
7
7
  state: CachedBeaconStateGloas,
@@ -18,7 +18,7 @@ import {byteArrayEquals, intSqrt} from "@lodestar/utils";
18
18
  import {BeaconStateTransitionMetrics} from "../metrics.js";
19
19
  import {getAttestationWithIndicesSignatureSet} from "../signatureSets/indexedAttestation.js";
20
20
  import {CachedBeaconStateAltair, CachedBeaconStateGloas} from "../types.js";
21
- import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.ts";
21
+ import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.js";
22
22
  import {increaseBalance, verifySignatureSet} from "../util/index.js";
23
23
  import {RootCache} from "../util/rootCache.js";
24
24
  import {checkpointToStr, isTimelyTarget, validateAttestation} from "./processAttestationPhase0.js";
@@ -2,11 +2,11 @@ import {PublicKey, Signature, verify} from "@chainsafe/blst";
2
2
  import {BUILDER_INDEX_SELF_BUILD, ForkPostGloas, SLOTS_PER_EPOCH} from "@lodestar/params";
3
3
  import {BeaconBlock, gloas, ssz} from "@lodestar/types";
4
4
  import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
5
- import {G2_POINT_AT_INFINITY} from "../constants/constants.ts";
5
+ import {G2_POINT_AT_INFINITY} from "../constants/constants.js";
6
6
  import {getExecutionPayloadBidSigningRoot} from "../signatureSets/executionPayloadBid.js";
7
- import {CachedBeaconStateGloas} from "../types.ts";
8
- import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.ts";
9
- import {getCurrentEpoch, getRandaoMix} from "../util/index.ts";
7
+ import {CachedBeaconStateGloas} from "../types.js";
8
+ import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.js";
9
+ import {getCurrentEpoch, getRandaoMix} from "../util/index.js";
10
10
 
11
11
  export function processExecutionPayloadBid(state: CachedBeaconStateGloas, block: BeaconBlock<ForkPostGloas>): void {
12
12
  const signedBid = block.body.signedExecutionPayloadBid;
@@ -7,18 +7,25 @@ import {
7
7
  } from "@lodestar/params";
8
8
  import {gloas, ssz} from "@lodestar/types";
9
9
  import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
10
- import {CachedBeaconStateGloas} from "../types.ts";
11
- import {computeSigningRoot, computeTimeAtSlot} from "../util/index.ts";
12
- import {processConsolidationRequest} from "./processConsolidationRequest.ts";
13
- import {processDepositRequest} from "./processDepositRequest.ts";
14
- import {processWithdrawalRequest} from "./processWithdrawalRequest.ts";
15
-
16
- // This function does not call execution engine to verify payload. Need to call it from other place
10
+ import {CachedBeaconStateGloas} from "../types.js";
11
+ import {computeSigningRoot, computeTimeAtSlot} from "../util/index.js";
12
+ import {processConsolidationRequest} from "./processConsolidationRequest.js";
13
+ import {processDepositRequest} from "./processDepositRequest.js";
14
+ import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
15
+
16
+ export type ProcessExecutionPayloadEnvelopeOpts = {
17
+ dontTransferCache?: boolean;
18
+ };
19
+
20
+ // Unlike other block processing functions which mutate state in-place, this function
21
+ // clones the state and returns the post-state, similar to stateTransition().
22
+ // This function does not call execution engine to verify payload. Need to call it from other place.
17
23
  export function processExecutionPayloadEnvelope(
18
24
  state: CachedBeaconStateGloas,
19
25
  signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
20
- verify: boolean
21
- ): void {
26
+ verify: boolean,
27
+ opts?: ProcessExecutionPayloadEnvelopeOpts
28
+ ): CachedBeaconStateGloas {
22
29
  const envelope = signedEnvelope.message;
23
30
  const payload = envelope.payload;
24
31
  const fork = state.config.getForkSeq(envelope.slot);
@@ -27,42 +34,49 @@ export function processExecutionPayloadEnvelope(
27
34
  throw Error(`Execution payload envelope has invalid signature builderIndex=${envelope.builderIndex}`);
28
35
  }
29
36
 
30
- validateExecutionPayloadEnvelope(state, envelope);
37
+ // .clone() before mutating state, similar to stateTransition()
38
+ const postState = state.clone(opts?.dontTransferCache) as CachedBeaconStateGloas;
39
+
40
+ validateExecutionPayloadEnvelope(postState, envelope);
31
41
 
32
42
  const requests = envelope.executionRequests;
33
43
 
34
44
  for (const deposit of requests.deposits) {
35
- processDepositRequest(fork, state, deposit);
45
+ processDepositRequest(fork, postState, deposit);
36
46
  }
37
47
 
38
48
  for (const withdrawal of requests.withdrawals) {
39
- processWithdrawalRequest(fork, state, withdrawal);
49
+ processWithdrawalRequest(fork, postState, withdrawal);
40
50
  }
41
51
 
42
52
  for (const consolidation of requests.consolidations) {
43
- processConsolidationRequest(state, consolidation);
53
+ processConsolidationRequest(postState, consolidation);
44
54
  }
45
55
 
46
56
  // Queue the builder payment
47
- const paymentIndex = SLOTS_PER_EPOCH + (state.slot % SLOTS_PER_EPOCH);
48
- const payment = state.builderPendingPayments.get(paymentIndex).clone();
57
+ const paymentIndex = SLOTS_PER_EPOCH + (postState.slot % SLOTS_PER_EPOCH);
58
+ const payment = postState.builderPendingPayments.get(paymentIndex).clone();
49
59
  const amount = payment.withdrawal.amount;
50
60
 
51
61
  if (amount > 0) {
52
- state.builderPendingWithdrawals.push(payment.withdrawal);
62
+ postState.builderPendingWithdrawals.push(payment.withdrawal);
53
63
  }
54
64
 
55
- state.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
65
+ postState.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
56
66
 
57
67
  // Cache the execution payload hash
58
- state.executionPayloadAvailability.set(state.slot % SLOTS_PER_HISTORICAL_ROOT, true);
59
- state.latestBlockHash = payload.blockHash;
68
+ postState.executionPayloadAvailability.set(postState.slot % SLOTS_PER_HISTORICAL_ROOT, true);
69
+ postState.latestBlockHash = payload.blockHash;
60
70
 
61
- if (verify && !byteArrayEquals(envelope.stateRoot, state.hashTreeRoot())) {
71
+ postState.commit();
72
+
73
+ if (verify && !byteArrayEquals(envelope.stateRoot, postState.hashTreeRoot())) {
62
74
  throw new Error(
63
- `Envelope's state root does not match state envelope=${toRootHex(envelope.stateRoot)} state=${toRootHex(state.hashTreeRoot())}`
75
+ `Envelope's state root does not match state envelope=${toRootHex(envelope.stateRoot)} state=${toRootHex(postState.hashTreeRoot())}`
64
76
  );
65
77
  }
78
+
79
+ return postState;
66
80
  }
67
81
 
68
82
  function validateExecutionPayloadEnvelope(
@@ -14,7 +14,7 @@ import {processBlsToExecutionChange} from "./processBlsToExecutionChange.js";
14
14
  import {processConsolidationRequest} from "./processConsolidationRequest.js";
15
15
  import {processDeposit} from "./processDeposit.js";
16
16
  import {processDepositRequest} from "./processDepositRequest.js";
17
- import {processPayloadAttestation} from "./processPayloadAttestation.ts";
17
+ import {processPayloadAttestation} from "./processPayloadAttestation.js";
18
18
  import {processProposerSlashing} from "./processProposerSlashing.js";
19
19
  import {processVoluntaryExit} from "./processVoluntaryExit.js";
20
20
  import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
@@ -1,7 +1,7 @@
1
1
  import {gloas} from "@lodestar/types";
2
2
  import {byteArrayEquals} from "@lodestar/utils";
3
- import {CachedBeaconStateGloas} from "../types.ts";
4
- import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.ts";
3
+ import {CachedBeaconStateGloas} from "../types.js";
4
+ import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.js";
5
5
 
6
6
  export function processPayloadAttestation(
7
7
  state: CachedBeaconStateGloas,
@@ -16,7 +16,7 @@ import {
16
16
  convertValidatorIndexToBuilderIndex,
17
17
  isBuilderIndex,
18
18
  isParentBlockFull,
19
- } from "../util/gloas.ts";
19
+ } from "../util/gloas.js";
20
20
  import {
21
21
  decreaseBalance,
22
22
  getMaxEffectiveBalance,
@@ -16,7 +16,7 @@ import {
16
16
  CachedBeaconStatePhase0,
17
17
  EpochTransitionCache,
18
18
  } from "../types.js";
19
- import {processBuilderPendingPayments} from "./processBuilderPendingPayments.ts";
19
+ import {processBuilderPendingPayments} from "./processBuilderPendingPayments.js";
20
20
  import {processEffectiveBalanceUpdates} from "./processEffectiveBalanceUpdates.js";
21
21
  import {processEth1DataReset} from "./processEth1DataReset.js";
22
22
  import {processHistoricalRootsUpdate} from "./processHistoricalRootsUpdate.js";
@@ -1,7 +1,7 @@
1
1
  import {SLOTS_PER_EPOCH} from "@lodestar/params";
2
2
  import {ssz} from "@lodestar/types";
3
- import {CachedBeaconStateGloas} from "../types.ts";
4
- import {getBuilderPaymentQuorumThreshold} from "../util/gloas.ts";
3
+ import {CachedBeaconStateGloas} from "../types.js";
4
+ import {getBuilderPaymentQuorumThreshold} from "../util/gloas.js";
5
5
 
6
6
  /**
7
7
  * Processes the builder pending payments from the previous epoch.
@@ -0,0 +1,8 @@
1
+ import path from "node:path";
2
+ import {fileURLToPath} from "node:url";
3
+
4
+ // Global variable __dirname no longer available in ES6 modules.
5
+ // Solutions: https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+
8
+ export const testCachePath = path.join(__dirname, "../../test/test-cache");
@@ -0,0 +1,5 @@
1
+ export * from "./cache.js";
2
+ export * from "./interop.js";
3
+ export * from "./params.js";
4
+ export * from "./testFileCache.js";
5
+ export * from "./util.js";
@@ -0,0 +1,10 @@
1
+ import {NetworkName} from "@lodestar/config/networks";
2
+
3
+ export function getInfuraBeaconUrl(network: NetworkName): string {
4
+ const INFURA_ETH2_CREDENTIALS = process.env.INFURA_ETH2_CREDENTIALS;
5
+ if (!INFURA_ETH2_CREDENTIALS) {
6
+ throw Error("Must set ENV INFURA_ETH2_CREDENTIALS");
7
+ }
8
+
9
+ return `https://${INFURA_ETH2_CREDENTIALS}@eth2-beacon-${network}.infura.io`;
10
+ }