@semaphore-protocol/proof 3.14.0 → 3.15.1

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.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @module @semaphore-protocol/proof
3
- * @version 3.14.0
3
+ * @version 3.15.1
4
4
  * @file A library to generate and verify Semaphore proofs.
5
5
  * @copyright Ethereum Foundation 2022
6
6
  * @license MIT
@@ -9,44 +9,12 @@
9
9
  import { BigNumber } from '@ethersproject/bignumber';
10
10
  import { zeroPad } from '@ethersproject/bytes';
11
11
  import { keccak256 } from '@ethersproject/keccak256';
12
- import * as ffjavascript$1 from 'ffjavascript';
13
- import { buildBn128, Scalar, utils, BigBuffer } from 'ffjavascript';
14
- import * as fs$1 from 'fs';
15
- import * as constants$1 from 'constants';
16
- import { WitnessCalculatorBuilder } from 'circom_runtime';
12
+ import { prove, verify } from '@zk-kit/groth16';
17
13
 
18
14
  function getDefaultExportFromCjs (x) {
19
15
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
20
16
  }
21
17
 
22
- function getAugmentedNamespace(n) {
23
- if (n.__esModule) return n;
24
- var f = n.default;
25
- if (typeof f == "function") {
26
- var a = function a () {
27
- if (this instanceof a) {
28
- var args = [null];
29
- args.push.apply(args, arguments);
30
- var Ctor = Function.bind.apply(f, args);
31
- return new Ctor();
32
- }
33
- return f.apply(this, arguments);
34
- };
35
- a.prototype = f.prototype;
36
- } else a = {};
37
- Object.defineProperty(a, '__esModule', {value: true});
38
- Object.keys(n).forEach(function (k) {
39
- var d = Object.getOwnPropertyDescriptor(n, k);
40
- Object.defineProperty(a, k, d.get ? d : {
41
- enumerable: true,
42
- get: function () {
43
- return n[k];
44
- }
45
- });
46
- });
47
- return a;
48
- }
49
-
50
18
  var poseidonLite = {};
51
19
 
52
20
  var poseidon1$1 = {};
@@ -105,14 +73,14 @@ var unstringify = {};
105
73
  Object.defineProperty(unstringify, "__esModule", {
106
74
  value: true
107
75
  });
