@lodestar/state-transition 1.39.0-dev.c9c20506d9 → 1.39.0-dev.cc77fcf3a8
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/isValidIndexedAttestation.d.ts +4 -5
- package/lib/block/isValidIndexedAttestation.d.ts.map +1 -1
- package/lib/block/isValidIndexedAttestation.js +9 -10
- package/lib/block/isValidIndexedAttestation.js.map +1 -1
- package/lib/block/processAttestationPhase0.d.ts.map +1 -1
- package/lib/block/processAttestationPhase0.js +1 -1
- package/lib/block/processAttestationPhase0.js.map +1 -1
- package/lib/block/processAttesterSlashing.d.ts +3 -2
- package/lib/block/processAttesterSlashing.d.ts.map +1 -1
- package/lib/block/processAttesterSlashing.js +3 -3
- package/lib/block/processAttesterSlashing.js.map +1 -1
- package/lib/block/processBlsToExecutionChange.d.ts +3 -1
- package/lib/block/processBlsToExecutionChange.d.ts.map +1 -1
- package/lib/block/processBlsToExecutionChange.js +7 -11
- package/lib/block/processBlsToExecutionChange.js.map +1 -1
- package/lib/block/processProposerSlashing.d.ts +5 -2
- package/lib/block/processProposerSlashing.d.ts.map +1 -1
- package/lib/block/processProposerSlashing.js +7 -5
- package/lib/block/processProposerSlashing.js.map +1 -1
- package/lib/block/processWithdrawals.d.ts +3 -3
- package/lib/block/processWithdrawals.d.ts.map +1 -1
- package/lib/block/processWithdrawals.js +152 -105
- package/lib/block/processWithdrawals.js.map +1 -1
- 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/signatureSets/blsToExecutionChange.d.ts +1 -2
- package/lib/signatureSets/blsToExecutionChange.d.ts.map +1 -1
- package/lib/signatureSets/blsToExecutionChange.js +2 -2
- package/lib/signatureSets/blsToExecutionChange.js.map +1 -1
- package/lib/signatureSets/proposer.d.ts +3 -4
- package/lib/signatureSets/proposer.d.ts.map +1 -1
- package/lib/signatureSets/proposer.js +5 -6
- package/lib/signatureSets/proposer.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/block/isValidIndexedAttestation.ts +17 -12
- package/src/block/processAttestationPhase0.ts +2 -1
- package/src/block/processAttesterSlashing.ts +16 -4
- package/src/block/processBlsToExecutionChange.ts +13 -14
- package/src/block/processProposerSlashing.ts +21 -11
- package/src/block/processWithdrawals.ts +230 -135
- 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/signatureSets/blsToExecutionChange.ts +2 -3
- package/src/signatureSets/proposer.ts +6 -7
- package/src/types.ts +1 -0
- package/src/util/epochShuffling.ts +2 -43
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { BeaconConfig } from "@lodestar/config";
|
|
2
|
-
import { IndexedAttestation, IndexedAttestationBigint } from "@lodestar/types";
|
|
2
|
+
import { IndexedAttestation, IndexedAttestationBigint, Slot } from "@lodestar/types";
|
|
3
3
|
import { Index2PubkeyCache } from "../cache/pubkeyCache.js";
|
|
4
|
-
import { CachedBeaconStateAllForks } from "../types.js";
|
|
5
4
|
/**
|
|
6
5
|
* Check if `indexedAttestation` has sorted and unique indices and a valid aggregate signature.
|
|
7
6
|
*/
|
|
8
|
-
export declare function isValidIndexedAttestation(config: BeaconConfig, index2pubkey: Index2PubkeyCache,
|
|
9
|
-
export declare function isValidIndexedAttestationBigint(config: BeaconConfig, index2pubkey: Index2PubkeyCache,
|
|
7
|
+
export declare function isValidIndexedAttestation(config: BeaconConfig, index2pubkey: Index2PubkeyCache, stateSlot: Slot, validatorsLen: number, indexedAttestation: IndexedAttestation, verifySignature: boolean): boolean;
|
|
8
|
+
export declare function isValidIndexedAttestationBigint(config: BeaconConfig, index2pubkey: Index2PubkeyCache, stateSlot: Slot, validatorsLen: number, indexedAttestation: IndexedAttestationBigint, verifySignature: boolean): boolean;
|
|
10
9
|
/**
|
|
11
10
|
* Check if `indexedAttestation` has sorted and unique indices and a valid aggregate signature.
|
|
12
11
|
*/
|
|
13
|
-
export declare function isValidIndexedAttestationIndices(
|
|
12
|
+
export declare function isValidIndexedAttestationIndices(config: BeaconConfig, stateSlot: Slot, validatorsLen: number, indices: number[]): boolean;
|
|
14
13
|
//# sourceMappingURL=isValidIndexedAttestation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isValidIndexedAttestation.d.ts","sourceRoot":"","sources":["../../src/block/isValidIndexedAttestation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,kBAAkB,EAAE,wBAAwB,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"isValidIndexedAttestation.d.ts","sourceRoot":"","sources":["../../src/block/isValidIndexedAttestation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,kBAAkB,EAAE,wBAAwB,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAI1D;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,MAAM,EACrB,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,OAAO,GACvB,OAAO,CAST;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,MAAM,EACrB,kBAAkB,EAAE,wBAAwB,EAC5C,eAAe,EAAE,OAAO,GACvB,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CA0BT"}
|
|
@@ -4,30 +4,30 @@ import { verifySignatureSet } from "../util/index.js";
|
|
|
4
4
|
/**
|
|
5
5
|
* Check if `indexedAttestation` has sorted and unique indices and a valid aggregate signature.
|
|
6
6
|
*/
|
|
7
|
-
export function isValidIndexedAttestation(config, index2pubkey,
|
|
8
|
-
if (!isValidIndexedAttestationIndices(
|
|
7
|
+
export function isValidIndexedAttestation(config, index2pubkey, stateSlot, validatorsLen, indexedAttestation, verifySignature) {
|
|
8
|
+
if (!isValidIndexedAttestationIndices(config, stateSlot, validatorsLen, indexedAttestation.attestingIndices)) {
|
|
9
9
|
return false;
|
|
10
10
|
}
|
|
11
11
|
if (verifySignature) {
|
|
12
|
-
return verifySignatureSet(getIndexedAttestationSignatureSet(config, index2pubkey,
|
|
12
|
+
return verifySignatureSet(getIndexedAttestationSignatureSet(config, index2pubkey, stateSlot, indexedAttestation));
|
|
13
13
|
}
|
|
14
14
|
return true;
|
|
15
15
|
}
|
|
16
|
-
export function isValidIndexedAttestationBigint(config, index2pubkey,
|
|
17
|
-
if (!isValidIndexedAttestationIndices(
|
|
16
|
+
export function isValidIndexedAttestationBigint(config, index2pubkey, stateSlot, validatorsLen, indexedAttestation, verifySignature) {
|
|
17
|
+
if (!isValidIndexedAttestationIndices(config, stateSlot, validatorsLen, indexedAttestation.attestingIndices)) {
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
20
|
if (verifySignature) {
|
|
21
|
-
return verifySignatureSet(getIndexedAttestationBigintSignatureSet(config, index2pubkey,
|
|
21
|
+
return verifySignatureSet(getIndexedAttestationBigintSignatureSet(config, index2pubkey, stateSlot, indexedAttestation));
|
|
22
22
|
}
|
|
23
23
|
return true;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Check if `indexedAttestation` has sorted and unique indices and a valid aggregate signature.
|
|
27
27
|
*/
|
|
28
|
-
export function isValidIndexedAttestationIndices(
|
|
28
|
+
export function isValidIndexedAttestationIndices(config, stateSlot, validatorsLen, indices) {
|
|
29
29
|
// verify max number of indices
|
|
30
|
-
const maxIndices =
|
|
30
|
+
const maxIndices = config.getForkSeq(stateSlot) >= ForkSeq.electra
|
|
31
31
|
? MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT
|
|
32
32
|
: MAX_VALIDATORS_PER_COMMITTEE;
|
|
33
33
|
if (!(indices.length > 0 && indices.length <= maxIndices)) {
|
|
@@ -43,9 +43,8 @@ export function isValidIndexedAttestationIndices(state, indices) {
|
|
|
43
43
|
prev = index;
|
|
44
44
|
}
|
|
45
45
|
// check if indices are out of bounds, by checking the highest index (since it is sorted)
|
|
46
|
-
// TODO - SLOW CODE - Does this .length check the tree and is expensive?
|
|
47
46
|
const lastIndex = indices.at(-1);
|
|
48
|
-
if (lastIndex && lastIndex >=
|
|
47
|
+
if (lastIndex && lastIndex >= validatorsLen) {
|
|
49
48
|
return false;
|
|
50
49
|
}
|
|
51
50
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isValidIndexedAttestation.js","sourceRoot":"","sources":["../../src/block/isValidIndexedAttestation.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAGhG,OAAO,EAAC,uCAAuC,EAAE,iCAAiC,EAAC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"isValidIndexedAttestation.js","sourceRoot":"","sources":["../../src/block/isValidIndexedAttestation.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAGhG,OAAO,EAAC,uCAAuC,EAAE,iCAAiC,EAAC,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAoB,EACpB,YAA+B,EAC/B,SAAe,EACf,aAAqB,EACrB,kBAAsC,EACtC,eAAwB;IAExB,IAAI,CAAC,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7G,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,kBAAkB,CAAC,iCAAiC,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,MAAoB,EACpB,YAA+B,EAC/B,SAAe,EACf,aAAqB,EACrB,kBAA4C,EAC5C,eAAwB;IAExB,IAAI,CAAC,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7G,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,kBAAkB,CACvB,uCAAuC,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAC9C,MAAoB,EACpB,SAAe,EACf,aAAqB,EACrB,OAAiB;IAEjB,+BAA+B;IAC/B,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO;QAC7C,CAAC,CAAC,4BAA4B,GAAG,uBAAuB;QACxD,CAAC,CAAC,4BAA4B,CAAC;IACnC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wCAAwC;IACxC,mDAAmD;IACnD,oFAAoF;IACpF,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,GAAG,KAAK,CAAC;IACf,CAAC;IAED,yFAAyF;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,SAAS,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processAttestationPhase0.d.ts","sourceRoot":"","sources":["../../src/block/processAttestationPhase0.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAmD,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAC,WAAW,EAAE,IAAI,EAAW,MAAM,EAAM,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAC,yBAAyB,EAAE,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAI/E;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,eAAe,UAAO,GACrB,IAAI,
|
|
1
|
+
{"version":3,"file":"processAttestationPhase0.d.ts","sourceRoot":"","sources":["../../src/block/processAttestationPhase0.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAmD,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAC,WAAW,EAAE,IAAI,EAAW,MAAM,EAAM,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAC,yBAAyB,EAAE,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAI/E;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,eAAe,UAAO,GACrB,IAAI,CA8CN;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CA2FnH;AAGD,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAG,OAAO,CAM9E;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAErE"}
|
|
@@ -33,7 +33,7 @@ export function processAttestationPhase0(state, attestation, verifySignature = t
|
|
|
33
33
|
}
|
|
34
34
|
state.previousEpochAttestations.push(pendingAttestation);
|
|
35
35
|
}
|
|
36
|
-
if (!isValidIndexedAttestation(state.config, epochCtx.index2pubkey, state, epochCtx.getIndexedAttestation(ForkSeq.phase0, attestation), verifySignature)) {
|
|
36
|
+
if (!isValidIndexedAttestation(state.config, epochCtx.index2pubkey, state.slot, state.validators.length, epochCtx.getIndexedAttestation(ForkSeq.phase0, attestation), verifySignature)) {
|
|
37
37
|
throw new Error("Attestation is not valid");
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processAttestationPhase0.js","sourceRoot":"","sources":["../../src/block/processAttestationPhase0.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,+BAA+B,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAqC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAC,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAC,yBAAyB,EAAC,MAAM,YAAY,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAA8B,EAC9B,WAA+B,EAC/B,eAAe,GAAG,IAAI;IAEtB,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAE9B,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAExD,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QAChE,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,WAAW,CAAC,eAAe;QAC5C,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI;QAChC,aAAa,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC;KAChD,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,KAAK,CACb,0EAA0E,eAAe,CACvF,IAAI,CAAC,MAAM,CACZ,+BAA+B,eAAe,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CACpF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CACb,2EAA2E,eAAe,CACxF,IAAI,CAAC,MAAM,CACZ,gCAAgC,eAAe,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,yBAAyB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED,IACE,CAAC,yBAAyB,CACxB,KAAK,CAAC,MAAM,EACZ,QAAQ,CAAC,YAAY,EACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"processAttestationPhase0.js","sourceRoot":"","sources":["../../src/block/processAttestationPhase0.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { BeaconConfig } from "@lodestar/config";
|
|
1
2
|
import { ForkSeq } from "@lodestar/params";
|
|
2
|
-
import { AttesterSlashing } from "@lodestar/types";
|
|
3
|
+
import { AttesterSlashing, Slot } from "@lodestar/types";
|
|
3
4
|
import { Index2PubkeyCache } from "../cache/pubkeyCache.js";
|
|
4
5
|
import { CachedBeaconStateAllForks } from "../types.js";
|
|
5
6
|
/**
|
|
@@ -9,5 +10,5 @@ import { CachedBeaconStateAllForks } from "../types.js";
|
|
|
9
10
|
* PERF: Work depends on number of AttesterSlashing per block. On regular networks the average is 0 / block.
|
|
10
11
|
*/
|
|
11
12
|
export declare function processAttesterSlashing(fork: ForkSeq, state: CachedBeaconStateAllForks, attesterSlashing: AttesterSlashing, verifySignatures?: boolean): void;
|
|
12
|
-
export declare function assertValidAttesterSlashing(index2pubkey: Index2PubkeyCache,
|
|
13
|
+
export declare function assertValidAttesterSlashing(config: BeaconConfig, index2pubkey: Index2PubkeyCache, stateSlot: Slot, validatorsLen: number, attesterSlashing: AttesterSlashing, verifySignatures?: boolean): void;
|
|
13
14
|
//# sourceMappingURL=processAttesterSlashing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processAttesterSlashing.d.ts","sourceRoot":"","sources":["../../src/block/processAttesterSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"processAttesterSlashing.d.ts","sourceRoot":"","sources":["../../src/block/processAttesterSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,gBAAgB,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAC,yBAAyB,EAAC,MAAM,aAAa,CAAC;AAKtD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,yBAAyB,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,UAAO,GACtB,IAAI,CA0BN;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,UAAO,GACtB,IAAI,CAkBN"}
|
|
@@ -9,7 +9,7 @@ import { slashValidator } from "./slashValidator.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export function processAttesterSlashing(fork, state, attesterSlashing, verifySignatures = true) {
|
|
11
11
|
const { epochCtx } = state;
|
|
12
|
-
assertValidAttesterSlashing(epochCtx.index2pubkey, state, attesterSlashing, verifySignatures);
|
|
12
|
+
assertValidAttesterSlashing(state.config, epochCtx.index2pubkey, state.slot, state.validators.length, attesterSlashing, verifySignatures);
|
|
13
13
|
const intersectingIndices = getAttesterSlashableIndices(attesterSlashing);
|
|
14
14
|
let slashedAny = false;
|
|
15
15
|
const validators = state.validators; // Get the validators sub tree once for all indices
|
|
@@ -24,7 +24,7 @@ export function processAttesterSlashing(fork, state, attesterSlashing, verifySig
|
|
|
24
24
|
throw new Error("AttesterSlashing did not result in any slashings");
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
export function assertValidAttesterSlashing(index2pubkey,
|
|
27
|
+
export function assertValidAttesterSlashing(config, index2pubkey, stateSlot, validatorsLen, attesterSlashing, verifySignatures = true) {
|
|
28
28
|
const attestation1 = attesterSlashing.attestation1;
|
|
29
29
|
const attestation2 = attesterSlashing.attestation2;
|
|
30
30
|
if (!isSlashableAttestationData(attestation1.data, attestation2.data)) {
|
|
@@ -34,7 +34,7 @@ export function assertValidAttesterSlashing(index2pubkey, state, attesterSlashin
|
|
|
34
34
|
// be higher than the clock and the slashing would still be valid. Same applies to attestation data index, which
|
|
35
35
|
// can be any arbitrary value. Must use bigint variants to hash correctly to all possible values
|
|
36
36
|
for (const [i, attestation] of [attestation1, attestation2].entries()) {
|
|
37
|
-
if (!isValidIndexedAttestationBigint(
|
|
37
|
+
if (!isValidIndexedAttestationBigint(config, index2pubkey, stateSlot, validatorsLen, attestation, verifySignatures)) {
|
|
38
38
|
throw new Error(`AttesterSlashing attestation${i} is invalid`);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processAttesterSlashing.js","sourceRoot":"","sources":["../../src/block/processAttesterSlashing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processAttesterSlashing.js","sourceRoot":"","sources":["../../src/block/processAttesterSlashing.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,2BAA2B,EAAE,0BAA0B,EAAE,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AAC/G,OAAO,EAAC,+BAA+B,EAAC,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAa,EACb,KAAgC,EAChC,gBAAkC,EAClC,gBAAgB,GAAG,IAAI;IAEvB,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC;IACzB,2BAA2B,CACzB,KAAK,CAAC,MAAM,EACZ,QAAQ,CAAC,YAAY,EACrB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,CAAC,MAAM,EACvB,gBAAgB,EAChB,gBAAgB,CACjB,CAAC;IAEF,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;IAE1E,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,mDAAmD;IACxF,2CAA2C;IAC3C,KAAK,MAAM,KAAK,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACnC,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAAoB,EACpB,YAA+B,EAC/B,SAAe,EACf,aAAqB,EACrB,gBAAkC,EAClC,gBAAgB,GAAG,IAAI;IAEvB,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC;IACnD,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC;IAEnD,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,8GAA8G;IAC9G,gHAAgH;IAChH,gGAAgG;IAChG,KAAK,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,IACE,CAAC,+BAA+B,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAC/G,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,aAAa,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { BeaconConfig } from "@lodestar/config";
|
|
1
2
|
import { capella } from "@lodestar/types";
|
|
3
|
+
import { Validator } from "@lodestar/types/phase0";
|
|
2
4
|
import { CachedBeaconStateCapella } from "../types.js";
|
|
3
5
|
export declare function processBlsToExecutionChange(state: CachedBeaconStateCapella, signedBlsToExecutionChange: capella.SignedBLSToExecutionChange): void;
|
|
4
|
-
export declare function isValidBlsToExecutionChange(
|
|
6
|
+
export declare function isValidBlsToExecutionChange(config: BeaconConfig, validator: Validator, signedBLSToExecutionChange: capella.SignedBLSToExecutionChange, verifySignature?: boolean): {
|
|
5
7
|
valid: true;
|
|
6
8
|
} | {
|
|
7
9
|
valid: false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBlsToExecutionChange.d.ts","sourceRoot":"","sources":["../../src/block/processBlsToExecutionChange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processBlsToExecutionChange.d.ts","sourceRoot":"","sources":["../../src/block/processBlsToExecutionChange.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAC,wBAAwB,EAAC,MAAM,aAAa,CAAC;AAErD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,wBAAwB,EAC/B,0BAA0B,EAAE,OAAO,CAAC,0BAA0B,GAC7D,IAAI,CAqBN;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,EACpB,0BAA0B,EAAE,OAAO,CAAC,0BAA0B,EAC9D,eAAe,UAAO,GACrB;IAAC,KAAK,EAAE,IAAI,CAAA;CAAC,GAAG;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,CAmC9C"}
|
|
@@ -5,26 +5,22 @@ import { toHex } from "@lodestar/utils";
|
|
|
5
5
|
import { verifyBlsToExecutionChangeSignature } from "../signatureSets/index.js";
|
|
6
6
|
export function processBlsToExecutionChange(state, signedBlsToExecutionChange) {
|
|
7
7
|
const addressChange = signedBlsToExecutionChange.message;
|
|
8
|
-
|
|
8
|
+
if (addressChange.validatorIndex >= state.validators.length) {
|
|
9
|
+
throw Error(`withdrawalValidatorIndex ${addressChange.validatorIndex} >= state.validators len ${state.validators.length}`);
|
|
10
|
+
}
|
|
11
|
+
const validator = state.validators.get(addressChange.validatorIndex);
|
|
12
|
+
const validation = isValidBlsToExecutionChange(state.config, validator, signedBlsToExecutionChange, true);
|
|
9
13
|
if (!validation.valid) {
|
|
10
14
|
throw validation.error;
|
|
11
15
|
}
|
|
12
|
-
const validator = state.validators.get(addressChange.validatorIndex);
|
|
13
16
|
const newWithdrawalCredentials = new Uint8Array(32);
|
|
14
17
|
newWithdrawalCredentials[0] = ETH1_ADDRESS_WITHDRAWAL_PREFIX;
|
|
15
18
|
newWithdrawalCredentials.set(addressChange.toExecutionAddress, 12);
|
|
16
19
|
// Set the new credentials back
|
|
17
20
|
validator.withdrawalCredentials = newWithdrawalCredentials;
|
|
18
21
|
}
|
|
19
|
-
export function isValidBlsToExecutionChange(
|
|
22
|
+
export function isValidBlsToExecutionChange(config, validator, signedBLSToExecutionChange, verifySignature = true) {
|
|
20
23
|
const addressChange = signedBLSToExecutionChange.message;
|
|
21
|
-
if (addressChange.validatorIndex >= state.validators.length) {
|
|
22
|
-
return {
|
|
23
|
-
valid: false,
|
|
24
|
-
error: Error(`withdrawalValidatorIndex ${addressChange.validatorIndex} > state.validators len ${state.validators.length}`),
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
const validator = state.validators.getReadonly(addressChange.validatorIndex);
|
|
28
24
|
const { withdrawalCredentials } = validator;
|
|
29
25
|
if (withdrawalCredentials[0] !== BLS_WITHDRAWAL_PREFIX) {
|
|
30
26
|
return {
|
|
@@ -41,7 +37,7 @@ export function isValidBlsToExecutionChange(state, signedBLSToExecutionChange, v
|
|
|
41
37
|
error: Error(`Invalid withdrawalCredentials expected=${toHex(withdrawalCredentials)} actual=${toHex(digestCredentials)}`),
|
|
42
38
|
};
|
|
43
39
|
}
|
|
44
|
-
if (verifySignature && !verifyBlsToExecutionChangeSignature(
|
|
40
|
+
if (verifySignature && !verifyBlsToExecutionChangeSignature(config, signedBLSToExecutionChange)) {
|
|
45
41
|
return {
|
|
46
42
|
valid: false,
|
|
47
43
|
error: Error(`Signature could not be verified for BLS to Execution Change for validatorIndex${addressChange.validatorIndex}`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBlsToExecutionChange.js","sourceRoot":"","sources":["../../src/block/processBlsToExecutionChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"processBlsToExecutionChange.js","sourceRoot":"","sources":["../../src/block/processBlsToExecutionChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAC,qBAAqB,EAAE,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AAGvF,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAC,mCAAmC,EAAC,MAAM,2BAA2B,CAAC;AAG9E,MAAM,UAAU,2BAA2B,CACzC,KAA+B,EAC/B,0BAA8D;IAE9D,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,CAAC;IAEzD,IAAI,aAAa,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,KAAK,CACT,4BAA4B,aAAa,CAAC,cAAc,4BAA4B,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAC9G,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAC1G,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,UAAU,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,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,MAAoB,EACpB,SAAoB,EACpB,0BAA8D,EAC9D,eAAe,GAAG,IAAI;IAEtB,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,CAAC;IAEzD,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,MAAM,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAChG,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,5 +1,8 @@
|
|
|
1
|
+
import { BeaconConfig } from "@lodestar/config";
|
|
1
2
|
import { ForkSeq } from "@lodestar/params";
|
|
2
|
-
import { phase0 } from "@lodestar/types";
|
|
3
|
+
import { Slot, phase0 } from "@lodestar/types";
|
|
4
|
+
import { Validator } from "@lodestar/types/phase0";
|
|
5
|
+
import { Index2PubkeyCache } from "../cache/pubkeyCache.js";
|
|
3
6
|
import { CachedBeaconStateAllForks } from "../types.js";
|
|
4
7
|
/**
|
|
5
8
|
* Process a ProposerSlashing operation. Initiates the exit of a validator, decreases the balance of the slashed
|
|
@@ -8,5 +11,5 @@ import { CachedBeaconStateAllForks } from "../types.js";
|
|
|
8
11
|
* PERF: Work depends on number of ProposerSlashing per block. On regular networks the average is 0 / block.
|
|
9
12
|
*/
|
|
10
13
|
export declare function processProposerSlashing(fork: ForkSeq, state: CachedBeaconStateAllForks, proposerSlashing: phase0.ProposerSlashing, verifySignatures?: boolean): void;
|
|
11
|
-
export declare function assertValidProposerSlashing(
|
|
14
|
+
export declare function assertValidProposerSlashing(config: BeaconConfig, index2pubkey: Index2PubkeyCache, stateSlot: Slot, proposerSlashing: phase0.ProposerSlashing, proposer: Validator, verifySignatures?: boolean): void;
|
|
12
15
|
//# sourceMappingURL=processProposerSlashing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processProposerSlashing.d.ts","sourceRoot":"","sources":["../../src/block/processProposerSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAM,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"processProposerSlashing.d.ts","sourceRoot":"","sources":["../../src/block/processProposerSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAC,IAAI,EAAE,MAAM,EAAM,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,yBAAyB,EAAyB,MAAM,aAAa,CAAC;AAK9E;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,yBAAyB,EAChC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EACzC,gBAAgB,UAAO,GACtB,IAAI,CAiCN;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,IAAI,EACf,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EACzC,QAAQ,EAAE,SAAS,EACnB,gBAAgB,UAAO,GACtB,IAAI,CAqCN"}
|
|
@@ -11,7 +11,8 @@ import { slashValidator } from "./slashValidator.js";
|
|
|
11
11
|
* PERF: Work depends on number of ProposerSlashing per block. On regular networks the average is 0 / block.
|
|
12
12
|
*/
|
|
13
13
|
export function processProposerSlashing(fork, state, proposerSlashing, verifySignatures = true) {
|
|
14
|
-
|
|
14
|
+
const proposer = state.validators.getReadonly(proposerSlashing.signedHeader1.message.proposerIndex);
|
|
15
|
+
assertValidProposerSlashing(state.config, state.epochCtx.index2pubkey, state.slot, proposerSlashing, proposer, verifySignatures);
|
|
15
16
|
if (fork >= ForkSeq.gloas) {
|
|
16
17
|
const slot = Number(proposerSlashing.signedHeader1.message.slot);
|
|
17
18
|
const proposalEpoch = computeEpochAtSlot(slot);
|
|
@@ -28,7 +29,7 @@ export function processProposerSlashing(fork, state, proposerSlashing, verifySig
|
|
|
28
29
|
}
|
|
29
30
|
slashValidator(fork, state, proposerSlashing.signedHeader1.message.proposerIndex);
|
|
30
31
|
}
|
|
31
|
-
export function assertValidProposerSlashing(
|
|
32
|
+
export function assertValidProposerSlashing(config, index2pubkey, stateSlot, proposerSlashing, proposer, verifySignatures = true) {
|
|
32
33
|
const header1 = proposerSlashing.signedHeader1.message;
|
|
33
34
|
const header2 = proposerSlashing.signedHeader2.message;
|
|
34
35
|
// verify header slots match
|
|
@@ -44,13 +45,14 @@ export function assertValidProposerSlashing(state, proposerSlashing, verifySigna
|
|
|
44
45
|
throw new Error("ProposerSlashing headers are equal");
|
|
45
46
|
}
|
|
46
47
|
// verify the proposer is slashable
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
// ideally we would get the proposer from state.validators using proposerIndex but that requires access to state
|
|
49
|
+
// instead of that we pass in the proposer directly from the consumer side
|
|
50
|
+
if (!isSlashableValidator(proposer, computeEpochAtSlot(stateSlot))) {
|
|
49
51
|
throw new Error("ProposerSlashing proposer is not slashable");
|
|
50
52
|
}
|
|
51
53
|
// verify signatures
|
|
52
54
|
if (verifySignatures) {
|
|
53
|
-
const signatureSets = getProposerSlashingSignatureSets(
|
|
55
|
+
const signatureSets = getProposerSlashingSignatureSets(config, index2pubkey, stateSlot, proposerSlashing);
|
|
54
56
|
for (let i = 0; i < signatureSets.length; i++) {
|
|
55
57
|
if (!verifySignatureSet(signatureSets[i])) {
|
|
56
58
|
throw new Error(`ProposerSlashing header${i + 1} signature invalid`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processProposerSlashing.js","sourceRoot":"","sources":["../../src/block/processProposerSlashing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processProposerSlashing.js","sourceRoot":"","sources":["../../src/block/processProposerSlashing.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import { capella } from "@lodestar/types";
|
|
|
3
3
|
import { CachedBeaconStateCapella, CachedBeaconStateElectra, CachedBeaconStateGloas } from "../types.js";
|
|
4
4
|
export declare function processWithdrawals(fork: ForkSeq, state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas, payload?: capella.FullOrBlindedExecutionPayload): void;
|
|
5
5
|
export declare function getExpectedWithdrawals(fork: ForkSeq, state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas): {
|
|
6
|
-
|
|
7
|
-
sampledValidators: number;
|
|
8
|
-
processedPartialWithdrawalsCount: number;
|
|
6
|
+
expectedWithdrawals: capella.Withdrawal[];
|
|
9
7
|
processedBuilderWithdrawalsCount: number;
|
|
8
|
+
processedPartialWithdrawalsCount: number;
|
|
9
|
+
processedValidatorSweepCount: number;
|
|
10
10
|
};
|
|
11
11
|
//# sourceMappingURL=processWithdrawals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processWithdrawals.d.ts","sourceRoot":"","sources":["../../src/block/processWithdrawals.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EAMR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiB,OAAO,EAAM,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAC,wBAAwB,EAAE,wBAAwB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAUvG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,sBAAsB,EACnF,OAAO,CAAC,EAAE,OAAO,CAAC,6BAA6B,GAC9C,IAAI,
|
|
1
|
+
{"version":3,"file":"processWithdrawals.d.ts","sourceRoot":"","sources":["../../src/block/processWithdrawals.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EAMR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiB,OAAO,EAAM,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAC,wBAAwB,EAAE,wBAAwB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAUvG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,sBAAsB,EACnF,OAAO,CAAC,EAAE,OAAO,CAAC,6BAA6B,GAC9C,IAAI,CAuFN;AAkND,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,sBAAsB,GAClF;IACD,mBAAmB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;IAC1C,gCAAgC,EAAE,MAAM,CAAC;IACzC,gCAAgC,EAAE,MAAM,CAAC;IACzC,4BAA4B,EAAE,MAAM,CAAC;CACtC,CA6DA"}
|