@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.
- package/lib/block/processAttestationsAltair.d.ts +4 -1
- package/lib/block/processAttestationsAltair.d.ts.map +1 -1
- package/lib/block/processAttestationsAltair.js +7 -5
- package/lib/block/processAttestationsAltair.js.map +1 -1
- package/lib/block/processBuilderDepositRequest.d.ts.map +1 -1
- package/lib/block/processBuilderDepositRequest.js +13 -7
- package/lib/block/processBuilderDepositRequest.js.map +1 -1
- package/lib/block/processOperations.d.ts.map +1 -1
- package/lib/block/processOperations.js +17 -1
- package/lib/block/processOperations.js.map +1 -1
- package/lib/block/processParentExecutionPayload.d.ts.map +1 -1
- package/lib/block/processParentExecutionPayload.js +15 -1
- package/lib/block/processParentExecutionPayload.js.map +1 -1
- package/lib/block/processWithdrawals.js +1 -1
- package/lib/block/processWithdrawals.js.map +1 -1
- package/lib/cache/epochCache.d.ts.map +1 -1
- package/lib/cache/epochCache.js +18 -19
- package/lib/cache/epochCache.js.map +1 -1
- package/lib/cache/stateCache.d.ts.map +1 -1
- package/lib/cache/stateCache.js +2 -4
- package/lib/cache/stateCache.js.map +1 -1
- package/lib/epoch/processParticipationFlagUpdates.d.ts +2 -2
- package/lib/epoch/processParticipationFlagUpdates.d.ts.map +1 -1
- package/lib/epoch/processParticipationFlagUpdates.js +13 -0
- package/lib/epoch/processParticipationFlagUpdates.js.map +1 -1
- package/lib/epoch/processRewardsAndPenalties.d.ts.map +1 -1
- package/lib/epoch/processRewardsAndPenalties.js +1 -2
- package/lib/epoch/processRewardsAndPenalties.js.map +1 -1
- package/lib/lightClient/proofs.d.ts.map +1 -1
- package/lib/lightClient/proofs.js +28 -2
- package/lib/lightClient/proofs.js.map +1 -1
- package/lib/lightClient/spec/index.d.ts.map +1 -1
- package/lib/lightClient/spec/index.js +7 -4
- package/lib/lightClient/spec/index.js.map +1 -1
- package/lib/lightClient/spec/processLightClientUpdate.d.ts.map +1 -1
- package/lib/lightClient/spec/processLightClientUpdate.js +8 -2
- package/lib/lightClient/spec/processLightClientUpdate.js.map +1 -1
- package/lib/lightClient/spec/utils.d.ts +7 -2
- package/lib/lightClient/spec/utils.d.ts.map +1 -1
- package/lib/lightClient/spec/utils.js +130 -19
- package/lib/lightClient/spec/utils.js.map +1 -1
- package/lib/lightClient/spec/validateLightClientBootstrap.d.ts.map +1 -1
- package/lib/lightClient/spec/validateLightClientBootstrap.js +2 -7
- package/lib/lightClient/spec/validateLightClientBootstrap.js.map +1 -1
- package/lib/lightClient/spec/validateLightClientUpdate.d.ts.map +1 -1
- package/lib/lightClient/spec/validateLightClientUpdate.js +6 -5
- package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
- package/lib/lightClient/types.d.ts +3 -1
- package/lib/lightClient/types.d.ts.map +1 -1
- package/lib/metrics.js +2 -4
- package/lib/metrics.js.map +1 -1
- package/lib/slot/upgradeStateToAltair.js +1 -1
- package/lib/slot/upgradeStateToAltair.js.map +1 -1
- package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
- package/lib/slot/upgradeStateToGloas.js +48 -9
- package/lib/slot/upgradeStateToGloas.js.map +1 -1
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +7 -2
- package/lib/util/execution.js.map +1 -1
- package/lib/util/gloas.d.ts +3 -1
- package/lib/util/gloas.d.ts.map +1 -1
- package/lib/util/gloas.js +8 -11
- package/lib/util/gloas.js.map +1 -1
- package/lib/util/index.d.ts +1 -0
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +1 -0
- package/lib/util/index.js.map +1 -1
- package/lib/util/ssz.d.ts +9 -0
- package/lib/util/ssz.d.ts.map +1 -0
- package/lib/util/ssz.js +39 -0
- package/lib/util/ssz.js.map +1 -0
- package/package.json +14 -14
- package/src/block/processAttestationsAltair.ts +9 -6
- package/src/block/processBuilderDepositRequest.ts +21 -8
- package/src/block/processOperations.ts +28 -1
- package/src/block/processParentExecutionPayload.ts +26 -1
- package/src/block/processWithdrawals.ts +1 -1
- package/src/cache/epochCache.ts +19 -22
- package/src/cache/stateCache.ts +2 -4
- package/src/epoch/processParticipationFlagUpdates.ts +20 -2
- package/src/epoch/processRewardsAndPenalties.ts +1 -2
- package/src/lightClient/proofs.ts +36 -1
- package/src/lightClient/spec/index.ts +8 -4
- package/src/lightClient/spec/processLightClientUpdate.ts +13 -1
- package/src/lightClient/spec/utils.ts +200 -30
- package/src/lightClient/spec/validateLightClientBootstrap.ts +3 -10
- package/src/lightClient/spec/validateLightClientUpdate.ts +11 -21
- package/src/lightClient/types.ts +3 -1
- package/src/metrics.ts +2 -4
- package/src/slot/upgradeStateToAltair.ts +1 -1
- package/src/slot/upgradeStateToGloas.ts +84 -9
- package/src/util/execution.ts +9 -4
- package/src/util/gloas.ts +9 -14
- package/src/util/index.ts +1 -0
- 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 {
|
|
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:
|
|
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,
|
|
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;
|
|
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":"
|
|
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 =
|
|
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;
|
|
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,
|
|
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
|
|
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":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,mCAAmC,CAAC;AACvD,OAAO,EACL,mCAAmC,EACnC,qBAAqB,EACrB,6BAA6B,
|
|
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,
|
|
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 {
|
|
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(
|
|
40
|
-
finalizedHeader:
|
|
41
|
-
|
|
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":"AACA,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAQhD,OAAO,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAEL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAyB,gBAAgB,EAA8B,MAAM,YAAY,CAAC;AACjG,OAAO,EAAC,
|
|
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;
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAA2B,cAAc,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAyB,sBAAsB,EAAyB,MAAM,YAAY,CAAC;AAClG,OAAO,
|
|
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
|
|
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":"
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
70
|
-
|
|
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
|
-
//
|
|
74
|
-
return syncCommittee === ZERO_SYNC_COMMITTEE ||
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
166
|
-
update.finalityBranch = normalizeMerkleBranch(update.finalityBranch,
|
|
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,
|
|
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
|