@lodestar/state-transition 1.42.0 → 1.43.0-dev.0bc48d3b54

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 (78) hide show
  1. package/lib/block/processDepositRequest.d.ts +11 -2
  2. package/lib/block/processDepositRequest.d.ts.map +1 -1
  3. package/lib/block/processDepositRequest.js +34 -4
  4. package/lib/block/processDepositRequest.js.map +1 -1
  5. package/lib/block/processExecutionPayloadEnvelope.d.ts.map +1 -1
  6. package/lib/block/processExecutionPayloadEnvelope.js +7 -3
  7. package/lib/block/processExecutionPayloadEnvelope.js.map +1 -1
  8. package/lib/cache/epochCache.d.ts +3 -1
  9. package/lib/cache/epochCache.d.ts.map +1 -1
  10. package/lib/cache/epochCache.js +31 -13
  11. package/lib/cache/epochCache.js.map +1 -1
  12. package/lib/cache/epochTransitionCache.d.ts +5 -0
  13. package/lib/cache/epochTransitionCache.d.ts.map +1 -1
  14. package/lib/cache/epochTransitionCache.js +1 -0
  15. package/lib/cache/epochTransitionCache.js.map +1 -1
  16. package/lib/epoch/index.d.ts +3 -1
  17. package/lib/epoch/index.d.ts.map +1 -1
  18. package/lib/epoch/index.js +8 -1
  19. package/lib/epoch/index.js.map +1 -1
  20. package/lib/epoch/processPtcWindow.d.ts +11 -0
  21. package/lib/epoch/processPtcWindow.d.ts.map +1 -0
  22. package/lib/epoch/processPtcWindow.js +28 -0
  23. package/lib/epoch/processPtcWindow.js.map +1 -0
  24. package/lib/index.d.ts +4 -2
  25. package/lib/index.d.ts.map +1 -1
  26. package/lib/index.js +4 -1
  27. package/lib/index.js.map +1 -1
  28. package/lib/signatureSets/executionPayloadEnvelope.d.ts.map +1 -1
  29. package/lib/signatureSets/executionPayloadEnvelope.js +4 -0
  30. package/lib/signatureSets/executionPayloadEnvelope.js.map +1 -1
  31. package/lib/signatureSets/voluntaryExits.d.ts +2 -2
  32. package/lib/signatureSets/voluntaryExits.d.ts.map +1 -1
  33. package/lib/signatureSets/voluntaryExits.js +4 -0
  34. package/lib/signatureSets/voluntaryExits.js.map +1 -1
  35. package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
  36. package/lib/slot/upgradeStateToGloas.js +2 -1
  37. package/lib/slot/upgradeStateToGloas.js.map +1 -1
  38. package/lib/stateTransition.d.ts +1 -2
  39. package/lib/stateTransition.d.ts.map +1 -1
  40. package/lib/stateTransition.js +1 -2
  41. package/lib/stateTransition.js.map +1 -1
  42. package/lib/stateView/beaconStateView.d.ts +10 -10
  43. package/lib/stateView/beaconStateView.d.ts.map +1 -1
  44. package/lib/stateView/beaconStateView.js +37 -34
  45. package/lib/stateView/beaconStateView.js.map +1 -1
  46. package/lib/stateView/interface.d.ts +103 -52
  47. package/lib/stateView/interface.d.ts.map +1 -1
  48. package/lib/stateView/interface.js +22 -1
  49. package/lib/stateView/interface.js.map +1 -1
  50. package/lib/util/attestation.d.ts +12 -1
  51. package/lib/util/attestation.d.ts.map +1 -1
  52. package/lib/util/attestation.js +23 -8
  53. package/lib/util/attestation.js.map +1 -1
  54. package/lib/util/execution.d.ts +4 -2
  55. package/lib/util/execution.d.ts.map +1 -1
  56. package/lib/util/execution.js +7 -0
  57. package/lib/util/execution.js.map +1 -1
  58. package/lib/util/gloas.d.ts +7 -1
  59. package/lib/util/gloas.d.ts.map +1 -1
  60. package/lib/util/gloas.js +26 -1
  61. package/lib/util/gloas.js.map +1 -1
  62. package/package.json +8 -8
  63. package/src/block/processDepositRequest.ts +50 -5
  64. package/src/block/processExecutionPayloadEnvelope.ts +8 -3
  65. package/src/cache/epochCache.ts +32 -30
  66. package/src/cache/epochTransitionCache.ts +7 -0
  67. package/src/epoch/index.ts +9 -0
  68. package/src/epoch/processPtcWindow.ts +38 -0
  69. package/src/index.ts +20 -2
  70. package/src/signatureSets/executionPayloadEnvelope.ts +5 -1
  71. package/src/signatureSets/voluntaryExits.ts +5 -2
  72. package/src/slot/upgradeStateToGloas.ts +2 -1
  73. package/src/stateTransition.ts +1 -2
  74. package/src/stateView/beaconStateView.ts +57 -41
  75. package/src/stateView/interface.ts +155 -74
  76. package/src/util/attestation.ts +37 -8
  77. package/src/util/execution.ts +11 -1
  78. package/src/util/gloas.ts +48 -1
@@ -1,6 +1,6 @@
1
1
  import { ForkName, ForkPostBellatrix, ForkPreGloas, ForkSeq } from "@lodestar/params";
