265 auto val =
memory.get(src_addr);
287 result = TaggedValue::from<FF>(
context.get_address());
290 result = TaggedValue::from<FF>(
context.get_msg_sender());
293 result = TaggedValue::from<FF>(
context.get_transaction_fee());
296 result = TaggedValue::from<FF>(
context.get_globals().chainId);
299 result = TaggedValue::from<FF>(
context.get_globals().version);
302 result = TaggedValue::from<uint32_t>(
context.get_globals().blockNumber);
305 result = TaggedValue::from<uint64_t>(
context.get_globals().timestamp);
308 result = TaggedValue::from<uint128_t>(
context.get_globals().gasFees.feePerL2Gas);
311 result = TaggedValue::from<uint128_t>(
context.get_globals().gasFees.feePerDaGas);
314 result = TaggedValue::from<uint1_t>(
context.get_is_static() ? 1 : 0);
317 result = TaggedValue::from<uint32_t>(
context.gas_left().l2Gas);
320 result = TaggedValue::from<uint32_t>(
context.gas_left().daGas);
347 auto v =
memory.get(src_addr);
368 const auto& allocated_l2_gas_read =
memory.get(l2_gas_offset);
369 const auto& allocated_da_gas_read =
memory.get(da_gas_offset);
372 const auto& cd_size =
memory.get(cd_size_offset);
378 Gas{ allocated_l2_gas_read.as<uint32_t>(), allocated_da_gas_read.as<uint32_t>() });
386 cd_size.as<uint32_t>(),
389 context.get_side_effect_states(),
408 const auto& allocated_l2_gas_read =
memory.get(l2_gas_offset);
409 const auto& allocated_da_gas_read =
memory.get(da_gas_offset);
412 const auto& cd_size =
memory.get(cd_size_offset);
418 Gas{ allocated_l2_gas_read.as<uint32_t>(), allocated_da_gas_read.as<uint32_t>() });
426 cd_size.as<uint32_t>(),
429 context.get_side_effect_states(),
444 auto cd_copy_size =
memory.get(cd_size_offset);
452 }
catch (
const std::exception& e) {
465 auto rd_copy_size =
memory.get(rd_size_offset);
466 auto rd_offset_read =
memory.get(rd_offset);
473 }
catch (
const std::exception& e) {
503 .rd_size =
rd_size.as<uint32_t>(),
504 .gas_used =
context.get_gas_used(),
505 .side_effect_states =
context.get_side_effect_states(),
516 auto rev_size =
memory.get(rev_size_offset);
522 .rd_size = rev_size.as<uint32_t>(),
523 .gas_used =
context.get_gas_used(),
524 .side_effect_states =
context.get_side_effect_states(),
544 auto resolved_cond =
memory.get(cond_addr);
559 auto& internal_call_stack_manager =
context.get_internal_call_stack_manager();
561 internal_call_stack_manager.push(
context.get_next_pc());
570 auto& internal_call_stack_manager =
context.get_internal_call_stack_manager();
572 auto next_pc = internal_call_stack_manager.pop();
574 }
catch (
const std::exception& e) {
597 uint16_t message_size)
720 uint32_t da_gas_factor =
static_cast<uint32_t
>(!was_slot_written_before);
727 if (!was_slot_written_before &&
744 auto unique_note_hash =
memory.get(unique_note_hash_addr);
745 auto leaf_index =
memory.get(leaf_index_addr);
750 uint64_t leaf_index_value = leaf_index.as<uint64_t>();
756 if (index_in_range) {
759 value = MemoryValue::from<uint1_t>(0);
776 auto address =
memory.get(address_offset);
788 memory.set(exists_offset, result);
829 auto address_value =
memory.get(address_offset);
852 auto note_hash =
memory.get(note_hash_addr);
877 auto msg_hash =
memory.get(msg_hash_addr);
878 auto leaf_index =
memory.get(leaf_index_addr);
883 uint64_t leaf_index_value = leaf_index.as<uint64_t>();
889 if (index_in_range) {
892 value = MemoryValue::from<uint1_t>(0);
965 BB_BENCH_NAME(
"Execution::to_radix_be::set_and_validate_inputs");
981 uint32_t radix_value = radix.
as<uint32_t>();
997 radix.
as<uint32_t>(),
998 num_limbs.
as<uint32_t>(),
1014 uint32_t log_size_int = log_size.
as<uint32_t>();
1039 auto side_effects_states_before =
context.get_side_effect_states();
1041 if (
context.get_is_static()) {
1052 side_effects_states_before.numL2ToL1Messages++;
1053 context.set_side_effect_states(side_effects_states_before);
1065 sha256.compression(
context.get_memory(), state_addr, input_addr, output_addr);
1097 context.get_bytecode_manager().get_bytecode_id();
1125 vinfo(
"Bytecode retrieval error:: ", e.what());
1129 vinfo(
"Instruction fetching error: ", e.what());
1133 vinfo(
"Addressing exception: ", e.what());
1137 vinfo(
"Register validation exception: ", e.what());
1141 vinfo(
"Out of gas exception: ", e.what());
1145 vinfo(
"Opcode execution exception: ", e.what());
1148 }
catch (
const std::exception& e) {
1151 info(
"An unhandled exception occurred: ", e.what());
1183 .entered_context_id = child_context->get_context_id(),
1224 parent_context.set_last_rd_addr(result.
rd_offset);
1225 parent_context.set_last_rd_size(result.
rd_size);
1226 parent_context.set_last_success(result.
success);
1228 parent_context.set_gas_used(result.
gas_used + parent_context.get_gas_used());
1232 parent_context.set_child_context(
std::move(child_context));
1236 throw std::runtime_error(
format(
"Checkpoint id mismatch: ",
1237 parent_context.get_checkpoint_id_at_creation(),
1240 " (gone back to the wrong db/context)"));
1253 .gas_used =
context.get_gas_used(),
1254 .side_effect_states =
context.get_side_effect_states(),
1267 output = TaggedValue::from<FF>(0);
1269 debug(
"Dispatching opcode: ", opcode,
" (",
static_cast<uint32_t
>(opcode),
")");
1411 throw std::runtime_error(
"Tried to dispatch unknown execution opcode: " +
1418template <
typename... Ts>
1421 const
std::vector<
Operand>& resolved_operands)
1423 assert(resolved_operands.size() ==
sizeof...(Ts));
1435 assert(
inputs.size() == register_info.num_inputs());
1437 for (
size_t i = 0; i < register_info.num_inputs(); i++) {
1438 if (register_info.expected_tag(i) && register_info.expected_tag(i) != this->inputs.at(i).get_tag()) {
1443 " does not match expected tag ",
1452 (void)register_info;
1453 assert(register_info.num_outputs() == 1);
#define NOTE_HASH_TREE_LEAF_COUNT
#define L1_TO_L2_MSG_TREE_LEAF_COUNT
#define MAX_L2_TO_L1_MSGS_PER_TX
#define MAX_NOTE_HASHES_PER_TX
#define MAX_NULLIFIERS_PER_TX
#define MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
#define BB_BENCH_NAME(name)
virtual std::optional< BytecodeId > get_retrieved_bytecode_id()=0
virtual const AztecAddress & get_msg_sender() const =0
virtual Gas get_parent_gas_limit() const =0
virtual uint32_t get_next_pc() const =0
virtual uint32_t get_parent_cd_size() const =0
virtual MemoryAddress get_parent_cd_addr() const =0
virtual AppendOnlyTreeSnapshot get_written_public_data_slots_tree_snapshot()=0
virtual SideEffectStates & get_side_effect_states()=0
virtual uint32_t get_parent_id() const =0
virtual bool get_is_static() const =0
virtual BytecodeManagerInterface & get_bytecode_manager()=0
virtual const AztecAddress & get_address() const =0
virtual uint32_t get_context_id() const =0
virtual Gas get_parent_gas_used() const =0
virtual uint32_t get_next_context_id() const =0
virtual std::unique_ptr< ContextInterface > make_nested_context(AztecAddress address, AztecAddress msg_sender, FF transaction_fee, ContextInterface &parent_context, MemoryAddress cd_offset_address, uint32_t cd_size, bool is_static, Gas gas_limit, SideEffectStates side_effect_states, TransactionPhase phase)=0
virtual void debug_log(MemoryInterface &memory, AztecAddress contract_address, MemoryAddress level_offset, MemoryAddress message_offset, uint16_t message_size, MemoryAddress fields_offset, MemoryAddress fields_size_offset)=0
virtual EmbeddedCurvePoint add(const EmbeddedCurvePoint &p, const EmbeddedCurvePoint &q)=0
virtual void emit_unencrypted_log(MemoryInterface &memory, ContextInterface &context, AztecAddress contract_address, MemoryAddress log_offset, uint32_t log_size)=0
virtual std::unique_ptr< GasTrackerInterface > make_gas_tracker(GasEvent &gas_event, const Instruction &instruction, ContextInterface &context)=0
virtual std::unique_ptr< AddressingInterface > make_addressing(AddressingEvent &event)=0
void lt(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void emit_note_hash(ContextInterface &context, MemoryAddress note_hash_addr)
void mov(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr)
const TaggedValue & get_output() const
void static_call(ContextInterface &context, MemoryAddress l2_gas_offset, MemoryAddress da_gas_offset, MemoryAddress addr, MemoryAddress cd_size_offset, MemoryAddress cd_offset)
void debug_log(ContextInterface &context, MemoryAddress level_offset, MemoryAddress message_offset, MemoryAddress fields_offset, MemoryAddress fields_size_offset, uint16_t message_size)
EventEmitterInterface< ExecutionEvent > & events
void cd_copy(ContextInterface &context, MemoryAddress cd_size_offset, MemoryAddress cd_offset, MemoryAddress dst_addr)
std::unique_ptr< GasTrackerInterface > gas_tracker
void send_l2_to_l1_msg(ContextInterface &context, MemoryAddress recipient_addr, MemoryAddress content_addr)
void dispatch_opcode(ExecutionOpCode opcode, ContextInterface &context, const std::vector< Operand > &resolved_operands)
ExecutionComponentsProviderInterface & execution_components
void sstore(ContextInterface &context, MemoryAddress src_addr, MemoryAddress slot_addr)
void set(ContextInterface &context, MemoryAddress dst_addr, uint8_t tag, const FF &value)
void internal_return(ContextInterface &context)
void set_output(ExecutionOpCode opcode, TaggedValue output)
virtual GasTrackerInterface & get_gas_tracker()
void poseidon2_permutation(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr)
void success_copy(ContextInterface &context, MemoryAddress dst_addr)
void fdiv(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void jumpi(ContextInterface &context, MemoryAddress cond_addr, uint32_t loc)
void sub(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void rd_copy(ContextInterface &context, MemoryAddress rd_size_offset, MemoryAddress rd_offset, MemoryAddress dst_addr)
void l1_to_l2_message_exists(ContextInterface &context, MemoryAddress msg_hash_addr, MemoryAddress leaf_index_addr, MemoryAddress dst_addr)
void emit_unencrypted_log(ContextInterface &context, MemoryAddress log_size_offset, MemoryAddress log_offset)
void div(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void emit_nullifier(ContextInterface &context, MemoryAddress nullifier_addr)
EventEmitterInterface< ContextStackEvent > & ctx_stack_events
void set_execution_result(ExecutionResult exec_result)
void ecc_add(ContextInterface &context, MemoryAddress p_x_addr, MemoryAddress p_y_addr, MemoryAddress p_inf_addr, MemoryAddress q_x_addr, MemoryAddress q_y_addr, MemoryAddress q_inf_addr, MemoryAddress dst_addr)
void keccak_permutation(ContextInterface &context, MemoryAddress dst_addr, MemoryAddress src_addr)
void jump(ContextInterface &context, uint32_t loc)
void sha256_compression(ContextInterface &context, MemoryAddress output_addr, MemoryAddress state_addr, MemoryAddress input_addr)
void sload(ContextInterface &context, MemoryAddress slot_addr, MemoryAddress dst_addr)
void ret(ContextInterface &context, MemoryAddress ret_size_offset, MemoryAddress ret_offset)
std::vector< TaggedValue > inputs
void internal_call(ContextInterface &context, uint32_t loc)
EccInterface & embedded_curve
void op_not(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr)
void handle_exceptional_halt(ContextInterface &context)
void handle_enter_call(ContextInterface &parent_context, std::unique_ptr< ContextInterface > child_context)
void nullifier_exists(ContextInterface &context, MemoryAddress nullifier_offset, MemoryAddress address_offset, MemoryAddress exists_offset)
void note_hash_exists(ContextInterface &context, MemoryAddress unique_note_hash_addr, MemoryAddress leaf_index_addr, MemoryAddress dst_addr)
ContextProviderInterface & context_provider
ExecutionResult execute(std::unique_ptr< ContextInterface > enqueued_call_context) override
void shl(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress c_addr)
void cast(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr, uint8_t dst_tag)
void to_radix_be(ContextInterface &context, MemoryAddress value_addr, MemoryAddress radix_addr, MemoryAddress num_limbs_addr, MemoryAddress is_output_bits_addr, MemoryAddress dst_addr)
EmitUnencryptedLogInterface & emit_unencrypted_log_component
void eq(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void call(ContextInterface &context, MemoryAddress l2_gas_offset, MemoryAddress da_gas_offset, MemoryAddress addr, MemoryAddress cd_size_offset, MemoryAddress cd_offset)
std::stack< std::unique_ptr< ContextInterface > > external_call_stack
GreaterThanInterface & greater_than
void set_and_validate_inputs(ExecutionOpCode opcode, std::vector< TaggedValue > inputs)
void revert(ContextInterface &context, MemoryAddress rev_size_offset, MemoryAddress rev_offset)
void rd_size(ContextInterface &context, MemoryAddress dst_addr)
void mul(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void or_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
const std::vector< TaggedValue > & get_inputs() const
DebugLoggerInterface & debug_log_component
void xor_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void get_contract_instance(ContextInterface &context, MemoryAddress address_offset, MemoryAddress dst_offset, uint8_t member_enum)
ExecutionResult get_execution_result() const
GetContractInstanceInterface & get_contract_instance_component
void get_env_var(ContextInterface &context, MemoryAddress dst_addr, uint8_t var_enum)
void lte(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
const InstructionInfoDBInterface & instruction_info_db
HighLevelMerkleDBInterface & merkle_db
void and_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void shr(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress c_addr)
ExecutionIdManagerInterface & execution_id_manager
void add(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void call_with_operands(void(Execution::*f)(ContextInterface &, Ts...), ContextInterface &context, const std::vector< Operand > &resolved_operands)
virtual void increment_execution_id()=0
virtual void consume_gas(const Gas &dynamic_gas_factor={ 0, 0 })=0
virtual Gas compute_gas_limit_for_call(const Gas &allocated_gas)=0
virtual void get_contract_instance(MemoryInterface &memory, const AztecAddress &contract_address, MemoryAddress dst_offset, uint8_t member_enum)=0
virtual bool gt(const FF &a, const FF &b)=0
virtual void revert_checkpoint()=0
virtual bool note_hash_exists(uint64_t leaf_index, const FF &unique_note_hash) const =0
virtual FF storage_read(const AztecAddress &contract_address, const FF &slot) const =0
virtual uint32_t get_checkpoint_id() const =0
virtual void commit_checkpoint()=0
virtual bool was_storage_written(const AztecAddress &contract_address, const FF &slot) const =0
virtual void note_hash_write(const AztecAddress &contract_address, const FF ¬e_hash)=0
virtual bool nullifier_exists(const AztecAddress &contract_address, const FF &nullifier) const =0
virtual void storage_write(const AztecAddress &contract_address, const FF &slot, const FF &value, bool is_protocol_write)=0
virtual bool l1_to_l2_msg_exists(uint64_t leaf_index, const FF &msg_hash) const =0
virtual void nullifier_write(const AztecAddress &contract_address, const FF &nullifier)=0
virtual TreeStates get_tree_state() const =0
virtual const ExecInstructionSpec & get(ExecutionOpCode opcode) const =0
A 1-bit unsigned integer type.
constexpr uint8_t value() const noexcept
std::string format(Args... args)
AztecAddress contract_address
size_t get_p_limbs_per_radix_size(size_t radix)
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
uint8_t get_tag_bytes(ValueTag tag)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
RegisterInfo register_info
ContextEvent after_context_event
std::vector< TaggedValue > inputs
AddressingEvent addressing_event
ContextEvent before_context_event
Instruction wire_instruction
SideEffectStates side_effect_states