@waku/rln 0.1.1 → 0.1.2-6454446

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 (106) hide show
  1. package/README.md +26 -2
  2. package/bundle/assets/rln_wasm_bg-a503e304.wasm +0 -0
  3. package/bundle/index.js +58406 -10987
  4. package/dist/codec.d.ts +7 -4
  5. package/dist/codec.js +15 -5
  6. package/dist/codec.js.map +1 -1
  7. package/dist/{constants.d.ts → contract/constants.d.ts} +2 -2
  8. package/dist/contract/constants.js +67 -0
  9. package/dist/contract/constants.js.map +1 -0
  10. package/dist/contract/index.d.ts +2 -0
  11. package/dist/contract/index.js +3 -0
  12. package/dist/contract/index.js.map +1 -0
  13. package/dist/contract/rln_contract.d.ts +46 -0
  14. package/dist/contract/rln_contract.js +213 -0
  15. package/dist/contract/rln_contract.js.map +1 -0
  16. package/dist/create.d.ts +2 -0
  17. package/dist/create.js +8 -0
  18. package/dist/create.js.map +1 -0
  19. package/dist/identity.d.ts +9 -0
  20. package/dist/identity.js +24 -0
  21. package/dist/identity.js.map +1 -0
  22. package/dist/index.d.ts +9 -5
  23. package/dist/index.js +9 -12
  24. package/dist/index.js.map +1 -1
  25. package/dist/keystore/cipher.d.ts +4 -0
  26. package/dist/keystore/cipher.js +28 -0
  27. package/dist/keystore/cipher.js.map +1 -0
  28. package/dist/keystore/credential_validation_generated.d.ts +8 -0
  29. package/dist/keystore/credential_validation_generated.js +121 -0
  30. package/dist/keystore/credential_validation_generated.js.map +1 -0
  31. package/dist/keystore/index.d.ts +4 -0
  32. package/dist/keystore/index.js +3 -0
  33. package/dist/keystore/index.js.map +1 -0
  34. package/dist/keystore/keystore.d.ts +50 -0
  35. package/dist/keystore/keystore.js +205 -0
  36. package/dist/keystore/keystore.js.map +1 -0
  37. package/dist/keystore/keystore_validation_generated.d.ts +8 -0
  38. package/dist/keystore/keystore_validation_generated.js +75 -0
  39. package/dist/keystore/keystore_validation_generated.js.map +1 -0
  40. package/dist/keystore/schema_validator.d.ts +2 -0
  41. package/dist/keystore/schema_validator.js +18 -0
  42. package/dist/keystore/schema_validator.js.map +1 -0
  43. package/dist/keystore/types.d.ts +29 -0
  44. package/dist/keystore/types.js +2 -0
  45. package/dist/keystore/types.js.map +1 -0
  46. package/dist/message.d.ts +2 -1
  47. package/dist/message.js +10 -4
  48. package/dist/message.js.map +1 -1
  49. package/dist/proof.d.ts +21 -0
  50. package/dist/proof.js +49 -0
  51. package/dist/proof.js.map +1 -0
  52. package/dist/resources/verification_key.d.ts +9 -9
  53. package/dist/resources/witness_calculator.js.map +1 -0
  54. package/dist/rln.d.ts +55 -46
  55. package/dist/rln.js +136 -183
  56. package/dist/rln.js.map +1 -1
  57. package/dist/root_tracker.js +5 -2
  58. package/dist/root_tracker.js.map +1 -1
  59. package/dist/utils/bytes.d.ts +20 -0
  60. package/dist/utils/bytes.js +64 -0
  61. package/dist/utils/bytes.js.map +1 -0
  62. package/dist/utils/epoch.js.map +1 -0
  63. package/dist/utils/hash.d.ts +2 -0
  64. package/dist/utils/hash.js +13 -0
  65. package/dist/utils/hash.js.map +1 -0
  66. package/dist/utils/index.d.ts +4 -0
  67. package/dist/utils/index.js +5 -0
  68. package/dist/utils/index.js.map +1 -0
  69. package/dist/utils/metamask.d.ts +2 -0
  70. package/dist/utils/metamask.js +12 -0
  71. package/dist/utils/metamask.js.map +1 -0
  72. package/dist/zerokit.d.ts +19 -0
  73. package/dist/zerokit.js +105 -0
  74. package/dist/zerokit.js.map +1 -0
  75. package/package.json +38 -28
  76. package/src/codec.ts +18 -9
  77. package/src/create.ts +9 -0
  78. package/src/identity.ts +27 -0
  79. package/src/index.ts +16 -18
  80. package/src/message.ts +9 -5
  81. package/src/proof.ts +67 -0
  82. package/src/rln.ts +220 -270
  83. package/src/root_tracker.ts +4 -1
  84. package/src/zerokit.ts +181 -0
  85. package/bundle/assets/rln_wasm_bg-6f96f821.wasm +0 -0
  86. package/dist/.tsbuildinfo +0 -1
  87. package/dist/byte_utils.d.ts +0 -1
  88. package/dist/byte_utils.js +0 -24
  89. package/dist/byte_utils.js.map +0 -1
  90. package/dist/constants.js +0 -14
  91. package/dist/constants.js.map +0 -1
  92. package/dist/epoch.js.map +0 -1
  93. package/dist/rln_contract.d.ts +0 -34
  94. package/dist/rln_contract.js +0 -159
  95. package/dist/rln_contract.js.map +0 -1
  96. package/dist/witness_calculator.js.map +0 -1
  97. package/src/byte_utils.ts +0 -39
  98. package/src/constants.ts +0 -14
  99. package/src/epoch.ts +0 -30
  100. package/src/rln_contract.ts +0 -268
  101. package/src/witness_calculator.d.ts +0 -8
  102. package/src/witness_calculator.js +0 -335
  103. /package/dist/{witness_calculator.d.ts → resources/witness_calculator.d.ts} +0 -0
  104. /package/dist/{witness_calculator.js → resources/witness_calculator.js} +0 -0
  105. /package/dist/{epoch.d.ts → utils/epoch.d.ts} +0 -0
  106. /package/dist/{epoch.js → utils/epoch.js} +0 -0
