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 <cstdint>
4
11
12namespace bb::avm2::tracegen {
13
14using C = Column;
15
31 TraceContainer& trace)
32{
33 // Set the selector to 0 at row 0 to enable skippable gadget
34 trace.set(C::get_contract_instance_sel, 0, 0);
35
36 uint32_t row = 1;
37 for (const auto& event : events) {
38
39 // Bounds checking logic for new constraint
40 // dstOffset+1 out of bounds <==> `DST_OFFSET_DIFF_MAX = 0`
41 bool writes_are_in_bounds = event.dst_offset != AVM_HIGHEST_MEM_ADDRESS;
42 FF dst_offset_diff_max = FF(AVM_HIGHEST_MEM_ADDRESS) - FF(event.dst_offset);
43
44 bool is_valid_member_enum = false;
45 bool is_deployer = false;
46 bool is_class_id = false;
47 bool is_init_hash = false;
48 bool is_immutables_hash = false;
49
50 if (writes_are_in_bounds) {
51 // Get precomputed table values for this member enum
52 const auto spec = GetContractInstanceSpec::get_table(event.member_enum);
53
54 is_valid_member_enum = spec.is_valid_member_enum;
55 is_deployer = spec.is_deployer;
56 is_class_id = spec.is_class_id;
57 is_init_hash = spec.is_init_hash;
58 is_immutables_hash = spec.is_immutables_hash;
59 }
60
61 bool has_error = !(writes_are_in_bounds && is_valid_member_enum);
62
63 FF selected_member = is_deployer ? event.retrieved_deployer_addr
64 : is_class_id ? event.retrieved_class_id
65 : is_init_hash ? event.retrieved_init_hash
66 : is_immutables_hash ? event.retrieved_immutables_hash
67 : FF(0);
68
69 trace.set(
70 row,
71 { {
72 // Interface columns
73 { C::get_contract_instance_sel, 1 },
74 { C::get_contract_instance_clk, event.execution_clk },
75 { C::get_contract_instance_contract_address, event.contract_address },
76 { C::get_contract_instance_dst_offset, event.dst_offset },
77 { C::get_contract_instance_member_enum, event.member_enum },
78 { C::get_contract_instance_space_id, event.space_id },
79 { C::get_contract_instance_public_data_tree_root, event.public_data_tree_root },
80 { C::get_contract_instance_nullifier_tree_root, event.nullifier_tree_root },
81 { C::get_contract_instance_sel_error, has_error ? 1 : 0 },
82
83 // Intermediate selectors and error flags
84 { C::get_contract_instance_is_valid_writes_in_bounds, writes_are_in_bounds ? 1 : 0 },
85 { C::get_contract_instance_dst_offset_diff_max_inv, dst_offset_diff_max }, // Will be inverted in batch
86
87 // Columns from precomputed table
88 { C::get_contract_instance_is_valid_member_enum, is_valid_member_enum ? 1 : 0 },
89 { C::get_contract_instance_is_deployer, is_deployer ? 1 : 0 },
90 { C::get_contract_instance_is_class_id, is_class_id ? 1 : 0 },
91 { C::get_contract_instance_is_init_hash, is_init_hash ? 1 : 0 },
92 { C::get_contract_instance_is_immutables_hash, is_immutables_hash ? 1 : 0 },
93 // Retrieval results
94 { C::get_contract_instance_instance_exists, event.instance_exists ? 1 : 0 },
95 { C::get_contract_instance_retrieved_deployer_addr, event.retrieved_deployer_addr },
96 { C::get_contract_instance_retrieved_class_id, event.retrieved_class_id },
97 { C::get_contract_instance_retrieved_init_hash, event.retrieved_init_hash },
98 { C::get_contract_instance_retrieved_immutables_hash, event.retrieved_immutables_hash },
99 { C::get_contract_instance_selected_member, selected_member },
100 // Memory writing
101 { C::get_contract_instance_member_write_offset, writes_are_in_bounds ? (event.dst_offset + 1) : 0 },
102 { C::get_contract_instance_exists_tag, writes_are_in_bounds ? static_cast<uint8_t>(ValueTag::U1) : 0 },
103 { C::get_contract_instance_member_tag, writes_are_in_bounds ? static_cast<uint8_t>(ValueTag::FF) : 0 },
104 } });
105
106 row++;
107 }
108
109 // Batch invert the columns.
110 trace.invert_columns({ { C::get_contract_instance_dst_offset_diff_max_inv } });
111}
112
116 .add<InteractionType::LookupSequential, lookup_get_contract_instance_contract_instance_retrieval_settings>();
117
118} // namespace bb::avm2::tracegen
#define AVM_HIGHEST_MEM_ADDRESS
static Table get_table(uint8_t member_enum)
Look up the precomputed table entry for a given member enum value.
void process(const simulation::EventEmitterInterface< simulation::GetContractInstanceEvent >::Container &events, TraceContainer &trace)
Process the GetContractInstance events and populate the relevant columns in the trace.
InteractionDefinition & add(auto &&... args)
TestTraceContainer trace
AvmFlavorSettings::FF FF
Definition field.hpp:10
simulation::PublicDataTreeReadWriteEvent event
Settings to be passed ot GenericLookupRelationImpl.