1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
32using ::testing::Return;
33using ::testing::StrictMock;
35using tracegen::EccTraceBuilder;
36using tracegen::TestTraceContainer;
37using tracegen::ToRadixTraceBuilder;
44using EccSimulator = simulation::Ecc;
45using ToRadixSimulator = simulation::ToRadix;
47using simulation::EccAddEvent;
48using simulation::EccAddMemoryEvent;
49using simulation::EventEmitter;
50using simulation::FakeGreaterThan;
51using simulation::FakeToRadix;
52using simulation::MemoryStore;
53using simulation::MockExecutionIdManager;
54using simulation::MockGreaterThan;
55using simulation::MockMemory;
56using simulation::NoopEventEmitter;
57using simulation::ScalarMulEvent;
58using simulation::ToRadixEvent;
59using simulation::ToRadixMemoryEvent;
62FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
63FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
66FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
67FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
70TEST(EccAddConstrainingTest, EccEmptyRow)
75TEST(EccAddConstrainingTest, EccAdd)
78 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
79 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
86 .ecc_inv_2_p_y = FF::zero(),
87 .ecc_inv_x_diff = (q.x() - p.x()).invert(),
88 .ecc_inv_y_diff = (q.y() - p.y()).invert(),
90 .ecc_lambda = (q.y() - p.y()) / (q.x() - p.x()),
93 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
98 .ecc_q_is_inf =
static_cast<int>(q.is_infinity()),
103 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
107 .ecc_result_infinity = 0,
110 .ecc_use_computed_result = 1,
116 check_relation<ecc>(
trace);
119TEST(EccAddConstrainingTest, EccDouble)
122 FF r_x(
"0x088b996194bb5e6e8e5e49733bb671c3e660cf77254f743f366cc8e33534ee3b");
123 FF r_y(
"0x2807ffa01c0f522d0be1e1acfb6914ac8eabf1acf420c0629d37beee992e9a0e");
130 .ecc_inv_2_p_y = (p.y() * 2).invert(),
131 .ecc_inv_x_diff = FF::zero(),
132 .ecc_inv_y_diff = FF::zero(),
134 .ecc_lambda = (p.x() * p.x() * 3) / (p.y() * 2),
137 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
142 .ecc_q_is_inf =
static_cast<int>(p.is_infinity()),
147 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
151 .ecc_result_infinity = 0,
154 .ecc_use_computed_result = 1,
160 check_relation<ecc>(
trace);
163TEST(EccAddConstrainingTest, EccAddResultingInInfinity)
173 .ecc_inv_2_p_y = FF::zero(),
174 .ecc_inv_x_diff = FF::zero(),
175 .ecc_inv_y_diff = (q.y() - p.y()).invert(),
180 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
185 .ecc_q_is_inf =
static_cast<int>(q.is_infinity()),
190 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
194 .ecc_result_infinity = 1,
201 check_relation<ecc>(
trace);
204TEST(EccAddConstrainingTest, EccAddingToInfinity)
216 .ecc_inv_2_p_y = FF::zero(),
217 .ecc_inv_x_diff = (q.x() - p.x()).invert(),
218 .ecc_inv_y_diff = (q.y() - p.y()).invert(),
220 .ecc_lambda = (q.y() - p.y()) / (q.x() - p.x()),
223 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
228 .ecc_q_is_inf =
static_cast<int>(q.is_infinity()),
233 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
237 .ecc_result_infinity = 0,
244 check_relation<ecc>(
trace);
247TEST(EccAddConstrainingTest, EccAddingInfinity)
258 .ecc_inv_2_p_y = (p.y() * 2).invert(),
259 .ecc_inv_x_diff = (q.x() - p.x()).invert(),
260 .ecc_inv_y_diff = (q.y() - p.y()).invert(),
262 .ecc_lambda = (q.y() - p.y()) / (q.x() - p.x()),
265 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
270 .ecc_q_is_inf =
static_cast<int>(q.is_infinity()),
275 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
279 .ecc_result_infinity = 0,
287 check_relation<ecc>(
trace);
290TEST(EccAddConstrainingTest, EccDoublingInf)
301 .ecc_inv_2_p_y = FF::zero(),
302 .ecc_inv_x_diff = FF::zero(),
303 .ecc_inv_y_diff = FF::zero(),
305 .ecc_lambda = FF::zero(),
308 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
313 .ecc_q_is_inf =
static_cast<int>(p.is_infinity()),
318 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
322 .ecc_result_infinity = 1,
330 check_relation<ecc>(
trace);
333TEST(EccAddConstrainingTest, EccTwoOps)
342 .ecc_inv_2_p_y = FF::zero(),
343 .ecc_inv_x_diff = (q.x() - p.x()).invert(),
344 .ecc_inv_y_diff = (q.y() - p.y()).invert(),
346 .ecc_lambda = (q.y() - p.y()) / (q.x() - p.x()),
349 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
354 .ecc_q_is_inf =
static_cast<int>(q.is_infinity()),
359 .ecc_r_is_inf =
static_cast<int>(r1.is_infinity()),
363 .ecc_result_infinity = 0,
366 .ecc_use_computed_result = 1,
375 .ecc_inv_2_p_y = (r1.y() * 2).invert(),
376 .ecc_inv_x_diff = FF::zero(),
377 .ecc_inv_y_diff = FF::zero(),
379 .ecc_lambda = (r1.x() * r1.x() * 3) / (r1.y() * 2),
382 .ecc_p_is_inf =
static_cast<int>(r1.is_infinity()),
387 .ecc_q_is_inf =
static_cast<int>(r1.is_infinity()),
392 .ecc_r_is_inf =
static_cast<int>(r2.is_infinity()),
396 .ecc_result_infinity = 0,
399 .ecc_use_computed_result = 1,
405 check_relation<ecc>(
trace);
408TEST(EccAddConstrainingTest, EccNegativeBadAdd)
412 FF r_x(
"0x20f096ae3de9aea007e0b94a0274b2443d6682d1901f6909f284ec967bc169be");
413 FF r_y(
"0x27948713833bb314e828f2b6f45f408da6564a3ac03b9e430a9c6634bb849ef2");
420 .ecc_inv_2_p_y = FF::zero(),
421 .ecc_inv_x_diff = (q.x() - p.x()).invert(),
422 .ecc_inv_y_diff = (q.y() - p.y()).invert(),
424 .ecc_lambda = (q.y() - p.y()) / (q.x() - p.x()),
427 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
432 .ecc_q_is_inf =
static_cast<int>(q.is_infinity()),
437 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
441 .ecc_result_infinity = 0,
452TEST(EccAddConstrainingTest, EccNegativeBadDouble)
456 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
457 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
464 .ecc_inv_2_p_y = (p.y() * 2).invert(),
465 .ecc_inv_x_diff = FF::zero(),
466 .ecc_inv_y_diff = FF::zero(),
468 .ecc_lambda = (p.x() * p.x() * 3) / (p.y() * 2),
471 .ecc_p_is_inf =
static_cast<int>(p.is_infinity()),
476 .ecc_q_is_inf =
static_cast<int>(p.is_infinity()),
481 .ecc_r_is_inf =
static_cast<int>(r.is_infinity()),
485 .ecc_result_infinity = 0,
496TEST(ScalarMulConstrainingTest, ScalarMulEmptyRow)
501TEST(ScalarMulConstrainingTest, MulByOne)
505 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
506 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
507 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
510 StrictMock<MockGreaterThan>
gt;
511 FakeToRadix to_radix_simulator = FakeToRadix();
515 ecc_add_event_emitter,
516 scalar_mul_event_emitter,
517 ecc_add_memory_event_emitter);
520 ecc_simulator.scalar_mul(p, scalar);
523 { .precomputed_first_row = 1 },
526 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
528 check_relation<scalar_mul>(
trace);
531TEST(ScalarMulConstrainingTest, BasicMul)
535 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
536 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
537 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
540 StrictMock<MockGreaterThan>
gt;
541 FakeToRadix to_radix_simulator = FakeToRadix();
545 ecc_add_event_emitter,
546 scalar_mul_event_emitter,
547 ecc_add_memory_event_emitter);
549 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
550 ecc_simulator.scalar_mul(p, scalar);
553 { .precomputed_first_row = 1 },
556 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
558 check_relation<scalar_mul>(
trace);
561TEST(ScalarMulConstrainingTest, MultipleInvocations)
565 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
566 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
567 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
570 StrictMock<MockGreaterThan>
gt;
571 FakeToRadix to_radix_simulator = FakeToRadix();
575 ecc_add_event_emitter,
576 scalar_mul_event_emitter,
577 ecc_add_memory_event_emitter);
579 ecc_simulator.scalar_mul(p,
FF(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6"));
580 ecc_simulator.scalar_mul(q,
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09"));
583 { .precomputed_first_row = 1 },
586 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
588 check_relation<scalar_mul>(
trace);
591TEST(ScalarMulConstrainingTest, MulInteractions)
595 EventEmitter<EccAddEvent> ecc_add_event_emitter;
596 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
597 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
598 EventEmitter<ToRadixEvent> to_radix_event_emitter;
599 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
602 StrictMock<MockGreaterThan>
gt;
603 ToRadixSimulator to_radix_simulator(
execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
607 ecc_add_event_emitter,
608 scalar_mul_event_emitter,
609 ecc_add_memory_event_emitter);
611 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
612 ecc_simulator.scalar_mul(p, scalar);
615 { .precomputed_first_row = 1 },
618 ToRadixTraceBuilder to_radix_builder;
619 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
620 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
621 to_radix_builder.process(to_radix_event_emitter.dump_events(),
trace);
629TEST(ScalarMulConstrainingTest, MulAddInteractionsInfinity)
633 EventEmitter<EccAddEvent> ecc_add_event_emitter;
634 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
635 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
638 StrictMock<MockGreaterThan>
gt;
639 FakeToRadix to_radix_simulator = FakeToRadix();
643 ecc_add_event_emitter,
644 scalar_mul_event_emitter,
645 ecc_add_memory_event_emitter);
648 ASSERT_TRUE(result.is_infinity());
651 { .precomputed_first_row = 1 },
654 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
655 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
657 check_interaction<EccTraceBuilder, lookup_scalar_mul_double_settings, lookup_scalar_mul_add_settings>(
trace);
659 check_relation<scalar_mul>(
trace);
660 check_relation<ecc>(
trace);
663TEST(ScalarMulConstrainingTest, NegativeMulAddInteractions)
667 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
668 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
669 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
672 StrictMock<MockGreaterThan>
gt;
673 FakeToRadix to_radix_simulator = FakeToRadix();
677 ecc_add_event_emitter,
678 scalar_mul_event_emitter,
679 ecc_add_memory_event_emitter);
681 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
682 ecc_simulator.scalar_mul(p, scalar);
685 { .precomputed_first_row = 1 },
688 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
691 "Failed.*SCALAR_MUL_DOUBLE. Could not find tuple in destination.");
693 "Failed.*SCALAR_MUL_ADD. Could not find tuple in destination.");
696TEST(ScalarMulConstrainingTest, NegativeMulRadixInteractions)
700 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
701 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
702 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
705 StrictMock<MockGreaterThan>
gt;
706 FakeToRadix to_radix_simulator = FakeToRadix();
710 ecc_add_event_emitter,
711 scalar_mul_event_emitter,
712 ecc_add_memory_event_emitter);
714 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
715 ecc_simulator.scalar_mul(p, scalar);
718 { .precomputed_first_row = 1 },
721 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
724 "Failed.*SCALAR_MUL_TO_RADIX. Could not find tuple in destination.");
726 check_relation<scalar_mul>(
trace);
729TEST(ScalarMulConstrainingTest, NegativeDisableSel)
733 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
734 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
735 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
738 StrictMock<MockGreaterThan>
gt;
739 FakeToRadix to_radix_simulator = FakeToRadix();
743 ecc_add_event_emitter,
744 scalar_mul_event_emitter,
745 ecc_add_memory_event_emitter);
747 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
748 ecc_simulator.scalar_mul(p, scalar);
751 { .precomputed_first_row = 1 },
754 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
756 trace.
set(Column::scalar_mul_sel, 5, 0);
758 "SELECTOR_CONSISTENCY");
761TEST(ScalarMulConstrainingTest, NegativeEnableStartFirstRow)
765 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
766 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
767 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
770 StrictMock<MockGreaterThan>
gt;
771 FakeToRadix to_radix_simulator = FakeToRadix();
775 ecc_add_event_emitter,
776 scalar_mul_event_emitter,
777 ecc_add_memory_event_emitter);
779 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
780 ecc_simulator.scalar_mul(p, scalar);
783 { .precomputed_first_row = 1 },
786 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
788 trace.
set(Column::scalar_mul_start, 0, 1);
792TEST(ScalarMulConstrainingTest, NegativeMutateScalarOnEnd)
796 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
797 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
798 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
801 StrictMock<MockGreaterThan>
gt;
802 FakeToRadix to_radix_simulator = FakeToRadix();
806 ecc_add_event_emitter,
807 scalar_mul_event_emitter,
808 ecc_add_memory_event_emitter);
810 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
811 ecc_simulator.scalar_mul(p, scalar);
814 { .precomputed_first_row = 1 },
817 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
819 trace.
set(Column::scalar_mul_scalar, 254, 27);
821 "INPUT_CONSISTENCY_SCALAR");
824TEST(ScalarMulConstrainingTest, NegativeMutatePointXOnEnd)
828 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
829 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
830 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
833 StrictMock<MockGreaterThan>
gt;
834 FakeToRadix to_radix_simulator = FakeToRadix();
838 ecc_add_event_emitter,
839 scalar_mul_event_emitter,
840 ecc_add_memory_event_emitter);
842 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
843 ecc_simulator.scalar_mul(p, scalar);
846 { .precomputed_first_row = 1 },
849 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
851 trace.
set(Column::scalar_mul_point_x, 254, q.x());
854 "INPUT_CONSISTENCY_X");
857TEST(ScalarMulConstrainingTest, NegativeMutatePointYOnEnd)
861 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
862 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
863 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
866 StrictMock<MockGreaterThan>
gt;
867 FakeToRadix to_radix_simulator = FakeToRadix();
871 ecc_add_event_emitter,
872 scalar_mul_event_emitter,
873 ecc_add_memory_event_emitter);
875 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
876 ecc_simulator.scalar_mul(p, scalar);
879 { .precomputed_first_row = 1 },
882 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
884 trace.
set(Column::scalar_mul_point_y, 254, q.y());
887 "INPUT_CONSISTENCY_Y");
890TEST(ScalarMulConstrainingTest, NegativeMutatePointInfOnEnd)
894 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
895 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
896 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
899 StrictMock<MockGreaterThan>
gt;
900 FakeToRadix to_radix_simulator = FakeToRadix();
904 ecc_add_event_emitter,
905 scalar_mul_event_emitter,
906 ecc_add_memory_event_emitter);
908 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
909 ecc_simulator.scalar_mul(p, scalar);
912 { .precomputed_first_row = 1 },
915 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
917 trace.
set(Column::scalar_mul_point_inf, 254, 1);
920 "INPUT_CONSISTENCY_INF");
927TEST(EccAddMemoryConstrainingTest, EccAddMemoryEmptyRow)
932TEST(EccAddMemoryConstrainingTest, EccAddMemory)
934 TestTraceContainer
trace;
938 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
939 EventEmitter<EccAddEvent> ecc_add_event_emitter;
940 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
941 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
945 .WillRepeatedly(Return(0));
947 FakeToRadix to_radix_simulator = FakeToRadix();
951 ecc_add_event_emitter,
952 scalar_mul_event_emitter,
953 ecc_add_memory_event_emitter);
956 ecc_simulator.add(memory, p, q, dst_address);
957 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
958 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
960 check_relation<mem_aware_ecc>(
trace);
963TEST(EccAddMemoryConstrainingTest, EccAddMemoryInteractions)
971 .WillRepeatedly(Return(0));
973 FakeToRadix to_radix_simulator = FakeToRadix();
975 EventEmitter<EccAddEvent> ecc_add_event_emitter;
976 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
977 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
978 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
982 ecc_add_event_emitter,
983 scalar_mul_event_emitter,
984 ecc_add_memory_event_emitter);
988 uint32_t dst_address = 0x1000;
990 TestTraceContainer
trace = TestTraceContainer({
994 { C::execution_sel, 1 },
995 { C::execution_sel_execute_ecc_add, 1 },
996 { C::execution_rop_6_, dst_address },
997 { C::execution_register_0_, p.x() },
998 { C::execution_register_1_, p.y() },
999 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1000 { C::execution_register_3_, q.x() },
1001 { C::execution_register_4_, q.y() },
1002 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1005 { C::gt_input_a, dst_address + 2 },
1009 { C::memory_address, dst_address },
1010 { C::memory_value, result.x() },
1011 { C::memory_sel, 1 },
1012 { C::memory_rw, 1 },
1017 { C::memory_address, dst_address + 1 },
1018 { C::memory_value, result.y() },
1019 { C::memory_sel, 1 },
1020 { C::memory_rw, 1 },
1025 { C::memory_address, dst_address + 2 },
1026 { C::memory_value, result.is_infinity() },
1027 { C::memory_sel, 1 },
1028 { C::memory_rw, 1 },
1033 ecc_simulator.add(memory, p, q, dst_address);
1035 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1036 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
1038 check_all_interactions<EccTraceBuilder>(
trace);
1039 check_relation<mem_aware_ecc>(
trace);
1042TEST(EccAddMemoryConstrainingTest, EccAddMemoryInvalidDstRange)
1048 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1049 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1050 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1051 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1055 .WillRepeatedly(Return(0));
1057 FakeToRadix to_radix_simulator = FakeToRadix();
1062 ecc_add_event_emitter,
1063 scalar_mul_event_emitter,
1064 ecc_add_memory_event_emitter);
1068 TestTraceContainer
trace = TestTraceContainer({
1072 { C::execution_sel, 1 },
1073 { C::execution_sel_execute_ecc_add, 1 },
1074 { C::execution_rop_6_, dst_address },
1075 { C::execution_register_0_, p.x() },
1076 { C::execution_register_1_, p.y() },
1077 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1078 { C::execution_register_3_, q.x() },
1079 { C::execution_register_4_, q.y() },
1080 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1081 { C::execution_sel_opcode_error, 1 },
1084 { C::gt_input_a,
static_cast<uint64_t
>(dst_address) + 2 },
1092 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1093 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1095 check_all_interactions<EccTraceBuilder>(
trace);
1096 check_relation<mem_aware_ecc>(
trace);
1099TEST(EccAddMemoryConstrainingTest, EccAddMemoryPointError)
1104 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1105 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1106 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1110 .WillRepeatedly(Return(0));
1112 FakeToRadix to_radix_simulator = FakeToRadix();
1117 ecc_add_event_emitter,
1118 scalar_mul_event_emitter,
1119 ecc_add_memory_event_emitter);
1122 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
1123 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
1126 uint32_t dst_address = 0x1000;
1130 TestTraceContainer
trace = TestTraceContainer({
1134 { C::execution_sel, 1 },
1135 { C::execution_sel_execute_ecc_add, 1 },
1136 { C::execution_rop_6_, dst_address },
1137 { C::execution_register_0_, p.x() },
1138 { C::execution_register_1_, p.y() },
1139 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1140 { C::execution_register_3_, q.x() },
1141 { C::execution_register_4_, q.y() },
1142 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1143 { C::execution_sel_opcode_error, 1 },
1146 { C::gt_input_a, dst_address + 2 },
1152 EXPECT_THROW(ecc_simulator.add(memory, p, q, dst_address), simulation::EccException);
1154 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1156 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1158 check_all_interactions<EccTraceBuilder>(
trace);
1159 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
static TestTraceContainer from_rows(const std::vector< AvmFullRow > &rows)
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