Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
get_contract_instance_trace.cpp
Go to the documentation of this file.
2
3#include <cstddef>
4#include <cstdint>
5
17
18namespace bb::avm2::tracegen {
19
20using C = Column;
21
25{
26 // Set the selector to 0 at row 0 to enable skippable gadget
27 trace.set(C::get_contract_instance_sel, 0, 0);
28
29 uint32_t row = 1;
30 for (const auto& event : events) {
31
32 // Bounds checking logic for new constraint
33 // dstOffset+1 out of bounds <==> `DST_OFFSET_DIFF_MAX = 0`
34 bool writes_are_in_bounds = event.dst_offset != AVM_HIGHEST_MEM_ADDRESS;
35 FF dst_offset_diff_max = FF(AVM_HIGHEST_MEM_ADDRESS) - FF(event.dst_offset);
36
37 bool is_valid_member_enum = false;
38 bool is_deployer = false;
39 bool is_class_id = false;
40 bool is_init_hash = false;
41
42 if (writes_are_in_bounds) {
43 // Get precomputed table values for this member enum
44 const auto spec = GetContractInstanceSpec::get_table(event.member_enum);
45
46 is_valid_member_enum = spec.is_valid_member_enum;
47 is_deployer = spec.is_deployer;
48 is_class_id = spec.is_class_id;
49 is_init_hash = spec.is_init_hash;
50 }
51
52 bool has_error = !(writes_are_in_bounds && is_valid_member_enum);
53
54 FF selected_member = is_deployer ? event.retrieved_deployer_addr
55 : is_class_id ? event.retrieved_class_id
56 : is_init_hash ? event.retrieved_init_hash
57 : FF(0);
58
59 trace.set(
60 row,
61 { {
62 // Interface columns
63 { C::get_contract_instance_sel, 1 },
64 { C::get_contract_instance_clk, event.execution_clk },
65 { C::get_contract_instance_contract_address, event.contract_address },
66 { C::get_contract_instance_dst_offset, event.dst_offset },
67 { C::get_contract_instance_member_enum, event.member_enum },
68 { C::get_contract_instance_space_id, event.space_id },
69 { C::get_contract_instance_public_data_tree_root, event.public_data_tree_root },
70 { C::get_contract_instance_nullifier_tree_root, event.nullifier_tree_root },
71 { C::get_contract_instance_sel_error, has_error ? 1 : 0 },
72
73 // Intermediate selectors and error flags
74 { C::get_contract_instance_is_valid_writes_in_bounds, writes_are_in_bounds ? 1 : 0 },
75 { C::get_contract_instance_dst_offset_diff_max_inv, dst_offset_diff_max }, // Will be inverted in batch
76
77 // Columns from precomputed table
78 { C::get_contract_instance_is_valid_member_enum, is_valid_member_enum ? 1 : 0 },
79 { C::get_contract_instance_is_deployer, is_deployer ? 1 : 0 },
80 { C::get_contract_instance_is_class_id, is_class_id ? 1 : 0 },
81 { C::get_contract_instance_is_init_hash, is_init_hash ? 1 : 0 },
82 // Retrieval results
83 { C::get_contract_instance_instance_exists, event.instance_exists ? 1 : 0 },
84 { C::get_contract_instance_retrieved_deployer_addr, event.retrieved_deployer_addr },
85 { C::get_contract_instance_retrieved_class_id, event.retrieved_class_id },
86 { C::get_contract_instance_retrieved_init_hash, event.retrieved_init_hash },
87 { C::get_contract_instance_selected_member, selected_member },
88 // Memory writing
89 { C::get_contract_instance_member_write_offset, event.dst_offset + 1 },
90 { C::get_contract_instance_exists_tag, writes_are_in_bounds ? static_cast<uint8_t>(ValueTag::U1) : 0 },
91 { C::get_contract_instance_member_tag, writes_are_in_bounds ? static_cast<uint8_t>(ValueTag::FF) : 0 },
92 } });
93
94 row++;
95 }
96
97 // Batch invert the columns.
98 trace.invert_columns({ { C::get_contract_instance_dst_offset_diff_max_inv } });
99}
100
104 .add<lookup_get_contract_instance_contract_instance_retrieval_settings, InteractionType::LookupSequential>();
105
106} // namespace bb::avm2::tracegen
#define AVM_HIGHEST_MEM_ADDRESS
void process(const simulation::EventEmitterInterface< simulation::GetContractInstanceEvent >::Container &events, TraceContainer &trace)
InteractionDefinition & add(auto &&... args)
TestTraceContainer trace
lookup_settings< lookup_get_contract_instance_precomputed_info_settings_ > lookup_get_contract_instance_precomputed_info_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
simulation::PublicDataTreeReadWriteEvent event