@waku/rln 0.1.6-b58de3a.0 → 0.1.6-c7a2055.0

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 (45) hide show
  1. package/bundle/_virtual/utils.js +2 -2
  2. package/bundle/_virtual/utils2.js +2 -2
  3. package/bundle/index.js +1 -1
  4. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/_sha2.js +1 -1
  5. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/hmac.js +1 -1
  6. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/pbkdf2.js +1 -1
  7. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/scrypt.js +1 -1
  8. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/sha256.js +1 -1
  9. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/sha512.js +1 -1
  10. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/utils.js +1 -1
  11. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +1 -1
  12. package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +2 -2
  13. package/bundle/packages/rln/dist/contract/constants.js +1 -7
  14. package/bundle/packages/rln/dist/contract/rln_base_contract.js +3 -10
  15. package/bundle/packages/rln/dist/credentials_manager.js +8 -13
  16. package/bundle/packages/rln/dist/identity.js +2 -2
  17. package/bundle/packages/rln/dist/keystore/keystore.js +10 -16
  18. package/bundle/packages/rln/dist/utils/bytes.js +9 -3
  19. package/dist/.tsbuildinfo +1 -1
  20. package/dist/contract/constants.d.ts +0 -6
  21. package/dist/contract/constants.js +0 -6
  22. package/dist/contract/constants.js.map +1 -1
  23. package/dist/contract/rln_base_contract.d.ts +0 -5
  24. package/dist/contract/rln_base_contract.js +3 -10
  25. package/dist/contract/rln_base_contract.js.map +1 -1
  26. package/dist/credentials_manager.js +8 -13
  27. package/dist/credentials_manager.js.map +1 -1
  28. package/dist/identity.js +2 -2
  29. package/dist/identity.js.map +1 -1
  30. package/dist/keystore/keystore.js +10 -16
  31. package/dist/keystore/keystore.js.map +1 -1
  32. package/dist/utils/bytes.d.ts +6 -1
  33. package/dist/utils/bytes.js +8 -2
  34. package/dist/utils/bytes.js.map +1 -1
  35. package/dist/utils/index.d.ts +1 -1
  36. package/dist/utils/index.js +1 -1
  37. package/dist/utils/index.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/contract/constants.ts +0 -9
  40. package/src/contract/rln_base_contract.ts +3 -17
  41. package/src/credentials_manager.ts +8 -21
  42. package/src/identity.ts +2 -2
  43. package/src/keystore/keystore.ts +16 -36
  44. package/src/utils/bytes.ts +11 -5
  45. package/src/utils/index.ts +1 -1
@@ -1,3 +1,3 @@
1
- var utils = {exports: {}};
1
+ var utils = {};
2
2
 
3
- export { utils as __module };
3
+ export { utils as __exports };
@@ -1,3 +1,3 @@
1
- var utils = {};
1
+ var utils = {exports: {}};
2
2
 
3
- export { utils as __exports };
3
+ export { utils as __module };
package/bundle/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { RLNDecoder, RLNEncoder } from './packages/rln/dist/codec.js';
2
2
  export { RLN_ABI } from './packages/rln/dist/contract/abi.js';
3
3
  export { RLNContract } from './packages/rln/dist/contract/rln_contract.js';
4
- export { DEFAULT_Q, DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS } from './packages/rln/dist/contract/constants.js';
4
+ export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS } from './packages/rln/dist/contract/constants.js';
5
5
  export { MembershipState } from './packages/rln/dist/contract/types.js';
6
6
  export { RLNBaseContract } from './packages/rln/dist/contract/rln_base_contract.js';
7
7
  export { createRLN } from './packages/rln/dist/create.js';
@@ -1,7 +1,7 @@
1
1
  import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
2
2
  import './_assert.js';
3
3
  import './utils.js';
4
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
4
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
5
5
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
6
6
 
7
7
  Object.defineProperty(_sha2, "__esModule", { value: true });
@@ -1,7 +1,7 @@
1
1
  import { __exports as hmac } from '../../../../../../_virtual/hmac.js';
2
2
  import './_assert.js';
3
3
  import './utils.js';
4
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
4
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
5
5
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
6
6
 
