Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
emit_unencrypted_log_trace.cpp
Go to the documentation of this file.
2
3#include <cstddef>
4#include <cstdint>
5
17
18namespace bb::avm2::tracegen {
19
20using C = Column;
21
25{
26 uint32_t row = 1;
28 // error = error_too_large | error_out_of_bounds | error_too_many_logs | error_tag_mismatch | is_static
29 // we split the above computation in 2 to reduce the degree of the full relation (7)
30 bool error_too_many_logs_wrong_tag_is_static =
31 event.error_too_many_logs || event.error_tag_mismatch || event.is_static;
32 bool error =
33 event.error_too_large || event.error_memory_out_of_bounds || error_too_many_logs_wrong_tag_is_static;
34
35 FF log_address = FF(event.log_address);
36 bool seen_wrong_tag = false;
37
38 for (uint32_t i = 0; i < PUBLIC_LOG_SIZE_IN_FIELDS; ++i) {
39 uint32_t remaining_rows = PUBLIC_LOG_SIZE_IN_FIELDS - 1 - i;
40 FF remaining_rows_inv = remaining_rows == 0 ? 0 : FF(remaining_rows).invert();
41 bool is_padding_row = i >= event.log_size;
42
43 FF value = 0;
45
46 if (i < event.values.size()) {
47 value = event.values[i].as_ff();
48 tag = event.values[i].get_tag();
49 }
50
51 bool correct_tag = tag == ValueTag::FF;
52 if (!correct_tag) {
53 seen_wrong_tag = true;
54 }
55 uint8_t numeric_tag = static_cast<uint8_t>(tag);
56 FF tag_inv = correct_tag ? 0 : FF(numeric_tag).invert();
57
58 uint32_t max_logs_minus_emitted = MAX_PUBLIC_LOGS_PER_TX - event.prev_num_unencrypted_logs;
59 FF max_logs_minus_emitted_inv = max_logs_minus_emitted == 0 ? 0 : FF(max_logs_minus_emitted).invert();
60
61 uint32_t remaining_log_size = event.log_size > i ? event.log_size - i : 0;
62 FF remaining_log_size_inv = remaining_log_size == 0 ? 0 : FF(remaining_log_size).invert();
63
64 trace.set(row,
65 { {
66 { C::emit_unencrypted_log_sel, 1 },
67 { C::emit_unencrypted_log_execution_clk, event.execution_clk },
68 { C::emit_unencrypted_log_space_id, event.space_id },
69 { C::emit_unencrypted_log_log_address, log_address + i },
70 { C::emit_unencrypted_log_log_size, event.log_size },
71 { C::emit_unencrypted_log_contract_address, event.contract_address },
72 { C::emit_unencrypted_log_prev_num_unencrypted_logs, event.prev_num_unencrypted_logs },
73 { C::emit_unencrypted_log_next_num_unencrypted_logs, event.next_num_unencrypted_logs },
74 { C::emit_unencrypted_log_is_static, event.is_static },
75 { C::emit_unencrypted_log_error, error },
76 { C::emit_unencrypted_log_discard, discard },
77 { C::emit_unencrypted_log_start, i == 0 },
78 { C::emit_unencrypted_log_end, i == PUBLIC_LOG_SIZE_IN_FIELDS - 1 },
79 { C::emit_unencrypted_log_remaining_rows, remaining_rows },
80 { C::emit_unencrypted_log_remaining_rows_inv, remaining_rows_inv },
81 { C::emit_unencrypted_log_error_too_large, event.error_too_large },
82 { C::emit_unencrypted_log_max_log_size, PUBLIC_LOG_SIZE_IN_FIELDS },
83 { C::emit_unencrypted_log_error_out_of_bounds, event.error_memory_out_of_bounds },
84 { C::emit_unencrypted_log_max_mem_addr, AVM_HIGHEST_MEM_ADDRESS },
85 { C::emit_unencrypted_log_end_log_address, log_address + event.log_size - 1 },
86 { C::emit_unencrypted_log_error_too_many_logs, event.error_too_many_logs },
87 { C::emit_unencrypted_log_max_logs_minus_emitted_inv, max_logs_minus_emitted_inv },
88 { C::emit_unencrypted_log_error_tag_mismatch, event.error_tag_mismatch },
89 { C::emit_unencrypted_log_seen_wrong_tag, seen_wrong_tag },
90 { C::emit_unencrypted_log_error_too_many_logs_wrong_tag_is_static,
91 error_too_many_logs_wrong_tag_is_static },
92 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, !error && !discard },
93 { C::emit_unencrypted_log_is_padding_row, is_padding_row },
94 { C::emit_unencrypted_log_remaining_log_size, remaining_log_size },
95 { C::emit_unencrypted_log_remaining_log_size_inv, remaining_log_size_inv },
96 { C::emit_unencrypted_log_sel_should_read_memory,
97 !is_padding_row && !event.error_memory_out_of_bounds },
98 { C::emit_unencrypted_log_value, value },
99 { C::emit_unencrypted_log_tag, numeric_tag },
100 { C::emit_unencrypted_log_correct_tag, correct_tag },
101 { C::emit_unencrypted_log_tag_inv, tag_inv },
102 { C::emit_unencrypted_log_public_inputs_index,
104 event.prev_num_unencrypted_logs * PUBLIC_LOG_SIZE_IN_FIELDS + i },
105 } });
106
107 row++;
108 }
109 });
110}
111
115 .add<lookup_emit_unencrypted_log_check_memory_out_of_bounds_settings, InteractionType::LookupGeneric>()
117 .add<lookup_emit_unencrypted_log_write_log_to_public_inputs_settings, InteractionType::LookupIntoIndexedByClk>()
119
120} // namespace bb::avm2::tracegen
#define MAX_PUBLIC_LOGS_PER_TX
#define AVM_HIGHEST_MEM_ADDRESS
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX
#define PUBLIC_LOG_SIZE_IN_FIELDS
void process(const simulation::EventEmitterInterface< simulation::EmitUnencryptedLogEvent >::Container &events, TraceContainer &trace)
InteractionDefinition & add(auto &&... args)
TestTraceContainer trace
void process_with_discard(const std::vector< std::variant< EventType, simulation::CheckPointEventType > > &events, ProcessEventFn &&process_event)
lookup_settings< lookup_emit_unencrypted_log_read_mem_settings_ > lookup_emit_unencrypted_log_read_mem_settings
lookup_settings< lookup_emit_unencrypted_log_check_log_size_too_large_settings_ > lookup_emit_unencrypted_log_check_log_size_too_large_settings
lookup_settings< lookup_emit_unencrypted_log_dispatch_exec_emit_unencrypted_log_settings_ > lookup_emit_unencrypted_log_dispatch_exec_emit_unencrypted_log_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
simulation::PublicDataTreeReadWriteEvent event