package/src/byte_utils.ts DELETED
@@ -1,39 +0,0 @@
1
- // Adapted from https://github.com/feross/buffer
2
-
3
- function checkInt(
4
- buf: Uint8Array,
5
- value: number,
6
- offset: number,
7
- ext: number,
8
- max: number,
9
- min: number
10
- ): void {
11
- if (value > max || value < min)
12
- throw new RangeError('"value" argument is out of bounds');
13
- if (offset + ext > buf.length) throw new RangeError("Index out of range");
14
- }
15
-
16
- export function writeUIntLE(
17
- buf: Uint8Array,
18
- value: number,
19
- offset: number,
20
- byteLength: number,
21
- noAssert?: boolean
22
- ): Uint8Array {
23
- value = +value;
24
- offset = offset >>> 0;
25
- byteLength = byteLength >>> 0;
26
- if (!noAssert) {
27
- const maxBytes = Math.pow(2, 8 * byteLength) - 1;
28
- checkInt(buf, value, offset, byteLength, maxBytes, 0);
29
- }
30
-
31
- let mul = 1;
32
- let i = 0;
33
- buf[offset] = value & 0xff;
34
- while (++i < byteLength && (mul *= 0x100)) {
35
- buf[offset + i] = (value / mul) & 0xff;
36
- }
37
-
38
- return buf;
39
- }
package/src/constants.ts DELETED
@@ -1,14 +0,0 @@
1
- export const RLN_ABI = [
2
- "function MEMBERSHIP_DEPOSIT() public view returns(uint256)",
3
- "function register(uint256 pubkey) external payable",
4
- "function withdraw(uint256 secret, uint256 _pubkeyIndex, address payable receiver) external",
5
- "event MemberRegistered(uint256 pubkey, uint256 index)",
6
- "event MemberWithdrawn(uint256 pubkey, uint256 index)",
7
- ];
8
-
9
- export const SEPOLIA_CONTRACT = {
10
- chainId: 11155111,
11
- startBlock: 3193048,
12
- address: "0x9C09146844C1326c2dBC41c451766C7138F88155",
13
- abi: RLN_ABI,
14
- };
package/src/epoch.ts DELETED
@@ -1,30 +0,0 @@
1
- import debug from "debug";
2
-
3
- const DefaultEpochUnitSeconds = 10; // the rln-relay epoch length in seconds
4
-
5
- const log = debug("waku:rln:epoch");
6
-
7
- export function dateToEpoch(
8
- timestamp: Date,
9
- epochUnitSeconds: number = DefaultEpochUnitSeconds
10
- ): number {
11
- const time = timestamp.getTime();
12
- const epoch = Math.floor(time / 1000 / epochUnitSeconds);
13
- log("generated epoch", epoch);
14
- return epoch;
15
- }
16
-
17
- export function epochIntToBytes(epoch: number): Uint8Array {
18
- const bytes = new Uint8Array(32);
19
- const db = new DataView(bytes.buffer);
20
- db.setUint32(0, epoch, true);
21
- log("encoded epoch", epoch, bytes);
22
- return bytes;
23
- }
24
-
25
- export function epochBytesToInt(bytes: Uint8Array): number {
26
- const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
27
- const epoch = dv.getUint32(0, true);
28
- log("decoded epoch", epoch, bytes);
29
- return epoch;
30
- }
@@ -1,268 +0,0 @@
1
- import { ethers } from "ethers";
2
-
3
- import { RLN_ABI } from "./constants.js";
4
- import { IdentityCredential, RLNInstance } from "./rln.js";
5
- import { MerkleRootTracker } from "./root_tracker";
6
-
7
- type Member = {
8
- pubkey: string;
9
- index: number;
10
- };
11
-
12
- type ContractOptions = {
13
- address: string;
14
- provider: ethers.Signer | ethers.providers.Provider;
15
- };
16
-
17
- type FetchMembersOptions = {
18
- fromBlock?: number;
19
- fetchRange?: number;
20
- fetchChunks?: number;
21
- };
22
-
23
- export class RLNContract {
24
- private _contract: ethers.Contract;
25
- private membersFilter: ethers.EventFilter;
26
- private merkleRootTracker: MerkleRootTracker;
27
-
28
- private _members: Member[] = [];
29
-
30
- public static async init(
31
- rlnInstance: RLNInstance,
32
- options: ContractOptions
33
- ): Promise<RLNContract> {
34
- const rlnContract = new RLNContract(rlnInstance, options);
35
-
36
- await rlnContract.fetchMembers(rlnInstance);
37
- rlnContract.subscribeToMembers(rlnInstance);
38
-
39
- return rlnContract;
40
- }
41
-
42
- constructor(
43
- rlnInstance: RLNInstance,
44
- { address, provider }: ContractOptions
45
- ) {
46
- const initialRoot = rlnInstance.getMerkleRoot();
47
-
48
- this._contract = new ethers.Contract(address, RLN_ABI, provider);
49
- this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
50
- this.membersFilter = this.contract.filters.MemberRegistered();
51
- }
52
-
53
- public get contract(): ethers.Contract {
54
- return this._contract;
55
- }
56
-
57
- public get members(): Member[] {
58
- return this._members;
59
- }
60
-
61
- public async fetchMembers(
62
- rlnInstance: RLNInstance,
63
- options: FetchMembersOptions = {}
64
- ): Promise<void> {
65
- const registeredMemberEvents = await queryFilter(this.contract, {
66
- ...options,
67
- membersFilter: this.membersFilter,
68
- });
69
- this.processEvents(rlnInstance, registeredMemberEvents);
70
- }
71
-
72
- public processEvents(rlnInstance: RLNInstance, events: ethers.Event[]): void {
73
- const toRemoveTable = new Map<number, number[]>();
74
- const toInsertTable = new Map<number, ethers.Event[]>();
75
-
76
- events.forEach((evt) => {
77
- if (!evt.args) {
78
- return;
79
- }
80
-
81
- if (evt.removed) {
82
- const index: number = evt.args.index;
83
- const toRemoveVal = toRemoveTable.get(evt.blockNumber);
84
- if (toRemoveVal != undefined) {
85
- toRemoveVal.push(index);
86
- toRemoveTable.set(evt.blockNumber, toRemoveVal);
87
- } else {
88
- toRemoveTable.set(evt.blockNumber, [index]);
89
- }
90
- } else {
91
- let eventsPerBlock = toInsertTable.get(evt.blockNumber);
92
- if (eventsPerBlock == undefined) {
93
- eventsPerBlock = [];
94
- }
95
-
96
- eventsPerBlock.push(evt);
97
- toInsertTable.set(evt.blockNumber, eventsPerBlock);
98
- }
99
-
100
- this.removeMembers(rlnInstance, toRemoveTable);
101
- this.insertMembers(rlnInstance, toInsertTable);
102
- });
103
- }
104
-
105
- private insertMembers(
106
- rlnInstance: RLNInstance,
107
- toInsert: Map<number, ethers.Event[]>
108
- ): void {
109
- toInsert.forEach((events: ethers.Event[], blockNumber: number) => {
110
- events.forEach((evt) => {
111
- if (!evt.args) {
112
- return;
113
- }
114
-
115
- const pubkey = evt.args.pubkey;
116
- const index = evt.args.index;
117
- const idCommitment = ethers.utils.zeroPad(
118
- ethers.utils.arrayify(pubkey),
119
- 32
120
- );
121
- rlnInstance.insertMember(idCommitment);
122
- this.members.push({ index, pubkey });
123
- });
124
-
125
- const currentRoot = rlnInstance.getMerkleRoot();
126
- this.merkleRootTracker.pushRoot(blockNumber, currentRoot);
127
- });
128
- }
129
-
130
- private removeMembers(
131
- rlnInstance: RLNInstance,
132
- toRemove: Map<number, number[]>
133
- ): void {
134
- const removeDescending = new Map([...toRemove].sort().reverse());
135
- removeDescending.forEach((indexes: number[], blockNumber: number) => {
136
- indexes.forEach((index) => {
137
- const idx = this.members.findIndex((m) => m.index === index);
138
- if (idx > -1) {
139
- this.members.splice(idx, 1);
140
- }
141
- rlnInstance.deleteMember(index);
142
- });
143
-
144
- this.merkleRootTracker.backFill(blockNumber);
145
- });
146
- }
147
-
148
- public subscribeToMembers(rlnInstance: RLNInstance): void {
149
- this.contract.on(this.membersFilter, (_pubkey, _index, event) =>
150
- this.processEvents(rlnInstance, event)
151
- );
152
- }
153
-
154
- public async registerWithSignature(
155
- rlnInstance: RLNInstance,
156
- signature: string
157
- ): Promise<ethers.Event | undefined> {
158
- const identityCredential =
159
- await rlnInstance.generateSeededIdentityCredential(signature);
160
-
161
- return this.registerWithKey(identityCredential);
162
- }
163
-
164
- public async registerWithKey(
165
- credential: IdentityCredential
166
- ): Promise<ethers.Event | undefined> {
167
- const depositValue = await this.contract.MEMBERSHIP_DEPOSIT();
168
-
169
- const txRegisterResponse: ethers.ContractTransaction =
170
- await this.contract.register(credential.IDCommitmentBigInt, {
171
- value: depositValue,
172
- });
173
- const txRegisterReceipt = await txRegisterResponse.wait();
174
-
175
- return txRegisterReceipt?.events?.[0];
176
- }
177
-
178
- public roots(): Uint8Array[] {
179
- return this.merkleRootTracker.roots();
180
- }
181
- }
182
-
183
- type CustomQueryOptions = FetchMembersOptions & {
184
- membersFilter: ethers.EventFilter;
185
- };
186
-
187
- // these value should be tested on other networks
188
- const FETCH_CHUNK = 5;
189
- const BLOCK_RANGE = 3000;
190
-
191
- async function queryFilter(
192
- contract: ethers.Contract,
193
- options: CustomQueryOptions
194
- ): Promise<ethers.Event[]> {
195
- const {
196
- fromBlock,
197
- membersFilter,
198
- fetchRange = BLOCK_RANGE,
199
- fetchChunks = FETCH_CHUNK,
200
- } = options;
201
-
202
- if (!fromBlock) {
203
- return contract.queryFilter(membersFilter);
204
- }
205
-
206
- if (!contract.signer.provider) {
207
- throw Error("No provider found on the contract's signer.");
208
- }
209
-
210
- const toBlock = await contract.signer.provider.getBlockNumber();
211
-
212
- if (toBlock - fromBlock < fetchRange) {
213
- return contract.queryFilter(membersFilter);
214
- }
215
-
216
- const events: ethers.Event[][] = [];
217
- const chunks = splitToChunks(fromBlock, toBlock, fetchRange);
218
-
219
- for (const portion of takeN<[number, number]>(chunks, fetchChunks)) {
220
- const promises = portion.map(([left, right]) =>
221
- ignoreErrors(contract.queryFilter(membersFilter, left, right), [])
222
- );
223
- const fetchedEvents = await Promise.all(promises);
224
- events.push(fetchedEvents.flatMap((v) => v));
225
- }
226
-
227
- return events.flatMap((v) => v);
228
- }
229
-
230
- function splitToChunks(
231
- from: number,
232
- to: number,
233
- step: number
234
- ): Array<[number, number]> {
235
- const chunks = [];
236
-
237
- let left = from;
238
- while (left < to) {
239
- const right = left + step < to ? left + step : to;
240
-
241
- chunks.push([left, right] as [number, number]);
242
-
243
- left = right;
244
- }
245
-
246
- return chunks;
247
- }
248
-
249
- function* takeN<T>(array: T[], size: number): Iterable<T[]> {
250
- let start = 0;
251
- let skip = size;
252
-
253
- while (skip < array.length) {
254
- const portion = array.slice(start, skip);
255
-
256
- yield portion;
257
-
258
- start = skip;
259
- skip += size;
260
- }
261
- }
262
-
263
- function ignoreErrors<T>(promise: Promise<T>, defaultValue: T): Promise<T> {
264
- return promise.catch((err) => {
265
- console.error(`Ignoring an error during query: ${err?.message}`);
266
- return defaultValue;
267
- });
268
- }
@@ -1,8 +0,0 @@
1
- export async function builder(
2
- code: Uint8Array,
3
- sanityCheck: bool
4
- ): Promise<WitnessCalculator>;
5
-
6
- export class WitnessCalculator {
7
- calculateWitness(input, sanityCheck): Array<bigint>;
8
- }
@@ -1,335 +0,0 @@
1
- // File generated with https://github.com/iden3/circom
2
- // following the instructions from:
3
- // https://github.com/vacp2p/zerokit/tree/master/rln#compiling-circuits
4
-
5
- export async function builder(code, options) {
6
-
7
- options = options || {};
8
-
9
- let wasmModule;
10
- try {
11
- wasmModule = await WebAssembly.compile(code);
12
- } catch (err) {
13
- console.log(err);
14
- console.log("\nTry to run circom --c in order to generate c++ code instead\n");
15
- throw new Error(err);
16
- }
17
-
18
- let wc;
19
-
20
- let errStr = "";
21
- let msgStr = "";
22
-
23
- const instance = await WebAssembly.instantiate(wasmModule, {
24
- runtime: {
25
- exceptionHandler : function(code) {
26
- let err;
27
- if (code == 1) {
28
- err = "Signal not found.\n";
29
- } else if (code == 2) {
30
- err = "Too many signals set.\n";
31
- } else if (code == 3) {
32
- err = "Signal already set.\n";
33
- } else if (code == 4) {
34
- err = "Assert Failed.\n";
35
- } else if (code == 5) {
36
- err = "Not enough memory.\n";
37
- } else if (code == 6) {
38
- err = "Input signal array access exceeds the size.\n";
39
- } else {
40
- err = "Unknown error.\n";
41
- }
42
- throw new Error(err + errStr);
43
- },
44
- printErrorMessage : function() {
45
- errStr += getMessage() + "\n";
46
- // console.error(getMessage());
47
- },
48
- writeBufferMessage : function() {
49
- const msg = getMessage();
50
- // Any calls to `log()` will always end with a `\n`, so that's when we print and reset
51
- if (msg === "\n") {
52
- console.log(msgStr);
53
- msgStr = "";
54
- } else {
55
- // If we've buffered other content, put a space in between the items
56
- if (msgStr !== "") {
57
- msgStr += " "
58
- }
59
- // Then append the message to the message we are creating
60
- msgStr += msg;
61
- }
62
- },
63
- showSharedRWMemory : function() {
64
- printSharedRWMemory ();
65
- }
66
-
67
- }
68
- });
69
-
70
- const sanityCheck =
71
- options
72
- // options &&
73
- // (
74
- // options.sanityCheck ||
75
- // options.logGetSignal ||
76
- // options.logSetSignal ||
77
- // options.logStartComponent ||
78
- // options.logFinishComponent
79
- // );
80
-
81
-
82
- wc = new WitnessCalculator(instance, sanityCheck);
83
- return wc;
84
-
85
- function getMessage() {
86
- var message = "";
87
- var c = instance.exports.getMessageChar();
88
- while ( c != 0 ) {
89
- message += String.fromCharCode(c);
90
- c = instance.exports.getMessageChar();
91
- }
92
- return message;
93
- }
94
-
95
- function printSharedRWMemory () {
96
- const shared_rw_memory_size = instance.exports.getFieldNumLen32();
97
- const arr = new Uint32Array(shared_rw_memory_size);
98
- for (let j=0; j<shared_rw_memory_size; j++) {
99
- arr[shared_rw_memory_size-1-j] = instance.exports.readSharedRWMemory(j);
100
- }
101
-
102
- // If we've buffered other content, put a space in between the items
103
- if (msgStr !== "") {
104
- msgStr += " "
105
- }
106
- // Then append the value to the message we are creating
107
- msgStr += (fromArray32(arr).toString());
108
- }
109
-
110
- };
111
-
112
- class WitnessCalculator {
113
- constructor(instance, sanityCheck) {
114
- this.instance = instance;
115
-
116
- this.version = this.instance.exports.getVersion();
117
- this.n32 = this.instance.exports.getFieldNumLen32();
118
-
119
- this.instance.exports.getRawPrime();
120
- const arr = new Uint32Array(this.n32);
121
- for (let i=0; i<this.n32; i++) {
122
- arr[this.n32-1-i] = this.instance.exports.readSharedRWMemory(i);
123
- }
124
- this.prime = fromArray32(arr);
125
-
126
- this.witnessSize = this.instance.exports.getWitnessSize();
127
-
128
- this.sanityCheck = sanityCheck;
129
- }
130
-
131
- circom_version() {
132
- return this.instance.exports.getVersion();
133
- }
134
-
135
- async _doCalculateWitness(input, sanityCheck) {
136
- //input is assumed to be a map from signals to arrays of bigints
137
- this.instance.exports.init((this.sanityCheck || sanityCheck) ? 1 : 0);
138
- const keys = Object.keys(input);
139
- var input_counter = 0;
140
- keys.forEach( (k) => {
141
- const h = fnvHash(k);
142
- const hMSB = parseInt(h.slice(0,8), 16);
143
- const hLSB = parseInt(h.slice(8,16), 16);
144
- const fArr = flatArray(input[k]);
145
- let signalSize = this.instance.exports.getInputSignalSize(hMSB, hLSB);
146
- if (signalSize < 0){
147
- throw new Error(`Signal ${k} not found\n`);
148
- }
149
- if (fArr.length < signalSize) {
150
- throw new Error(`Not enough values for input signal ${k}\n`);
151
- }
152
- if (fArr.length > signalSize) {
153
- throw new Error(`Too many values for input signal ${k}\n`);
154
- }
155
- for (let i=0; i<fArr.length; i++) {
156
- const arrFr = toArray32(BigInt(fArr[i])%this.prime,this.n32)
157
- for (let j=0; j<this.n32; j++) {
158
- this.instance.exports.writeSharedRWMemory(j,arrFr[this.n32-1-j]);
159
- }
160
- try {
161
- this.instance.exports.setInputSignal(hMSB, hLSB,i);
162
- input_counter++;
163
- } catch (err) {
164
- // console.log(`After adding signal ${i} of ${k}`)
165
- throw new Error(err);
166
- }
167
- }
168
-
169
- });
170
- if (input_counter < this.instance.exports.getInputSize()) {
171
- throw new Error(`Not all inputs have been set. Only ${input_counter} out of ${this.instance.exports.getInputSize()}`);
172
- }
173
- }
174
-
175
- async calculateWitness(input, sanityCheck) {
176
-
177
- const w = [];
178
-
179
- await this._doCalculateWitness(input, sanityCheck);
180
-
181
- for (let i=0; i<this.witnessSize; i++) {
182
- this.instance.exports.getWitness(i);
183
- const arr = new Uint32Array(this.n32);
184
- for (let j=0; j<this.n32; j++) {
185
- arr[this.n32-1-j] = this.instance.exports.readSharedRWMemory(j);
186
- }
187
- w.push(fromArray32(arr));
188
- }
189
-
190
- return w;
191
- }
192
-
193
-
194
- async calculateBinWitness(input, sanityCheck) {
195
-
196
- const buff32 = new Uint32Array(this.witnessSize*this.n32);
197
- const buff = new Uint8Array( buff32.buffer);
198
- await this._doCalculateWitness(input, sanityCheck);
199
-
200
- for (let i=0; i<this.witnessSize; i++) {
201
- this.instance.exports.getWitness(i);
202
- const pos = i*this.n32;
203
- for (let j=0; j<this.n32; j++) {
204
- buff32[pos+j] = this.instance.exports.readSharedRWMemory(j);
205
- }
206
- }
207
-
208
- return buff;
209
- }
210
-
211
-
212
- async calculateWTNSBin(input, sanityCheck) {
213
-
214
- const buff32 = new Uint32Array(this.witnessSize*this.n32+this.n32+11);
215
- const buff = new Uint8Array( buff32.buffer);
216
- await this._doCalculateWitness(input, sanityCheck);
217
-
218
- //"wtns"
219
- buff[0] = "w".charCodeAt(0)
220
- buff[1] = "t".charCodeAt(0)
221
- buff[2] = "n".charCodeAt(0)
222
- buff[3] = "s".charCodeAt(0)
223
-
224
- //version 2
225
- buff32[1] = 2;
226
-
227
- //number of sections: 2
228
- buff32[2] = 2;
229
-
230
- //id section 1
231
- buff32[3] = 1;
232
-
233
- const n8 = this.n32*4;
234
- //id section 1 length in 64bytes
235
- const idSection1length = 8 + n8;
236
- const idSection1lengthHex = idSection1length.toString(16);
237
- buff32[4] = parseInt(idSection1lengthHex.slice(0,8), 16);
238
- buff32[5] = parseInt(idSection1lengthHex.slice(8,16), 16);
239
-
240
- //this.n32
241
- buff32[6] = n8;
242
-
243
- //prime number
244
- this.instance.exports.getRawPrime();
245
-
246
- var pos = 7;
247
- for (let j=0; j<this.n32; j++) {
248
- buff32[pos+j] = this.instance.exports.readSharedRWMemory(j);
249
- }
250
- pos += this.n32;
251
-
252
- // witness size
253
- buff32[pos] = this.witnessSize;
254
- pos++;
255
-
256
- //id section 2
257
- buff32[pos] = 2;
258
- pos++;
259
-
260
- // section 2 length
261
- const idSection2length = n8*this.witnessSize;
262
- const idSection2lengthHex = idSection2length.toString(16);
263
- buff32[pos] = parseInt(idSection2lengthHex.slice(0,8), 16);
264
- buff32[pos+1] = parseInt(idSection2lengthHex.slice(8,16), 16);
265
-
266
- pos += 2;
267
- for (let i=0; i<this.witnessSize; i++) {
268
- this.instance.exports.getWitness(i);
269
- for (let j=0; j<this.n32; j++) {
270
- buff32[pos+j] = this.instance.exports.readSharedRWMemory(j);
271
- }
272
- pos += this.n32;
273
- }
274
-
275
- return buff;
276
- }
277
-
278
- }
279
-
280
-
281
- function toArray32(rem,size) {
282
- const res = []; //new Uint32Array(size); //has no unshift
283
- const radix = BigInt(0x100000000);
284
- while (rem) {
285
- res.unshift( Number(rem % radix));
286
- rem = rem / radix;
287
- }
288
- if (size) {
289
- var i = size - res.length;
290
- while (i>0) {
291
- res.unshift(0);
292
- i--;
293
- }
294
- }
295
- return res;
296
- }
297
-
298
- function fromArray32(arr) { //returns a BigInt
299
- var res = BigInt(0);
300
- const radix = BigInt(0x100000000);
301
- for (let i = 0; i<arr.length; i++) {
302
- res = res*radix + BigInt(arr[i]);
303
- }
304
- return res;
305
- }
306
-
307
- function flatArray(a) {
308
- var res = [];
309
- fillArray(res, a);
310
- return res;
311
-
312
- function fillArray(res, a) {
313
- if (Array.isArray(a)) {
314
- for (let i=0; i<a.length; i++) {
315
- fillArray(res, a[i]);
316
- }
317
- } else {
318
- res.push(a);
319
- }
320
- }
321
- }
322
-
323
- function fnvHash(str) {
324
- const uint64_max = BigInt(2) ** BigInt(64);
325
- let hash = BigInt("0xCBF29CE484222325");
326
- for (var i = 0; i < str.length; i++) {
327
- hash ^= BigInt(str[i].charCodeAt());
328
- hash *= BigInt(0x100000001B3);
329
- hash %= uint64_max;
330
- }
331
- let shash = hash.toString(16);
332
- let n = 16 - shash.length;
333
- shash = '0'.repeat(n).concat(shash);
334
- return shash;
335
- }
File without changes
File without changes