Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
r1cs_variable_assignment_serialization.tcc
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
5 #ifndef __ZETH_SERIALIZATION_R1CS_VARIABLE_ASSIGNMENT_SERIALIZATION_TCC__
6 #define __ZETH_SERIALIZATION_R1CS_VARIABLE_ASSIGNMENT_SERIALIZATION_TCC__
7 
8 #include "libzeth/core/field_element_utils.hpp"
9 #include "libzeth/serialization/r1cs_variable_assignment_serialization.hpp"
10 #include "libzeth/serialization/stream_utils.hpp"
11 
12 namespace libzeth
13 {
14 
15 template<typename FieldT>
16 void r1cs_variable_assignment_read_bytes(
17  libsnark::r1cs_variable_assignment<FieldT> &assignment, std::istream &in_s)
18 {
19  collection_read_bytes<
20  libsnark::r1cs_variable_assignment<FieldT>,
21  field_element_read_bytes<FieldT>>(assignment, in_s);
22 }
23 
24 template<typename FieldT>
25 void r1cs_variable_assignment_read_bytes(
26  libsnark::r1cs_primary_input<FieldT> &primary,
27  libsnark::r1cs_auxiliary_input<FieldT> &auxiliary,
28  const size_t primary_input_size,
29  std::istream &in_s)
30 {
31  // Manually read the collection size, compute the primary and auxiliary
32  // sizes and read into the separate arrays.
33  const size_t n = read_bytes<size_t>(in_s);
34  if (n < primary_input_size) {
35  throw std::length_error(
36  "assignment length smaller than primary input size");
37  }
38 
39  primary.clear();
40  collection_n_read_bytes<
41  libsnark::r1cs_primary_input<FieldT>,
42  field_element_read_bytes<FieldT>>(primary, primary_input_size, in_s);
43 
44  auxiliary.clear();
45  collection_n_read_bytes<
46  libsnark::r1cs_auxiliary_input<FieldT>,
47  field_element_read_bytes<FieldT>>(
48  auxiliary, n - primary_input_size, in_s);
49 }
50 
51 template<typename FieldT>
52 void r1cs_variable_assignment_write_bytes(
53  const libsnark::r1cs_variable_assignment<FieldT> &assignment,
54  std::ostream &out_s)
55 {
56  collection_write_bytes<
57  libsnark::r1cs_variable_assignment<FieldT>,
58  field_element_write_bytes<FieldT>>(assignment, out_s);
59 }
60 
61 template<typename FieldT>
62 void r1cs_variable_assignment_write_bytes(
63  const libsnark::r1cs_primary_input<FieldT> &primary,
64  const libsnark::r1cs_auxiliary_input<FieldT> &auxiliary,
65  std::ostream &out_s)
66 {
67  // Manually write out the aggregation of primary and auxiliary as a single
68  // collection.
69  const size_t total_size = primary.size() + auxiliary.size();
70  write_bytes(total_size, out_s);
71  collection_n_write_bytes<
72  libsnark::r1cs_primary_input<FieldT>,
73  field_element_write_bytes>(primary, primary.size(), out_s);
74  collection_n_write_bytes<
75  libsnark::r1cs_primary_input<FieldT>,
76  field_element_write_bytes>(auxiliary, auxiliary.size(), out_s);
77 }
78 
79 } // namespace libzeth
80 
81 #endif // __ZETH_SERIALIZATION_R1CS_VARIABLE_ASSIGNMENT_SERIALIZATION_TCC__