7
7
  (function (exports) {
@@ -2,7 +2,7 @@ import { __exports as pbkdf2$1 } from '../../../../../../_virtual/pbkdf22.js';
2
2
  import './_assert.js';
3
3
  import './hmac.js';
4
4
  import './utils.js';
5
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
5
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
6
6
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
7
7
  import { __exports as hmac } from '../../../../../../_virtual/hmac.js';
8
8
 
@@ -3,7 +3,7 @@ import './_assert.js';
3
3
  import './sha256.js';
4
4
  import './pbkdf2.js';
5
5
  import './utils.js';
6
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
6
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
7
7
  import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
8
8
  import { __exports as pbkdf2 } from '../../../../../../_virtual/pbkdf22.js';
9
9
  import { __exports as sha256 } from '../../../../../../_virtual/sha2562.js';
@@ -2,7 +2,7 @@ import { __exports as sha256 } from '../../../../../../_virtual/sha2562.js';
2
2
  import './_sha2.js';
3
3
  import './utils.js';
4
4
  import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
5
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
5
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
6
6
 
7
7
  Object.defineProperty(sha256, "__esModule", { value: true });
8
8
  sha256.sha224 = sha256.sha256 = void 0;
@@ -4,7 +4,7 @@ import './_u64.js';
4
4
  import './utils.js';
5
5
  import { __exports as _u64 } from '../../../../../../_virtual/_u64.js';
6
6
  import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
7
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
7
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
8
8
 
9
9
  Object.defineProperty(sha512, "__esModule", { value: true });
10
10
  sha512.sha384 = sha512.sha512_256 = sha512.sha512_224 = sha512.sha512 = sha512.SHA512 = void 0;
@@ -1,4 +1,4 @@
1
- import { __exports as utils } from '../../../../../../_virtual/utils2.js';
1
+ import { __exports as utils } from '../../../../../../_virtual/utils.js';
2
2
  import './cryptoBrowser.js';
3
3
  import { __exports as cryptoBrowser } from '../../../../../../_virtual/cryptoBrowser.js';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { __exports as random } from '../../../../../_virtual/random.js';
2
2
  import '../@noble/hashes/utils.js';
3
- import { __exports as utils } from '../../../../../_virtual/utils2.js';
3
+ import { __exports as utils } from '../../../../../_virtual/utils.js';
4
4
 
5
5
  Object.defineProperty(random, "__esModule", { value: true });
6
6
  random.getRandomBytes = random.getRandomBytesSync = void 0;
@@ -1,10 +1,10 @@
1
1
  import { commonjsGlobal } from '../../../../../_virtual/_commonjsHelpers.js';
2
2
  import { commonjsRequire } from '../../../../../_virtual/_commonjs-dynamic-modules.js';
3
- import { __module as utils } from '../../../../../_virtual/utils.js';
3
+ import { __module as utils } from '../../../../../_virtual/utils2.js';
4
4
  import '../@noble/hashes/_assert.js';
5
5
  import '../@noble/hashes/utils.js';
6
6
  import { __exports as _assert } from '../../../../../_virtual/_assert.js';
7
- import { __exports as utils$1 } from '../../../../../_virtual/utils2.js';
7
+ import { __exports as utils$1 } from '../../../../../_virtual/utils.js';
8
8
 
9
9
  utils.exports;
10
10
 
@@ -22,12 +22,6 @@ const RATE_LIMIT_PARAMS = {
22
22
  MAX_TOTAL_RATE: 160_000, // Maximum total rate limit across all memberships
23
23
  EPOCH_LENGTH: 600 // Epoch length in seconds (10 minutes)
24
24
  };
25
- /**
26
- * Default Q value for the RLN contract
27
- * This is the upper bound for the ID commitment
28
- * @see https://github.com/waku-org/specs/blob/master/standards/core/rln-contract.md#implementation-suggestions
29
- */
30
- const DEFAULT_Q = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
31
25
  const DEFAULT_RATE_LIMIT = RATE_LIMIT_PARAMS.MAX_RATE;
32
26
 
33
- export { DEFAULT_Q, DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
27
+ export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
@@ -14,7 +14,7 @@ import '../../../../node_modules/multiformats/dist/src/bases/identity.js';
14
14
  import '../../../../node_modules/multiformats/dist/src/codecs/json.js';
15
15
  import { Logger } from '../../../utils/dist/logger/index.js';
16
16
  import { RLN_ABI } from './abi.js';
17
- import { DEFAULT_Q, DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from './constants.js';
17
+ import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from './constants.js';
18
18
  import { MembershipState } from './types.js';
19
19
  import { Contract } from '../../../../node_modules/@ethersproject/contracts/lib.esm/index.js';
20
20
  import { BigNumber } from '../../../../node_modules/@ethersproject/bignumber/lib.esm/bignumber.js';
@@ -26,11 +26,6 @@ class RLNBaseContract {
26
26
  rateLimit;
27
27
  minRateLimit;
28
28
  maxRateLimit;
29
- /**
30
- * Default Q value for the RLN contract.
31
- * @see https://github.com/waku-org/waku-rlnv2-contract/blob/b7e9a9b1bc69256a2a3076c1f099b50ce84e7eff/src/WakuRlnV2.sol#L25
32
- */
33
- idCommitmentBigIntLimit = DEFAULT_Q;
34
29
  _members = new Map();
35
30
  _membersFilter;
36
31
  _membershipErasedFilter;
@@ -69,14 +64,12 @@ class RLNBaseContract {
69
64
  */
70
65
  static async create(options) {
71
66
  const instance = new RLNBaseContract(options);
72
- const [min, max, idCommitmentBigIntLimit] = await Promise.all([
67
+ const [min, max] = await Promise.all([
73
68
  instance.contract.minMembershipRateLimit(),
74
- instance.contract.maxMembershipRateLimit(),
75
- instance.contract.Q()
69
+ instance.contract.maxMembershipRateLimit()
76
70
  ]);
77
71
  instance.minRateLimit = BigNumber.from(min).toNumber();
78
72
  instance.maxRateLimit = BigNumber.from(max).toNumber();
79
- instance.idCommitmentBigIntLimit = BigInt(idCommitmentBigIntLimit.toString());
80
73
  instance.validateRateLimit(instance.rateLimit);
81
74
  return instance;
82
75
  }
@@ -1,5 +1,5 @@
1
1
  import { hmac } from '../../../node_modules/@noble/hashes/esm/hmac.js';
2
- import { sha256 } from '../../../node_modules/@noble/hashes/esm/sha2.js';
2
+ import { sha256 } from '../../../node_modules/@noble/hashes/esm/sha256.js';
3
3
  import '../../interfaces/dist/protocols.js';
4
4
  import '../../interfaces/dist/connection_manager.js';
5
5
  import '../../interfaces/dist/health_indicator.js';
@@ -20,7 +20,7 @@ import { RLNBaseContract } from './contract/rln_base_contract.js';
20
20
  import { IdentityCredential } from './identity.js';
21
21
  import { Keystore } from './keystore/keystore.js';
22
22
  import { extractMetaMaskSigner } from './utils/metamask.js';
23
- import { buildBigIntFromUint8ArrayLE } from './utils/bytes.js';
23
+ import { buildBigIntFromUint8Array } from './utils/bytes.js';
24
24
  import './utils/epoch.js';
25
25
 
26
26
  const log = new Logger("waku:credentials");
@@ -95,7 +95,7 @@ class RLNCredentialsManager {
95
95
  }
96
96
  else {
97
97
  log.info("Using local implementation to generate identity");
98
- identity = await this.generateSeededIdentityCredential(options.signature);
98
+ identity = this.generateSeededIdentityCredential(options.signature);
99
99
  }
100
100
  }
101
101
  if (!identity) {
@@ -191,7 +191,7 @@ class RLNCredentialsManager {
191
191
  * @param seed A string seed to generate the identity from
192
192
  * @returns IdentityCredential
193
193
  */
194
- async generateSeededIdentityCredential(seed) {
194
+ generateSeededIdentityCredential(seed) {
195
195
  log.info("Generating seeded identity credential");
196
196
  // Convert the seed to bytes
197
197
  const encoder = new TextEncoder();
@@ -200,18 +200,13 @@ class RLNCredentialsManager {
200
200
  // We use different context strings for each component to ensure they're different
201
201
  const idTrapdoor = hmac(sha256, seedBytes, encoder.encode("IDTrapdoor"));
202
202
  const idNullifier = hmac(sha256, seedBytes, encoder.encode("IDNullifier"));
203
+ // Generate IDSecretHash as a hash of IDTrapdoor and IDNullifier
203
204
  const combinedBytes = new Uint8Array([...idTrapdoor, ...idNullifier]);
204
205
  const idSecretHash = sha256(combinedBytes);
206
+ // Generate IDCommitment as a hash of IDSecretHash
205
207
  const idCommitment = sha256(idSecretHash);
206
- let idCommitmentBigInt = buildBigIntFromUint8ArrayLE(idCommitment);
207
- if (!this.contract) {
208
- throw Error("RLN contract is not initialized");
209
- }
210
- const idCommitmentBigIntLimit = this.contract.idCommitmentBigIntLimit;
211
- if (idCommitmentBigInt >= idCommitmentBigIntLimit) {
212
- log.warn(`ID commitment is greater than Q, reducing it by Q(idCommitmentBigIntLimit): ${idCommitmentBigInt} % ${idCommitmentBigIntLimit}`);
213
- idCommitmentBigInt = idCommitmentBigInt % idCommitmentBigIntLimit;
214
- }
208
+ // Convert IDCommitment to BigInt
209
+ const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment);
215
210
  log.info("Successfully generated identity credential");
216
211
  return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
217
212
  }
@@ -1,4 +1,4 @@
1
- import { buildBigIntFromUint8ArrayLE } from './utils/bytes.js';
1
+ import { buildBigIntFromUint8Array } from './utils/bytes.js';
2
2
  import './utils/epoch.js';
3
3
 
4
4
  class IdentityCredential {
@@ -22,7 +22,7 @@ class IdentityCredential {
22
22
  const idNullifier = memKeys.subarray(32, 64);
23
23
  const idSecretHash = memKeys.subarray(64, 96);
24
24
  const idCommitment = memKeys.subarray(96, 128);
25
- const idCommitmentBigInt = buildBigIntFromUint8ArrayLE(idCommitment);
25
+ const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment, 32);
26
26
  return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
27
27
  }
28
28
  }
@@ -17,7 +17,7 @@ import { Logger } from '../../../utils/dist/logger/index.js';
17
17
  import { sha256 } from '../../../../node_modules/ethereum-cryptography/esm/sha256.js';
18
18
  import { bytesToUtf8 } from '../../../../node_modules/ethereum-cryptography/esm/utils.js';
19
19
  import _ from '../../../../node_modules/lodash/lodash.js';
20
- import { buildBigIntFromUint8ArrayLE } from '../utils/bytes.js';
20
+ import { buildBigIntFromUint8Array } from '../utils/bytes.js';
21
21
  import { keccak256Checksum, decryptEipKeystore } from './cipher.js';
22
22
  import { isKeystoreValid, isCredentialValid } from './schema_validator.js';
23
23
  import { __exports as lib } from '../../../../_virtual/index.js';
@@ -161,20 +161,17 @@ class Keystore {
161
161
  };
162
162
  }
163
163
  static fromBytesToIdentity(bytes) {
164
- function fromLittleEndian(bytes) {
165
- return new Uint8Array(bytes).reverse();
166
- }
167
164
  try {
168
165
  const str = bytesToUtf8(bytes);
169
166
  const obj = JSON.parse(str);
170
167
  // TODO: add runtime validation of nwaku credentials
171
168
  return {
172
169
  identity: {
173
- IDCommitment: fromLittleEndian(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []))),
174
- IDTrapdoor: fromLittleEndian(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", []))),
175
- IDNullifier: fromLittleEndian(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", []))),
176
- IDCommitmentBigInt: buildBigIntFromUint8ArrayLE(fromLittleEndian(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", [])))),
177
- IDSecretHash: fromLittleEndian(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", [])))
170
+ IDCommitment: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", [])),
171
+ IDTrapdoor: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", [])),
172
+ IDNullifier: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", [])),
173
+ IDCommitmentBigInt: buildBigIntFromUint8Array(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []))),
174
+ IDSecretHash: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []))
178
175
  },
179
176
  membership: {
180
177
  treeIndex: _.get(obj, "treeIndex"),
@@ -211,16 +208,13 @@ class Keystore {
211
208
  // follows nwaku implementation
212
209
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L98
213
210
  static fromIdentityToBytes(options) {
214
- function toLittleEndian(bytes) {
215
- return new Uint8Array(bytes).reverse();
216
- }
217
211
  return utf8ToBytes(JSON.stringify({
218
212
  treeIndex: options.membership.treeIndex,
219
213
  identityCredential: {
220
- idCommitment: Array.from(toLittleEndian(options.identity.IDCommitment)),
221
- idNullifier: Array.from(toLittleEndian(options.identity.IDNullifier)),
222
- idSecretHash: Array.from(toLittleEndian(options.identity.IDSecretHash)),
223
- idTrapdoor: Array.from(toLittleEndian(options.identity.IDTrapdoor))
214
+ idCommitment: Array.from(options.identity.IDCommitment),
215
+ idNullifier: Array.from(options.identity.IDNullifier),
216
+ idSecretHash: Array.from(options.identity.IDSecretHash),
217
+ idTrapdoor: Array.from(options.identity.IDTrapdoor)
224
218
  },
225
219
  membershipContract: {
226
220
  chainId: options.membership.chainId,
@@ -39,8 +39,14 @@ function writeUIntLE(buf, value, offset, byteLength, noAssert) {
39
39
  }
40
40
  return buf;
41
41
  }
42
- function buildBigIntFromUint8ArrayLE(bytes) {
43
- return bytes.reduce((acc, byte, i) => acc + BigInt(byte) * (1n << (8n * BigInt(i))), 0n);
42
+ /**
43
+ * Transforms Uint8Array into BigInt
44
+ * @param array: Uint8Array
45
+ * @returns BigInt
46
+ */
47
+ function buildBigIntFromUint8Array(array, byteOffset = 0) {
48
+ const dataView = new DataView(array.buffer);
49
+ return dataView.getBigUint64(byteOffset, true);
44
50
  }
45
51
  /**
46
52
  * Fills with zeros to set length
@@ -56,4 +62,4 @@ function zeroPadLE(array, length) {
56
62
  return result;
57
63
  }
58
64
 
59
- export { buildBigIntFromUint8ArrayLE, concatenate, writeUIntLE, zeroPadLE };
65
+ export { buildBigIntFromUint8Array, concatenate, writeUIntLE, zeroPadLE };