Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
mariogemoll committed Feb 14, 2019
1 parent 1aa1e0c commit 918a13d
Show file tree
Hide file tree
Showing 43 changed files with 2,128 additions and 55 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1,3 +1,4 @@
.idea
.vscode .vscode
*.pyc *.pyc
/data /data
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Expand Up @@ -4,3 +4,6 @@
[submodule "cpp/depends/gtest"] [submodule "cpp/depends/gtest"]
path = cpp/depends/gtest path = cpp/depends/gtest
url = https://github.com/google/googletest.git url = https://github.com/google/googletest.git
[submodule "cpp/depends/zcash"]
path = cpp/depends/zcash
url = https://github.com/zcash/zcash.git
3 changes: 3 additions & 0 deletions cpp/CMakeLists.txt
Expand Up @@ -97,7 +97,10 @@ else()
add_definitions(-DNO_PROCPS) add_definitions(-DNO_PROCPS)
endif() endif()


add_definitions(-DNDEBUG=0)

include_directories(.) include_directories(.)


add_subdirectory(depends) add_subdirectory(depends)
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(test)
2 changes: 1 addition & 1 deletion cpp/depends/CMakeLists.txt
@@ -1 +1 @@
add_subdirectory(libsnark) add_subdirectory(libsnark)
79 changes: 78 additions & 1 deletion cpp/src/CMakeLists.txt
Expand Up @@ -34,4 +34,81 @@ target_include_directories(
${DEPENDS_DIR}/libsnark/depends/libfqfft ${DEPENDS_DIR}/libsnark/depends/libfqfft
) )


add_subdirectory(examples) add_executable(
circuit_test

circuit_test.cpp
serialization.cpp
MerkleTree.cpp
../depends/zcash/src/zcash/Address.cpp
../depends/zcash/src/zcash/prf.cpp
../depends/zcash/src/zcash/NoteEncryption.cpp
../depends/zcash/src/zcash/Note.cpp
../depends/zcash/src/zcash/util.cpp
../depends/zcash/src/support/cleanse.cpp
../depends/zcash/src/crypto/sha256.cpp
../depends/zcash/src/uint256.cpp
../depends/zcash/src/utilstrencodings.cpp
)
target_link_libraries(
circuit_test

snark
sodium
)
target_include_directories(
circuit_test

PUBLIC
${DEPENDS_DIR}/libsnark
${DEPENDS_DIR}/libsnark/depends/libfqfft
)

add_executable(
playground

playground.cpp
crypto/sha256.cpp
)
target_link_libraries(
playground

snark
)
target_include_directories(
playground

PUBLIC
${DEPENDS_DIR}/libsnark
${DEPENDS_DIR}/libsnark/depends/libff
${DEPENDS_DIR}/libsnark/depends/libfqfft
)

add_subdirectory(examples)
include_directories(.)
add_library(zktrade "")

target_sources(
zktrade

PRIVATE
util.cpp
crypto/sha256.cpp
hash/sha256_compression.cpp
prfs.cpp
PUBLIC
prfs.h
util.h
circuitry/gadgets/prfs.h
hash/sha256_compression.h
)

