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 <cassert>
4#include <cstdint>
5#include <stdexcept>
6
13
14namespace bb::avm2::simulation {
15
25
28 MemoryAddress dst_offset,
29 uint8_t member_enum)
30{
31 const auto& tree_state = merkle_db.get_tree_state();
34 .contract_address = contract_address,
35 .dst_offset = dst_offset,
36 .member_enum = member_enum,
37 .space_id = memory.get_space_id(),
38 .nullifier_tree_root = tree_state.nullifierTree.tree.root,
39 .public_data_tree_root = tree_state.publicDataTree.tree.root,
40 };
41
42 // Memory bounds checking for dst_offset+1
43 // Note that execution does address resolution for dst_offset, so we already
44 // know that dst_offset is in bounds.
45 // So, the only scenario when dstOffset+1 can be out of bounds is if dstOffset == MAX address.
46 if (dst_offset == AVM_HIGHEST_MEM_ADDRESS) {
48 throw GetContractInstanceException("Write dst out of range: " + field_to_string(dst_offset));
49 }
50
51 // Member enum validation
52 if (member_enum > static_cast<uint8_t>(ContractInstanceMember::MAX)) {
54 throw GetContractInstanceException("Invalid member enum: " + std::to_string(member_enum));
55 }
56
57 // Retrieve contract instance using shared ContractInstanceManager
58 auto maybe_instance = instance_manager.get_contract_instance(event.contract_address);
59 bool instance_exists = maybe_instance.has_value();
60 event.instance_exists = instance_exists;
61
62 // Extract all member values for event (even if we only use one for the memory write)
63 // This is needed for the PIL gadget trace generation which includes all retrieved members
64 FF selected_member_value = 0; // default if instance does not exist
65 if (instance_exists) {
66 const auto& instance = maybe_instance.value();
67 event.retrieved_deployer_addr = instance.deployer_addr;
68 event.retrieved_class_id = instance.current_class_id;
69 event.retrieved_init_hash = instance.initialisation_hash;
70
71 // Select the requested member based on the enum
72 selected_member_value = select_instance_member(instance, member_enum);
73 }
74
75 // Perform two memory writes
76 write_results(memory, dst_offset, instance_exists, selected_member_value);
77
79}
80
82 MemoryAddress dst_offset,
83 bool exists,
84 const FF& member_value)
85{
86 // Write existence flag (U1) at dst_offset
87 memory.set(dst_offset, MemoryValue::from<uint1_t>(exists ? 1 : 0));
88 // Write member value (FF) at dst_offset + 1
89 memory.set(dst_offset + 1, MemoryValue::from<FF>(member_value));
90}
91
93{
94 switch (static_cast<ContractInstanceMember>(member_enum)) {
96 return instance.deployer_addr;
98 return instance.current_class_id;
100 return instance.initialisation_hash;
101 default:
102 throw std::runtime_error("This error should have been handled earlier! Invalid member enum: " +
103 std::to_string(member_enum));
104 }
105}
106
107} // namespace bb::avm2::simulation
#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)
ContractInstanceManagerInterface & instance_manager
void get_contract_instance(MemoryInterface &memory, AztecAddress contract_address, MemoryAddress dst_offset, uint8_t member_enum) override
static void write_results(MemoryInterface &memory, MemoryAddress dst_offset, bool exists, const FF &member_value)
ExecutionIdManagerInterface & execution_id_manager
GetContractInstance(ExecutionIdManagerInterface &execution_id_manager, HighLevelMerkleDBInterface &merkle_db, EventEmitterInterface< GetContractInstanceEvent > &event_emitter, ContractInstanceManagerInterface &instance_manager)
EventEmitterInterface< GetContractInstanceEvent > & event_emitter
virtual TreeStates get_tree_state() const =0
ExecutionIdManager execution_id_manager
EventEmitter< DataCopyEvent > event_emitter
std::string field_to_string(const FF &ff)
Definition stringify.cpp:5
uint32_t MemoryAddress
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
simulation::PublicDataTreeReadWriteEvent event
ContractClassId current_class_id