@lodestar/state-transition 1.51.0-dev.2593063a82 → 1.51.0-dev.2b933d3b9a
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.map +1 -1
- package/lib/block/processAttestationsAltair.js +3 -1
- package/lib/block/processAttestationsAltair.js.map +1 -1
- package/lib/cache/epochCache.d.ts +3 -0
- package/lib/cache/epochCache.d.ts.map +1 -1
- package/lib/cache/epochCache.js +11 -4
- package/lib/cache/epochCache.js.map +1 -1
- package/lib/cache/epochTransitionCache.d.ts.map +1 -1
- package/lib/cache/epochTransitionCache.js +2 -1
- package/lib/cache/epochTransitionCache.js.map +1 -1
- package/lib/epoch/getRewardsAndPenalties.d.ts.map +1 -1
- package/lib/epoch/getRewardsAndPenalties.js +9 -2
- package/lib/epoch/getRewardsAndPenalties.js.map +1 -1
- package/lib/metrics.d.ts +1 -1
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js +4 -4
- package/lib/metrics.js.map +1 -1
- package/lib/rewards/attestationsRewards.d.ts.map +1 -1
- package/lib/rewards/attestationsRewards.js +10 -3
- package/lib/rewards/attestationsRewards.js.map +1 -1
- package/lib/signatureSets/inclusionList.d.ts +5 -0
- package/lib/signatureSets/inclusionList.d.ts.map +1 -0
- package/lib/signatureSets/inclusionList.js +14 -0
- package/lib/signatureSets/inclusionList.js.map +1 -0
- package/lib/signatureSets/index.d.ts +1 -0
- package/lib/signatureSets/index.d.ts.map +1 -1
- package/lib/signatureSets/index.js +1 -0
- package/lib/signatureSets/index.js.map +1 -1
- package/lib/stateTransition.js +2 -2
- package/lib/stateTransition.js.map +1 -1
- package/lib/util/altair.d.ts +3 -1
- package/lib/util/altair.d.ts.map +1 -1
- package/lib/util/altair.js +7 -4
- package/lib/util/altair.js.map +1 -1
- package/lib/util/clock.js +1 -1
- package/lib/util/clock.js.map +1 -1
- package/lib/util/inclusionListCommittee.d.ts +9 -0
- package/lib/util/inclusionListCommittee.d.ts.map +1 -0
- package/lib/util/inclusionListCommittee.js +18 -0
- package/lib/util/inclusionListCommittee.js.map +1 -0
- 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/shuffling.d.ts +3 -0
- package/lib/util/shuffling.d.ts.map +1 -1
- package/lib/util/shuffling.js +41 -1
- package/lib/util/shuffling.js.map +1 -1
- package/lib/util/slot.d.ts +15 -1
- package/lib/util/slot.d.ts.map +1 -1
- package/lib/util/slot.js +66 -6
- package/lib/util/slot.js.map +1 -1
- package/lib/util/syncCommittee.d.ts +4 -3
- package/lib/util/syncCommittee.d.ts.map +1 -1
- package/lib/util/syncCommittee.js +9 -7
- package/lib/util/syncCommittee.js.map +1 -1
- package/lib/util/validator.d.ts +1 -1
- package/lib/util/validator.d.ts.map +1 -1
- package/lib/util/validator.js +32 -11
- package/lib/util/validator.js.map +1 -1
- package/lib/util/weakSubjectivity.d.ts.map +1 -1
- package/lib/util/weakSubjectivity.js +4 -3
- package/lib/util/weakSubjectivity.js.map +1 -1
- package/package.json +7 -7
- package/src/block/processAttestationsAltair.ts +4 -1
- package/src/cache/epochCache.ts +28 -4
- package/src/cache/epochTransitionCache.ts +2 -1
- package/src/epoch/getRewardsAndPenalties.ts +11 -1
- package/src/metrics.ts +5 -4
- package/src/rewards/attestationsRewards.ts +12 -1
- package/src/signatureSets/inclusionList.ts +20 -0
- package/src/signatureSets/index.ts +1 -0
- package/src/stateTransition.ts +2 -2
- package/src/util/altair.ts +15 -4
- package/src/util/clock.ts +1 -1
- package/src/util/inclusionListCommittee.ts +17 -0
- package/src/util/index.ts +1 -0
- package/src/util/shuffling.ts +46 -1
- package/src/util/slot.ts +72 -7
- package/src/util/syncCommittee.ts +21 -9
- package/src/util/validator.ts +47 -20
- package/src/util/weakSubjectivity.ts +3 -3
package/lib/util/validator.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { EFFECTIVE_BALANCE_INCREMENT, ForkSeq, MAX_EFFECTIVE_BALANCE, MAX_EFFECTIVE_BALANCE_ELECTRA, MIN_ACTIVATION_BALANCE, } from "@lodestar/params";
|
|
1
|
+
import { EFFECTIVE_BALANCE_INCREMENT, ForkSeq, GENESIS_EPOCH, MAX_EFFECTIVE_BALANCE, MAX_EFFECTIVE_BALANCE_ELECTRA, MIN_ACTIVATION_BALANCE, } from "@lodestar/params";
|
|
2
2
|
import { intDiv } from "@lodestar/utils";
|
|
3
3
|
import { hasEth1WithdrawalCredential } from "./capella.js";
|
|
4
4
|
import { hasCompoundingWithdrawalCredential, hasExecutionWithdrawalCredential } from "./electra.js";
|
|
5
|
+
import { getSlotDurationMsAtEpoch } from "./slot.js";
|
|
5
6
|
/**
|
|
6
7
|
* Check if [[validator]] is active
|
|
7
8
|
*/
|
|
@@ -57,14 +58,23 @@ export function getActivationExitChurnLimit(epochCtx) {
|
|
|
57
58
|
* https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.6/specs/gloas/beacon-chain.md#new-get_activation_churn_limit
|
|
58
59
|
*/
|
|
59
60
|
export function getActivationChurnLimit(epochCtx) {
|
|
60
|
-
const
|
|
61
|
-
|
|
61
|
+
const { config, epoch, totalActiveBalanceIncrements } = epochCtx;
|
|
62
|
+
const churnByBalance = Math.floor((totalActiveBalanceIncrements / config.CHURN_LIMIT_QUOTIENT_GLOAS) * EFFECTIVE_BALANCE_INCREMENT);
|
|
63
|
+
const churn = Math.min(config.MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS, Math.max(churnByBalance, config.MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA));
|
|
64
|
+
// Scale by the slot duration ratio, rounding to the increment once after scaling
|
|
65
|
+
const scaled = Math.floor((churn * getSlotDurationMsAtEpoch(config, epoch)) / getSlotDurationMsAtEpoch(config, GENESIS_EPOCH));
|
|
66
|
+
return scaled - (scaled % EFFECTIVE_BALANCE_INCREMENT);
|
|
62
67
|
}
|
|
63
68
|
/**
|
|
64
69
|
* https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.6/specs/gloas/beacon-chain.md#new-get_exit_churn_limit
|
|
65
70
|
*/
|
|
66
71
|
export function getExitChurnLimit(epochCtx) {
|
|
67
|
-
|
|
72
|
+
const { config, epoch, totalActiveBalanceIncrements } = epochCtx;
|
|
73
|
+
const churnByBalance = Math.floor((totalActiveBalanceIncrements / config.CHURN_LIMIT_QUOTIENT_GLOAS) * EFFECTIVE_BALANCE_INCREMENT);
|
|
74
|
+
const churn = Math.max(churnByBalance, config.MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA);
|
|
75
|
+
// Scale by the slot duration ratio, rounding to the increment once after scaling
|
|
76
|
+
const scaled = Math.floor((churn * getSlotDurationMsAtEpoch(config, epoch)) / getSlotDurationMsAtEpoch(config, GENESIS_EPOCH));
|
|
77
|
+
return scaled - (scaled % EFFECTIVE_BALANCE_INCREMENT);
|
|
68
78
|
}
|
|
69
79
|
/**
|
|
70
80
|
* Spec (electra): get_consolidation_churn_limit (uses combined balance churn minus activation+exit churn)
|
|
@@ -72,18 +82,29 @@ export function getExitChurnLimit(epochCtx) {
|
|
|
72
82
|
*/
|
|
73
83
|
export function getConsolidationChurnLimit(fork, epochCtx) {
|
|
74
84
|
if (fork >= ForkSeq.gloas) {
|
|
75
|
-
|
|
76
|
-
|
|
85
|
+
const { config, epoch, totalActiveBalanceIncrements } = epochCtx;
|
|
86
|
+
// No MIN floor in gloas
|
|
87
|
+
const churn = Math.floor((totalActiveBalanceIncrements / config.CONSOLIDATION_CHURN_LIMIT_QUOTIENT) * EFFECTIVE_BALANCE_INCREMENT);
|
|
88
|
+
// Scale by the slot duration ratio, rounding to the increment once after scaling
|
|
89
|
+
const scaled = Math.floor((churn * getSlotDurationMsAtEpoch(config, epoch)) / getSlotDurationMsAtEpoch(config, GENESIS_EPOCH));
|
|
90
|
+
return scaled - (scaled % EFFECTIVE_BALANCE_INCREMENT);
|
|
77
91
|
}
|
|
78
92
|
return getBalanceChurnLimitFromCache(epochCtx) - getActivationExitChurnLimit(epochCtx);
|
|
79
93
|
}
|
|
80
94
|
// NOTE: duplicates the quotient/min choices in get{Exit,Activation,Consolidation}ChurnLimit.
|
|
81
|
-
export function getGloasChurnLimits(config, totalActiveBalanceIncrements) {
|
|
82
|
-
const
|
|
95
|
+
export function getGloasChurnLimits(config, epoch, totalActiveBalanceIncrements) {
|
|
96
|
+
const ratioNumerator = getSlotDurationMsAtEpoch(config, epoch);
|
|
97
|
+
const ratioDenominator = getSlotDurationMsAtEpoch(config, GENESIS_EPOCH);
|
|
98
|
+
const exitUnscaled = Math.max(Math.floor((totalActiveBalanceIncrements / config.CHURN_LIMIT_QUOTIENT_GLOAS) * EFFECTIVE_BALANCE_INCREMENT), config.MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA);
|
|
99
|
+
const activationUnscaled = Math.min(config.MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS, exitUnscaled);
|
|
100
|
+
const consolidationUnscaled = Math.floor((totalActiveBalanceIncrements / config.CONSOLIDATION_CHURN_LIMIT_QUOTIENT) * EFFECTIVE_BALANCE_INCREMENT);
|
|
101
|
+
const exit = Math.floor((exitUnscaled * ratioNumerator) / ratioDenominator);
|
|
102
|
+
const activation = Math.floor((activationUnscaled * ratioNumerator) / ratioDenominator);
|
|
103
|
+
const consolidation = Math.floor((consolidationUnscaled * ratioNumerator) / ratioDenominator);
|
|
83
104
|
return {
|
|
84
|
-
exit,
|
|
85
|
-
activation:
|
|
86
|
-
consolidation:
|
|
105
|
+
exit: exit - (exit % EFFECTIVE_BALANCE_INCREMENT),
|
|
106
|
+
activation: activation - (activation % EFFECTIVE_BALANCE_INCREMENT),
|
|
107
|
+
consolidation: consolidation - (consolidation % EFFECTIVE_BALANCE_INCREMENT),
|
|
87
108
|
};
|
|
88
109
|
}
|
|
89
110
|
export function getMaxEffectiveBalance(withdrawalCredentials) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/util/validator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,OAAO,EACP,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAC,2BAA2B,EAAC,MAAM,cAAc,CAAC;AACzD,OAAO,EAAC,kCAAkC,EAAE,gCAAgC,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/util/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weakSubjectivity.d.ts","sourceRoot":"","sources":["../../src/util/weakSubjectivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"weakSubjectivity.d.ts","sourceRoot":"","sources":["../../src/util/weakSubjectivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAUjD,OAAO,EAAC,KAAK,EAAE,IAAI,EAAQ,WAAW,EAAM,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAC,mBAAmB,EAAE,yBAAyB,EAAC,MAAM,aAAa,CAAC;AAG3E,OAAO,EAAC,kBAAkB,EAA4D,MAAM,eAAe,CAAC;AAY5G,eAAO,MAAM,WAAW,QAAU,CAAC;AAGnC;;;GAGG;AACH,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,yBAAyB,GAC/B,KAAK,CAEP;AAED;;;;;;;GAOG;AACH,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,yBAAyB,GAC/B,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAgBzG;AAwCD,wBAAgB,mDAAmD,CACjE,oBAAoB,EAAE,MAAM,EAC5B,uBAAuB,EAAE,MAAM,EAC/B,UAAU,EAAE,MAAM,EAClB,uBAAuB,EAAE,MAAM,GAC9B,MAAM,CAuBR;AAED,wBAAgB,oDAAoD,CAClE,uBAAuB,EAAE,MAAM,EAE/B,iBAAiB,EAAE,MAAM,EACzB,uBAAuB,EAAE,MAAM,GAC9B,MAAM,CAOR;AAED,wBAAgB,kDAAkD,CAChE,uBAAuB,EAAE,MAAM,EAC/B,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,MAAM,EAC5B,uBAAuB,EAAE,MAAM,EAC/B,uBAAuB,EAAE,MAAM,GAC9B,MAAM,CAOR;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAMnE;AAED,MAAM,MAAM,uBAAuB,GAAG;IAAC,eAAe,EAAE,KAAK,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC;AAEpG,2DAA2D;AAC3D,wBAAgB,4CAA4C,CAC1D,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,kBAAkB,GAC3B,uBAAuB,GAAG,IAAI,CAOhC;AAED,wBAAgB,yCAAyC,CACvD,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,uBAAuB,EAChC,GAAG,GAAE,WAA+B,GACnC,OAAO,CAGT"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { EFFECTIVE_BALANCE_INCREMENT, ForkSeq,
|
|
1
|
+
import { EFFECTIVE_BALANCE_INCREMENT, ForkSeq, MAX_DEPOSITS, MAX_EFFECTIVE_BALANCE, SLOTS_PER_EPOCH, isForkPostElectra, isForkPostGloas, } from "@lodestar/params";
|
|
2
2
|
import { ssz } from "@lodestar/types";
|
|
3
3
|
import { ZERO_HASH } from "../constants/constants.js";
|
|
4
4
|
import { computeCheckpointEpochAtStateSlot, computeEpochAtSlot, getCurrentEpoch } from "./epoch.js";
|
|
5
|
+
import { computeSlotAtTimeMs } from "./slot.js";
|
|
5
6
|
import { getStateTypeFromBytes, scanActiveValidatorsFromStateBytes } from "./sszBytes.js";
|
|
6
7
|
import { getActivationChurnLimit, getActiveValidatorIndices, getBalanceChurnLimit, getBalanceChurnLimitFromCache, getChurnLimit, getConsolidationChurnLimit, getExitChurnLimit, getGloasChurnLimits, } from "./validator.js";
|
|
7
8
|
export const ETH_TO_GWEI = 10 ** 9;
|
|
@@ -50,7 +51,7 @@ export function computeWeakSubjectivityPeriod(config, state) {
|
|
|
50
51
|
}
|
|
51
52
|
function computeWeakSubjectivityPeriodFromActiveValidators(config, slot, { activeValidatorCount, totalActiveBalanceIncrements, }) {
|
|
52
53
|
const fork = config.getForkName(slot);
|
|
53
|
-
const churnLimitsGloas = getGloasChurnLimits(config, totalActiveBalanceIncrements);
|
|
54
|
+
const churnLimitsGloas = getGloasChurnLimits(config, computeEpochAtSlot(slot), totalActiveBalanceIncrements);
|
|
54
55
|
return isForkPostGloas(fork)
|
|
55
56
|
? computeWeakSubjectivityPeriodFromConstituentsGloas(totalActiveBalanceIncrements, churnLimitsGloas.exit, churnLimitsGloas.activation, churnLimitsGloas.consolidation, config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY)
|
|
56
57
|
: isForkPostElectra(fork)
|
|
@@ -113,7 +114,7 @@ export function computeWeakSubjectivitySummaryFromStateBytes(config, bytes, meta
|
|
|
113
114
|
return { checkpointEpoch: computeCheckpointEpochAtStateSlot(slot), genesisTime, period };
|
|
114
115
|
}
|
|
115
116
|
export function isWithinWeakSubjectivityPeriodFromSummary(config, summary, now = Date.now() / 1000) {
|
|
116
|
-
const clockSlot =
|
|
117
|
+
const clockSlot = computeSlotAtTimeMs(config, now * 1000, summary.genesisTime * 1000);
|
|
117
118
|
return computeEpochAtSlot(clockSlot) <= summary.checkpointEpoch + summary.period;
|
|
118
119
|
}
|
|
119
120
|
//# sourceMappingURL=weakSubjectivity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weakSubjectivity.js","sourceRoot":"","sources":["../../src/util/weakSubjectivity.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,OAAO,EACP,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"weakSubjectivity.js","sourceRoot":"","sources":["../../src/util/weakSubjectivity.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.51.0-dev.
|
|
14
|
+
"version": "1.51.0-dev.2b933d3b9a",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -69,14 +69,14 @@
|
|
|
69
69
|
"@chainsafe/lodestar-z": "catalog:",
|
|
70
70
|
"@chainsafe/persistent-merkle-tree": "^1.3.1",
|
|
71
71
|
"@chainsafe/ssz": "^1.8.1",
|
|
72
|
-
"@lodestar/config": "^1.51.0-dev.
|
|
73
|
-
"@lodestar/params": "^1.51.0-dev.
|
|
74
|
-
"@lodestar/types": "^1.51.0-dev.
|
|
75
|
-
"@lodestar/utils": "^1.51.0-dev.
|
|
72
|
+
"@lodestar/config": "^1.51.0-dev.2b933d3b9a",
|
|
73
|
+
"@lodestar/params": "^1.51.0-dev.2b933d3b9a",
|
|
74
|
+
"@lodestar/types": "^1.51.0-dev.2b933d3b9a",
|
|
75
|
+
"@lodestar/utils": "^1.51.0-dev.2b933d3b9a",
|
|
76
76
|
"@vekexasia/bigint-buffer2": "^1.1.1"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@lodestar/test-utils": "^1.51.0-dev.
|
|
79
|
+
"@lodestar/test-utils": "^1.51.0-dev.2b933d3b9a"
|
|
80
80
|
},
|
|
81
81
|
"keywords": [
|
|
82
82
|
"ethereum",
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"beacon",
|
|
85
85
|
"blockchain"
|
|
86
86
|
],
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "a052574f95ae3cd10608f7acd46f680792604377"
|
|
88
88
|
}
|
|
@@ -141,7 +141,10 @@ export function processAttestationsAltair(
|
|
|
141
141
|
|
|
142
142
|
// Do the discrete math inside the loop to ensure a deterministic result
|
|
143
143
|
const totalIncrements = totalBalanceIncrementsWithWeight;
|
|
144
|
-
|
|
144
|
+
// The proposer reward is priced at the attestation's target epoch
|
|
145
|
+
const proposerRewardNumerator =
|
|
146
|
+
totalIncrements *
|
|
147
|
+
(inCurrentEpoch ? state.epochCtx.baseRewardPerIncrement : state.epochCtx.baseRewardPerIncrementPrevEpoch);
|
|
145
148
|
proposerReward += Math.floor(proposerRewardNumerator / PROPOSER_REWARD_DOMINATOR);
|
|
146
149
|
|
|
147
150
|
if (fork >= ForkSeq.gloas) {
|
package/src/cache/epochCache.ts
CHANGED
|
@@ -178,6 +178,8 @@ export class EpochCache {
|
|
|
178
178
|
* Update freq: once per epoch after `process_effective_balance_updates()`
|
|
179
179
|
*/
|
|
180
180
|
baseRewardPerIncrement: number;
|
|
181
|
+
/** As baseRewardPerIncrement but priced at the previous epoch's slot duration */
|
|
182
|
+
baseRewardPerIncrementPrevEpoch: number;
|
|
181
183
|
/**
|
|
182
184
|
* Total active balance for current epoch, to be used instead of getTotalBalance()
|
|
183
185
|
*/
|
|
@@ -269,6 +271,7 @@ export class EpochCache {
|
|
|
269
271
|
syncParticipantReward: number;
|
|
270
272
|
syncProposerReward: number;
|
|
271
273
|
baseRewardPerIncrement: number;
|
|
274
|
+
baseRewardPerIncrementPrevEpoch: number;
|
|
272
275
|
totalActiveBalanceIncrements: number;
|
|
273
276
|
churnLimit: number;
|
|
274
277
|
activationChurnLimit: number;
|
|
@@ -302,6 +305,7 @@ export class EpochCache {
|
|
|
302
305
|
this.syncParticipantReward = data.syncParticipantReward;
|
|
303
306
|
this.syncProposerReward = data.syncProposerReward;
|
|
304
307
|
this.baseRewardPerIncrement = data.baseRewardPerIncrement;
|
|
308
|
+
this.baseRewardPerIncrementPrevEpoch = data.baseRewardPerIncrementPrevEpoch;
|
|
305
309
|
this.totalActiveBalanceIncrements = data.totalActiveBalanceIncrements;
|
|
306
310
|
this.churnLimit = data.churnLimit;
|
|
307
311
|
this.activationChurnLimit = data.activationChurnLimit;
|
|
@@ -452,9 +456,14 @@ export class EpochCache {
|
|
|
452
456
|
|
|
453
457
|
// Values syncParticipantReward, syncProposerReward, baseRewardPerIncrement are only used after altair.
|
|
454
458
|
// However, since they are very cheap to compute they are computed always to simplify upgradeState function.
|
|
455
|
-
const syncParticipantReward = computeSyncParticipantReward(totalActiveBalanceIncrements);
|
|
459
|
+
const syncParticipantReward = computeSyncParticipantReward(config, currentEpoch, totalActiveBalanceIncrements);
|
|
456
460
|
const syncProposerReward = Math.floor(syncParticipantReward * PROPOSER_WEIGHT_FACTOR);
|
|
457
|
-
const baseRewardPerIncrement = computeBaseRewardPerIncrement(totalActiveBalanceIncrements);
|
|
461
|
+
const baseRewardPerIncrement = computeBaseRewardPerIncrement(config, currentEpoch, totalActiveBalanceIncrements);
|
|
462
|
+
const baseRewardPerIncrementPrevEpoch = computeBaseRewardPerIncrement(
|
|
463
|
+
config,
|
|
464
|
+
Math.max(currentEpoch - 1, GENESIS_EPOCH),
|
|
465
|
+
totalActiveBalanceIncrements
|
|
466
|
+
);
|
|
458
467
|
|
|
459
468
|
let currentSyncCommitteeIndexed: SyncCommitteeCache;
|
|
460
469
|
let nextSyncCommitteeIndexed: SyncCommitteeCache;
|
|
@@ -542,6 +551,7 @@ export class EpochCache {
|
|
|
542
551
|
syncParticipantReward,
|
|
543
552
|
syncProposerReward,
|
|
544
553
|
baseRewardPerIncrement,
|
|
554
|
+
baseRewardPerIncrementPrevEpoch,
|
|
545
555
|
totalActiveBalanceIncrements,
|
|
546
556
|
churnLimit,
|
|
547
557
|
activationChurnLimit,
|
|
@@ -591,6 +601,7 @@ export class EpochCache {
|
|
|
591
601
|
syncParticipantReward: this.syncParticipantReward,
|
|
592
602
|
syncProposerReward: this.syncProposerReward,
|
|
593
603
|
baseRewardPerIncrement: this.baseRewardPerIncrement,
|
|
604
|
+
baseRewardPerIncrementPrevEpoch: this.baseRewardPerIncrementPrevEpoch,
|
|
594
605
|
totalActiveBalanceIncrements: this.totalActiveBalanceIncrements,
|
|
595
606
|
churnLimit: this.churnLimit,
|
|
596
607
|
activationChurnLimit: this.activationChurnLimit,
|
|
@@ -685,9 +696,22 @@ export class EpochCache {
|
|
|
685
696
|
|
|
686
697
|
this.totalActiveBalanceIncrements = epochTransitionCache.nextEpochTotalActiveBalanceByIncrement;
|
|
687
698
|
if (upcomingEpoch >= this.config.ALTAIR_FORK_EPOCH) {
|
|
688
|
-
this.syncParticipantReward = computeSyncParticipantReward(
|
|
699
|
+
this.syncParticipantReward = computeSyncParticipantReward(
|
|
700
|
+
this.config,
|
|
701
|
+
upcomingEpoch,
|
|
702
|
+
this.totalActiveBalanceIncrements
|
|
703
|
+
);
|
|
689
704
|
this.syncProposerReward = Math.floor(this.syncParticipantReward * PROPOSER_WEIGHT_FACTOR);
|
|
690
|
-
this.baseRewardPerIncrement = computeBaseRewardPerIncrement(
|
|
705
|
+
this.baseRewardPerIncrement = computeBaseRewardPerIncrement(
|
|
706
|
+
this.config,
|
|
707
|
+
upcomingEpoch,
|
|
708
|
+
this.totalActiveBalanceIncrements
|
|
709
|
+
);
|
|
710
|
+
this.baseRewardPerIncrementPrevEpoch = computeBaseRewardPerIncrement(
|
|
711
|
+
this.config,
|
|
712
|
+
Math.max(upcomingEpoch - 1, GENESIS_EPOCH),
|
|
713
|
+
this.totalActiveBalanceIncrements
|
|
714
|
+
);
|
|
691
715
|
}
|
|
692
716
|
|
|
693
717
|
this.previousTargetUnslashedBalanceIncrements = this.currentTargetUnslashedBalanceIncrements;
|
|
@@ -384,7 +384,8 @@ export function beforeProcessEpoch(
|
|
|
384
384
|
}
|
|
385
385
|
|
|
386
386
|
// SPEC: function getBaseRewardPerIncrement()
|
|
387
|
-
|
|
387
|
+
// Flag deltas pay for the previous epoch, so they are priced at its slot duration
|
|
388
|
+
const baseRewardPerIncrement = computeBaseRewardPerIncrement(config, prevEpoch, totalActiveStakeByIncrement);
|
|
388
389
|
|
|
389
390
|
// To optimize process_registry_updates():
|
|
390
391
|
// order by sequence of activationEligibilityEpoch setting and then index
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
3
3
|
ForkSeq,
|
|
4
|
+
GENESIS_EPOCH,
|
|
4
5
|
INACTIVITY_PENALTY_QUOTIENT_ALTAIR,
|
|
5
6
|
INACTIVITY_PENALTY_QUOTIENT_BELLATRIX,
|
|
6
7
|
PARTICIPATION_FLAG_WEIGHTS,
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
hasMarkers,
|
|
19
20
|
} from "../util/attesterStatus.js";
|
|
20
21
|
import {isInInactivityLeak} from "../util/index.js";
|
|
22
|
+
import {getSlotDurationMsAtEpoch} from "../util/slot.js";
|
|
21
23
|
|
|
22
24
|
type RewardPenaltyItem = {
|
|
23
25
|
baseReward: number;
|
|
@@ -67,7 +69,15 @@ export function getRewardsAndPenaltiesAltair(
|
|
|
67
69
|
|
|
68
70
|
const inactivityPenalityMultiplier =
|
|
69
71
|
fork === ForkSeq.altair ? INACTIVITY_PENALTY_QUOTIENT_ALTAIR : INACTIVITY_PENALTY_QUOTIENT_BELLATRIX;
|
|
70
|
-
|
|
72
|
+
let penaltyDenominator = config.INACTIVITY_SCORE_BIAS * inactivityPenalityMultiplier;
|
|
73
|
+
// The penalty pays for the previous epoch and scales with the square of its slot duration
|
|
74
|
+
const genesisSlotDurationMs = getSlotDurationMsAtEpoch(config, GENESIS_EPOCH);
|
|
75
|
+
const prevEpochSlotDurationMs = getSlotDurationMsAtEpoch(config, Math.max(epochCtx.epoch - 1, GENESIS_EPOCH));
|
|
76
|
+
if (prevEpochSlotDurationMs !== genesisSlotDurationMs) {
|
|
77
|
+
penaltyDenominator = Number(
|
|
78
|
+
(BigInt(penaltyDenominator) * BigInt(genesisSlotDurationMs) ** 2n) / BigInt(prevEpochSlotDurationMs) ** 2n
|
|
79
|
+
);
|
|
80
|
+
}
|
|
71
81
|
|
|
72
82
|
const {flags} = cache;
|
|
73
83
|
for (let i = 0; i < flags.length; i++) {
|
package/src/metrics.ts
CHANGED
|
@@ -156,19 +156,20 @@ export function getMetrics(register: MetricsRegister) {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
export function onStateCloneMetrics(
|
|
159
|
-
|
|
159
|
+
clonedState: CachedBeaconStateAllForks,
|
|
160
|
+
clonedCount: number,
|
|
160
161
|
metrics: BeaconStateTransitionMetrics,
|
|
161
162
|
source: StateCloneSource
|
|
162
163
|
): void {
|
|
163
|
-
metrics.preStateClonedCount.observe(
|
|
164
|
+
metrics.preStateClonedCount.observe(clonedCount);
|
|
164
165
|
|
|
165
|
-
if (isBalancesNodesPopulated(
|
|
166
|
+
if (isBalancesNodesPopulated(clonedState)) {
|
|
166
167
|
metrics.preStateBalancesNodesPopulatedHit.inc({source});
|
|
167
168
|
} else {
|
|
168
169
|
metrics.preStateBalancesNodesPopulatedMiss.inc({source});
|
|
169
170
|
}
|
|
170
171
|
|
|
171
|
-
if (isValidatorsNodesPopulated(
|
|
172
|
+
if (isValidatorsNodesPopulated(clonedState)) {
|
|
172
173
|
metrics.preStateValidatorsNodesPopulatedHit.inc({source});
|
|
173
174
|
} else {
|
|
174
175
|
metrics.preStateValidatorsNodesPopulatedMiss.inc({source});
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
5
5
|
ForkName,
|
|
6
6
|
ForkSeq,
|
|
7
|
+
GENESIS_EPOCH,
|
|
7
8
|
INACTIVITY_PENALTY_QUOTIENT_ALTAIR,
|
|
8
9
|
INACTIVITY_PENALTY_QUOTIENT_BELLATRIX,
|
|
9
10
|
MAX_EFFECTIVE_BALANCE,
|
|
@@ -26,6 +27,7 @@ import {
|
|
|
26
27
|
FLAG_PREV_HEAD_ATTESTER_UNSLASHED,
|
|
27
28
|
FLAG_PREV_SOURCE_ATTESTER_UNSLASHED,
|
|
28
29
|
FLAG_PREV_TARGET_ATTESTER_UNSLASHED,
|
|
30
|
+
getSlotDurationMsAtEpoch,
|
|
29
31
|
hasMarkers,
|
|
30
32
|
isInInactivityLeak,
|
|
31
33
|
} from "../util/index.js";
|
|
@@ -168,7 +170,16 @@ function computeTotalAttestationsRewardsAltair(
|
|
|
168
170
|
config.getForkSeq(state.slot) === ForkSeq.altair
|
|
169
171
|
? INACTIVITY_PENALTY_QUOTIENT_ALTAIR
|
|
170
172
|
: INACTIVITY_PENALTY_QUOTIENT_BELLATRIX;
|
|
171
|
-
|
|
173
|
+
let inactivityPenaltyDenominator = config.INACTIVITY_SCORE_BIAS * inactivityPenaltyQuotient;
|
|
174
|
+
// The penalty pays for the previous epoch and scales with the square of its slot duration
|
|
175
|
+
const genesisSlotDurationMs = getSlotDurationMsAtEpoch(config, GENESIS_EPOCH);
|
|
176
|
+
const prevEpochSlotDurationMs = getSlotDurationMsAtEpoch(config, Math.max(epochCtx.epoch - 1, GENESIS_EPOCH));
|
|
177
|
+
if (prevEpochSlotDurationMs !== genesisSlotDurationMs) {
|
|
178
|
+
inactivityPenaltyDenominator = Number(
|
|
179
|
+
(BigInt(inactivityPenaltyDenominator) * BigInt(genesisSlotDurationMs) ** 2n) /
|
|
180
|
+
BigInt(prevEpochSlotDurationMs) ** 2n
|
|
181
|
+
);
|
|
182
|
+
}
|
|
172
183
|
|
|
173
184
|
for (let i = 0; i < flags.length; i++) {
|
|
174
185
|
if (validatorIndices.length && !validatorIndices.includes(i)) {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {BeaconConfig} from "@lodestar/config";
|
|
2
|
+
import {DOMAIN_INCLUSION_LIST_COMMITTEE} from "@lodestar/params";
|
|
3
|
+
import {Slot, heze, ssz} from "@lodestar/types";
|
|
4
|
+
import {ISignatureSet, SignatureSetType, computeSigningRoot} from "../util/index.js";
|
|
5
|
+
|
|
6
|
+
export function getInclusionListSignatureSet(
|
|
7
|
+
config: BeaconConfig,
|
|
8
|
+
stateSlot: Slot,
|
|
9
|
+
signedInclusionList: heze.SignedInclusionList
|
|
10
|
+
): ISignatureSet {
|
|
11
|
+
const message = signedInclusionList.message;
|
|
12
|
+
const domain = config.getDomain(stateSlot, DOMAIN_INCLUSION_LIST_COMMITTEE, message.slot);
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
type: SignatureSetType.indexed,
|
|
16
|
+
index: message.validatorIndex,
|
|
17
|
+
signingRoot: computeSigningRoot(ssz.heze.InclusionList, message, domain),
|
|
18
|
+
signature: signedInclusionList.signature,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -18,6 +18,7 @@ export * from "./attesterSlashings.js";
|
|
|
18
18
|
export * from "./blsToExecutionChange.js";
|
|
19
19
|
export * from "./executionPayloadBid.js";
|
|
20
20
|
export * from "./executionPayloadEnvelope.js";
|
|
21
|
+
export * from "./inclusionList.js";
|
|
21
22
|
export * from "./indexedAttestation.js";
|
|
22
23
|
export * from "./indexedPayloadAttestation.js";
|
|
23
24
|
export * from "./proposer.js";
|
package/src/stateTransition.ts
CHANGED
|
@@ -101,7 +101,7 @@ export function stateTransition(
|
|
|
101
101
|
let postState = state.clone(options.dontTransferCache);
|
|
102
102
|
|
|
103
103
|
if (metrics) {
|
|
104
|
-
onStateCloneMetrics(postState, metrics, StateCloneSource.stateTransition);
|
|
104
|
+
onStateCloneMetrics(postState, state.clonedCount, metrics, StateCloneSource.stateTransition);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
// State is already a ViewDU, which won't commit changes. Equivalent to .setStateCachesAsTransient()
|
|
@@ -168,7 +168,7 @@ export function processSlots(
|
|
|
168
168
|
let postState = state.clone(opts?.dontTransferCache);
|
|
169
169
|
|
|
170
170
|
if (metrics) {
|
|
171
|
-
onStateCloneMetrics(postState, metrics, StateCloneSource.processSlots);
|
|
171
|
+
onStateCloneMetrics(postState, state.clonedCount, metrics, StateCloneSource.processSlots);
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
// State is already a ViewDU, which won't commit changes. Equivalent to .setStateCachesAsTransient()
|
package/src/util/altair.ts
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {ChainConfig} from "@lodestar/config";
|
|
2
|
+
import {BASE_REWARD_FACTOR, EFFECTIVE_BALANCE_INCREMENT, GENESIS_EPOCH} from "@lodestar/params";
|
|
3
|
+
import {Epoch} from "@lodestar/types";
|
|
2
4
|
import {bigIntSqrt, bnToNum} from "@lodestar/utils";
|
|
5
|
+
import {getSlotDurationMsAtEpoch} from "./slot.js";
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Before we manage bigIntSqrt(totalActiveStake) as BigInt and return BigInt.
|
|
6
9
|
* bigIntSqrt(totalActiveStake) should fit a number (2 ** 53 -1 max)
|
|
7
10
|
**/
|
|
8
|
-
export function computeBaseRewardPerIncrement(
|
|
11
|
+
export function computeBaseRewardPerIncrement(
|
|
12
|
+
config: ChainConfig,
|
|
13
|
+
epoch: Epoch,
|
|
14
|
+
totalActiveStakeByIncrement: number
|
|
15
|
+
): number {
|
|
16
|
+
// Divide last so the exact slot duration ratio applies
|
|
17
|
+
const numerator = Math.floor(
|
|
18
|
+
(EFFECTIVE_BALANCE_INCREMENT * BASE_REWARD_FACTOR * getSlotDurationMsAtEpoch(config, epoch)) /
|
|
19
|
+
getSlotDurationMsAtEpoch(config, GENESIS_EPOCH)
|
|
20
|
+
);
|
|
9
21
|
return Math.floor(
|
|
10
|
-
(
|
|
11
|
-
bnToNum(bigIntSqrt(BigInt(totalActiveStakeByIncrement) * BigInt(EFFECTIVE_BALANCE_INCREMENT)))
|
|
22
|
+
numerator / bnToNum(bigIntSqrt(BigInt(totalActiveStakeByIncrement) * BigInt(EFFECTIVE_BALANCE_INCREMENT)))
|
|
12
23
|
);
|
|
13
24
|
}
|
package/src/util/clock.ts
CHANGED
|
@@ -133,7 +133,7 @@ export class Clock implements IClock {
|
|
|
133
133
|
if (timeItem === TimeItem.Slot) {
|
|
134
134
|
if (nextSlot > slot + 1) {
|
|
135
135
|
// It's not very likely that we skip more than one slot as HTTP timeout is set
|
|
136
|
-
// to
|
|
136
|
+
// to at most one slot duration so we will fail task before skipping another slot.
|
|
137
137
|
this.logger.warn("Skipped slot due to task taking more than one slot to run", {
|
|
138
138
|
skippedSlot: slot + 1,
|
|
139
139
|
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
|
|
3
|
+
/** Spec `InclusionListCommittee` of one slot */
|
|
4
|
+
export class InclusionListCommittee {
|
|
5
|
+
constructor(readonly validatorIndices: Uint32Array) {}
|
|
6
|
+
|
|
7
|
+
/** Positions of `validatorIndex`, several when the committee cycles over a slot with fewer validators than its size */
|
|
8
|
+
getCommitteeIndices(validatorIndex: ValidatorIndex): number[] {
|
|
9
|
+
const committeeIndices: number[] = [];
|
|
10
|
+
for (let i = 0; i < this.validatorIndices.length; i++) {
|
|
11
|
+
if (this.validatorIndices[i] === validatorIndex) {
|
|
12
|
+
committeeIndices.push(i);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return committeeIndices;
|
|
16
|
+
}
|
|
17
|
+
}
|
package/src/util/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from "./execution.js";
|
|
|
17
17
|
export * from "./finality.js";
|
|
18
18
|
export * from "./genesis.js";
|
|
19
19
|
export * from "./gloas.js";
|
|
20
|
+
export * from "./inclusionListCommittee.js";
|
|
20
21
|
export * from "./interop.js";
|
|
21
22
|
export * from "./loadState/index.js";
|
|
22
23
|
export * from "./pendingDepositsLookup.js";
|
package/src/util/shuffling.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {ForkName, ForkSeq, SLOTS_PER_EPOCH, isForkPostFulu} from "@lodestar/params";
|
|
1
|
+
import {ForkName, ForkSeq, INCLUSION_LIST_COMMITTEE_SIZE, SLOTS_PER_EPOCH, isForkPostFulu} from "@lodestar/params";
|
|
2
2
|
import {
|
|
3
3
|
Attestation,
|
|
4
4
|
CommitteeIndex,
|
|
@@ -15,6 +15,7 @@ import {IBeaconStateView} from "../stateView/interface.js";
|
|
|
15
15
|
import {getBlockRootAtSlot} from "./blockRoot.js";
|
|
16
16
|
import {computeStartSlotAtEpoch} from "./epoch.js";
|
|
17
17
|
import {EpochShuffling} from "./epochShuffling.js";
|
|
18
|
+
import {InclusionListCommittee} from "./inclusionListCommittee.js";
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* Block root that decided the proposer shuffling for `proposalEpoch` (keys that shuffling).
|
|
@@ -196,6 +197,50 @@ export function getBeaconCommittee(epochShuffling: EpochShuffling, slot: Slot, i
|
|
|
196
197
|
return getBeaconCommittees(epochShuffling, slot, [index])[0];
|
|
197
198
|
}
|
|
198
199
|
|
|
200
|
+
/** Inclusion list committees of a shuffling by slot index, computed on first use and freed with the shuffling */
|
|
201
|
+
// TODO HEZE: replace this module-level map with an extended EpochShuffling tracked by the beacon-node ShufflingCache
|
|
202
|
+
const inclusionListCommitteesByShuffling = new WeakMap<EpochShuffling, InclusionListCommittee[]>();
|
|
203
|
+
|
|
204
|
+
/** Spec get_inclusion_list_committee: cycle over the slot's concatenated beacon committees */
|
|
205
|
+
export function getInclusionListCommittee(epochShuffling: EpochShuffling, slot: Slot): InclusionListCommittee {
|
|
206
|
+
let committees = inclusionListCommitteesByShuffling.get(epochShuffling);
|
|
207
|
+
if (committees === undefined) {
|
|
208
|
+
committees = [];
|
|
209
|
+
inclusionListCommitteesByShuffling.set(epochShuffling, committees);
|
|
210
|
+
}
|
|
211
|
+
const slotIndex = slot % SLOTS_PER_EPOCH;
|
|
212
|
+
let committee = committees[slotIndex];
|
|
213
|
+
if (committee === undefined) {
|
|
214
|
+
committee = new InclusionListCommittee(computeInclusionListCommittee(epochShuffling.committees[slotIndex]));
|
|
215
|
+
committees[slotIndex] = committee;
|
|
216
|
+
}
|
|
217
|
+
return committee;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function computeInclusionListCommittee(slotCommittees: Uint32Array[]): Uint32Array {
|
|
221
|
+
let totalLen = 0;
|
|
222
|
+
for (const committee of slotCommittees) {
|
|
223
|
+
totalLen += committee.length;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const result = new Uint32Array(INCLUSION_LIST_COMMITTEE_SIZE);
|
|
227
|
+
if (totalLen === 0) {
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
for (let i = 0; i < INCLUSION_LIST_COMMITTEE_SIZE; i++) {
|
|
232
|
+
let offset = i % totalLen;
|
|
233
|
+
for (const committee of slotCommittees) {
|
|
234
|
+
if (offset < committee.length) {
|
|
235
|
+
result[i] = committee[offset];
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
offset -= committee.length;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
|
|
199
244
|
/**
|
|
200
245
|
* Return a Uint32Array[] representing committees validator indices
|
|
201
246
|
*/
|