Original HUSH source code based on ZEC 1.0.8 . For historical purposes only!
https://hush.is
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.6 KiB
76 lines
2.6 KiB
/**
|
|
*****************************************************************************
|
|
* @author This file is part of libsnark, developed by SCIPR Lab
|
|
* and contributors (see AUTHORS).
|
|
* @copyright MIT license (see LICENSE file)
|
|
*****************************************************************************/
|
|
|
|
#ifndef MERKLE_AUTHENTICATION_PATH_VARIABLE_TCC_
|
|
#define MERKLE_AUTHENTICATION_PATH_VARIABLE_TCC_
|
|
|
|
namespace libsnark {
|
|
|
|
template<typename FieldT, typename HashT>
|
|
merkle_authentication_path_variable<FieldT, HashT>::merkle_authentication_path_variable(protoboard<FieldT> &pb,
|
|
const size_t tree_depth,
|
|
const std::string &annotation_prefix) :
|
|
gadget<FieldT>(pb, annotation_prefix),
|
|
tree_depth(tree_depth)
|
|
{
|
|
for (size_t i = 0; i < tree_depth; ++i)
|
|
{
|
|
left_digests.emplace_back(digest_variable<FieldT>(pb, HashT::get_digest_len(), FMT(annotation_prefix, " left_digests_%zu", i)));
|
|
right_digests.emplace_back(digest_variable<FieldT>(pb, HashT::get_digest_len(), FMT(annotation_prefix, " right_digests_%zu", i)));
|
|
}
|
|
}
|
|
|
|
template<typename FieldT, typename HashT>
|
|
void merkle_authentication_path_variable<FieldT, HashT>::generate_r1cs_constraints()
|
|
{
|
|
for (size_t i = 0; i < tree_depth; ++i)
|
|
{
|
|
left_digests[i].generate_r1cs_constraints();
|
|
right_digests[i].generate_r1cs_constraints();
|
|
}
|
|
}
|
|
|
|
template<typename FieldT, typename HashT>
|
|
void merkle_authentication_path_variable<FieldT, HashT>::generate_r1cs_witness(const size_t address, const merkle_authentication_path &path)
|
|
{
|
|
assert(path.size() == tree_depth);
|
|
|
|
for (size_t i = 0; i < tree_depth; ++i)
|
|
{
|
|
if (address & (1ul << (tree_depth-1-i)))
|
|
{
|
|
left_digests[i].generate_r1cs_witness(path[i]);
|
|
}
|
|
else
|
|
{
|
|
right_digests[i].generate_r1cs_witness(path[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
template<typename FieldT, typename HashT>
|
|
merkle_authentication_path merkle_authentication_path_variable<FieldT, HashT>::get_authentication_path(const size_t address) const
|
|
{
|
|
merkle_authentication_path result;
|
|
for (size_t i = 0; i < tree_depth; ++i)
|
|
{
|
|
if (address & (1ul << (tree_depth-1-i)))
|
|
{
|
|
result.emplace_back(left_digests[i].get_digest());
|
|
}
|
|
else
|
|
{
|
|
result.emplace_back(right_digests[i].get_digest());
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
} // libsnark
|
|
|
|
#endif // MERKLE_AUTHENTICATION_PATH_VARIABLE_TCC
|
|
|