zkjson 0.1.10 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,6 @@
2
2
 
3
3
  pragma solidity >=0.7.0 <0.9.0;
4
4
  import "hardhat/console.sol";
5
- import "./ZKJson.sol";
6
5
  import "./ZKQuery.sol";
7
6
 
8
7
  interface VerifierRU {
@@ -12,7 +11,7 @@ interface VerifierRU {
12
11
 
13
12
  contract ZKRollup is ZKQuery {
14
13
  address public verifierRU;
15
- address public comitter;
14
+ address public committer;
16
15
  uint public root;
17
16
 
18
17
  function _verifyRU(uint[] calldata zkp) internal view returns (bool) {
@@ -29,29 +28,27 @@ contract ZKRollup is ZKQuery {
29
28
  return true;
30
29
  }
31
30
 
32
- function _validateQueryRU(uint[] memory path, uint[] calldata zkp, uint size) internal view returns(uint[] memory){
31
+ function _validateQueryRU(uint[] memory path, uint[] calldata zkp, uint size_path, uint size_val) internal view returns(uint[] memory){
33
32
  require(zkp[19] == root, "root mismatch");
34
- require(zkp[size * 2 + 10] == path[0], "wrong collection");
35
- require(zkp[size * 2 + 11] == path[1], "wrong doc");
33
+ require(zkp[size_path + size_val + 10] == path[0], "wrong collection");
34
+ require(zkp[size_path + size_val + 11] == path[1], "wrong doc");
36
35
  require(zkp[8] == 1, "value doesn't exist");
37
- require(path.length <= size + 2, "path too long");
36
+ require(path.length <= size_path + size_val, "path too long");
38
37
  for(uint i = 9; i < 9 + path.length - 2; i++) require(path[i - 7] == zkp[i], "wrong path");
39
- uint[] memory value = new uint[](size);
40
- for(uint i = 9 + size; i < 9 + size * 2; i++) value[i - (9 + size)] = zkp[i];
38
+ uint[] memory value = new uint[](size_val);
39
+ for(uint i = 9 + size_path; i < 9 + size_path + size_val; i++) value[i - (9 + size_path)] = zkp[i];
41
40
  return toArr(value);
42
41
  }
43
42
 
44
43
  function commit (uint[] calldata zkp) public returns (uint) {
45
44
  require (zkp[9] == root, "wrong merkle root");
46
- require(msg.sender == comitter, "sender is not comitter");
45
+ require(msg.sender == committer, "sender is not committer");
47
46
  root = zkp[8];
48
47
  verifyRU(zkp);
49
48
  return root;
50
-
51
49
  }
52
50
 
53
51
  function verifyRU(uint[] calldata zkp) public view returns (bool) {
54
52
  return _verifyRU(zkp);
55
53
  }
56
-
57
54
  }
package/db.js CHANGED
@@ -1,4 +1,5 @@
1
1
  const newMemEmptyTrie = require("./circomlibjs").newMemEmptyTrie
2
+ const snarkjs = require("snarkjs")
2
3
  const { range } = require("ramda")
3
4
  const {
4
5
  pad,
@@ -7,7 +8,7 @@ const {
7
8
  val2str,
8
9
  id2str,
9
10
  encode,
10
- str2id,
11
+ toIndex,
11
12
  } = require("./encoder")
12
13
  const Collection = require("./collection")
13
14
 
@@ -19,7 +20,15 @@ class DB {
19
20
  size_json = 256,
20
21
  size_txs = 10,
21
22
  level_col = 8,
23
+ wasm,
24
+ zkey,
25
+ wasmRU,
26
+ zkeyRU,
22
27
  }) {
28
+ this.wasm = wasm
29
+ this.zkey = zkey
30
+ this.wasmRU = wasmRU
31
+ this.zkeyRU = zkeyRU
23
32
  this.level_col = level_col
24
33
  this.size = size_val
25
34
  this.size_path = size_path
@@ -47,7 +56,63 @@ class DB {
47
56
  siblings = siblings.map(s => s.toString())
48
57
  return { isOld0, oldRoot, oldKey, oldValue, siblings, newRoot }
49
58
  }
59
+ _getVal(j, p) {
60
+ if (p.length === 0) {
61
+ return j
62
+ } else {
63
+ const sp = p[0].split("[")
64
+ for (let v of sp) {
65
+ if (/]$/.test(v)) {
66
+ j = j[v.replace(/]$/, "") * 1]
67
+ } else {
68
+ j = j[v]
69
+ }
70
+ }
71
+ return this._getVal(j, p.slice(1))
72
+ }
73
+ }
74
+ getVal(j, p) {
75
+ if (p === "") return j
76
+ return this._getVal(j, p.split("."))
77
+ }
50
78
 
79
+ async genProof({ json, col_id, path, id }) {
80
+ const inputs = await this.getInputs({
81
+ id,
82
+ col_id,
83
+ json,
84
+ path,
85
+ val: this.getVal(json, path),
86
+ })
87
+ const { proof, publicSignals } = await snarkjs.groth16.fullProve(
88
+ inputs,
89
+ this.wasm,
90
+ this.zkey
91
+ )
92
+ return [
93
+ ...proof.pi_a.slice(0, 2),
94
+ ...proof.pi_b[0].slice(0, 2).reverse(),
95
+ ...proof.pi_b[1].slice(0, 2).reverse(),
96
+ ...proof.pi_c.slice(0, 2),
97
+ ...publicSignals,
98
+ ]
99
+ }
100
+
101
+ async genRollupProof(txs) {
102
+ const inputs = await this.getRollupInputs({ queries: txs })
103
+ const { proof, publicSignals } = await snarkjs.groth16.fullProve(
104
+ inputs,
105
+ this.wasmRU,
106
+ this.zkeyRU
107
+ )
108
+ return [
109
+ ...proof.pi_a.slice(0, 2),
110
+ ...proof.pi_b[0].slice(0, 2).reverse(),
111
+ ...proof.pi_b[1].slice(0, 2).reverse(),
112
+ ...proof.pi_c.slice(0, 2),
113
+ ...publicSignals,
114
+ ]
115
+ }
51
116
  async getRollupInputs({ queries }) {
52
117
  let write, _json
53
118
  let oldRoot = []
@@ -79,6 +144,7 @@ class DB {
79
144
  siblings.push(range(0, this.level).map(() => "0"))
80
145
  isOld0.push("0")
81
146
  oldRoot_db.push(newRoot_db[i - 1])
147
+ newRoot_db.push(newRoot_db[i - 1])
82
148
  oldKey_db.push("0")
83
149
  oldValue_db.push("0")
84
150
  siblings_db.push(range(0, this.level_col).map(() => "0"))
@@ -92,9 +158,9 @@ class DB {
92
158
  const icol = this.parse(res, tree, this.level)
93
159
  const idb = this.parse(res2, this.tree, this.level_col)
94
160
  _res = idb
95
- const _newKey = str2id(v[1])
161
+ const _newKey = toIndex(v[1])
96
162
  json.push(pad(val2str(encode(_json)), this.size_json))
97
- const _newKey_db = v[0]
163
+ const _newKey_db = v[0].toString()
98
164
  fnc.push(update ? [0, 1] : [1, 0])
99
165
  newRoot.push(idb.newRoot)
100
166
  oldRoot.push(icol.oldRoot)
@@ -140,8 +206,8 @@ class DB {
140
206
  } = await this.insert(col_id, id, json)
141
207
  const icol = this.parse(res, tree, this.level)
142
208
  const idb = this.parse(res2, this.tree, this.level_col)
143
- const newKey = str2id(id)
144
- const newKey_db = col_id
209
+ const newKey = toIndex(id)
210
+ const newKey_db = col_id.toString()
145
211
  return {
146
212
  fnc: update ? [0, 1] : [1, 0],
147
213
  oldRoot: icol.oldRoot,
@@ -179,7 +245,7 @@ class DB {
179
245
  json: col_inputs.json,
180
246
  root: col_inputs.root,
181
247
  siblings: col_inputs.siblings,
182
- key: str2id(id),
248
+ key: toIndex(id),
183
249
  col_key,
184
250
  col_siblings,
185
251
  col_root,
@@ -244,7 +310,7 @@ class DB {
244
310
  return await _col.get(_key)
245
311
  }
246
312
  async getCol(_key) {
247
- const id = str2id(_key)
313
+ const id = toIndex(_key)
248
314
  return await this.tree.find(id)
249
315
  }
250
316
  }
package/encoder.js CHANGED
@@ -453,6 +453,9 @@ const fromSignal = str2val
453
453
  const toIndex = str2id
454
454
  const fromIndex = id2str
455
455
 
456
+ const path = p => toSignal(encodePath(p))
457
+ const val = v => toSignal(encodeVal(v))
458
+
456
459
  module.exports = {
457
460
  encode,
458
461
  decode,
@@ -471,4 +474,6 @@ module.exports = {
471
474
  fromSignal,
472
475
  toIndex,
473
476
  fromIndex,
477
+ path,
478
+ val,
474
479
  }
package/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const encoder = require("./encoder")
2
2
  const DB = require("./db")
3
3
  const Doc = require("./doc")
4
+ const Rollup = require("./rollup")
4
5
  const Collection = require("./collection")
5
6
 
6
- module.exports = { ...encoder, DB, Collection, Doc }
7
+ module.exports = { ...encoder, DB, Collection, Doc, Rollup }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zkjson",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Zero Knowledge Provable JSON",
5
5
  "main": "index.js",
6
6
  "license": "MIT",