106 uint64_t end_log_address =
static_cast<uint64_t
>(
log_offset) +
static_cast<uint64_t
>(
log_size) - 1;
117 return { .
id =
context->get_context_id(),
119 .contract_addr =
context->get_address(),
120 .is_static =
context->get_is_static(),
121 .numPublicLogFields =
context->get_side_effect_tracker().get_side_effects().get_num_public_log_fields() };
127 std::vector<FF> log_fields;
129 log_fields.reserve(total_log_fields_size);
131 log_fields.emplace_back(input.
log_size);
136 for (
size_t j = 0; j < max_index; j++) {
144 auto entry_value = log_fields[entry_idx];
146 log_fields.emplace_back(modified_value);
157 size_t set_incorrect_tag_at = ((input.
selection_encoding >> max_index) % log_fields.size()) + 2;
161 while (incorrect_tag == MemoryTag::FF) {
165 static_cast<uint64_t
>(MemoryTag::MAX));
189 int choice = dist(rng);
194 input.
contract_address =
FF(addr_dist(rng), addr_dist(rng), addr_dist(rng), addr_dist(rng));
200 int new_addr =
static_cast<int>(input.
log_offset) + addr_change(rng);
201 input.
log_offset =
static_cast<uint32_t
>(new_addr);
207 input.
log_size = num_fields_dist(rng);
214 size_t entry_idx = entry_dist(rng);
222 size_t value_idx = index_dist(rng);
224 FF value =
FF(dist(rng), dist(rng), dist(rng), dist(rng));
233 int choice = err_dist(rng);
308 trace.
set(avm2::Column::public_inputs_cols_0_, pi_row, log_fields.size());
309 trace.
set(avm2::Column::public_inputs_sel, pi_row, 1);
312 for (
FF log_field : log_fields) {
314 trace.
set(avm2::Column::public_inputs_sel, pi_row, 1);
316 trace.
set(avm2::Column::public_inputs_cols_0_, pi_row, log_field);
330 .inputs = { MemoryValue::from<uint32_t>(input.
log_size) },
333 auto exec_log_row =
trace.
get_column_rows(avm2::Column::execution_sel_exec_dispatch_emit_public_log);
335 trace.
set(avm2::Column::execution_register_0_, exec_log_row - 1, input.
log_size);
336 trace.
set(avm2::Column::execution_sel_opcode_error, exec_log_row - 1, error ? 1 : 0);
343 if (getenv(
"AVM_DEBUG") !=
nullptr) {
344 info(
"Debugging trace:");
349 check_relation<emit_log_rel>(
trace);
350 check_all_interactions<EmitPublicLogTraceBuilder>(
trace);
351 check_interaction<ExecutionTraceBuilder, bb::avm2::perm_execution_dispatch_to_emit_public_log_settings>(
trace);
#define FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH
#define PUBLIC_LOG_HEADER_LENGTH
#define AVM_HIGHEST_MEM_ADDRESS
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX
void run(uint32_t starting_row=0)
static TaggedValue from(T value)
static TaggedValue from_tag_truncating(ValueTag tag, FF value)
Sets up gadgets and instance managers to provide a context for fuzzing. NOTE: rudimentary set up for ...
DeduplicatingEventEmitter< GreaterThanEvent > greater_than_emitter
std::unique_ptr< simulation::ContextInterface > make_enqueued_fuzzing_context(AztecAddress address=AztecAddress(0), AztecAddress msg_sender=AztecAddress(0), bool is_static=false, FF transaction_fee=FF(0), std::span< const FF > calldata={}, Gas gas_limit=GAS_LIMIT, Gas gas_used=GAS_USED_BY_PRIVATE, TransactionPhase phase=TransactionPhase::APP_LOGIC)
DeduplicatingEventEmitter< RangeCheckEvent > range_check_emitter
DeduplicatingEventEmitter< FieldGreaterThanEvent > field_gt_emitter
ExecutionIdManager execution_id_manager
void set(MemoryAddress index, MemoryValue value) override
simulation::Instruction build() const
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::ExecutionEvent >::Container &ex_events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::FieldGreaterThanEvent >::Container &events, TraceContainer &trace)
Processes FieldGreaterThanEvent events and generates trace rows for the ff_gt gadget.
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Process the greater-than events and populate the relevant columns in the trace.
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
void process_power_of_2(TraceContainer &trace)
void process_tag_parameters(TraceContainer &trace)
void process_sel_range_8(TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
Processes range check events and populates the trace with decomposed value columns.
uint32_t get_column_rows(Column col) const
void set(Column col, uint32_t row, const FF &value)
RangeCheckTraceBuilder range_check_builder
PrecomputedTraceBuilder precomputed_builder
FieldGreaterThanTraceBuilder field_gt_builder
GreaterThanTraceBuilder gt_builder
const std::vector< MemoryValue > data
const uint32_t max_log_fields
const uint8_t default_log_fields
ContextEvent fill_context_event(std::unique_ptr< ContextInterface > &context)
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, size_t max_size, unsigned int seed)
std::vector< FF > generate_and_set_log_fields(const EmitPublicLogFuzzerInput &input, MemoryInterface *mem)
std::unique_ptr< uint8_t[]> buffer
AVM range check gadget for witness generation.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Instruction wire_instruction