Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
trace_lines.tcc
Go to the documentation of this file.
1 /** @file
2  *****************************************************************************
3 
4  Implementation of interfaces for trace-line variables.
5 
6  See trace_lines.hpp .
7 
8  *****************************************************************************
9  * @author This file is part of libsnark, developed by SCIPR Lab
10  * and contributors (see AUTHORS).
11  * @copyright MIT license (see LICENSE file)
12  *****************************************************************************/
13 
14 #ifndef TRACE_LINES_TCC_
15 #define TRACE_LINES_TCC_
16 
17 namespace libsnark
18 {
19 
20 template<typename ramT>
21 memory_line_variable_gadget<ramT>::memory_line_variable_gadget(
22  ram_protoboard<ramT> &pb,
23  const size_t timestamp_size,
24  const ram_architecture_params<ramT> &ap,
25  const std::string &annotation_prefix)
26  : ram_gadget_base<ramT>(pb, annotation_prefix)
27 {
28  const size_t address_size = ap.address_size();
29  const size_t value_size = ap.value_size();
30 
31  timestamp.reset(new dual_variable_gadget<FieldT>(
32  pb, timestamp_size, FMT(this->annotation_prefix, " timestamp")));
33  address.reset(new dual_variable_gadget<FieldT>(
34  pb, address_size, FMT(this->annotation_prefix, " address")));
35  contents_before.reset(new dual_variable_gadget<FieldT>(
36  pb, value_size, FMT(this->annotation_prefix, " contents_before")));
37  contents_after.reset(new dual_variable_gadget<FieldT>(
38  pb, value_size, FMT(this->annotation_prefix, " contents_after")));
39 }
40 
41 template<typename ramT>
42 void memory_line_variable_gadget<ramT>::generate_r1cs_constraints(
43  const bool enforce_bitness)
44 {
45  timestamp->generate_r1cs_constraints(enforce_bitness);
46  address->generate_r1cs_constraints(enforce_bitness);
47  contents_before->generate_r1cs_constraints(enforce_bitness);
48  contents_after->generate_r1cs_constraints(enforce_bitness);
49 }
50 
51 template<typename ramT>
52 void memory_line_variable_gadget<ramT>::generate_r1cs_witness_from_bits()
53 {
54  timestamp->generate_r1cs_witness_from_bits();
55  address->generate_r1cs_witness_from_bits();
56  contents_before->generate_r1cs_witness_from_bits();
57  contents_after->generate_r1cs_witness_from_bits();
58 }
59 
60 template<typename ramT>
61 void memory_line_variable_gadget<ramT>::generate_r1cs_witness_from_packed()
62 {
63  timestamp->generate_r1cs_witness_from_packed();
64  address->generate_r1cs_witness_from_packed();
65  contents_before->generate_r1cs_witness_from_packed();
66  contents_after->generate_r1cs_witness_from_packed();
67 }
68 
69 template<typename ramT>
70 pb_variable_array<ram_base_field<ramT>> memory_line_variable_gadget<
71  ramT>::all_vars() const
72 {
73  pb_variable_array<FieldT> r;
74  r.insert(r.end(), timestamp->bits.begin(), timestamp->bits.end());
75  r.insert(r.end(), address->bits.begin(), address->bits.end());
76  r.insert(
77  r.end(), contents_before->bits.begin(), contents_before->bits.end());
78  r.insert(r.end(), contents_after->bits.begin(), contents_after->bits.end());
79 
80  return r;
81 }
82 
83 template<typename ramT>
84 execution_line_variable_gadget<ramT>::execution_line_variable_gadget(
85  ram_protoboard<ramT> &pb,
86  const size_t timestamp_size,
87  const ram_architecture_params<ramT> &ap,
88  const std::string &annotation_prefix)
89  : memory_line_variable_gadget<ramT>(
90  pb, timestamp_size, ap, annotation_prefix)
91 {
92  const size_t cpu_state_size = ap.cpu_state_size();
93 
94  cpu_state.allocate(
95  pb, cpu_state_size, FMT(annotation_prefix, " cpu_state"));
96  has_accepted.allocate(pb, FMT(annotation_prefix, " has_accepted"));
97 }
98 
99 } // namespace libsnark
100 
101 #endif // TRACE_LINES_TCC_