@lodestar/state-transition 1.45.0 → 1.46.0-dev.4191d8e353

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 (95) hide show
  1. package/lib/block/processAttestationsAltair.d.ts +4 -1
  2. package/lib/block/processAttestationsAltair.d.ts.map +1 -1
  3. package/lib/block/processAttestationsAltair.js +7 -5
  4. package/lib/block/processAttestationsAltair.js.map +1 -1
  5. package/lib/block/processBuilderDepositRequest.d.ts.map +1 -1
  6. package/lib/block/processBuilderDepositRequest.js +13 -7
  7. package/lib/block/processBuilderDepositRequest.js.map +1 -1
  8. package/lib/block/processOperations.d.ts.map +1 -1
  9. package/lib/block/processOperations.js +17 -1
  10. package/lib/block/processOperations.js.map +1 -1
  11. package/lib/block/processParentExecutionPayload.d.ts.map +1 -1
  12. package/lib/block/processParentExecutionPayload.js +15 -1
  13. package/lib/block/processParentExecutionPayload.js.map +1 -1
  14. package/lib/block/processWithdrawals.js +1 -1
  15. package/lib/block/processWithdrawals.js.map +1 -1
  16. package/lib/cache/epochCache.d.ts.map +1 -1
  17. package/lib/cache/epochCache.js +18 -19
  18. package/lib/cache/epochCache.js.map +1 -1
  19. package/lib/cache/stateCache.d.ts.map +1 -1
  20. package/lib/cache/stateCache.js +2 -4
  21. package/lib/cache/stateCache.js.map +1 -1
  22. package/lib/epoch/processParticipationFlagUpdates.d.ts +2 -2
  23. package/lib/epoch/processParticipationFlagUpdates.d.ts.map +1 -1
  24. package/lib/epoch/processParticipationFlagUpdates.js +13 -0
  25. package/lib/epoch/processParticipationFlagUpdates.js.map +1 -1
  26. package/lib/epoch/processRewardsAndPenalties.d.ts.map +1 -1
  27. package/lib/epoch/processRewardsAndPenalties.js +1 -2
  28. package/lib/epoch/processRewardsAndPenalties.js.map +1 -1
  29. package/lib/lightClient/proofs.d.ts.map +1 -1
  30. package/lib/lightClient/proofs.js +28 -2
  31. package/lib/lightClient/proofs.js.map +1 -1
  32. package/lib/lightClient/spec/index.d.ts.map +1 -1
  33. package/lib/lightClient/spec/index.js +7 -4
  34. package/lib/lightClient/spec/index.js.map +1 -1
  35. package/lib/lightClient/spec/processLightClientUpdate.d.ts.map +1 -1
  36. package/lib/lightClient/spec/processLightClientUpdate.js +8 -2
  37. package/lib/lightClient/spec/processLightClientUpdate.js.map +1 -1
  38. package/lib/lightClient/spec/utils.d.ts +7 -2
  39. package/lib/lightClient/spec/utils.d.ts.map +1 -1
  40. package/lib/lightClient/spec/utils.js +130 -19
  41. package/lib/lightClient/spec/utils.js.map +1 -1
  42. package/lib/lightClient/spec/validateLightClientBootstrap.d.ts.map +1 -1
  43. package/lib/lightClient/spec/validateLightClientBootstrap.js +2 -7
  44. package/lib/lightClient/spec/validateLightClientBootstrap.js.map +1 -1
  45. package/lib/lightClient/spec/validateLightClientUpdate.d.ts.map +1 -1
  46. package/lib/lightClient/spec/validateLightClientUpdate.js +6 -5
  47. package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
  48. package/lib/lightClient/types.d.ts +3 -1
  49. package/lib/lightClient/types.d.ts.map +1 -1
  50. package/lib/metrics.js +2 -4
  51. package/lib/metrics.js.map +1 -1
  52. package/lib/slot/upgradeStateToAltair.js +1 -1
  53. package/lib/slot/upgradeStateToAltair.js.map +1 -1
  54. package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
  55. package/lib/slot/upgradeStateToGloas.js +48 -9
  56. package/lib/slot/upgradeStateToGloas.js.map +1 -1
  57. package/lib/util/execution.d.ts.map +1 -1
  58. package/lib/util/execution.js +7 -2
  59. package/lib/util/execution.js.map +1 -1
  60. package/lib/util/gloas.d.ts +3 -1
  61. package/lib/util/gloas.d.ts.map +1 -1
  62. package/lib/util/gloas.js +8 -11
  63. package/lib/util/gloas.js.map +1 -1
  64. package/lib/util/index.d.ts +1 -0
  65. package/lib/util/index.d.ts.map +1 -1
  66. package/lib/util/index.js +1 -0
  67. package/lib/util/index.js.map +1 -1
  68. package/lib/util/ssz.d.ts +9 -0
  69. package/lib/util/ssz.d.ts.map +1 -0
  70. package/lib/util/ssz.js +39 -0
  71. package/lib/util/ssz.js.map +1 -0
  72. package/package.json +14 -14
  73. package/src/block/processAttestationsAltair.ts +9 -6
  74. package/src/block/processBuilderDepositRequest.ts +21 -8
  75. package/src/block/processOperations.ts +28 -1
  76. package/src/block/processParentExecutionPayload.ts +26 -1
  77. package/src/block/processWithdrawals.ts +1 -1
  78. package/src/cache/epochCache.ts +19 -22
  79. package/src/cache/stateCache.ts +2 -4
  80. package/src/epoch/processParticipationFlagUpdates.ts +20 -2
  81. package/src/epoch/processRewardsAndPenalties.ts +1 -2
  82. package/src/lightClient/proofs.ts +36 -1
  83. package/src/lightClient/spec/index.ts +8 -4
  84. package/src/lightClient/spec/processLightClientUpdate.ts +13 -1
  85. package/src/lightClient/spec/utils.ts +200 -30
  86. package/src/lightClient/spec/validateLightClientBootstrap.ts +3 -10
  87. package/src/lightClient/spec/validateLightClientUpdate.ts +11 -21
  88. package/src/lightClient/types.ts +3 -1
  89. package/src/metrics.ts +2 -4
  90. package/src/slot/upgradeStateToAltair.ts +1 -1
  91. package/src/slot/upgradeStateToGloas.ts +84 -9
  92. package/src/util/execution.ts +9 -4
  93. package/src/util/gloas.ts +9 -14
  94. package/src/util/index.ts +1 -0
  95. package/src/util/ssz.ts +42 -0
