Skip to content

Commit 6bc6434

Browse files
committed
add poseidon merkle tree test #584
1 parent 7679c02 commit 6bc6434

File tree

4 files changed

+2189
-2
lines changed

4 files changed

+2189
-2
lines changed

tests/cpp/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ add_zkllvm_unit_test("algebra/fields/pallas_arithmetics/loop")
216216
add_zkllvm_unit_test("algebra/fields/pallas_arithmetics/mul")
217217
add_zkllvm_unit_test("algebra/fields/pallas_arithmetics/sub")
218218

219-
# add_zkllvm_unit_test("algebra/fields/private_input/private_input_add")
219+
add_zkllvm_unit_test("algebra/fields/private_input/private_input_add")
220220
add_zkllvm_unit_test("algebra/fields/conversion/itogf_pallas")
221221

222222
# int tests
@@ -252,6 +252,7 @@ add_zkllvm_unit_test("libc/memset/memset")
252252
# hashes
253253
add_zkllvm_unit_test("hashes/sha256/sha2_256")
254254
add_zkllvm_unit_test("hashes/poseidon/poseidon")
255+
add_zkllvm_unit_test("hashes/merkle_tree/poseidon/0x800_inputs/test")
255256

256257
# recursive prover tests
257258
add_zkllvm_unit_test("algebra/recursive_prover/fri_lin_inter/fri_lin_inter")

