@lodestar/state-transition 1.22.0 → 1.23.0-dev.13d1a378b8
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/processBlsToExecutionChange.js +3 -2
- package/lib/block/processBlsToExecutionChange.js.map +1 -1
- package/lib/block/processExecutionPayload.js +4 -3
- package/lib/block/processExecutionPayload.js.map +1 -1
- package/lib/block/processOperations.js +3 -3
- package/lib/block/processOperations.js.map +1 -1
- package/lib/block/processWithdrawalRequest.js +3 -3
- package/lib/block/processWithdrawalRequest.js.map +1 -1
- package/lib/cache/epochCache.d.ts +52 -21
- package/lib/cache/epochCache.js +179 -71
- package/lib/cache/epochCache.js.map +1 -1
- package/lib/cache/epochTransitionCache.d.ts +4 -4
- package/lib/cache/epochTransitionCache.js +19 -4
- package/lib/cache/epochTransitionCache.js.map +1 -1
- package/lib/cache/stateCache.js +2 -1
- package/lib/cache/stateCache.js.map +1 -1
- package/lib/epoch/processSyncCommitteeUpdates.js +1 -1
- package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
- package/lib/slot/upgradeStateToAltair.js +1 -1
- package/lib/slot/upgradeStateToAltair.js.map +1 -1
- package/lib/slot/upgradeStateToElectra.js +1 -8
- package/lib/slot/upgradeStateToElectra.js.map +1 -1
- package/lib/stateTransition.js +19 -0
- package/lib/stateTransition.js.map +1 -1
- package/lib/util/calculateCommitteeAssignments.d.ts +12 -0
- package/lib/util/calculateCommitteeAssignments.js +26 -0
- package/lib/util/calculateCommitteeAssignments.js.map +1 -0
- package/lib/util/computeAnchorCheckpoint.d.ts +8 -0
- package/lib/util/computeAnchorCheckpoint.js +32 -0
- package/lib/util/computeAnchorCheckpoint.js.map +1 -0
- package/lib/util/epochShuffling.d.ts +42 -2
- package/lib/util/epochShuffling.js +18 -13
- package/lib/util/epochShuffling.js.map +1 -1
- package/lib/util/execution.js +1 -8
- package/lib/util/execution.js.map +1 -1
- package/lib/util/index.d.ts +2 -0
- package/lib/util/index.js +2 -0
- package/lib/util/index.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { byteArrayEquals } from "@chainsafe/ssz";
|
|
2
2
|
import { digest } from "@chainsafe/as-sha256";
|
|
3
3
|
import { BLS_WITHDRAWAL_PREFIX, ETH1_ADDRESS_WITHDRAWAL_PREFIX } from "@lodestar/params";
|
|
4
|
+
import { toHex } from "@lodestar/utils";
|
|
4
5
|
import { verifyBlsToExecutionChangeSignature } from "../signatureSets/index.js";
|
|
5
6
|
export function processBlsToExecutionChange(state, signedBlsToExecutionChange) {
|
|
6
7
|
const addressChange = signedBlsToExecutionChange.message;
|
|
@@ -37,7 +38,7 @@ export function isValidBlsToExecutionChange(state, signedBLSToExecutionChange, v
|
|
|
37
38
|
if (!byteArrayEquals(withdrawalCredentials, digestCredentials)) {
|
|
38
39
|
return {
|
|
39
40
|
valid: false,
|
|
40
|
-
error: Error(`Invalid withdrawalCredentials expected=${
|
|
41
|
+
error: Error(`Invalid withdrawalCredentials expected=${toHex(withdrawalCredentials)} actual=${toHex(digestCredentials)}`),
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
44
|
if (verifySignature && !verifyBlsToExecutionChangeSignature(state, signedBLSToExecutionChange)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBlsToExecutionChange.js","sourceRoot":"","sources":["../../src/block/processBlsToExecutionChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"processBlsToExecutionChange.js","sourceRoot":"","sources":["../../src/block/processBlsToExecutionChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAC,qBAAqB,EAAE,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAC,mCAAmC,EAAC,MAAM,2BAA2B,CAAC;AAI9E,MAAM,UAAU,2BAA2B,CACzC,KAA+B,EAC/B,0BAA8D;IAE9D,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,CAAC;IAEzD,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,EAAE,0BAA0B,EAAE,IAAI,CAAC,CAAC;IACxF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,UAAU,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACrE,MAAM,wBAAwB,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACpD,wBAAwB,CAAC,CAAC,CAAC,GAAG,8BAA8B,CAAC;IAC7D,wBAAwB,CAAC,GAAG,CAAC,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEnE,+BAA+B;IAC/B,SAAS,CAAC,qBAAqB,GAAG,wBAAwB,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAA+B,EAC/B,0BAA8D,EAC9D,eAAe,GAAG,IAAI;IAEtB,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,CAAC;IAEzD,IAAI,aAAa,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK,CACV,4BAA4B,aAAa,CAAC,cAAc,2BAA2B,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAC7G;SACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7E,MAAM,EAAC,qBAAqB,EAAC,GAAG,SAAS,CAAC;IAC1C,IAAI,qBAAqB,CAAC,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;QACvD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK,CACV,iDAAiD,qBAAqB,WAAW,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAC5G;SACF,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC9D,0EAA0E;IAC1E,iBAAiB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC;IAC7C,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK,CACV,0CAA0C,KAAK,CAAC,qBAAqB,CAAC,WAAW,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAC5G;SACF,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,IAAI,CAAC,mCAAmC,CAAC,KAAK,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC/F,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK,CACV,iFAAiF,aAAa,CAAC,cAAc,EAAE,CAChH;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;AACvB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { byteArrayEquals } from "@chainsafe/ssz";
|
|
2
2
|
import { isExecutionPayload } from "@lodestar/types";
|
|
3
3
|
import { ForkSeq, MAX_BLOBS_PER_BLOCK } from "@lodestar/params";
|
|
4
|
+
import { toHex, toRootHex } from "@lodestar/utils";
|
|
4
5
|
import { getRandaoMix } from "../util/index.js";
|
|
5
6
|
import { isMergeTransitionComplete, getFullOrBlindedPayloadFromBody, executionPayloadToPayloadHeader, } from "../util/execution.js";
|
|
6
7
|
import { ExecutionPayloadStatus } from "./externalData.js";
|
|
@@ -11,13 +12,13 @@ export function processExecutionPayload(fork, state, body, externalData) {
|
|
|
11
12
|
if (isMergeTransitionComplete(state)) {
|
|
12
13
|
const { latestExecutionPayloadHeader } = state;
|
|
13
14
|
if (!byteArrayEquals(payload.parentHash, latestExecutionPayloadHeader.blockHash)) {
|
|
14
|
-
throw Error(`Invalid execution payload parentHash ${
|
|
15
|
+
throw Error(`Invalid execution payload parentHash ${toRootHex(payload.parentHash)} latest blockHash ${toRootHex(latestExecutionPayloadHeader.blockHash)}`);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
// Verify random
|
|
18
19
|
const expectedRandom = getRandaoMix(state, state.epochCtx.epoch);
|
|
19
20
|
if (!byteArrayEquals(payload.prevRandao, expectedRandom)) {
|
|
20
|
-
throw Error(`Invalid execution payload random ${
|
|
21
|
+
throw Error(`Invalid execution payload random ${toHex(payload.prevRandao)} expected=${toHex(expectedRandom)}`);
|
|
21
22
|
}
|
|
22
23
|
// Verify timestamp
|
|
23
24
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processExecutionPayload.js","sourceRoot":"","sources":["../../src/block/processExecutionPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"processExecutionPayload.js","sourceRoot":"","sources":["../../src/block/processExecutionPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAiD,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAC,OAAO,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAoB,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAE5E,MAAM,UAAU,uBAAuB,CACrC,IAAa,EACb,KAA4D,EAC5D,IAA8C,EAC9C,YAA4D;IAE5D,MAAM,OAAO,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC;IACtD,sFAAsF;IACtF,wDAAwD;IACxD,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,EAAC,4BAA4B,EAAC,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,4BAA4B,CAAC,SAAS,CAAC,EAAE,CAAC;YACjF,MAAM,KAAK,CACT,wCAAwC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,SAAS,CACjG,4BAA4B,CAAC,SAAS,CACvC,EAAE,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,CAAC,oCAAoC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,mBAAmB;IACnB,EAAE;IACF,yCAAyC;IACzC,2EAA2E;IAC3E,8CAA8C;IAC9C,+EAA+E;IAC/E,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACzF,MAAM,KAAK,CAAC,qBAAqB,OAAO,CAAC,SAAS,gBAAgB,KAAK,CAAC,WAAW,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,qBAAqB,GAAI,IAA8B,CAAC,kBAAkB,EAAE,MAAM,IAAI,CAAC,CAAC;QAC9F,IAAI,qBAAqB,GAAG,mBAAmB,EAAE,CAAC;YAChD,MAAM,KAAK,CAAC,uCAAuC,mBAAmB,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,EAAE;IACF,6GAA6G;IAC7G,gHAAgH;IAChH,4BAA4B;IAC5B,EAAE;IACF,mEAAmE;IACnE,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,QAAQ,YAAY,CAAC,sBAAsB,EAAE,CAAC;YAC5C,KAAK,sBAAsB,CAAC,QAAQ;gBAClC,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,KAAK,sBAAsB,CAAC,OAAO;gBACjC,MAAM,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,KAAK,sBAAsB,CAAC,KAAK;gBAC/B,MAAM,CAAC,KAAK;QAChB,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE7G,6FAA6F;IAC7F,yGAAyG;IACzG,KAAK,CAAC,4BAA4B,GAAG,KAAK,CAAC,MAAM;SAC9C,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC;SACjC,sBAAsB,CAAC,QAAQ,CAAC,aAAa,CAA8C,CAAC;AACjG,CAAC"}
|
|
@@ -37,13 +37,13 @@ export function processOperations(fork, state, body, opts = { verifySignatures:
|
|
|
37
37
|
if (fork >= ForkSeq.electra) {
|
|
38
38
|
const stateElectra = state;
|
|
39
39
|
const bodyElectra = body;
|
|
40
|
-
for (const depositRequest of bodyElectra.
|
|
40
|
+
for (const depositRequest of bodyElectra.executionRequests.deposits) {
|
|
41
41
|
processDepositRequest(fork, stateElectra, depositRequest);
|
|
42
42
|
}
|
|
43
|
-
for (const elWithdrawalRequest of bodyElectra.
|
|
43
|
+
for (const elWithdrawalRequest of bodyElectra.executionRequests.withdrawals) {
|
|
44
44
|
processWithdrawalRequest(fork, stateElectra, elWithdrawalRequest);
|
|
45
45
|
}
|
|
46
|
-
for (const elConsolidationRequest of bodyElectra.
|
|
46
|
+
for (const elConsolidationRequest of bodyElectra.executionRequests.consolidations) {
|
|
47
47
|
processConsolidationRequest(stateElectra, elConsolidationRequest);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processOperations.js","sourceRoot":"","sources":["../../src/block/processOperations.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAGzC,OAAO,EAAC,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAC,2BAA2B,EAAC,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAC,wBAAwB,EAAC,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAC,2BAA2B,EAAC,MAAM,kCAAkC,CAAC;AAE7E,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,2BAA2B,GAC5B,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,IAAa,EACb,KAAgC,EAChC,IAAqB,EACrB,OAAyB,EAAC,gBAAgB,EAAE,IAAI,EAAC;IAEjD,sFAAsF;IACtF,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,6DAA6D,IAAI,CAAC,QAAQ,CAAC,MAAM,aAAa,WAAW,EAAE,CAC5G,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtD,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtD,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChF,CAAC;IAED,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE3E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,MAAM,oBAAoB,IAAK,IAAgC,CAAC,qBAAqB,EAAE,CAAC;YAC3F,2BAA2B,CAAC,KAAiC,EAAE,oBAAoB,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,KAAiC,CAAC;QACvD,MAAM,WAAW,GAAG,IAA+B,CAAC;QAEpD,KAAK,MAAM,cAAc,IAAI,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"processOperations.js","sourceRoot":"","sources":["../../src/block/processOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { toHexString } from "@chainsafe/ssz";
|
|
2
1
|
import { ssz } from "@lodestar/types";
|
|
3
2
|
import { FAR_FUTURE_EPOCH, MIN_ACTIVATION_BALANCE, PENDING_PARTIAL_WITHDRAWALS_LIMIT, FULL_EXIT_REQUEST_AMOUNT, } from "@lodestar/params";
|
|
3
|
+
import { toHex } from "@lodestar/utils";
|
|
4
4
|
import { hasCompoundingWithdrawalCredential, hasExecutionWithdrawalCredential } from "../util/electra.js";
|
|
5
5
|
import { getPendingBalanceToWithdraw, isActiveValidator } from "../util/validator.js";
|
|
6
6
|
import { computeExitEpochAndUpdateChurn } from "../util/epoch.js";
|
|
@@ -55,8 +55,8 @@ export function processWithdrawalRequest(fork, state, withdrawalRequest) {
|
|
|
55
55
|
}
|
|
56
56
|
function isValidatorEligibleForWithdrawOrExit(validator, sourceAddress, state) {
|
|
57
57
|
const { withdrawalCredentials } = validator;
|
|
58
|
-
const addressStr =
|
|
59
|
-
const sourceAddressStr =
|
|
58
|
+
const addressStr = toHex(withdrawalCredentials.subarray(12));
|
|
59
|
+
const sourceAddressStr = toHex(sourceAddress);
|
|
60
60
|
const { epoch: currentEpoch, config } = state.epochCtx;
|
|
61
61
|
return (hasExecutionWithdrawalCredential(withdrawalCredentials) &&
|
|
62
62
|
addressStr === sourceAddressStr &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processWithdrawalRequest.js","sourceRoot":"","sources":["../../src/block/processWithdrawalRequest.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"processWithdrawalRequest.js","sourceRoot":"","sources":["../../src/block/processWithdrawalRequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
import { PublicKey } from "@chainsafe/blst";
|
|
2
2
|
import * as immutable from "immutable";
|
|
3
|
-
import { BLSSignature, CommitteeIndex, Epoch, Slot, ValidatorIndex, phase0, SyncPeriod, Attestation, IndexedAttestation } from "@lodestar/types";
|
|
3
|
+
import { BLSSignature, CommitteeIndex, Epoch, Slot, ValidatorIndex, phase0, RootHex, SyncPeriod, Attestation, IndexedAttestation } from "@lodestar/types";
|
|
4
4
|
import { BeaconConfig, ChainConfig } from "@lodestar/config";
|
|
5
5
|
import { ForkSeq } from "@lodestar/params";
|
|
6
6
|
import { LodestarError } from "@lodestar/utils";
|
|
7
|
-
import { EpochShuffling } from "../util/epochShuffling.js";
|
|
7
|
+
import { EpochShuffling, IShufflingCache } from "../util/epochShuffling.js";
|
|
8
|
+
import { AttesterDuty } from "../util/calculateCommitteeAssignments.js";
|
|
8
9
|
import { EpochCacheMetrics } from "../metrics.js";
|
|
9
10
|
import { EffectiveBalanceIncrements } from "./effectiveBalanceIncrements.js";
|
|
11
|
+
import { BeaconStateAllForks } from "./types.js";
|
|
10
12
|
import { Index2PubkeyCache, PubkeyIndexMap, UnfinalizedPubkeyIndexMap, PubkeyHex } from "./pubkeyCache.js";
|
|
11
|
-
import { BeaconStateAllForks, ShufflingGetter } from "./types.js";
|
|
12
13
|
import { SyncCommitteeCache } from "./syncCommitteeCache.js";
|
|
14
|
+
import { CachedBeaconStateAllForks } from "./stateCache.js";
|
|
13
15
|
/** `= PROPOSER_WEIGHT / (WEIGHT_DENOMINATOR - PROPOSER_WEIGHT)` */
|
|
14
16
|
export declare const PROPOSER_WEIGHT_FACTOR: number;
|
|
15
17
|
export type EpochCacheImmutableData = {
|
|
16
18
|
config: BeaconConfig;
|
|
17
19
|
pubkey2index: PubkeyIndexMap;
|
|
18
20
|
index2pubkey: Index2PubkeyCache;
|
|
21
|
+
shufflingCache?: IShufflingCache;
|
|
19
22
|
};
|
|
20
23
|
export type EpochCacheOpts = {
|
|
21
24
|
skipSyncCommitteeCache?: boolean;
|
|
22
25
|
skipSyncPubkeys?: boolean;
|
|
23
|
-
shufflingGetter?: ShufflingGetter;
|
|
24
26
|
};
|
|
25
27
|
/** Defers computing proposers by persisting only the seed, and dropping it once indexes are computed */
|
|
26
28
|
type ProposersDeferred = {
|
|
@@ -79,6 +81,11 @@ export declare class EpochCache {
|
|
|
79
81
|
* Unique pubkey registry shared in the same fork. There should only exist one for the fork.
|
|
80
82
|
*/
|
|
81
83
|
unfinalizedPubkey2index: UnfinalizedPubkeyIndexMap;
|
|
84
|
+
/**
|
|
85
|
+
* ShufflingCache is passed in from `beacon-node` so should be available at runtime but may not be
|
|
86
|
+
* present during testing.
|
|
87
|
+
*/
|
|
88
|
+
shufflingCache?: IShufflingCache;
|
|
82
89
|
/**
|
|
83
90
|
* Indexes of the block proposers for the current epoch.
|
|
84
91
|
*
|
|
@@ -93,6 +100,12 @@ export declare class EpochCache {
|
|
|
93
100
|
* should be in the epoch context.
|
|
94
101
|
*/
|
|
95
102
|
proposersNextEpoch: ProposersDeferred;
|
|
103
|
+
/**
|
|
104
|
+
* Epoch decision roots to look up correct shuffling from the Shuffling Cache
|
|
105
|
+
*/
|
|
106
|
+
previousDecisionRoot: RootHex;
|
|
107
|
+
currentDecisionRoot: RootHex;
|
|
108
|
+
nextDecisionRoot: RootHex;
|
|
96
109
|
/**
|
|
97
110
|
* Shuffling of validator indexes. Immutable through the epoch, then it's replaced entirely.
|
|
98
111
|
* Note: Per spec definition, shuffling will always be defined. They are never called before loadState()
|
|
@@ -103,7 +116,12 @@ export declare class EpochCache {
|
|
|
103
116
|
/** Same as previousShuffling */
|
|
104
117
|
currentShuffling: EpochShuffling;
|
|
105
118
|
/** Same as previousShuffling */
|
|
106
|
-
nextShuffling: EpochShuffling;
|
|
119
|
+
nextShuffling: EpochShuffling | null;
|
|
120
|
+
/**
|
|
121
|
+
* Cache nextActiveIndices so that in afterProcessEpoch the next shuffling can be build synchronously
|
|
122
|
+
* in case it is not built or the ShufflingCache is not available
|
|
123
|
+
*/
|
|
124
|
+
nextActiveIndices: Uint32Array;
|
|
107
125
|
/**
|
|
108
126
|
* Effective balances, for altair processAttestations()
|
|
109
127
|
*/
|
|
@@ -169,7 +187,6 @@ export declare class EpochCache {
|
|
|
169
187
|
currentSyncCommitteeIndexed: SyncCommitteeCache;
|
|
170
188
|
/** TODO: Indexed SyncCommitteeCache */
|
|
171
189
|
nextSyncCommitteeIndexed: SyncCommitteeCache;
|
|
172
|
-
epoch: Epoch;
|
|
173
190
|
syncPeriod: SyncPeriod;
|
|
174
191
|
/**
|
|
175
192
|
* state.validators.length of every state at epoch boundary
|
|
@@ -180,17 +197,24 @@ export declare class EpochCache {
|
|
|
180
197
|
* then the list will be (in terms of epoch) [103, 104, 105]
|
|
181
198
|
*/
|
|
182
199
|
historicalValidatorLengths: immutable.List<number>;
|
|
200
|
+
epoch: Epoch;
|
|
201
|
+
get nextEpoch(): Epoch;
|
|
183
202
|
constructor(data: {
|
|
184
203
|
config: BeaconConfig;
|
|
185
204
|
pubkey2index: PubkeyIndexMap;
|
|
186
205
|
index2pubkey: Index2PubkeyCache;
|
|
187
206
|
unfinalizedPubkey2index: UnfinalizedPubkeyIndexMap;
|
|
207
|
+
shufflingCache?: IShufflingCache;
|
|
188
208
|
proposers: number[];
|
|
189
209
|
proposersPrevEpoch: number[] | null;
|
|
190
210
|
proposersNextEpoch: ProposersDeferred;
|
|
211
|
+
previousDecisionRoot: RootHex;
|
|
212
|
+
currentDecisionRoot: RootHex;
|
|
213
|
+
nextDecisionRoot: RootHex;
|
|
191
214
|
previousShuffling: EpochShuffling;
|
|
192
215
|
currentShuffling: EpochShuffling;
|
|
193
|
-
nextShuffling: EpochShuffling;
|
|
216
|
+
nextShuffling: EpochShuffling | null;
|
|
217
|
+
nextActiveIndices: Uint32Array;
|
|
194
218
|
effectiveBalanceIncrements: EffectiveBalanceIncrements;
|
|
195
219
|
totalSlashingsByIncrement: number;
|
|
196
220
|
syncParticipantReward: number;
|
|
@@ -215,19 +239,23 @@ export declare class EpochCache {
|
|
|
215
239
|
*
|
|
216
240
|
* SLOW CODE - 🐢
|
|
217
241
|
*/
|
|
218
|
-
static createFromState(state: BeaconStateAllForks, { config, pubkey2index, index2pubkey }: EpochCacheImmutableData, opts?: EpochCacheOpts): EpochCache;
|
|
242
|
+
static createFromState(state: BeaconStateAllForks, { config, pubkey2index, index2pubkey, shufflingCache }: EpochCacheImmutableData, opts?: EpochCacheOpts): EpochCache;
|
|
219
243
|
/**
|
|
220
244
|
* Copies a given EpochCache while avoiding copying its immutable parts.
|
|
221
245
|
*/
|
|
222
246
|
clone(): EpochCache;
|
|
223
247
|
/**
|
|
224
248
|
* Called to re-use information, such as the shuffling of the next epoch, after transitioning into a
|
|
225
|
-
* new epoch.
|
|
249
|
+
* new epoch. Also handles pre-computation of values that may change during the upcoming epoch and
|
|
250
|
+
* that get used in the following epoch transition. Often those pre-computations are not used by the
|
|
251
|
+
* chain but are courtesy values that are served via the API for epoch look ahead of duties.
|
|
252
|
+
*
|
|
253
|
+
* Steps for afterProcessEpoch
|
|
254
|
+
* 1) update previous/current/next values of cached items
|
|
226
255
|
*/
|
|
227
|
-
afterProcessEpoch(state:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
nextEpochShufflingActiveIndicesLength: number;
|
|
256
|
+
afterProcessEpoch(state: CachedBeaconStateAllForks, epochTransitionCache: {
|
|
257
|
+
nextShufflingDecisionRoot: RootHex;
|
|
258
|
+
nextShufflingActiveIndices: Uint32Array;
|
|
231
259
|
nextEpochTotalActiveBalanceByIncrement: number;
|
|
232
260
|
}): void;
|
|
233
261
|
beforeEpochTransition(): void;
|
|
@@ -330,6 +358,7 @@ export declare class EpochCache {
|
|
|
330
358
|
getShufflingAtSlot(slot: Slot): EpochShuffling;
|
|
331
359
|
getShufflingAtSlotOrNull(slot: Slot): EpochShuffling | null;
|
|
332
360
|
getShufflingAtEpoch(epoch: Epoch): EpochShuffling;
|
|
361
|
+
getShufflingDecisionRoot(epoch: Epoch): RootHex;
|
|
333
362
|
getShufflingAtEpochOrNull(epoch: Epoch): EpochShuffling | null;
|
|
334
363
|
/**
|
|
335
364
|
* Note: The range of slots a validator has to perform duties is off by one.
|
|
@@ -351,17 +380,11 @@ export declare class EpochCache {
|
|
|
351
380
|
isPostElectra(): boolean;
|
|
352
381
|
getValidatorCountAtEpoch(targetEpoch: Epoch): number | undefined;
|
|
353
382
|
}
|
|
354
|
-
type AttesterDuty = {
|
|
355
|
-
validatorIndex: ValidatorIndex;
|
|
356
|
-
committeeIndex: CommitteeIndex;
|
|
357
|
-
committeeLength: number;
|
|
358
|
-
committeesAtSlot: number;
|
|
359
|
-
validatorCommitteeIndex: number;
|
|
360
|
-
slot: Slot;
|
|
361
|
-
};
|
|
362
383
|
export declare enum EpochCacheErrorCode {
|
|
363
384
|
COMMITTEE_INDEX_OUT_OF_RANGE = "EPOCH_CONTEXT_ERROR_COMMITTEE_INDEX_OUT_OF_RANGE",
|
|
364
385
|
COMMITTEE_EPOCH_OUT_OF_RANGE = "EPOCH_CONTEXT_ERROR_COMMITTEE_EPOCH_OUT_OF_RANGE",
|
|
386
|
+
DECISION_ROOT_EPOCH_OUT_OF_RANGE = "EPOCH_CONTEXT_ERROR_DECISION_ROOT_EPOCH_OUT_OF_RANGE",
|
|
387
|
+
NEXT_SHUFFLING_NOT_AVAILABLE = "EPOCH_CONTEXT_ERROR_NEXT_SHUFFLING_NOT_AVAILABLE",
|
|
365
388
|
NO_SYNC_COMMITTEE = "EPOCH_CONTEXT_ERROR_NO_SYNC_COMMITTEE",
|
|
366
389
|
PROPOSER_EPOCH_MISMATCH = "EPOCH_CONTEXT_ERROR_PROPOSER_EPOCH_MISMATCH"
|
|
367
390
|
}
|
|
@@ -373,6 +396,14 @@ type EpochCacheErrorType = {
|
|
|
373
396
|
code: EpochCacheErrorCode.COMMITTEE_EPOCH_OUT_OF_RANGE;
|
|
374
397
|
requestedEpoch: Epoch;
|
|
375
398
|
currentEpoch: Epoch;
|
|
399
|
+
} | {
|
|
400
|
+
code: EpochCacheErrorCode.DECISION_ROOT_EPOCH_OUT_OF_RANGE;
|
|
401
|
+
requestedEpoch: Epoch;
|
|
402
|
+
currentEpoch: Epoch;
|
|
403
|
+
} | {
|
|
404
|
+
code: EpochCacheErrorCode.NEXT_SHUFFLING_NOT_AVAILABLE;
|
|
405
|
+
epoch: Epoch;
|
|
406
|
+
decisionRoot: RootHex;
|
|
376
407
|
} | {
|
|
377
408
|
code: EpochCacheErrorCode.NO_SYNC_COMMITTEE;
|
|
378
409
|
epoch: Epoch;
|