@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.
Files changed (165) hide show
  1. package/lib/block/isValidIndexedAttestation.d.ts +2 -3
  2. package/lib/block/isValidIndexedAttestation.d.ts.map +1 -1
  3. package/lib/block/isValidIndexedAttestation.js +4 -4
  4. package/lib/block/isValidIndexedAttestation.js.map +1 -1
  5. package/lib/block/isValidIndexedPayloadAttestation.d.ts.map +1 -1
  6. package/lib/block/isValidIndexedPayloadAttestation.js +1 -1
  7. package/lib/block/isValidIndexedPayloadAttestation.js.map +1 -1
  8. package/lib/block/processAttestationPhase0.d.ts.map +1 -1
  9. package/lib/block/processAttestationPhase0.js +1 -1
  10. package/lib/block/processAttestationPhase0.js.map +1 -1
  11. package/lib/block/processAttestationsAltair.js +2 -2
  12. package/lib/block/processAttestationsAltair.js.map +1 -1
  13. package/lib/block/processAttesterSlashing.d.ts +1 -2
  14. package/lib/block/processAttesterSlashing.d.ts.map +1 -1
  15. package/lib/block/processAttesterSlashing.js +3 -3
  16. package/lib/block/processAttesterSlashing.js.map +1 -1
  17. package/lib/block/processDeposit.d.ts.map +1 -1
  18. package/lib/block/processDeposit.js +21 -46
  19. package/lib/block/processDeposit.js.map +1 -1
  20. package/lib/block/processExecutionPayloadBid.d.ts.map +1 -1
  21. package/lib/block/processExecutionPayloadBid.js +2 -5
  22. package/lib/block/processExecutionPayloadBid.js.map +1 -1
  23. package/lib/block/processProposerSlashing.d.ts +1 -2
  24. package/lib/block/processProposerSlashing.d.ts.map +1 -1
  25. package/lib/block/processProposerSlashing.js +3 -3
  26. package/lib/block/processProposerSlashing.js.map +1 -1
  27. package/lib/block/processRandao.js +1 -1
  28. package/lib/block/processRandao.js.map +1 -1
  29. package/lib/block/processSyncCommittee.js +1 -1
  30. package/lib/block/processSyncCommittee.js.map +1 -1
  31. package/lib/block/processVoluntaryExit.d.ts.map +1 -1
  32. package/lib/block/processVoluntaryExit.js +1 -2
  33. package/lib/block/processVoluntaryExit.js.map +1 -1
  34. package/lib/cache/epochCache.d.ts +2 -2
  35. package/lib/cache/epochCache.d.ts.map +1 -1
  36. package/lib/cache/epochCache.js +5 -6
  37. package/lib/cache/epochCache.js.map +1 -1
  38. package/lib/cache/stateCache.js +1 -1
  39. package/lib/cache/stateCache.js.map +1 -1
  40. package/lib/cache/syncCommitteeCache.d.ts +2 -3
  41. package/lib/cache/syncCommitteeCache.d.ts.map +1 -1
  42. package/lib/cache/syncCommitteeCache.js.map +1 -1
  43. package/lib/epoch/processSyncCommitteeUpdates.js +1 -1
  44. package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
  45. package/lib/index.d.ts +1 -2
  46. package/lib/index.d.ts.map +1 -1
  47. package/lib/index.js +1 -2
  48. package/lib/index.js.map +1 -1
  49. package/lib/lightClient/spec/store.d.ts +1 -1
  50. package/lib/lightClient/spec/store.d.ts.map +1 -1
  51. package/lib/lightClient/spec/utils.js +1 -1
  52. package/lib/lightClient/spec/utils.js.map +1 -1
  53. package/lib/lightClient/spec/validateLightClientUpdate.js +1 -1
  54. package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
  55. package/lib/rewards/attestationsRewards.d.ts +1 -1
  56. package/lib/rewards/attestationsRewards.d.ts.map +1 -1
  57. package/lib/rewards/attestationsRewards.js.map +1 -1
  58. package/lib/rewards/syncCommitteeRewards.d.ts +1 -1
  59. package/lib/rewards/syncCommitteeRewards.d.ts.map +1 -1
  60. package/lib/rewards/syncCommitteeRewards.js +3 -1
  61. package/lib/rewards/syncCommitteeRewards.js.map +1 -1
  62. package/lib/signatureSets/blsToExecutionChange.d.ts.map +1 -1
  63. package/lib/signatureSets/blsToExecutionChange.js +1 -2
  64. package/lib/signatureSets/blsToExecutionChange.js.map +1 -1
  65. package/lib/signatureSets/executionPayloadEnvelope.d.ts +2 -3
  66. package/lib/signatureSets/executionPayloadEnvelope.d.ts.map +1 -1
  67. package/lib/signatureSets/executionPayloadEnvelope.js +6 -7
  68. package/lib/signatureSets/executionPayloadEnvelope.js.map +1 -1
  69. package/lib/signatureSets/proposer.d.ts +1 -2
  70. package/lib/signatureSets/proposer.d.ts.map +1 -1
  71. package/lib/signatureSets/proposer.js +2 -2
  72. package/lib/signatureSets/proposer.js.map +1 -1
  73. package/lib/signatureSets/randao.d.ts +1 -2
  74. package/lib/signatureSets/randao.d.ts.map +1 -1
  75. package/lib/signatureSets/randao.js +2 -2
  76. package/lib/signatureSets/randao.js.map +1 -1
  77. package/lib/signatureSets/voluntaryExits.d.ts +1 -2
  78. package/lib/signatureSets/voluntaryExits.d.ts.map +1 -1
  79. package/lib/signatureSets/voluntaryExits.js +3 -4
  80. package/lib/signatureSets/voluntaryExits.js.map +1 -1
  81. package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
  82. package/lib/slot/upgradeStateToGloas.js +27 -18
  83. package/lib/slot/upgradeStateToGloas.js.map +1 -1
  84. package/lib/stateTransition.js +1 -1
  85. package/lib/stateTransition.js.map +1 -1
  86. package/lib/stateView/stateViewFactory.d.ts +1 -1
  87. package/lib/stateView/stateViewFactory.d.ts.map +1 -1
  88. package/lib/stateView/stateViewFactory.js +2 -13
  89. package/lib/stateView/stateViewFactory.js.map +1 -1
  90. package/lib/testUtils/index.d.ts +1 -0
  91. package/lib/testUtils/index.d.ts.map +1 -1
  92. package/lib/testUtils/index.js +1 -0
  93. package/lib/testUtils/index.js.map +1 -1
  94. package/lib/testUtils/interopPubkeyCache.d.ts +7 -0
  95. package/lib/testUtils/interopPubkeyCache.d.ts.map +1 -0
  96. package/lib/testUtils/interopPubkeyCache.js +92 -0
  97. package/lib/testUtils/interopPubkeyCache.js.map +1 -0
  98. package/lib/testUtils/state.d.ts.map +1 -1
  99. package/lib/testUtils/state.js +5 -5
  100. package/lib/testUtils/state.js.map +1 -1
  101. package/lib/testUtils/testFileCache.d.ts.map +1 -1
  102. package/lib/testUtils/testFileCache.js +3 -0
  103. package/lib/testUtils/testFileCache.js.map +1 -1
  104. package/lib/testUtils/util.d.ts +1 -1
  105. package/lib/testUtils/util.d.ts.map +1 -1
  106. package/lib/testUtils/util.js +27 -35
  107. package/lib/testUtils/util.js.map +1 -1
  108. package/lib/util/gloas.d.ts +6 -0
  109. package/lib/util/gloas.d.ts.map +1 -1
  110. package/lib/util/gloas.js +25 -11
  111. package/lib/util/gloas.js.map +1 -1
  112. package/lib/util/interop.d.ts +1 -1
  113. package/lib/util/interop.d.ts.map +1 -1
  114. package/lib/util/interop.js +1 -1
  115. package/lib/util/interop.js.map +1 -1
  116. package/lib/util/signatureSets.d.ts +5 -13
  117. package/lib/util/signatureSets.d.ts.map +1 -1
  118. package/lib/util/signatureSets.js +30 -39
  119. package/lib/util/signatureSets.js.map +1 -1
  120. package/lib/util/syncCommittee.js +1 -1
  121. package/lib/util/syncCommittee.js.map +1 -1
  122. package/package.json +11 -12
  123. package/src/block/isValidIndexedAttestation.ts +2 -8
  124. package/src/block/isValidIndexedPayloadAttestation.ts +1 -4
  125. package/src/block/processAttestationPhase0.ts +0 -1
  126. package/src/block/processAttestationsAltair.ts +2 -2
  127. package/src/block/processAttesterSlashing.ts +2 -13
  128. package/src/block/processDeposit.ts +35 -47
  129. package/src/block/processExecutionPayloadBid.ts +8 -6
  130. package/src/block/processProposerSlashing.ts +2 -11
  131. package/src/block/processRandao.ts +1 -1
  132. package/src/block/processSyncCommittee.ts +1 -1
  133. package/src/block/processVoluntaryExit.ts +1 -4
  134. package/src/cache/epochCache.ts +6 -7
  135. package/src/cache/stateCache.ts +1 -1
  136. package/src/cache/syncCommitteeCache.ts +3 -2
  137. package/src/epoch/processSyncCommitteeUpdates.ts +1 -1
  138. package/src/index.ts +1 -6
  139. package/src/lightClient/spec/store.ts +1 -1
  140. package/src/lightClient/spec/utils.ts +1 -1
  141. package/src/lightClient/spec/validateLightClientUpdate.ts +1 -1
  142. package/src/rewards/attestationsRewards.ts +1 -1
  143. package/src/rewards/syncCommitteeRewards.ts +4 -2
  144. package/src/signatureSets/blsToExecutionChange.ts +1 -2
  145. package/src/signatureSets/executionPayloadEnvelope.ts +14 -15
  146. package/src/signatureSets/proposer.ts +1 -3
  147. package/src/signatureSets/randao.ts +2 -3
  148. package/src/signatureSets/voluntaryExits.ts +2 -5
  149. package/src/slot/upgradeStateToGloas.ts +28 -21
  150. package/src/stateTransition.ts +1 -1
  151. package/src/stateView/stateViewFactory.ts +2 -14
  152. package/src/testUtils/index.ts +1 -0
  153. package/src/testUtils/interopPubkeyCache.ts +100 -0
  154. package/src/testUtils/state.ts +5 -11
  155. package/src/testUtils/testFileCache.ts +3 -0
  156. package/src/testUtils/util.ts +26 -38
  157. package/src/util/gloas.ts +40 -11
  158. package/src/util/interop.ts +1 -1
  159. package/src/util/signatureSets.ts +34 -51
  160. package/src/util/syncCommittee.ts +1 -1
  161. package/lib/cache/pubkeyCache.d.ts +0 -28
  162. package/lib/cache/pubkeyCache.d.ts.map +0 -1
  163. package/lib/cache/pubkeyCache.js +0 -49
  164. package/lib/cache/pubkeyCache.js.map +0 -1
  165. package/src/cache/pubkeyCache.ts +0 -74