tests/cpp/algebra/fields/private_input/private_input_add.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ int main (int argc, char *argv[]){
4444

4545

4646
using BlueprintFieldType = typename pallas::base_field_type;
47-
typename BlueprintFieldType::value_type a = read_field <BlueprintFieldType>(pubic_input_json, 0);
47+
typename BlueprintFieldType::value_type a = read_field <BlueprintFieldType>(public_input_json, 0);
4848
typename BlueprintFieldType::value_type b = read_field <BlueprintFieldType>(private_input_json, 0);
4949

5050
pallas_field_add(a, b);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#ifndef __ZKLLVM__
2+
#include "../../../../read_boost_json.hpp"
3+
#include <cstdint>
4+
#include <fstream>
5+
#endif
6+
7+
#include <nil/crypto3/hash/algorithm/hash.hpp>
8+
#include <nil/crypto3/hash/poseidon.hpp>
9+
10+
using namespace nil::crypto3;
11+
using namespace nil::crypto3::algebra::curves;
12+
13+
typename pallas::base_field_type::value_type calculate_hash(
14+
typename pallas::base_field_type::value_type a,
15+
typename pallas::base_field_type::value_type b
16+
) {
17+
#ifdef __ZKLLVM__
18+
return hash<hashes::poseidon> (a, b);
19+
#else
20+
using poseidon_policy = nil::crypto3::hashes::detail::mina_poseidon_policy<typename pallas::base_field_type>;
21+
using permutation_type = nil::crypto3::hashes::detail::poseidon_permutation<poseidon_policy>;
22+
using state_type = typename permutation_type::state_type;
23+
24+
state_type state;
25+
state[0] = 0;
26+
state[1] = a;
27+
state[2] = b;
28+
permutation_type::permute(state);
29+
return state[2];
30+
#endif
31+
}
32+
33+
34+
[[circuit]] typename pallas::base_field_type::value_type merkle_tree_poseidon (
35+
std::array<typename pallas::base_field_type::value_type, 0x800> input) {
36+
37+
std::array<typename pallas::base_field_type::value_type, 0x400> layer_400_leaves;
38+
std::size_t layer_400_size = 0x400;
39+
std::array<typename pallas::base_field_type::value_type, 0x200> layer_200_leaves;
40+
std::size_t layer_200_size = 0x200;
41+
std::array<typename pallas::base_field_type::value_type, 0x100> layer_100_leaves;
42+
std::size_t layer_100_size = 0x100;
43+
std::array<typename pallas::base_field_type::value_type, 0x080> layer_080_leaves;
44+
std::size_t layer_080_size = 0x080;
45+
std::array<typename pallas::base_field_type::value_type, 0x040> layer_040_leaves;
46+
std::size_t layer_040_size = 0x040;
47+
std::array<typename pallas::base_field_type::value_type, 0x020> layer_020_leaves;
48+
std::size_t layer_020_size = 0x020;
49+
std::array<typename pallas::base_field_type::value_type, 0x010> layer_010_leaves;
50+
std::size_t layer_010_size = 0x010;
51+
std::array<typename pallas::base_field_type::value_type, 0x008> layer_008_leaves;
52+
std::size_t layer_008_size = 0x008;
53+
std::array<typename pallas::base_field_type::value_type, 0x004> layer_004_leaves;
54+
std::size_t layer_004_size = 0x004;
55+
std::array<typename pallas::base_field_type::value_type, 0x002> layer_002_leaves;
56+
std::size_t layer_002_size = 0x002;
57+
typename pallas::base_field_type::value_type root;
58+
59+
60+
for (std::size_t leaf_index = 0; leaf_index < layer_400_size; leaf_index++) {
61+
layer_400_leaves[leaf_index] =
62+
calculate_hash(input[2 * leaf_index], input[2 * leaf_index + 1]);
63+
}
64+
65+
for (std::size_t leaf_index = 0; leaf_index < layer_200_size; leaf_index++) {
66+
layer_200_leaves[leaf_index] =
67+
calculate_hash(layer_400_leaves[2 * leaf_index], layer_400_leaves[2 * leaf_index + 1]);
68+
}
69+
70+
for (std::size_t leaf_index = 0; leaf_index < layer_100_size; leaf_index++) {
71+
layer_100_leaves[leaf_index] =
72+
calculate_hash(layer_200_leaves[2 * leaf_index], layer_200_leaves[2 * leaf_index + 1]);
73+
}
74+
75+
for (std::size_t leaf_index = 0; leaf_index < layer_080_size; leaf_index++) {
76+
layer_080_leaves[leaf_index] =
77+
calculate_hash(layer_100_leaves[2 * leaf_index], layer_100_leaves[2 * leaf_index + 1]);
78+
}
79+
80+
for (std::size_t leaf_index = 0; leaf_index < layer_040_size; leaf_index++) {
81+
layer_040_leaves[leaf_index] =
82+
calculate_hash(layer_080_leaves[2 * leaf_index], layer_080_leaves[2 * leaf_index + 1]);
83+
}
84+
85+
for (std::size_t leaf_index = 0; leaf_index < layer_020_size; leaf_index++) {
86+
layer_020_leaves[leaf_index] =
87+
calculate_hash(layer_040_leaves[2 * leaf_index], layer_040_leaves[2 * leaf_index + 1]);
88+
}
89+
90+
for (std::size_t leaf_index = 0; leaf_index < layer_010_size; leaf_index++) {
91+
layer_010_leaves[leaf_index] =
92+
calculate_hash(layer_020_leaves[2 * leaf_index], layer_020_leaves[2 * leaf_index + 1]);
93+
}
94+
95+
for (std::size_t leaf_index = 0; leaf_index < layer_008_size; leaf_index++) {
96+
layer_008_leaves[leaf_index] =
97+
calculate_hash(layer_010_leaves[2 * leaf_index], layer_010_leaves[2 * leaf_index + 1]);
98+
}
99+
100+
for (std::size_t leaf_index = 0; leaf_index < layer_004_size; leaf_index++) {
101+
layer_004_leaves[leaf_index] =
102+
calculate_hash(layer_008_leaves[2 * leaf_index], layer_008_leaves[2 * leaf_index + 1]);
103+
}
104+
105+
for (std::size_t leaf_index = 0; leaf_index < layer_002_size; leaf_index++) {
106+
layer_002_leaves[leaf_index] =
107+
calculate_hash(layer_004_leaves[2 * leaf_index], layer_004_leaves[2 * leaf_index + 1]);
108+
}
109+
110+
typename pallas::base_field_type::value_type real_root = calculate_hash(layer_002_leaves[0], layer_002_leaves[1]);
111+
#ifndef __ZKLLVM__
112+
std::cout << real_root.data << std::endl;
113+
#endif
114+
return real_root;
115+
}
116+
117+
118+
#ifndef __ZKLLVM__
119+
120+
int main (int argc, char *argv[]){
121+
if (argc != 2) {
122+
std::cerr << "one command line argument must be provided\n";
123+
std::abort();
124+
}
125+
126+
boost::json::value input_json = read_boost_json(std::string(argv[1]));
127+
128+
using BlueprintFieldType = typename pallas::base_field_type;
129+
130+
std::array<typename BlueprintFieldType::value_type, 0x800> inp = read_array_field <BlueprintFieldType, 0x800>(input_json, 0);
131+
132+
merkle_tree_poseidon(inp);
133+
134+
return 0;
135+
}
136+
#endif

0 commit comments

Comments
 (0)