zkjson 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
package/collection.js CHANGED
@@ -1,9 +1,30 @@
1
1
  const newMemEmptyTrie = require("./circomlibjs").newMemEmptyTrie
2
2
  const { pad, str2val, val2str, id2str, encode, str2id } = require("./encoder")
3
+ const Doc = require("./doc")
3
4
 
4
5
  class Collection {
5
- constructor(size = 16) {
6
+ constructor({ size = 5, size_json = 16, level = 100 }) {
6
7
  this.size = size
8
+ this.size_json = size_json
9
+ this.level = level
10
+ this.doc = new Doc({ size: this.size, size_json: this.size_json })
11
+ }
12
+ async getInputs({ id, json, path, val }) {
13
+ const doc_inputs = await this.doc.getInputs({ json, path, val })
14
+ const res = await this.get(id)
15
+ let siblings = res.siblings
16
+ for (let i = 0; i < siblings.length; i++)
17
+ siblings[i] = this.tree.F.toObject(siblings[i])
18
+ while (siblings.length < this.level) siblings.push(0)
19
+ siblings = siblings.map(s => s.toString())
20
+ return {
21
+ json: doc_inputs.json,
22
+ path: doc_inputs.path,
23
+ val: doc_inputs.val,
24
+ root: this.tree.F.toObject(this.tree.root).toString(),
25
+ siblings,
26
+ key: str2id(id),
27
+ }
7
28
  }
8
29
  async init() {
9
30
  this.tree = await newMemEmptyTrie()
@@ -11,13 +32,13 @@ class Collection {
11
32
  async insert(_key, _val) {
12
33
  const doc = encode(_val)
13
34
  const id = str2id(_key)
14
- const val = pad(val2str(doc), this.size)
35
+ const val = pad(val2str(doc), this.size_json)
15
36
  return await this.tree.insert(id, val)
16
37
  }
17
38
  async update(_key, _val) {
18
39
  const doc = encode(_val)
19
40
  const id = str2id(_key)
20
- const val = pad(val2str(doc), this.size)
41
+ const val = pad(val2str(doc), this.size_json)
21
42
  return await this.tree.update(id, val)
22
43
  }
23
44
 
package/db.js CHANGED
@@ -1,20 +1,190 @@
1
1
  const newMemEmptyTrie = require("./circomlibjs").newMemEmptyTrie
2
- const { str2val, val2str, id2str, encode, str2id } = require("./encoder")
2
+ const { range } = require("ramda")
3
+ const {
4
+ pad,
5
+ toSignal,
6
+ str2val,
7
+ val2str,
8
+ id2str,
9
+ encode,
10
+ str2id,
11
+ } = require("./encoder")
3
12
  const Collection = require("./collection")
4
13
 
5
14
  class DB {
6
- constructor(size = 16) {
15
+ constructor({ size = 5, level = 40, size_json = 16, size_txs = 10 }) {
7
16
  this.size = size
17
+ this.level = level
18
+ this.size_json = size_json
19
+ this.size_txs = size_txs
8
20
  }
21
+
9
22
  async init() {
10
23
  this.tree = await newMemEmptyTrie()
11
24
  this.cols = {}
12
25
  }
26
+
27
+ parse(res, tree) {
28
+ const isOld0 = res.isOld0 ? "1" : "0"
29
+ const oldRoot = tree.F.toObject(res.oldRoot).toString()
30
+ const newRoot = tree.F.toObject(res.newRoot).toString()
31
+ const oldKey = res.isOld0 ? "0" : tree.F.toObject(res.oldKey).toString()
32
+ const oldValue = res.isOld0 ? "0" : tree.F.toObject(res.oldValue).toString()
33
+ let siblings = res.siblings
34
+ for (let i = 0; i < siblings.length; i++)
35
+ siblings[i] = tree.F.toObject(siblings[i])
36
+ while (siblings.length < this.level) siblings.push(0)
37
+ siblings = siblings.map(s => s.toString())
38
+ return { isOld0, oldRoot, oldKey, oldValue, siblings, newRoot }
39
+ }
40
+
41
+ async getRollupInputs({ queries }) {
42
+ let write, _json
43
+ let oldRoot = []
44
+ let newRoot = []
45
+ let oldKey = []
46
+ let oldValue = []
47
+ let siblings = []
48
+ let isOld0 = []
49
+ let oldRoot_db = []
50
+ let newRoot_db = []
51
+ let oldKey_db = []
52
+ let oldValue_db = []
53
+ let siblings_db = []
54
+ let isOld0_db = []
55
+ let newKey_db = []
56
+ let newKey = []
57
+ let _res
58
+ let json = []
59
+ let fnc = []
60
+ for (let i = 0; i < this.size_txs; i++) {
61
+ const v = queries[i]
62
+ if (!v) {
63
+ json.push(range(0, this.size_json).map(() => "0"))
64
+ fnc.push([0, 0])
65
+ newRoot.push(newRoot[i - 1])
66
+ oldRoot.push("0")
67
+ oldKey.push("0")
68
+ oldValue.push("0")
69
+ siblings.push(range(0, this.level).map(() => "0"))
70
+ isOld0.push("0")
71
+ oldRoot_db.push(newRoot_db[i - 1])
72
+ oldKey_db.push("0")
73
+ oldValue_db.push("0")
74
+ siblings_db.push(range(0, this.level).map(() => "0"))
75
+ isOld0_db.push("0")
76
+ newKey_db.push("0")
77
+ newKey.push("0")
78
+ continue
79
+ }
80
+ _json = v[2]
81
+ const { update, tree, col: res2, doc: res } = await this.insert(...v)
82
+ const icol = this.parse(res, tree)
83
+ const idb = this.parse(res2, this.tree)
84
+ _res = idb
85
+ const _newKey = str2id(v[1])
86
+ json.push(pad(val2str(encode(_json)), this.size_json))
87
+ const _newKey_db = str2id(v[0])
88
+ fnc.push(update ? [0, 1] : [1, 0])
89
+ newRoot.push(idb.newRoot)
90
+ oldRoot.push(icol.oldRoot)
91
+ oldKey.push(icol.oldKey)
92
+ oldValue.push(icol.oldValue)
93
+ siblings.push(icol.siblings)
94
+ isOld0.push(icol.isOld0)
95
+ oldRoot_db.push(idb.oldRoot)
96
+ newRoot_db.push(idb.newRoot)
97
+ oldKey_db.push(idb.oldKey)
98
+ oldValue_db.push(idb.oldValue)
99
+ siblings_db.push(idb.siblings)
100
+ isOld0_db.push(idb.isOld0)
101
+ newKey_db.push(_newKey_db)
102
+ newKey.push(_newKey)
103
+ }
104
+
105
+ return {
106
+ fnc,
107
+ oldRoot,
108
+ newRoot,
109
+ oldKey,
110
+ oldValue,
111
+ siblings,
112
+ isOld0,
113
+ oldRoot_db,
114
+ oldKey_db,
115
+ oldValue_db,
116
+ siblings_db,
117
+ isOld0_db,
118
+ newKey_db,
119
+ newKey,
120
+ json,
121
+ }
122
+ }
123
+
124
+ async getQueryInputs({ id, col_id, json }) {
125
+ const {
126
+ update,
127
+ tree,
128
+ col: res2,
129
+ doc: res,
130
+ } = await this.insert(col_id, id, json)
131
+ const icol = this.parse(res, tree)
132
+ const idb = this.parse(res2, this.tree)
133
+ const newKey = str2id(id)
134
+ const newKey_db = str2id(col_id)
135
+ return {
136
+ fnc: update ? [0, 1] : [1, 0],
137
+ oldRoot: icol.oldRoot,
138
+ oldKey: icol.oldKey,
139
+ oldValue: icol.oldValue,
140
+ siblings: icol.siblings,
141
+ isOld0: icol.isOld0,
142
+ oldRoot_db: idb.oldRoot,
143
+ oldKey_db: idb.oldKey,
144
+ oldValue_db: idb.oldValue,
145
+ siblings_db: idb.siblings,
146
+ isOld0_db: idb.isOld0,
147
+ newRoot: idb.newRoot,
148
+ newKey_db,
149
+ newKey,
150
+ json: pad(toSignal(encode(json)), this.size_json),
151
+ }
152
+ }
153
+
154
+ async getInputs({ id, col_id, json, path, val }) {
155
+ const col_root = this.tree.F.toObject(this.tree.root).toString()
156
+ const col_res = await this.getCol(id)
157
+
158
+ let col_siblings = col_res.siblings
159
+ for (let i = 0; i < col_siblings.length; i++)
160
+ col_siblings[i] = this.tree.F.toObject(col_siblings[i])
161
+ while (col_siblings.length < this.level) col_siblings.push(0)
162
+ col_siblings = col_siblings.map(s => s.toString())
163
+ const col_key = str2id(col_id)
164
+ const col = this.getColTree(col_id)
165
+ const col_inputs = await col.getInputs({ id, json, path, val })
166
+ return {
167
+ path: col_inputs.path,
168
+ val: col_inputs.val,
169
+ json: col_inputs.json,
170
+ root: col_inputs.root,
171
+ siblings: col_inputs.siblings,
172
+ key: str2id(id),
173
+ col_key,
174
+ col_siblings,
175
+ col_root,
176
+ }
177
+ }
178
+
13
179
  async addCollection(_key) {
14
180
  const id = str2id(_key)
15
181
  const col = await this.tree.find(id)
16
182
  if (col.found) throw Error("collection exists")
17
- const _col = new Collection(this.size)
183
+ const _col = new Collection({
184
+ size: this.size,
185
+ level: this.level,
186
+ size_json: this.size_json,
187
+ })
18
188
  await _col.init()
19
189
  this.cols[_key] = _col
20
190
  const root = _col.tree.F.toObject(_col.tree.root).toString()
package/doc.js ADDED
@@ -0,0 +1,15 @@
1
+ const { pad, toSignal, encode, encodePath, encodeVal } = require("./encoder")
2
+
3
+ module.exports = class Doc {
4
+ constructor({ size = 16, size_json = 100 }) {
5
+ this.size = size
6
+ this.size_json = size_json
7
+ }
8
+ async getInputs({ json, path, val }) {
9
+ return {
10
+ json: pad(toSignal(encode(json)), this.size_json),
11
+ path: pad(toSignal(encodePath(path)), this.size),
12
+ val: pad(toSignal(encodeVal(val)), this.size),
13
+ }
14
+ }
15
+ }
package/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  const encoder = require("./encoder")
2
2
  const DB = require("./db")
3
+ const Doc = require("./doc")
3
4
  const Collection = require("./collection")
4
5
 
5
- module.exports = { ...encoder, DB, Collection }
6
+ module.exports = { ...encoder, DB, Collection, Doc }
package/json.js ADDED
@@ -0,0 +1,15 @@
1
+ const { pad, toSignal, encode, encodePath, encodeVal } = require("./encoder")
2
+
3
+ module.exports = class Json {
4
+ constructor({ size = 16, size_json = 100 }) {
5
+ this.size = size
6
+ this.size_json = size_json
7
+ }
8
+ async getInputs({ json, path, val }) {
9
+ return {
10
+ json: pad(toSignal(encode(json)), this.size_json),
11
+ path: pad(toSignal(encodePath(path)), this.size),
12
+ val: pad(toSignal(encodeVal(val)), this.size),
13
+ }
14
+ }
15
+ }
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "zkjson",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Zero Knowledge Provable JSON",
5
5
  "main": "index.js",
6
6
  "license": "MIT",
7
7
  "dependencies": {
8
8
  "blake-hash": "^2.0.0",
9
- "blake2b": "^2.1.4",
10
- "ethers": "^6.10.0",
11
- "ffjavascript": "^0.2.63",
9
+ "blake2b": "^2.1.3",
10
+ "ethers": "^5.5.1",
11
+ "ffjavascript": "^0.2.45",
12
12
  "ramda": "^0.29.1"
13
13
  }
14
14
  }