@@ -1,4 +1,4 @@
1
- import { Signature, aggregatePublicKeys, fastAggregateVerify, verify } from "@chainsafe/blst";
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 signatureSet.pubkey;
20
- case SignatureSetType.indexed: {
21
- return pubkeyCache.getOrThrow(signatureSet.index);
22
- }
23
- case SignatureSetType.aggregate: {
24
- const pubkeys = signatureSet.indices.map((i) => {
25
- return pubkeyCache.getOrThrow(i);
26
- });
27
- return aggregatePublicKeys(pubkeys);
28
- }
29
- default:
30
- throw Error("Unknown signature set type");
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
- if (!pubkeyCache) {
48
- throw Error("pubkeyCache required for aggregate signature set");
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
- const pubkeys = signatureSet.indices.map((i) => {
51
- return pubkeyCache.getOrThrow(i);
52
- });
53
- return fastAggregateVerify(signatureSet.signingRoot, pubkeys, signature);
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":"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"}
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,iBAAiB,CAAC;AAC9D,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"}
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.6325e4e1fe",
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.4",
69
- "@chainsafe/blst": "^2.2.0",
70
- "@chainsafe/persistent-merkle-tree": "^1.3.0",
71
- "@chainsafe/pubkey-index-map": "^3.0.0",
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.6325e4e1fe",
75
- "@lodestar/params": "^1.47.0-dev.6325e4e1fe",
76
- "@lodestar/types": "^1.47.0-dev.6325e4e1fe",
77
- "@lodestar/utils": "^1.47.0-dev.6325e4e1fe",
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.6325e4e1fe"
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": "c87b2284d030026cf5b413a897de0eedbeb158d4"
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), pubkeyCache);
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;
@@ -53,7 +53,6 @@ export function processAttestationPhase0(
53
53
  if (
54
54
  !isValidIndexedAttestation(
55
55
  state.config,
56
- epochCtx.pubkeyCache,
57
56
  state.slot,
58
57
  state.validators.length,
59
58
  epochCtx.getIndexedAttestation(ForkSeq.phase0, attestation),
@@ -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, state.epochCtx.pubkeyCache)) {
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 {PublicKey, Signature, verify, verifyMultipleAggregateSignatures} from "@chainsafe/blst";
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 {computeDomain, computeSigningRoot, getMaxEffectiveBalance, increaseBalance} from "../util/index.js";
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
- // Pubkeys must be checked for group + inf. This must be done only once when the validator deposit is processed
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: {pk: PublicKey; msg: Uint8Array; sig: Signature}[] = [];
188
- const signatureSetDepositIndices: number[] = [];
189
- for (let i = 0; i < deposits.length; i++) {
190
- const {pubkey, withdrawalCredentials, amount, signature} = deposits[i];
191
- let pk: PublicKey;
192
- let sig: Signature;
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
- // Parse without group/infinity checks; deferred to the verify call below so it can be
195
- // batched across all sets.
196
- pk = PublicKey.fromBytes(pubkey);
197
- sig = Signature.fromBytes(signature);
206
+ chunkValid = verifySignatureSets(chunk);
198
207
  } catch (_) {
199
- // Malformed pubkey or signature bytes - invalid deposit, results[i] stays false
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
- if (signatureSets.length === 0) {
208
- return results;
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
- } else {
228
- for (let s = 0; s < signatureSets.length; s++) {
215
+
216
+ for (let i = 0; i < chunk.length; i++) {
229
217
  try {
230
- if (verify(signatureSets[s].msg, signatureSets[s].pk, signatureSets[s].sig, true, true)) {
231
- results[signatureSetDepositIndices[s]] = true;
218
+ if (verifySignatureSets([chunk[i]])) {
219
+ results[chunkStart + i] = true;
232
220
  }
233
221
  } catch (_) {
234
- // invalid point / malformed invalid signature, results[i] stays false
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 {getBlockRootAtSlot, getCurrentEpoch, getRandaoMix} from "../util/index.js";
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
- const publicKey = PublicKey.fromBytes(pubkey);
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], pubkeyCache)) {
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, epochCtx.pubkeyCache, block)) {
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, state.epochCtx.pubkeyCache)) {
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
 
@@ -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 popualted before computing the rest of caches
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(pubkeyCache, validators);
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.set(index, pubkey);
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
- // This is a test state, there's no need to have a global shared cache of keys
1127
- pubkeyCache: createPubkeyCache(),
1126
+ pubkeyCache: defaultPubkeyCache,
1128
1127
  };
1129
1128
  }
@@ -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.set(validatorIndex, validator.pubkey);
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: {getIndex(pubkey: Uint8Array): number | null}
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: {getIndex(pubkey: Uint8Array): number | null}
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";
@@ -1,4 +1,4 @@
1
- import {PublicKey} from "@chainsafe/blst";
1
+ import {PublicKey} from "@chainsafe/lodestar-z/blst";
2
2
  import {Tree} from "@chainsafe/persistent-merkle-tree";
3
3
  import {BitArray} from "@chainsafe/ssz";
4
4
  import {ChainForkConfig} from "@lodestar/config";