108
- unstringify.default = unstringifyBigInts$3;
109
- function unstringifyBigInts$3(o) {
76
+ unstringify.default = unstringifyBigInts;
77
+ function unstringifyBigInts(o) {
110
78
  if (Array.isArray(o)) {
111
- return o.map(unstringifyBigInts$3);
79
+ return o.map(unstringifyBigInts);
112
80
  } else if (typeof o == 'object') {
113
81
  const res = {};
114
82
  for (const [key, val] of Object.entries(o)) {
115
- res[key] = unstringifyBigInts$3(val);
83
+ res[key] = unstringifyBigInts(val);
116
84
  }
117
85
  return res;
118
86
  }
@@ -775,1733 +743,6 @@ function packProof(proof) {
775
743
  ];
776
744
  }
777
745
 
778
- var main$1 = {};
779
-
780
- var require$$0$1 = /*@__PURE__*/getAugmentedNamespace(ffjavascript$1);
781
-
782
- var main = {};
783
-
784
- var require$$0 = /*@__PURE__*/getAugmentedNamespace(fs$1);
785
-
786
- var require$$1 = /*@__PURE__*/getAugmentedNamespace(constants$1);
787
-
788
- Object.defineProperty(main, '__esModule', { value: true });
789
-
790
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
791
-
792
- var fs = _interopDefault(require$$0);
793
- var constants = require$$1;
794
-
795
- async function open(fileName, openFlags, cacheSize, pageSize) {
796
- cacheSize = cacheSize || 4096*64;
797
- if (typeof openFlags !== "number" && ["w+", "wx+", "r", "ax+", "a+"].indexOf(openFlags) <0)
798
- throw new Error("Invalid open option");
799
- const fd =await fs.promises.open(fileName, openFlags);
800
-
801
- const stats = await fd.stat();
802
-
803
- return new FastFile(fd, stats, cacheSize, pageSize, fileName);
804
- }
805
-
806
-
807
- class FastFile {
808
-
809
- constructor(fd, stats, cacheSize, pageSize, fileName) {
810
- this.fileName = fileName;
811
- this.fd = fd;
812
- this.pos = 0;
813
- this.pageSize = pageSize || (1 << 8);
814
- while (this.pageSize < stats.blksize) {
815
- this.pageSize *= 2;
816
- }
817
- this.totalSize = stats.size;
818
- this.totalPages = Math.floor((stats.size -1) / this.pageSize)+1;
819
- this.maxPagesLoaded = Math.floor( cacheSize / this.pageSize)+1;
820
- this.pages = {};
821
- this.pendingLoads = [];
822
- this.writing = false;
823
- this.reading = false;
824
- this.avBuffs = [];
825
- this.history = {};
826
- }
827
-
828
- _loadPage(p) {
829
- const self = this;
830
- const P = new Promise((resolve, reject)=> {
831
- self.pendingLoads.push({
832
- page: p,
833
- resolve: resolve,
834
- reject: reject
835
- });
836
- });
837
- self.__statusPage("After Load request: ", p);
838
- return P;
839
- }
840
-
841
- __statusPage(s, p) {
842
- const logEntry = [];
843
- const self=this;
844
- if (!self.logHistory) return;
845
- logEntry.push("==" + s+ " " +p);
846
- let S = "";
847
- for (let i=0; i<self.pendingLoads.length; i++) {
848
- if (self.pendingLoads[i].page == p) S = S + " " + i;
849
- }
850
- if (S) logEntry.push("Pending loads:"+S);
851
- if (typeof self.pages[p] != "undefined") {
852
- const page = self.pages[p];
853
- logEntry.push("Loaded");
854
- logEntry.push("pendingOps: "+page.pendingOps);
855
- if (page.loading) logEntry.push("loading: "+page.loading);
856
- if (page.writing) logEntry.push("writing");
857
- if (page.dirty) logEntry.push("dirty");
858
- }
859
- logEntry.push("==");
860
-
861
- if (!self.history[p]) self.history[p] = [];
862
- self.history[p].push(logEntry);
863
- }
864
-
865
- __printHistory(p) {
866
- const self = this;
867
- if (!self.history[p]) console.log("Empty History ", p);
868
- console.log("History "+p);
869
- for (let i=0; i<self.history[p].length; i++) {
870
- for (let j=0; j<self.history[p][i].length; j++) {
871
- console.log("-> " + self.history[p][i][j]);
872
- }
873
- }
874
- }
875
-
876
-
877
-
878
- _triggerLoad() {
879
- const self = this;
880
-
881
- if (self.reading) return;
882
- if (self.pendingLoads.length==0) return;
883
-
884
- const pageIdxs = Object.keys(self.pages);
885
-
886
- const deletablePages = [];
887
- for (let i=0; i<pageIdxs.length; i++) {
888
- const page = self.pages[parseInt(pageIdxs[i])];
889
- if ((page.dirty == false)&&(page.pendingOps==0)&&(!page.writing)&&(!page.loading)) deletablePages.push(parseInt(pageIdxs[i]));
890
- }
891
-
892
- let freePages = self.maxPagesLoaded - pageIdxs.length;
893
-
894
- const ops = [];
895
-
896
- // while pending loads and
897
- // the page is loaded or I can recover one.
898
- while (
899
- (self.pendingLoads.length>0) &&
900
- ( (typeof self.pages[self.pendingLoads[0].page] != "undefined" )
901
- ||( (freePages>0)
902
- ||(deletablePages.length>0)))) {
903
- const load = self.pendingLoads.shift();
904
- if (typeof self.pages[load.page] != "undefined") {
905
- self.pages[load.page].pendingOps ++;
906
- const idx = deletablePages.indexOf(load.page);
907
- if (idx>=0) deletablePages.splice(idx, 1);
908
- if (self.pages[load.page].loading) {
909
- self.pages[load.page].loading.push(load);
910
- } else {
911
- load.resolve();
912
- }
913
- self.__statusPage("After Load (cached): ", load.page);
914
-
915
- } else {
916
- if (freePages) {
917
- freePages--;
918
- } else {
919
- const fp = deletablePages.shift();
920
- self.__statusPage("Before Unload: ", fp);
921
- self.avBuffs.unshift(self.pages[fp]);
922
- delete self.pages[fp];
923
- self.__statusPage("After Unload: ", fp);
924
- }
925
-
926
- if (load.page>=self.totalPages) {
927
- self.pages[load.page] = getNewPage();
928
- load.resolve();
929
- self.__statusPage("After Load (new): ", load.page);
930
- } else {
931
- self.reading = true;
932
- self.pages[load.page] = getNewPage();
933
- self.pages[load.page].loading = [load];
934
- ops.push(self.fd.read(self.pages[load.page].buff, 0, self.pageSize, load.page*self.pageSize).then((res)=> {
935
- self.pages[load.page].size = res.bytesRead;
936
- const loading = self.pages[load.page].loading;
937
- delete self.pages[load.page].loading;
938
- for (let i=0; i<loading.length; i++) {
939
- loading[i].resolve();
940
- }
941
- self.__statusPage("After Load (loaded): ", load.page);
942
- return res;
943
- }, (err) => {
944
- load.reject(err);
945
- }));
946
- self.__statusPage("After Load (loading): ", load.page);
947
- }
948
- }
949
- }
950
- // if (ops.length>1) console.log(ops.length);
951
-
952
- Promise.all(ops).then( () => {
953
- self.reading = false;
954
- if (self.pendingLoads.length>0) setImmediate(self._triggerLoad.bind(self));
955
- self._tryClose();
956
- });
957
-
958
- function getNewPage() {
959
- if (self.avBuffs.length>0) {
960
- const p = self.avBuffs.shift();
961
- p.dirty = false;
962
- p.pendingOps = 1;
963
- p.size =0;
964
- return p;
965
- } else {
966
- return {
967
- dirty: false,
968
- buff: new Uint8Array(self.pageSize),
969
- pendingOps: 1,
970
- size: 0
971
- };
972
- }
973
- }
974
-
975
- }
976
-
977
-
978
- _triggerWrite() {
979
- const self = this;
980
- if (self.writing) return;
981
-
982
- const pageIdxs = Object.keys(self.pages);
983
-
984
- const ops = [];
985
-
986
- for (let i=0; i<pageIdxs.length; i++) {
987
- const page = self.pages[parseInt(pageIdxs[i])];
988
- if (page.dirty) {
989
- page.dirty = false;
990
- page.writing = true;
991
- self.writing = true;
992
- ops.push( self.fd.write(page.buff, 0, page.size, parseInt(pageIdxs[i])*self.pageSize).then(() => {
993
- page.writing = false;
994
- return;
995
- }, (err) => {
996
- console.log("ERROR Writing: "+err);
997
- self.error = err;
998
- self._tryClose();
999
- }));
1000
- }
1001
- }
1002
-
1003
- if (self.writing) {
1004
- Promise.all(ops).then( () => {
1005
- self.writing = false;
1006
- setImmediate(self._triggerWrite.bind(self));
1007
- self._tryClose();
1008
- if (self.pendingLoads.length>0) setImmediate(self._triggerLoad.bind(self));
1009
- });
1010
- }
1011
- }
1012
-
1013
- _getDirtyPage() {
1014
- for (let p in this.pages) {
1015
- if (this.pages[p].dirty) return p;
1016
- }
1017
- return -1;
1018
- }
1019
-
1020
- async write(buff, pos) {
1021
- if (buff.byteLength == 0) return;
1022
- const self = this;
1023
- /*
1024
- if (buff.byteLength > self.pageSize*self.maxPagesLoaded*0.8) {
1025
- const cacheSize = Math.floor(buff.byteLength * 1.1);
1026
- this.maxPagesLoaded = Math.floor( cacheSize / self.pageSize)+1;
1027
- }
1028
- */
1029
- if (typeof pos == "undefined") pos = self.pos;
1030
- self.pos = pos+buff.byteLength;
1031
- if (self.totalSize < pos + buff.byteLength) self.totalSize = pos + buff.byteLength;
1032
- if (self.pendingClose)
1033
- throw new Error("Writing a closing file");
1034
- const firstPage = Math.floor(pos / self.pageSize);
1035
- const lastPage = Math.floor((pos + buff.byteLength -1) / self.pageSize);
1036
-
1037
- const pagePromises = [];
1038
- for (let i=firstPage; i<=lastPage; i++) pagePromises.push(self._loadPage(i));
1039
- self._triggerLoad();
1040
-
1041
- let p = firstPage;
1042
- let o = pos % self.pageSize;
1043
- let r = buff.byteLength;
1044
- while (r>0) {
1045
- await pagePromises[p-firstPage];
1046
- const l = (o+r > self.pageSize) ? (self.pageSize -o) : r;
1047
- const srcView = buff.slice( buff.byteLength - r, buff.byteLength - r + l);
1048
- const dstView = new Uint8Array(self.pages[p].buff.buffer, o, l);
1049
- dstView.set(srcView);
1050
- self.pages[p].dirty = true;
1051
- self.pages[p].pendingOps --;
1052
- self.pages[p].size = Math.max(o+l, self.pages[p].size);
1053
- if (p>=self.totalPages) {
1054
- self.totalPages = p+1;
1055
- }
1056
- r = r-l;
1057
- p ++;
1058
- o = 0;
1059
- if (!self.writing) setImmediate(self._triggerWrite.bind(self));
1060
- }
1061
- }
1062
-
1063
- async read(len, pos) {
1064
- const self = this;
1065
- let buff = new Uint8Array(len);
1066
- await self.readToBuffer(buff, 0, len, pos);
1067
-
1068
- return buff;
1069
- }
1070
-
1071
- async readToBuffer(buffDst, offset, len, pos) {
1072
- if (len == 0) {
1073
- return;
1074
- }
1075
- const self = this;
1076
- if (len > self.pageSize*self.maxPagesLoaded*0.8) {
1077
- const cacheSize = Math.floor(len * 1.1);
1078
- this.maxPagesLoaded = Math.floor( cacheSize / self.pageSize)+1;
1079
- }
1080
- if (typeof pos == "undefined") pos = self.pos;
1081
- self.pos = pos+len;
1082
- if (self.pendingClose)
1083
- throw new Error("Reading a closing file");
1084
- const firstPage = Math.floor(pos / self.pageSize);
1085
- const lastPage = Math.floor((pos + len -1) / self.pageSize);
1086
-
1087
- const pagePromises = [];
1088
- for (let i=firstPage; i<=lastPage; i++) pagePromises.push(self._loadPage(i));
1089
-
1090
- self._triggerLoad();
1091
-
1092
- let p = firstPage;
1093
- let o = pos % self.pageSize;
1094
- // Remaining bytes to read
1095
- let r = pos + len > self.totalSize ? len - (pos + len - self.totalSize): len;
1096
- while (r>0) {
1097
- await pagePromises[p - firstPage];
1098
- self.__statusPage("After Await (read): ", p);
1099
-
1100
- // bytes to copy from this page
1101
- const l = (o+r > self.pageSize) ? (self.pageSize -o) : r;
1102
- const srcView = new Uint8Array(self.pages[p].buff.buffer, self.pages[p].buff.byteOffset + o, l);
1103
- buffDst.set(srcView, offset+len-r);
1104
- self.pages[p].pendingOps --;
1105
-
1106
- self.__statusPage("After Op done: ", p);
1107
-
1108
- r = r-l;
1109
- p ++;
1110
- o = 0;
1111
- if (self.pendingLoads.length>0) setImmediate(self._triggerLoad.bind(self));
1112
- }
1113
-
1114
- this.pos = pos + len;
1115
-
1116
- }
1117
-
1118
-
1119
- _tryClose() {
1120
- const self = this;
1121
- if (!self.pendingClose) return;
1122
- if (self.error) {
1123
- self.pendingCloseReject(self.error);
1124
- }
1125
- const p = self._getDirtyPage();
1126
- if ((p>=0) || (self.writing) || (self.reading) || (self.pendingLoads.length>0)) return;
1127
- self.pendingClose();
1128
- }
1129
-
1130
- close() {
1131
- const self = this;
1132
- if (self.pendingClose)
1133
- throw new Error("Closing the file twice");
1134
- return new Promise((resolve, reject) => {
1135
- self.pendingClose = resolve;
1136
- self.pendingCloseReject = reject;
1137
- self._tryClose();
1138
- }).then(()=> {
1139
- self.fd.close();
1140
- }, (err) => {
1141
- self.fd.close();
1142
- throw (err);
1143
- });
1144
- }
1145
-
1146
- async discard() {
1147
- const self = this;
1148
- await self.close();
1149
- await fs.promises.unlink(this.fileName);
1150
- }
1151
-
1152
- async writeULE32(v, pos) {
1153
- const self = this;
1154
- const tmpBuff32 = new Uint8Array(4);
1155
- const tmpBuff32v = new DataView(tmpBuff32.buffer);
1156
-
1157
- tmpBuff32v.setUint32(0, v, true);
1158
-
1159
- await self.write(tmpBuff32, pos);
1160
- }
1161
-
1162
- async writeUBE32(v, pos) {
1163
- const self = this;
1164
-
1165
- const tmpBuff32 = new Uint8Array(4);
1166
- const tmpBuff32v = new DataView(tmpBuff32.buffer);
1167
-
1168
- tmpBuff32v.setUint32(0, v, false);
1169
-
1170
- await self.write(tmpBuff32, pos);
1171
- }
1172
-
1173
-
1174
- async writeULE64(v, pos) {
1175
- const self = this;
1176
-
1177
- const tmpBuff64 = new Uint8Array(8);
1178
- const tmpBuff64v = new DataView(tmpBuff64.buffer);
1179
-
1180
- tmpBuff64v.setUint32(0, v & 0xFFFFFFFF, true);
1181
- tmpBuff64v.setUint32(4, Math.floor(v / 0x100000000) , true);
1182
-
1183
- await self.write(tmpBuff64, pos);
1184
- }
1185
-
1186
- async readULE32(pos) {
1187
- const self = this;
1188
- const b = await self.read(4, pos);
1189
-
1190
- const view = new Uint32Array(b.buffer);
1191
-
1192
- return view[0];
1193
- }
1194
-
1195
- async readUBE32(pos) {
1196
- const self = this;
1197
- const b = await self.read(4, pos);
1198
-
1199
- const view = new DataView(b.buffer);
1200
-
1201
- return view.getUint32(0, false);
1202
- }
1203
-
1204
- async readULE64(pos) {
1205
- const self = this;
1206
- const b = await self.read(8, pos);
1207
-
1208
- const view = new Uint32Array(b.buffer);
1209
-
1210
- return view[1] * 0x100000000 + view[0];
1211
- }
1212
-
1213
- async readString(pos) {
1214
- const self = this;
1215
-
1216
- if (self.pendingClose) {
1217
- throw new Error("Reading a closing file");
1218
- }
1219
-
1220
- let currentPosition = typeof pos == "undefined" ? self.pos : pos;
1221
- let currentPage = Math.floor(currentPosition / self.pageSize);
1222
-
1223
- let endOfStringFound = false;
1224
- let str = "";
1225
-
1226
- while (!endOfStringFound) {
1227
- //Read page
1228
- let pagePromise = self._loadPage(currentPage);
1229
- self._triggerLoad();
1230
- await pagePromise;
1231
- self.__statusPage("After Await (read): ", currentPage);
1232
-
1233
- let offsetOnPage = currentPosition % self.pageSize;
1234
-
1235
- const dataArray = new Uint8Array(
1236
- self.pages[currentPage].buff.buffer,
1237
- self.pages[currentPage].buff.byteOffset + offsetOnPage,
1238
- self.pageSize - offsetOnPage
1239
- );
1240
-
1241
- let indexEndOfString = dataArray.findIndex(element => element === 0);
1242
- endOfStringFound = indexEndOfString !== -1;
1243
-
1244
- if (endOfStringFound) {
1245
- str += new TextDecoder().decode(dataArray.slice(0, indexEndOfString));
1246
- self.pos = currentPage * this.pageSize + offsetOnPage + indexEndOfString + 1;
1247
- } else {
1248
- str += new TextDecoder().decode(dataArray);
1249
- self.pos = currentPage * this.pageSize + offsetOnPage + dataArray.length;
1250
- }
1251
-
1252
- self.pages[currentPage].pendingOps--;
1253
- self.__statusPage("After Op done: ", currentPage);
1254
-
1255
- currentPosition = self.pos;
1256
- currentPage++;
1257
-
1258
- if (self.pendingLoads.length > 0) setImmediate(self._triggerLoad.bind(self));
1259
- }
1260
-
1261
- return str;
1262
- }
1263
- }
1264
-
1265
- function createNew(o) {
1266
- const initialSize = o.initialSize || 1<<20;
1267
- const fd = new MemFile();
1268
- fd.o = o;
1269
- fd.o.data = new Uint8Array(initialSize);
1270
- fd.allocSize = initialSize;
1271
- fd.totalSize = 0;
1272
- fd.readOnly = false;
1273
- fd.pos = 0;
1274
- return fd;
1275
- }
1276
-
1277
- function readExisting(o) {
1278
- const fd = new MemFile();
1279
- fd.o = o;
1280
- fd.allocSize = o.data.byteLength;
1281
- fd.totalSize = o.data.byteLength;
1282
- fd.readOnly = true;
1283
- fd.pos = 0;
1284
- return fd;
1285
- }
1286
-
1287
- function readWriteExisting(o) {
1288
- const fd = new MemFile();
1289
- fd.o = o;
1290
- fd.allocSize = o.data.byteLength;
1291
- fd.totalSize = o.data.byteLength;
1292
- fd.readOnly = false;
1293
- fd.pos = 0;
1294
- return fd;
1295
- }
1296
-
1297
- const tmpBuff32 = new Uint8Array(4);
1298
- const tmpBuff32v = new DataView(tmpBuff32.buffer);
1299
- const tmpBuff64 = new Uint8Array(8);
1300
- const tmpBuff64v = new DataView(tmpBuff64.buffer);
1301
-
1302
- class MemFile {
1303
-
1304
- constructor() {
1305
- this.pageSize = 1 << 14; // for compatibility
1306
- }
1307
-
1308
- _resizeIfNeeded(newLen) {
1309
- if (newLen > this.allocSize) {
1310
- const newAllocSize = Math.max(
1311
- this.allocSize + (1 << 20),
1312
- Math.floor(this.allocSize * 1.1),
1313
- newLen
1314
- );
1315
- const newData = new Uint8Array(newAllocSize);
1316
- newData.set(this.o.data);
1317
- this.o.data = newData;
1318
- this.allocSize = newAllocSize;
1319
- }
1320
- }
1321
-
1322
- async write(buff, pos) {
1323
- const self =this;
1324
- if (typeof pos == "undefined") pos = self.pos;
1325
- if (this.readOnly) throw new Error("Writing a read only file");
1326
-
1327
- this._resizeIfNeeded(pos + buff.byteLength);
1328
-
1329
- this.o.data.set(buff.slice(), pos);
1330
-
1331
- if (pos + buff.byteLength > this.totalSize) this.totalSize = pos + buff.byteLength;
1332
-
1333
- this.pos = pos + buff.byteLength;
1334
- }
1335
-
1336
- async readToBuffer(buffDest, offset, len, pos) {
1337
- const self = this;
1338
- if (typeof pos == "undefined") pos = self.pos;
1339
- if (this.readOnly) {
1340
- if (pos + len > this.totalSize) throw new Error("Reading out of bounds");
1341
- }
1342
- this._resizeIfNeeded(pos + len);
1343
-
1344
- const buffSrc = new Uint8Array(this.o.data.buffer, this.o.data.byteOffset + pos, len);
1345
-
1346
- buffDest.set(buffSrc, offset);
1347
-
1348
- this.pos = pos + len;
1349
- }
1350
-
1351
- async read(len, pos) {
1352
- const self = this;
1353
-
1354
- const buff = new Uint8Array(len);
1355
- await self.readToBuffer(buff, 0, len, pos);
1356
-
1357
- return buff;
1358
- }
1359
-
1360
- close() {
1361
- if (this.o.data.byteLength != this.totalSize) {
1362
- this.o.data = this.o.data.slice(0, this.totalSize);
1363
- }
1364
- }
1365
-
1366
- async discard() {
1367
- }
1368
-
1369
-
1370
- async writeULE32(v, pos) {
1371
- const self = this;
1372
-
1373
- tmpBuff32v.setUint32(0, v, true);
1374
-
1375
- await self.write(tmpBuff32, pos);
1376
- }
1377
-
1378
- async writeUBE32(v, pos) {
1379
- const self = this;
1380
-
1381
- tmpBuff32v.setUint32(0, v, false);
1382
-
1383
- await self.write(tmpBuff32, pos);
1384
- }
1385
-
1386
-
1387
- async writeULE64(v, pos) {
1388
- const self = this;
1389
-
1390
- tmpBuff64v.setUint32(0, v & 0xFFFFFFFF, true);
1391
- tmpBuff64v.setUint32(4, Math.floor(v / 0x100000000) , true);
1392
-
1393
- await self.write(tmpBuff64, pos);
1394
- }
1395
-
1396
-
1397
- async readULE32(pos) {
1398
- const self = this;
1399
- const b = await self.read(4, pos);
1400
-
1401
- const view = new Uint32Array(b.buffer);
1402
-
1403
- return view[0];
1404
- }
1405
-
1406
- async readUBE32(pos) {
1407
- const self = this;
1408
- const b = await self.read(4, pos);
1409
-
1410
- const view = new DataView(b.buffer);
1411
-
1412
- return view.getUint32(0, false);
1413
- }
1414
-
1415
- async readULE64(pos) {
1416
- const self = this;
1417
- const b = await self.read(8, pos);
1418
-
1419
- const view = new Uint32Array(b.buffer);
1420
-
1421
- return view[1] * 0x100000000 + view[0];
1422
- }
1423
-
1424
- async readString(pos) {
1425
- const self = this;
1426
-
1427
- let currentPosition = typeof pos == "undefined" ? self.pos : pos;
1428
-
1429
- if (currentPosition > this.totalSize) {
1430
- if (this.readOnly) {
1431
- throw new Error("Reading out of bounds");
1432
- }
1433
- this._resizeIfNeeded(pos);
1434
- }
1435
- const dataArray = new Uint8Array(
1436
- self.o.data.buffer,
1437
- currentPosition,
1438
- this.totalSize - currentPosition
1439
- );
1440
-
1441
- let indexEndOfString = dataArray.findIndex(element => element === 0);
1442
- let endOfStringFound = indexEndOfString !== -1;
1443
-
1444
- let str = "";
1445
- if (endOfStringFound) {
1446
- str = new TextDecoder().decode(dataArray.slice(0, indexEndOfString));
1447
- self.pos = currentPosition + indexEndOfString + 1;
1448
- } else {
1449
- self.pos = currentPosition;
1450
- }
1451
- return str;
1452
- }
1453
- }
1454
-
1455
- const PAGE_SIZE = 1<<22;
1456
-
1457
- function createNew$1(o) {
1458
- const initialSize = o.initialSize || 0;
1459
- const fd = new BigMemFile();
1460
- fd.o = o;
1461
- const nPages = initialSize ? Math.floor((initialSize - 1) / PAGE_SIZE)+1 : 0;
1462
- fd.o.data = [];
1463
- for (let i=0; i<nPages-1; i++) {
1464
- fd.o.data.push( new Uint8Array(PAGE_SIZE));
1465
- }
1466
- if (nPages) fd.o.data.push( new Uint8Array(initialSize - PAGE_SIZE*(nPages-1)));
1467
- fd.totalSize = 0;
1468
- fd.readOnly = false;
1469
- fd.pos = 0;
1470
- return fd;
1471
- }
1472
-
1473
- function readExisting$1(o) {
1474
- const fd = new BigMemFile();
1475
- fd.o = o;
1476
- fd.totalSize = (o.data.length-1)* PAGE_SIZE + o.data[o.data.length-1].byteLength;
1477
- fd.readOnly = true;
1478
- fd.pos = 0;
1479
- return fd;
1480
- }
1481
-
1482
- function readWriteExisting$1(o) {
1483
- const fd = new BigMemFile();
1484
- fd.o = o;
1485
- fd.totalSize = (o.data.length-1)* PAGE_SIZE + o.data[o.data.length-1].byteLength;
1486
- fd.readOnly = false;
1487
- fd.pos = 0;
1488
- return fd;
1489
- }
1490
-
1491
- const tmpBuff32$1 = new Uint8Array(4);
1492
- const tmpBuff32v$1 = new DataView(tmpBuff32$1.buffer);
1493
- const tmpBuff64$1 = new Uint8Array(8);
1494
- const tmpBuff64v$1 = new DataView(tmpBuff64$1.buffer);
1495
-
1496
- class BigMemFile {
1497
-
1498
- constructor() {
1499
- this.pageSize = 1 << 14; // for compatibility
1500
- }
1501
-
1502
- _resizeIfNeeded(newLen) {
1503
-
1504
- if (newLen <= this.totalSize) return;
1505
-
1506
- if (this.readOnly) throw new Error("Reading out of file bounds");
1507
-
1508
- const nPages = Math.floor((newLen - 1) / PAGE_SIZE)+1;
1509
- for (let i= Math.max(this.o.data.length-1, 0); i<nPages; i++) {
1510
- const newSize = i<nPages-1 ? PAGE_SIZE : newLen - (nPages-1)*PAGE_SIZE;
1511
- const p = new Uint8Array(newSize);
1512
- if (i == this.o.data.length-1) p.set(this.o.data[i]);
1513
- this.o.data[i] = p;
1514
- }
1515
- this.totalSize = newLen;
1516
- }
1517
-
1518
- async write(buff, pos) {
1519
- const self =this;
1520
- if (typeof pos == "undefined") pos = self.pos;
1521
- if (this.readOnly) throw new Error("Writing a read only file");
1522
-
1523
- this._resizeIfNeeded(pos + buff.byteLength);
1524
-
1525
- const firstPage = Math.floor(pos / PAGE_SIZE);
1526
-
1527
- let p = firstPage;
1528
- let o = pos % PAGE_SIZE;
1529
- let r = buff.byteLength;
1530
- while (r>0) {
1531
- const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r;
1532
- const srcView = buff.slice(buff.byteLength - r, buff.byteLength - r + l);
1533
- const dstView = new Uint8Array(self.o.data[p].buffer, o, l);
1534
- dstView.set(srcView);
1535
- r = r-l;
1536
- p ++;
1537
- o = 0;
1538
- }
1539
-
1540
- this.pos = pos + buff.byteLength;
1541
- }
1542
-
1543
- async readToBuffer(buffDst, offset, len, pos) {
1544
- const self = this;
1545
- if (typeof pos == "undefined") pos = self.pos;
1546
- if (this.readOnly) {
1547
- if (pos + len > this.totalSize) throw new Error("Reading out of bounds");
1548
- }
1549
- this._resizeIfNeeded(pos + len);
1550
-
1551
- const firstPage = Math.floor(pos / PAGE_SIZE);
1552
-
1553
- let p = firstPage;
1554
- let o = pos % PAGE_SIZE;
1555
- // Remaining bytes to read
1556
- let r = len;
1557
- while (r>0) {
1558
- // bytes to copy from this page
1559
- const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r;
1560
- const srcView = new Uint8Array(self.o.data[p].buffer, o, l);
1561
- buffDst.set(srcView, offset+len-r);
1562
- r = r-l;
1563
- p ++;
1564
- o = 0;
1565
- }
1566
-
1567
- this.pos = pos + len;
1568
- }
1569
-
1570
- async read(len, pos) {
1571
- const self = this;
1572
- const buff = new Uint8Array(len);
1573
-
1574
- await self.readToBuffer(buff, 0, len, pos);
1575
-
1576
- return buff;
1577
- }
1578
-
1579
- close() {
1580
- }
1581
-
1582
- async discard() {
1583
- }
1584
-
1585
-
1586
- async writeULE32(v, pos) {
1587
- const self = this;
1588
-
1589
- tmpBuff32v$1.setUint32(0, v, true);
1590
-
1591
- await self.write(tmpBuff32$1, pos);
1592
- }
1593
-
1594
- async writeUBE32(v, pos) {
1595
- const self = this;
1596
-
1597
- tmpBuff32v$1.setUint32(0, v, false);
1598
-
1599
- await self.write(tmpBuff32$1, pos);
1600
- }
1601
-
1602
-
1603
- async writeULE64(v, pos) {
1604
- const self = this;
1605
-
1606
- tmpBuff64v$1.setUint32(0, v & 0xFFFFFFFF, true);
1607
- tmpBuff64v$1.setUint32(4, Math.floor(v / 0x100000000) , true);
1608
-
1609
- await self.write(tmpBuff64$1, pos);
1610
- }
1611
-
1612
-
1613
- async readULE32(pos) {
1614
- const self = this;
1615
- const b = await self.read(4, pos);
1616
-
1617
- const view = new Uint32Array(b.buffer);
1618
-
1619
- return view[0];
1620
- }
1621
-
1622
- async readUBE32(pos) {
1623
- const self = this;
1624
- const b = await self.read(4, pos);
1625
-
1626
- const view = new DataView(b.buffer);
1627
-
1628
- return view.getUint32(0, false);
1629
- }
1630
-
1631
- async readULE64(pos) {
1632
- const self = this;
1633
- const b = await self.read(8, pos);
1634
-
1635
- const view = new Uint32Array(b.buffer);
1636
-
1637
- return view[1] * 0x100000000 + view[0];
1638
- }
1639
-
1640
- async readString(pos) {
1641
- const self = this;
1642
- const fixedSize = 2048;
1643
-
1644
- let currentPosition = typeof pos == "undefined" ? self.pos : pos;
1645
-
1646
- if (currentPosition > this.totalSize) {
1647
- if (this.readOnly) {
1648
- throw new Error("Reading out of bounds");
1649
- }
1650
- this._resizeIfNeeded(pos);
1651
- }
1652
-
1653
- let endOfStringFound = false;
1654
- let str = "";
1655
-
1656
- while (!endOfStringFound) {
1657
- let currentPage = Math.floor(currentPosition / PAGE_SIZE);
1658
- let offsetOnPage = currentPosition % PAGE_SIZE;
1659
-
1660
- if (self.o.data[currentPage] === undefined) {
1661
- throw new Error("ERROR");
1662
- }
1663
-
1664
- let readLength = Math.min(fixedSize, self.o.data[currentPage].length - offsetOnPage);
1665
- const dataArray = new Uint8Array(self.o.data[currentPage].buffer, offsetOnPage, readLength);
1666
-
1667
- let indexEndOfString = dataArray.findIndex(element => element === 0);
1668
- endOfStringFound = indexEndOfString !== -1;
1669
-
1670
- if (endOfStringFound) {
1671
- str += new TextDecoder().decode(dataArray.slice(0, indexEndOfString));
1672
- self.pos = currentPage * PAGE_SIZE + offsetOnPage + indexEndOfString + 1;
1673
- } else {
1674
- str += new TextDecoder().decode(dataArray);
1675
- self.pos = currentPage * PAGE_SIZE + offsetOnPage + dataArray.length;
1676
- }
1677
-
1678
- currentPosition = self.pos;
1679
- }
1680
- return str;
1681
- }
1682
- }
1683
-
1684
- /* global fetch */
1685
-
1686
- const DEFAULT_CACHE_SIZE = (1 << 16);
1687
- const DEFAULT_PAGE_SIZE = (1 << 13);
1688
-
1689
-
1690
- async function createOverride(o, b, c) {
1691
- if (typeof o === "string") {
1692
- o = {
1693
- type: "file",
1694
- fileName: o,
1695
- cacheSize: b || DEFAULT_CACHE_SIZE,
1696
- pageSize: c || DEFAULT_PAGE_SIZE
1697
- };
1698
- }
1699
- if (o.type == "file") {
1700
- return await open(o.fileName, constants.O_TRUNC | constants.O_CREAT | constants.O_RDWR, o.cacheSize, o.pageSize);
1701
- } else if (o.type == "mem") {
1702
- return createNew(o);
1703
- } else if (o.type == "bigMem") {
1704
- return createNew$1(o);
1705
- } else {
1706
- throw new Error("Invalid FastFile type: "+o.type);
1707
- }
1708
- }
1709
-
1710
- function createNoOverride(o, b, c) {
1711
- if (typeof o === "string") {
1712
- o = {
1713
- type: "file",
1714
- fileName: o,
1715
- cacheSize: b || DEFAULT_CACHE_SIZE,
1716
- pageSize: c || DEFAULT_PAGE_SIZE
1717
- };
1718
- }
1719
- if (o.type == "file") {
1720
- return open(o.fileName, constants.O_TRUNC | constants.O_CREAT | constants.O_RDWR | constants.O_EXCL, o.cacheSize, o.pageSize);
1721
- } else if (o.type == "mem") {
1722
- return createNew(o);
1723
- } else if (o.type == "bigMem") {
1724
- return createNew$1(o);
1725
- } else {
1726
- throw new Error("Invalid FastFile type: "+o.type);
1727
- }
1728
- }
1729
-
1730
- async function readExisting$2(o, b, c) {
1731
- if (o instanceof Uint8Array) {
1732
- o = {
1733
- type: "mem",
1734
- data: o
1735
- };
1736
- }
1737
- if (process.browser) {
1738
- if (typeof o === "string") {
1739
- const buff = await fetch(o).then( function(res) {
1740
- return res.arrayBuffer();
1741
- }).then(function (ab) {
1742
- return new Uint8Array(ab);
1743
- });
1744
- o = {
1745
- type: "mem",
1746
- data: buff
1747
- };
1748
- }
1749
- } else {
1750
- if (typeof o === "string") {
1751
- o = {
1752
- type: "file",
1753
- fileName: o,
1754
- cacheSize: b || DEFAULT_CACHE_SIZE,
1755
- pageSize: c || DEFAULT_PAGE_SIZE
1756
- };
1757
- }
1758
- }
1759
- if (o.type == "file") {
1760
- return await open(o.fileName, constants.O_RDONLY, o.cacheSize, o.pageSize);
1761
- } else if (o.type == "mem") {
1762
- return await readExisting(o);
1763
- } else if (o.type == "bigMem") {
1764
- return await readExisting$1(o);
1765
- } else {
1766
- throw new Error("Invalid FastFile type: "+o.type);
1767
- }
1768
- }
1769
-
1770
- function readWriteExisting$2(o, b, c) {
1771
- if (typeof o === "string") {
1772
- o = {
1773
- type: "file",
1774
- fileName: o,
1775
- cacheSize: b || DEFAULT_CACHE_SIZE,
1776
- pageSize: c || DEFAULT_PAGE_SIZE
1777
- };
1778
- }
1779
- if (o.type == "file") {
1780
- return open(o.fileName, constants.O_CREAT | constants.O_RDWR, o.cacheSize, o.pageSize);
1781
- } else if (o.type == "mem") {
1782
- return readWriteExisting(o);
1783
- } else if (o.type == "bigMem") {
1784
- return readWriteExisting$1(o);
1785
- } else {
1786
- throw new Error("Invalid FastFile type: "+o.type);
1787
- }
1788
- }
1789
-
1790
- function readWriteExistingOrCreate(o, b, c) {
1791
- if (typeof o === "string") {
1792
- o = {
1793
- type: "file",
1794
- fileName: o,
1795
- cacheSize: b || DEFAULT_CACHE_SIZE,
1796
- pageSize: c || DEFAULT_PAGE_SIZE
1797
- };
1798
- }
1799
- if (o.type == "file") {
1800
- return open(o.fileName, constants.O_CREAT | constants.O_RDWR | constants.O_EXCL, o.cacheSize);
1801
- } else if (o.type == "mem") {
1802
- return readWriteExisting(o);
1803
- } else if (o.type == "bigMem") {
1804
- return readWriteExisting$1(o);
1805
- } else {
1806
- throw new Error("Invalid FastFile type: "+o.type);
1807
- }
1808
- }
1809
-
1810
- main.createNoOverride = createNoOverride;
1811
- var createOverride_1 = main.createOverride = createOverride;
1812
- var readExisting_1 = main.readExisting = readExisting$2;
1813
- main.readWriteExisting = readWriteExisting$2;
1814
- main.readWriteExistingOrCreate = readWriteExistingOrCreate;
1815
-
1816
- Object.defineProperty(main$1, '__esModule', { value: true });
1817
-
1818
- var ffjavascript = require$$0$1;
1819
- var fastFile = main;
1820
-
1821
- function _interopNamespace(e) {
1822
- if (e && e.__esModule) return e;
1823
- var n = Object.create(null);
1824
- if (e) {
1825
- Object.keys(e).forEach(function (k) {
1826
- if (k !== 'default') {
1827
- var d = Object.getOwnPropertyDescriptor(e, k);
1828
- Object.defineProperty(n, k, d.get ? d : {
1829
- enumerable: true,
1830
- get: function () { return e[k]; }
1831
- });
1832
- }
1833
- });
1834
- }
1835
- n["default"] = e;
1836
- return Object.freeze(n);
1837
- }
1838
-
1839
- var fastFile__namespace = /*#__PURE__*/_interopNamespace(fastFile);
1840
-
1841
- async function readBinFile(fileName, type, maxVersion, cacheSize, pageSize) {
1842
-
1843
- const fd = await fastFile__namespace.readExisting(fileName, cacheSize, pageSize);
1844
-
1845
- const b = await fd.read(4);
1846
- let readedType = "";
1847
- for (let i=0; i<4; i++) readedType += String.fromCharCode(b[i]);
1848
-
1849
- if (readedType != type) throw new Error(fileName + ": Invalid File format");
1850
-
1851
- let v = await fd.readULE32();
1852
-
1853
- if (v>maxVersion) throw new Error("Version not supported");
1854
-
1855
- const nSections = await fd.readULE32();
1856
-
1857
- // Scan sections
1858
- let sections = [];
1859
- for (let i=0; i<nSections; i++) {
1860
- let ht = await fd.readULE32();
1861
- let hl = await fd.readULE64();
1862
- if (typeof sections[ht] == "undefined") sections[ht] = [];
1863
- sections[ht].push({
1864
- p: fd.pos,
1865
- size: hl
1866
- });
1867
- fd.pos += hl;
1868
- }
1869
-
1870
- return {fd, sections};
1871
- }
1872
-
1873
- async function createBinFile(fileName, type, version, nSections, cacheSize, pageSize) {
1874
-
1875
- const fd = await fastFile__namespace.createOverride(fileName, cacheSize, pageSize);
1876
-
1877
- const buff = new Uint8Array(4);
1878
- for (let i=0; i<4; i++) buff[i] = type.charCodeAt(i);
1879
- await fd.write(buff, 0); // Magic "r1cs"
1880
-
1881
- await fd.writeULE32(version); // Version
1882
- await fd.writeULE32(nSections); // Number of Sections
1883
-
1884
- return fd;
1885
- }
1886
-
1887
- async function startWriteSection(fd, idSection) {
1888
- if (typeof fd.writingSection !== "undefined") throw new Error("Already writing a section");
1889
- await fd.writeULE32(idSection); // Header type
1890
- fd.writingSection = {
1891
- pSectionSize: fd.pos
1892
- };
1893
- await fd.writeULE64(0); // Temporally set to 0 length
1894
- }
1895
-
1896
- async function endWriteSection(fd) {
1897
- if (typeof fd.writingSection === "undefined") throw new Error("Not writing a section");
1898
-
1899
- const sectionSize = fd.pos - fd.writingSection.pSectionSize - 8;
1900
- const oldPos = fd.pos;
1901
- fd.pos = fd.writingSection.pSectionSize;
1902
- await fd.writeULE64(sectionSize);
1903
- fd.pos = oldPos;
1904
- delete fd.writingSection;
1905
- }
1906
-
1907
- async function startReadUniqueSection(fd, sections, idSection) {
1908
- if (typeof fd.readingSection !== "undefined") throw new Error("Already reading a section");
1909
- if (!sections[idSection]) throw new Error(fd.fileName + ": Missing section "+ idSection );
1910
- if (sections[idSection].length>1) throw new Error(fd.fileName +": Section Duplicated " +idSection);
1911
-
1912
- fd.pos = sections[idSection][0].p;
1913
-
1914
- fd.readingSection = sections[idSection][0];
1915
- }
1916
-
1917
- async function endReadSection(fd, noCheck) {
1918
- if (typeof fd.readingSection === "undefined") throw new Error("Not reading a section");
1919
- if (!noCheck) {
1920
- if (fd.pos-fd.readingSection.p != fd.readingSection.size) throw new Error("Invalid section size reading");
1921
- }
1922
- delete fd.readingSection;
1923
- }
1924
-
1925
- async function writeBigInt(fd, n, n8, pos) {
1926
- const buff = new Uint8Array(n8);
1927
- ffjavascript.Scalar.toRprLE(buff, 0, n, n8);
1928
- await fd.write(buff, pos);
1929
- }
1930
-
1931
- async function readBigInt(fd, n8, pos) {
1932
- const buff = await fd.read(n8, pos);
1933
- return ffjavascript.Scalar.fromRprLE(buff, 0, n8);
1934
- }
1935
-
1936
- async function copySection(fdFrom, sections, fdTo, sectionId, size) {
1937
- if (typeof size === "undefined") {
1938
- size = sections[sectionId][0].size;
1939
- }
1940
- const chunkSize = fdFrom.pageSize;
1941
- await startReadUniqueSection(fdFrom, sections, sectionId);
1942
- await startWriteSection(fdTo, sectionId);
1943
- for (let p=0; p<size; p+=chunkSize) {
1944
- const l = Math.min(size -p, chunkSize);
1945
- const buff = await fdFrom.read(l);
1946
- await fdTo.write(buff);
1947
- }
1948
- await endWriteSection(fdTo);
1949
- await endReadSection(fdFrom, size != sections[sectionId][0].size);
1950
-
1951
- }
1952
-
1953
- async function readSection(fd, sections, idSection, offset, length) {
1954
-
1955
- offset = (typeof offset === "undefined") ? 0 : offset;
1956
- length = (typeof length === "undefined") ? sections[idSection][0].size - offset : length;
1957
-
1958
- if (offset + length > sections[idSection][0].size) {
1959
- throw new Error("Reading out of the range of the section");
1960
- }
1961
-
1962
- let buff;
1963
- if (length < (1 << 30) ) {
1964
- buff = new Uint8Array(length);
1965
- } else {
1966
- buff = new ffjavascript.BigBuffer(length);
1967
- }
1968
-
1969
- await fd.readToBuffer(buff, 0, length, sections[idSection][0].p + offset);
1970
- return buff;
1971
- }
1972
-
1973
- async function sectionIsEqual(fd1, sections1, fd2, sections2, idSection) {
1974
- const MAX_BUFF_SIZE = fd1.pageSize * 16;
1975
- await startReadUniqueSection(fd1, sections1, idSection);
1976
- await startReadUniqueSection(fd2, sections2, idSection);
1977
- if (sections1[idSection][0].size != sections2[idSection][0].size) return false;
1978
- const totalBytes=sections1[idSection][0].size;
1979
- for (let i=0; i<totalBytes; i+= MAX_BUFF_SIZE) {
1980
- const n = Math.min(totalBytes-i, MAX_BUFF_SIZE);
1981
- const buff1 = await fd1.read(n);
1982
- const buff2 = await fd2.read(n);
1983
- for (let j=0; j<n; j++) if (buff1[j] != buff2[j]) return false;
1984
- }
1985
- await endReadSection(fd1);
1986
- await endReadSection(fd2);
1987
- return true;
1988
- }
1989
-
1990
- main$1.copySection = copySection;
1991
- var createBinFile_1 = main$1.createBinFile = createBinFile;
1992
- var endReadSection_1 = main$1.endReadSection = endReadSection;
1993
- var endWriteSection_1 = main$1.endWriteSection = endWriteSection;
1994
- var readBigInt_1 = main$1.readBigInt = readBigInt;
1995
- var readBinFile_1 = main$1.readBinFile = readBinFile;
1996
- var readSection_1 = main$1.readSection = readSection;
1997
- main$1.sectionIsEqual = sectionIsEqual;
1998
- var startReadUniqueSection_1 = main$1.startReadUniqueSection = startReadUniqueSection;
1999
- var startWriteSection_1 = main$1.startWriteSection = startWriteSection;
2000
- var writeBigInt_1 = main$1.writeBigInt = writeBigInt;
2001
-
2002
- /* eslint-disable import/prefer-default-export */
2003
- /* eslint-disable no-return-assign */
2004
- /* istanbul ignore file */
2005
- function log2(V) {
2006
- return (((V & 0xffff0000) !== 0 ? ((V &= 0xffff0000), 16) : 0) |
2007
- ((V & 0xff00ff00) !== 0 ? ((V &= 0xff00ff00), 8) : 0) |
2008
- ((V & 0xf0f0f0f0) !== 0 ? ((V &= 0xf0f0f0f0), 4) : 0) |
2009
- ((V & 0xcccccccc) !== 0 ? ((V &= 0xcccccccc), 2) : 0) |
2010
- // @ts-ignore
2011
- ((V & 0xaaaaaaaa) !== 0));
2012
- }
2013
-
2014
- /* eslint-disable import/prefer-default-export */
2015
- /* istanbul ignore file */
2016
- function readG1(fd, curve, toObject) {
2017
- return __awaiter(this, void 0, void 0, function () {
2018
- var buff, res;
2019
- return __generator(this, function (_a) {
2020
- switch (_a.label) {
2021
- case 0: return [4 /*yield*/, fd.read(curve.G1.F.n8 * 2)];
2022
- case 1:
2023
- buff = _a.sent();
2024
- res = curve.G1.fromRprLEM(buff, 0);
2025
- return [2 /*return*/, toObject ? curve.G1.toObject(res) : res];
2026
- }
2027
- });
2028
- });
2029
- }
2030
- function readG2(fd, curve, toObject) {
2031
- return __awaiter(this, void 0, void 0, function () {
2032
- var buff, res;
2033
- return __generator(this, function (_a) {
2034
- switch (_a.label) {
2035
- case 0: return [4 /*yield*/, fd.read(curve.G2.F.n8 * 2)];
2036
- case 1:
2037
- buff = _a.sent();
2038
- res = curve.G2.fromRprLEM(buff, 0);
2039
- return [2 /*return*/, toObject ? curve.G2.toObject(res) : res];
2040
- }
2041
- });
2042
- });
2043
- }
2044
- function readHeaderGroth16(fd, sections, toObject) {
2045
- var _a;
2046
- return __awaiter(this, void 0, void 0, function () {
2047
- var zkey, n8q, _b, n8r, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
2048
- return __generator(this, function (_q) {
2049
- switch (_q.label) {
2050
- case 0:
2051
- zkey = {};
2052
- zkey.protocol = "groth16";
2053
- return [4 /*yield*/, startReadUniqueSection_1(fd, sections, 2)];
2054
- case 1:
2055
- _q.sent();
2056
- return [4 /*yield*/, fd.readULE32()];
2057
- case 2:
2058
- n8q = _q.sent();
2059
- zkey.n8q = n8q;
2060
- _b = zkey;
2061
- return [4 /*yield*/, readBigInt_1(fd, n8q)];
2062
- case 3:
2063
- _b.q = _q.sent();
2064
- return [4 /*yield*/, fd.readULE32()];
2065
- case 4:
2066
- n8r = _q.sent();
2067
- zkey.n8r = n8r;
2068
- _c = zkey;
2069
- return [4 /*yield*/, readBigInt_1(fd, n8r)
2070
- // @ts-ignore
2071
- ];
2072
- case 5:
2073
- _c.r = _q.sent();
2074
- // @ts-ignore
2075
- _d = zkey;
2076
- if (!((_a = globalThis.curve_bn128) !== null && _a !== void 0)) return [3 /*break*/, 6];
2077
- _e = _a;
2078
- return [3 /*break*/, 8];
2079
- case 6: return [4 /*yield*/, buildBn128(undefined, undefined)];
2080
- case 7:
2081
- _e = (_q.sent());
2082
- _q.label = 8;
2083
- case 8:
2084
- // @ts-ignore
2085
- _d.curve = _e;
2086
- _f = zkey;
2087
- return [4 /*yield*/, fd.readULE32()];
2088
- case 9:
2089
- _f.nVars = _q.sent();
2090
- _g = zkey;
2091
- return [4 /*yield*/, fd.readULE32()];
2092
- case 10:
2093
- _g.nPublic = _q.sent();
2094
- _h = zkey;
2095
- return [4 /*yield*/, fd.readULE32()];
2096
- case 11:
2097
- _h.domainSize = _q.sent();
2098
- zkey.power = log2(zkey.domainSize);
2099
- _j = zkey;
2100
- return [4 /*yield*/, readG1(fd, zkey.curve, toObject)];
2101
- case 12:
2102
- _j.vk_alpha_1 = _q.sent();
2103
- _k = zkey;
2104
- return [4 /*yield*/, readG1(fd, zkey.curve, toObject)];
2105
- case 13:
2106
- _k.vk_beta_1 = _q.sent();
2107
- _l = zkey;
2108
- return [4 /*yield*/, readG2(fd, zkey.curve, toObject)];
2109
- case 14:
2110
- _l.vk_beta_2 = _q.sent();
2111
- _m = zkey;
2112
- return [4 /*yield*/, readG2(fd, zkey.curve, toObject)];
2113
- case 15:
2114
- _m.vk_gamma_2 = _q.sent();
2115
- _o = zkey;
2116
- return [4 /*yield*/, readG1(fd, zkey.curve, toObject)];
2117
- case 16:
2118
- _o.vk_delta_1 = _q.sent();
2119
- _p = zkey;
2120
- return [4 /*yield*/, readG2(fd, zkey.curve, toObject)];
2121
- case 17:
2122
- _p.vk_delta_2 = _q.sent();
2123
- return [4 /*yield*/, endReadSection_1(fd)];
2124
- case 18:
2125
- _q.sent();
2126
- return [2 /*return*/, zkey];
2127
- }
2128
- });
2129
- });
2130
- }
2131
- function readHeader$1(fd, sections, toObject) {
2132
- return __awaiter(this, void 0, void 0, function () {
2133
- var protocolId;
2134
- return __generator(this, function (_a) {
2135
- switch (_a.label) {
2136
- case 0: return [4 /*yield*/, startReadUniqueSection_1(fd, sections, 1)];
2137
- case 1:
2138
- _a.sent();
2139
- return [4 /*yield*/, fd.readULE32()];
2140
- case 2:
2141
- protocolId = _a.sent();
2142
- return [4 /*yield*/, endReadSection_1(fd)];
2143
- case 3:
2144
- _a.sent();
2145
- if (protocolId === 1) {
2146
- return [2 /*return*/, readHeaderGroth16(fd, sections, toObject)];
2147
- }
2148
- throw new Error("Protocol not supported: ");
2149
- }
2150
- });
2151
- });
2152
- }
2153
-
2154
- /* eslint-disable eqeqeq */
2155
- /* istanbul ignore file */
2156
- function writeBin(fd, witnessBin, prime) {
2157
- return __awaiter(this, void 0, void 0, function () {
2158
- var n8;
2159
- return __generator(this, function (_a) {
2160
- switch (_a.label) {
2161
- case 0: return [4 /*yield*/, startWriteSection_1(fd, 1)];
2162
- case 1:
2163
- _a.sent();
2164
- n8 = (Math.floor((Scalar.bitLength(prime) - 1) / 64) + 1) * 8;
2165
- return [4 /*yield*/, fd.writeULE32(n8)];
2166
- case 2:
2167
- _a.sent();
2168
- return [4 /*yield*/, writeBigInt_1(fd, prime, n8)];
2169
- case 3:
2170
- _a.sent();
2171
- if (witnessBin.byteLength % n8 != 0) {
2172
- throw new Error("Invalid witness length");
2173
- }
2174
- return [4 /*yield*/, fd.writeULE32(witnessBin.byteLength / n8)];
2175
- case 4:
2176
- _a.sent();
2177
- return [4 /*yield*/, endWriteSection_1(fd)];
2178
- case 5:
2179
- _a.sent();
2180
- return [4 /*yield*/, startWriteSection_1(fd, 2)];
2181
- case 6:
2182
- _a.sent();
2183
- return [4 /*yield*/, fd.write(witnessBin)];
2184
- case 7:
2185
- _a.sent();
2186
- return [4 /*yield*/, endWriteSection_1(fd)];
2187
- case 8:
2188
- _a.sent();
2189
- return [2 /*return*/];
2190
- }
2191
- });
2192
- });
2193
- }
2194
- function readHeader(fd, sections) {
2195
- return __awaiter(this, void 0, void 0, function () {
2196
- var n8, q, nWitness;
2197
- return __generator(this, function (_a) {
2198
- switch (_a.label) {
2199
- case 0: return [4 /*yield*/, startReadUniqueSection_1(fd, sections, 1)];
2200
- case 1:
2201
- _a.sent();
2202
- return [4 /*yield*/, fd.readULE32()];
2203
- case 2:
2204
- n8 = _a.sent();
2205
- return [4 /*yield*/, readBigInt_1(fd, n8)];
2206
- case 3:
2207
- q = _a.sent();
2208
- return [4 /*yield*/, fd.readULE32()];
2209
- case 4:
2210
- nWitness = _a.sent();
2211
- return [4 /*yield*/, endReadSection_1(fd)];
2212
- case 5:
2213
- _a.sent();
2214
- return [2 /*return*/, { n8: n8, q: q, nWitness: nWitness }];
2215
- }
2216
- });
2217
- });
2218
- }
2219
-
2220
- /* eslint-disable eqeqeq */
2221
- /* istanbul ignore file */
2222
- var unstringifyBigInts$2 = utils.unstringifyBigInts;
2223
- function wtnsCalculate(_input, wasmFileName, wtnsFileName) {
2224
- return __awaiter(this, void 0, void 0, function () {
2225
- var input, fdWasm, wasm, wc, w, fdWtns, fdWtns, w;
2226
- return __generator(this, function (_a) {
2227
- switch (_a.label) {
2228
- case 0:
2229
- input = unstringifyBigInts$2(_input);
2230
- return [4 /*yield*/, readExisting_1(wasmFileName)];
2231
- case 1:
2232
- fdWasm = _a.sent();
2233
- return [4 /*yield*/, fdWasm.read(fdWasm.totalSize)];
2234
- case 2:
2235
- wasm = _a.sent();
2236
- return [4 /*yield*/, fdWasm.close()];
2237
- case 3:
2238
- _a.sent();
2239
- return [4 /*yield*/, WitnessCalculatorBuilder(wasm)];
2240
- case 4:
2241
- wc = _a.sent();
2242
- if (!(wc.circom_version() == 1)) return [3 /*break*/, 9];
2243
- return [4 /*yield*/, wc.calculateBinWitness(input)];
2244
- case 5:
2245
- w = _a.sent();
2246
- return [4 /*yield*/, createBinFile_1(wtnsFileName, "wtns", 2, 2)];
2247
- case 6:
2248
- fdWtns = _a.sent();
2249
- return [4 /*yield*/, writeBin(fdWtns, w, wc.prime)];
2250
- case 7:
2251
- _a.sent();
2252
- return [4 /*yield*/, fdWtns.close()];
2253
- case 8:
2254
- _a.sent();
2255
- return [3 /*break*/, 14];
2256
- case 9: return [4 /*yield*/, createOverride_1(wtnsFileName)];
2257
- case 10:
2258
- fdWtns = _a.sent();
2259
- return [4 /*yield*/, wc.calculateWTNSBin(input)];
2260
- case 11:
2261
- w = _a.sent();
2262
- return [4 /*yield*/, fdWtns.write(w)];
2263
- case 12:
2264
- _a.sent();
2265
- return [4 /*yield*/, fdWtns.close()];
2266
- case 13:
2267
- _a.sent();
2268
- _a.label = 14;
2269
- case 14: return [2 /*return*/];
2270
- }
2271
- });
2272
- });
2273
- }
2274
-
2275
- /* eslint-disable no-plusplus */
2276
- /* eslint-disable eqeqeq */
2277
- /* eslint-disable @typescript-eslint/naming-convention */
2278
- /* istanbul ignore file */
2279
- var stringifyBigInts = utils.stringifyBigInts, unstringifyBigInts$1 = utils.unstringifyBigInts;
2280
- function buildABC1(curve, zkey, witness, coeffs) {
2281
- return __awaiter(this, void 0, void 0, function () {
2282
- var n8, sCoef, nCoef, outBuffA, outBuffB, outBuffC, outBuf, i, buffCoef, buffCoefV, m, c, s, coef, i;
2283
- return __generator(this, function (_a) {
2284
- n8 = curve.Fr.n8;
2285
- sCoef = 4 * 3 + zkey.n8r;
2286
- nCoef = (coeffs.byteLength - 4) / sCoef;
2287
- outBuffA = new BigBuffer(zkey.domainSize * n8);
2288
- outBuffB = new BigBuffer(zkey.domainSize * n8);
2289
- outBuffC = new BigBuffer(zkey.domainSize * n8);
2290
- outBuf = [outBuffA, outBuffB];
2291
- for (i = 0; i < nCoef; i++) {
2292
- buffCoef = coeffs.slice(4 + i * sCoef, 4 + i * sCoef + sCoef);
2293
- buffCoefV = new DataView(buffCoef.buffer);
2294
- m = buffCoefV.getUint32(0, true);
2295
- c = buffCoefV.getUint32(4, true);
2296
- s = buffCoefV.getUint32(8, true);
2297
- coef = buffCoef.slice(12, 12 + n8);
2298
- outBuf[m].set(curve.Fr.add(outBuf[m].slice(c * n8, c * n8 + n8), curve.Fr.mul(coef, witness.slice(s * n8, s * n8 + n8))), c * n8);
2299
- }
2300
- for (i = 0; i < zkey.domainSize; i++) {
2301
- outBuffC.set(curve.Fr.mul(outBuffA.slice(i * n8, i * n8 + n8), outBuffB.slice(i * n8, i * n8 + n8)), i * n8);
2302
- }
2303
- return [2 /*return*/, [outBuffA, outBuffB, outBuffC]];
2304
- });
2305
- });
2306
- }
2307
- function joinABC(curve, _zkey, a, b, c) {
2308
- return __awaiter(this, void 0, void 0, function () {
2309
- var MAX_CHUNK_SIZE, n8, nElements, promises, i, n, task, aChunk, bChunk, cChunk, result, outBuff, p, i;
2310
- return __generator(this, function (_a) {
2311
- switch (_a.label) {
2312
- case 0:
2313
- MAX_CHUNK_SIZE = 1 << 22;
2314
- n8 = curve.Fr.n8;
2315
- nElements = Math.floor(a.byteLength / curve.Fr.n8);
2316
- promises = [];
2317
- for (i = 0; i < nElements; i += MAX_CHUNK_SIZE) {
2318
- n = Math.min(nElements - i, MAX_CHUNK_SIZE);
2319
- task = [];
2320
- aChunk = a.slice(i * n8, (i + n) * n8);
2321
- bChunk = b.slice(i * n8, (i + n) * n8);
2322
- cChunk = c.slice(i * n8, (i + n) * n8);
2323
- task.push({ cmd: "ALLOCSET", var: 0, buff: aChunk });
2324
- task.push({ cmd: "ALLOCSET", var: 1, buff: bChunk });
2325
- task.push({ cmd: "ALLOCSET", var: 2, buff: cChunk });
2326
- task.push({ cmd: "ALLOC", var: 3, len: n * n8 });
2327
- task.push({
2328
- cmd: "CALL",
2329
- fnName: "qap_joinABC",
2330
- params: [{ var: 0 }, { var: 1 }, { var: 2 }, { val: n }, { var: 3 }]
2331
- });
2332
- task.push({ cmd: "CALL", fnName: "frm_batchFromMontgomery", params: [{ var: 3 }, { val: n }, { var: 3 }] });
2333
- task.push({ cmd: "GET", out: 0, var: 3, len: n * n8 });
2334
- promises.push(curve.tm.queueAction(task));
2335
- }
2336
- return [4 /*yield*/, Promise.all(promises)];
2337
- case 1:
2338
- result = _a.sent();
2339
- if (a instanceof BigBuffer) {
2340
- // @ts-ignore
2341
- outBuff = new BigBuffer(a.byteLength);
2342
- }
2343
- else {
2344
- outBuff = new Uint8Array(a.byteLength);
2345
- }
2346
- p = 0;
2347
- for (i = 0; i < result.length; i++) {
2348
- outBuff.set(result[i][0], p);
2349
- p += result[i][0].byteLength;
2350
- }
2351
- return [2 /*return*/, outBuff];
2352
- }
2353
- });
2354
- });
2355
- }
2356
- function groth16Prove(_input, wasmFile, zkeyFileName) {
2357
- return __awaiter(this, void 0, void 0, function () {
2358
- var input, witnessFileName, _a, fdWtns, sectionsWtns, wtns, _b, fdZKey, sectionsZKey, zkey, curve, Fr, G1, G2, power, buffWitness, buffCoeffs, _c, buffA_T, buffB_T, buffC_T, inc, buffA, buffAodd, buffAodd_T, buffB, buffBodd, buffBodd_T, buffC, buffCodd, buffCodd_T, buffPodd_T, proof, buffBasesA, _d, buffBasesB1, pib1, buffBasesB2, _e, buffBasesC, _f, buffBasesH, resH, r, s, publicSignals, i, b;
2359
- return __generator(this, function (_g) {
2360
- switch (_g.label) {
2361
- case 0:
2362
- input = unstringifyBigInts$1(_input);
2363
- witnessFileName = {
2364
- type: "mem"
2365
- };
2366
- return [4 /*yield*/, wtnsCalculate(input, wasmFile, witnessFileName)];
2367
- case 1:
2368
- _g.sent();
2369
- return [4 /*yield*/, readBinFile_1(witnessFileName, "wtns", 2, 1 << 25, 1 << 23)];
2370
- case 2:
2371
- _a = _g.sent(), fdWtns = _a.fd, sectionsWtns = _a.sections;
2372
- return [4 /*yield*/, readHeader(fdWtns, sectionsWtns)];
2373
- case 3:
2374
- wtns = _g.sent();
2375
- return [4 /*yield*/, readBinFile_1(zkeyFileName, "zkey", 2, 1 << 25, 1 << 23)];
2376
- case 4:
2377
- _b = _g.sent(), fdZKey = _b.fd, sectionsZKey = _b.sections;
2378
- return [4 /*yield*/, readHeader$1(fdZKey, sectionsZKey, undefined)];
2379
- case 5:
2380
- zkey = _g.sent();
2381
- if (zkey.protocol !== "groth16") {
2382
- throw new Error("zkey file is not groth16");
2383
- }
2384
- if (!Scalar.eq(zkey.r, wtns.q)) {
2385
- throw new Error("Curve of the witness does not match the curve of the proving key");
2386
- }
2387
- if (wtns.nWitness !== zkey.nVars) {
2388
- throw new Error("Invalid witness length. Circuit: ".concat(zkey.nVars, ", witness: ").concat(wtns.nWitness));
2389
- }
2390
- curve = zkey.curve;
2391
- Fr = curve.Fr;
2392
- G1 = curve.G1;
2393
- G2 = curve.G2;
2394
- power = log2(zkey.domainSize);
2395
- return [4 /*yield*/, readSection_1(fdWtns, sectionsWtns, 2)];
2396
- case 6:
2397
- buffWitness = _g.sent();
2398
- return [4 /*yield*/, readSection_1(fdZKey, sectionsZKey, 4)];
2399
- case 7:
2400
- buffCoeffs = _g.sent();
2401
- return [4 /*yield*/, buildABC1(curve, zkey, buffWitness, buffCoeffs)];
2402
- case 8:
2403
- _c = _g.sent(), buffA_T = _c[0], buffB_T = _c[1], buffC_T = _c[2];
2404
- inc = power == Fr.s ? curve.Fr.shift : curve.Fr.w[power + 1];
2405
- return [4 /*yield*/, Fr.ifft(buffA_T, "", "", undefined, "IFFT_A")];
2406
- case 9:
2407
- buffA = _g.sent();
2408
- return [4 /*yield*/, Fr.batchApplyKey(buffA, Fr.e(1), inc)];
2409
- case 10:
2410
- buffAodd = _g.sent();
2411
- return [4 /*yield*/, Fr.fft(buffAodd, "", "", undefined, "FFT_A")];
2412
- case 11:
2413
- buffAodd_T = _g.sent();
2414
- return [4 /*yield*/, Fr.ifft(buffB_T, "", "", undefined, "IFFT_B")];
2415
- case 12:
2416
- buffB = _g.sent();
2417
- return [4 /*yield*/, Fr.batchApplyKey(buffB, Fr.e(1), inc)];
2418
- case 13:
2419
- buffBodd = _g.sent();
2420
- return [4 /*yield*/, Fr.fft(buffBodd, "", "", undefined, "FFT_B")];
2421
- case 14:
2422
- buffBodd_T = _g.sent();
2423
- return [4 /*yield*/, Fr.ifft(buffC_T, "", "", undefined, "IFFT_C")];
2424
- case 15:
2425
- buffC = _g.sent();
2426
- return [4 /*yield*/, Fr.batchApplyKey(buffC, Fr.e(1), inc)];
2427
- case 16:
2428
- buffCodd = _g.sent();
2429
- return [4 /*yield*/, Fr.fft(buffCodd, "", "", undefined, "FFT_C")];
2430
- case 17:
2431
- buffCodd_T = _g.sent();
2432
- return [4 /*yield*/, joinABC(curve, zkey, buffAodd_T, buffBodd_T, buffCodd_T)];
2433
- case 18:
2434
- buffPodd_T = _g.sent();
2435
- proof = {};
2436
- return [4 /*yield*/, readSection_1(fdZKey, sectionsZKey, 5)];
2437
- case 19:
2438
- buffBasesA = _g.sent();
2439
- _d = proof;
2440
- return [4 /*yield*/, curve.G1.multiExpAffine(buffBasesA, buffWitness, undefined, "multiexp A")];
2441
- case 20:
2442
- _d.pi_a = _g.sent();
2443
- return [4 /*yield*/, readSection_1(fdZKey, sectionsZKey, 6)];
2444
- case 21:
2445
- buffBasesB1 = _g.sent();
2446
- return [4 /*yield*/, curve.G1.multiExpAffine(buffBasesB1, buffWitness, undefined, "multiexp B1")];
2447
- case 22:
2448
- pib1 = _g.sent();
2449
- return [4 /*yield*/, readSection_1(fdZKey, sectionsZKey, 7)];
2450
- case 23:
2451
- buffBasesB2 = _g.sent();
2452
- _e = proof;
2453
- return [4 /*yield*/, curve.G2.multiExpAffine(buffBasesB2, buffWitness, undefined, "multiexp B2")];
2454
- case 24:
2455
- _e.pi_b = _g.sent();
2456
- return [4 /*yield*/, readSection_1(fdZKey, sectionsZKey, 8)];
2457
- case 25:
2458
- buffBasesC = _g.sent();
2459
- _f = proof;
2460
- return [4 /*yield*/, curve.G1.multiExpAffine(buffBasesC, buffWitness.slice((zkey.nPublic + 1) * curve.Fr.n8), undefined, "multiexp C")];
2461
- case 26:
2462
- _f.pi_c = _g.sent();
2463
- return [4 /*yield*/, readSection_1(fdZKey, sectionsZKey, 9)];
2464
- case 27:
2465
- buffBasesH = _g.sent();
2466
- return [4 /*yield*/, curve.G1.multiExpAffine(buffBasesH, buffPodd_T, undefined, "multiexp H")];
2467
- case 28:
2468
- resH = _g.sent();
2469
- r = curve.Fr.random();
2470
- s = curve.Fr.random();
2471
- proof.pi_a = G1.add(proof.pi_a, zkey.vk_alpha_1);
2472
- proof.pi_a = G1.add(proof.pi_a, G1.timesFr(zkey.vk_delta_1, r));
2473
- proof.pi_b = G2.add(proof.pi_b, zkey.vk_beta_2);
2474
- proof.pi_b = G2.add(proof.pi_b, G2.timesFr(zkey.vk_delta_2, s));
2475
- pib1 = G1.add(pib1, zkey.vk_beta_1);
2476
- pib1 = G1.add(pib1, G1.timesFr(zkey.vk_delta_1, s));
2477
- proof.pi_c = G1.add(proof.pi_c, resH);
2478
- proof.pi_c = G1.add(proof.pi_c, G1.timesFr(proof.pi_a, s));
2479
- proof.pi_c = G1.add(proof.pi_c, G1.timesFr(pib1, r));
2480
- proof.pi_c = G1.add(proof.pi_c, G1.timesFr(zkey.vk_delta_1, Fr.neg(Fr.mul(r, s))));
2481
- publicSignals = [];
2482
- for (i = 1; i <= zkey.nPublic; i++) {
2483
- b = buffWitness.slice(i * Fr.n8, i * Fr.n8 + Fr.n8);
2484
- publicSignals.push(Scalar.fromRprLE(b, undefined, undefined));
2485
- }
2486
- proof.pi_a = G1.toObject(G1.toAffine(proof.pi_a));
2487
- proof.pi_b = G2.toObject(G2.toAffine(proof.pi_b));
2488
- proof.pi_c = G1.toObject(G1.toAffine(proof.pi_c));
2489
- proof.protocol = "groth16";
2490
- proof.curve = curve.name;
2491
- return [4 /*yield*/, fdZKey.close()];
2492
- case 29:
2493
- _g.sent();
2494
- return [4 /*yield*/, fdWtns.close()];
2495
- case 30:
2496
- _g.sent();
2497
- proof = stringifyBigInts(proof);
2498
- publicSignals = stringifyBigInts(publicSignals);
2499
- return [2 /*return*/, { proof: proof, publicSignals: publicSignals }];
2500
- }
2501
- });
2502
- });
2503
- }
2504
-
2505
746
  /**
2506
747
  * Generates a Semaphore proof.
2507
748
  * @param identity The Semaphore identity.
@@ -2534,7 +775,7 @@ function generateProof(_a, groupOrMerkleProof, externalNullifier, signal, snarkA
2534
775
  zkeyFilePath: "https://www.trusted-setup-pse.org/semaphore/".concat(merkleProof.siblings.length, "/semaphore.zkey")
2535
776
  };
2536
777
  }
2537
- return [4 /*yield*/, groth16Prove({
778
+ return [4 /*yield*/, prove({
2538
779
  identityTrapdoor: trapdoor,
2539
780
  identityNullifier: nullifier,
2540
781
  treePathIndices: merkleProof.pathIndices,
@@ -3353,73 +1594,6 @@ var verificationKeys = {
3353
1594
  IC: IC
3354
1595
  };
3355
1596
 
3356
- /* eslint-disable no-plusplus */
3357
- /* eslint-disable @typescript-eslint/naming-convention */
3358
- /* istanbul ignore file */
3359
- var unstringifyBigInts = utils.unstringifyBigInts;
3360
- function isWellConstructed(curve, proof) {
3361
- var G1 = curve.G1;
3362
- var G2 = curve.G2;
3363
- return G1.isValid(proof.pi_a) && G2.isValid(proof.pi_b) && G1.isValid(proof.pi_c);
3364
- }
3365
- function publicInputsAreValid(curve, publicInputs) {
3366
- for (var i = 0; i < publicInputs.length; i++) {
3367
- if (!Scalar.lt(publicInputs[i], curve.r)) {
3368
- return false;
3369
- }
3370
- }
3371
- return true;
3372
- }
3373
- function groth16Verify(_vk_verifier, _publicSignals, _proof) {
3374
- var _a;
3375
- return __awaiter(this, void 0, void 0, function () {
3376
- var vk_verifier, proof, publicSignals, curve, _b, IC0, IC, w, i, buffP, cpub, pi_a, pi_b, pi_c, vk_gamma_2, vk_delta_2, vk_alpha_1, vk_beta_2;
3377
- return __generator(this, function (_c) {
3378
- switch (_c.label) {
3379
- case 0:
3380
- vk_verifier = unstringifyBigInts(_vk_verifier);
3381
- proof = unstringifyBigInts(_proof);
3382
- publicSignals = unstringifyBigInts(_publicSignals);
3383
- if (!((_a = globalThis.curve_bn128) !== null && _a !== void 0)) return [3 /*break*/, 1];
3384
- _b = _a;
3385
- return [3 /*break*/, 3];
3386
- case 1: return [4 /*yield*/, buildBn128(undefined, undefined)];
3387
- case 2:
3388
- _b = (_c.sent());
3389
- _c.label = 3;
3390
- case 3:
3391
- curve = _b;
3392
- IC0 = curve.G1.fromObject(vk_verifier.IC[0]);
3393
- IC = new Uint8Array(curve.G1.F.n8 * 2 * publicSignals.length);
3394
- w = new Uint8Array(curve.Fr.n8 * publicSignals.length);
3395
- if (!publicInputsAreValid(curve, publicSignals)) {
3396
- return [2 /*return*/, false];
3397
- }
3398
- for (i = 0; i < publicSignals.length; i++) {
3399
- buffP = curve.G1.fromObject(vk_verifier.IC[i + 1]);
3400
- IC.set(buffP, i * curve.G1.F.n8 * 2);
3401
- Scalar.toRprLE(w, curve.Fr.n8 * i, publicSignals[i], curve.Fr.n8);
3402
- }
3403
- return [4 /*yield*/, curve.G1.multiExpAffine(IC, w)];
3404
- case 4:
3405
- cpub = _c.sent();
3406
- cpub = curve.G1.add(cpub, IC0);
3407
- pi_a = curve.G1.fromObject(proof.pi_a);
3408
- pi_b = curve.G2.fromObject(proof.pi_b);
3409
- pi_c = curve.G1.fromObject(proof.pi_c);
3410
- if (!isWellConstructed(curve, { pi_a: pi_a, pi_b: pi_b, pi_c: pi_c })) {
3411
- return [2 /*return*/, false];
3412
- }
3413
- vk_gamma_2 = curve.G2.fromObject(vk_verifier.vk_gamma_2);
3414
- vk_delta_2 = curve.G2.fromObject(vk_verifier.vk_delta_2);
3415
- vk_alpha_1 = curve.G1.fromObject(vk_verifier.vk_alpha_1);
3416
- vk_beta_2 = curve.G2.fromObject(vk_verifier.vk_beta_2);
3417
- return [2 /*return*/, curve.pairingEq(curve.G1.neg(pi_a), pi_b, cpub, vk_gamma_2, pi_c, vk_delta_2, vk_alpha_1, vk_beta_2)];
3418
- }
3419
- });
3420
- });
3421
- }
3422
-
3423
1597
  /**
3424
1598
  * Verifies a Semaphore proof.
3425
1599
  * @param fullProof The SnarkJS Semaphore proof.
@@ -3432,7 +1606,10 @@ function verifyProof(_a, treeDepth) {
3432
1606
  throw new TypeError("The tree depth must be a number between 16 and 32");
3433
1607
  }
3434
1608
  var verificationKey = __assign(__assign({}, verificationKeys), { vk_delta_2: verificationKeys.vk_delta_2[treeDepth - 16], IC: verificationKeys.IC[treeDepth - 16] });
3435
- return groth16Verify(verificationKey, [merkleTreeRoot, nullifierHash, hash(signal), hash(externalNullifier)], unpackProof(proof));
1609
+ return verify(verificationKey, {
1610
+ publicSignals: [merkleTreeRoot, nullifierHash, hash(signal), hash(externalNullifier)],
1611
+ proof: unpackProof(proof)
1612
+ });
3436
1613
  }
3437
1614
 
3438
1615
  export { calculateNullifierHash, generateProof, verifyProof };