zkjson 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- package/collection.js +24 -3
- package/db.js +173 -3
- package/doc.js +15 -0
- package/encoder.js +5 -0
- package/index.js +2 -1
- package/json.js +15 -0
- package/package.json +4 -4
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.
|
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.
|
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 {
|
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(
|
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/encoder.js
CHANGED
@@ -441,6 +441,9 @@ function str2val(arr) {
|
|
441
441
|
return _arr
|
442
442
|
}
|
443
443
|
|
444
|
+
const toSignal = val2str
|
445
|
+
const fromSignal = str2val
|
446
|
+
|
444
447
|
module.exports = {
|
445
448
|
encode,
|
446
449
|
decode,
|
@@ -455,4 +458,6 @@ module.exports = {
|
|
455
458
|
val2str,
|
456
459
|
str2val,
|
457
460
|
id2str,
|
461
|
+
toSignal,
|
462
|
+
fromSignal,
|
458
463
|
}
|
package/index.js
CHANGED
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
|
+
"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.
|
10
|
-
"ethers": "^
|
11
|
-
"ffjavascript": "^0.2.
|
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
|
}
|