@lodestar/state-transition 1.39.0-dev.ad23ef56aa → 1.39.0-dev.b2437a6348
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/cache/epochCache.d.ts +6 -12
- package/lib/cache/epochCache.d.ts.map +1 -1
- package/lib/cache/epochCache.js +33 -105
- package/lib/cache/epochCache.js.map +1 -1
- package/lib/cache/epochTransitionCache.d.ts +5 -12
- package/lib/cache/epochTransitionCache.d.ts.map +1 -1
- package/lib/cache/epochTransitionCache.js +4 -14
- package/lib/cache/epochTransitionCache.js.map +1 -1
- package/lib/cache/stateCache.d.ts.map +1 -1
- package/lib/cache/stateCache.js +1 -2
- package/lib/cache/stateCache.js.map +1 -1
- package/lib/epoch/processProposerLookahead.d.ts.map +1 -1
- package/lib/epoch/processProposerLookahead.js +3 -6
- package/lib/epoch/processProposerLookahead.js.map +1 -1
- package/lib/rewards/blockRewards.d.ts +2 -1
- package/lib/rewards/blockRewards.d.ts.map +1 -1
- package/lib/rewards/blockRewards.js +3 -2
- package/lib/rewards/blockRewards.js.map +1 -1
- package/lib/rewards/syncCommitteeRewards.d.ts.map +1 -1
- package/lib/rewards/syncCommitteeRewards.js +10 -11
- package/lib/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/types.d.ts +1 -1
- package/lib/types.d.ts.map +1 -1
- package/lib/util/epochShuffling.d.ts +1 -34
- package/lib/util/epochShuffling.d.ts.map +1 -1
- package/lib/util/epochShuffling.js +1 -1
- package/lib/util/epochShuffling.js.map +1 -1
- package/package.json +7 -7
- package/src/cache/epochCache.ts +40 -118
- package/src/cache/epochTransitionCache.ts +9 -34
- package/src/cache/stateCache.ts +1 -2
- package/src/epoch/processProposerLookahead.ts +3 -7
- package/src/rewards/blockRewards.ts +6 -3
- package/src/rewards/syncCommitteeRewards.ts +10 -13
- package/src/types.ts +1 -0
- package/src/util/epochShuffling.ts +2 -43
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stateCache.js","sourceRoot":"","sources":["../../src/cache/stateCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAC,SAAS,EAAC,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAC,UAAU,EAA0C,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAc,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AA0IrE;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAQ,EACR,aAAsC,EACtC,IAAqB;IAErB,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,EAAE;QAC9C,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,CAAC;QACd,4BAA4B,EAAE,CAAC;QAC/B,wBAAwB,EAAE,KAAK;QAC/B,eAAe,EAAE,sBAAsB,EAAE;KAC1C,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAAkB,EAClB,UAAsB,EACtB,IAAqB,EACrB,mBAAgC;IAEhC,MAAM,EAAC,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAC,GAAG,SAAS,CAC1D,eAAe,CAAC,MAAM,EACtB,eAAe,EACf,UAAU,EACV,mBAAmB,CACpB,CAAC;IACF,MAAM,EAAC,YAAY,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"stateCache.js","sourceRoot":"","sources":["../../src/cache/stateCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processProposerLookahead.d.ts","sourceRoot":"","sources":["../../src/epoch/processProposerLookahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAsC,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAIxE;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,oBAAoB,GAC1B,IAAI,
|
|
1
|
+
{"version":3,"file":"processProposerLookahead.d.ts","sourceRoot":"","sources":["../../src/epoch/processProposerLookahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAsC,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAIxE;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAiBN"}
|
|
@@ -14,12 +14,9 @@ export function processProposerLookahead(fork, state, cache) {
|
|
|
14
14
|
const remainingProposerLookahead = state.proposerLookahead.getAll().slice(SLOTS_PER_EPOCH);
|
|
15
15
|
// Fill in the last epoch with new proposer indices
|
|
16
16
|
const epoch = state.epochCtx.epoch + MIN_SEED_LOOKAHEAD + 1;
|
|
17
|
-
const shuffling = state
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}) ??
|
|
21
|
-
// Only for testing. shufflingCache should always be available in prod
|
|
22
|
-
computeEpochShuffling(state, cache.nextShufflingActiveIndices, epoch);
|
|
17
|
+
const shuffling = computeEpochShuffling(state, cache.nextShufflingActiveIndices, epoch);
|
|
18
|
+
// Save shuffling to cache so afterProcessEpoch can reuse it instead of recomputing
|
|
19
|
+
cache.nextShuffling = shuffling;
|
|
23
20
|
const lastEpochProposerLookahead = computeProposerIndices(fork, state, shuffling, epoch);
|
|
24
21
|
state.proposerLookahead = ssz.fulu.ProposerLookahead.toViewDU([
|
|
25
22
|
...remainingProposerLookahead,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processProposerLookahead.js","sourceRoot":"","sources":["../../src/epoch/processProposerLookahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,kBAAkB,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEpC,OAAO,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAa,EACb,KAA4B,EAC5B,KAA2B;IAE3B,yCAAyC;IACzC,MAAM,0BAA0B,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE3F,mDAAmD;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,kBAAkB,GAAG,CAAC,CAAC;IAE5D,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"processProposerLookahead.js","sourceRoot":"","sources":["../../src/epoch/processProposerLookahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,kBAAkB,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEpC,OAAO,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAa,EACb,KAA4B,EAC5B,KAA2B;IAE3B,yCAAyC;IACzC,MAAM,0BAA0B,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE3F,mDAAmD;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,kBAAkB,GAAG,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACxF,mFAAmF;IACnF,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;IAEhC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAEzF,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAC5D,GAAG,0BAA0B;QAC7B,GAAG,0BAA0B;KAC9B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BeaconConfig } from "@lodestar/config";
|
|
2
2
|
import { BeaconBlock, rewards } from "@lodestar/types";
|
|
3
|
+
import { RewardCache } from "../cache/rewardCache.js";
|
|
3
4
|
import { CachedBeaconStateAllForks } from "../cache/stateCache.js";
|
|
4
5
|
/**
|
|
5
6
|
* Calculate total proposer block rewards given block and the beacon state of the same slot before the block is applied (preState)
|
|
@@ -9,5 +10,5 @@ import { CachedBeaconStateAllForks } from "../cache/stateCache.js";
|
|
|
9
10
|
* 2) Including attestations from sync committee
|
|
10
11
|
* 3) Reporting slashable behaviours from proposer and attester
|
|
11
12
|
*/
|
|
12
|
-
export declare function computeBlockRewards(config: BeaconConfig, block: BeaconBlock,
|
|
13
|
+
export declare function computeBlockRewards(config: BeaconConfig, block: BeaconBlock, preStateIn: CachedBeaconStateAllForks, proposerRewards?: RewardCache): Promise<rewards.BlockRewards>;
|
|
13
14
|
//# sourceMappingURL=blockRewards.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockRewards.d.ts","sourceRoot":"","sources":["../../src/rewards/blockRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAO9C,OAAO,EAAC,WAAW,EAAkB,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAC,yBAAyB,EAAmD,MAAM,wBAAwB,CAAC;AAKnH;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,EAClB,
|
|
1
|
+
{"version":3,"file":"blockRewards.d.ts","sourceRoot":"","sources":["../../src/rewards/blockRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAO9C,OAAO,EAAC,WAAW,EAAkB,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAC,yBAAyB,EAAmD,MAAM,wBAAwB,CAAC;AAKnH;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,yBAAyB,EACrC,eAAe,CAAC,EAAE,WAAW,GAC5B,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAkC/B"}
|
|
@@ -9,9 +9,10 @@ import { getAttesterSlashableIndices } from "../util/attestation.js";
|
|
|
9
9
|
* 2) Including attestations from sync committee
|
|
10
10
|
* 3) Reporting slashable behaviours from proposer and attester
|
|
11
11
|
*/
|
|
12
|
-
export async function computeBlockRewards(config, block,
|
|
12
|
+
export async function computeBlockRewards(config, block, preStateIn, proposerRewards) {
|
|
13
|
+
const preState = preStateIn.clone();
|
|
13
14
|
const fork = config.getForkName(block.slot);
|
|
14
|
-
const { attestations: cachedAttestationsReward = 0, syncAggregate: cachedSyncAggregateReward = 0 } =
|
|
15
|
+
const { attestations: cachedAttestationsReward = 0, syncAggregate: cachedSyncAggregateReward = 0 } = proposerRewards ?? {};
|
|
15
16
|
let blockAttestationReward = cachedAttestationsReward;
|
|
16
17
|
let syncAggregateReward = cachedSyncAggregateReward;
|
|
17
18
|
if (blockAttestationReward === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockRewards.js","sourceRoot":"","sources":["../../src/rewards/blockRewards.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,6BAA6B,EAC7B,qCAAqC,EACrC,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,yBAAyB,EAAC,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"blockRewards.js","sourceRoot":"","sources":["../../src/rewards/blockRewards.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,6BAA6B,EAC7B,qCAAqC,EACrC,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,yBAAyB,EAAC,MAAM,uCAAuC,CAAC;AAGhF,OAAO,EAAC,2BAA2B,EAAC,MAAM,wBAAwB,CAAC;AAInE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,KAAkB,EAClB,UAAqC,EACrC,eAA6B;IAE7B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAC,YAAY,EAAE,wBAAwB,GAAG,CAAC,EAAE,aAAa,EAAE,yBAAyB,GAAG,CAAC,EAAC,GAC9F,eAAe,IAAI,EAAE,CAAC;IACxB,IAAI,sBAAsB,GAAG,wBAAwB,CAAC;IACtD,IAAI,mBAAmB,GAAG,yBAAyB,CAAC;IAEpD,IAAI,sBAAsB,KAAK,CAAC,EAAE,CAAC;QACjC,sBAAsB;YACpB,IAAI,KAAK,QAAQ,CAAC,MAAM;gBACtB,CAAC,CAAC,mCAAmC,CAAC,KAA2B,EAAE,QAAmC,CAAC;gBACvG,CAAC,CAAC,mCAAmC,CAAC,MAAM,EAAE,KAA2B,EAAE,QAAmC,CAAC,CAAC;IACtH,CAAC;IAED,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;QAC9B,mBAAmB,GAAG,0BAA0B,CAAC,KAA2B,EAAE,QAAmC,CAAC,CAAC;IACrH,CAAC;IAED,MAAM,2BAA2B,GAAG,kCAAkC,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9F,MAAM,2BAA2B,GAAG,kCAAkC,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE9F,MAAM,KAAK,GACT,sBAAsB,GAAG,mBAAmB,GAAG,2BAA2B,GAAG,2BAA2B,CAAC;IAE3G,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,KAAK;QACL,YAAY,EAAE,sBAAsB;QACpC,aAAa,EAAE,mBAAmB;QAClC,iBAAiB,EAAE,2BAA2B;QAC9C,iBAAiB,EAAE,2BAA2B;KAC/C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mCAAmC,CAC1C,MAA0B,EAC1B,SAAkC;IAElC,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;AACvG,CAAC;AAED;;;GAGG;AACH,SAAS,mCAAmC,CAC1C,MAAoB,EACpB,KAAyB,EACzB,QAAiC;IAEjC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAC,YAAY,EAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IAElC,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAE/D,OAAO,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC;AAC/C,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAyB,EAAE,QAAiC;IAC9F,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,EAAC,iBAAiB,EAAC,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;QACrD,MAAM,EAAC,kBAAkB,EAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAE/C,OAAO,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,+CAA+C;IACvI,CAAC;IAED,OAAO,CAAC,CAAC,CAAC,2CAA2C;AACvD,CAAC;AAED;;;GAGG;AACH,SAAS,kCAAkC,CACzC,IAAc,EACd,KAAkB,EAClB,KAAgC;IAEhC,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAE/B,KAAK,MAAM,gBAAgB,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5D,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC;QACpF,MAAM,wBAAwB,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,gBAAgB,CAAC;QACvG,MAAM,2BAA2B,GAAG,iBAAiB,CAAC,IAAI,CAAC;YACzD,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,6BAA6B,CAAC;QAElC,sBAAsB,IAAI,IAAI,CAAC,KAAK,CAAC,wBAAwB,GAAG,2BAA2B,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,kCAAkC,CACzC,IAAc,EACd,KAAkB,EAClB,QAAmC;IAEnC,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAE/B,KAAK,MAAM,gBAAgB,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5D,KAAK,MAAM,sBAAsB,IAAI,2BAA2B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnF,MAAM,wBAAwB,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,gBAAgB,CAAC;YAC1G,MAAM,2BAA2B,GAAG,iBAAiB,CAAC,IAAI,CAAC;gBACzD,CAAC,CAAC,qCAAqC;gBACvC,CAAC,CAAC,6BAA6B,CAAC;YAElC,sBAAsB,IAAI,IAAI,CAAC,KAAK,CAAC,wBAAwB,GAAG,2BAA2B,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,OAAO,sBAAsB,CAAC;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCommitteeRewards.d.ts","sourceRoot":"","sources":["../../src/rewards/syncCommitteeRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,WAAW,EAAE,cAAc,EAAU,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAC,yBAAyB,EAA0B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"syncCommitteeRewards.d.ts","sourceRoot":"","sources":["../../src/rewards/syncCommitteeRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,WAAW,EAAE,cAAc,EAAU,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAC,yBAAyB,EAA0B,MAAM,wBAAwB,CAAC;AAE1F,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,yBAAyB,EACnC,YAAY,GAAE,CAAC,cAAc,GAAG,MAAM,CAAC,EAAO,GAC7C,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CA2CvC"}
|
|
@@ -5,28 +5,27 @@ export async function computeSyncCommitteeRewards(config, index2pubkey, block, p
|
|
|
5
5
|
throw Error("Cannot get sync rewards as phase0 block does not have sync committee");
|
|
6
6
|
}
|
|
7
7
|
const altairBlock = block;
|
|
8
|
-
const preStateAltair = preState;
|
|
8
|
+
const preStateAltair = preState.clone();
|
|
9
9
|
// Bound syncCommitteeValidatorIndices in case it goes beyond SYNC_COMMITTEE_SIZE just to be safe
|
|
10
10
|
const syncCommitteeValidatorIndices = preStateAltair.epochCtx.currentSyncCommitteeIndexed.validatorIndices.slice(0, SYNC_COMMITTEE_SIZE);
|
|
11
11
|
const { syncParticipantReward } = preStateAltair.epochCtx;
|
|
12
12
|
const { syncCommitteeBits } = altairBlock.body.syncAggregate;
|
|
13
|
-
//
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const balanceRecord = balances.get(i);
|
|
13
|
+
// Track reward deltas per validator (can appear multiple times in sync committee)
|
|
14
|
+
const rewardDeltas = new Map();
|
|
15
|
+
// Iterate by position index to correctly access syncCommitteeBits
|
|
16
|
+
for (let i = 0; i < syncCommitteeValidatorIndices.length; i++) {
|
|
17
|
+
const validatorIndex = syncCommitteeValidatorIndices[i];
|
|
18
|
+
const currentDelta = rewardDeltas.get(validatorIndex) ?? 0;
|
|
20
19
|
if (syncCommitteeBits.get(i)) {
|
|
21
20
|
// Positive rewards for participants
|
|
22
|
-
|
|
21
|
+
rewardDeltas.set(validatorIndex, currentDelta + syncParticipantReward);
|
|
23
22
|
}
|
|
24
23
|
else {
|
|
25
24
|
// Negative rewards for non participants
|
|
26
|
-
|
|
25
|
+
rewardDeltas.set(validatorIndex, currentDelta - syncParticipantReward);
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
|
-
const rewards = Array.from(
|
|
28
|
+
const rewards = Array.from(rewardDeltas, ([validatorIndex, reward]) => ({ validatorIndex, reward }));
|
|
30
29
|
if (validatorIds.length) {
|
|
31
30
|
const filtersSet = new Set(validatorIds);
|
|
32
31
|
return rewards.filter((reward) => filtersSet.has(reward.validatorIndex) || filtersSet.has(index2pubkey[reward.validatorIndex].toHex()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCommitteeRewards.js","sourceRoot":"","sources":["../../src/rewards/syncCommitteeRewards.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"syncCommitteeRewards.js","sourceRoot":"","sources":["../../src/rewards/syncCommitteeRewards.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAK/D,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAoB,EACpB,YAA+B,EAC/B,KAAkB,EAClB,QAAmC,EACnC,eAA4C,EAAE;IAE9C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,WAAW,GAAG,KAA2B,CAAC;IAChD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,EAA6B,CAAC;IAEnE,iGAAiG;IACjG,MAAM,6BAA6B,GAAG,cAAc,CAAC,QAAQ,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,KAAK,CAC9G,CAAC,EACD,mBAAmB,CACpB,CAAC;IACF,MAAM,EAAC,qBAAqB,EAAC,GAAG,cAAc,CAAC,QAAQ,CAAC;IACxD,MAAM,EAAC,iBAAiB,EAAC,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;IAE3D,kFAAkF;IAClF,MAAM,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE5D,kEAAkE;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,6BAA6B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9D,MAAM,cAAc,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,oCAAoC;YACpC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,GAAG,qBAAqB,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,GAAG,qBAAqB,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,cAAc,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC;IAEnG,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,CACjH,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { EpochCache } from "./cache/epochCache.js";
|
|
2
2
|
export type { EpochTransitionCache } from "./cache/epochTransitionCache.js";
|
|
3
3
|
export type { CachedBeaconStateAllForks, CachedBeaconStateAltair, CachedBeaconStateBellatrix, CachedBeaconStateCapella, CachedBeaconStateDeneb, CachedBeaconStateElectra, CachedBeaconStateExecutions, CachedBeaconStateFulu, CachedBeaconStateGloas, CachedBeaconStatePhase0, } from "./cache/stateCache.js";
|
|
4
|
-
export type { BeaconStateAllForks, BeaconStateAltair, BeaconStateBellatrix, BeaconStateCapella, BeaconStateDeneb, BeaconStateElectra, BeaconStateExecutions, BeaconStateFulu, BeaconStateGloas, BeaconStatePhase0, } from "./cache/types.js";
|
|
4
|
+
export type { BeaconStateAllForks, BeaconStateAltair, BeaconStateBellatrix, BeaconStateCapella, BeaconStateDeneb, BeaconStateElectra, BeaconStateExecutions, BeaconStateFulu, BeaconStateGloas, BeaconStatePhase0, ShufflingGetter, } from "./cache/types.js";
|
|
5
5
|
//# sourceMappingURL=types.d.ts.map
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAC,oBAAoB,EAAC,MAAM,iCAAiC,CAAC;AAC1E,YAAY,EACV,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAC,oBAAoB,EAAC,MAAM,iCAAiC,CAAC;AAC1E,YAAY,EACV,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,40 +1,6 @@
|
|
|
1
1
|
import { BeaconConfig } from "@lodestar/config";
|
|
2
2
|
import { Epoch, RootHex, ValidatorIndex } from "@lodestar/types";
|
|
3
|
-
import { GaugeExtra, Logger, NoLabels } from "@lodestar/utils";
|
|
4
3
|
import { BeaconStateAllForks } from "../types.js";
|
|
5
|
-
export interface ShufflingBuildProps {
|
|
6
|
-
state: BeaconStateAllForks;
|
|
7
|
-
activeIndices: Uint32Array;
|
|
8
|
-
}
|
|
9
|
-
export interface PublicShufflingCacheMetrics {
|
|
10
|
-
shufflingCache: {
|
|
11
|
-
nextShufflingNotOnEpochCache: GaugeExtra<NoLabels>;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
export interface IShufflingCache {
|
|
15
|
-
metrics: PublicShufflingCacheMetrics | null;
|
|
16
|
-
logger: Logger | null;
|
|
17
|
-
/**
|
|
18
|
-
* Gets a cached shuffling via the epoch and decision root. If the state and
|
|
19
|
-
* activeIndices are passed and a shuffling is not available it will be built
|
|
20
|
-
* synchronously. If the state is not passed and the shuffling is not available
|
|
21
|
-
* nothing will be returned.
|
|
22
|
-
*
|
|
23
|
-
* NOTE: If a shuffling is already queued and not calculated it will build and resolve
|
|
24
|
-
* the promise but the already queued build will happen at some later time
|
|
25
|
-
*/
|
|
26
|
-
getSync<T extends ShufflingBuildProps | undefined>(epoch: Epoch, decisionRoot: RootHex, buildProps?: T): T extends ShufflingBuildProps ? EpochShuffling : EpochShuffling | null;
|
|
27
|
-
/**
|
|
28
|
-
* Gets a cached shuffling via the epoch and decision root. Returns a promise
|
|
29
|
-
* for the shuffling if it hs not calculated yet. Returns null if a build has
|
|
30
|
-
* not been queued nor a shuffling was calculated.
|
|
31
|
-
*/
|
|
32
|
-
get(epoch: Epoch, decisionRoot: RootHex): Promise<EpochShuffling | null>;
|
|
33
|
-
/**
|
|
34
|
-
* Queue asynchronous build for an EpochShuffling
|
|
35
|
-
*/
|
|
36
|
-
build(epoch: Epoch, decisionRoot: RootHex, state: BeaconStateAllForks, activeIndices: Uint32Array): void;
|
|
37
|
-
}
|
|
38
4
|
/**
|
|
39
5
|
* Readonly interface for EpochShuffling.
|
|
40
6
|
*/
|
|
@@ -72,6 +38,7 @@ export type EpochShuffling = {
|
|
|
72
38
|
export declare function computeCommitteeCount(activeValidatorCount: number): number;
|
|
73
39
|
export declare function computeEpochShuffling(state: BeaconStateAllForks, activeIndices: Uint32Array, epoch: Epoch): EpochShuffling;
|
|
74
40
|
export declare function computeEpochShufflingAsync(state: BeaconStateAllForks, activeIndices: Uint32Array, epoch: Epoch): Promise<EpochShuffling>;
|
|
41
|
+
export declare function calculateDecisionRoot(state: BeaconStateAllForks, epoch: Epoch): RootHex;
|
|
75
42
|
/**
|
|
76
43
|
* Get the shuffling decision block root for the given epoch of given state
|
|
77
44
|
* - Special case close to genesis block, return the genesis block root
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epochShuffling.d.ts","sourceRoot":"","sources":["../../src/util/epochShuffling.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAS9C,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAM,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"epochShuffling.d.ts","sourceRoot":"","sources":["../../src/util/epochShuffling.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAS9C,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAM,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAC,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAMhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IAEb;;OAEG;IACH,aAAa,EAAE,WAAW,CAAC;IAE3B;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC;IAEvB;;;;;;;OAOG;IACH,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;IAE5B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAI1E;AA2BD,wBAAgB,qBAAqB,CAEnC,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,WAAW,EAC1B,KAAK,EAAE,KAAK,GACX,cAAc,CAWhB;AAED,wBAAsB,0BAA0B,CAE9C,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,WAAW,EAC1B,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,cAAc,CAAC,CAWzB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAGvF;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,KAAK,GACX,OAAO,CAIT"}
|
|
@@ -59,7 +59,7 @@ state, activeIndices, epoch) {
|
|
|
59
59
|
committeesPerSlot: committees[0].length,
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
-
function calculateDecisionRoot(state, epoch) {
|
|
62
|
+
export function calculateDecisionRoot(state, epoch) {
|
|
63
63
|
const pivotSlot = computeStartSlotAtEpoch(epoch - 1) - 1;
|
|
64
64
|
return toRootHex(getBlockRootAtSlot(state, pivotSlot));
|
|
65
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epochShuffling.js","sourceRoot":"","sources":["../../src/util/epochShuffling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAE,aAAa,EAAC,MAAM,gCAAgC,CAAC;AAEjF,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACpE,OAAO,
|
|
1
|
+
{"version":3,"file":"epochShuffling.js","sourceRoot":"","sources":["../../src/util/epochShuffling.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.39.0-dev.
|
|
14
|
+
"version": "1.39.0-dev.b2437a6348",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -62,14 +62,14 @@
|
|
|
62
62
|
"@chainsafe/pubkey-index-map": "^3.0.0",
|
|
63
63
|
"@chainsafe/ssz": "^1.2.2",
|
|
64
64
|
"@chainsafe/swap-or-not-shuffle": "^1.2.1",
|
|
65
|
-
"@lodestar/config": "^1.39.0-dev.
|
|
66
|
-
"@lodestar/params": "^1.39.0-dev.
|
|
67
|
-
"@lodestar/types": "^1.39.0-dev.
|
|
68
|
-
"@lodestar/utils": "^1.39.0-dev.
|
|
65
|
+
"@lodestar/config": "^1.39.0-dev.b2437a6348",
|
|
66
|
+
"@lodestar/params": "^1.39.0-dev.b2437a6348",
|
|
67
|
+
"@lodestar/types": "^1.39.0-dev.b2437a6348",
|
|
68
|
+
"@lodestar/utils": "^1.39.0-dev.b2437a6348",
|
|
69
69
|
"bigint-buffer": "^1.1.5"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@lodestar/api": "^1.39.0-dev.
|
|
72
|
+
"@lodestar/api": "^1.39.0-dev.b2437a6348"
|
|
73
73
|
},
|
|
74
74
|
"keywords": [
|
|
75
75
|
"ethereum",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"beacon",
|
|
78
78
|
"blockchain"
|
|
79
79
|
],
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "28f13a039524c73b6bf9af655a8d9861a0f0f273"
|
|
81
81
|
}
|
package/src/cache/epochCache.ts
CHANGED
|
@@ -32,7 +32,7 @@ import {getTotalSlashingsByIncrement} from "../epoch/processSlashings.js";
|
|
|
32
32
|
import {AttesterDuty, calculateCommitteeAssignments} from "../util/calculateCommitteeAssignments.js";
|
|
33
33
|
import {
|
|
34
34
|
EpochShuffling,
|
|
35
|
-
|
|
35
|
+
calculateDecisionRoot,
|
|
36
36
|
calculateShufflingDecisionRoot,
|
|
37
37
|
computeEpochShuffling,
|
|
38
38
|
} from "../util/epochShuffling.js";
|
|
@@ -61,7 +61,7 @@ import {
|
|
|
61
61
|
computeSyncCommitteeCache,
|
|
62
62
|
getSyncCommitteeCache,
|
|
63
63
|
} from "./syncCommitteeCache.js";
|
|
64
|
-
import {BeaconStateAllForks, BeaconStateAltair, BeaconStateGloas} from "./types.js";
|
|
64
|
+
import {BeaconStateAllForks, BeaconStateAltair, BeaconStateGloas, ShufflingGetter} from "./types.js";
|
|
65
65
|
|
|
66
66
|
/** `= PROPOSER_WEIGHT / (WEIGHT_DENOMINATOR - PROPOSER_WEIGHT)` */
|
|
67
67
|
export const PROPOSER_WEIGHT_FACTOR = PROPOSER_WEIGHT / (WEIGHT_DENOMINATOR - PROPOSER_WEIGHT);
|
|
@@ -70,12 +70,12 @@ export type EpochCacheImmutableData = {
|
|
|
70
70
|
config: BeaconConfig;
|
|
71
71
|
pubkey2index: PubkeyIndexMap;
|
|
72
72
|
index2pubkey: Index2PubkeyCache;
|
|
73
|
-
shufflingCache?: IShufflingCache;
|
|
74
73
|
};
|
|
75
74
|
|
|
76
75
|
export type EpochCacheOpts = {
|
|
77
76
|
skipSyncCommitteeCache?: boolean;
|
|
78
77
|
skipSyncPubkeys?: boolean;
|
|
78
|
+
shufflingGetter?: ShufflingGetter;
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
/** Defers computing proposers by persisting only the seed, and dropping it once indexes are computed */
|
|
@@ -117,12 +117,6 @@ export class EpochCache {
|
|
|
117
117
|
* $VALIDATOR_COUNT x BLST deserialized pubkey (Jacobian coordinates)
|
|
118
118
|
*/
|
|
119
119
|
index2pubkey: Index2PubkeyCache;
|
|
120
|
-
/**
|
|
121
|
-
* ShufflingCache is passed in from `beacon-node` so should be available at runtime but may not be
|
|
122
|
-
* present during testing.
|
|
123
|
-
*/
|
|
124
|
-
shufflingCache?: IShufflingCache;
|
|
125
|
-
|
|
126
120
|
/**
|
|
127
121
|
* Indexes of the block proposers for the current epoch.
|
|
128
122
|
* For pre-fulu, this is computed and cached from the current shuffling.
|
|
@@ -161,7 +155,7 @@ export class EpochCache {
|
|
|
161
155
|
/** Same as previousShuffling */
|
|
162
156
|
currentShuffling: EpochShuffling;
|
|
163
157
|
/** Same as previousShuffling */
|
|
164
|
-
nextShuffling: EpochShuffling
|
|
158
|
+
nextShuffling: EpochShuffling;
|
|
165
159
|
/**
|
|
166
160
|
* Cache nextActiveIndices so that in afterProcessEpoch the next shuffling can be build synchronously
|
|
167
161
|
* in case it is not built or the ShufflingCache is not available
|
|
@@ -254,7 +248,6 @@ export class EpochCache {
|
|
|
254
248
|
config: BeaconConfig;
|
|
255
249
|
pubkey2index: PubkeyIndexMap;
|
|
256
250
|
index2pubkey: Index2PubkeyCache;
|
|
257
|
-
shufflingCache?: IShufflingCache;
|
|
258
251
|
proposers: number[];
|
|
259
252
|
proposersPrevEpoch: number[] | null;
|
|
260
253
|
proposersNextEpoch: ProposersDeferred;
|
|
@@ -263,7 +256,7 @@ export class EpochCache {
|
|
|
263
256
|
nextDecisionRoot: RootHex;
|
|
264
257
|
previousShuffling: EpochShuffling;
|
|
265
258
|
currentShuffling: EpochShuffling;
|
|
266
|
-
nextShuffling: EpochShuffling
|
|
259
|
+
nextShuffling: EpochShuffling;
|
|
267
260
|
nextActiveIndices: Uint32Array;
|
|
268
261
|
effectiveBalanceIncrements: EffectiveBalanceIncrements;
|
|
269
262
|
totalSlashingsByIncrement: number;
|
|
@@ -286,7 +279,6 @@ export class EpochCache {
|
|
|
286
279
|
this.config = data.config;
|
|
287
280
|
this.pubkey2index = data.pubkey2index;
|
|
288
281
|
this.index2pubkey = data.index2pubkey;
|
|
289
|
-
this.shufflingCache = data.shufflingCache;
|
|
290
282
|
this.proposers = data.proposers;
|
|
291
283
|
this.proposersPrevEpoch = data.proposersPrevEpoch;
|
|
292
284
|
this.proposersNextEpoch = data.proposersNextEpoch;
|
|
@@ -324,7 +316,7 @@ export class EpochCache {
|
|
|
324
316
|
*/
|
|
325
317
|
static createFromState(
|
|
326
318
|
state: BeaconStateAllForks,
|
|
327
|
-
{config, pubkey2index, index2pubkey
|
|
319
|
+
{config, pubkey2index, index2pubkey}: EpochCacheImmutableData,
|
|
328
320
|
opts?: EpochCacheOpts
|
|
329
321
|
): EpochCache {
|
|
330
322
|
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
@@ -351,14 +343,15 @@ export class EpochCache {
|
|
|
351
343
|
const currentActiveIndicesAsNumberArray: ValidatorIndex[] = [];
|
|
352
344
|
const nextActiveIndicesAsNumberArray: ValidatorIndex[] = [];
|
|
353
345
|
|
|
354
|
-
// BeaconChain could provide a shuffling
|
|
346
|
+
// BeaconChain could provide a shuffling getter to avoid re-computing shuffling every epoch
|
|
355
347
|
// in that case, we don't need to compute shufflings again
|
|
348
|
+
const shufflingGetter = opts?.shufflingGetter;
|
|
356
349
|
const previousDecisionRoot = calculateShufflingDecisionRoot(config, state, previousEpoch);
|
|
357
|
-
const cachedPreviousShuffling =
|
|
350
|
+
const cachedPreviousShuffling = shufflingGetter?.(previousEpoch, previousDecisionRoot);
|
|
358
351
|
const currentDecisionRoot = calculateShufflingDecisionRoot(config, state, currentEpoch);
|
|
359
|
-
const cachedCurrentShuffling =
|
|
352
|
+
const cachedCurrentShuffling = shufflingGetter?.(currentEpoch, currentDecisionRoot);
|
|
360
353
|
const nextDecisionRoot = calculateShufflingDecisionRoot(config, state, nextEpoch);
|
|
361
|
-
const cachedNextShuffling =
|
|
354
|
+
const cachedNextShuffling = shufflingGetter?.(nextEpoch, nextDecisionRoot);
|
|
362
355
|
|
|
363
356
|
for (let i = 0; i < validatorCount; i++) {
|
|
364
357
|
const validator = validators[i];
|
|
@@ -366,8 +359,7 @@ export class EpochCache {
|
|
|
366
359
|
// Note: Not usable for fork-choice balances since in-active validators are not zero'ed
|
|
367
360
|
effectiveBalanceIncrements[i] = Math.floor(validator.effectiveBalance / EFFECTIVE_BALANCE_INCREMENT);
|
|
368
361
|
|
|
369
|
-
//
|
|
370
|
-
// skip doing that if we already have cached shufflings
|
|
362
|
+
// Collect active indices for each epoch to compute shufflings
|
|
371
363
|
if (cachedPreviousShuffling == null && isActiveValidator(validator, previousEpoch)) {
|
|
372
364
|
previousActiveIndicesAsNumberArray.push(i);
|
|
373
365
|
}
|
|
@@ -402,47 +394,19 @@ export class EpochCache {
|
|
|
402
394
|
}
|
|
403
395
|
|
|
404
396
|
const nextActiveIndices = new Uint32Array(nextActiveIndicesAsNumberArray);
|
|
405
|
-
let previousShuffling: EpochShuffling;
|
|
406
|
-
let currentShuffling: EpochShuffling;
|
|
407
|
-
let nextShuffling: EpochShuffling;
|
|
408
|
-
|
|
409
|
-
if (!shufflingCache) {
|
|
410
|
-
// Only for testing. shufflingCache should always be available in prod
|
|
411
|
-
previousShuffling = computeEpochShuffling(
|
|
412
|
-
state,
|
|
413
|
-
new Uint32Array(previousActiveIndicesAsNumberArray),
|
|
414
|
-
previousEpoch
|
|
415
|
-
);
|
|
416
397
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
398
|
+
// Use cached shufflings if available, otherwise compute
|
|
399
|
+
const currentShuffling =
|
|
400
|
+
cachedCurrentShuffling ??
|
|
401
|
+
computeEpochShuffling(state, new Uint32Array(currentActiveIndicesAsNumberArray), currentEpoch);
|
|
420
402
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
?
|
|
425
|
-
:
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
previousShuffling = cachedPreviousShuffling
|
|
431
|
-
? cachedPreviousShuffling
|
|
432
|
-
: isGenesis
|
|
433
|
-
? currentShuffling
|
|
434
|
-
: shufflingCache.getSync(previousEpoch, previousDecisionRoot, {
|
|
435
|
-
state,
|
|
436
|
-
activeIndices: new Uint32Array(previousActiveIndicesAsNumberArray),
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
nextShuffling = cachedNextShuffling
|
|
440
|
-
? cachedNextShuffling
|
|
441
|
-
: shufflingCache.getSync(nextEpoch, nextDecisionRoot, {
|
|
442
|
-
state,
|
|
443
|
-
activeIndices: nextActiveIndices,
|
|
444
|
-
});
|
|
445
|
-
}
|
|
403
|
+
const previousShuffling =
|
|
404
|
+
cachedPreviousShuffling ??
|
|
405
|
+
(isGenesis
|
|
406
|
+
? currentShuffling
|
|
407
|
+
: computeEpochShuffling(state, new Uint32Array(previousActiveIndicesAsNumberArray), previousEpoch));
|
|
408
|
+
|
|
409
|
+
const nextShuffling = cachedNextShuffling ?? computeEpochShuffling(state, nextActiveIndices, nextEpoch);
|
|
446
410
|
|
|
447
411
|
const currentProposerSeed = getSeed(state, currentEpoch, DOMAIN_BEACON_PROPOSER);
|
|
448
412
|
|
|
@@ -549,7 +513,6 @@ export class EpochCache {
|
|
|
549
513
|
config,
|
|
550
514
|
pubkey2index,
|
|
551
515
|
index2pubkey,
|
|
552
|
-
shufflingCache,
|
|
553
516
|
proposers,
|
|
554
517
|
// On first epoch, set to null to prevent unnecessary work since this is only used for metrics
|
|
555
518
|
proposersPrevEpoch: null,
|
|
@@ -593,7 +556,6 @@ export class EpochCache {
|
|
|
593
556
|
// Common append-only structures shared with all states, no need to clone
|
|
594
557
|
pubkey2index: this.pubkey2index,
|
|
595
558
|
index2pubkey: this.index2pubkey,
|
|
596
|
-
shufflingCache: this.shufflingCache,
|
|
597
559
|
// Immutable data
|
|
598
560
|
proposers: this.proposers,
|
|
599
561
|
proposersPrevEpoch: this.proposersPrevEpoch,
|
|
@@ -652,62 +614,26 @@ export class EpochCache {
|
|
|
652
614
|
this.previousShuffling = this.currentShuffling;
|
|
653
615
|
this.previousDecisionRoot = this.currentDecisionRoot;
|
|
654
616
|
|
|
655
|
-
// move next to current
|
|
617
|
+
// move next to current
|
|
656
618
|
this.currentDecisionRoot = this.nextDecisionRoot;
|
|
657
|
-
|
|
658
|
-
// was already pulled from the ShufflingCache to the EpochCache (should be in most cases)
|
|
659
|
-
this.currentShuffling = this.nextShuffling;
|
|
660
|
-
} else {
|
|
661
|
-
this.shufflingCache?.metrics?.shufflingCache.nextShufflingNotOnEpochCache.inc();
|
|
662
|
-
this.currentShuffling =
|
|
663
|
-
this.shufflingCache?.getSync(upcomingEpoch, this.currentDecisionRoot, {
|
|
664
|
-
state,
|
|
665
|
-
// have to use the "nextActiveIndices" that were saved in the last transition here to calculate
|
|
666
|
-
// the upcoming shuffling if it is not already built (similar condition to the below computation)
|
|
667
|
-
activeIndices: this.nextActiveIndices,
|
|
668
|
-
}) ??
|
|
669
|
-
// allow for this case during testing where the ShufflingCache is not present, may affect perf testing
|
|
670
|
-
// so should be taken into account when structuring tests. Should not affect unit or other tests though
|
|
671
|
-
computeEpochShuffling(state, this.nextActiveIndices, upcomingEpoch);
|
|
672
|
-
}
|
|
619
|
+
this.currentShuffling = this.nextShuffling;
|
|
673
620
|
|
|
674
|
-
//
|
|
675
|
-
|
|
621
|
+
// Compute shuffling for epoch n+2
|
|
622
|
+
//
|
|
623
|
+
// Post-Fulu (EIP-7917), the beacon state includes a `proposer_lookahead` field that stores
|
|
624
|
+
// proposer indices for MIN_SEED_LOOKAHEAD + 1 epochs ahead (2 epochs with MIN_SEED_LOOKAHEAD=1).
|
|
625
|
+
// At each epoch boundary, processProposerLookahead() shifts out the current epoch's proposers
|
|
626
|
+
// and appends new proposers for epoch n + MIN_SEED_LOOKAHEAD + 1 (i.e., epoch n+2).
|
|
627
|
+
//
|
|
628
|
+
// processProposerLookahead() already computes the n+2 shuffling and stores it in
|
|
629
|
+
// epochTransitionCache.nextShuffling. Reuse it here to avoid duplicate computation.
|
|
630
|
+
// Pre-Fulu, we need to compute it here since processProposerLookahead doesn't run.
|
|
631
|
+
//
|
|
632
|
+
// See: https://eips.ethereum.org/EIPS/eip-7917
|
|
633
|
+
this.nextDecisionRoot = calculateDecisionRoot(state, epochAfterUpcoming);
|
|
676
634
|
this.nextActiveIndices = epochTransitionCache.nextShufflingActiveIndices;
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
this.nextShuffling = this.shufflingCache.getSync(epochAfterUpcoming, this.nextDecisionRoot, {
|
|
680
|
-
state,
|
|
681
|
-
activeIndices: this.nextActiveIndices,
|
|
682
|
-
});
|
|
683
|
-
} else {
|
|
684
|
-
this.nextShuffling = null;
|
|
685
|
-
// This promise will resolve immediately after the synchronous code of the state-transition runs. Until
|
|
686
|
-
// the build is done on a worker thread it will be calculated immediately after the epoch transition
|
|
687
|
-
// completes. Once the work is done concurrently it should be ready by time this get runs so the promise
|
|
688
|
-
// will resolve directly on the next spin of the event loop because the epoch transition and shuffling take
|
|
689
|
-
// about the same time to calculate so theoretically its ready now. Do not await here though in case it
|
|
690
|
-
// is not ready yet as the transition must not be asynchronous.
|
|
691
|
-
this.shufflingCache
|
|
692
|
-
.get(epochAfterUpcoming, this.nextDecisionRoot)
|
|
693
|
-
.then((shuffling) => {
|
|
694
|
-
if (!shuffling) {
|
|
695
|
-
throw new Error("EpochShuffling not returned from get in afterProcessEpoch");
|
|
696
|
-
}
|
|
697
|
-
this.nextShuffling = shuffling;
|
|
698
|
-
})
|
|
699
|
-
.catch((err) => {
|
|
700
|
-
this.shufflingCache?.logger?.error(
|
|
701
|
-
"EPOCH_CONTEXT_SHUFFLING_BUILD_ERROR",
|
|
702
|
-
{epoch: epochAfterUpcoming, decisionRoot: epochTransitionCache.nextShufflingDecisionRoot},
|
|
703
|
-
err
|
|
704
|
-
);
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
} else {
|
|
708
|
-
// Only for testing. shufflingCache should always be available in prod
|
|
709
|
-
this.nextShuffling = computeEpochShuffling(state, this.nextActiveIndices, epochAfterUpcoming);
|
|
710
|
-
}
|
|
635
|
+
this.nextShuffling =
|
|
636
|
+
epochTransitionCache.nextShuffling ?? computeEpochShuffling(state, this.nextActiveIndices, epochAfterUpcoming);
|
|
711
637
|
|
|
712
638
|
// TODO: DEDUPLICATE from createEpochCache
|
|
713
639
|
//
|
|
@@ -1100,10 +1026,6 @@ export class EpochCache {
|
|
|
1100
1026
|
case this.epoch:
|
|
1101
1027
|
return this.currentShuffling;
|
|
1102
1028
|
case this.nextEpoch:
|
|
1103
|
-
if (!this.nextShuffling) {
|
|
1104
|
-
this.nextShuffling =
|
|
1105
|
-
this.shufflingCache?.getSync(this.nextEpoch, this.getShufflingDecisionRoot(this.nextEpoch)) ?? null;
|
|
1106
|
-
}
|
|
1107
1029
|
return this.nextShuffling;
|
|
1108
1030
|
default:
|
|
1109
1031
|
return null;
|