@waku/rln 0.1.6-7fba26d.0 → 0.1.6-86bbf5b.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.
- package/bundle/_virtual/utils.js +2 -2
- package/bundle/_virtual/utils2.js +2 -2
- package/bundle/index.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/_sha2.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/hmac.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/pbkdf2.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/scrypt.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/sha256.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/sha512.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes/utils.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +1 -1
- package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +2 -2
- package/bundle/packages/core/dist/lib/message/version_0.js +1 -4
- package/bundle/packages/rln/dist/contract/constants.js +7 -1
- package/bundle/packages/rln/dist/contract/rln_base_contract.js +10 -21
- package/bundle/packages/rln/dist/credentials_manager.js +14 -16
- package/bundle/packages/rln/dist/identity.js +40 -7
- package/bundle/packages/rln/dist/keystore/keystore.js +15 -11
- package/bundle/packages/rln/dist/message.js +11 -0
- package/bundle/packages/rln/dist/utils/bytes.js +37 -16
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/constants.d.ts +6 -0
- package/dist/contract/constants.js +6 -0
- package/dist/contract/constants.js.map +1 -1
- package/dist/contract/rln_base_contract.d.ts +0 -10
- package/dist/contract/rln_base_contract.js +10 -21
- package/dist/contract/rln_base_contract.js.map +1 -1
- package/dist/credentials_manager.js +14 -16
- package/dist/credentials_manager.js.map +1 -1
- package/dist/identity.d.ts +11 -2
- package/dist/identity.js +26 -6
- package/dist/identity.js.map +1 -1
- package/dist/keystore/keystore.js +15 -11
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/message.d.ts +5 -4
- package/dist/message.js +2 -0
- package/dist/message.js.map +1 -1
- package/dist/utils/bytes.d.ts +12 -5
- package/dist/utils/bytes.js +36 -15
- package/dist/utils/bytes.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/contract/constants.ts +9 -0
- package/src/contract/rln_base_contract.ts +12 -30
- package/src/credentials_manager.ts +21 -24
- package/src/identity.ts +41 -6
- package/src/keystore/keystore.ts +28 -24
- package/src/message.ts +7 -4
- package/src/utils/bytes.ts +46 -25
- package/src/utils/index.ts +1 -1
- package/dist/contract/test-utils.d.ts +0 -39
- package/dist/contract/test-utils.js +0 -118
- package/dist/contract/test-utils.js.map +0 -1
- package/src/contract/test-utils.ts +0 -179
package/bundle/_virtual/utils.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
var utils = {
|
1
|
+
var utils = {};
|
2
2
|
|
3
|
-
export { utils as
|
3
|
+
export { utils as __exports };
|
@@ -1,3 +1,3 @@
|
|
1
|
-
var utils = {};
|
1
|
+
var utils = {exports: {}};
|
2
2
|
|
3
|
-
export { utils as
|
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_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS } from './packages/rln/dist/contract/constants.js';
|
4
|
+
export { DEFAULT_Q, 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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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
|
|
package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js
CHANGED
@@ -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/
|
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;
|
package/bundle/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js
CHANGED
@@ -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/
|
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/
|
7
|
+
import { __exports as utils$1 } from '../../../../../_virtual/utils.js';
|
8
8
|
|
9
9
|
utils.exports;
|
10
10
|
|
@@ -29,9 +29,6 @@ class DecodedMessage {
|
|
29
29
|
get contentTopic() {
|
30
30
|
return this.proto.contentTopic;
|
31
31
|
}
|
32
|
-
get _rawTimestamp() {
|
33
|
-
return this.proto.timestamp;
|
34
|
-
}
|
35
32
|
get timestamp() {
|
36
33
|
// In the case we receive a value that is bigger than JS's max number,
|
37
34
|
// we catch the error and return undefined.
|
@@ -53,7 +50,7 @@ class DecodedMessage {
|
|
53
50
|
get version() {
|
54
51
|
// https://rfc.vac.dev/spec/14/
|
55
52
|
// > If omitted, the value SHOULD be interpreted as version 0.
|
56
|
-
return this.proto.version ??
|
53
|
+
return this.proto.version ?? Version;
|
57
54
|
}
|
58
55
|
get rateLimitProof() {
|
59
56
|
return this.proto.rateLimitProof;
|
@@ -22,6 +22,12 @@ 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");
|
25
31
|
const DEFAULT_RATE_LIMIT = RATE_LIMIT_PARAMS.MAX_RATE;
|
26
32
|
|
27
|
-
export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
|
33
|
+
export { DEFAULT_Q, DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
|
@@ -13,6 +13,7 @@ import '../../../../node_modules/multiformats/dist/src/bases/base8.js';
|
|
13
13
|
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
|
+
import { IdentityCredential } from '../identity.js';
|
16
17
|
import { RLN_ABI } from './abi.js';
|
17
18
|
import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from './constants.js';
|
18
19
|
import { MembershipState } from './types.js';
|
@@ -26,11 +27,6 @@ class RLNBaseContract {
|
|
26
27
|
rateLimit;
|
27
28
|
minRateLimit;
|
28
29
|
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
|
-
Q;
|
34
30
|
_members = new Map();
|
35
31
|
_membersFilter;
|
36
32
|
_membershipErasedFilter;
|
@@ -71,24 +67,14 @@ class RLNBaseContract {
|
|
71
67
|
const instance = new RLNBaseContract(options);
|
72
68
|
const [min, max] = await Promise.all([
|
73
69
|
instance.contract.minMembershipRateLimit(),
|
74
|
-
instance.contract.maxMembershipRateLimit()
|
70
|
+
instance.contract.maxMembershipRateLimit(),
|
71
|
+
instance.contract.Q()
|
75
72
|
]);
|
76
73
|
instance.minRateLimit = BigNumber.from(min).toNumber();
|
77
74
|
instance.maxRateLimit = BigNumber.from(max).toNumber();
|
78
75
|
instance.validateRateLimit(instance.rateLimit);
|
79
76
|
return instance;
|
80
77
|
}
|
81
|
-
/**
|
82
|
-
* Fetches and caches the Q value from the contract.
|
83
|
-
* @returns Promise<bigint> The Q value from the contract
|
84
|
-
*/
|
85
|
-
async getQ() {
|
86
|
-
if (this.Q !== undefined)
|
87
|
-
return this.Q;
|
88
|
-
const q = await this.contract.Q();
|
89
|
-
this.Q = BigInt(q.toString());
|
90
|
-
return this.Q;
|
91
|
-
}
|
92
78
|
/**
|
93
79
|
* Gets the current rate limit for this contract instance
|
94
80
|
*/
|
@@ -356,8 +342,9 @@ class RLNBaseContract {
|
|
356
342
|
async registerWithIdentity(identity) {
|
357
343
|
try {
|
358
344
|
log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
|
345
|
+
const idCommitmentBigInt = IdentityCredential.getIdCommitmentBigInt(identity.IDCommitment);
|
359
346
|
// Check if the ID commitment is already registered
|
360
|
-
const existingIndex = await this.getMemberIndex(
|
347
|
+
const existingIndex = await this.getMemberIndex(idCommitmentBigInt);
|
361
348
|
if (existingIndex) {
|
362
349
|
throw new Error(`ID commitment is already registered with index ${existingIndex}`);
|
363
350
|
}
|
@@ -366,9 +353,11 @@ class RLNBaseContract {
|
|
366
353
|
if (remainingRateLimit < this.rateLimit) {
|
367
354
|
throw new Error(`Not enough remaining rate limit. Requested: ${this.rateLimit}, Available: ${remainingRateLimit}`);
|
368
355
|
}
|
369
|
-
const estimatedGas = await this.contract.estimateGas.register(
|
356
|
+
const estimatedGas = await this.contract.estimateGas.register(idCommitmentBigInt, this.rateLimit, []);
|
370
357
|
const gasLimit = estimatedGas.add(10000);
|
371
|
-
const txRegisterResponse = await this.contract.register(
|
358
|
+
const txRegisterResponse = await this.contract.register(idCommitmentBigInt, this.rateLimit, [], {
|
359
|
+
gasLimit
|
360
|
+
});
|
372
361
|
const txRegisterReceipt = await txRegisterResponse.wait();
|
373
362
|
if (txRegisterReceipt.status === 0) {
|
374
363
|
throw new Error("Transaction failed on-chain");
|
@@ -430,7 +419,7 @@ class RLNBaseContract {
|
|
430
419
|
async registerWithPermitAndErase(identity, permit, idCommitmentsToErase) {
|
431
420
|
try {
|
432
421
|
log.info(`Registering identity with permit and rate limit: ${this.rateLimit} messages/epoch`);
|
433
|
-
const txRegisterResponse = await this.contract.registerWithPermit(permit.owner, permit.deadline, permit.v, permit.r, permit.s, identity.
|
422
|
+
const txRegisterResponse = await this.contract.registerWithPermit(permit.owner, permit.deadline, permit.v, permit.r, permit.s, IdentityCredential.getIdCommitmentBigInt(identity.IDCommitment), this.rateLimit, idCommitmentsToErase.map((id) => BigNumber.from(id)));
|
434
423
|
const txRegisterReceipt = await txRegisterResponse.wait();
|
435
424
|
const memberRegistered = txRegisterReceipt.events?.find((event) => event.event === "MembershipRegistered");
|
436
425
|
if (!memberRegistered || !memberRegistered.args) {
|
@@ -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/
|
2
|
+
import { sha256 } from '../../../node_modules/@noble/hashes/esm/sha2.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 {
|
23
|
+
import { switchEndianness } from './utils/bytes.js';
|
24
24
|
import './utils/epoch.js';
|
25
25
|
|
26
26
|
const log = new Logger("waku:credentials");
|
@@ -198,21 +198,19 @@ class RLNCredentialsManager {
|
|
198
198
|
const seedBytes = encoder.encode(seed);
|
199
199
|
// Generate deterministic values using HMAC-SHA256
|
200
200
|
// We use different context strings for each component to ensure they're different
|
201
|
-
const
|
202
|
-
const
|
203
|
-
const combinedBytes = new Uint8Array([...
|
204
|
-
const
|
205
|
-
const
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
const
|
211
|
-
|
212
|
-
idCommitmentBigInt = idCommitmentBigInt % Q;
|
213
|
-
}
|
201
|
+
const idTrapdoorBE = hmac(sha256, seedBytes, encoder.encode("IDTrapdoor"));
|
202
|
+
const idNullifierBE = hmac(sha256, seedBytes, encoder.encode("IDNullifier"));
|
203
|
+
const combinedBytes = new Uint8Array([...idTrapdoorBE, ...idNullifierBE]);
|
204
|
+
const idSecretHashBE = sha256(combinedBytes);
|
205
|
+
const idCommitmentBE = sha256(idSecretHashBE);
|
206
|
+
// All hashing functions return big-endian bytes
|
207
|
+
// We need to switch to little-endian for the identity credential
|
208
|
+
const idTrapdoorLE = switchEndianness(idTrapdoorBE);
|
209
|
+
const idNullifierLE = switchEndianness(idNullifierBE);
|
210
|
+
const idSecretHashLE = switchEndianness(idSecretHashBE);
|
211
|
+
const idCommitmentLE = switchEndianness(idCommitmentBE);
|
214
212
|
log.info("Successfully generated identity credential");
|
215
|
-
return new IdentityCredential(
|
213
|
+
return new IdentityCredential(idTrapdoorLE, idNullifierLE, idSecretHashLE, idCommitmentLE);
|
216
214
|
}
|
217
215
|
}
|
218
216
|
|
@@ -1,18 +1,35 @@
|
|
1
|
-
import
|
2
|
-
import '
|
1
|
+
import '../../interfaces/dist/protocols.js';
|
2
|
+
import '../../interfaces/dist/connection_manager.js';
|
3
|
+
import '../../interfaces/dist/health_indicator.js';
|
4
|
+
import '../../../node_modules/multiformats/dist/src/bases/base10.js';
|
5
|
+
import '../../../node_modules/multiformats/dist/src/bases/base16.js';
|
6
|
+
import '../../../node_modules/multiformats/dist/src/bases/base2.js';
|
7
|
+
import '../../../node_modules/multiformats/dist/src/bases/base256emoji.js';
|
8
|
+
import '../../../node_modules/multiformats/dist/src/bases/base32.js';
|
9
|
+
import '../../../node_modules/multiformats/dist/src/bases/base36.js';
|
10
|
+
import '../../../node_modules/multiformats/dist/src/bases/base58.js';
|
11
|
+
import '../../../node_modules/multiformats/dist/src/bases/base64.js';
|
12
|
+
import '../../../node_modules/multiformats/dist/src/bases/base8.js';
|
13
|
+
import '../../../node_modules/multiformats/dist/src/bases/identity.js';
|
14
|
+
import '../../../node_modules/multiformats/dist/src/codecs/json.js';
|
15
|
+
import { Logger } from '../../utils/dist/logger/index.js';
|
16
|
+
import { DEFAULT_Q } from './contract/constants.js';
|
17
|
+
import { buildBigIntFromUint8ArrayLE, switchEndiannessBigInt } from './utils/bytes.js';
|
3
18
|
|
19
|
+
const log = new Logger("waku:rln:identity");
|
4
20
|
class IdentityCredential {
|
5
21
|
IDTrapdoor;
|
6
22
|
IDNullifier;
|
7
23
|
IDSecretHash;
|
8
24
|
IDCommitment;
|
9
|
-
|
10
|
-
|
25
|
+
/**
|
26
|
+
* All variables are in little-endian format
|
27
|
+
*/
|
28
|
+
constructor(IDTrapdoor, IDNullifier, IDSecretHash, IDCommitment) {
|
11
29
|
this.IDTrapdoor = IDTrapdoor;
|
12
30
|
this.IDNullifier = IDNullifier;
|
13
31
|
this.IDSecretHash = IDSecretHash;
|
14
32
|
this.IDCommitment = IDCommitment;
|
15
|
-
this.IDCommitmentBigInt = IDCommitmentBigInt;
|
16
33
|
}
|
17
34
|
static fromBytes(memKeys) {
|
18
35
|
if (memKeys.length < 128) {
|
@@ -22,8 +39,24 @@ class IdentityCredential {
|
|
22
39
|
const idNullifier = memKeys.subarray(32, 64);
|
23
40
|
const idSecretHash = memKeys.subarray(64, 96);
|
24
41
|
const idCommitment = memKeys.subarray(96, 128);
|
25
|
-
|
26
|
-
|
42
|
+
return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment);
|
43
|
+
}
|
44
|
+
/**
|
45
|
+
* Converts an ID commitment from bytes to a BigInt, normalizing it against a limit if needed
|
46
|
+
* @param bytes The ID commitment bytes to convert
|
47
|
+
* @param limit Optional limit to normalize against (Q value)
|
48
|
+
* @returns The ID commitment as a BigInt
|
49
|
+
*/
|
50
|
+
static getIdCommitmentBigInt(idCommitment, returnType = "big-endian", limit = DEFAULT_Q) {
|
51
|
+
let idCommitmentBigIntLE = buildBigIntFromUint8ArrayLE(idCommitment);
|
52
|
+
if (limit && idCommitmentBigIntLE >= limit) {
|
53
|
+
log.warn(`ID commitment is greater than Q, reducing it by Q: ${idCommitmentBigIntLE} % ${limit}`);
|
54
|
+
idCommitmentBigIntLE = idCommitmentBigIntLE % limit;
|
55
|
+
}
|
56
|
+
if (returnType === "big-endian") {
|
57
|
+
return switchEndiannessBigInt(idCommitmentBigIntLE);
|
58
|
+
}
|
59
|
+
return idCommitmentBigIntLE;
|
27
60
|
}
|
28
61
|
}
|
29
62
|
|
@@ -17,7 +17,6 @@ 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 { buildBigIntFromUint8Array } from '../utils/bytes.js';
|
21
20
|
import { keccak256Checksum, decryptEipKeystore } from './cipher.js';
|
22
21
|
import { isKeystoreValid, isCredentialValid } from './schema_validator.js';
|
23
22
|
import { __exports as lib } from '../../../../_virtual/index.js';
|
@@ -164,14 +163,16 @@ class Keystore {
|
|
164
163
|
try {
|
165
164
|
const str = bytesToUtf8(bytes);
|
166
165
|
const obj = JSON.parse(str);
|
167
|
-
|
166
|
+
const idCommitmentLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []));
|
167
|
+
const idTrapdoorLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", []));
|
168
|
+
const idNullifierLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", []));
|
169
|
+
const idSecretHashLE = Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []));
|
168
170
|
return {
|
169
171
|
identity: {
|
170
|
-
IDCommitment:
|
171
|
-
IDTrapdoor:
|
172
|
-
IDNullifier:
|
173
|
-
|
174
|
-
IDSecretHash: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []))
|
172
|
+
IDCommitment: idCommitmentLE,
|
173
|
+
IDTrapdoor: idTrapdoorLE,
|
174
|
+
IDNullifier: idNullifierLE,
|
175
|
+
IDSecretHash: idSecretHashLE
|
175
176
|
},
|
176
177
|
membership: {
|
177
178
|
treeIndex: _.get(obj, "treeIndex"),
|
@@ -208,13 +209,16 @@ class Keystore {
|
|
208
209
|
// follows nwaku implementation
|
209
210
|
// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L98
|
210
211
|
static fromIdentityToBytes(options) {
|
212
|
+
function toLittleEndian(bytes) {
|
213
|
+
return new Uint8Array(bytes).reverse();
|
214
|
+
}
|
211
215
|
return utf8ToBytes(JSON.stringify({
|
212
216
|
treeIndex: options.membership.treeIndex,
|
213
217
|
identityCredential: {
|
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)
|
218
|
+
idCommitment: Array.from(toLittleEndian(options.identity.IDCommitment)),
|
219
|
+
idNullifier: Array.from(toLittleEndian(options.identity.IDNullifier)),
|
220
|
+
idSecretHash: Array.from(toLittleEndian(options.identity.IDSecretHash)),
|
221
|
+
idTrapdoor: Array.from(toLittleEndian(options.identity.IDTrapdoor))
|
218
222
|
},
|
219
223
|
membershipContract: {
|
220
224
|
chainId: options.membership.chainId,
|
@@ -1,4 +1,14 @@
|
|
1
|
+
import { Version } from '../../core/dist/lib/message/version_0.js';
|
2
|
+
import '../../core/dist/lib/filter/filter.js';
|
3
|
+
import '../../core/dist/lib/light_push/light_push.js';
|
4
|
+
import '../../core/dist/lib/store/store.js';
|
5
|
+
import '../../core/dist/lib/connection_manager/connection_manager.js';
|
6
|
+
import '../../interfaces/dist/protocols.js';
|
7
|
+
import '../../interfaces/dist/connection_manager.js';
|
8
|
+
import '../../interfaces/dist/health_indicator.js';
|
1
9
|
import { utf8ToBytes } from '../../utils/dist/bytes/index.js';
|
10
|
+
import '../../../node_modules/debug/src/browser.js';
|
11
|
+
import '../../core/dist/lib/metadata/metadata.js';
|
2
12
|
import { epochBytesToInt } from './utils/epoch.js';
|
3
13
|
|
4
14
|
function toRLNSignal(contentTopic, msg) {
|
@@ -10,6 +20,7 @@ class RlnMessage {
|
|
10
20
|
msg;
|
11
21
|
rateLimitProof;
|
12
22
|
pubsubTopic = "";
|
23
|
+
version = Version;
|
13
24
|
constructor(rlnInstance, msg, rateLimitProof) {
|
14
25
|
this.rlnInstance = rlnInstance;
|
15
26
|
this.msg = msg;
|
@@ -16,12 +16,35 @@ function concatenate(...input) {
|
|
16
16
|
}
|
17
17
|
return result;
|
18
18
|
}
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
function switchEndianness(bytes) {
|
20
|
+
return new Uint8Array(bytes.reverse());
|
21
|
+
}
|
22
|
+
/**
|
23
|
+
* Builds a BigInt from a little-endian Uint8Array
|
24
|
+
* @param bytes The little-endian bytes to convert
|
25
|
+
* @returns The resulting BigInt in little-endian format
|
26
|
+
*/
|
27
|
+
function buildBigIntFromUint8ArrayLE(bytes) {
|
28
|
+
let result = 0n;
|
29
|
+
for (let i = bytes.length - 1; i >= 0; i--) {
|
30
|
+
result = (result << 8n) + BigInt(bytes[i]);
|
31
|
+
}
|
32
|
+
return result;
|
33
|
+
}
|
34
|
+
/**
|
35
|
+
* Switches endianness of a bigint value
|
36
|
+
* @param value The bigint value to switch endianness for
|
37
|
+
* @returns The bigint value with reversed endianness
|
38
|
+
*/
|
39
|
+
function switchEndiannessBigInt(value) {
|
40
|
+
// Convert bigint to byte array
|
41
|
+
const bytes = [];
|
42
|
+
while (value > 0n) {
|
43
|
+
bytes.push(Number(value & 0xffn));
|
44
|
+
value >>= 8n;
|
45
|
+
}
|
46
|
+
// Reverse bytes and convert back to bigint
|
47
|
+
return bytes.reverse().reduce((acc, byte) => (acc << 8n) + BigInt(byte), 0n);
|
25
48
|
}
|
26
49
|
function writeUIntLE(buf, value, offset, byteLength, noAssert) {
|
27
50
|
value = +value;
|
@@ -39,15 +62,6 @@ function writeUIntLE(buf, value, offset, byteLength, noAssert) {
|
|
39
62
|
}
|
40
63
|
return buf;
|
41
64
|
}
|
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);
|
50
|
-
}
|
51
65
|
/**
|
52
66
|
* Fills with zeros to set length
|
53
67
|
* @param array little endian Uint8Array
|
@@ -61,5 +75,12 @@ function zeroPadLE(array, length) {
|
|
61
75
|
}
|
62
76
|
return result;
|
63
77
|
}
|
78
|
+
// Adapted from https://github.com/feross/buffer
|
79
|
+
function checkInt(buf, value, offset, ext, max, min) {
|
80
|
+
if (value > max || value < min)
|
81
|
+
throw new RangeError('"value" argument is out of bounds');
|
82
|
+
if (offset + ext > buf.length)
|
83
|
+
throw new RangeError("Index out of range");
|
84
|
+
}
|
64
85
|
|
65
|
-
export {
|
86
|
+
export { buildBigIntFromUint8ArrayLE, concatenate, switchEndianness, switchEndiannessBigInt, writeUIntLE, zeroPadLE };
|