@waku/rln 0.1.6-b133417.0 → 0.1.6-b4748fd.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/packages/rln/dist/contract/rln_base_contract.js +32 -8
- package/bundle/packages/rln/dist/contract/rln_contract.js +2 -2
- package/bundle/packages/rln/dist/credentials_manager.js +11 -17
- package/bundle/packages/rln/dist/identity.js +0 -5
- package/bundle/packages/rln/dist/keystore/keystore.js +11 -18
- package/bundle/packages/rln/dist/proof.js +2 -2
- package/bundle/packages/rln/dist/utils/bytes.js +61 -108
- package/bundle/packages/rln/dist/utils/hash.js +3 -3
- package/bundle/packages/rln/dist/zerokit.js +17 -17
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/rln_base_contract.d.ts +6 -0
- package/dist/contract/rln_base_contract.js +32 -8
- package/dist/contract/rln_base_contract.js.map +1 -1
- package/dist/contract/rln_contract.js +2 -2
- package/dist/contract/rln_contract.js.map +1 -1
- package/dist/credentials_manager.d.ts +0 -4
- package/dist/credentials_manager.js +11 -18
- package/dist/credentials_manager.js.map +1 -1
- package/dist/identity.d.ts +0 -1
- package/dist/identity.js +0 -4
- package/dist/identity.js.map +1 -1
- package/dist/keystore/keystore.js +11 -18
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/proof.js +2 -2
- package/dist/proof.js.map +1 -1
- package/dist/utils/bytes.d.ts +16 -42
- package/dist/utils/bytes.js +60 -107
- package/dist/utils/bytes.js.map +1 -1
- package/dist/utils/hash.js +5 -5
- package/dist/utils/hash.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/dist/zerokit.js +17 -17
- package/dist/zerokit.js.map +1 -1
- package/package.json +1 -1
- package/src/contract/rln_base_contract.ts +55 -17
- package/src/contract/rln_contract.ts +2 -5
- package/src/credentials_manager.ts +15 -31
- package/src/identity.ts +1 -7
- package/src/keystore/keystore.ts +11 -25
- package/src/proof.ts +2 -2
- package/src/utils/bytes.ts +67 -117
- package/src/utils/hash.ts +5 -15
- package/src/utils/index.ts +6 -1
- package/src/zerokit.ts +22 -30
package/dist/utils/bytes.js
CHANGED
@@ -1,109 +1,62 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
}
|
62
|
-
let mul = 1;
|
63
|
-
let i = 0;
|
64
|
-
buf[offset] = value & 0xff;
|
65
|
-
while (++i < byteLength && (mul *= 0x100)) {
|
66
|
-
buf[offset + i] = (value / mul) & 0xff;
|
67
|
-
}
|
68
|
-
return buf;
|
69
|
-
}
|
70
|
-
/**
|
71
|
-
* Fills with zeros to set length
|
72
|
-
* @param array little endian Uint8Array
|
73
|
-
* @param length amount to pad
|
74
|
-
* @returns little endian Uint8Array padded with zeros to set length
|
75
|
-
*/
|
76
|
-
static zeroPadLE(array, length) {
|
77
|
-
const result = new Uint8Array(length);
|
78
|
-
for (let i = 0; i < length; i++) {
|
79
|
-
result[i] = array[i] || 0;
|
80
|
-
}
|
81
|
-
return result;
|
82
|
-
}
|
83
|
-
// Adapted from https://github.com/feross/buffer
|
84
|
-
static checkInt(buf, value, offset, ext, max, min) {
|
85
|
-
if (value > max || value < min)
|
86
|
-
throw new RangeError('"value" argument is out of bounds');
|
87
|
-
if (offset + ext > buf.length)
|
88
|
-
throw new RangeError("Index out of range");
|
89
|
-
}
|
90
|
-
/**
|
91
|
-
* Concatenate Uint8Arrays
|
92
|
-
* @param input
|
93
|
-
* @returns concatenation of all Uint8Array received as input
|
94
|
-
*/
|
95
|
-
static concatenate(...input) {
|
96
|
-
let totalLength = 0;
|
97
|
-
for (const arr of input) {
|
98
|
-
totalLength += arr.length;
|
99
|
-
}
|
100
|
-
const result = new Uint8Array(totalLength);
|
101
|
-
let offset = 0;
|
102
|
-
for (const arr of input) {
|
103
|
-
result.set(arr, offset);
|
104
|
-
offset += arr.length;
|
105
|
-
}
|
106
|
-
return result;
|
107
|
-
}
|
1
|
+
/**
|
2
|
+
* Concatenate Uint8Arrays
|
3
|
+
* @param input
|
4
|
+
* @returns concatenation of all Uint8Array received as input
|
5
|
+
*/
|
6
|
+
export function concatenate(...input) {
|
7
|
+
let totalLength = 0;
|
8
|
+
for (const arr of input) {
|
9
|
+
totalLength += arr.length;
|
10
|
+
}
|
11
|
+
const result = new Uint8Array(totalLength);
|
12
|
+
let offset = 0;
|
13
|
+
for (const arr of input) {
|
14
|
+
result.set(arr, offset);
|
15
|
+
offset += arr.length;
|
16
|
+
}
|
17
|
+
return result;
|
18
|
+
}
|
19
|
+
export function switchEndianness(bytes) {
|
20
|
+
return new Uint8Array(bytes.reverse());
|
21
|
+
}
|
22
|
+
export function buildBigIntFromUint8ArrayBE(bytes) {
|
23
|
+
// Interpret bytes as big-endian
|
24
|
+
return bytes.reduce((acc, byte) => (acc << 8n) + BigInt(byte), 0n);
|
25
|
+
}
|
26
|
+
export function writeUIntLE(buf, value, offset, byteLength, noAssert) {
|
27
|
+
value = +value;
|
28
|
+
offset = offset >>> 0;
|
29
|
+
byteLength = byteLength >>> 0;
|
30
|
+
if (!noAssert) {
|
31
|
+
const maxBytes = Math.pow(2, 8 * byteLength) - 1;
|
32
|
+
checkInt(buf, value, offset, byteLength, maxBytes, 0);
|
33
|
+
}
|
34
|
+
let mul = 1;
|
35
|
+
let i = 0;
|
36
|
+
buf[offset] = value & 0xff;
|
37
|
+
while (++i < byteLength && (mul *= 0x100)) {
|
38
|
+
buf[offset + i] = (value / mul) & 0xff;
|
39
|
+
}
|
40
|
+
return buf;
|
41
|
+
}
|
42
|
+
/**
|
43
|
+
* Fills with zeros to set length
|
44
|
+
* @param array little endian Uint8Array
|
45
|
+
* @param length amount to pad
|
46
|
+
* @returns little endian Uint8Array padded with zeros to set length
|
47
|
+
*/
|
48
|
+
export function zeroPadLE(array, length) {
|
49
|
+
const result = new Uint8Array(length);
|
50
|
+
for (let i = 0; i < length; i++) {
|
51
|
+
result[i] = array[i] || 0;
|
52
|
+
}
|
53
|
+
return result;
|
54
|
+
}
|
55
|
+
// Adapted from https://github.com/feross/buffer
|
56
|
+
function checkInt(buf, value, offset, ext, max, min) {
|
57
|
+
if (value > max || value < min)
|
58
|
+
throw new RangeError('"value" argument is out of bounds');
|
59
|
+
if (offset + ext > buf.length)
|
60
|
+
throw new RangeError("Index out of range");
|
108
61
|
}
|
109
62
|
//# sourceMappingURL=bytes.js.map
|
package/dist/utils/bytes.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/utils/bytes.ts"],"names":[],"mappings":"AAAA,MAAM,
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/utils/bytes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,KAAmB;IAChD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAiB;IAC3D,gCAAgC;IAChC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,GAAe,EACf,KAAa,EACb,MAAc,EACd,UAAkB,EAClB,QAAkB;IAElB,KAAK,GAAG,CAAC,KAAK,CAAC;IACf,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC;IACtB,UAAU,GAAG,UAAU,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACjD,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,MAAc;IACzD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gDAAgD;AAChD,SAAS,QAAQ,CACf,GAAe,EACf,KAAa,EACb,MAAc,EACd,GAAW,EACX,GAAW,EACX,GAAW;IAEX,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG;QAC5B,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC5D,IAAI,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAC5E,CAAC"}
|
package/dist/utils/hash.js
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
import * as zerokitRLN from "@waku/zerokit-rln-wasm";
|
2
|
-
import {
|
2
|
+
import { concatenate, writeUIntLE } from "./bytes.js";
|
3
3
|
export function poseidonHash(...input) {
|
4
|
-
const inputLen =
|
5
|
-
const lenPrefixedData =
|
4
|
+
const inputLen = writeUIntLE(new Uint8Array(8), input.length, 0, 8);
|
5
|
+
const lenPrefixedData = concatenate(inputLen, ...input);
|
6
6
|
return zerokitRLN.poseidonHash(lenPrefixedData);
|
7
7
|
}
|
8
8
|
export function sha256(input) {
|
9
|
-
const inputLen =
|
10
|
-
const lenPrefixedData =
|
9
|
+
const inputLen = writeUIntLE(new Uint8Array(8), input.length, 0, 8);
|
10
|
+
const lenPrefixedData = concatenate(inputLen, input);
|
11
11
|
return zerokitRLN.hash(lenPrefixedData);
|
12
12
|
}
|
13
13
|
//# sourceMappingURL=hash.js.map
|
package/dist/utils/hash.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,UAAU,YAAY,CAAC,GAAG,KAAwB;IACtD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC;IACxD,OAAO,UAAU,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAiB;IACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
export { extractMetaMaskSigner } from "./metamask.js";
|
2
|
-
export {
|
2
|
+
export { concatenate, writeUIntLE, switchEndianness, zeroPadLE } from "./bytes.js";
|
3
3
|
export { sha256, poseidonHash } from "./hash.js";
|
4
4
|
export { dateToEpoch, epochIntToBytes, epochBytesToInt } from "./epoch.js";
|
package/dist/utils/index.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
export { extractMetaMaskSigner } from "./metamask.js";
|
2
|
-
export {
|
2
|
+
export { concatenate, writeUIntLE, switchEndianness, zeroPadLE } from "./bytes.js";
|
3
3
|
export { sha256, poseidonHash } from "./hash.js";
|
4
4
|
export { dateToEpoch, epochIntToBytes, epochBytesToInt } from "./epoch.js";
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,SAAS,EACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/zerokit.js
CHANGED
@@ -2,7 +2,7 @@ import * as zerokitRLN from "@waku/zerokit-rln-wasm";
|
|
2
2
|
import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from "./contract/constants.js";
|
3
3
|
import { IdentityCredential } from "./identity.js";
|
4
4
|
import { Proof, proofToBytes } from "./proof.js";
|
5
|
-
import {
|
5
|
+
import { concatenate, dateToEpoch, epochIntToBytes, writeUIntLE } from "./utils/index.js";
|
6
6
|
export class Zerokit {
|
7
7
|
zkRLN;
|
8
8
|
witnessCalculator;
|
@@ -38,8 +38,8 @@ export class Zerokit {
|
|
38
38
|
insertMembers(index, ...idCommitments) {
|
39
39
|
// serializes a seq of IDCommitments to a byte seq
|
40
40
|
// the order of serialization is |id_commitment_len<8>|id_commitment<var>|
|
41
|
-
const idCommitmentLen =
|
42
|
-
const idCommitmentBytes =
|
41
|
+
const idCommitmentLen = writeUIntLE(new Uint8Array(8), idCommitments.length, 0, 8);
|
42
|
+
const idCommitmentBytes = concatenate(idCommitmentLen, ...idCommitments);
|
43
43
|
zerokitRLN.setLeavesFrom(this.zkRLN, index, idCommitmentBytes);
|
44
44
|
}
|
45
45
|
deleteMember(index) {
|
@@ -50,11 +50,11 @@ export class Zerokit {
|
|
50
50
|
}
|
51
51
|
serializeMessage(uint8Msg, memIndex, epoch, idKey, rateLimit) {
|
52
52
|
// calculate message length
|
53
|
-
const msgLen =
|
54
|
-
const memIndexBytes =
|
55
|
-
const rateLimitBytes =
|
53
|
+
const msgLen = writeUIntLE(new Uint8Array(8), uint8Msg.length, 0, 8);
|
54
|
+
const memIndexBytes = writeUIntLE(new Uint8Array(8), memIndex, 0, 8);
|
55
|
+
const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
|
56
56
|
// [ id_key<32> | id_index<8> | epoch<32> | signal_len<8> | signal<var> | rate_limit<8> ]
|
57
|
-
return
|
57
|
+
return concatenate(idKey, memIndexBytes, epoch, msgLen, uint8Msg, rateLimitBytes);
|
58
58
|
}
|
59
59
|
async generateRLNProof(msg, index, epoch, idSecretHash, rateLimit) {
|
60
60
|
if (epoch === undefined) {
|
@@ -90,9 +90,9 @@ export class Zerokit {
|
|
90
90
|
pBytes = proofToBytes(proof);
|
91
91
|
}
|
92
92
|
// calculate message length
|
93
|
-
const msgLen =
|
94
|
-
const rateLimitBytes =
|
95
|
-
return zerokitRLN.verifyRLNProof(this.zkRLN,
|
93
|
+
const msgLen = writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
|
94
|
+
const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
|
95
|
+
return zerokitRLN.verifyRLNProof(this.zkRLN, concatenate(pBytes, msgLen, msg, rateLimitBytes));
|
96
96
|
}
|
97
97
|
verifyWithRoots(proof, msg, roots, rateLimit) {
|
98
98
|
let pBytes;
|
@@ -103,10 +103,10 @@ export class Zerokit {
|
|
103
103
|
pBytes = proofToBytes(proof);
|
104
104
|
}
|
105
105
|
// calculate message length
|
106
|
-
const msgLen =
|
107
|
-
const rateLimitBytes =
|
108
|
-
const rootsBytes =
|
109
|
-
return zerokitRLN.verifyWithRoots(this.zkRLN,
|
106
|
+
const msgLen = writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
|
107
|
+
const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
|
108
|
+
const rootsBytes = concatenate(...roots);
|
109
|
+
return zerokitRLN.verifyWithRoots(this.zkRLN, concatenate(pBytes, msgLen, msg, rateLimitBytes), rootsBytes);
|
110
110
|
}
|
111
111
|
verifyWithNoRoot(proof, msg, rateLimit) {
|
112
112
|
let pBytes;
|
@@ -117,9 +117,9 @@ export class Zerokit {
|
|
117
117
|
pBytes = proofToBytes(proof);
|
118
118
|
}
|
119
119
|
// calculate message length
|
120
|
-
const msgLen =
|
121
|
-
const rateLimitBytes =
|
122
|
-
return zerokitRLN.verifyWithRoots(this.zkRLN,
|
120
|
+
const msgLen = writeUIntLE(new Uint8Array(8), msg.length, 0, 8);
|
121
|
+
const rateLimitBytes = writeUIntLE(new Uint8Array(8), rateLimit ?? this.rateLimit, 0, 8);
|
122
|
+
return zerokitRLN.verifyWithRoots(this.zkRLN, concatenate(pBytes, msgLen, msg, rateLimitBytes), new Uint8Array());
|
123
123
|
}
|
124
124
|
}
|
125
125
|
//# sourceMappingURL=zerokit.js.map
|
package/dist/zerokit.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"zerokit.js","sourceRoot":"","sources":["../src/zerokit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,
|
1
|
+
{"version":3,"file":"zerokit.js","sourceRoot":"","sources":["../src/zerokit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@waku/rln","version":"0.1.6-
|
1
|
+
{"name":"@waku/rln","version":"0.1.6-b4748fd.0","description":"RLN (Rate Limiting Nullifier) implementation for Waku","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"type":"module","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/rln#readme","repository":{"type":"git","url":"https://github.com/waku-org/js-waku.git"},"bugs":{"url":"https://github.com/waku-org/js-waku/issues"},"license":"MIT OR Apache-2.0","keywords":["waku","rln","rate-limiting","privacy","web3"],"scripts":{"build":"run-s build:**","build:copy":"mkdir -p dist/resources && cp -r src/resources/* dist/resources/","build:esm":"tsc","build:bundle":"rollup --config rollup.config.js","fix":"run-s fix:*","fix:lint":"eslint src *.js --fix","check":"run-s check:*","check:tsc":"tsc -p tsconfig.dev.json","check:lint":"eslint \"src/!(resources)/**/*.{ts,js}\" *.js","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","test":"NODE_ENV=test run-s test:*","test:browser":"karma start karma.conf.cjs","watch:build":"tsc -p tsconfig.json -w","watch:test":"mocha --watch","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build"},"engines":{"node":">=20"},"devDependencies":{"@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.3","@types/chai":"^5.0.1","@types/chai-spies":"^1.0.6","@waku/interfaces":"0.0.31-b4748fd.0","@types/deep-equal-in-any-order":"^1.0.4","@types/lodash":"^4.17.15","@types/sinon":"^17.0.3","@waku/build-utils":"^1.0.0","@waku/message-encryption":"0.0.34-b4748fd.0","deep-equal-in-any-order":"^2.0.6","fast-check":"^3.23.2","rollup-plugin-copy":"^3.5.0"},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"],"dependencies":{"@chainsafe/bls-keystore":"3.0.0","@waku/core":"0.0.36-b4748fd.0","@waku/utils":"0.0.24-b4748fd.0","@noble/hashes":"^1.2.0","@waku/zerokit-rln-wasm":"^0.0.13","ethereum-cryptography":"^3.1.0","ethers":"^5.7.2","lodash":"^4.17.21","uuid":"^11.0.5","chai":"^5.1.2","chai-as-promised":"^8.0.1","chai-spies":"^1.1.0","chai-subset":"^1.6.0","sinon":"^19.0.2"}}
|
@@ -3,10 +3,14 @@ import { ethers } from "ethers";
|
|
3
3
|
|
4
4
|
import { IdentityCredential } from "../identity.js";
|
5
5
|
import { DecryptedCredentials } from "../keystore/types.js";
|
6
|
-
import {
|
6
|
+
import { buildBigIntFromUint8ArrayBE } from "../utils/bytes.js";
|
7
7
|
|
8
8
|
import { RLN_ABI } from "./abi.js";
|
9
|
-
import {
|
9
|
+
import {
|
10
|
+
DEFAULT_Q,
|
11
|
+
DEFAULT_RATE_LIMIT,
|
12
|
+
RATE_LIMIT_PARAMS
|
13
|
+
} from "./constants.js";
|
10
14
|
import {
|
11
15
|
CustomQueryOptions,
|
12
16
|
FetchMembersOptions,
|
@@ -26,6 +30,12 @@ export class RLNBaseContract {
|
|
26
30
|
private minRateLimit?: number;
|
27
31
|
private maxRateLimit?: number;
|
28
32
|
|
33
|
+
/**
|
34
|
+
* Default Q value for the RLN contract.
|
35
|
+
* @see https://github.com/waku-org/waku-rlnv2-contract/blob/b7e9a9b1bc69256a2a3076c1f099b50ce84e7eff/src/WakuRlnV2.sol#L25
|
36
|
+
*/
|
37
|
+
public idCommitmentBigIntLimit = DEFAULT_Q;
|
38
|
+
|
29
39
|
protected _members: Map<number, Member> = new Map();
|
30
40
|
private _membersFilter: ethers.EventFilter;
|
31
41
|
private _membershipErasedFilter: ethers.EventFilter;
|
@@ -78,12 +88,16 @@ export class RLNBaseContract {
|
|
78
88
|
options: RLNContractInitOptions
|
79
89
|
): Promise<RLNBaseContract> {
|
80
90
|
const instance = new RLNBaseContract(options);
|
81
|
-
const [min, max] = await Promise.all([
|
91
|
+
const [min, max, idCommitmentBigIntLimit] = await Promise.all([
|
82
92
|
instance.contract.minMembershipRateLimit(),
|
83
|
-
instance.contract.maxMembershipRateLimit()
|
93
|
+
instance.contract.maxMembershipRateLimit(),
|
94
|
+
instance.contract.Q()
|
84
95
|
]);
|
85
96
|
instance.minRateLimit = ethers.BigNumber.from(min).toNumber();
|
86
97
|
instance.maxRateLimit = ethers.BigNumber.from(max).toNumber();
|
98
|
+
instance.idCommitmentBigIntLimit = BigInt(
|
99
|
+
idCommitmentBigIntLimit.toString()
|
100
|
+
);
|
87
101
|
|
88
102
|
instance.validateRateLimit(instance.rateLimit);
|
89
103
|
return instance;
|
@@ -491,6 +505,33 @@ export class RLNBaseContract {
|
|
491
505
|
log.error(`Error in withdraw: ${(error as Error).message}`);
|
492
506
|
}
|
493
507
|
}
|
508
|
+
|
509
|
+
private getIdCommitmentBigInt(bytes: Uint8Array): bigint {
|
510
|
+
let idCommitmentBigIntBE = buildBigIntFromUint8ArrayBE(bytes);
|
511
|
+
log.info("1");
|
512
|
+
|
513
|
+
if (!this.contract) {
|
514
|
+
throw Error("RLN contract is not initialized");
|
515
|
+
}
|
516
|
+
|
517
|
+
const idCommitmentBigIntLimit = this.contract.idCommitmentBigIntLimit;
|
518
|
+
|
519
|
+
log.info("idCommitmentBigIntBE: ", idCommitmentBigIntBE);
|
520
|
+
log.info("idCommitmentBigIntLimit: ", idCommitmentBigIntLimit);
|
521
|
+
log.info(
|
522
|
+
"idCommitmentBigIntBE >= idCommitmentBigIntLimit: ",
|
523
|
+
idCommitmentBigIntBE >= idCommitmentBigIntLimit
|
524
|
+
);
|
525
|
+
|
526
|
+
if (idCommitmentBigIntBE >= idCommitmentBigIntLimit) {
|
527
|
+
log.warn(
|
528
|
+
`ID commitment is greater than Q, reducing it by Q(idCommitmentBigIntLimit): ${idCommitmentBigIntBE} % ${idCommitmentBigIntLimit}`
|
529
|
+
);
|
530
|
+
idCommitmentBigIntBE = idCommitmentBigIntBE % idCommitmentBigIntLimit;
|
531
|
+
}
|
532
|
+
return idCommitmentBigIntBE;
|
533
|
+
}
|
534
|
+
|
494
535
|
public async registerWithIdentity(
|
495
536
|
identity: IdentityCredential
|
496
537
|
): Promise<DecryptedCredentials | undefined> {
|
@@ -499,10 +540,12 @@ export class RLNBaseContract {
|
|
499
540
|
`Registering identity with rate limit: ${this.rateLimit} messages/epoch`
|
500
541
|
);
|
501
542
|
|
502
|
-
|
503
|
-
|
504
|
-
identity.IDCommitmentBigInt
|
543
|
+
const idCommitmentBigInt = this.getIdCommitmentBigInt(
|
544
|
+
identity.IDCommitment
|
505
545
|
);
|
546
|
+
|
547
|
+
// Check if the ID commitment is already registered
|
548
|
+
const existingIndex = await this.getMemberIndex(idCommitmentBigInt);
|
506
549
|
if (existingIndex) {
|
507
550
|
throw new Error(
|
508
551
|
`ID commitment is already registered with index ${existingIndex}`
|
@@ -518,21 +561,16 @@ export class RLNBaseContract {
|
|
518
561
|
}
|
519
562
|
|
520
563
|
const estimatedGas = await this.contract.estimateGas.register(
|
521
|
-
|
564
|
+
idCommitmentBigInt,
|
522
565
|
this.rateLimit,
|
523
566
|
[]
|
524
567
|
);
|
525
568
|
const gasLimit = estimatedGas.add(10000);
|
526
569
|
|
527
570
|
const txRegisterResponse: ethers.ContractTransaction =
|
528
|
-
await this.contract.register(
|
529
|
-
|
530
|
-
|
531
|
-
[],
|
532
|
-
{
|
533
|
-
gasLimit
|
534
|
-
}
|
535
|
-
);
|
571
|
+
await this.contract.register(idCommitmentBigInt, this.rateLimit, [], {
|
572
|
+
gasLimit
|
573
|
+
});
|
536
574
|
|
537
575
|
const txRegisterReceipt = await txRegisterResponse.wait();
|
538
576
|
|
@@ -628,7 +666,7 @@ export class RLNBaseContract {
|
|
628
666
|
permit.v,
|
629
667
|
permit.r,
|
630
668
|
permit.s,
|
631
|
-
|
669
|
+
this.getIdCommitmentBigInt(identity.IDCommitment),
|
632
670
|
this.rateLimit,
|
633
671
|
idCommitmentsToErase.map((id) => ethers.BigNumber.from(id))
|
634
672
|
);
|
@@ -4,7 +4,7 @@ import { ethers } from "ethers";
|
|
4
4
|
|
5
5
|
import type { RLNInstance } from "../rln.js";
|
6
6
|
import { MerkleRootTracker } from "../root_tracker.js";
|
7
|
-
import {
|
7
|
+
import { zeroPadLE } from "../utils/bytes.js";
|
8
8
|
|
9
9
|
import { RLNBaseContract } from "./rln_base_contract.js";
|
10
10
|
import { RLNContractInitOptions } from "./types.js";
|
@@ -110,10 +110,7 @@ export class RLNContract extends RLNBaseContract {
|
|
110
110
|
index = ethers.BigNumber.from(index);
|
111
111
|
}
|
112
112
|
|
113
|
-
const idCommitment =
|
114
|
-
hexToBytes(_idCommitment),
|
115
|
-
32
|
116
|
-
);
|
113
|
+
const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
|
117
114
|
rlnInstance.zerokit.insertMember(idCommitment);
|
118
115
|
|
119
116
|
const numericIndex = index.toNumber();
|
@@ -3,7 +3,7 @@ import { sha256 } from "@noble/hashes/sha2";
|
|
3
3
|
import { Logger } from "@waku/utils";
|
4
4
|
import { ethers } from "ethers";
|
5
5
|
|
6
|
-
import {
|
6
|
+
import { LINEA_CONTRACT } from "./contract/constants.js";
|
7
7
|
import { RLNBaseContract } from "./contract/rln_base_contract.js";
|
8
8
|
import { IdentityCredential } from "./identity.js";
|
9
9
|
import { Keystore } from "./keystore/index.js";
|
@@ -13,8 +13,7 @@ import type {
|
|
13
13
|
} from "./keystore/index.js";
|
14
14
|
import { KeystoreEntity, Password } from "./keystore/types.js";
|
15
15
|
import { RegisterMembershipOptions, StartRLNOptions } from "./types.js";
|
16
|
-
import {
|
17
|
-
import { extractMetaMaskSigner } from "./utils/index.js";
|
16
|
+
import { extractMetaMaskSigner, switchEndianness } from "./utils/index.js";
|
18
17
|
import { Zerokit } from "./zerokit.js";
|
19
18
|
|
20
19
|
const log = new Logger("waku:credentials");
|
@@ -269,36 +268,21 @@ export class RLNCredentialsManager {
|
|
269
268
|
const combinedBytes = new Uint8Array([...idTrapdoorBE, ...idNullifierBE]);
|
270
269
|
const idSecretHashBE = sha256(combinedBytes);
|
271
270
|
|
272
|
-
const
|
273
|
-
const idCommitmentBE = this.reduceIdCommitment(idCommitmentRawBE);
|
271
|
+
const idCommitmentBE = sha256(idSecretHashBE);
|
274
272
|
|
275
|
-
|
276
|
-
|
277
|
-
);
|
273
|
+
// All hashing functions return big-endian bytes
|
274
|
+
// We need to switch to little-endian for the identity credential
|
275
|
+
const idTrapdoorLE = switchEndianness(idTrapdoorBE);
|
276
|
+
const idNullifierLE = switchEndianness(idNullifierBE);
|
277
|
+
const idSecretHashLE = switchEndianness(idSecretHashBE);
|
278
|
+
const idCommitmentLE = switchEndianness(idCommitmentBE);
|
279
|
+
|
280
|
+
log.info("Successfully generated identity credential");
|
278
281
|
return new IdentityCredential(
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
282
|
+
idTrapdoorLE,
|
283
|
+
idNullifierLE,
|
284
|
+
idSecretHashLE,
|
285
|
+
idCommitmentLE
|
283
286
|
);
|
284
287
|
}
|
285
|
-
|
286
|
-
/**
|
287
|
-
* Helper: take 32-byte BE, reduce mod Q, return 32-byte BE
|
288
|
-
*/
|
289
|
-
private reduceIdCommitment(
|
290
|
-
bytesBE: Uint8Array,
|
291
|
-
limit: bigint = DEFAULT_Q
|
292
|
-
): Uint8Array {
|
293
|
-
const nBE = BytesUtils.buildBigIntFromUint8ArrayBE(bytesBE);
|
294
|
-
|
295
|
-
if (nBE >= limit) {
|
296
|
-
log.warn(
|
297
|
-
`ID commitment is greater than Q, reducing it by Q: ${nBE} % ${limit}`
|
298
|
-
);
|
299
|
-
return BytesUtils.bigIntToUint8Array32BE(nBE % limit);
|
300
|
-
}
|
301
|
-
|
302
|
-
return bytesBE;
|
303
|
-
}
|
304
288
|
}
|
package/src/identity.ts
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
import { BytesUtils } from "./utils/bytes.js";
|
2
|
-
|
3
1
|
export class IdentityCredential {
|
4
|
-
public IDCommitmentBigInt: bigint;
|
5
2
|
/**
|
6
3
|
* All variables are in little-endian format
|
7
4
|
*/
|
@@ -10,10 +7,7 @@ export class IdentityCredential {
|
|
10
7
|
public readonly IDNullifier: Uint8Array,
|
11
8
|
public readonly IDSecretHash: Uint8Array,
|
12
9
|
public readonly IDCommitment: Uint8Array
|
13
|
-
) {
|
14
|
-
this.IDCommitmentBigInt =
|
15
|
-
BytesUtils.buildBigIntFromUint8ArrayBE(IDCommitment);
|
16
|
-
}
|
10
|
+
) {}
|
17
11
|
|
18
12
|
public static fromBytes(memKeys: Uint8Array): IdentityCredential {
|
19
13
|
if (memKeys.length < 128) {
|