Skip to content

Commit b6fa261

Browse files
committed
add larger poseidon merkle tree example
1 parent 36befe1 commit b6fa261

File tree

5 files changed

+2140
-3
lines changed

5 files changed

+2140
-3
lines changed

examples/cpp/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ add_example_with_proving(arithmetics_cpp_example SOURCES arithmetics.cpp INPUT a
147147
add_example_with_proving(integer_arithmetics_cpp_example SOURCES integer_arithmetics.cpp INPUT integer_arithmetics.inp CURVE_TYPE pallas TBL_GEN_SPEED fast)
148148
add_example_with_proving(poseidon_cpp_example SOURCES poseidon.cpp INPUT poseidon.inp CURVE_TYPE pallas TBL_GEN_SPEED fast)
149149
add_example_with_proving_and_recursion(merkle_tree_poseidon_cpp_example SOURCES merkle_tree_poseidon.cpp INPUT merkle_tree_poseidon.inp CURVE_TYPE pallas TBL_GEN_SPEED fast)
150+
# add_example_with_proving(merkle_tree_poseidon_large_cpp_example SOURCES merkle_tree_poseidon_large.cpp INPUT merkle_tree_poseidon_large.inp CURVE_TYPE pallas TBL_GEN_SPEED fast)
150151
add_example_with_proving(merkle_poseidon_1prover_cpp_example SOURCES merkle_poseidon_1prover.cpp INPUT merkle_poseidon_1prover_public.inp PRIVATE_INPUT merkle_poseidon_1prover_private.inp CURVE_TYPE pallas TBL_GEN_SPEED fast)
151152
add_example_with_proving(merkle_poseidon_2provers_cpp_example SOURCES merkle_poseidon_2provers.cpp INPUT merkle_poseidon_2provers_public.inp PRIVATE_INPUT merkle_poseidon_2provers_private.inp CURVE_TYPE pallas MAX_NUM_PROVERS 2 TBL_GEN_SPEED fast)
152153
add_example_with_proving_and_recursion(merkle_poseidon_3provers_cpp_example SOURCES merkle_poseidon_3provers.cpp INPUT merkle_poseidon_3provers_public.inp PRIVATE_INPUT merkle_poseidon_3provers_private.inp CURVE_TYPE pallas MAX_NUM_PROVERS 3 TBL_GEN_SPEED fast)

examples/cpp/merkle_tree_poseidon.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ using namespace nil::crypto3::algebra::curves;
77

88
[[circuit]] pallas::base_field_type::value_type merkle_tree_poseidon (
99
std::array<typename pallas::base_field_type::value_type, 0x20> layer_0_leaves) {
10-
10+
1111
std::array<typename pallas::base_field_type::value_type, 0x10> layer_1_leaves;
1212
std::size_t layer_1_size = 0x10;
1313
std::array<typename pallas::base_field_type::value_type, 0x8> layer_2_leaves;
@@ -41,4 +41,4 @@ using namespace nil::crypto3::algebra::curves;
4141
root = hash<hashes::poseidon>(layer_4_leaves[0], layer_4_leaves[1]);
4242

4343
return root;
44-
}
44+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
2+
#include <nil/crypto3/hash/algorithm/hash.hpp>
3+
#include <nil/crypto3/hash/poseidon.hpp>
4+
5+
using namespace nil::crypto3;
6+
using namespace nil::crypto3::algebra::curves;
7+
8+
[[circuit]] pallas::base_field_type::value_type merkle_tree_poseidon (
9+
std::array<typename pallas::base_field_type::value_type, 0x800> input) {
10+
11+
std::array<typename pallas::base_field_type::value_type, 0x400> layer_400_leaves;
12+
std::size_t layer_400_size = 0x400;
13+
std::array<typename pallas::base_field_type::value_type, 0x200> layer_200_leaves;
14+
std::size_t layer_200_size = 0x200;
15+
std::array<typename pallas::base_field_type::value_type, 0x100> layer_100_leaves;
16+
std::size_t layer_100_size = 0x100;
17+
std::array<typename pallas::base_field_type::value_type, 0x080> layer_080_leaves;
18+
std::size_t layer_080_size = 0x080;
19+
std::array<typename pallas::base_field_type::value_type, 0x040> layer_040_leaves;
20+
std::size_t layer_040_size = 0x040;
21+
std::array<typename pallas::base_field_type::value_type, 0x020> layer_020_leaves;
22+
std::size_t layer_020_size = 0x020;
23+
std::array<typename pallas::base_field_type::value_type, 0x010> layer_010_leaves;
24+
std::size_t layer_010_size = 0x010;
25+
std::array<typename pallas::base_field_type::value_type, 0x008> layer_008_leaves;
26+
std::size_t layer_008_size = 0x008;
27+
std::array<typename pallas::base_field_type::value_type, 0x004> layer_004_leaves;
28+
std::size_t layer_004_size = 0x004;
29+
std::array<typename pallas::base_field_type::value_type, 0x002> layer_002_leaves;
30+
std::size_t layer_002_size = 0x002;
31+
typename pallas::base_field_type::value_type root;
32+
33+
34+
for (std::size_t leaf_index = 0; leaf_index < layer_400_size; leaf_index++) {
35+
layer_400_leaves[leaf_index] =
36+
hash<hashes::poseidon>(input[2 * leaf_index], input[2 * leaf_index + 1]);
37+
}
38+
39+
for (std::size_t leaf_index = 0; leaf_index < layer_200_size; leaf_index++) {
40+
layer_200_leaves[leaf_index] =
41+
hash<hashes::poseidon>(layer_400_leaves[2 * leaf_index], layer_400_leaves[2 * leaf_index + 1]);
42+
}
43+
44+
for (std::size_t leaf_index = 0; leaf_index < layer_100_size; leaf_index++) {
45+
layer_100_leaves[leaf_index] =
46+
hash<hashes::poseidon>(layer_200_leaves[2 * leaf_index], layer_200_leaves[2 * leaf_index + 1]);
47+
}
48+
49+
for (std::size_t leaf_index = 0; leaf_index < layer_080_size; leaf_index++) {
50+
layer_080_leaves[leaf_index] =
51+
hash<hashes::poseidon>(layer_100_leaves[2 * leaf_index], layer_100_leaves[2 * leaf_index + 1]);
52+
}
53+
54+
for (std::size_t leaf_index = 0; leaf_index < layer_040_size; leaf_index++) {
55+
layer_040_leaves[leaf_index] =
56+
hash<hashes::poseidon>(layer_080_leaves[2 * leaf_index], layer_080_leaves[2 * leaf_index + 1]);
57+
}
58+
59+
for (std::size_t leaf_index = 0; leaf_index < layer_020_size; leaf_index++) {
60+
layer_020_leaves[leaf_index] =
61+
hash<hashes::poseidon>(layer_040_leaves[2 * leaf_index], layer_040_leaves[2 * leaf_index + 1]);
62+
}
63+
64+
for (std::size_t leaf_index = 0; leaf_index < layer_010_size; leaf_index++) {
65+
layer_010_leaves[leaf_index] =
66+
hash<hashes::poseidon>(layer_020_leaves[2 * leaf_index], layer_020_leaves[2 * leaf_index + 1]);
67+
}
68+
69+
for (std::size_t leaf_index = 0; leaf_index < layer_008_size; leaf_index++) {
70+
layer_008_leaves[leaf_index] =
71+
hash<hashes::poseidon>(layer_010_leaves[2 * leaf_index], layer_010_leaves[2 * leaf_index + 1]);
72+
}
73+
74+
for (std::size_t leaf_index = 0; leaf_index < layer_004_size; leaf_index++) {
75+
layer_004_leaves[leaf_index] =
76+
hash<hashes::poseidon>(layer_008_leaves[2 * leaf_index], layer_008_leaves[2 * leaf_index + 1]);
77+
}
78+
79+
for (std::size_t leaf_index = 0; leaf_index < layer_002_size; leaf_index++) {
80+
layer_002_leaves[leaf_index] =
81+
hash<hashes::poseidon>(layer_004_leaves[2 * leaf_index], layer_004_leaves[2 * leaf_index + 1]);
82+
}
83+
84+
typename pallas::base_field_type::value_type real_root = hash<hashes::poseidon>(layer_002_leaves[0], layer_002_leaves[1]);
85+
return real_root;
86+
}

examples/inputs/merkle_tree_poseidon.inp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
{"field":29},
3131
{"field":30},
3232
{"field":31},
33-
{"field":32}] } ]
33+
{"field":32}] } ]

0 commit comments

Comments
 (0)