From fcb5613755b08fcb7ae73a3826b1cdce40e2747f Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Sun, 27 Oct 2024 01:53:18 -0300 Subject: State of the world with Merkle Tree composition of files (#2) * file state hash calculation with history on replace and insert * add state transitions with linear hashing * add test * format dune files * nix format * delete shared flake * disable fmt check on flake * add nix formatter to flake shell --- shared/librelational_engine/library.cpp | 47 +++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'shared/librelational_engine/library.cpp') diff --git a/shared/librelational_engine/library.cpp b/shared/librelational_engine/library.cpp index 8048486..cab8f93 100644 --- a/shared/librelational_engine/library.cpp +++ b/shared/librelational_engine/library.cpp @@ -2,8 +2,51 @@ #include #include #include +#include +#include + +#include + +std::vector read_tree(const char* tree_path) { + std::ifstream file(tree_path, std::ios::binary); + file.unsetf(std::ios::skipws); + file.seekg(0, std::ios::end); + const std::streampos file_size = file.tellg(); + file.seekg(0, std::ios::beg); + std::vector v; + v.reserve(file_size); + v.insert(v.begin(), std::istream_iterator(file), std::istream_iterator()); + return v; +} + +void write_tree(const char* tree_path, const std::vector& serialized_tree) { + std::ofstream out(tree_path, std::ios::out | std::ios::binary); + out.write(reinterpret_cast(serialized_tree.data()), serialized_tree.size()); + out.close(); +} + extern "C" { #include "library.h" + extern void register_to_merkle(const char* tree_path, const char* computed_hash) { + struct stat st; + if (stat(tree_path, &st) == 0) { + const std::vector tree_bytes = read_tree(tree_path); + merkle::Tree tree; + tree.deserialise(tree_bytes); + const merkle::Tree::Hash hash(computed_hash); + tree.insert(hash); + std::vector target; + tree.serialise(target); + write_tree(tree_path, target); + } else { + merkle::Tree::Hash hash(computed_hash); + merkle::Tree tree; + tree.insert(hash); + std::vector target; + tree.serialise(target); + write_tree(tree_path, target); + } + } extern void merkle_generate_root(char** hashes, const int n, char* root) { merkle::Tree tree; for (int i = 0; i < n; i++){ @@ -23,8 +66,8 @@ extern "C" { ss << std::hex << std::setw(2) << std::setfill('0') << static_cast(hash[i]); std::memcpy(computed_hash, ss.str().c_str(), HASH_SIZE); - std::cout << "⚙️ COMPUTED HASH: " << computed_hash << std::endl; + // std::cout << "⚙️ COMPUTED HASH: " << computed_hash << std::endl; } extern int trash() { return 100; } -} \ No newline at end of file +} -- cgit v1.2.3