1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
33using ::testing::Return;
34using ::testing::StrictMock;
36using tracegen::EccTraceBuilder;
37using tracegen::TestTraceContainer;
38using tracegen::ToRadixTraceBuilder;
45using EccSimulator = simulation::Ecc;
46using ToRadixSimulator = simulation::ToRadix;
48using simulation::EccAddEvent;
49using simulation::EccAddMemoryEvent;
50using simulation::EventEmitter;
51using simulation::MemoryStore;
52using simulation::MockExecutionIdManager;
53using simulation::MockGreaterThan;
54using simulation::MockMemory;
55using simulation::NoopEventEmitter;
56using simulation::PureGreaterThan;
57using simulation::PureToRadix;
58using simulation::ScalarMulEvent;
59using simulation::ToRadixEvent;
60using simulation::ToRadixMemoryEvent;
63FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
64FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
67FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
68FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
71TEST(EccAddConstrainingTest, EccEmptyRow)
76TEST(EccAddConstrainingTest, EccAdd)
79 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
80 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
83 auto trace = TestTraceContainer({ {
85 { C::ecc_double_op, 0 },
87 { C::ecc_inv_2_p_y, FF::zero() },
88 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
89 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
91 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
94 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
95 { C::ecc_p_x, p.x() },
96 { C::ecc_p_y, p.y() },
99 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
100 { C::ecc_q_x, q.x() },
101 { C::ecc_q_y, q.y() },
104 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
105 { C::ecc_r_x, r.x() },
106 { C::ecc_r_y, r.y() },
108 { C::ecc_result_infinity, 0 },
111 { C::ecc_use_computed_result, 1 },
112 { C::ecc_x_match, 0 },
113 { C::ecc_y_match, 0 },
117 check_relation<ecc>(
trace);
120TEST(EccAddConstrainingTest, EccDouble)
123 FF r_x(
"0x088b996194bb5e6e8e5e49733bb671c3e660cf77254f743f366cc8e33534ee3b");
124 FF r_y(
"0x2807ffa01c0f522d0be1e1acfb6914ac8eabf1acf420c0629d37beee992e9a0e");
127 auto trace = TestTraceContainer({ {
128 { C::ecc_add_op, 0 },
129 { C::ecc_double_op, 1 },
131 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
132 { C::ecc_inv_x_diff, FF::zero() },
133 { C::ecc_inv_y_diff, FF::zero() },
135 { C::ecc_lambda, (p.x() * p.x() * 3) / (p.y() * 2) },
138 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
139 { C::ecc_p_x, p.x() },
140 { C::ecc_p_y, p.y() },
143 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
144 { C::ecc_q_x, p.x() },
145 { C::ecc_q_y, p.y() },
148 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
149 { C::ecc_r_x, r.x() },
150 { C::ecc_r_y, r.y() },
152 { C::ecc_result_infinity, 0 },
155 { C::ecc_use_computed_result, 1 },
156 { C::ecc_x_match, 1 },
157 { C::ecc_y_match, 1 },
161 check_relation<ecc>(
trace);
164TEST(EccAddConstrainingTest, EccAddResultingInInfinity)
170 auto trace = TestTraceContainer({ {
171 { C::ecc_add_op, 0 },
172 { C::ecc_double_op, 0 },
174 { C::ecc_inv_2_p_y, FF::zero() },
175 { C::ecc_inv_x_diff, FF::zero() },
176 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
178 { C::ecc_lambda, 0 },
181 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
182 { C::ecc_p_x, p.x() },
183 { C::ecc_p_y, p.y() },
186 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
187 { C::ecc_q_x, q.x() },
188 { C::ecc_q_y, q.y() },
191 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
192 { C::ecc_r_x, r.x() },
193 { C::ecc_r_y, r.y() },
195 { C::ecc_result_infinity, 1 },
198 { C::ecc_x_match, 1 },
199 { C::ecc_y_match, 0 },
202 check_relation<ecc>(
trace);
205TEST(EccAddConstrainingTest, EccAddingToInfinity)
213 auto trace = TestTraceContainer({ {
214 { C::ecc_add_op, 1 },
215 { C::ecc_double_op, 0 },
217 { C::ecc_inv_2_p_y, FF::zero() },
218 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
219 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
221 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
224 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
225 { C::ecc_p_x, p.x() },
226 { C::ecc_p_y, p.y() },
229 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
230 { C::ecc_q_x, q.x() },
231 { C::ecc_q_y, q.y() },
234 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
235 { C::ecc_r_x, r.x() },
236 { C::ecc_r_y, r.y() },
238 { C::ecc_result_infinity, 0 },
241 { C::ecc_x_match, 0 },
242 { C::ecc_y_match, 0 },
245 check_relation<ecc>(
trace);
248TEST(EccAddConstrainingTest, EccAddingInfinity)
255 auto trace = TestTraceContainer({ {
256 { C::ecc_add_op, 1 },
257 { C::ecc_double_op, 0 },
259 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
260 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
261 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
263 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
266 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
267 { C::ecc_p_x, p.x() },
268 { C::ecc_p_y, p.y() },
271 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
272 { C::ecc_q_x, q.x() },
273 { C::ecc_q_y, q.y() },
276 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
277 { C::ecc_r_x, r.x() },
278 { C::ecc_r_y, r.y() },
280 { C::ecc_result_infinity, 0 },
283 { C::ecc_x_match, 0 },
284 { C::ecc_y_match, 0 },
288 check_relation<ecc>(
trace);
291TEST(EccAddConstrainingTest, EccDoublingInf)
298 auto trace = TestTraceContainer({ {
299 { C::ecc_add_op, 0 },
300 { C::ecc_double_op, 1 },
302 { C::ecc_inv_2_p_y, FF::zero() },
303 { C::ecc_inv_x_diff, FF::zero() },
304 { C::ecc_inv_y_diff, FF::zero() },
306 { C::ecc_lambda, FF::zero() },
309 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
310 { C::ecc_p_x, p.x() },
311 { C::ecc_p_y, p.y() },
314 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
315 { C::ecc_q_x, p.x() },
316 { C::ecc_q_y, p.y() },
319 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
320 { C::ecc_r_x, r.x() },
321 { C::ecc_r_y, r.y() },
323 { C::ecc_result_infinity, 1 },
326 { C::ecc_x_match, 1 },
327 { C::ecc_y_match, 1 },
331 check_relation<ecc>(
trace);
334TEST(EccAddConstrainingTest, EccTwoOps)
339 auto trace = TestTraceContainer({ {
340 { C::ecc_add_op, 1 },
341 { C::ecc_double_op, 0 },
343 { C::ecc_inv_2_p_y, FF::zero() },
344 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
345 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
347 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
350 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
351 { C::ecc_p_x, p.x() },
352 { C::ecc_p_y, p.y() },
355 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
356 { C::ecc_q_x, q.x() },
357 { C::ecc_q_y, q.y() },
360 { C::ecc_r_is_inf,
static_cast<int>(r1.is_infinity()) },
361 { C::ecc_r_x, r1.x() },
362 { C::ecc_r_y, r1.y() },
364 { C::ecc_result_infinity, 0 },
367 { C::ecc_use_computed_result, 1 },
368 { C::ecc_x_match, 0 },
369 { C::ecc_y_match, 0 },
373 { C::ecc_add_op, 0 },
374 { C::ecc_double_op, 1 },
376 { C::ecc_inv_2_p_y, (r1.y() * 2).invert() },
377 { C::ecc_inv_x_diff, FF::zero() },
378 { C::ecc_inv_y_diff, FF::zero() },
380 { C::ecc_lambda, (r1.x() * r1.x() * 3) / (r1.y() * 2) },
383 { C::ecc_p_is_inf,
static_cast<int>(r1.is_infinity()) },
384 { C::ecc_p_x, r1.x() },
385 { C::ecc_p_y, r1.y() },
388 { C::ecc_q_is_inf,
static_cast<int>(r1.is_infinity()) },
389 { C::ecc_q_x, r1.x() },
390 { C::ecc_q_y, r1.y() },
393 { C::ecc_r_is_inf,
static_cast<int>(r2.is_infinity()) },
394 { C::ecc_r_x, r2.x() },
395 { C::ecc_r_y, r2.y() },
397 { C::ecc_result_infinity, 0 },
400 { C::ecc_use_computed_result, 1 },
401 { C::ecc_x_match, 1 },
402 { C::ecc_y_match, 1 },
406 check_relation<ecc>(
trace);
409TEST(EccAddConstrainingTest, EccNegativeBadAdd)
413 FF r_x(
"0x20f096ae3de9aea007e0b94a0274b2443d6682d1901f6909f284ec967bc169be");
414 FF r_y(
"0x27948713833bb314e828f2b6f45f408da6564a3ac03b9e430a9c6634bb849ef2");
417 auto trace = TestTraceContainer({ {
418 { C::ecc_add_op, 1 },
419 { C::ecc_double_op, 0 },
421 { C::ecc_inv_2_p_y, FF::zero() },
422 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
423 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
425 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
428 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
429 { C::ecc_p_x, p.x() },
430 { C::ecc_p_y, p.y() },
433 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
434 { C::ecc_q_x, q.x() },
435 { C::ecc_q_y, q.y() },
438 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
439 { C::ecc_r_x, r.x() },
440 { C::ecc_r_y, r.y() },
442 { C::ecc_result_infinity, 0 },
445 { C::ecc_x_match, 0 },
446 { C::ecc_y_match, 0 },
453TEST(EccAddConstrainingTest, EccNegativeBadDouble)
457 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
458 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
461 auto trace = TestTraceContainer({ {
462 { C::ecc_add_op, 0 },
463 { C::ecc_double_op, 1 },
465 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
466 { C::ecc_inv_x_diff, FF::zero() },
467 { C::ecc_inv_y_diff, FF::zero() },
469 { C::ecc_lambda, (p.x() * p.x() * 3) / (p.y() * 2) },
472 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
473 { C::ecc_p_x, p.x() },
474 { C::ecc_p_y, p.y() },
477 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
478 { C::ecc_q_x, p.x() },
479 { C::ecc_q_y, p.y() },
482 { C::ecc_r_is_inf,
static_cast<int>(r.is_infinity()) },
483 { C::ecc_r_x, r.x() },
484 { C::ecc_r_y, r.y() },
486 { C::ecc_result_infinity, 0 },
489 { C::ecc_x_match, 1 },
490 { C::ecc_y_match, 1 },
497TEST(ScalarMulConstrainingTest, ScalarMulEmptyRow)
502TEST(ScalarMulConstrainingTest, MulByOne)
506 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
507 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
508 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
511 StrictMock<MockGreaterThan>
gt;
512 PureToRadix to_radix_simulator = PureToRadix();
516 ecc_add_event_emitter,
517 scalar_mul_event_emitter,
518 ecc_add_memory_event_emitter);
521 ecc_simulator.scalar_mul(p, scalar);
523 TestTraceContainer
trace({
524 { { C::precomputed_first_row, 1 } },
527 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
529 check_relation<scalar_mul>(
trace);
532TEST(ScalarMulConstrainingTest, BasicMul)
536 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
537 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
538 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
541 StrictMock<MockGreaterThan>
gt;
542 PureToRadix to_radix_simulator = PureToRadix();
546 ecc_add_event_emitter,
547 scalar_mul_event_emitter,
548 ecc_add_memory_event_emitter);
550 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
551 ecc_simulator.scalar_mul(p, scalar);
553 TestTraceContainer
trace({
554 { { C::precomputed_first_row, 1 } },
557 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
559 check_relation<scalar_mul>(
trace);
562TEST(ScalarMulConstrainingTest, MultipleInvocations)
566 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
567 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
568 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
571 StrictMock<MockGreaterThan>
gt;
572 PureToRadix to_radix_simulator = PureToRadix();
576 ecc_add_event_emitter,
577 scalar_mul_event_emitter,
578 ecc_add_memory_event_emitter);
580 ecc_simulator.scalar_mul(p,
FF(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6"));
581 ecc_simulator.scalar_mul(q,
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09"));
583 TestTraceContainer
trace({
584 { { C::precomputed_first_row, 1 } },
587 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
589 check_relation<scalar_mul>(
trace);
592TEST(ScalarMulConstrainingTest, MulInteractions)
596 EventEmitter<EccAddEvent> ecc_add_event_emitter;
597 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
598 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
599 EventEmitter<ToRadixEvent> to_radix_event_emitter;
600 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
603 StrictMock<MockGreaterThan>
gt;
604 ToRadixSimulator to_radix_simulator(
execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
608 ecc_add_event_emitter,
609 scalar_mul_event_emitter,
610 ecc_add_memory_event_emitter);
612 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
613 ecc_simulator.scalar_mul(p, scalar);
615 TestTraceContainer
trace({
616 { { C::precomputed_first_row, 1 } },
619 ToRadixTraceBuilder to_radix_builder;
620 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
621 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
622 to_radix_builder.
process(to_radix_event_emitter.dump_events(),
trace);
630TEST(ScalarMulConstrainingTest, MulAddInteractionsInfinity)
634 EventEmitter<EccAddEvent> ecc_add_event_emitter;
635 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
636 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
639 StrictMock<MockGreaterThan>
gt;
640 PureToRadix to_radix_simulator = PureToRadix();
644 ecc_add_event_emitter,
645 scalar_mul_event_emitter,
646 ecc_add_memory_event_emitter);
649 ASSERT_TRUE(result.is_infinity());
651 TestTraceContainer
trace({
652 { { C::precomputed_first_row, 1 } },
655 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
656 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
658 check_interaction<EccTraceBuilder, lookup_scalar_mul_double_settings, lookup_scalar_mul_add_settings>(
trace);
660 check_relation<scalar_mul>(
trace);
661 check_relation<ecc>(
trace);
664TEST(ScalarMulConstrainingTest, NegativeMulAddInteractions)
668 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
669 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
670 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
673 StrictMock<MockGreaterThan>
gt;
674 PureToRadix to_radix_simulator = PureToRadix();
678 ecc_add_event_emitter,
679 scalar_mul_event_emitter,
680 ecc_add_memory_event_emitter);
682 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
683 ecc_simulator.scalar_mul(p, scalar);
685 TestTraceContainer
trace({
686 { { C::precomputed_first_row, 1 } },
689 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
692 "Failed.*SCALAR_MUL_DOUBLE. Could not find tuple in destination.");
694 "Failed.*SCALAR_MUL_ADD. Could not find tuple in destination.");
697TEST(ScalarMulConstrainingTest, NegativeMulRadixInteractions)
701 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
702 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
703 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
706 StrictMock<MockGreaterThan>
gt;
707 PureToRadix to_radix_simulator = PureToRadix();
711 ecc_add_event_emitter,
712 scalar_mul_event_emitter,
713 ecc_add_memory_event_emitter);
715 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
716 ecc_simulator.scalar_mul(p, scalar);
718 TestTraceContainer
trace({
719 { { C::precomputed_first_row, 1 } },
722 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
725 "Failed.*SCALAR_MUL_TO_RADIX. Could not find tuple in destination.");
727 check_relation<scalar_mul>(
trace);
730TEST(ScalarMulConstrainingTest, NegativeDisableSel)
734 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
735 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
736 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
739 StrictMock<MockGreaterThan>
gt;
740 PureToRadix to_radix_simulator = PureToRadix();
744 ecc_add_event_emitter,
745 scalar_mul_event_emitter,
746 ecc_add_memory_event_emitter);
748 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
749 ecc_simulator.scalar_mul(p, scalar);
751 TestTraceContainer
trace({
752 { { C::precomputed_first_row, 1 } },
755 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
757 trace.
set(Column::scalar_mul_sel, 5, 0);
759 "SELECTOR_CONSISTENCY");
762TEST(ScalarMulConstrainingTest, NegativeEnableStartFirstRow)
766 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
767 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
768 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
771 StrictMock<MockGreaterThan>
gt;
772 PureToRadix to_radix_simulator = PureToRadix();
776 ecc_add_event_emitter,
777 scalar_mul_event_emitter,
778 ecc_add_memory_event_emitter);
780 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
781 ecc_simulator.scalar_mul(p, scalar);
783 TestTraceContainer
trace({
784 { { C::precomputed_first_row, 1 } },
787 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
789 trace.
set(Column::scalar_mul_start, 0, 1);
793TEST(ScalarMulConstrainingTest, NegativeMutateScalarOnEnd)
797 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
798 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
799 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
802 StrictMock<MockGreaterThan>
gt;
803 PureToRadix to_radix_simulator = PureToRadix();
807 ecc_add_event_emitter,
808 scalar_mul_event_emitter,
809 ecc_add_memory_event_emitter);
811 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
812 ecc_simulator.scalar_mul(p, scalar);
814 TestTraceContainer
trace({
815 { { C::precomputed_first_row, 1 } },
818 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
820 trace.
set(Column::scalar_mul_scalar, 254, 27);
822 "INPUT_CONSISTENCY_SCALAR");
825TEST(ScalarMulConstrainingTest, NegativeMutatePointXOnEnd)
829 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
830 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
831 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
834 StrictMock<MockGreaterThan>
gt;
835 PureToRadix to_radix_simulator = PureToRadix();
839 ecc_add_event_emitter,
840 scalar_mul_event_emitter,
841 ecc_add_memory_event_emitter);
843 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
844 ecc_simulator.scalar_mul(p, scalar);
846 TestTraceContainer
trace({
847 { { C::precomputed_first_row, 1 } },
850 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
852 trace.
set(Column::scalar_mul_point_x, 254, q.x());
855 "INPUT_CONSISTENCY_X");
858TEST(ScalarMulConstrainingTest, NegativeMutatePointYOnEnd)
862 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
863 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
864 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
867 StrictMock<MockGreaterThan>
gt;
868 PureToRadix to_radix_simulator = PureToRadix();
872 ecc_add_event_emitter,
873 scalar_mul_event_emitter,
874 ecc_add_memory_event_emitter);
876 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
877 ecc_simulator.scalar_mul(p, scalar);
879 TestTraceContainer
trace({
880 { { C::precomputed_first_row, 1 } },
883 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
885 trace.
set(Column::scalar_mul_point_y, 254, q.y());
888 "INPUT_CONSISTENCY_Y");
891TEST(ScalarMulConstrainingTest, NegativeMutatePointInfOnEnd)
895 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
896 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
897 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
900 StrictMock<MockGreaterThan>
gt;
901 PureToRadix to_radix_simulator = PureToRadix();
905 ecc_add_event_emitter,
906 scalar_mul_event_emitter,
907 ecc_add_memory_event_emitter);
909 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
910 ecc_simulator.scalar_mul(p, scalar);
912 TestTraceContainer
trace({
913 { { C::precomputed_first_row, 1 } },
916 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
918 trace.
set(Column::scalar_mul_point_inf, 254, 1);
921 "INPUT_CONSISTENCY_INF");
928TEST(EccAddMemoryConstrainingTest, EccAddMemoryEmptyRow)
933TEST(EccAddMemoryConstrainingTest, EccAddMemory)
935 TestTraceContainer
trace;
939 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
940 EventEmitter<EccAddEvent> ecc_add_event_emitter;
941 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
942 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
946 .WillRepeatedly(Return(0));
948 PureToRadix to_radix_simulator = PureToRadix();
952 ecc_add_event_emitter,
953 scalar_mul_event_emitter,
954 ecc_add_memory_event_emitter);
957 ecc_simulator.add(memory, p, q, dst_address);
958 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
959 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
961 check_relation<mem_aware_ecc>(
trace);
964TEST(EccAddMemoryConstrainingTest, EccAddMemoryInteractions)
972 .WillRepeatedly(Return(0));
974 PureToRadix to_radix_simulator = PureToRadix();
976 EventEmitter<EccAddEvent> ecc_add_event_emitter;
977 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
978 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
979 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
983 ecc_add_event_emitter,
984 scalar_mul_event_emitter,
985 ecc_add_memory_event_emitter);
989 uint32_t dst_address = 0x1000;
991 TestTraceContainer
trace = TestTraceContainer({
995 { C::execution_sel, 1 },
996 { C::execution_sel_exec_dispatch_ecc_add, 1 },
997 { C::execution_rop_6_, dst_address },
998 { C::execution_register_0_, p.x() },
999 { C::execution_register_1_, p.y() },
1000 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1001 { C::execution_register_3_, q.x() },
1002 { C::execution_register_4_, q.y() },
1003 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1006 { C::gt_input_a, dst_address + 2 },
1010 { C::memory_address, dst_address },
1011 { C::memory_value, result.x() },
1012 { C::memory_sel, 1 },
1013 { C::memory_rw, 1 },
1018 { C::memory_address, dst_address + 1 },
1019 { C::memory_value, result.y() },
1020 { C::memory_sel, 1 },
1021 { C::memory_rw, 1 },
1026 { C::memory_address, dst_address + 2 },
1027 { C::memory_value, result.is_infinity() },
1028 { C::memory_sel, 1 },
1029 { C::memory_rw, 1 },
1034 ecc_simulator.add(memory, p, q, dst_address);
1036 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1037 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
1039 check_all_interactions<EccTraceBuilder>(
trace);
1040 check_relation<mem_aware_ecc>(
trace);
1043TEST(EccAddMemoryConstrainingTest, EccAddMemoryInvalidDstRange)
1049 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1050 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1051 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1052 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1056 .WillRepeatedly(Return(0));
1058 PureToRadix to_radix_simulator = PureToRadix();
1063 ecc_add_event_emitter,
1064 scalar_mul_event_emitter,
1065 ecc_add_memory_event_emitter);
1069 TestTraceContainer
trace = TestTraceContainer({
1073 { C::execution_sel, 1 },
1074 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1075 { C::execution_rop_6_, dst_address },
1076 { C::execution_register_0_, p.x() },
1077 { C::execution_register_1_, p.y() },
1078 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1079 { C::execution_register_3_, q.x() },
1080 { C::execution_register_4_, q.y() },
1081 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1082 { C::execution_sel_opcode_error, 1 },
1085 { C::gt_input_a,
static_cast<uint64_t
>(dst_address) + 2 },
1093 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1094 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1096 check_all_interactions<EccTraceBuilder>(
trace);
1097 check_relation<mem_aware_ecc>(
trace);
1100TEST(EccAddMemoryConstrainingTest, EccAddMemoryPointError)
1105 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1106 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1107 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1111 .WillRepeatedly(Return(0));
1113 PureToRadix to_radix_simulator = PureToRadix();
1118 ecc_add_event_emitter,
1119 scalar_mul_event_emitter,
1120 ecc_add_memory_event_emitter);
1123 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
1124 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
1127 uint32_t dst_address = 0x1000;
1131 TestTraceContainer
trace = TestTraceContainer({
1135 { C::execution_sel, 1 },
1136 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1137 { C::execution_rop_6_, dst_address },
1138 { C::execution_register_0_, p.x() },
1139 { C::execution_register_1_, p.y() },
1140 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1141 { C::execution_register_3_, q.x() },
1142 { C::execution_register_4_, q.y() },
1143 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1144 { C::execution_sel_opcode_error, 1 },
1147 { C::gt_input_a, dst_address + 2 },
1153 EXPECT_THROW(ecc_simulator.add(memory, p, q, dst_address), simulation::EccException);
1155 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1157 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1159 check_all_interactions<EccTraceBuilder>(
trace);
1160 check_relation<mem_aware_ecc>(
trace);
#define AVM_HIGHEST_MEM_ADDRESS
static const StandardAffinePoint & infinity()
static constexpr size_t SR_OUTPUT_X_COORD
static constexpr size_t SR_INPUT_CONSISTENCY_X
static constexpr size_t SR_INPUT_CONSISTENCY_INF
static constexpr size_t SR_SELECTOR_CONSISTENCY
static constexpr size_t SR_SELECTOR_ON_START
static constexpr size_t SR_INPUT_CONSISTENCY_Y
static constexpr size_t SR_INPUT_CONSISTENCY_SCALAR
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
ExecutionIdManager execution_id_manager
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()
lookup_settings< lookup_scalar_mul_double_settings_ > lookup_scalar_mul_double_settings
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
lookup_settings< lookup_scalar_mul_to_radix_settings_ > lookup_scalar_mul_to_radix_settings
lookup_settings< lookup_scalar_mul_add_settings_ > lookup_scalar_mul_add_settings