1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
27using simulation::EmitUnencryptedLogWriteEvent;
28using testing::PublicInputsBuilder;
29using tracegen::EmitUnencryptedLogTraceBuilder;
30using tracegen::PublicInputsTraceBuilder;
31using tracegen::TestTraceContainer;
36TEST(EmitUnencryptedLogConstrainingTest, EmptyTrace)
41TEST(EmitUnencryptedLogConstrainingTest, Positive)
45 uint32_t log_size = 2;
46 SideEffectStates side_effect_states = { .numUnencryptedLogFields = 0 };
49 EmitUnencryptedLogWriteEvent
event = {
51 .contract_address = address,
53 .log_address = log_address,
55 .prev_num_unencrypted_log_fields = side_effect_states.numUnencryptedLogFields,
56 .next_num_unencrypted_log_fields = next_side_effect_states.numUnencryptedLogFields,
58 .values = { MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) },
59 .error_memory_out_of_bounds =
false,
60 .error_too_many_log_fields =
false,
61 .error_tag_mismatch =
false,
64 TestTraceContainer
trace({
65 { { C::precomputed_first_row, 1 } },
68 EmitUnencryptedLogTraceBuilder trace_builder;
69 trace_builder.process({
event },
trace);
71 check_relation<emit_unencrypted_log>(
trace);
74TEST(EmitUnencryptedLogConstrainingTest, ErrorMemoryOutOfBounds)
78 uint32_t log_size = 2;
79 SideEffectStates side_effect_states = { .numUnencryptedLogFields = 1 };
80 SideEffectStates next_side_effect_states = { .numUnencryptedLogFields = 1 };
82 EmitUnencryptedLogWriteEvent
event = {
84 .contract_address = address,
86 .log_address = log_address,
88 .prev_num_unencrypted_log_fields = side_effect_states.numUnencryptedLogFields,
89 .next_num_unencrypted_log_fields = next_side_effect_states.numUnencryptedLogFields,
92 .error_memory_out_of_bounds =
true,
93 .error_too_many_log_fields =
false,
94 .error_tag_mismatch =
false,
97 TestTraceContainer
trace({
98 { { C::precomputed_first_row, 1 } },
101 EmitUnencryptedLogTraceBuilder trace_builder;
102 trace_builder.process({
event },
trace);
104 check_relation<emit_unencrypted_log>(
trace);
107TEST(EmitUnencryptedLogConstrainingTest, ErrorTooManyLogFields)
111 uint32_t log_size = 2;
116 EmitUnencryptedLogWriteEvent
event = {
118 .contract_address = address,
120 .log_address = log_address,
121 .log_size = log_size,
122 .prev_num_unencrypted_log_fields = side_effect_states.numUnencryptedLogFields,
123 .next_num_unencrypted_log_fields = next_side_effect_states.numUnencryptedLogFields,
125 .values = { MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) },
126 .error_memory_out_of_bounds =
false,
127 .error_too_many_log_fields =
true,
128 .error_tag_mismatch =
false,
131 TestTraceContainer
trace({
132 { { C::precomputed_first_row, 1 } },
135 EmitUnencryptedLogTraceBuilder trace_builder;
136 trace_builder.process({
event },
trace);
138 check_relation<emit_unencrypted_log>(
trace);
141TEST(EmitUnencryptedLogConstrainingTest, ErrorTagMismatch)
145 uint32_t log_size = 2;
146 SideEffectStates side_effect_states = { .numUnencryptedLogFields = 1 };
147 SideEffectStates next_side_effect_states = { .numUnencryptedLogFields = 1 };
149 EmitUnencryptedLogWriteEvent
event = {
151 .contract_address = address,
153 .log_address = log_address,
154 .log_size = log_size,
155 .prev_num_unencrypted_log_fields = side_effect_states.numUnencryptedLogFields,
156 .next_num_unencrypted_log_fields = next_side_effect_states.numUnencryptedLogFields,
158 .values = { MemoryValue::from<uint32_t>(4), MemoryValue::from<FF>(
FF(5)) },
159 .error_memory_out_of_bounds =
false,
160 .error_too_many_log_fields =
false,
161 .error_tag_mismatch =
true,
164 TestTraceContainer
trace({
165 { { C::precomputed_first_row, 1 } },
168 EmitUnencryptedLogTraceBuilder trace_builder;
169 trace_builder.process({
event },
trace);
171 check_relation<emit_unencrypted_log>(
trace);
174TEST(EmitUnencryptedLogConstrainingTest, ErrorStatic)
178 uint32_t log_size = 2;
179 SideEffectStates side_effect_states = { .numUnencryptedLogFields = 1 };
180 SideEffectStates next_side_effect_states = { .numUnencryptedLogFields = 1 };
182 EmitUnencryptedLogWriteEvent
event = {
184 .contract_address = address,
186 .log_address = log_address,
187 .log_size = log_size,
188 .prev_num_unencrypted_log_fields = side_effect_states.numUnencryptedLogFields,
189 .next_num_unencrypted_log_fields = next_side_effect_states.numUnencryptedLogFields,
191 .values = { MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) },
192 .error_memory_out_of_bounds =
false,
193 .error_too_many_log_fields =
false,
194 .error_tag_mismatch =
false,
197 TestTraceContainer
trace({
198 { { C::precomputed_first_row, 1 } },
201 EmitUnencryptedLogTraceBuilder trace_builder;
202 trace_builder.process({
event },
trace);
205TEST(EmitUnencryptedLogConstrainingTest, Interactions)
209 uint32_t log_size = 2;
210 SideEffectStates side_effect_states = { .numUnencryptedLogFields = 0 };
212 AvmAccumulatedData accumulated_data = {};
213 accumulated_data.publicLogs.add_log({
214 .fields = {
FF(4),
FF(5) },
215 .contractAddress = address,
217 auto public_inputs = PublicInputsBuilder().set_accumulated_data(accumulated_data).build();
220 MemoryValue::from<FF>(
FF(4)),
221 MemoryValue::from<FF>(
FF(5)),
224 EmitUnencryptedLogWriteEvent
event = {
226 .contract_address = address,
228 .log_address = log_address,
229 .log_size = log_size,
230 .prev_num_unencrypted_log_fields = side_effect_states.numUnencryptedLogFields,
231 .next_num_unencrypted_log_fields = next_side_effect_states.numUnencryptedLogFields,
234 .error_memory_out_of_bounds =
false,
235 .error_too_many_log_fields =
false,
236 .error_tag_mismatch =
false,
239 TestTraceContainer
trace = TestTraceContainer({
242 { C::precomputed_first_row, 1 },
245 { C::gt_input_a, next_side_effect_states.numUnencryptedLogFields },
251 { C::execution_sel, 1 },
252 { C::execution_sel_exec_dispatch_emit_unencrypted_log, 1 },
253 { C::execution_context_id, 57 },
254 { C::execution_rop_1_, log_address },
255 { C::execution_register_0_, log_size },
256 { C::execution_contract_address, address },
257 { C::execution_prev_num_unencrypted_log_fields, side_effect_states.numUnencryptedLogFields },
258 { C::execution_num_unencrypted_log_fields, next_side_effect_states.numUnencryptedLogFields },
259 { C::execution_is_static,
false },
260 { C::execution_sel_opcode_error, 0 },
261 { C::execution_discard, 0 },
264 { C::gt_input_a, log_address + log_size - 1 },
271 for (uint32_t i = 0; i < inputs.size(); ++i) {
273 trace.
set(C::memory_address, i + 1, log_address + i);
274 trace.
set(C::memory_value, i + 1, inputs[i].as_ff());
275 trace.
set(C::memory_tag, i + 1,
static_cast<uint32_t
>(inputs[i].get_tag()));
279 trace.
set(C::memory_space_id, i + 1, 57);
289 EmitUnencryptedLogTraceBuilder trace_builder;
290 trace_builder.process({
event },
trace);
292 check_relation<emit_unencrypted_log>(
trace);
293 check_all_interactions<EmitUnencryptedLogTraceBuilder>(
trace);
296TEST(EmitUnencryptedLogConstrainingTest, NegativeStartAfterLatch)
298 TestTraceContainer
trace = TestTraceContainer({ {
299 { C::precomputed_first_row, 1 },
302 { C::emit_unencrypted_log_sel, 1 },
303 { C::emit_unencrypted_log_start, 1 },
304 { C::emit_unencrypted_log_end, 1 },
307 { C::emit_unencrypted_log_sel, 1 },
308 { C::emit_unencrypted_log_start, 1 },
313 trace.
set(C::emit_unencrypted_log_end, 1, 0);
316 "START_AFTER_LATCH");
318 trace.
set(C::emit_unencrypted_log_end, 1, 1);
319 trace.
set(C::precomputed_first_row, 0, 0);
322 "START_AFTER_LATCH");
325TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnStart)
327 TestTraceContainer
trace = TestTraceContainer({ {
328 { C::emit_unencrypted_log_sel, 1 },
329 { C::emit_unencrypted_log_start, 1 },
334 trace.
set(C::emit_unencrypted_log_sel, 0, 0);
337 "SELECTOR_ON_START");
340TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorConsistency)
342 TestTraceContainer
trace = TestTraceContainer({ {
343 { C::precomputed_first_row, 1 },
346 { C::emit_unencrypted_log_sel, 1 },
347 { C::emit_unencrypted_log_start, 1 },
348 { C::emit_unencrypted_log_end, 1 },
351 { C::emit_unencrypted_log_sel, 0 },
356 trace.
set(C::emit_unencrypted_log_end, 1, 0);
360 "SELECTOR_CONSISTENCY");
363TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnEnd)
365 TestTraceContainer
trace = TestTraceContainer({ {
366 { C::emit_unencrypted_log_sel, 1 },
367 { C::emit_unencrypted_log_end, 1 },
372 trace.
set(C::emit_unencrypted_log_sel, 0, 0);
378TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingRowsDecrement)
380 TestTraceContainer
trace = TestTraceContainer({ {
381 { C::emit_unencrypted_log_sel, 1 },
382 { C::emit_unencrypted_log_remaining_rows, 1 },
385 { C::emit_unencrypted_log_sel, 1 },
386 { C::emit_unencrypted_log_remaining_rows, 0 },
387 { C::emit_unencrypted_log_end, 1 },
392 trace.
set(C::emit_unencrypted_log_remaining_rows, 1, 1);
396 "REMAINING_ROWS_DECREMENT");
399TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorOutOfBoundsConsistency)
401 TestTraceContainer
trace = TestTraceContainer({ {
402 { C::emit_unencrypted_log_sel, 1 },
403 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
406 { C::emit_unencrypted_log_sel, 1 },
407 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
408 { C::emit_unencrypted_log_end, 1 },
413 trace.
set(C::emit_unencrypted_log_error_out_of_bounds, 1, 0);
417 "ERROR_OUT_OF_BOUNDS_CONSISTENCY");
420TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorTagMismatchConsistency)
422 TestTraceContainer
trace = TestTraceContainer({ {
423 { C::emit_unencrypted_log_sel, 1 },
424 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
427 { C::emit_unencrypted_log_sel, 1 },
428 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
429 { C::emit_unencrypted_log_end, 1 },
434 trace.
set(C::emit_unencrypted_log_error_tag_mismatch, 1, 0);
438 "ERROR_TAG_MISMATCH_CONSISTENCY");
441TEST(EmitUnencryptedLogConstrainingTest, NegativeWrongTagCheck)
443 TestTraceContainer
trace = TestTraceContainer({ {
444 { C::emit_unencrypted_log_sel, 1 },
445 { C::emit_unencrypted_log_seen_wrong_tag, 0 },
448 { C::emit_unencrypted_log_sel, 1 },
449 { C::emit_unencrypted_log_seen_wrong_tag, 1 },
450 { C::emit_unencrypted_log_correct_tag, 0 },
451 { C::emit_unencrypted_log_end, 1 },
456 trace.
set(C::emit_unencrypted_log_seen_wrong_tag, 1, 0);
462TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorShouldWriteToPublicInputsConsistency)
464 TestTraceContainer
trace =
465 TestTraceContainer({ {
466 { C::emit_unencrypted_log_sel, 1 },
467 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
470 { C::emit_unencrypted_log_sel, 1 },
471 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
472 { C::emit_unencrypted_log_end, 1 },
477 trace.
set(C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1, 0);
481 "SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY");
484TEST(EmitUnencryptedLogConstrainingTest, NegativeLogOffsetIncrement)
486 TestTraceContainer
trace = TestTraceContainer({ {
487 { C::emit_unencrypted_log_sel, 1 },
488 { C::emit_unencrypted_log_is_write_memory_value, 1 },
489 { C::emit_unencrypted_log_log_address, 10 },
492 { C::emit_unencrypted_log_sel, 1 },
493 { C::emit_unencrypted_log_is_write_memory_value, 1 },
494 { C::emit_unencrypted_log_log_address, 11 },
495 { C::emit_unencrypted_log_end, 1 },
500 trace.
set(C::emit_unencrypted_log_log_address, 1, 9);
504 "LOG_ADDRESS_INCREMENT");
507TEST(EmitUnencryptedLogConstrainingTest, NegativeExecutionClkConsistency)
509 TestTraceContainer
trace = TestTraceContainer({ {
510 { C::emit_unencrypted_log_sel, 1 },
511 { C::emit_unencrypted_log_execution_clk, 1 },
514 { C::emit_unencrypted_log_sel, 1 },
515 { C::emit_unencrypted_log_execution_clk, 1 },
516 { C::emit_unencrypted_log_end, 1 },
521 trace.
set(C::emit_unencrypted_log_execution_clk, 1, 0);
525 "EXEC_CLK_CONSISTENCY");
528TEST(EmitUnencryptedLogConstrainingTest, NegativeSpaceIdConsistency)
530 TestTraceContainer
trace = TestTraceContainer({ {
531 { C::emit_unencrypted_log_sel, 1 },
532 { C::emit_unencrypted_log_space_id, 17 },
535 { C::emit_unencrypted_log_sel, 1 },
536 { C::emit_unencrypted_log_space_id, 17 },
537 { C::emit_unencrypted_log_end, 1 },
542 trace.
set(C::emit_unencrypted_log_space_id, 1, 18);
546 "SPACE_ID_CONSISTENCY");
549TEST(EmitUnencryptedLogConstrainingTest, NegativeContractAddressConsistency)
551 TestTraceContainer
trace = TestTraceContainer({ {
552 { C::emit_unencrypted_log_sel, 1 },
553 { C::emit_unencrypted_log_contract_address, 42 },
556 { C::emit_unencrypted_log_sel, 1 },
557 { C::emit_unencrypted_log_contract_address, 42 },
558 { C::emit_unencrypted_log_end, 1 },
563 trace.
set(C::emit_unencrypted_log_contract_address, 1, 43);
567 "CONTRACT_ADDRESS_CONSISTENCY");
#define FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH
#define PUBLIC_LOG_HEADER_LENGTH
#define AVM_HIGHEST_MEM_ADDRESS
static constexpr size_t SR_SPACE_ID_CONSISTENCY
static constexpr size_t SR_SELECTOR_ON_END
static constexpr size_t SR_START_AFTER_LATCH
static constexpr size_t SR_LOG_ADDRESS_INCREMENT
static constexpr size_t SR_SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY
static constexpr size_t SR_ERROR_TAG_MISMATCH_CONSISTENCY
static constexpr size_t SR_SELECTOR_ON_START
static constexpr size_t SR_WRONG_TAG_CHECK
static constexpr size_t SR_REMAINING_ROWS_DECREMENT
static constexpr size_t SR_ERROR_OUT_OF_BOUNDS_CONSISTENCY
static constexpr size_t SR_EXEC_CLK_CONSISTENCY
static constexpr size_t SR_SELECTOR_CONSISTENCY
static constexpr size_t SR_CONTRACT_ADDRESS_CONSISTENCY
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
std::variant< EmitUnencryptedLogWriteEvent, CheckPointEventType > EmitUnencryptedLogEvent
TestTraceContainer empty_trace()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
tracegen::PublicInputsTraceBuilder public_inputs_builder