2
2
  import { BeaconBlock, BeaconBlockBody, BlindedBeaconBlock, BlindedBeaconBlockBody, ExecutionPayload, ExecutionPayloadHeader, capella } from "@lodestar/types";
3
- import { BeaconStateAllForks, BeaconStateCapella, BeaconStateExecutions, CachedBeaconStateAllForks, CachedBeaconStateExecutions } from "../types.js";
3
+ import { BeaconStateAllForks, BeaconStateCapella, BeaconStateExecutions, BeaconStateGloas, CachedBeaconStateAllForks, CachedBeaconStateExecutions } from "../types.js";
4
4
  /**
5
5
  * Execution enabled = merge is done.
6
6
  * When (A) state has execution data OR (B) block has execution data
@@ -10,11 +10,13 @@ export declare function isExecutionEnabled(state: BeaconStateExecutions, block:
10
10
  * Merge is complete when the state includes execution layer data:
11
11
  * state.latestExecutionPayloadHeader NOT EMPTY or state is post-capella
12
12
  */
13
- export declare function isMergeTransitionComplete(state: BeaconStateExecutions): boolean;
13
+ export declare function isMergeTransitionComplete(state: BeaconStateExecutions | BeaconStateGloas): boolean;
14
14
  /** Type guard for bellatrix.BeaconState */
15
15
  export declare function isExecutionStateType(state: BeaconStateAllForks): state is BeaconStateExecutions;
16
16
  /** Type guard for capella.BeaconState */
17
17
  export declare function isCapellaStateType(state: BeaconStateAllForks): state is BeaconStateCapella;
18
+ /** Type guard for gloas.BeaconState */
19
+ export declare function isGloasStateType(state: BeaconStateAllForks): state is BeaconStateGloas;
18
20
  /** Type guard for bellatrix.CachedBeaconState */
19
21
  export declare function isExecutionCachedStateType(state: CachedBeaconStateAllForks): state is CachedBeaconStateExecutions;
20
22
  /** Type guard for ExecutionBlockBody */