target_include_directories(
zktrade

PUBLIC
.
${DEPENDS_DIR}/libsnark
${DEPENDS_DIR}/libsnark/depends/libff
${DEPENDS_DIR}/libsnark/depends/libfqfft
)
45 changes: 23 additions & 22 deletions cpp/src/MerkleTree.cpp
Expand Up @@ -41,11 +41,12 @@ bool returnFalse() {
MerkleTree::MerkleTree(size_t d) : MerkleTree::MerkleTree(size_t d) :
depth{d} depth{d}
{ {
cout << "MT CONSTRUCTOR" << endl;
max_size = exp2(depth); max_size = exp2(depth);
empty_tree_roots = new bit_vector[depth]; empty_tree_roots = new bit_vector[depth];
node_levels = new vector<bit_vector>[depth]; node_levels = new vector<bit_vector>[depth];
leaves = new vector<bit_vector>(); leaves = new vector<bit_vector>();
for (size_t i = 0; i < depth; i++) { for (uint i = 0; i < depth; i++) {
bit_vector prev; bit_vector prev;
if (i == 0) { if (i == 0) {
prev = all_zeros; prev = all_zeros;
Expand All @@ -61,25 +62,25 @@ bit_vector MerkleTree::root() {
return node_levels[depth - 1][0]; return node_levels[depth - 1][0];
} }


size_t MerkleTree::num_elements() { uint MerkleTree::num_elements() {
return leaves->size(); return leaves->size();
} }


bit_vector MerkleTree::operator[](size_t i) { bit_vector MerkleTree::operator[](uint i) {
return leaves->at(i); return leaves->at(i);
} }


size_t MerkleTree::add(bit_vector leaf) { uint MerkleTree::add(bit_vector leaf) {
const size_t address = leaves->size(); const uint address = leaves->size();
if (leaves->size() >= max_size) { if (leaves->size() >= max_size) {
throw overflow_error("Tree is full"); throw overflow_error("Tree is full");
} }
leaves->push_back(leaf); leaves->push_back(leaf);
size_t prev_level_pos = address; uint prev_level_pos = address;
for (size_t level = 0; level < depth; level++) { for (uint level = 0; level < depth; level++) {
// First we need to find out which element at the current level gets updated // First we need to find out which element at the current level gets updated
// (position at previous level divided by 2). // (position at previous level divided by 2).
const size_t pos = prev_level_pos / 2; const uint pos = prev_level_pos / 2;
// We store the values of all the nodes, however most of them will only have // We store the values of all the nodes, however most of them will only have
// empty subtrees and therefore have the standard values. We only need to // empty subtrees and therefore have the standard values. We only need to
// store the actually computed hash values. On each level these will grow // store the actually computed hash values. On each level these will grow
Expand Down Expand Up @@ -115,10 +116,10 @@ size_t MerkleTree::add(bit_vector leaf) {
return address; return address;
} }


vector<bit_vector> MerkleTree::path(size_t address) { vector<bit_vector> MerkleTree::path(uint address) {
vector<bit_vector> p; vector<bit_vector> p;
size_t prev_pos; uint prev_pos;
for (size_t row = 0; row < depth; row++) { for (uint row = 0; row < depth; row++) {
bit_vector sibling; bit_vector sibling;
if (row == 0) { if (row == 0) {
if (address % 2) { if (address % 2) {
Expand All @@ -129,7 +130,7 @@ vector<bit_vector> MerkleTree::path(size_t address) {
} }
prev_pos = address; prev_pos = address;
} else { } else {
size_t pos = prev_pos / 2; uint pos = prev_pos / 2;
if (pos % 2) { if (pos % 2) {
// right side // right side
sibling = internal_node_at(row, pos - 1); sibling = internal_node_at(row, pos - 1);
Expand All @@ -143,12 +144,12 @@ vector<bit_vector> MerkleTree::path(size_t address) {
return p; return p;
} }


tuple<size_t, bit_vector, vector<bit_vector>> MerkleTree::simulate_add(bit_vector leaf) { tuple<uint, bit_vector, vector<bit_vector>> MerkleTree::simulate_add(bit_vector leaf) {
size_t address = leaves->size(); uint address = leaves->size();
vector<bit_vector> p; vector<bit_vector> p;
size_t prev_pos; uint prev_pos;
bit_vector prev_hash; bit_vector prev_hash;
for (size_t row = 0; row < depth; row++) { for (uint row = 0; row < depth; row++) {
bit_vector sibling; bit_vector sibling;
bit_vector hash; bit_vector hash;
if (row == 0) { if (row == 0) {
Expand All @@ -162,7 +163,7 @@ tuple<size_t, bit_vector, vector<bit_vector>> MerkleTree::simulate_add(bit_vecto
} }
prev_pos = address; prev_pos = address;
} else { } else {
size_t pos = prev_pos / 2; uint pos = prev_pos / 2;
if (pos % 2) { if (pos % 2) {
// right side // right side
sibling = internal_node_at(row, pos - 1); sibling = internal_node_at(row, pos - 1);
Expand All @@ -180,7 +181,7 @@ tuple<size_t, bit_vector, vector<bit_vector>> MerkleTree::simulate_add(bit_vecto
return make_tuple(address, prev_hash, p); return make_tuple(address, prev_hash, p);
} }


bit_vector MerkleTree::internal_node_at(size_t row, size_t pos) { bit_vector MerkleTree::internal_node_at(uint row, uint pos) {
if (row == 0) { if (row == 0) {
if (pos + 1 <= leaves->size()) { if (pos + 1 <= leaves->size()) {
return leaves->at(pos); return leaves->at(pos);
Expand All @@ -189,7 +190,7 @@ bit_vector MerkleTree::internal_node_at(size_t row, size_t pos) {
} }
} else { } else {
// row 0 is the leaves, row 1 is (node_level) level 0 etc. // row 0 is the leaves, row 1 is (node_level) level 0 etc.
size_t level = row - 1; uint level = row - 1;
if (pos + 1 <= node_levels[level].size()) { if (pos + 1 <= node_levels[level].size()) {
return node_levels[level][pos]; return node_levels[level][pos];
} else { } else {
Expand All @@ -200,8 +201,8 @@ bit_vector MerkleTree::internal_node_at(size_t row, size_t pos) {


void MerkleTree::print() { void MerkleTree::print() {
for (int level = depth - 1; level >= 0; level--) { for (int level = depth - 1; level >= 0; level--) {
size_t num_elems = exp2(depth - level - 1); uint num_elems = exp2(depth - level - 1);
for (size_t pos = 0; pos < num_elems; pos++) { for (uint pos = 0; pos < num_elems; pos++) {
if (node_levels[level].size() - 1 >= pos) { if (node_levels[level].size() - 1 >= pos) {
printnode(node_levels[level][pos]); printnode(node_levels[level][pos]);
} else { } else {
Expand All @@ -210,7 +211,7 @@ void MerkleTree::print() {
} }
cout << endl; cout << endl;
} }
for (size_t pos = 0; pos < max_size; pos++) { for (uint pos = 0; pos < max_size; pos++) {
if (leaves->size() - 1 >= pos) { if (leaves->size() - 1 >= pos) {
printnode(leaves->at(pos)); printnode(leaves->at(pos));
} else { } else {
Expand Down
14 changes: 7 additions & 7 deletions cpp/src/MerkleTree.hpp
Expand Up @@ -4,17 +4,17 @@ class MerkleTree {
public: public:
MerkleTree(size_t depth); MerkleTree(size_t depth);
libff::bit_vector root(); libff::bit_vector root();
libff::bit_vector operator[](size_t i); libff::bit_vector operator[](uint i);
size_t add(libff::bit_vector leaf); uint add(libff::bit_vector leaf);
std::tuple<size_t, libff::bit_vector, std::vector<libff::bit_vector>> simulate_add(libff::bit_vector leaf); std::tuple<uint, libff::bit_vector, std::vector<libff::bit_vector>> simulate_add(libff::bit_vector leaf);
size_t num_elements(); uint num_elements();
std::vector<libff::bit_vector> path(size_t address); std::vector<libff::bit_vector> path(uint address);
void print(); void print();
private: private:
std::vector<libff::bit_vector>* node_levels; std::vector<libff::bit_vector>* node_levels;
libff::bit_vector* empty_tree_roots; libff::bit_vector* empty_tree_roots;
std::vector<libff::bit_vector>* leaves; std::vector<libff::bit_vector>* leaves;
size_t depth; size_t depth;
size_t max_size; uint max_size;
libff::bit_vector internal_node_at(size_t level, size_t position); libff::bit_vector internal_node_at(uint level, uint position);
}; };

0 comments on commit 918a13d

Please sign in to comment.