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