Skip to content

Commit 2e11640

Browse files
author
Kunming Jiang
committed
Update tests
1 parent bf6cd29 commit 2e11640

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+8703
-420
lines changed

manual_check

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ for cargo_toml in $(git ls-files '**/Cargo.toml'); do
1414
done
1515

1616
./setup.sh
17-
./encode_ceno.sh
18-
19-
# This one is expected to fail at the moment, but it's still useful to run:
17+
# ./encode_ceno.sh
2018
# ./verify_ceno.sh
19+
./test_poseidon.sh 1000

spartan_parallel/src/r1csinstance.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -492,11 +492,6 @@ impl<S: SpartanExtensionField + Send + Sync> R1CSInstance<S> {
492492

493493
// Group the instances based on number of variables, which are already orders of 2^4
494494
for i in 0..self.num_instances {
495-
println!(
496-
"I: {}, NUM_CONS: {}, NUM_VARS: {}",
497-
i, self.num_cons[i], self.num_vars[i]
498-
);
499-
500495
let var_len = self.num_vars[i];
501496
// A_list, B_list, C_list
502497
if let Some(index) = vars_size.get(&var_len) {

zok_tests/benchmarks/tests/compact_cert/compact_cert.input

Lines changed: 13 additions & 0 deletions
Large diffs are not rendered by default.

zok_tests/benchmarks/tests/compact_cert/compact_cert.witness

Lines changed: 174 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
from "./poseidon_struct.zok" import DoubleHash
2+
from "./poseidon2.zok" import poseidon2_batch2
3+
from "./poseidon3.zok" import poseidon3
4+
from "./poseidon5.zok" import poseidon5_batch2
5+
from "./merkle.zok" import MerkleProof, verify_merkle, verify_merkle_batch
6+
from "./schnorr.zok" import WIDTH, Point, DoublePoint, QuadPoint, PublicKey, Signature, verify_signature, point_add, point_mul, point_double_add_batch, point_mul_batch
7+
8+
// Reveal Proof Entry
9+
struct T {
10+
u32 i
11+
field[ro 5] s // sig_r_x, sig_r_y, sig_s, l, r
12+
field[ro 5] p // pk_p_x, pk_p_y, pk_q_x, pk_q_y, w
13+
}
14+
15+
struct CompactCertProof {
16+
field sig_root
17+
u64 signed_weight
18+
u32[ro 0] t_i_list
19+
field[ro 0][ro 5] t_p_list
20+
}
21+
22+
// Verifier of a compact certificate function
23+
def verifier(
24+
CompactCertProof compact_cert_proof,
25+
u64 proven_weight,
26+
u32 num_reveals,
27+
field message,
28+
u32 merkle_depth,
29+
field att_root,
30+
field[ro 0] coins
31+
) -> field:
32+
u64 signed_weight = compact_cert_proof.signed_weight
33+
assert(signed_weight > proven_weight)
34+
// let num_reveals: usize = (k + q).div_ceil((signed_weight / proven_weight).ilog2() as usize);
35+
36+
for u32 j in 0..num_reveals do
37+
// Reproduce coin
38+
// field[5] inputs = [(F)j, compact_cert_proof.sig_root, (F)proven_weight, message, att_root]
39+
// field coin_hash = poseidon(5, inputs)
40+
// field coin = coin_hash % (F)signed_weight
41+
field coin = coins[j]
42+
43+
u32 t_i = compact_cert_proof.t_i_list[j]
44+
field[ro 5] t_p = compact_cert_proof.t_p_list[j]
45+
witness field sig_r_x
46+
witness field sig_r_y
47+
witness field sig_s
48+
witness field l
49+
witness field r
50+
// Sig Opening & Att Opening
51+
assert(verify_merkle_batch(t_i, compact_cert_proof.sig_root, sig_r_x, sig_r_y, sig_s, l, r, att_root, t_p, merkle_depth) == 1)
52+
// Validity of signature
53+
PublicKey pk = PublicKey {
54+
p: Point { x: t_p[0], y: t_p[1] },
55+
q: Point { x: t_p[2], y: t_p[3] }
56+
}
57+
Signature sig = Signature {
58+
r: Point{ x: sig_r_x, y: sig_r_y },
59+
s: sig_s
60+
}
61+
assert(verify_signature(message, pk, sig) == 1)
62+
// L < coin <= L + Weight
63+
field t_p_4 = t_p[4]
64+
assert(l + t_p_4 == r)
65+
assert(l <= coin && coin < r)
66+
endfor
67+
68+
return 1
69+
70+
// Parse out the inputs in simple register - memory form
71+
def main(
72+
u32 num_attestors,
73+
// For compact_cert_proof
74+
field sig_root,
75+
u64 signed_weight,
76+
u32[ro 0] t_i_list,
77+
// All memory entries within T (p)
78+
field[ro 0] t_mem,
79+
// List of pointers (input format field[0])
80+
field[ro 0][ro 5] t_p_list,
81+
// For others
82+
u64 proven_weight,
83+
u32 num_reveals,
84+
field message,
85+
u32 merkle_depth,
86+
field att_root,
87+
field[ro 0] coins
88+
) -> field:
89+
CompactCertProof compact_cert_proof = CompactCertProof {
90+
sig_root: sig_root,
91+
signed_weight: signed_weight,
92+
t_i_list: t_i_list,
93+
t_p_list: t_p_list
94+
}
95+
96+
return verifier(
97+
compact_cert_proof,
98+
proven_weight,
99+
num_reveals,
100+
message,
101+
merkle_depth,
102+
att_root,
103+
coins
104+
)
105+
/*
106+
def main() -> u32:
107+
field message = 6908441180828167112785246881494320159273940089327447106269949444716788494909
108+
109+
// Let all attestors use the same pk & weight, does not affect performance
110+
u32 num_attestors = 8
111+
u32 weight = 5
112+
u32 proven_weight = num_attestors * weight - 1
113+
u32 signed_weight = num_attestors * weight
114+
array_decl PublicKey[num_attestors] pk_list
115+
array_decl Signature[num_attestors] sig_list
116+
// Constant folding to avoid constructing new blocks
117+
for u32 i in 0..8 do
118+
pk_list[i] = PublicKey {
119+
p: Point {
120+
x: 2023776050662786605020065854616777351003832247628992350849206310281785027488,
121+
y: 1079270832837170318396516616249394502719834190979906495690419930531357954746
122+
},
123+
q: Point {
124+
x: 7101684830137506950821434332972100736705268320764486193269722119377250644660,
125+
y: 1764840689618624173098512281158161439147043396136846829753116276022936136130
126+
}
127+
}
128+
sig_list[i] = Signature {
129+
r: Point {
130+
x: 5824293800188062938533237344790739102726705128562220570802448947038150657007,
131+
y: 340848841123394720212279364279745606262149681372696003943728267198931244360
132+
},
133+
s: 4415915127126372096757067153593537022657929051278082364476489088715040314973
134+
}
135+
endfor
136+
// Pre-compute merkle tree
137+
field att_l3 = 3568540802966646228682833257557760865097881745527951700421217637177394578913
138+
field att_l2 = 2484212816056817413898735043111201825935337234900653303346593633698983423094
139+
field att_l1 = 5903852974969142884799701163972075918012827147993384813454715036777418930530
140+
field att_root = 5370923878175693173927301385262983018969346333984379995904147798742460333298
141+
field[8] sig_l3 = [2143011384822392262595217693211276733745818975285573378412503830433633959080, 5158845522944913588713567773900368475672965537784145747547478088857012853666, 5894431764744941209369386797811063446586114379583965613751294306331542502696, 3667283647262791680030373214327691510807066264550220904438401348778560171091, 1932762137729700956492443572973924935698339638272997763907569306777878106609, 1418160613934592350074019113722063326372415219334378482966622875040143984418, 1123602082019234105093136610853837217580120360581368113294785447946335970166, 677162234791219704923474809188832072777286476135280817077786787139967839874]
142+
field[4] sig_l2 = [4160497668328416341124388728115946100594341504290452585444083838585144458368, 1786009993478681170835177129397965607571769106910016212295375778662767436399, 6323428707993845638065745016939134132792346703598261115088661703160553949516, 1179006504278106626617144731083403287975523722023953894416803973871305137607]
143+
field[2] sig_l1 = [2082031909420678479574926408191366694068435842853798548085170995138065656765, 2509162190273150374531803693747128200974026349740956653847078957273579771806]
144+
field sig_root = 2845540671766269799140204035187166219383492292318390575781563565945781070871
145+
u32 merkle_depth = 3
146+
147+
u32 num_reveals = 3
148+
// coin = [7, 30, 34]
149+
// entry = [1, 6, 6]
150+
// All bits in big endian
151+
bool[num_reveals][WIDTH] e_bits_list = [[false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, false, false, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, true, false, true, false, true, true, true, false, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true]; num_reveals]
152+
bool[num_reveals][WIDTH] s_bits_list = [[false, true, false, false, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, false, false, true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, true, true, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, true, true, true, false, true]; num_reveals]
153+
154+
CompactCertProof compact_cert_proof = CompactCertProof {
155+
sig_root: sig_root,
156+
signed_weight: signed_weight,
157+
t_list: [
158+
T {
159+
i: 1,
160+
i_bits: [false, false, true],
161+
s: [sig_list[1].r.x, sig_list[1].r.y, sig_list[1].s, 5, 10],
162+
pi_s: MerkleProof {
163+
path: [sig_l3[0], sig_l2[1], sig_l1[1]]
164+
},
165+
p: [pk_list[1].p.x, pk_list[1].p.y, pk_list[1].q.x, pk_list[1].q.y, (F)weight],
166+
pi_p: MerkleProof {
167+
path: [att_l3, att_l2, att_l1]
168+
}
169+
},
170+
T {
171+
i: 6,
172+
i_bits: [true, true, false],
173+
s: [sig_list[6].r.x, sig_list[6].r.y, sig_list[6].s, 30, 35],
174+
pi_s: MerkleProof {
175+
path: [sig_l3[7], sig_l2[2], sig_l1[0]]
176+
},
177+
p: [pk_list[6].p.x, pk_list[6].p.y, pk_list[6].q.x, pk_list[6].q.y, (F)weight],
178+
pi_p: MerkleProof {
179+
path: [att_l3, att_l2, att_l1]
180+
}
181+
},
182+
T {
183+
i: 6,
184+
i_bits: [true, true, false],
185+
s: [sig_list[6].r.x, sig_list[6].r.y, sig_list[6].s, 30, 35],
186+
pi_s: MerkleProof {
187+
path: [sig_l3[7], sig_l2[2], sig_l1[0]]
188+
},
189+
p: [pk_list[6].p.x, pk_list[6].p.y, pk_list[6].q.x, pk_list[6].q.y, (F)weight],
190+
pi_p: MerkleProof {
191+
path: [att_l3, att_l2, att_l1]
192+
}
193+
}
194+
]
195+
}
196+
197+
return verifier(
198+
compact_cert_proof,
199+
proven_weight,
200+
num_reveals,
201+
message,
202+
merkle_depth,
203+
att_root,
204+
e_bits_list,
205+
s_bits_list
206+
)
207+
*/
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from "./poseidon_struct.zok" import DoubleHash
2+
from "./poseidon2.zok" import poseidon2_batch2
3+
from "./poseidon5.zok" import poseidon5_batch2
4+
5+
// Merkle paths are now directly supplied as witnesses
6+
// struct MerkleProof {
7+
// // All internal nodes on the path
8+
// field[ro 0] path
9+
// }
10+
11+
// Perform two merkle tree verification together
12+
// Both tree are of the same size, opening the same index
13+
// Specifically built for compact certificate
14+
def verify_merkle_batch(
15+
u32 index,
16+
field root_0,
17+
field sig_r_x,
18+
field sig_r_y,
19+
field sig_s,
20+
field l,
21+
field r,
22+
field root_1,
23+
field[ro 5] entry_1,
24+
u32 depth
25+
) -> field:
26+
field index_assemb = 0
27+
// hash of leaf
28+
DoubleHash cur_nodes = poseidon5_batch2(sig_r_x, sig_r_y, sig_s, l, r, entry_1[0], entry_1[1], entry_1[2], entry_1[3], entry_1[4])
29+
field factor = 1
30+
// hash of internal nodes
31+
for u32 i in 0..depth do
32+
// Depending on index, cur_node and proof[i] will be on two sides of the inputs
33+
witness field next_bit
34+
assert(next_bit * (next_bit - 1) == 0)
35+
index_assemb = index_assemb + next_bit * factor
36+
factor = factor * 2
37+
witness field next_path
38+
field state1 = next_bit == 0 ? cur_nodes.hash0 : next_path
39+
field state2 = next_bit == 0 ? next_path : cur_nodes.hash0
40+
witness field next_path
41+
field state3 = next_bit == 0 ? cur_nodes.hash1 : next_path
42+
field state4 = next_bit == 0 ? next_path : cur_nodes.hash1
43+
cur_nodes = poseidon2_batch2(state1, state2, state3, state4)
44+
endfor
45+
assert(index_assemb == (F)index)
46+
assert(cur_nodes.hash0 == root_0)
47+
assert(cur_nodes.hash1 == root_1)
48+
return 1

0 commit comments

Comments
 (0)