@@ -1 +1 @@
1
- {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/util/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACpF,OAAO,EACL,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EAEtB,OAAO,EAKR,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EAEnB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,kBAAkB,GAAG,OAAO,CAcjH;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAU/E;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,IAAI,qBAAqB,CAE/F;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,IAAI,kBAAkB,CAK1F;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,yBAAyB,GAAG,KAAK,IAAI,2BAA2B,CAEjH;AAED,wCAAwC;AACxC,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,eAAe,GACzB,SAAS,IAAI,eAAe,CAAC,iBAAiB,GAAG,YAAY,CAAC,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,sBAAsB,CAErG;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,eAAe,GAAG,sBAAsB,GAC7C,gBAAgB,GAAG,sBAAsB,CAU3C;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,GACjD,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAK1F;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,CAAC,6BAA6B,GAC7C,OAAO,IAAI,OAAO,CAAC,sBAAsB,CAE3C;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,CAuChH"}
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/util/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACpF,OAAO,EACL,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EAEtB,OAAO,EAKR,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EAEnB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,kBAAkB,GAAG,OAAO,CAcjH;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,GAAG,gBAAgB,GAAG,OAAO,CAclG;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,IAAI,qBAAqB,CAE/F;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,IAAI,kBAAkB,CAK1F;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,IAAI,gBAAgB,CAEtF;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,yBAAyB,GAAG,KAAK,IAAI,2BAA2B,CAEjH;AAED,wCAAwC;AACxC,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,eAAe,GACzB,SAAS,IAAI,eAAe,CAAC,iBAAiB,GAAG,YAAY,CAAC,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,sBAAsB,CAErG;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,eAAe,GAAG,sBAAsB,GAC7C,gBAAgB,GAAG,sBAAsB,CAU3C;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,GACjD,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAK1F;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,CAAC,6BAA6B,GAC7C,OAAO,IAAI,OAAO,CAAC,sBAAsB,CAE3C;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,CAuChH"}
@@ -19,6 +19,9 @@ export function isExecutionEnabled(state, block) {
19
19
  * state.latestExecutionPayloadHeader NOT EMPTY or state is post-capella
20
20
  */
21
21
  export function isMergeTransitionComplete(state) {
22
+ if (isGloasStateType(state)) {
23
+ return true;
24
+ }
22
25
  if (isCapellaStateType(state)) {
23
26
  // All networks have completed the merge transition before capella
24
27
  return true;
@@ -34,6 +37,10 @@ export function isCapellaStateType(state) {
34
37
  return (state.latestExecutionPayloadHeader !== undefined &&
35
38
  state.latestExecutionPayloadHeader.withdrawalsRoot !== undefined);
36
39
  }
40
+ /** Type guard for gloas.BeaconState */
41
+ export function isGloasStateType(state) {
42
+ return state.latestBlockHash !== undefined;
43
+ }
37
44
  /** Type guard for bellatrix.CachedBeaconState */
38
45
  export function isExecutionCachedStateType(state) {
39
46
  return state.latestExecutionPayloadHeader !== undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/util/execution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/util/execution.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { BuilderIndex, Epoch, ValidatorIndex, gloas } from "@lodestar/types";
2
2
  import { AttestationData } from "@lodestar/types/phase0";
3
- import { CachedBeaconStateGloas } from "../types.js";
3
+ import { CachedBeaconStateFulu, CachedBeaconStateGloas } from "../types.js";
4
4
  import { RootCache } from "./rootCache.js";
5
5
  export declare function isBuilderWithdrawalCredential(withdrawalCredentials: Uint8Array): boolean;
6
6
  export declare function getBuilderPaymentQuorumThreshold(state: CachedBeaconStateGloas): number;
@@ -49,4 +49,10 @@ export declare function findBuilderIndexByPubkey(state: CachedBeaconStateGloas,
49
49
  export declare function isAttestationSameSlot(state: CachedBeaconStateGloas, data: AttestationData): boolean;
50
50
  export declare function isAttestationSameSlotRootCache(rootCache: RootCache, data: AttestationData): boolean;
51
51
  export declare function isParentBlockFull(state: CachedBeaconStateGloas): boolean;
52
+ export declare function initializePtcWindow(state: CachedBeaconStateFulu): Uint32Array[];
53
+ export declare function getPtcWindowEpochCacheData(state: CachedBeaconStateGloas): {
54
+ previousPayloadTimelinessCommittees: Uint32Array[];
55
+ payloadTimelinessCommittees: Uint32Array[];
56
+ nextPayloadTimelinessCommittees: Uint32Array[];
57
+ };
52
58
  //# sourceMappingURL=gloas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gloas.d.ts","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AAUA,OAAO,EAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAEzC,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAExF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAMtF;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAG9F;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAGhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,GAAG,OAAO,CAEtF;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,GACzB,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAWnG;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAO/G;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAExE"}
1
+ {"version":3,"file":"gloas.d.ts","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AAYA,OAAO,EAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAI1E,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAIzC,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAExF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAMtF;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAG9F;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAGhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,GAAG,OAAO,CAEtF;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,GACzB,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAWnG;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAO/G;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAExE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,WAAW,EAAE,CAqB/E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,GAAG;IACzE,mCAAmC,EAAE,WAAW,EAAE,CAAC;IACnD,2BAA2B,EAAE,WAAW,EAAE,CAAC;IAC3C,+BAA+B,EAAE,WAAW,EAAE,CAAC;CAChD,CAaA"}
package/lib/util/gloas.js CHANGED
@@ -1,7 +1,10 @@
1
- import { BUILDER_INDEX_FLAG, BUILDER_PAYMENT_THRESHOLD_DENOMINATOR, BUILDER_PAYMENT_THRESHOLD_NUMERATOR, BUILDER_WITHDRAWAL_PREFIX, EFFECTIVE_BALANCE_INCREMENT, FAR_FUTURE_EPOCH, MIN_DEPOSIT_AMOUNT, SLOTS_PER_EPOCH, } from "@lodestar/params";
1
+ import { BUILDER_INDEX_FLAG, BUILDER_PAYMENT_THRESHOLD_DENOMINATOR, BUILDER_PAYMENT_THRESHOLD_NUMERATOR, BUILDER_WITHDRAWAL_PREFIX, EFFECTIVE_BALANCE_INCREMENT, FAR_FUTURE_EPOCH, MIN_DEPOSIT_AMOUNT, MIN_SEED_LOOKAHEAD, PTC_SIZE, SLOTS_PER_EPOCH, } from "@lodestar/params";
2
2
  import { byteArrayEquals } from "@lodestar/utils";
3
3
  import { getBlockRootAtSlot } from "./blockRoot.js";
4
4
  import { computeEpochAtSlot } from "./epoch.js";
5
+ import { computeEpochShuffling } from "./epochShuffling.js";
6
+ import { computePayloadTimelinessCommitteesForEpoch } from "./seed.js";
7
+ import { getActiveValidatorIndices } from "./validator.js";
5
8
  export function isBuilderWithdrawalCredential(withdrawalCredentials) {
6
9
  return withdrawalCredentials[0] === BUILDER_WITHDRAWAL_PREFIX;
7
10
  }
@@ -125,4 +128,26 @@ export function isAttestationSameSlotRootCache(rootCache, data) {
125
128
  export function isParentBlockFull(state) {
126
129
  return byteArrayEquals(state.latestExecutionPayloadBid.blockHash, state.latestBlockHash);
127
130
  }
131
+ export function initializePtcWindow(state) {
132
+ const ptcWindow = Array.from({ length: SLOTS_PER_EPOCH }, () => new Uint32Array(PTC_SIZE));
133
+ const currentEpoch = state.epochCtx.epoch;
134
+ for (let epochOffset = 0; epochOffset <= MIN_SEED_LOOKAHEAD; epochOffset++) {
135
+ const epoch = currentEpoch + epochOffset;
136
+ const shuffling = state.epochCtx.getShufflingAtEpochOrNull(epoch) ??
137
+ computeEpochShuffling(state, getActiveValidatorIndices(state, epoch), epoch);
138
+ ptcWindow.push(...computePayloadTimelinessCommitteesForEpoch(state, epoch, shuffling.committees, state.epochCtx.effectiveBalanceIncrements));
139
+ }
140
+ return ptcWindow;
141
+ }
142
+ export function getPtcWindowEpochCacheData(state) {
143
+ const toUint32Arrays = (views) => views.map((v) => Uint32Array.from(v.getAll()));
144
+ const previousPtcWindow = state.ptcWindow.getReadonlyByRange(0, SLOTS_PER_EPOCH);
145
+ const currentPtcWindow = state.ptcWindow.getReadonlyByRange(SLOTS_PER_EPOCH, SLOTS_PER_EPOCH);
146
+ const nextPtcWindow = state.ptcWindow.getReadonlyByRange(2 * SLOTS_PER_EPOCH, SLOTS_PER_EPOCH);
147
+ return {
148
+ previousPayloadTimelinessCommittees: toUint32Arrays(previousPtcWindow),
149
+ payloadTimelinessCommittees: toUint32Arrays(currentPtcWindow),
150
+ nextPayloadTimelinessCommittees: toUint32Arrays(nextPtcWindow),
151
+ };
152
+ }
128
153
  //# sourceMappingURL=gloas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gloas.js","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gloas.js","sourceRoot":"","sources":["../../src/util/gloas.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.42.0",
14
+ "version": "1.43.0-dev.0bc48d3b54",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -65,16 +65,16 @@
65
65
  "@chainsafe/persistent-merkle-tree": "^1.2.1",
66
66
  "@chainsafe/persistent-ts": "^1.0.0",
67
67
  "@chainsafe/pubkey-index-map": "^3.0.0",
68
- "@chainsafe/ssz": "^1.2.2",
68
+ "@chainsafe/ssz": "^1.4.0",
69
69
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
70
- "@lodestar/config": "^1.42.0",
71
- "@lodestar/params": "^1.42.0",
72
- "@lodestar/types": "^1.42.0",
73
- "@lodestar/utils": "^1.42.0",
70
+ "@lodestar/config": "^1.43.0-dev.0bc48d3b54",
71
+ "@lodestar/params": "^1.43.0-dev.0bc48d3b54",
72
+ "@lodestar/types": "^1.43.0-dev.0bc48d3b54",
73
+ "@lodestar/utils": "^1.43.0-dev.0bc48d3b54",
74
74
  "@vekexasia/bigint-buffer2": "^1.1.1"
75
75
  },
76
76
  "devDependencies": {
77
- "@lodestar/api": "^1.42.0"
77
+ "@lodestar/api": "^1.43.0-dev.0bc48d3b54"
78
78
  },
79
79
  "keywords": [
80
80
  "ethereum",
@@ -82,5 +82,5 @@
82
82
  "beacon",
83
83
  "blockchain"
84
84
  ],
85
- "gitHead": "443e0a476dd6ff62f5977875741de0a38ba4e1ef"
85
+ "gitHead": "ddbb3f086f63df0538535b3c30b50ab81d666ecb"
86
86
  }
@@ -1,5 +1,7 @@
1
+ import {BeaconConfig} from "@lodestar/config";
1
2
  import {FAR_FUTURE_EPOCH, ForkSeq, UNSET_DEPOSIT_REQUESTS_START_INDEX} from "@lodestar/params";
2
- import {BLSPubkey, Bytes32, UintNum64, electra, ssz} from "@lodestar/types";
3
+ import {BLSPubkey, Bytes32, PubkeyHex, UintNum64, electra, ssz} from "@lodestar/types";
4
+ import {toPubkeyHex} from "@lodestar/utils";
3
5
  import {CachedBeaconStateElectra, CachedBeaconStateGloas} from "../types.js";
4
6
  import {findBuilderIndexByPubkey, isBuilderWithdrawalCredential} from "../util/gloas.js";
5
7
  import {computeEpochAtSlot, isValidatorKnown} from "../util/index.js";
@@ -74,16 +76,24 @@ function addBuilderToRegistry(
74
76
  }
75
77
  }
76
78
 
79
+ // TODO GLOAS: pendingValidatorPubkeys cache is currently naive and has room for improvement.
80
+ // Currently the cache lives in process_block, but we should put it in epochCache or elsewhere that has longer
81
+ // lifetime to avoid duplicated deposit signature computation
82
+ // See https://github.com/ChainSafe/lodestar/issues/9181
77
83
  export function processDepositRequest(
78
84
  fork: ForkSeq,
79
85
  state: CachedBeaconStateElectra | CachedBeaconStateGloas,
80
- depositRequest: electra.DepositRequest
86
+ depositRequest: electra.DepositRequest,
87
+ pendingValidatorPubkeysCache?: Set<PubkeyHex>
81
88
  ): void {
82
89
  const {pubkey, withdrawalCredentials, amount, signature} = depositRequest;
83
90
 
84
91
  // Check if this is a builder or validator deposit
85
92
  if (fork >= ForkSeq.gloas) {
86
93
  const stateGloas = state as CachedBeaconStateGloas;
94
+ const pendingValidatorPubkeys =
95
+ pendingValidatorPubkeysCache ?? getPendingValidatorPubkeys(state.config, stateGloas);
96
+ const pubkeyHex = toPubkeyHex(pubkey);
87
97
  const builderIndex = findBuilderIndexByPubkey(stateGloas, pubkey);
88
98
  const validatorIndex = state.epochCtx.getValidatorIndex(pubkey);
89
99
 
@@ -91,14 +101,24 @@ export function processDepositRequest(
91
101
  // already exists with this pubkey, apply the deposit to their balance
92
102
  const isBuilder = builderIndex !== null;
93
103
  const isValidator = isValidatorKnown(state, validatorIndex);
94
- const isBuilderPrefix = isBuilderWithdrawalCredential(withdrawalCredentials);
104
+ const isPendingValidator = pendingValidatorPubkeys.has(pubkeyHex);
95
105
 
96
- // Route to builder if it's an existing builder OR has builder prefix and is not a validator
97
- if (isBuilder || (isBuilderPrefix && !isValidator)) {
106
+ if (isBuilder || (isBuilderWithdrawalCredential(withdrawalCredentials) && !isValidator && !isPendingValidator)) {
98
107
  // Apply builder deposits immediately
99
108
  applyDepositForBuilder(stateGloas, pubkey, withdrawalCredentials, amount, signature, state.slot);
100
109
  return;
101
110
  }
111
+
112
+ // Keep the shared cache in sync: if this deposit has a valid signature, subsequent
113
+ // deposit requests for the same pubkey in this envelope must see it as a pending validator
114
+ if (
115
+ pendingValidatorPubkeysCache &&
116
+ !isValidator &&
117
+ !isPendingValidator &&
118
+ isValidDepositSignature(state.config, pubkey, withdrawalCredentials, amount, signature)
119
+ ) {
120
+ pendingValidatorPubkeys.add(pubkeyHex);
121
+ }
102
122
  }
103
123
 
104
124
  // Only set deposit_requests_start_index in Electra fork, not Gloas
@@ -116,3 +136,28 @@ export function processDepositRequest(
116
136
  });
117
137
  state.pendingDeposits.push(pendingDeposit);
118
138
  }
139
+
140
+ /**
141
+ * Build a set of pubkeys (hex-encoded) from pending deposits that have valid signatures.
142
+ * This is computed once and passed to each processDepositRequest call to avoid
143
+ * repeatedly iterating state.pendingDeposits.
144
+ *
145
+ * Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.3/specs/gloas/beacon-chain.md#new-is_pending_validator
146
+ */
147
+ export function getPendingValidatorPubkeys(config: BeaconConfig, state: CachedBeaconStateGloas): Set<PubkeyHex> {
148
+ const result = new Set<PubkeyHex>();
149
+ for (const pendingDeposit of state.pendingDeposits.getAllReadonly()) {
150
+ if (
151
+ isValidDepositSignature(
152
+ config,
153
+ pendingDeposit.pubkey,
154
+ pendingDeposit.withdrawalCredentials,
155
+ pendingDeposit.amount,
156
+ pendingDeposit.signature
157
+ )
158
+ ) {
159
+ result.add(toPubkeyHex(pendingDeposit.pubkey));
160
+ }
161
+ }
162
+ return result;
163
+ }
@@ -7,7 +7,7 @@ import {CachedBeaconStateGloas} from "../types.js";
7
7
  import {computeTimeAtSlot} from "../util/index.js";
8
8
  import {verifySignatureSet} from "../util/signatureSets.js";
9
9
  import {processConsolidationRequest} from "./processConsolidationRequest.js";
10
- import {processDepositRequest} from "./processDepositRequest.js";
10
+ import {getPendingValidatorPubkeys, processDepositRequest} from "./processDepositRequest.js";
11
11
  import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
12
12
 
13
13
  export type ProcessExecutionPayloadEnvelopeOpts = {
@@ -40,8 +40,13 @@ export function processExecutionPayloadEnvelope(
40
40
 
41
41
  const requests = envelope.executionRequests;
42
42
 
43
- for (const deposit of requests.deposits) {
44
- processDepositRequest(fork, postState, deposit);
43
+ if (requests.deposits.length > 0) {
44
+ // Build cache of pending validator pubkeys once, shared across all deposit requests
45
+ const pendingValidatorPubkeys = getPendingValidatorPubkeys(postState.config, postState);
46
+
47
+ for (const deposit of requests.deposits) {
48
+ processDepositRequest(fork, postState, deposit, pendingValidatorPubkeys);
49
+ }
45
50
  }
46
51
 
47
52
  for (const withdrawal of requests.withdrawals) {
@@ -32,10 +32,10 @@ import {
32
32
  calculateShufflingDecisionRoot,
33
33
  computeEpochShuffling,
34
34
  } from "../util/epochShuffling.js";
35
+ import {getPtcWindowEpochCacheData} from "../util/gloas.js";
35
36
  import {
36
37
  computeActivationExitEpoch,
37
38
  computeEpochAtSlot,
38
- computePayloadTimelinessCommitteesForEpoch,
39
39
  computeProposers,
40
40
  computeSyncPeriodAtEpoch,
41
41
  getActivationChurnLimit,
@@ -56,7 +56,7 @@ import {sumTargetUnslashedBalanceIncrements} from "../util/targetUnslashedBalanc
56
56
  import {EffectiveBalanceIncrements, getEffectiveBalanceIncrementsWithLen} from "./effectiveBalanceIncrements.js";
57
57
  import {EpochTransitionCache} from "./epochTransitionCache.js";
58
58
  import {PubkeyCache, createPubkeyCache, syncPubkeys} from "./pubkeyCache.js";
59
- import {CachedBeaconStateAllForks, CachedBeaconStateFulu} from "./stateCache.js";
59
+ import {CachedBeaconStateAllForks, CachedBeaconStateFulu, CachedBeaconStateGloas} from "./stateCache.js";
60
60
  import {
61
61
  SyncCommitteeCache,
62
62
  SyncCommitteeCacheEmpty,
@@ -226,11 +226,12 @@ export class EpochCache {
226
226
  /** TODO: Indexed SyncCommitteeCache */
227
227
  nextSyncCommitteeIndexed: SyncCommitteeCache;
228
228
 
229
- // TODO GLOAS: See if we need to cache PTC for next epoch
230
229
  // PTC for previous epoch, required for slot N block validating slot N-1 attestations
231
230
  previousPayloadTimelinessCommittees: Uint32Array[];
232
231
  // PTC for current epoch, computed eagerly at epoch transition
233
232
  payloadTimelinessCommittees: Uint32Array[];
233
+ // PTC for next epoch, precomputed from the ptc window for future duty serving
234
+ nextPayloadTimelinessCommittees: Uint32Array[];
234
235
 
235
236
  // TODO: Helper stats
236
237
  syncPeriod: SyncPeriod;
@@ -270,6 +271,7 @@ export class EpochCache {
270
271
  nextSyncCommitteeIndexed: SyncCommitteeCache;
271
272
  previousPayloadTimelinessCommittees: Uint32Array[];
272
273
  payloadTimelinessCommittees: Uint32Array[];
274
+ nextPayloadTimelinessCommittees: Uint32Array[];
273
275
  epoch: Epoch;
274
276
  syncPeriod: SyncPeriod;
275
277
  }) {
@@ -301,6 +303,7 @@ export class EpochCache {
301
303
  this.nextSyncCommitteeIndexed = data.nextSyncCommitteeIndexed;
302
304
  this.previousPayloadTimelinessCommittees = data.previousPayloadTimelinessCommittees;
303
305
  this.payloadTimelinessCommittees = data.payloadTimelinessCommittees;
306
+ this.nextPayloadTimelinessCommittees = data.nextPayloadTimelinessCommittees;
304
307
  this.epoch = data.epoch;
305
308
  this.syncPeriod = data.syncPeriod;
306
309
  }
@@ -451,25 +454,13 @@ export class EpochCache {
451
454
  nextSyncCommitteeIndexed = new SyncCommitteeCacheEmpty();
452
455
  }
453
456
 
454
- // Compute PTC for all slots in the prev/current epoch
457
+ // Copy previous/current epoch PTC slices from state.ptcWindow once, then serve hot-path lookups from epochCtx.
455
458
  let previousPayloadTimelinessCommittees: Uint32Array[] = [];
456
459
  let payloadTimelinessCommittees: Uint32Array[] = [];
460
+ let nextPayloadTimelinessCommittees: Uint32Array[] = [];
457
461
  if (currentEpoch >= config.GLOAS_FORK_EPOCH) {
458
- payloadTimelinessCommittees = computePayloadTimelinessCommitteesForEpoch(
459
- state,
460
- currentEpoch,
461
- currentShuffling.committees,
462
- effectiveBalanceIncrements
463
- );
464
-
465
- if (!isGenesis && previousEpoch >= config.GLOAS_FORK_EPOCH) {
466
- previousPayloadTimelinessCommittees = computePayloadTimelinessCommitteesForEpoch(
467
- state,
468
- previousEpoch,
469
- previousShuffling.committees,
470
- effectiveBalanceIncrements
471
- );
472
- }
462
+ ({previousPayloadTimelinessCommittees, payloadTimelinessCommittees, nextPayloadTimelinessCommittees} =
463
+ getPtcWindowEpochCacheData(state as CachedBeaconStateGloas));
473
464
  }
474
465
 
475
466
  // Precompute churnLimit for efficient initiateValidatorExit() during block proposing MUST be recompute everytime the
@@ -546,6 +537,7 @@ export class EpochCache {
546
537
  nextSyncCommitteeIndexed,
547
538
  previousPayloadTimelinessCommittees,
548
539
  payloadTimelinessCommittees,
540
+ nextPayloadTimelinessCommittees,
549
541
  epoch: currentEpoch,
550
542
  syncPeriod: computeSyncPeriodAtEpoch(currentEpoch),
551
543
  });
@@ -592,6 +584,7 @@ export class EpochCache {
592
584
  nextSyncCommitteeIndexed: this.nextSyncCommitteeIndexed,
593
585
  previousPayloadTimelinessCommittees: this.previousPayloadTimelinessCommittees,
594
586
  payloadTimelinessCommittees: this.payloadTimelinessCommittees,
587
+ nextPayloadTimelinessCommittees: this.nextPayloadTimelinessCommittees,
595
588
  epoch: this.epoch,
596
589
  syncPeriod: this.syncPeriod,
597
590
  });
@@ -695,21 +688,26 @@ export class EpochCache {
695
688
  /**
696
689
  * At fork boundary, this runs post-fork logic and it happens after `upgradeState*` is called.
697
690
  */
698
- finalProcessEpoch(state: CachedBeaconStateAllForks): void {
691
+ finalProcessEpoch(state: CachedBeaconStateAllForks, epochTransitionCache: EpochTransitionCache): void {
699
692
  // this.epoch was updated at the end of afterProcessEpoch()
700
693
  const upcomingEpoch = this.epoch;
701
694
  const epochAfterUpcoming = upcomingEpoch + 1;
702
695
 
703
696
  this.proposersPrevEpoch = this.proposers;
704
697
  if (upcomingEpoch >= this.config.GLOAS_FORK_EPOCH) {
705
- // Shift and compute current epoch PTC eagerly for all slots
706
- this.previousPayloadTimelinessCommittees = this.payloadTimelinessCommittees;
707
- this.payloadTimelinessCommittees = computePayloadTimelinessCommitteesForEpoch(
708
- state,
709
- upcomingEpoch,
710
- this.currentShuffling.committees,
711
- this.effectiveBalanceIncrements
712
- );
698
+ if (epochTransitionCache.nextEpochPayloadTimelinessCommittees) {
699
+ // shift arrays from transition cache
700
+ this.previousPayloadTimelinessCommittees = this.payloadTimelinessCommittees;
701
+ this.payloadTimelinessCommittees = this.nextPayloadTimelinessCommittees;
702
+ this.nextPayloadTimelinessCommittees = epochTransitionCache.nextEpochPayloadTimelinessCommittees;
703
+ } else {
704
+ // Fork boundary: processPtcWindow didn't run, read from freshly initialized state.ptcWindow
705
+ ({
706
+ previousPayloadTimelinessCommittees: this.previousPayloadTimelinessCommittees,
707
+ payloadTimelinessCommittees: this.payloadTimelinessCommittees,
708
+ nextPayloadTimelinessCommittees: this.nextPayloadTimelinessCommittees,
709
+ } = getPtcWindowEpochCacheData(state as CachedBeaconStateGloas));
710
+ }
713
711
  }
714
712
  if (upcomingEpoch >= this.config.FULU_FORK_EPOCH) {
715
713
  // Populate proposer cache with lookahead from state
@@ -1034,12 +1032,16 @@ export class EpochCache {
1034
1032
  throw new Error("Payload Timeliness Committee is not available before gloas fork");
1035
1033
  }
1036
1034
 
1035
+ if (epoch === this.epoch - 1) {
1036
+ return this.previousPayloadTimelinessCommittees[slot % SLOTS_PER_EPOCH];
1037
+ }
1038
+
1037
1039
  if (epoch === this.epoch) {
1038
1040
  return this.payloadTimelinessCommittees[slot % SLOTS_PER_EPOCH];
1039
1041
  }
1040
1042
 
1041
- if (epoch === this.epoch - 1 && this.previousPayloadTimelinessCommittees.length > 0) {
1042
- return this.previousPayloadTimelinessCommittees[slot % SLOTS_PER_EPOCH];
1043
+ if (epoch === this.epoch + 1) {
1044
+ return this.nextPayloadTimelinessCommittees[slot % SLOTS_PER_EPOCH];
1043
1045
  }
1044
1046
 
1045
1047
  throw new Error(`Payload Timeliness Committee is not available for slot=${slot}`);
@@ -158,6 +158,12 @@ export interface EpochTransitionCache {
158
158
  */
159
159
  nextShuffling: EpochShuffling | null;
160
160
 
161
+ /**
162
+ * Pre-computed PTC for epoch N + MIN_SEED_LOOKAHEAD + 1, populated by processPtcWindow (Gloas+).
163
+ * Used by finalProcessEpoch to shift PTC arrays in epoch cache without reading from state.
164
+ */
165
+ nextEpochPayloadTimelinessCommittees: Uint32Array[] | null;
166
+
161
167
  /**
162
168
  * Altair specific, this is total active balances for the next epoch.
163
169
  * This is only used in `afterProcessEpoch` to compute base reward and sync participant reward.
@@ -502,6 +508,7 @@ export function beforeProcessEpoch(
502
508
  indicesToEject,
503
509
  nextShufflingActiveIndices,
504
510
  nextShuffling: null,
511
+ nextEpochPayloadTimelinessCommittees: null,
505
512
  // to be updated in processEffectiveBalanceUpdates
506
513
  nextEpochTotalActiveBalanceByIncrement: 0,
507
514
  isActivePrevEpoch,
@@ -28,6 +28,7 @@ import {processParticipationRecordUpdates} from "./processParticipationRecordUpd
28
28
  import {processPendingConsolidations} from "./processPendingConsolidations.js";
29
29
  import {processPendingDeposits} from "./processPendingDeposits.js";
30
30
  import {processProposerLookahead} from "./processProposerLookahead.js";
31
+ import {processPtcWindow} from "./processPtcWindow.js";
31
32
  import {processRandaoMixesReset} from "./processRandaoMixesReset.js";
32
33
  import {processRegistryUpdates} from "./processRegistryUpdates.js";
33
34
  import {processRewardsAndPenalties} from "./processRewardsAndPenalties.js";
@@ -55,6 +56,7 @@ export {
55
56
  processPendingDeposits,
56
57
  processPendingConsolidations,
57
58
  processProposerLookahead,
59
+ processPtcWindow,
58
60
  processBuilderPendingPayments,
59
61
  };
60
62
 
@@ -81,6 +83,7 @@ export enum EpochTransitionStep {
81
83
  processPendingDeposits = "processPendingDeposits",
82
84
  processPendingConsolidations = "processPendingConsolidations",
83
85
  processProposerLookahead = "processProposerLookahead",
86
+ processPtcWindow = "processPtcWindow",
84
87
  processBuilderPendingPayments = "processBuilderPendingPayments",
85
88
  }
86
89
 
@@ -211,4 +214,10 @@ export function processEpoch(
211
214
  processProposerLookahead(fork, state as CachedBeaconStateFulu, cache);
212
215
  timer?.();
213
216
  }
217
+
218
+ if (fork >= ForkSeq.gloas) {
219
+ const timer = metrics?.epochTransitionStepTime.startTimer({step: EpochTransitionStep.processPtcWindow});
220
+ processPtcWindow(state as CachedBeaconStateGloas, cache);
221
+ timer?.();
222
+ }
214
223
  }
@@ -0,0 +1,38 @@
1
+ import {MIN_SEED_LOOKAHEAD} from "@lodestar/params";
2
+ import {ssz} from "@lodestar/types";
3
+ import {CachedBeaconStateGloas, EpochTransitionCache} from "../types.js";
4
+ import {computeEpochShuffling} from "../util/epochShuffling.js";
5
+ import {computePayloadTimelinessCommitteesForEpoch} from "../util/seed.js";
6
+
7
+ /**
8
+ * Update the `ptc_window` field in the beacon state by shifting out the oldest epoch's
9
+ * PTC entries and appending newly computed entries for the next lookahead epoch.
10
+ * Stashes the computed PTCs in the transition cache for finalProcessEpoch to shift
11
+ * into the epoch cache without reading from state.
12
+ *
13
+ * Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.4/specs/gloas/beacon-chain.md#new-process_ptc_window
14
+ */
15
+ export function processPtcWindow(state: CachedBeaconStateGloas, cache: EpochTransitionCache): void {
16
+ const nextEpoch = state.epochCtx.epoch + MIN_SEED_LOOKAHEAD + 1;
17
+ const nextEpochShuffling =
18
+ cache.nextShuffling ?? computeEpochShuffling(state, cache.nextShufflingActiveIndices, nextEpoch);
19
+ cache.nextShuffling = nextEpochShuffling;
20
+
21
+ const newNextPayloadTimelinessCommittees = computePayloadTimelinessCommitteesForEpoch(
22
+ state,
23
+ nextEpoch,
24
+ nextEpochShuffling.committees,
25
+ state.epochCtx.effectiveBalanceIncrements
26
+ );
27
+
28
+ // Stash for finalProcessEpoch to shift into epoch cache
29
+ cache.nextEpochPayloadTimelinessCommittees = newNextPayloadTimelinessCommittees;
30
+
31
+ // Write shifted window to state: current(N) + next(N+1) + newlyComputed(N+2)
32
+ // From the perspective of upcoming epoch N+1, this is previous + current + next
33
+ state.ptcWindow = ssz.gloas.PtcWindow.toViewDU([
34
+ ...state.epochCtx.payloadTimelinessCommittees,
35
+ ...state.epochCtx.nextPayloadTimelinessCommittees,
36
+ ...newNextPayloadTimelinessCommittees,
37
+ ]);
38
+ }
package/src/index.ts CHANGED
@@ -35,14 +35,32 @@ export {
35
35
  isStateValidatorsNodesPopulated,
36
36
  loadCachedBeaconState,
37
37
  } from "./cache/stateCache.js";
38
- export {type SyncCommitteeCache} from "./cache/syncCommitteeCache.js";
38
+ export {type SyncCommitteeCache, SyncCommitteeCacheEmpty} from "./cache/syncCommitteeCache.js";
39
39
  export * from "./constants/index.js";
40
40
  export type {EpochTransitionStep} from "./epoch/index.js";
41
41
  export {type BeaconStateTransitionMetrics, getMetrics} from "./metrics.js";
42
42
  export * from "./rewards/index.js";
43
43
  export * from "./signatureSets/index.js";
44
44
  export * from "./stateTransition.js";
45
- export * from "./stateView/index.js";
45
+ export {BeaconStateView} from "./stateView/beaconStateView.js";
46
+ export {
47
+ type IBeaconStateView,
48
+ type IBeaconStateViewAltair,
49
+ type IBeaconStateViewBellatrix,
50
+ type IBeaconStateViewCapella,
51
+ type IBeaconStateViewDeneb,
52
+ type IBeaconStateViewElectra,
53
+ type IBeaconStateViewFulu,
54
+ type IBeaconStateViewGloas,
55
+ isStatePostAltair,
56
+ isStatePostBellatrix,
57
+ isStatePostCapella,
58
+ isStatePostDeneb,
59
+ isStatePostElectra,
60
+ isStatePostFulu,
61
+ isStatePostGloas,
62
+ } from "./stateView/interface.js";
63
+ export {createBeaconStateView, createBeaconStateViewForHistoricalRegen} from "./stateView/stateViewFactory.js";
46
64
  export type {
47
65
  BeaconStateAllForks,
48
66
  BeaconStateAltair,
@@ -3,7 +3,7 @@ import {BeaconConfig} from "@lodestar/config";
3
3
  import {BUILDER_INDEX_SELF_BUILD, DOMAIN_BEACON_BUILDER} from "@lodestar/params";
4
4
  import {ValidatorIndex, gloas, ssz} from "@lodestar/types";
5
5
  import {PubkeyCache} from "../cache/pubkeyCache.js";
6
- import {IBeaconStateView} from "../stateView/interface.js";
6
+ import {IBeaconStateView, isStatePostGloas} from "../stateView/interface.js";
7
7
  import {computeSigningRoot} from "../util/index.js";
8
8
  import {type SingleSignatureSet, createSingleSignatureSetFromComponents} from "../util/signatureSets.js";
9
9
 
@@ -23,6 +23,10 @@ export function getExecutionPayloadEnvelopeSignatureSet(
23
23
  signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
24
24
  proposerIndex: ValidatorIndex
25
25
  ): SingleSignatureSet {
26
+ if (!isStatePostGloas(state)) {
27
+ throw new Error(`Expected gloas+ state for execution payload envelope signature, got fork=${state.forkName}`);
28
+ }
29
+
26
30
  const envelope = signedEnvelope.message;
27
31
  const pubkey =
28
32
  envelope.builderIndex === BUILDER_INDEX_SELF_BUILD