@@ -1 +1 @@
1
- {"version":3,"file":"stateCache.js","sourceRoot":"","sources":["../../src/cache/stateCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stateCache.js","sourceRoot":"","sources":["../../src/cache/stateCache.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { CachedBeaconStateAltair } from "../types.js";
1
+ import type { BeaconStateAltair, BeaconStateGloas } from "../types.js";
2
2
  /**
3
3
  * Updates `state.previousEpochParticipation` with precalculated epoch participation. Creates a new empty tree for
4
4
  * `state.currentEpochParticipation`.
@@ -6,5 +6,5 @@ import { CachedBeaconStateAltair } from "../types.js";
6
6
  * PERF: Cost = 'proportional' $VALIDATOR_COUNT. Since it updates all of them at once, it will always recreate both
7
7
  * trees completely.
8
8
  */
9
- export declare function processParticipationFlagUpdates(state: CachedBeaconStateAltair): void;
9
+ export declare function processParticipationFlagUpdates(state: BeaconStateAltair | BeaconStateGloas): void;
10
10
  //# sourceMappingURL=processParticipationFlagUpdates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"processParticipationFlagUpdates.d.ts","sourceRoot":"","sources":["../../src/epoch/processParticipationFlagUpdates.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI,CAepF"}
1
+ {"version":3,"file":"processParticipationFlagUpdates.d.ts","sourceRoot":"","sources":["../../src/epoch/processParticipationFlagUpdates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAIrE;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,CAoBjG"}
@@ -1,5 +1,7 @@
1
1
  import { zeroNode } from "@chainsafe/persistent-merkle-tree";
2
2
  import { ssz } from "@lodestar/types";
3
+ import { isGloasStateType } from "../util/execution.js";
4
+ import { zeroProgressiveListBasicRootNode } from "../util/ssz.js";
3
5
  /**
4
6
  * Updates `state.previousEpochParticipation` with precalculated epoch participation. Creates a new empty tree for
5
7
  * `state.currentEpochParticipation`.
@@ -8,6 +10,10 @@ import { ssz } from "@lodestar/types";
8
10
  * trees completely.
9
11
  */
10
12
  export function processParticipationFlagUpdates(state) {
13
+ if (isGloasStateType(state)) {
14
+ processParticipationFlagUpdatesGloas(state);
15
+ return;
16
+ }
11
17
  // Set view and tree from currentEpochParticipation to previousEpochParticipation
12
18
  state.previousEpochParticipation = state.currentEpochParticipation;
13
19
  // We need to replace the node of currentEpochParticipation with a node that represents and empty list of some length.
@@ -17,4 +23,11 @@ export function processParticipationFlagUpdates(state) {
17
23
  const currentEpochParticipationNode = ssz.altair.EpochParticipation.tree_setChunksNode(state.currentEpochParticipation.node, zeroNode(ssz.altair.EpochParticipation.chunkDepth), state.currentEpochParticipation.length);
18
24
  state.currentEpochParticipation = ssz.altair.EpochParticipation.getViewDU(currentEpochParticipationNode);
19
25
  }
26
+ function processParticipationFlagUpdatesGloas(state) {
27
+ state.previousEpochParticipation = state.currentEpochParticipation;
28
+ // Same trick as the altair path above, adapted to the progressive-list tree shape: all chunks
29
+ // are zero so the chunks tree is a chain of pre-computed zeroNodes, built in O(log n) instead
30
+ // of re-merkleizing a validator-count-sized array every epoch.
31
+ state.currentEpochParticipation = ssz.gloas.EpochParticipation.getViewDU(zeroProgressiveListBasicRootNode(ssz.gloas.EpochParticipation.itemsPerChunk, state.currentEpochParticipation.length));
32
+ }
20
33
  //# sourceMappingURL=processParticipationFlagUpdates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processParticipationFlagUpdates.js","sourceRoot":"","sources":["../../src/epoch/processParticipationFlagUpdates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAGpC;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,KAA8B,EAAQ;IACpF,iFAAiF;IACjF,KAAK,CAAC,0BAA0B,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAEnE,sHAAsH;IACtH,qEAAqE;IACrE,iHAAiH;IACjH,oEAAoE;IACpE,MAAM,6BAA6B,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,CACpF,KAAK,CAAC,yBAAyB,CAAC,IAAI,EACpC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAClD,KAAK,CAAC,yBAAyB,CAAC,MAAM,CACvC,CAAC;IAEF,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;AAAA,CAC1G"}
1
+ {"version":3,"file":"processParticipationFlagUpdates.js","sourceRoot":"","sources":["../../src/epoch/processParticipationFlagUpdates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEpC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,gCAAgC,EAAC,MAAM,gBAAgB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,KAA2C,EAAQ;IACjG,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,oCAAoC,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,0BAA0B,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAEnE,sHAAsH;IACtH,qEAAqE;IACrE,iHAAiH;IACjH,oEAAoE;IACpE,MAAM,6BAA6B,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,CACpF,KAAK,CAAC,yBAAyB,CAAC,IAAI,EACpC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAClD,KAAK,CAAC,yBAAyB,CAAC,MAAM,CACvC,CAAC;IAEF,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;AAAA,CAC1G;AAED,SAAS,oCAAoC,CAAC,KAAuB,EAAQ;IAC3E,KAAK,CAAC,0BAA0B,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAEnE,8FAA8F;IAC9F,8FAA8F;IAC9F,+DAA+D;IAC/D,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CACtE,gCAAgC,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,CACrH,CAAC;AAAA,CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"processRewardsAndPenalties.d.ts","sourceRoot":"","sources":["../../src/epoch/processRewardsAndPenalties.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EAGzB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAQrB;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,yBAAyB,EAChC,KAAK,EAAE,oBAAoB,EAC3B,iBAAiB,GAAE,MAAM,EAAO,GAC/B,IAAI,CAsBN;AAGD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,yBAAyB,EAChC,oBAAoB,EAAE,oBAAoB,GACzC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAKtB"}
1
+ {"version":3,"file":"processRewardsAndPenalties.d.ts","sourceRoot":"","sources":["../../src/epoch/processRewardsAndPenalties.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EAGzB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAQrB;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,yBAAyB,EAChC,KAAK,EAAE,oBAAoB,EAC3B,iBAAiB,GAAE,MAAM,EAAO,GAC/B,IAAI,CAsBN;AAGD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,yBAAyB,EAChC,oBAAoB,EAAE,oBAAoB,GACzC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAKtB"}
@@ -1,5 +1,4 @@
1
1
  import { ForkSeq, GENESIS_EPOCH } from "@lodestar/params";
2
- import { ssz } from "@lodestar/types";
3
2
  import { getAttestationDeltas } from "./getAttestationDeltas.js";
4
3
  import { getRewardsAndPenaltiesAltair } from "./getRewardsAndPenalties.js";
5
4
  /**
@@ -25,7 +24,7 @@ export function processRewardsAndPenalties(state, cache, slashingPenalties = [])
25
24
  }
26
25
  // important: do not change state one balance at a time. Set them all at once, constructing the tree in one go
27
26
  // cache the balances array, too
28
- state.balances = ssz.phase0.Balances.toViewDU(balances);
27
+ state.balances = state.type.fields.balances.toViewDU(balances);
29
28
  // For processEffectiveBalanceUpdates() to prevent having to re-compute the balances array.
30
29
  // For validator metrics
31
30
  cache.balances = balances;
@@ -1 +1 @@
1
- {"version":3,"file":"processRewardsAndPenalties.js","sourceRoot":"","sources":["../../src/epoch/processRewardsAndPenalties.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAOpC,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAC,4BAA4B,EAAC,MAAM,6BAA6B,CAAC;AAEzE;;GAEG;AACH,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAU,CAAC;AACrC;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAgC,EAChC,KAA2B,EAC3B,iBAAiB,GAAa,EAAE,EAC1B;IACN,+GAA+G;IAC/G,IAAI,KAAK,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,8GAA8G;IAC9G,gCAAgC;IAChC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAExD,2FAA2F;IAC3F,wBAAwB;IACxB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAAA,CAC3B;AAED,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CACpC,KAAgC,EAChC,oBAA0C,EACpB;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,KAAK,OAAO,CAAC,MAAM;QAC5B,CAAC,CAAC,oBAAoB,CAAC,KAAgC,EAAE,oBAAoB,CAAC;QAC9E,CAAC,CAAC,4BAA4B,CAAC,KAAgC,EAAE,oBAAoB,CAAC,CAAC;AAAA,CAC1F"}
1
+ {"version":3,"file":"processRewardsAndPenalties.js","sourceRoot":"","sources":["../../src/epoch/processRewardsAndPenalties.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAOxD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAC,4BAA4B,EAAC,MAAM,6BAA6B,CAAC;AAEzE;;GAEG;AACH,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAU,CAAC;AACrC;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAgC,EAChC,KAA2B,EAC3B,iBAAiB,GAAa,EAAE,EAC1B;IACN,+GAA+G;IAC/G,IAAI,KAAK,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,8GAA8G;IAC9G,gCAAgC;IAChC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE/D,2FAA2F;IAC3F,wBAAwB;IACxB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAAA,CAC3B;AAED,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CACpC,KAAgC,EAChC,oBAA0C,EACpB;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,KAAK,OAAO,CAAC,MAAM;QAC5B,CAAC,CAAC,oBAAoB,CAAC,KAAgC,EAAE,oBAAoB,CAAC;QAC9E,CAAC,CAAC,4BAA4B,CAAC,KAAgC,EAAE,oBAAoB,CAAC,CAAC;AAAA,CAC1F"}
@@ -1 +1 @@
1
- {"version":3,"file":"proofs.d.ts","sourceRoot":"","sources":["../../src/lightClient/proofs.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,QAAQ,EACR,iBAAiB,EAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAmB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAC,mBAAmB,EAAE,yBAAyB,EAAC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAC,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAEhD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA8CzG;AAED,wBAAgB,0BAA0B,CAAC,qBAAqB,EAAE,oBAAoB,GAAG,UAAU,EAAE,CAGpG;AAED,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,oBAAoB,GAAG,UAAU,EAAE,CAGvG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,yBAAyB,GAAG,UAAU,EAAE,CAGpF;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,GACvC,UAAU,EAAE,CAGd"}
1
+ {"version":3,"file":"proofs.d.ts","sourceRoot":"","sources":["../../src/lightClient/proofs.ts"],"names":[],"mappings":"AACA,OAAO,EAML,QAAQ,EACR,iBAAiB,EAIlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAmB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAC,mBAAmB,EAAE,yBAAyB,EAAC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAC,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAEhD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAgEzG;AAED,wBAAgB,0BAA0B,CAAC,qBAAqB,EAAE,oBAAoB,GAAG,UAAU,EAAE,CAOpG;AAED,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,oBAAoB,GAAG,UAAU,EAAE,CAOvG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,yBAAyB,GAAG,UAAU,EAAE,CAQpF;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,GACvC,UAAU,EAAE,CAGd"}
@@ -1,11 +1,26 @@
1
1
  import { Tree } from "@chainsafe/persistent-merkle-tree";
2
- import { BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX, FINALIZED_ROOT_GINDEX, FINALIZED_ROOT_GINDEX_ELECTRA, isForkPostElectra, } from "@lodestar/params";
2
+ import { BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX, CURRENT_SYNC_COMMITTEE_GINDEX_GLOAS, FINALIZED_ROOT_GINDEX, FINALIZED_ROOT_GINDEX_ELECTRA, FINALIZED_ROOT_GINDEX_GLOAS, NEXT_SYNC_COMMITTEE_GINDEX_GLOAS, isForkPostElectra, isForkPostGloas, } from "@lodestar/params";
3
3
  import { ssz } from "@lodestar/types";
4
4
  export function getSyncCommitteesWitness(fork, state) {
5
5
  const n1 = state.node;
6
6
  let witness;
7
7
  let currentSyncCommitteeRoot;
8
8
  let nextSyncCommitteeRoot;
9
+ if (isForkPostGloas(fork)) {
10
+ const tree = new Tree(state.node);
11
+ const currentSyncCommitteeGindex = BigInt(CURRENT_SYNC_COMMITTEE_GINDEX_GLOAS);
12
+ const nextSyncCommitteeGindex = BigInt(NEXT_SYNC_COMMITTEE_GINDEX_GLOAS);
13
+ currentSyncCommitteeRoot = tree.getRoot(currentSyncCommitteeGindex);
14
+ nextSyncCommitteeRoot = tree.getRoot(nextSyncCommitteeGindex);
15
+ witness = [];
16
+ return {
17
+ witness,
18
+ currentSyncCommitteeRoot,
19
+ nextSyncCommitteeRoot,
20
+ currentSyncCommitteeBranch: tree.getSingleProof(currentSyncCommitteeGindex),
21
+ nextSyncCommitteeBranch: tree.getSingleProof(nextSyncCommitteeGindex),
22
+ };
23
+ }
9
24
  if (isForkPostElectra(fork)) {
10
25
  const n2 = n1.left;
11
26
  const n5 = n2.right;
@@ -45,15 +60,26 @@ export function getSyncCommitteesWitness(fork, state) {
45
60
  };
46
61
  }
47
62
  export function getNextSyncCommitteeBranch(syncCommitteesWitness) {
63
+ if (syncCommitteesWitness.nextSyncCommitteeBranch) {
64
+ return syncCommitteesWitness.nextSyncCommitteeBranch;
65
+ }
48
66
  // Witness branch is sorted by descending gindex
49
67
  return [syncCommitteesWitness.currentSyncCommitteeRoot, ...syncCommitteesWitness.witness];
50
68
  }
51
69
  export function getCurrentSyncCommitteeBranch(syncCommitteesWitness) {
70
+ if (syncCommitteesWitness.currentSyncCommitteeBranch) {
71
+ return syncCommitteesWitness.currentSyncCommitteeBranch;
72
+ }
52
73
  // Witness branch is sorted by descending gindex
53
74
  return [syncCommitteesWitness.nextSyncCommitteeRoot, ...syncCommitteesWitness.witness];
54
75
  }
55
76
  export function getFinalizedRootProof(state) {
56
- const finalizedRootGindex = state.epochCtx.isPostElectra() ? FINALIZED_ROOT_GINDEX_ELECTRA : FINALIZED_ROOT_GINDEX;
77
+ const fork = state.config.getForkName(state.slot);
78
+ const finalizedRootGindex = isForkPostGloas(fork)
79
+ ? FINALIZED_ROOT_GINDEX_GLOAS
80
+ : state.epochCtx.isPostElectra()
81
+ ? FINALIZED_ROOT_GINDEX_ELECTRA
82
+ : FINALIZED_ROOT_GINDEX;
57
83
  return new Tree(state.node).getSingleProof(BigInt(finalizedRootGindex));
58
84
  }
59
85
  export function getBlockBodyExecutionHeaderProof(fork, body) {
@@ -1 +1 @@
1
- {"version":3,"file":"proofs.js","sourceRoot":"","sources":["../../src/lightClient/proofs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proofs.js","sourceRoot":"","sources":["../../src/lightClient/proofs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lightClient/spec/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,IAAI,EACL,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAC,KAAK,iBAAiB,EAAoB,KAAK,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAGjG,YAAY,EAAC,wBAAwB,EAAC,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAC,cAAc,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,gCAAgC,EAChC,wBAAwB,EACxB,kCAAkC,EAClC,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAC,4BAA4B,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AAEzE,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAE9B,YACE,MAAM,EAAE,YAAY,EACH,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,EACjE,SAAS,EAAE,oBAAoB,EAIhC;IAED,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE3D;IAED,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,yBAAyB,GAAG,IAAI,CAUnF;IAED,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,2BAA2B,GAAG,IAAI,CAUzF;IAED,WAAW,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAUnC;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lightClient/spec/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,IAAI,EACL,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAC,KAAK,iBAAiB,EAAoB,KAAK,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAGjG,YAAY,EAAC,wBAAwB,EAAC,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAC,cAAc,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,gCAAgC,EAChC,wBAAwB,EACxB,kCAAkC,EAClC,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAC,4BAA4B,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AAEzE,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAE9B,YACE,MAAM,EAAE,YAAY,EACH,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,EACjE,SAAS,EAAE,oBAAoB,EAIhC;IAED,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE3D;IAED,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,yBAAyB,GAAG,IAAI,CAUnF;IAED,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,2BAA2B,GAAG,IAAI,CAczF;IAED,WAAW,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAUnC;CACF"}
@@ -2,7 +2,7 @@ import { UPDATE_TIMEOUT } from "@lodestar/params";
2
2
  import { computeSyncPeriodAtSlot } from "../../util/epoch.js";
3
3
  import { getSyncCommitteeAtPeriod, processLightClientUpdate, } from "./processLightClientUpdate.js";
4
4
  import { LightClientStore } from "./store.js";
5
- import { ZERO_HEADER, ZERO_SYNC_COMMITTEE, getZeroFinalityBranch, getZeroSyncCommitteeBranch } from "./utils.js";
5
+ import { ZERO_SYNC_COMMITTEE, getZeroFinalityBranch, getZeroSyncCommitteeBranch } from "./utils.js";
6
6
  export { isBetterUpdate, toLightClientUpdateSummary } from "./isBetterUpdate.js";
7
7
  export { getSyncCommitteeAtPeriod, isSafeLightClientUpdate, processLightClientUpdate, } from "./processLightClientUpdate.js";
8
8
  export { LightClientStore, } from "./store.js";
@@ -33,12 +33,15 @@ export class LightclientSpec {
33
33
  });
34
34
  }
35
35
  onOptimisticUpdate(currentSlot, optimisticUpdate) {
36
+ const fork = this.config.getForkName(optimisticUpdate.signatureSlot);
36
37
  this.onUpdate(currentSlot, {
37
38
  attestedHeader: optimisticUpdate.attestedHeader,
38
39
  nextSyncCommittee: ZERO_SYNC_COMMITTEE,
39
- nextSyncCommitteeBranch: getZeroSyncCommitteeBranch(this.config.getForkName(optimisticUpdate.signatureSlot)),
40
- finalizedHeader: { beacon: ZERO_HEADER },
41
- finalityBranch: getZeroFinalityBranch(this.config.getForkName(optimisticUpdate.signatureSlot)),
40
+ nextSyncCommitteeBranch: getZeroSyncCommitteeBranch(fork),
41
+ finalizedHeader: this.config
42
+ .getPostAltairForkTypes(optimisticUpdate.signatureSlot)
43
+ .LightClientHeader.defaultValue(),
44
+ finalityBranch: getZeroFinalityBranch(fork),
42
45
  syncAggregate: optimisticUpdate.syncAggregate,
43
46
  signatureSlot: optimisticUpdate.signatureSlot,
44
47
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lightClient/spec/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lightClient/spec/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"processLightClientUpdate.d.ts","sourceRoot":"","sources":["../../../src/lightClient/spec/processLightClientUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAC,wBAAwB,EAA6C,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAC,KAAK,iBAAiB,EAA0B,KAAK,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAIlG,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,IAAI,EACjB,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CA8CN;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,iBAAiB,GACtB,iBAAiB,CAuCnB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAIjF"}
1
+ {"version":3,"file":"processLightClientUpdate.d.ts","sourceRoot":"","sources":["../../../src/lightClient/spec/processLightClientUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAC,wBAAwB,EAA6C,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAC,KAAK,iBAAiB,EAA0B,KAAK,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAUlG,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,IAAI,EACjB,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAoDN;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,iBAAiB,GACtB,iBAAiB,CAuCnB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAIjF"}
@@ -3,7 +3,7 @@ import { pruneSetToMax } from "@lodestar/utils";
3
3
  import { computeSyncPeriodAtSlot } from "../../util/epoch.js";
4
4
  import { isBetterUpdate, toLightClientUpdateSummary } from "./isBetterUpdate.js";
5
5
  import { MAX_SYNC_PERIODS_CACHE } from "./store.js";
6
- import { deserializeSyncCommittee, getSafetyThreshold, isSyncCommitteeUpdate, sumBits } from "./utils.js";
6
+ import { deserializeSyncCommittee, getSafetyThreshold, isFinalityUpdate, isSyncCommitteeUpdate, sumBits, } from "./utils.js";
7
7
  import { validateLightClientUpdate } from "./validateLightClientUpdate.js";
8
8
  export function processLightClientUpdate(config, store, currentSlot, opts, update) {
9
9
  if (update.signatureSlot > currentSlot) {
@@ -23,7 +23,13 @@ export function processLightClientUpdate(config, store, currentSlot, opts, updat
23
23
  store.optimisticHeader = update.attestedHeader;
24
24
  }
25
25
  // Update finalized header
26
- if (syncCommitteeTrueBits * 3 >= SYNC_COMMITTEE_SIZE * 2 &&
26
+ // Defense-in-depth: require isFinalityUpdate(update) so a non-finality update can never
27
+ // overwrite store.finalizedHeader, regardless of any future loosening of the zeroed-header
28
+ // checks in validateLightClientUpdate. Spec-faithful behavior also holds without this guard
29
+ // once update.finalizedHeader is guaranteed fully-zero in the non-finality case, but the
30
+ // guard makes the invariant local to this write site.
31
+ if (isFinalityUpdate(update) &&
32
+ syncCommitteeTrueBits * 3 >= SYNC_COMMITTEE_SIZE * 2 &&
27
33
  update.finalizedHeader.beacon.slot > store.finalizedHeader.beacon.slot) {
28
34
  store.finalizedHeader = update.finalizedHeader;
29
35
  if (store.finalizedHeader.beacon.slot > store.optimisticHeader.beacon.slot) {
@@ -1 +1 @@
1
- {"version":3,"file":"processLightClientUpdate.js","sourceRoot":"","sources":["../../../src/lightClient/spec/processLightClientUpdate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processLightClientUpdate.js","sourceRoot":"","sources":["../../../src/lightClient/spec/processLightClientUpdate.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,6 @@ import { BeaconBlockHeader, LightClientFinalityUpdate, LightClientHeader, LightC
5
5
  import type { LightClientStore, SyncCommitteeFast } from "./store.js";
6
6
  export declare const GENESIS_SLOT = 0;
7
7
  export declare const ZERO_HASH: Uint8Array<ArrayBuffer>;
8
- export declare const ZERO_PUBKEY: Uint8Array<ArrayBuffer>;
9
8
  export declare const ZERO_SYNC_COMMITTEE: import("@chainsafe/ssz").ValueOfFields<{
10
9
  pubkeys: import("@chainsafe/ssz").VectorCompositeType<import("@chainsafe/ssz").ByteVectorType>;
11
10
  aggregatePubkey: import("@chainsafe/ssz").ByteVectorType;
@@ -32,7 +31,13 @@ export declare function isFinalityUpdate(update: LightClientUpdate): boolean;
32
31
  export declare function isZeroedHeader(header: BeaconBlockHeader): boolean;
33
32
  export declare function isZeroedSyncCommittee(syncCommittee: SyncCommittee): boolean;
34
33
  export declare function isValidMerkleBranch(leaf: Uint8Array, branch: Uint8Array[], depth: number, index: number, root: Uint8Array): boolean;
35
- export declare function normalizeMerkleBranch(branch: Uint8Array[], depth: number): Uint8Array[];
34
+ export declare function isValidNormalizedMerkleBranch(leaf: Uint8Array, branch: Uint8Array[], gindex: number, root: Uint8Array): boolean;
35
+ export declare function normalizeMerkleBranch(branch: Uint8Array[], gindex: number): Uint8Array[];
36
+ export declare function currentSyncCommitteeGindexAtFork(fork: ForkName): number;
37
+ export declare function finalizedRootGindexAtFork(fork: ForkName): number;
38
+ export declare function nextSyncCommitteeGindexAtFork(fork: ForkName): number;
39
+ export declare function getGindexDepth(gindex: number): number;
40
+ export declare function getGindexIndex(gindex: number): number;
36
41
  export declare function upgradeLightClientHeader(config: ChainForkConfig, targetFork: ForkName, header: LightClientHeader): LightClientHeader;
37
42
  export declare function isValidLightClientHeader(config: ChainForkConfig, header: LightClientHeader): boolean;
38
43
  export declare function upgradeLightClientUpdate(config: ChainForkConfig, targetFork: ForkName, update: LightClientUpdate): LightClientUpdate;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lightClient/spec/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAKL,QAAQ,EAKT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,IAAI,EACJ,aAAa,EAGd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,SAAS,yBAAqB,CAAC;AAC5C,eAAO,MAAM,WAAW,yBAAqB,CAAC;AAC9C,eAAO,MAAM,mBAAmB;;;EAA0C,CAAC;AAC3E,eAAO,MAAM,WAAW;;;;;;EAA8C,CAAC;AAIvE,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,CAG1E;AAUD,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,aAAa,GAAG,iBAAiB,CAKxF;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,iBAAiB,GAAG,aAAa,CAKtF;AAED,wBAAgB,kBAAkB,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,CAMvE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,CAIlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAOnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAGjE;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAG3E;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,UAAU,EAAE,EACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,GACf,OAAO,CAMT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAIvF;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,QAAQ,EACpB,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CAiEnB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAqCpG;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,QAAQ,EACpB,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CAanB;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,QAAQ,EACpB,cAAc,EAAE,yBAAyB,GACxC,yBAAyB,CAS3B;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,QAAQ,EACpB,gBAAgB,EAAE,2BAA2B,GAC5C,2BAA2B,CAI7B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,QAAQ,EACpB,KAAK,EAAE,gBAAgB,EACvB,aAAa,EAAE,IAAI,GAClB,gBAAgB,CAelB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lightClient/spec/utils.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { PublicKey } from "@chainsafe/blst";
2
- import { BLOCK_BODY_EXECUTION_PAYLOAD_DEPTH as EXECUTION_PAYLOAD_DEPTH, BLOCK_BODY_EXECUTION_PAYLOAD_INDEX as EXECUTION_PAYLOAD_INDEX, FINALIZED_ROOT_DEPTH, FINALIZED_ROOT_DEPTH_ELECTRA, ForkName, ForkSeq, NEXT_SYNC_COMMITTEE_DEPTH, NEXT_SYNC_COMMITTEE_DEPTH_ELECTRA, isForkPostElectra, } from "@lodestar/params";
2
+ import { Tree } from "@chainsafe/persistent-merkle-tree";
3
+ import { BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX, CURRENT_SYNC_COMMITTEE_GINDEX, CURRENT_SYNC_COMMITTEE_GINDEX_ELECTRA, CURRENT_SYNC_COMMITTEE_GINDEX_GLOAS, EXECUTION_BLOCK_HASH_GINDEX, EXECUTION_BLOCK_HASH_GINDEX_DENEB, EXECUTION_BLOCK_HASH_GINDEX_GLOAS, FINALIZED_ROOT_GINDEX, FINALIZED_ROOT_GINDEX_ELECTRA, FINALIZED_ROOT_GINDEX_GLOAS, ForkName, ForkSeq, NEXT_SYNC_COMMITTEE_GINDEX, NEXT_SYNC_COMMITTEE_GINDEX_ELECTRA, NEXT_SYNC_COMMITTEE_GINDEX_GLOAS, isForkPostElectra, isForkPostGloas, } from "@lodestar/params";
3
4
  import { isElectraLightClientUpdate, ssz, } from "@lodestar/types";
4
5
  import { byteArrayEquals, verifyMerkleBranch } from "@lodestar/utils";
5
6
  import { computeEpochAtSlot, computeSyncPeriodAtSlot } from "../../util/epoch.js";
6
7
  export const GENESIS_SLOT = 0;
7
8
  export const ZERO_HASH = new Uint8Array(32);
8
- export const ZERO_PUBKEY = new Uint8Array(48);
9
9
  export const ZERO_SYNC_COMMITTEE = ssz.altair.SyncCommittee.defaultValue();
10
10
  export const ZERO_HEADER = ssz.phase0.BeaconBlockHeader.defaultValue();
11
11
  /** From https://notes.ethereum.org/@vbuterin/extended_light_client_protocol#Optimistic-head-determining-function */
@@ -42,14 +42,10 @@ export function getSafetyThreshold(maxActiveParticipants) {
42
42
  return Math.floor(maxActiveParticipants / SAFETY_THRESHOLD_FACTOR);
43
43
  }
44
44
  export function getZeroSyncCommitteeBranch(fork) {
45
- const nextSyncCommitteeDepth = isForkPostElectra(fork)
46
- ? NEXT_SYNC_COMMITTEE_DEPTH_ELECTRA
47
- : NEXT_SYNC_COMMITTEE_DEPTH;
48
- return Array.from({ length: nextSyncCommitteeDepth }, () => ZERO_HASH);
45
+ return Array.from({ length: getGindexDepth(nextSyncCommitteeGindexAtFork(fork)) }, () => ZERO_HASH);
49
46
  }
50
47
  export function getZeroFinalityBranch(fork) {
51
- const finalizedRootDepth = isForkPostElectra(fork) ? FINALIZED_ROOT_DEPTH_ELECTRA : FINALIZED_ROOT_DEPTH;
52
- return Array.from({ length: finalizedRootDepth }, () => ZERO_HASH);
48
+ return Array.from({ length: getGindexDepth(finalizedRootGindexAtFork(fork)) }, () => ZERO_HASH);
53
49
  }
54
50
  export function isSyncCommitteeUpdate(update) {
55
51
  return (
@@ -66,12 +62,15 @@ export function isFinalityUpdate(update) {
66
62
  update.finalityBranch.some((branch) => !byteArrayEquals(branch, ZERO_HASH)));
67
63
  }
68
64
  export function isZeroedHeader(header) {
69
- // Fast return for when constructing full LightClientUpdate from partial updates
70
- return header === ZERO_HEADER || byteArrayEquals(header.bodyRoot, ZERO_HASH);
65
+ // Spec requires the whole header to equal LightClientHeader() in the non-finality case
66
+ // (see altair/light-client/sync-protocol.md `process_light_client_update`). Checking only
67
+ // bodyRoot would let an attacker smuggle arbitrary slot/proposerIndex/parentRoot/stateRoot
68
+ // through the non-finality branch and overwrite store.finalizedHeader.
69
+ return header === ZERO_HEADER || ssz.phase0.BeaconBlockHeader.equals(header, ZERO_HEADER);
71
70
  }
72
71
  export function isZeroedSyncCommittee(syncCommittee) {
73
- // Fast return for when constructing full LightClientUpdate from partial updates
74
- return syncCommittee === ZERO_SYNC_COMMITTEE || byteArrayEquals(syncCommittee.pubkeys[0], ZERO_PUBKEY);
72
+ // Spec requires the whole SyncCommittee to equal SyncCommittee() in the non-sync-committee-update case.
73
+ return syncCommittee === ZERO_SYNC_COMMITTEE || ssz.altair.SyncCommittee.equals(syncCommittee, ZERO_SYNC_COMMITTEE);
75
74
  }
76
75
  export function isValidMerkleBranch(leaf, branch, depth, index, root) {
77
76
  if (branch.length !== depth) {
@@ -79,10 +78,58 @@ export function isValidMerkleBranch(leaf, branch, depth, index, root) {
79
78
  }
80
79
  return verifyMerkleBranch(leaf, branch, depth, index, root);
81
80
  }
82
- export function normalizeMerkleBranch(branch, depth) {
81
+ export function isValidNormalizedMerkleBranch(leaf, branch, gindex, root) {
82
+ const depth = getGindexDepth(gindex);
83
+ const index = getGindexIndex(gindex);
84
+ const numExtraDepth = branch.length - depth;
85
+ if (numExtraDepth < 0) {
86
+ return false;
87
+ }
88
+ for (let i = 0; i < numExtraDepth; i++) {
89
+ if (!byteArrayEquals(branch[i], ZERO_HASH)) {
90
+ return false;
91
+ }
92
+ }
93
+ return isValidMerkleBranch(leaf, branch.slice(numExtraDepth), depth, index, root);
94
+ }
95
+ export function normalizeMerkleBranch(branch, gindex) {
96
+ const depth = getGindexDepth(gindex);
83
97
  const numExtraDepth = depth - branch.length;
84
98
  return [...Array.from({ length: numExtraDepth }, () => ZERO_HASH), ...branch];
85
99
  }
100
+ export function currentSyncCommitteeGindexAtFork(fork) {
101
+ if (isForkPostGloas(fork)) {
102
+ return CURRENT_SYNC_COMMITTEE_GINDEX_GLOAS;
103
+ }
104
+ if (isForkPostElectra(fork)) {
105
+ return CURRENT_SYNC_COMMITTEE_GINDEX_ELECTRA;
106
+ }
107
+ return CURRENT_SYNC_COMMITTEE_GINDEX;
108
+ }
109
+ export function finalizedRootGindexAtFork(fork) {
110
+ if (isForkPostGloas(fork)) {
111
+ return FINALIZED_ROOT_GINDEX_GLOAS;
112
+ }
113
+ if (isForkPostElectra(fork)) {
114
+ return FINALIZED_ROOT_GINDEX_ELECTRA;
115
+ }
116
+ return FINALIZED_ROOT_GINDEX;
117
+ }
118
+ export function nextSyncCommitteeGindexAtFork(fork) {
119
+ if (isForkPostGloas(fork)) {
120
+ return NEXT_SYNC_COMMITTEE_GINDEX_GLOAS;
121
+ }
122
+ if (isForkPostElectra(fork)) {
123
+ return NEXT_SYNC_COMMITTEE_GINDEX_ELECTRA;
124
+ }
125
+ return NEXT_SYNC_COMMITTEE_GINDEX;
126
+ }
127
+ export function getGindexDepth(gindex) {
128
+ return Math.floor(Math.log2(gindex));
129
+ }
130
+ export function getGindexIndex(gindex) {
131
+ return gindex - 2 ** getGindexDepth(gindex);
132
+ }
86
133
  export function upgradeLightClientHeader(config, targetFork, header) {
87
134
  const headerFork = config.getForkName(header.beacon.slot);
88
135
  if (ForkSeq[headerFork] >= ForkSeq[targetFork]) {
@@ -90,7 +137,7 @@ export function upgradeLightClientHeader(config, targetFork, header) {
90
137
  }
91
138
  // We are modifying the same header object, may be we could create a copy, but its
92
139
  // not required as of now
93
- const upgradedHeader = header;
140
+ let upgradedHeader = header;
94
141
  const startUpgradeFromFork = Object.values(ForkName)[ForkSeq[headerFork] + 1];
95
142
  switch (startUpgradeFromFork) {
96
143
  // biome-ignore lint/suspicious/useDefaultSwitchClauseLast: We want default to evaluate at first to throw error early
@@ -133,7 +180,10 @@ export function upgradeLightClientHeader(config, targetFork, header) {
133
180
  if (ForkSeq[targetFork] <= ForkSeq.fulu)
134
181
  break;
135
182
  case ForkName.gloas:
136
- // No changes to LightClientHeader in Gloas
183
+ if (isGloasLightClientHeader(upgradedHeader)) {
184
+ break;
185
+ }
186
+ upgradedHeader = upgradeLightClientHeaderToGloas(config, upgradedHeader);
137
187
  // Break if no further upgrades is required else fall through
138
188
  if (ForkSeq[targetFork] <= ForkSeq.gloas)
139
189
  break;
@@ -142,6 +192,19 @@ export function upgradeLightClientHeader(config, targetFork, header) {
142
192
  }
143
193
  export function isValidLightClientHeader(config, header) {
144
194
  const epoch = computeEpochAtSlot(header.beacon.slot);
195
+ if (isGloasLightClientHeader(header)) {
196
+ if (epoch >= config.GLOAS_FORK_EPOCH) {
197
+ return isValidNormalizedMerkleBranch(header.executionBlockHash, header.executionBranch, EXECUTION_BLOCK_HASH_GINDEX_GLOAS, header.beacon.bodyRoot);
198
+ }
199
+ if (epoch >= config.DENEB_FORK_EPOCH) {
200
+ return isValidNormalizedMerkleBranch(header.executionBlockHash, header.executionBranch, EXECUTION_BLOCK_HASH_GINDEX_DENEB, header.beacon.bodyRoot);
201
+ }
202
+ if (epoch >= config.CAPELLA_FORK_EPOCH) {
203
+ return isValidNormalizedMerkleBranch(header.executionBlockHash, header.executionBranch, EXECUTION_BLOCK_HASH_GINDEX, header.beacon.bodyRoot);
204
+ }
205
+ return (byteArrayEquals(header.executionBlockHash, ZERO_HASH) &&
206
+ header.executionBranch.every((node) => byteArrayEquals(node, ZERO_HASH)));
207
+ }
145
208
  if (epoch < config.CAPELLA_FORK_EPOCH) {
146
209
  return ((header.execution === undefined ||
147
210
  ssz.capella.ExecutionPayloadHeader.equals(header.execution, ssz.capella.LightClientHeader.fields.execution.defaultValue())) &&
@@ -157,19 +220,19 @@ export function isValidLightClientHeader(config, header) {
157
220
  }
158
221
  return isValidMerkleBranch(config
159
222
  .getPostBellatrixForkTypes(header.beacon.slot)
160
- .ExecutionPayloadHeader.hashTreeRoot(header.execution), header.executionBranch, EXECUTION_PAYLOAD_DEPTH, EXECUTION_PAYLOAD_INDEX, header.beacon.bodyRoot);
223
+ .ExecutionPayloadHeader.hashTreeRoot(header.execution), header.executionBranch, getGindexDepth(BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX), getGindexIndex(BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX), header.beacon.bodyRoot);
161
224
  }
162
225
  export function upgradeLightClientUpdate(config, targetFork, update) {
163
226
  update.attestedHeader = upgradeLightClientHeader(config, targetFork, update.attestedHeader);
164
227
  update.finalizedHeader = upgradeLightClientHeader(config, targetFork, update.finalizedHeader);
165
- update.nextSyncCommitteeBranch = normalizeMerkleBranch(update.nextSyncCommitteeBranch, isForkPostElectra(targetFork) ? NEXT_SYNC_COMMITTEE_DEPTH_ELECTRA : NEXT_SYNC_COMMITTEE_DEPTH);
166
- update.finalityBranch = normalizeMerkleBranch(update.finalityBranch, isForkPostElectra(targetFork) ? FINALIZED_ROOT_DEPTH_ELECTRA : FINALIZED_ROOT_DEPTH);
228
+ update.nextSyncCommitteeBranch = normalizeMerkleBranch(update.nextSyncCommitteeBranch, nextSyncCommitteeGindexAtFork(targetFork));
229
+ update.finalityBranch = normalizeMerkleBranch(update.finalityBranch, finalizedRootGindexAtFork(targetFork));
167
230
  return update;
168
231
  }
169
232
  export function upgradeLightClientFinalityUpdate(config, targetFork, finalityUpdate) {
170
233
  finalityUpdate.attestedHeader = upgradeLightClientHeader(config, targetFork, finalityUpdate.attestedHeader);
171
234
  finalityUpdate.finalizedHeader = upgradeLightClientHeader(config, targetFork, finalityUpdate.finalizedHeader);
172
- finalityUpdate.finalityBranch = normalizeMerkleBranch(finalityUpdate.finalityBranch, isForkPostElectra(targetFork) ? FINALIZED_ROOT_DEPTH_ELECTRA : FINALIZED_ROOT_DEPTH);
235
+ finalityUpdate.finalityBranch = normalizeMerkleBranch(finalityUpdate.finalityBranch, finalizedRootGindexAtFork(targetFork));
173
236
  return finalityUpdate;
174
237
  }
175
238
  export function upgradeLightClientOptimisticUpdate(config, targetFork, optimisticUpdate) {
@@ -194,4 +257,52 @@ export function upgradeLightClientStore(config, targetFork, store, signatureSlot
194
257
  store.optimisticHeader = upgradeLightClientHeader(config, targetFork, store.optimisticHeader);
195
258
  return store;
196
259
  }
260
+ function isGloasLightClientHeader(header) {
261
+ return header.executionBlockHash !== undefined;
262
+ }
263
+ function upgradeLightClientHeaderToGloas(config, pre) {
264
+ if (ssz.electra.LightClientHeader.equals(pre, ssz.electra.LightClientHeader.defaultValue())) {
265
+ return ssz.gloas.LightClientHeader.defaultValue();
266
+ }
267
+ const epoch = computeEpochAtSlot(pre.beacon.slot);
268
+ if (epoch >= config.DENEB_FORK_EPOCH) {
269
+ const blockHashGindex = ssz.deneb.ExecutionPayloadHeader.getPathInfo(["blockHash"]).gindex;
270
+ const executionBranch = new Tree(ssz.deneb.ExecutionPayloadHeader.toView(pre.execution).node).getSingleProof(blockHashGindex);
271
+ return {
272
+ beacon: pre.beacon,
273
+ executionBlockHash: pre.execution.blockHash,
274
+ executionBranch: normalizeMerkleBranch([...executionBranch, ...pre.executionBranch], EXECUTION_BLOCK_HASH_GINDEX_GLOAS),
275
+ };
276
+ }
277
+ if (epoch >= config.CAPELLA_FORK_EPOCH) {
278
+ const executionHeader = {
279
+ parentHash: pre.execution.parentHash,
280
+ feeRecipient: pre.execution.feeRecipient,
281
+ stateRoot: pre.execution.stateRoot,
282
+ receiptsRoot: pre.execution.receiptsRoot,
283
+ logsBloom: pre.execution.logsBloom,
284
+ prevRandao: pre.execution.prevRandao,
285
+ blockNumber: pre.execution.blockNumber,
286
+ gasLimit: pre.execution.gasLimit,
287
+ gasUsed: pre.execution.gasUsed,
288
+ timestamp: pre.execution.timestamp,
289
+ extraData: pre.execution.extraData,
290
+ baseFeePerGas: pre.execution.baseFeePerGas,
291
+ blockHash: pre.execution.blockHash,
292
+ transactionsRoot: pre.execution.transactionsRoot,
293
+ withdrawalsRoot: pre.execution.withdrawalsRoot,
294
+ };
295
+ const blockHashGindex = ssz.capella.ExecutionPayloadHeader.getPathInfo(["blockHash"]).gindex;
296
+ const executionBranch = new Tree(ssz.capella.ExecutionPayloadHeader.toView(executionHeader).node).getSingleProof(blockHashGindex);
297
+ return {
298
+ beacon: pre.beacon,
299
+ executionBlockHash: executionHeader.blockHash,
300
+ executionBranch: normalizeMerkleBranch([...executionBranch, ...pre.executionBranch], EXECUTION_BLOCK_HASH_GINDEX_GLOAS),
301
+ };
302
+ }
303
+ return {
304
+ ...ssz.gloas.LightClientHeader.defaultValue(),
305
+ beacon: pre.beacon,
306
+ };
307
+ }
197
308
  //# sourceMappingURL=utils.js.map