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
47 const AztecAddress& contract_address,
48 MemoryAddress dst_offset,
49 uint8_t member_enum)
50{
51 const auto& tree_state = merkle_db.get_tree_state();
52 const auto execution_clk = execution_id_manager.get_execution_id();
53 const auto space_id = memory.get_space_id();
54 const auto& nullifier_tree_root = tree_state.nullifier_tree.tree.root;
55 const auto& public_data_tree_root = tree_state.public_data_tree.tree.root;
56
57 // Memory bounds checking for dst_offset+1
58 // Note that execution does address resolution for dst_offset, so we already
59 // know that dst_offset is in bounds.
60 // So, the only scenario when dstOffset+1 can be out of bounds is if dstOffset == MAX address.
61 if (dst_offset == AVM_HIGHEST_MEM_ADDRESS) {
62 event_emitter.emit({ .execution_clk = execution_clk,
63 .contract_address = contract_address,
64 .dst_offset = dst_offset,
65 .member_enum = member_enum,
66 .space_id = space_id,
67 .nullifier_tree_root = nullifier_tree_root,
68 .public_data_tree_root = public_data_tree_root });
69 throw GetContractInstanceException("Write dst out of range: " + field_to_string(dst_offset));
70 }
71
72 // Member enum validation
73 if (member_enum > static_cast<uint8_t>(ContractInstanceMember::MAX)) {
74 event_emitter.emit({ .execution_clk = execution_clk,
75 .contract_address = contract_address,
76 .dst_offset = dst_offset,
77 .member_enum = member_enum,
78 .space_id = space_id,
79 .nullifier_tree_root = nullifier_tree_root,
80 .public_data_tree_root = public_data_tree_root });
81 throw GetContractInstanceException("Invalid member enum: " + std::to_string(member_enum));
82 }
83
84 // Retrieve contract instance using shared ContractInstanceManager
85 auto maybe_instance = instance_manager.get_contract_instance(contract_address);
86 const bool instance_exists = maybe_instance.has_value();
87
88 // Select the requested member and write results to memory
89 const FF selected_member_value =
90 instance_exists ? select_instance_member(maybe_instance.value(), member_enum) : FF(0);
91 write_results(memory, dst_offset, instance_exists, selected_member_value);
92
93 event_emitter.emit({ .execution_clk = execution_clk,
94 .contract_address = contract_address,
95 .dst_offset = dst_offset,
96 .member_enum = member_enum,
97 .space_id = space_id,
98 .nullifier_tree_root = nullifier_tree_root,
99 .public_data_tree_root = public_data_tree_root,
100 .instance_exists = instance_exists,
101 .retrieved_deployer_addr = instance_exists ? maybe_instance->deployer : FF(0),
102 .retrieved_class_id = instance_exists ? maybe_instance->current_contract_class_id : FF(0),
103 .retrieved_init_hash = instance_exists ? maybe_instance->initialization_hash : FF(0) });
104}
105
115 MemoryAddress dst_offset,
116 bool exists,
117 const FF& member_value)
118{
119 // Write existence flag (U1) at dst_offset
120 memory.set(dst_offset, MemoryValue::from<uint1_t>(exists ? 1 : 0));
121 // Write member value (FF) at dst_offset + 1
122 memory.set(dst_offset + 1, MemoryValue::from<FF>(member_value));
123}
124
134{
135 switch (static_cast<ContractInstanceMember>(member_enum)) {
137 return instance.deployer;
139 return instance.current_contract_class_id;
141 return instance.initialization_hash;
142 default:
143 throw std::runtime_error("This error should have been handled earlier! Invalid member enum: " +
145 }
146}
147
148} // 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)