@lodestar/state-transition 1.47.0-dev.6325e4e1fe → 1.47.0-dev.6c2e8e6b0f
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 +2 -3
- package/lib/block/isValidIndexedAttestation.d.ts.map +1 -1
- package/lib/block/isValidIndexedAttestation.js +4 -4
- package/lib/block/isValidIndexedAttestation.js.map +1 -1
- package/lib/block/isValidIndexedPayloadAttestation.d.ts.map +1 -1
- package/lib/block/isValidIndexedPayloadAttestation.js +1 -1
- package/lib/block/isValidIndexedPayloadAttestation.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/processAttestationsAltair.js +2 -2
- package/lib/block/processAttestationsAltair.js.map +1 -1
- package/lib/block/processAttesterSlashing.d.ts +1 -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/processDeposit.d.ts.map +1 -1
- package/lib/block/processDeposit.js +21 -46
- package/lib/block/processDeposit.js.map +1 -1
- package/lib/block/processExecutionPayloadBid.d.ts.map +1 -1
- package/lib/block/processExecutionPayloadBid.js +2 -5
- package/lib/block/processExecutionPayloadBid.js.map +1 -1
- package/lib/block/processProposerSlashing.d.ts +1 -2
- package/lib/block/processProposerSlashing.d.ts.map +1 -1
- package/lib/block/processProposerSlashing.js +3 -3
- package/lib/block/processProposerSlashing.js.map +1 -1
- package/lib/block/processRandao.js +1 -1
- package/lib/block/processRandao.js.map +1 -1
- package/lib/block/processSyncCommittee.js +1 -1
- package/lib/block/processSyncCommittee.js.map +1 -1
- package/lib/block/processVoluntaryExit.d.ts.map +1 -1
- package/lib/block/processVoluntaryExit.js +1 -2
- package/lib/block/processVoluntaryExit.js.map +1 -1
- package/lib/cache/epochCache.d.ts +2 -2
- package/lib/cache/epochCache.d.ts.map +1 -1
- package/lib/cache/epochCache.js +5 -6
- package/lib/cache/epochCache.js.map +1 -1
- package/lib/cache/stateCache.js +1 -1
- package/lib/cache/stateCache.js.map +1 -1
- package/lib/cache/syncCommitteeCache.d.ts +2 -3
- package/lib/cache/syncCommitteeCache.d.ts.map +1 -1
- package/lib/cache/syncCommitteeCache.js.map +1 -1
- package/lib/epoch/processSyncCommitteeUpdates.js +1 -1
- package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -2
- package/lib/index.js.map +1 -1
- package/lib/lightClient/spec/store.d.ts +1 -1
- package/lib/lightClient/spec/store.d.ts.map +1 -1
- package/lib/lightClient/spec/utils.js +1 -1
- package/lib/lightClient/spec/utils.js.map +1 -1
- package/lib/lightClient/spec/validateLightClientUpdate.js +1 -1
- package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
- package/lib/rewards/attestationsRewards.d.ts +1 -1
- package/lib/rewards/attestationsRewards.d.ts.map +1 -1
- package/lib/rewards/attestationsRewards.js.map +1 -1
- package/lib/rewards/syncCommitteeRewards.d.ts +1 -1
- package/lib/rewards/syncCommitteeRewards.d.ts.map +1 -1
- package/lib/rewards/syncCommitteeRewards.js +3 -1
- package/lib/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/signatureSets/blsToExecutionChange.d.ts.map +1 -1
- package/lib/signatureSets/blsToExecutionChange.js +1 -2
- package/lib/signatureSets/blsToExecutionChange.js.map +1 -1
- package/lib/signatureSets/executionPayloadEnvelope.d.ts +2 -3
- package/lib/signatureSets/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/signatureSets/executionPayloadEnvelope.js +6 -7
- package/lib/signatureSets/executionPayloadEnvelope.js.map +1 -1
- package/lib/signatureSets/proposer.d.ts +1 -2
- package/lib/signatureSets/proposer.d.ts.map +1 -1
- package/lib/signatureSets/proposer.js +2 -2
- package/lib/signatureSets/proposer.js.map +1 -1
- package/lib/signatureSets/randao.d.ts +1 -2
- package/lib/signatureSets/randao.d.ts.map +1 -1
- package/lib/signatureSets/randao.js +2 -2
- package/lib/signatureSets/randao.js.map +1 -1
- package/lib/signatureSets/voluntaryExits.d.ts +1 -2
- package/lib/signatureSets/voluntaryExits.d.ts.map +1 -1
- package/lib/signatureSets/voluntaryExits.js +3 -4
- package/lib/signatureSets/voluntaryExits.js.map +1 -1
- package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
- package/lib/slot/upgradeStateToGloas.js +27 -18
- package/lib/slot/upgradeStateToGloas.js.map +1 -1
- package/lib/stateTransition.js +1 -1
- package/lib/stateTransition.js.map +1 -1
- package/lib/stateView/stateViewFactory.d.ts +1 -1
- package/lib/stateView/stateViewFactory.d.ts.map +1 -1
- package/lib/stateView/stateViewFactory.js +2 -13
- package/lib/stateView/stateViewFactory.js.map +1 -1
- package/lib/testUtils/index.d.ts +1 -0
- package/lib/testUtils/index.d.ts.map +1 -1
- package/lib/testUtils/index.js +1 -0
- package/lib/testUtils/index.js.map +1 -1
- package/lib/testUtils/interopPubkeyCache.d.ts +7 -0
- package/lib/testUtils/interopPubkeyCache.d.ts.map +1 -0
- package/lib/testUtils/interopPubkeyCache.js +92 -0
- package/lib/testUtils/interopPubkeyCache.js.map +1 -0
- package/lib/testUtils/state.d.ts.map +1 -1
- package/lib/testUtils/state.js +5 -5
- package/lib/testUtils/state.js.map +1 -1
- package/lib/testUtils/testFileCache.d.ts.map +1 -1
- package/lib/testUtils/testFileCache.js +3 -0
- package/lib/testUtils/testFileCache.js.map +1 -1
- package/lib/testUtils/util.d.ts +1 -1
- package/lib/testUtils/util.d.ts.map +1 -1
- package/lib/testUtils/util.js +27 -35
- package/lib/testUtils/util.js.map +1 -1
- package/lib/util/gloas.d.ts +6 -0
- package/lib/util/gloas.d.ts.map +1 -1
- package/lib/util/gloas.js +25 -11
- package/lib/util/gloas.js.map +1 -1
- package/lib/util/interop.d.ts +1 -1
- package/lib/util/interop.d.ts.map +1 -1
- package/lib/util/interop.js +1 -1
- package/lib/util/interop.js.map +1 -1
- package/lib/util/signatureSets.d.ts +5 -13
- package/lib/util/signatureSets.d.ts.map +1 -1
- package/lib/util/signatureSets.js +30 -39
- package/lib/util/signatureSets.js.map +1 -1
- package/lib/util/syncCommittee.js +1 -1
- package/lib/util/syncCommittee.js.map +1 -1
- package/package.json +11 -12
- package/src/block/isValidIndexedAttestation.ts +2 -8
- package/src/block/isValidIndexedPayloadAttestation.ts +1 -4
- package/src/block/processAttestationPhase0.ts +0 -1
- package/src/block/processAttestationsAltair.ts +2 -2
- package/src/block/processAttesterSlashing.ts +2 -13
- package/src/block/processDeposit.ts +35 -47
- package/src/block/processExecutionPayloadBid.ts +8 -6
- package/src/block/processProposerSlashing.ts +2 -11
- package/src/block/processRandao.ts +1 -1
- package/src/block/processSyncCommittee.ts +1 -1
- package/src/block/processVoluntaryExit.ts +1 -4
- package/src/cache/epochCache.ts +6 -7
- package/src/cache/stateCache.ts +1 -1
- package/src/cache/syncCommitteeCache.ts +3 -2
- package/src/epoch/processSyncCommitteeUpdates.ts +1 -1
- package/src/index.ts +1 -6
- package/src/lightClient/spec/store.ts +1 -1
- package/src/lightClient/spec/utils.ts +1 -1
- package/src/lightClient/spec/validateLightClientUpdate.ts +1 -1
- package/src/rewards/attestationsRewards.ts +1 -1
- package/src/rewards/syncCommitteeRewards.ts +4 -2
- package/src/signatureSets/blsToExecutionChange.ts +1 -2
- package/src/signatureSets/executionPayloadEnvelope.ts +14 -15
- package/src/signatureSets/proposer.ts +1 -3
- package/src/signatureSets/randao.ts +2 -3
- package/src/signatureSets/voluntaryExits.ts +2 -5
- package/src/slot/upgradeStateToGloas.ts +28 -21
- package/src/stateTransition.ts +1 -1
- package/src/stateView/stateViewFactory.ts +2 -14
- package/src/testUtils/index.ts +1 -0
- package/src/testUtils/interopPubkeyCache.ts +100 -0
- package/src/testUtils/state.ts +5 -11
- package/src/testUtils/testFileCache.ts +3 -0
- package/src/testUtils/util.ts +26 -38
- package/src/util/gloas.ts +40 -11
- package/src/util/interop.ts +1 -1
- package/src/util/signatureSets.ts +34 -51
- package/src/util/syncCommittee.ts +1 -1
- package/lib/cache/pubkeyCache.d.ts +0 -28
- package/lib/cache/pubkeyCache.d.ts.map +0 -1
- package/lib/cache/pubkeyCache.js +0 -49
- package/lib/cache/pubkeyCache.js.map +0 -1
- package/src/cache/pubkeyCache.ts +0 -74
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BLS_VERIFIER_SET_TYPE, verifySignatureSets } from "@chainsafe/lodestar-z/bls-verifier";
|
|
2
2
|
export var SignatureSetType;
|
|
3
3
|
(function (SignatureSetType) {
|
|
4
4
|
SignatureSetType["single"] = "single";
|
|
@@ -9,53 +9,44 @@ export var SignatureSetType;
|
|
|
9
9
|
*/
|
|
10
10
|
SignatureSetType["indexed"] = "indexed";
|
|
11
11
|
})(SignatureSetType || (SignatureSetType = {}));
|
|
12
|
-
|
|
13
|
-
* Get the pubkey for a signature set, performing aggregation if necessary.
|
|
14
|
-
* Requires pubkeyCache for indexed and aggregate sets.
|
|
15
|
-
*/
|
|
16
|
-
export function getSignatureSetPubkey(signatureSet, pubkeyCache) {
|
|
12
|
+
export function toBlsSignatureSet(signatureSet) {
|
|
17
13
|
switch (signatureSet.type) {
|
|
18
14
|
case SignatureSetType.single:
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
export function verifySignatureSet(signatureSet, pubkeyCache) {
|
|
34
|
-
// All signatures are not trusted and must be group checked (p2.subgroup_check)
|
|
35
|
-
const signature = Signature.fromBytes(signatureSet.signature, true);
|
|
36
|
-
switch (signatureSet.type) {
|
|
37
|
-
case SignatureSetType.single:
|
|
38
|
-
return verify(signatureSet.signingRoot, signatureSet.pubkey, signature);
|
|
39
|
-
case SignatureSetType.indexed: {
|
|
40
|
-
if (!pubkeyCache) {
|
|
41
|
-
throw Error("pubkeyCache required for indexed signature set");
|
|
42
|
-
}
|
|
43
|
-
const pubkey = pubkeyCache.getOrThrow(signatureSet.index);
|
|
44
|
-
return verify(signatureSet.signingRoot, pubkey, signature);
|
|
45
|
-
}
|
|
15
|
+
return {
|
|
16
|
+
type: BLS_VERIFIER_SET_TYPE.single,
|
|
17
|
+
pubkey: signatureSet.pubkey,
|
|
18
|
+
message: signatureSet.signingRoot,
|
|
19
|
+
signature: signatureSet.signature,
|
|
20
|
+
};
|
|
21
|
+
case SignatureSetType.indexed:
|
|
22
|
+
return {
|
|
23
|
+
type: BLS_VERIFIER_SET_TYPE.indexed,
|
|
24
|
+
index: signatureSet.index,
|
|
25
|
+
message: signatureSet.signingRoot,
|
|
26
|
+
signature: signatureSet.signature,
|
|
27
|
+
};
|
|
46
28
|
case SignatureSetType.aggregate: {
|
|
47
|
-
|
|
48
|
-
|
|
29
|
+
const indices = new Uint32Array(signatureSet.indices.length);
|
|
30
|
+
for (const [i, index] of signatureSet.indices.entries()) {
|
|
31
|
+
if (!Number.isInteger(index) || index < 0 || index > 0xffffffff) {
|
|
32
|
+
throw new RangeError(`Invalid validator index ${index}`);
|
|
33
|
+
}
|
|
34
|
+
indices[i] = index;
|
|
49
35
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
return {
|
|
37
|
+
type: BLS_VERIFIER_SET_TYPE.aggregate,
|
|
38
|
+
indices,
|
|
39
|
+
message: signatureSet.signingRoot,
|
|
40
|
+
signature: signatureSet.signature,
|
|
41
|
+
};
|
|
54
42
|
}
|
|
55
43
|
default:
|
|
56
44
|
throw Error("Unknown signature set type");
|
|
57
45
|
}
|
|
58
46
|
}
|
|
47
|
+
export function verifySignatureSet(signatureSet) {
|
|
48
|
+
return verifySignatureSets([toBlsSignatureSet(signatureSet)]);
|
|
49
|
+
}
|
|
59
50
|
export function createSingleSignatureSetFromComponents(pubkey, signingRoot, signature) {
|
|
60
51
|
return {
|
|
61
52
|
type: SignatureSetType.single,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signatureSets.js","sourceRoot":"","sources":["../../src/util/signatureSets.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"signatureSets.js","sourceRoot":"","sources":["../../src/util/signatureSets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAwB,mBAAmB,EAAC,MAAM,oCAAoC,CAAC;AAGpH,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,2CAAuB,CAAA;IACvB;;;OAGG;IACH,uCAAmB,CAAA;AACrB,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AAqCD,MAAM,UAAU,iBAAiB,CAAC,YAA2B;IAC3D,QAAQ,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1B,KAAK,gBAAgB,CAAC,MAAM;YAC1B,OAAO;gBACL,IAAI,EAAE,qBAAqB,CAAC,MAAM;gBAClC,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,YAAY,CAAC,WAAW;gBACjC,SAAS,EAAE,YAAY,CAAC,SAAS;aAClC,CAAC;QAEJ,KAAK,gBAAgB,CAAC,OAAO;YAC3B,OAAO;gBACL,IAAI,EAAE,qBAAqB,CAAC,OAAO;gBACnC,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,OAAO,EAAE,YAAY,CAAC,WAAW;gBACjC,SAAS,EAAE,YAAY,CAAC,SAAS;aAClC,CAAC;QAEJ,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7D,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;oBAChE,MAAM,IAAI,UAAU,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,qBAAqB,CAAC,SAAS;gBACrC,OAAO;gBACP,OAAO,EAAE,YAAY,CAAC,WAAW;gBACjC,SAAS,EAAE,YAAY,CAAC,SAAS;aAClC,CAAC;QACJ,CAAC;QAED;YACE,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAA2B;IAC5D,OAAO,mBAAmB,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,MAAkB,EAClB,WAAiB,EACjB,SAAqB;IAErB,OAAO;QACL,IAAI,EAAE,gBAAgB,CAAC,MAAM;QAC7B,MAAM;QACN,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,KAAa,EACb,WAAiB,EACjB,SAAqB;IAErB,OAAO;QACL,IAAI,EAAE,gBAAgB,CAAC,OAAO;QAC9B,KAAK;QACL,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yCAAyC,CACvD,OAAiB,EACjB,WAAiB,EACjB,SAAqB;IAErB,OAAO;QACL,IAAI,EAAE,gBAAgB,CAAC,SAAS;QAChC,OAAO;QACP,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aggregateSerializedPublicKeys } from "@chainsafe/blst";
|
|
1
|
+
import { aggregateSerializedPublicKeys } from "@chainsafe/lodestar-z/blst";
|
|
2
2
|
import { BASE_REWARD_FACTOR, EFFECTIVE_BALANCE_INCREMENT, SLOTS_PER_EPOCH, SYNC_COMMITTEE_SIZE, SYNC_REWARD_WEIGHT, WEIGHT_DENOMINATOR, } from "@lodestar/params";
|
|
3
3
|
import { bigIntSqrt } from "@lodestar/utils";
|
|
4
4
|
import { getNextSyncCommitteeIndices } from "./seed.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCommittee.js","sourceRoot":"","sources":["../../src/util/syncCommittee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,6BAA6B,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"syncCommittee.js","sourceRoot":"","sources":["../../src/util/syncCommittee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,6BAA6B,EAAC,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAE3B,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAC,2BAA2B,EAAC,MAAM,WAAW,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAa,EACb,KAA0B,EAC1B,sBAAmC,EACnC,0BAAsD;IAEtD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,CAAC,CAAC;IAE7G,iFAAiF;IACjF,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,OAAO;QACP,aAAa,EAAE;YACb,OAAO;YACP,eAAe,EAAE,6BAA6B,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;SAClE;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,4BAAoC;IAC/E,MAAM,kBAAkB,GAAG,MAAM,CAAC,4BAA4B,CAAC,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACtG,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK,CACvC,CAAC,2BAA2B,GAAG,kBAAkB,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAC5F,CAAC;IACF,MAAM,gBAAgB,GAAG,sBAAsB,GAAG,4BAA4B,CAAC;IAC/E,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CACtC,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,GAAG,kBAAkB,CAAC,GAAG,eAAe,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,CAAC;AACjE,CAAC;AAED;;;IAGI;AACJ,MAAM,UAAU,6BAA6B,CAAC,2BAAmC;IAC/E,OAAO,IAAI,CAAC,KAAK,CACf,CAAC,2BAA2B,GAAG,kBAAkB,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,2BAA2B,CAAC,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAChG,CAAC;AACJ,CAAC"}
|
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.47.0-dev.
|
|
14
|
+
"version": "1.47.0-dev.6c2e8e6b0f",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -65,20 +65,19 @@
|
|
|
65
65
|
},
|
|
66
66
|
"types": "lib/index.d.ts",
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@chainsafe/as-sha256": "^1.2.
|
|
69
|
-
"@chainsafe/
|
|
70
|
-
"@chainsafe/persistent-merkle-tree": "^1.3.
|
|
71
|
-
"@chainsafe/
|
|
72
|
-
"@chainsafe/ssz": "^1.6.2",
|
|
68
|
+
"@chainsafe/as-sha256": "^1.2.5",
|
|
69
|
+
"@chainsafe/lodestar-z": "catalog:",
|
|
70
|
+
"@chainsafe/persistent-merkle-tree": "^1.3.1",
|
|
71
|
+
"@chainsafe/ssz": "^1.6.3",
|
|
73
72
|
"@chainsafe/swap-or-not-shuffle": "^1.2.1",
|
|
74
|
-
"@lodestar/config": "^1.47.0-dev.
|
|
75
|
-
"@lodestar/params": "^1.47.0-dev.
|
|
76
|
-
"@lodestar/types": "^1.47.0-dev.
|
|
77
|
-
"@lodestar/utils": "^1.47.0-dev.
|
|
73
|
+
"@lodestar/config": "^1.47.0-dev.6c2e8e6b0f",
|
|
74
|
+
"@lodestar/params": "^1.47.0-dev.6c2e8e6b0f",
|
|
75
|
+
"@lodestar/types": "^1.47.0-dev.6c2e8e6b0f",
|
|
76
|
+
"@lodestar/utils": "^1.47.0-dev.6c2e8e6b0f",
|
|
78
77
|
"@vekexasia/bigint-buffer2": "^1.1.1"
|
|
79
78
|
},
|
|
80
79
|
"devDependencies": {
|
|
81
|
-
"@lodestar/api": "^1.47.0-dev.
|
|
80
|
+
"@lodestar/api": "^1.47.0-dev.6c2e8e6b0f"
|
|
82
81
|
},
|
|
83
82
|
"keywords": [
|
|
84
83
|
"ethereum",
|
|
@@ -86,5 +85,5 @@
|
|
|
86
85
|
"beacon",
|
|
87
86
|
"blockchain"
|
|
88
87
|
],
|
|
89
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "41a9bfa3784b13995f140ae2396c005b7720d194"
|
|
90
89
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
2
2
|
import {ForkSeq, MAX_COMMITTEES_PER_SLOT, MAX_VALIDATORS_PER_COMMITTEE} from "@lodestar/params";
|
|
3
3
|
import {IndexedAttestation, IndexedAttestationBigint, Slot} from "@lodestar/types";
|
|
4
|
-
import {PubkeyCache} from "../cache/pubkeyCache.js";
|
|
5
4
|
import {getIndexedAttestationBigintSignatureSet, getIndexedAttestationSignatureSet} from "../signatureSets/index.js";
|
|
6
5
|
import {verifySignatureSet} from "../util/index.js";
|
|
7
6
|
|
|
@@ -10,7 +9,6 @@ import {verifySignatureSet} from "../util/index.js";
|
|
|
10
9
|
*/
|
|
11
10
|
export function isValidIndexedAttestation(
|
|
12
11
|
config: BeaconConfig,
|
|
13
|
-
pubkeyCache: PubkeyCache,
|
|
14
12
|
stateSlot: Slot,
|
|
15
13
|
validatorsLen: number,
|
|
16
14
|
indexedAttestation: IndexedAttestation,
|
|
@@ -21,14 +19,13 @@ export function isValidIndexedAttestation(
|
|
|
21
19
|
}
|
|
22
20
|
|
|
23
21
|
if (verifySignature) {
|
|
24
|
-
return verifySignatureSet(getIndexedAttestationSignatureSet(config, stateSlot, indexedAttestation)
|
|
22
|
+
return verifySignatureSet(getIndexedAttestationSignatureSet(config, stateSlot, indexedAttestation));
|
|
25
23
|
}
|
|
26
24
|
return true;
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
export function isValidIndexedAttestationBigint(
|
|
30
28
|
config: BeaconConfig,
|
|
31
|
-
pubkeyCache: PubkeyCache,
|
|
32
29
|
stateSlot: Slot,
|
|
33
30
|
validatorsLen: number,
|
|
34
31
|
indexedAttestation: IndexedAttestationBigint,
|
|
@@ -39,10 +36,7 @@ export function isValidIndexedAttestationBigint(
|
|
|
39
36
|
}
|
|
40
37
|
|
|
41
38
|
if (verifySignature) {
|
|
42
|
-
return verifySignatureSet(
|
|
43
|
-
getIndexedAttestationBigintSignatureSet(config, stateSlot, indexedAttestation),
|
|
44
|
-
pubkeyCache
|
|
45
|
-
);
|
|
39
|
+
return verifySignatureSet(getIndexedAttestationBigintSignatureSet(config, stateSlot, indexedAttestation));
|
|
46
40
|
}
|
|
47
41
|
return true;
|
|
48
42
|
}
|
|
@@ -16,10 +16,7 @@ export function isValidIndexedPayloadAttestation(
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
if (verifySignature) {
|
|
19
|
-
return verifySignatureSet(
|
|
20
|
-
getIndexedPayloadAttestationSignatureSet(state.config, indexedPayloadAttestation),
|
|
21
|
-
state.epochCtx.pubkeyCache
|
|
22
|
-
);
|
|
19
|
+
return verifySignatureSet(getIndexedPayloadAttestationSignatureSet(state.config, indexedPayloadAttestation));
|
|
23
20
|
}
|
|
24
21
|
|
|
25
22
|
return true;
|
|
@@ -67,7 +67,7 @@ export function processAttestationsAltair(
|
|
|
67
67
|
// we can verify only that and nothing else.
|
|
68
68
|
if (verifySignature) {
|
|
69
69
|
const sigSet = getAttestationWithIndicesSignatureSet(state.config, state.slot, attestation, attestingIndices);
|
|
70
|
-
if (!verifySignatureSet(sigSet
|
|
70
|
+
if (!verifySignatureSet(sigSet)) {
|
|
71
71
|
throw new Error("Attestation signature is not valid");
|
|
72
72
|
}
|
|
73
73
|
}
|
|
@@ -134,7 +134,7 @@ export function processAttestationsAltair(
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
if (isSameSlotAttestation && flagsNewSet !== 0) {
|
|
137
|
+
if (fork >= ForkSeq.gloas && isSameSlotAttestation && flags === 0 && flagsNewSet !== 0) {
|
|
138
138
|
paymentWeightToAdd += effectiveBalanceIncrements[validatorIndex];
|
|
139
139
|
}
|
|
140
140
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
2
2
|
import {ForkSeq} from "@lodestar/params";
|
|
3
3
|
import {AttesterSlashing, Slot} from "@lodestar/types";
|
|
4
|
-
import {PubkeyCache} from "../cache/pubkeyCache.js";
|
|
5
4
|
import {CachedBeaconStateAllForks} from "../types.js";
|
|
6
5
|
import {getAttesterSlashableIndices, isSlashableAttestationData, isSlashableValidator} from "../util/index.js";
|
|
7
6
|
import {isValidIndexedAttestationBigint} from "./isValidIndexedAttestation.js";
|
|
@@ -20,14 +19,7 @@ export function processAttesterSlashing(
|
|
|
20
19
|
verifySignatures = true
|
|
21
20
|
): void {
|
|
22
21
|
const {epochCtx} = state;
|
|
23
|
-
assertValidAttesterSlashing(
|
|
24
|
-
state.config,
|
|
25
|
-
epochCtx.pubkeyCache,
|
|
26
|
-
state.slot,
|
|
27
|
-
state.validators.length,
|
|
28
|
-
attesterSlashing,
|
|
29
|
-
verifySignatures
|
|
30
|
-
);
|
|
22
|
+
assertValidAttesterSlashing(state.config, state.slot, state.validators.length, attesterSlashing, verifySignatures);
|
|
31
23
|
|
|
32
24
|
const intersectingIndices = getAttesterSlashableIndices(attesterSlashing);
|
|
33
25
|
|
|
@@ -48,7 +40,6 @@ export function processAttesterSlashing(
|
|
|
48
40
|
|
|
49
41
|
export function assertValidAttesterSlashing(
|
|
50
42
|
config: BeaconConfig,
|
|
51
|
-
pubkeyCache: PubkeyCache,
|
|
52
43
|
stateSlot: Slot,
|
|
53
44
|
validatorsLen: number,
|
|
54
45
|
attesterSlashing: AttesterSlashing,
|
|
@@ -65,9 +56,7 @@ export function assertValidAttesterSlashing(
|
|
|
65
56
|
// be higher than the clock and the slashing would still be valid. Same applies to attestation data index, which
|
|
66
57
|
// can be any arbitrary value. Must use bigint variants to hash correctly to all possible values
|
|
67
58
|
for (const [i, attestation] of [attestation1, attestation2].entries()) {
|
|
68
|
-
if (
|
|
69
|
-
!isValidIndexedAttestationBigint(config, pubkeyCache, stateSlot, validatorsLen, attestation, verifySignatures)
|
|
70
|
-
) {
|
|
59
|
+
if (!isValidIndexedAttestationBigint(config, stateSlot, validatorsLen, attestation, verifySignatures)) {
|
|
71
60
|
throw new Error(`AttesterSlashing attestation${i} is invalid`);
|
|
72
61
|
}
|
|
73
62
|
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BLS_VERIFIER_MAX_BATCH_SIZE,
|
|
3
|
+
BLS_VERIFIER_SET_TYPE,
|
|
4
|
+
type BlsSignatureSet,
|
|
5
|
+
verifySignatureSets,
|
|
6
|
+
} from "@chainsafe/lodestar-z/bls-verifier";
|
|
2
7
|
import {BeaconConfig} from "@lodestar/config";
|
|
3
8
|
import {
|
|
4
9
|
DEPOSIT_CONTRACT_TREE_DEPTH,
|
|
@@ -13,7 +18,14 @@ import {BLSPubkey, Bytes32, UintNum64, electra, phase0, ssz} from "@lodestar/typ
|
|
|
13
18
|
import {verifyMerkleBranch} from "@lodestar/utils";
|
|
14
19
|
import {ZERO_HASH} from "../constants/index.js";
|
|
15
20
|
import {CachedBeaconStateAllForks, CachedBeaconStateAltair, CachedBeaconStateElectra} from "../types.js";
|
|
16
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
computeDomain,
|
|
23
|
+
computeSigningRoot,
|
|
24
|
+
createSingleSignatureSetFromComponents,
|
|
25
|
+
getMaxEffectiveBalance,
|
|
26
|
+
increaseBalance,
|
|
27
|
+
verifySignatureSet,
|
|
28
|
+
} from "../util/index.js";
|
|
17
29
|
|
|
18
30
|
/**
|
|
19
31
|
* Process a Deposit operation. Potentially adds a new validator to the registry. Mutates the validators and balances
|
|
@@ -159,11 +171,7 @@ export function isValidDepositSignature(
|
|
|
159
171
|
const domain = computeDomain(DOMAIN_DEPOSIT, config.GENESIS_FORK_VERSION, ZERO_HASH);
|
|
160
172
|
const signingRoot = computeSigningRoot(ssz.phase0.DepositMessage, depositMessage, domain);
|
|
161
173
|
try {
|
|
162
|
-
|
|
163
|
-
const publicKey = PublicKey.fromBytes(pubkey, true);
|
|
164
|
-
const signature = Signature.fromBytes(depositSignature, true);
|
|
165
|
-
|
|
166
|
-
return verify(signingRoot, publicKey, signature);
|
|
174
|
+
return verifySignatureSet(createSingleSignatureSetFromComponents(pubkey, signingRoot, depositSignature));
|
|
167
175
|
} catch (_e) {
|
|
168
176
|
return false; // Catch all BLS errors: failed key validation, failed signature validation, invalid signature
|
|
169
177
|
}
|
|
@@ -184,54 +192,34 @@ export function verifyDepositSignatures(config: BeaconConfig, deposits: electra.
|
|
|
184
192
|
// fork-agnostic domain since deposits are valid across forks, matching isValidDepositSignature
|
|
185
193
|
const domain = computeDomain(DOMAIN_DEPOSIT, config.GENESIS_FORK_VERSION, ZERO_HASH);
|
|
186
194
|
|
|
187
|
-
const signatureSets:
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
195
|
+
const signatureSets: BlsSignatureSet[] = deposits.map(({pubkey, withdrawalCredentials, amount, signature}) => ({
|
|
196
|
+
type: BLS_VERIFIER_SET_TYPE.single,
|
|
197
|
+
pubkey,
|
|
198
|
+
message: computeSigningRoot(ssz.phase0.DepositMessage, {pubkey, withdrawalCredentials, amount}, domain),
|
|
199
|
+
signature,
|
|
200
|
+
}));
|
|
201
|
+
|
|
202
|
+
for (let chunkStart = 0; chunkStart < signatureSets.length; chunkStart += BLS_VERIFIER_MAX_BATCH_SIZE) {
|
|
203
|
+
const chunk = signatureSets.slice(chunkStart, chunkStart + BLS_VERIFIER_MAX_BATCH_SIZE);
|
|
204
|
+
let chunkValid: boolean;
|
|
193
205
|
try {
|
|
194
|
-
|
|
195
|
-
// batched across all sets.
|
|
196
|
-
pk = PublicKey.fromBytes(pubkey);
|
|
197
|
-
sig = Signature.fromBytes(signature);
|
|
206
|
+
chunkValid = verifySignatureSets(chunk);
|
|
198
207
|
} catch (_) {
|
|
199
|
-
|
|
200
|
-
continue;
|
|
208
|
+
chunkValid = false;
|
|
201
209
|
}
|
|
202
|
-
const msg = computeSigningRoot(ssz.phase0.DepositMessage, {pubkey, withdrawalCredentials, amount}, domain);
|
|
203
|
-
signatureSets.push({pk, msg, sig});
|
|
204
|
-
signatureSetDepositIndices.push(i);
|
|
205
|
-
}
|
|
206
210
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
// Deposit pubkeys and signatures are untrusted, so group + infinity checks are required.
|
|
212
|
-
// The trailing (true, true) args delegate those checks to blst, amortized across the batch.
|
|
213
|
-
let batchValid: boolean;
|
|
214
|
-
try {
|
|
215
|
-
batchValid =
|
|
216
|
-
signatureSets.length >= 2
|
|
217
|
-
? verifyMultipleAggregateSignatures(signatureSets, true, true)
|
|
218
|
-
: verify(signatureSets[0].msg, signatureSets[0].pk, signatureSets[0].sig, true, true);
|
|
219
|
-
} catch (_) {
|
|
220
|
-
batchValid = false;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
if (batchValid) {
|
|
224
|
-
for (const depositIndex of signatureSetDepositIndices) {
|
|
225
|
-
results[depositIndex] = true;
|
|
211
|
+
if (chunkValid) {
|
|
212
|
+
results.fill(true, chunkStart, chunkStart + chunk.length);
|
|
213
|
+
continue;
|
|
226
214
|
}
|
|
227
|
-
|
|
228
|
-
for (let
|
|
215
|
+
|
|
216
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
229
217
|
try {
|
|
230
|
-
if (
|
|
231
|
-
results[
|
|
218
|
+
if (verifySignatureSets([chunk[i]])) {
|
|
219
|
+
results[chunkStart + i] = true;
|
|
232
220
|
}
|
|
233
221
|
} catch (_) {
|
|
234
|
-
//
|
|
222
|
+
// Invalid point or malformed bytes leave this deposit false.
|
|
235
223
|
}
|
|
236
224
|
}
|
|
237
225
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {PublicKey, Signature, verify} from "@chainsafe/blst";
|
|
2
1
|
import {
|
|
3
2
|
BUILDER_INDEX_SELF_BUILD,
|
|
4
3
|
ForkSeq,
|
|
@@ -12,7 +11,13 @@ import {G2_POINT_AT_INFINITY} from "../constants/constants.js";
|
|
|
12
11
|
import {getExecutionPayloadBidSigningRoot} from "../signatureSets/executionPayloadBid.js";
|
|
13
12
|
import {CachedBeaconStateGloas, CachedBeaconStateHeze} from "../types.js";
|
|
14
13
|
import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.js";
|
|
15
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
createSingleSignatureSetFromComponents,
|
|
16
|
+
getBlockRootAtSlot,
|
|
17
|
+
getCurrentEpoch,
|
|
18
|
+
getRandaoMix,
|
|
19
|
+
verifySignatureSet,
|
|
20
|
+
} from "../util/index.js";
|
|
16
21
|
|
|
17
22
|
export function processExecutionPayloadBid(
|
|
18
23
|
state: CachedBeaconStateGloas | CachedBeaconStateHeze,
|
|
@@ -123,10 +128,7 @@ function verifyExecutionPayloadBidSignature(
|
|
|
123
128
|
const signingRoot = getExecutionPayloadBidSigningRoot(state.config, signedBid.message);
|
|
124
129
|
|
|
125
130
|
try {
|
|
126
|
-
|
|
127
|
-
const signature = Signature.fromBytes(signedBid.signature, true);
|
|
128
|
-
|
|
129
|
-
return verify(signingRoot, publicKey, signature);
|
|
131
|
+
return verifySignatureSet(createSingleSignatureSetFromComponents(pubkey, signingRoot, signedBid.signature));
|
|
130
132
|
} catch (_e) {
|
|
131
133
|
return false; // Catch all BLS errors: failed key validation, failed signature validation, invalid signature
|
|
132
134
|
}
|
|
@@ -2,7 +2,6 @@ import {BeaconConfig} from "@lodestar/config";
|
|
|
2
2
|
import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
3
3
|
import {Slot, phase0, ssz} from "@lodestar/types";
|
|
4
4
|
import {Validator} from "@lodestar/types/phase0";
|
|
5
|
-
import {PubkeyCache} from "../cache/pubkeyCache.js";
|
|
6
5
|
import {getProposerSlashingSignatureSets} from "../signatureSets/index.js";
|
|
7
6
|
import {CachedBeaconStateAllForks, CachedBeaconStateGloas} from "../types.js";
|
|
8
7
|
import {computeEpochAtSlot, isSlashableValidator} from "../util/index.js";
|
|
@@ -22,14 +21,7 @@ export function processProposerSlashing(
|
|
|
22
21
|
verifySignatures = true
|
|
23
22
|
): void {
|
|
24
23
|
const proposer = state.validators.getReadonly(proposerSlashing.signedHeader1.message.proposerIndex);
|
|
25
|
-
assertValidProposerSlashing(
|
|
26
|
-
state.config,
|
|
27
|
-
state.epochCtx.pubkeyCache,
|
|
28
|
-
state.slot,
|
|
29
|
-
proposerSlashing,
|
|
30
|
-
proposer,
|
|
31
|
-
verifySignatures
|
|
32
|
-
);
|
|
24
|
+
assertValidProposerSlashing(state.config, state.slot, proposerSlashing, proposer, verifySignatures);
|
|
33
25
|
|
|
34
26
|
if (fork >= ForkSeq.gloas) {
|
|
35
27
|
// Remove the BuilderPendingPayment corresponding to this proposal if it is still in the
|
|
@@ -62,7 +54,6 @@ export function processProposerSlashing(
|
|
|
62
54
|
|
|
63
55
|
export function assertValidProposerSlashing(
|
|
64
56
|
config: BeaconConfig,
|
|
65
|
-
pubkeyCache: PubkeyCache,
|
|
66
57
|
stateSlot: Slot,
|
|
67
58
|
proposerSlashing: phase0.ProposerSlashing,
|
|
68
59
|
proposer: Validator,
|
|
@@ -99,7 +90,7 @@ export function assertValidProposerSlashing(
|
|
|
99
90
|
if (verifySignatures) {
|
|
100
91
|
const signatureSets = getProposerSlashingSignatureSets(config, stateSlot, proposerSlashing);
|
|
101
92
|
for (let i = 0; i < signatureSets.length; i++) {
|
|
102
|
-
if (!verifySignatureSet(signatureSets[i]
|
|
93
|
+
if (!verifySignatureSet(signatureSets[i])) {
|
|
103
94
|
throw new Error(`ProposerSlashing header${i + 1} signature invalid`);
|
|
104
95
|
}
|
|
105
96
|
}
|
|
@@ -17,7 +17,7 @@ export function processRandao(state: CachedBeaconStateAllForks, block: BeaconBlo
|
|
|
17
17
|
const randaoReveal = block.body.randaoReveal;
|
|
18
18
|
|
|
19
19
|
// verify RANDAO reveal
|
|
20
|
-
if (verifySignature && !verifyRandaoSignature(config,
|
|
20
|
+
if (verifySignature && !verifyRandaoSignature(config, block)) {
|
|
21
21
|
throw new Error("RANDAO reveal is an invalid signature");
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -32,7 +32,7 @@ export function processSyncAggregate(
|
|
|
32
32
|
participantIndices
|
|
33
33
|
);
|
|
34
34
|
// When there's no participation we consider the signature valid and just ignore it
|
|
35
|
-
if (signatureSet !== null && !verifySignatureSet(signatureSet
|
|
35
|
+
if (signatureSet !== null && !verifySignatureSet(signatureSet)) {
|
|
36
36
|
throw Error("Sync committee signature invalid");
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -93,10 +93,7 @@ function getValidatorVoluntaryExitValidity(
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
// Verify signature
|
|
96
|
-
if (
|
|
97
|
-
verifySignature &&
|
|
98
|
-
!verifyVoluntaryExitSignature(config, epochCtx.pubkeyCache, new BeaconStateView(state), signedVoluntaryExit)
|
|
99
|
-
) {
|
|
96
|
+
if (verifySignature && !verifyVoluntaryExitSignature(config, new BeaconStateView(state), signedVoluntaryExit)) {
|
|
100
97
|
return VoluntaryExitValidity.invalidSignature;
|
|
101
98
|
}
|
|
102
99
|
|
package/src/cache/epochCache.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {PublicKey} from "@chainsafe/blst";
|
|
1
|
+
import {PublicKey} from "@chainsafe/lodestar-z/blst";
|
|
2
|
+
import {type PubkeyCache, pubkeyCache as defaultPubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
2
3
|
import {BeaconConfig, ChainConfig, createBeaconConfig} from "@lodestar/config";
|
|
3
4
|
import {
|
|
4
5
|
ATTESTATION_SUBNET_COUNT,
|
|
@@ -56,7 +57,6 @@ import {sumTargetUnslashedBalanceIncrements} from "../util/targetUnslashedBalanc
|
|
|
56
57
|
import {BuilderDepositSignatureCache} from "./builderDepositSignatureCache.js";
|
|
57
58
|
import {EffectiveBalanceIncrements, getEffectiveBalanceIncrementsWithLen} from "./effectiveBalanceIncrements.js";
|
|
58
59
|
import {EpochTransitionCache} from "./epochTransitionCache.js";
|
|
59
|
-
import {PubkeyCache, createPubkeyCache, syncPubkeys} from "./pubkeyCache.js";
|
|
60
60
|
import {CachedBeaconStateAllForks, CachedBeaconStateFulu, CachedBeaconStateGloas} from "./stateCache.js";
|
|
61
61
|
import {
|
|
62
62
|
SyncCommitteeCache,
|
|
@@ -341,10 +341,10 @@ export class EpochCache {
|
|
|
341
341
|
const validators = state.validators.getAllReadonlyValues();
|
|
342
342
|
const validatorCount = validators.length;
|
|
343
343
|
|
|
344
|
-
// syncPubkeys here to ensure EpochCacheImmutableData is
|
|
344
|
+
// syncPubkeys here to ensure EpochCacheImmutableData is populated before computing the rest of caches
|
|
345
345
|
// - computeSyncCommitteeCache() needs a fully populated pubkeyCache
|
|
346
346
|
if (!opts?.skipSyncPubkeys) {
|
|
347
|
-
syncPubkeys(
|
|
347
|
+
pubkeyCache.syncPubkeys(validators);
|
|
348
348
|
}
|
|
349
349
|
|
|
350
350
|
const effectiveBalanceIncrements = getEffectiveBalanceIncrementsWithLen(validatorCount);
|
|
@@ -908,7 +908,7 @@ export class EpochCache {
|
|
|
908
908
|
}
|
|
909
909
|
|
|
910
910
|
addPubkey(index: ValidatorIndex, pubkey: Uint8Array): void {
|
|
911
|
-
this.pubkeyCache.
|
|
911
|
+
this.pubkeyCache.append(index, pubkey);
|
|
912
912
|
}
|
|
913
913
|
|
|
914
914
|
getShufflingAtSlot(slot: Slot): EpochShuffling {
|
|
@@ -1123,7 +1123,6 @@ export function createEmptyEpochCacheImmutableData(
|
|
|
1123
1123
|
): EpochCacheImmutableData {
|
|
1124
1124
|
return {
|
|
1125
1125
|
config: createBeaconConfig(chainConfig, state.genesisValidatorsRoot),
|
|
1126
|
-
|
|
1127
|
-
pubkeyCache: createPubkeyCache(),
|
|
1126
|
+
pubkeyCache: defaultPubkeyCache,
|
|
1128
1127
|
};
|
|
1129
1128
|
}
|
package/src/cache/stateCache.ts
CHANGED
|
@@ -187,7 +187,7 @@ export function loadCachedBeaconState<T extends CachedBeaconStateAllForks>(
|
|
|
187
187
|
const validators = migratedState.validators;
|
|
188
188
|
for (const validatorIndex of modifiedValidators) {
|
|
189
189
|
const validator = validators.getReadonly(validatorIndex);
|
|
190
|
-
pubkeyCache.
|
|
190
|
+
pubkeyCache.append(validatorIndex, validator.pubkey);
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
return createCachedBeaconState(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
1
2
|
import {CompositeViewDU} from "@chainsafe/ssz";
|
|
2
3
|
import {ValidatorIndex, ssz} from "@lodestar/types";
|
|
3
4
|
import {toPubkeyHex} from "@lodestar/utils";
|
|
@@ -38,7 +39,7 @@ export function getSyncCommitteeCache(validatorIndices: Uint32Array): SyncCommit
|
|
|
38
39
|
|
|
39
40
|
export function computeSyncCommitteeCache(
|
|
40
41
|
syncCommittee: CompositeViewDU<typeof ssz.altair.SyncCommittee>,
|
|
41
|
-
pubkeyCache:
|
|
42
|
+
pubkeyCache: PubkeyCache
|
|
42
43
|
): SyncCommitteeCache {
|
|
43
44
|
const validatorIndices = computeSyncCommitteeValidatorIndices(syncCommittee, pubkeyCache);
|
|
44
45
|
const validatorIndexMap = computeValidatorSyncCommitteeIndexMap(validatorIndices);
|
|
@@ -78,7 +79,7 @@ export function computeValidatorSyncCommitteeIndexMap(
|
|
|
78
79
|
*/
|
|
79
80
|
function computeSyncCommitteeValidatorIndices(
|
|
80
81
|
syncCommittee: CompositeViewDU<typeof ssz.altair.SyncCommittee>,
|
|
81
|
-
pubkeyCache:
|
|
82
|
+
pubkeyCache: PubkeyCache
|
|
82
83
|
): Uint32Array {
|
|
83
84
|
const pubkeys = syncCommittee.pubkeys.getAllReadonly();
|
|
84
85
|
const validatorIndices = new Uint32Array(pubkeys.length);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {aggregateSerializedPublicKeys} from "@chainsafe/blst";
|
|
1
|
+
import {aggregateSerializedPublicKeys} from "@chainsafe/lodestar-z/blst";
|
|
2
2
|
import {EPOCHS_PER_SYNC_COMMITTEE_PERIOD, ForkSeq} from "@lodestar/params";
|
|
3
3
|
import {ssz} from "@lodestar/types";
|
|
4
4
|
import {CachedBeaconStateAltair} from "../types.js";
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
type BlockExternalData,
|
|
3
|
-
DataAvailabilityStatus,
|
|
4
|
-
ExecutionPayloadStatus,
|
|
5
|
-
} from "./block/externalData.js";
|
|
1
|
+
export {type BlockExternalData, DataAvailabilityStatus, ExecutionPayloadStatus} from "./block/externalData.js";
|
|
6
2
|
export {getAttestationParticipationStatus, processAttestationsAltair} from "./block/processAttestationsAltair.js";
|
|
7
3
|
export {assertValidAttesterSlashing} from "./block/processAttesterSlashing.js";
|
|
8
4
|
export {isValidBlsToExecutionChange} from "./block/processBlsToExecutionChange.js";
|
|
@@ -25,7 +21,6 @@ export {
|
|
|
25
21
|
createEmptyEpochCacheImmutableData,
|
|
26
22
|
} from "./cache/epochCache.js";
|
|
27
23
|
export {type EpochTransitionCache, beforeProcessEpoch} from "./cache/epochTransitionCache.js";
|
|
28
|
-
export {type PubkeyCache, createPubkeyCache, syncPubkeys} from "./cache/pubkeyCache.js";
|
|
29
24
|
// Main state caches
|
|
30
25
|
export {
|
|
31
26
|
type BeaconStateCache,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {PublicKey} from "@chainsafe/blst";
|
|
1
|
+
import type {PublicKey} from "@chainsafe/lodestar-z/blst";
|
|
2
2
|
import {BeaconConfig} from "@lodestar/config";
|
|
3
3
|
import {LightClientBootstrap, LightClientHeader, LightClientUpdate, SyncPeriod} from "@lodestar/types";
|
|
4
4
|
import {computeSyncPeriodAtSlot} from "../../util/epoch.js";
|