Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
get_contract_instance.cpp
Go to the documentation of this file.
2
3#include <stdexcept>
4#include <string>
5#include <utility>
6
11
12namespace bb::avm2::simulation {
13
31
48 const AztecAddress& contract_address,
49 MemoryAddress dst_offset,
50 uint8_t member_enum)
51{
52 const auto& tree_state = merkle_db.get_tree_state();
53 const auto execution_clk = execution_id_manager.get_execution_id();
54 const auto space_id = memory.get_space_id();
55 const auto& nullifier_tree_root = tree_state.nullifier_tree.tree.root;
56 const auto& public_data_tree_root = tree_state.public_data_tree.tree.root;
57
58 // Memory bounds checking for dst_offset+1
59 // Note that execution does address resolution for dst_offset, so we already
60 // know that dst_offset is in bounds.
61 // So, the only scenario when dstOffset+1 can be out of bounds is if dstOffset == MAX address.
62 if (dst_offset == AVM_HIGHEST_MEM_ADDRESS) {
63 event_emitter.emit({ .execution_clk = execution_clk,
64 .contract_address = contract_address,
65 .dst_offset = dst_offset,
66 .member_enum = member_enum,
67 .space_id = space_id,
68 .nullifier_tree_root = nullifier_tree_root,
69 .public_data_tree_root = public_data_tree_root });
70 throw GetContractInstanceException("Write dst out of range: " + field_to_string(dst_offset));
71 }
72
73 // Member enum validation
74 if (member_enum > static_cast<uint8_t>(ContractInstanceMember::MAX)) {
75 event_emitter.emit({ .execution_clk = execution_clk,
76 .contract_address = contract_address,
77 .dst_offset = dst_offset,
78 .member_enum = member_enum,
79 .space_id = space_id,
80 .nullifier_tree_root = nullifier_tree_root,
81 .public_data_tree_root = public_data_tree_root });
82 throw GetContractInstanceException("Invalid member enum: " + std::to_string(member_enum));
83 }
84
85 // Retrieve contract instance using shared ContractInstanceManager
86 auto maybe_instance = instance_manager.get_contract_instance(contract_address);
87 const bool instance_exists = maybe_instance.has_value();
88
89 // Select the requested member and write results to memory
90 const FF selected_member_value =
91 instance_exists ? select_instance_member(maybe_instance.value(), member_enum) : FF(0);
92 write_results(memory, dst_offset, instance_exists, selected_member_value);
93
94 event_emitter.emit({
95 .execution_clk = execution_clk,
96 .contract_address = contract_address,
97 .dst_offset = dst_offset,
98 .member_enum = member_enum,
99 .space_id = space_id,
100 .nullifier_tree_root = nullifier_tree_root,
101 .public_data_tree_root = public_data_tree_root,
102 .instance_exists = instance_exists,
103 .retrieved_deployer_addr = instance_exists ? maybe_instance->deployer : FF(0),
104 .retrieved_class_id = instance_exists ? maybe_instance->current_contract_class_id : FF(0),
105 .retrieved_init_hash = instance_exists ? maybe_instance->initialization_hash : FF(0),
106 .retrieved_immutables_hash = instance_exists ? maybe_instance->immutables_hash : FF(0),
107 });
108}
109
119 MemoryAddress dst_offset,
120 bool exists,
121 const FF& member_value)
122{
123 // Write existence flag (U1) at dst_offset
124 memory.set(dst_offset, MemoryValue::from<uint1_t>(exists ? 1 : 0));
125 // Write member value (FF) at dst_offset + 1
126 memory.set(dst_offset + 1, MemoryValue::from<FF>(member_value));
127}
128
138{
139 switch (static_cast<ContractInstanceMember>(member_enum)) {
141 return instance.deployer;
143 return instance.current_contract_class_id;
145 return instance.initialization_hash;
147 return instance.immutables_hash;
148 default:
149 throw std::runtime_error("This error should have been handled earlier! Invalid member enum: " +
151 }
152}
153
154} // namespace bb::avm2::simulation
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define AVM_HIGHEST_MEM_ADDRESS
StrictMock< MockHighLevelMerkleDB > merkle_db
Core shared component for contract instance retrieval and validation.
virtual std::optional< ContractInstance > get_contract_instance(const FF &contract_address)=0
Retrieve and validate a contract instance.
virtual uint32_t get_execution_id() const =0
static FF select_instance_member(const ContractInstance &instance, uint8_t member_enum)
Select a contract instance member by enum value.
ContractInstanceManagerInterface & instance_manager
void get_contract_instance(MemoryInterface &memory, const AztecAddress &contract_address, MemoryAddress dst_offset, uint8_t member_enum) override
Retrieve a contract instance member and write the result to memory.
static void write_results(MemoryInterface &memory, MemoryAddress dst_offset, bool exists, const FF &member_value)
Write the contract instance existence flag and member value to memory.
ExecutionIdManagerInterface & execution_id_manager
GetContractInstance(ExecutionIdManagerInterface &execution_id_manager, HighLevelMerkleDBInterface &merkle_db, EventEmitterInterface< GetContractInstanceEvent > &event_emitter, ContractInstanceManagerInterface &instance_manager)
Construct a GetContractInstance gadget with its dependencies.
EventEmitterInterface< GetContractInstanceEvent > & event_emitter
virtual TreeStates get_tree_state() const =0
ExecutionIdManager execution_id_manager
EventEmitter< DataCopyEvent > event_emitter
AVM range check gadget for witness generation.
AvmFlavorSettings::FF FF
Definition field.hpp:10
std::string field_to_string(const FF &ff)
Definition stringify.cpp:5
uint32_t MemoryAddress
std::string to_string(bb::avm2::ValueTag tag)