Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
ram_compliance_predicate.hpp
Go to the documentation of this file.
1 
37 #ifndef RAM_COMPLIANCE_PREDICATE_HPP_
38 #define RAM_COMPLIANCE_PREDICATE_HPP_
39 
46 #include <numeric>
47 
48 namespace libsnark
49 {
50 
55 template<typename ramT>
56 class ram_pcd_message : public r1cs_pcd_message<ram_base_field<ramT>>
57 {
58 private:
59  void print_bits(const libff::bit_vector &bv) const;
60 
61 public:
63 
65 
66  size_t timestamp;
67  libff::bit_vector root_initial;
68  libff::bit_vector root;
69  size_t pc_addr;
70  libff::bit_vector cpu_state;
72  libff::bit_vector cpu_state_initial;
74 
76  const size_t type,
78  const size_t timestamp,
79  const libff::bit_vector root_initial,
80  const libff::bit_vector root,
81  const size_t pc_addr,
82  const libff::bit_vector cpu_state,
83  const size_t pc_addr_initial,
84  const libff::bit_vector cpu_state_initial,
85  const bool has_accepted);
86 
87  libff::bit_vector unpacked_payload_as_bits() const;
89  const;
90  void print() const;
91 
92  static size_t unpacked_payload_size_in_bits(
94 };
95 
96 template<typename ramT>
98  : public r1cs_pcd_message_variable<ram_base_field<ramT>>
99 {
100 public:
102 
104 
106 
115 
117 
118  std::shared_ptr<multipacking_gadget<FieldT>> unpack_payload;
119 
123  const std::string &annotation_prefix);
124 
125  void allocate_unpacked_part();
129 
130  std::shared_ptr<r1cs_pcd_message<FieldT>> get_message() const;
131 };
132 
133 template<typename ramT>
134 class ram_pcd_local_data : public r1cs_pcd_local_data<ram_base_field<ramT>>
135 {
136 public:
138 
140 
144 
146  const bool is_halt_case,
150 
152 };
153 
154 template<typename ramT>
156  : public r1cs_pcd_local_data_variable<ram_base_field<ramT>>
157 {
158 public:
160 
162 
164  protoboard<FieldT> &pb, const std::string &annotation_prefix);
165 };
166 
170 template<typename ramT>
173  ram_base_field<ramT>,
174  ram_protoboard<ramT>>
175 {
176 protected:
178 
179 public:
186 
187  std::shared_ptr<ram_pcd_message_variable<ramT>> next;
188  std::shared_ptr<ram_pcd_message_variable<ramT>> cur;
189 
190 private:
192  zero; // TODO: promote linear combinations to first class objects
193  std::shared_ptr<bit_vector_copy_gadget<FieldT>> copy_root_initial;
194  std::shared_ptr<bit_vector_copy_gadget<FieldT>> copy_pc_addr_initial;
195  std::shared_ptr<bit_vector_copy_gadget<FieldT>> copy_cpu_state_initial;
196 
197  pb_variable<FieldT> is_base_case;
198  pb_variable<FieldT> is_not_halt_case;
199 
200  pb_variable<FieldT> packed_cur_timestamp;
201  std::shared_ptr<packing_gadget<FieldT>> pack_cur_timestamp;
202  pb_variable<FieldT> packed_next_timestamp;
203  std::shared_ptr<packing_gadget<FieldT>> pack_next_timestamp;
204 
205  pb_variable_array<FieldT> zero_cpu_state;
206  pb_variable_array<FieldT> zero_pc_addr;
207  pb_variable_array<FieldT> zero_root;
208 
209  std::shared_ptr<bit_vector_copy_gadget<FieldT>> initialize_cur_cpu_state;
210  std::shared_ptr<bit_vector_copy_gadget<FieldT>> initialize_prev_pc_addr;
211 
212  std::shared_ptr<bit_vector_copy_gadget<FieldT>> initialize_root;
213 
214  pb_variable_array<FieldT> prev_pc_val;
215  std::shared_ptr<digest_variable<FieldT>> prev_pc_val_digest;
216  std::shared_ptr<digest_variable<FieldT>> cur_root_digest;
217  std::shared_ptr<merkle_authentication_path_variable<FieldT, HashT>>
218  instruction_fetch_merkle_proof;
219  std::shared_ptr<memory_load_gadget<FieldT, HashT>> instruction_fetch;
220 
221  std::shared_ptr<digest_variable<FieldT>> next_root_digest;
222 
224  pb_variable_array<FieldT> ls_prev_val;
225  pb_variable_array<FieldT> ls_next_val;
226  std::shared_ptr<digest_variable<FieldT>> ls_prev_val_digest;
227  std::shared_ptr<digest_variable<FieldT>> ls_next_val_digest;
228  std::shared_ptr<merkle_authentication_path_variable<FieldT, HashT>>
229  load_merkle_proof;
230  std::shared_ptr<merkle_authentication_path_variable<FieldT, HashT>>
231  store_merkle_proof;
232  std::shared_ptr<memory_load_store_gadget<FieldT, HashT>> load_store_checker;
233 
234  pb_variable_array<FieldT> temp_next_pc_addr;
235  pb_variable_array<FieldT> temp_next_cpu_state;
236  std::shared_ptr<ram_cpu_checker<ramT>> cpu_checker;
237 
238  pb_variable<FieldT> do_halt;
239  std::shared_ptr<bit_vector_copy_gadget<FieldT>> clear_next_root;
240  std::shared_ptr<bit_vector_copy_gadget<FieldT>> clear_next_pc_addr;
241  std::shared_ptr<bit_vector_copy_gadget<FieldT>> clear_next_cpu_state;
242 
243  std::shared_ptr<bit_vector_copy_gadget<FieldT>> copy_temp_next_root;
244  std::shared_ptr<bit_vector_copy_gadget<FieldT>> copy_temp_next_pc_addr;
245  std::shared_ptr<bit_vector_copy_gadget<FieldT>> copy_temp_next_cpu_state;
246 
247 public:
248  const size_t addr_size;
249  const size_t value_size;
250  const size_t digest_size;
251 
253 
257  const std::vector<std::shared_ptr<r1cs_pcd_message<FieldT>>>
258  &incoming_message_values,
259  const std::shared_ptr<r1cs_pcd_local_data<FieldT>> &local_data_value);
260 
261  static std::shared_ptr<r1cs_pcd_message<FieldT>> get_base_case_message(
263  const ram_boot_trace<ramT> &primary_input);
264  static std::shared_ptr<r1cs_pcd_message<FieldT>> get_final_case_msg(
266  const ram_boot_trace<ramT> &primary_input,
267  const size_t time_bound);
268 };
269 
270 } // namespace libsnark
271 
273 
274 #endif // RAM_COMPLIANCE_PREDICATE_HPP_
libsnark::ram_compliance_predicate_handler::next
std::shared_ptr< ram_pcd_message_variable< ramT > > next
Definition: ram_compliance_predicate.hpp:187
libsnark::knapsack_CRH_with_bit_out_gadget
Definition: knapsack_gadget.hpp:100
libsnark::ram_input_tape
std::vector< size_t > ram_input_tape
Definition: ram_params.hpp:55
libsnark::ram_architecture_params
typename ramT::architecture_params_type ram_architecture_params
Definition: ram_params.hpp:53
libsnark::ram_pcd_local_data::aux_end
const ram_input_tape< ramT >::const_iterator & aux_end
Definition: ram_compliance_predicate.hpp:143
libsnark::gadget< ram_base_field< ramT > >::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::ram_pcd_message_variable::unpack_payload
std::shared_ptr< multipacking_gadget< FieldT > > unpack_payload
Definition: ram_compliance_predicate.hpp:118
libsnark::ram_protoboard
typename ramT::protoboard_type ram_protoboard
Definition: ram_params.hpp:46
libsnark::ram_pcd_message_variable::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ram_pcd_message_variable::pc_addr_initial
pb_variable_array< FieldT > pc_addr_initial
Definition: ram_compliance_predicate.hpp:112
libsnark::ram_pcd_message_variable::packed_payload
pb_variable_array< FieldT > packed_payload
Definition: ram_compliance_predicate.hpp:105
libsnark::ram_compliance_predicate_handler::get_final_case_msg
static std::shared_ptr< r1cs_pcd_message< FieldT > > get_final_case_msg(const ram_architecture_params< ramT > &ap, const ram_boot_trace< ramT > &primary_input, const size_t time_bound)
libsnark
Definition: accumulation_vector.hpp:18
libsnark::ram_pcd_message::timestamp
size_t timestamp
Definition: ram_compliance_predicate.hpp:66
libsnark::ram_compliance_predicate_handler::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ram_pcd_message::unpacked_payload_size_in_bits
static size_t unpacked_payload_size_in_bits(const ram_architecture_params< ramT > &ap)
libsnark::ram_pcd_message_variable::cpu_state_initial
pb_variable_array< FieldT > cpu_state_initial
Definition: ram_compliance_predicate.hpp:113
libsnark::ram_base_field
typename ramT::base_field_type ram_base_field
Definition: ram_params.hpp:40
memory_load_store_gadget.hpp
libsnark::ram_pcd_message_variable::has_accepted
pb_variable< FieldT > has_accepted
Definition: ram_compliance_predicate.hpp:114
libsnark::gadget< ram_base_field< ramT > >::pb
protoboard< ram_base_field< ramT > > & pb
Definition: gadget.hpp:19
libsnark::ram_pcd_message_variable::root_initial
pb_variable_array< FieldT > root_initial
Definition: ram_compliance_predicate.hpp:108
libsnark::r1cs_pcd_message< ram_base_field< ramT > >::type
size_t type
Definition: compliance_predicate.hpp:38
libsnark::ram_pcd_message_variable::generate_r1cs_witness_from_bits
void generate_r1cs_witness_from_bits()
libsnark::ram_pcd_message_variable::root
pb_variable_array< FieldT > root
Definition: ram_compliance_predicate.hpp:109
libsnark::compliance_predicate_handler
Definition: cp_handler.hpp:82
libsnark::ram_pcd_message_variable::pc_addr
pb_variable_array< FieldT > pc_addr
Definition: ram_compliance_predicate.hpp:110
libsnark::ram_pcd_message::FieldT
ram_base_field< ramT > FieldT
Definition: ram_compliance_predicate.hpp:62
libsnark::ram_pcd_message::root
libff::bit_vector root
Definition: ram_compliance_predicate.hpp:68
libsnark::ram_compliance_predicate_handler::HashT
CRH_with_bit_out_gadget< FieldT > HashT
Definition: ram_compliance_predicate.hpp:181
ram_compliance_predicate.tcc
libsnark::r1cs_pcd_local_data
Definition: compliance_predicate.hpp:54
libsnark::ram_pcd_message::has_accepted
bool has_accepted
Definition: ram_compliance_predicate.hpp:73
libsnark::ram_pcd_message_variable::timestamp
pb_variable_array< FieldT > timestamp
Definition: ram_compliance_predicate.hpp:107
libsnark::ram_compliance_predicate_handler::FieldT
ram_base_field< ramT > FieldT
Definition: ram_compliance_predicate.hpp:180
delegated_ra_memory.hpp
libsnark::ram_compliance_predicate_handler
Definition: ram_compliance_predicate.hpp:171
libsnark::ram_pcd_local_data
Definition: ram_compliance_predicate.hpp:134
libsnark::ram_compliance_predicate_handler::message_length
size_t message_length
Definition: ram_compliance_predicate.hpp:252
libsnark::ram_pcd_message::ap
ram_architecture_params< ramT > ap
Definition: ram_compliance_predicate.hpp:64
libsnark::ram_pcd_local_data::mem
delegated_ra_memory< CRH_with_bit_out_gadget< FieldT > > & mem
Definition: ram_compliance_predicate.hpp:141
compliance_predicate.hpp
libsnark::ram_compliance_predicate_handler::ram_compliance_predicate_handler
ram_compliance_predicate_handler(const ram_architecture_params< ramT > &ap)
libsnark::ram_pcd_message::cpu_state_initial
libff::bit_vector cpu_state_initial
Definition: ram_compliance_predicate.hpp:72
libsnark::ram_pcd_message_variable::FieldT
ram_base_field< ramT > FieldT
Definition: ram_compliance_predicate.hpp:103
libsnark::r1cs_pcd_message_variable
Definition: cp_handler.hpp:32
libsnark::ram_pcd_message::print
void print() const
libsnark::ram_compliance_predicate_handler::cur
std::shared_ptr< ram_pcd_message_variable< ramT > > cur
Definition: ram_compliance_predicate.hpp:188
libsnark::r1cs_pcd_message
Definition: compliance_predicate.hpp:35
libsnark::ram_compliance_predicate_handler::addr_size
const size_t addr_size
Definition: ram_compliance_predicate.hpp:248
cp_handler.hpp
libsnark::ram_pcd_message::pc_addr
size_t pc_addr
Definition: ram_compliance_predicate.hpp:69
libsnark::r1cs_pcd_local_data_variable
Definition: cp_handler.hpp:58
libsnark::memory_store_trace
Definition: memory_store_trace.hpp:29
libsnark::ram_pcd_message_variable::get_message
std::shared_ptr< r1cs_pcd_message< FieldT > > get_message() const
libsnark::ram_pcd_message::root_initial
libff::bit_vector root_initial
Definition: ram_compliance_predicate.hpp:67
libsnark::ram_pcd_message_variable::ram_pcd_message_variable
ram_pcd_message_variable(protoboard< FieldT > &pb, const ram_architecture_params< ramT > &ap, const std::string &annotation_prefix)
libsnark::ram_compliance_predicate_handler::ap
ram_architecture_params< ramT > ap
Definition: ram_compliance_predicate.hpp:177
libsnark::delegated_ra_memory
Definition: delegated_ra_memory.hpp:24
libsnark::ram_pcd_message::ram_pcd_message
ram_pcd_message(const size_t type, const ram_architecture_params< ramT > &ap, const size_t timestamp, const libff::bit_vector root_initial, const libff::bit_vector root, const size_t pc_addr, const libff::bit_vector cpu_state, const size_t pc_addr_initial, const libff::bit_vector cpu_state_initial, const bool has_accepted)
memory_load_gadget.hpp
libsnark::r1cs_variable_assignment
std::vector< FieldT > r1cs_variable_assignment
Definition: r1cs.hpp:88
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::ram_pcd_message_variable::ap
ram_architecture_params< ramT > ap
Definition: ram_compliance_predicate.hpp:101
libsnark::ram_pcd_local_data::as_r1cs_variable_assignment
r1cs_variable_assignment< FieldT > as_r1cs_variable_assignment() const
libsnark::ram_pcd_message_variable::all_unpacked_vars
pb_variable_array< FieldT > all_unpacked_vars
Definition: ram_compliance_predicate.hpp:116
libsnark::ram_pcd_local_data_variable
Definition: ram_compliance_predicate.hpp:155
libsnark::pb_variable_array
Definition: pb_variable.hpp:44
libsnark::ram_pcd_local_data::FieldT
ram_base_field< ramT > FieldT
Definition: ram_compliance_predicate.hpp:137
libsnark::ram_pcd_local_data::is_halt_case
bool is_halt_case
Definition: ram_compliance_predicate.hpp:139
libsnark::ram_pcd_message::unpacked_payload_as_bits
libff::bit_vector unpacked_payload_as_bits() const
libsnark::ram_pcd_message_variable::generate_r1cs_witness_from_packed
void generate_r1cs_witness_from_packed()
libsnark::ram_pcd_local_data_variable::is_halt_case
pb_variable< FieldT > is_halt_case
Definition: ram_compliance_predicate.hpp:161
libsnark::ram_compliance_predicate_handler::value_size
const size_t value_size
Definition: ram_compliance_predicate.hpp:249
libsnark::ram_compliance_predicate_handler::get_base_case_message
static std::shared_ptr< r1cs_pcd_message< FieldT > > get_base_case_message(const ram_architecture_params< ramT > &ap, const ram_boot_trace< ramT > &primary_input)
libsnark::ram_pcd_message::cpu_state
libff::bit_vector cpu_state
Definition: ram_compliance_predicate.hpp:70
libsnark::ram_pcd_message
Definition: ram_compliance_predicate.hpp:56
libsnark::ram_pcd_message_variable::allocate_unpacked_part
void allocate_unpacked_part()
libsnark::ram_pcd_local_data_variable::FieldT
ram_base_field< ramT > FieldT
Definition: ram_compliance_predicate.hpp:159
libsnark::ram_pcd_message::payload_as_r1cs_variable_assignment
r1cs_variable_assignment< FieldT > payload_as_r1cs_variable_assignment() const
libsnark::ram_pcd_message::pc_addr_initial
size_t pc_addr_initial
Definition: ram_compliance_predicate.hpp:71
libsnark::ram_compliance_predicate_handler::generate_r1cs_witness
void generate_r1cs_witness(const std::vector< std::shared_ptr< r1cs_pcd_message< FieldT >>> &incoming_message_values, const std::shared_ptr< r1cs_pcd_local_data< FieldT >> &local_data_value)
libsnark::ram_pcd_local_data_variable::ram_pcd_local_data_variable
ram_pcd_local_data_variable(protoboard< FieldT > &pb, const std::string &annotation_prefix)
libsnark::ram_compliance_predicate_handler::digest_size
const size_t digest_size
Definition: ram_compliance_predicate.hpp:250
libsnark::ram_pcd_local_data::aux_it
ram_input_tape< ramT >::const_iterator & aux_it
Definition: ram_compliance_predicate.hpp:142
libsnark::ram_compliance_predicate_handler::base_handler
compliance_predicate_handler< ram_base_field< ramT >, ram_protoboard< ramT > > base_handler
Definition: ram_compliance_predicate.hpp:185
libsnark::ram_pcd_message_variable::cpu_state
pb_variable_array< FieldT > cpu_state
Definition: ram_compliance_predicate.hpp:111
libsnark::ram_pcd_message_variable
Definition: ram_compliance_predicate.hpp:97
libsnark::ram_pcd_local_data::ram_pcd_local_data
ram_pcd_local_data(const bool is_halt_case, delegated_ra_memory< CRH_with_bit_out_gadget< FieldT >> &mem, typename ram_input_tape< ramT >::const_iterator &aux_it, const typename ram_input_tape< ramT >::const_iterator &aux_end)
ram_params.hpp
libsnark::protoboard
Definition: pb_variable.hpp:22