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 },
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() },
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 },
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 },
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 },
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 },
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() },
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 },
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() },
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);
563TEST(ScalarMulConstrainingTest, MulByZero)
567 EventEmitter<EccAddEvent> ecc_add_event_emitter;
568 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
569 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
572 StrictMock<MockGreaterThan>
gt;
573 PureToRadix to_radix_simulator = PureToRadix();
577 ecc_add_event_emitter,
578 scalar_mul_event_emitter,
579 ecc_add_memory_event_emitter);
586 ASSERT_TRUE(result.is_infinity());
588 TestTraceContainer
trace({
589 { { C::precomputed_first_row, 1 } },
592 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
593 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
596 check_relation<scalar_mul>(trace);
597 check_relation<ecc>(trace);
601TEST(ScalarMulConstrainingTest, MulByLargeScalar)
605 EventEmitter<EccAddEvent> ecc_add_event_emitter;
606 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
607 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
610 StrictMock<MockGreaterThan>
gt;
611 PureToRadix to_radix_simulator = PureToRadix();
615 ecc_add_event_emitter,
616 scalar_mul_event_emitter,
617 ecc_add_memory_event_emitter);
621 FF scalar =
FF(
"0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff");
629 TestTraceContainer
trace({
630 { { C::precomputed_first_row, 1 } },
633 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
634 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
637 check_relation<scalar_mul>(trace);
638 check_relation<ecc>(trace);
641TEST(ScalarMulConstrainingTest, MultipleInvocations)
645 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
646 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
647 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
650 StrictMock<MockGreaterThan>
gt;
651 PureToRadix to_radix_simulator = PureToRadix();
655 ecc_add_event_emitter,
656 scalar_mul_event_emitter,
657 ecc_add_memory_event_emitter);
659 ecc_simulator.scalar_mul(p,
FF(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6"));
660 ecc_simulator.scalar_mul(q,
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09"));
662 TestTraceContainer
trace({
663 { { C::precomputed_first_row, 1 } },
666 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
668 check_relation<scalar_mul>(trace);
671TEST(ScalarMulConstrainingTest, MulInteractions)
675 EventEmitter<EccAddEvent> ecc_add_event_emitter;
676 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
677 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
678 EventEmitter<ToRadixEvent> to_radix_event_emitter;
679 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
682 StrictMock<MockGreaterThan>
gt;
683 ToRadixSimulator to_radix_simulator(
execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
687 ecc_add_event_emitter,
688 scalar_mul_event_emitter,
689 ecc_add_memory_event_emitter);
691 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
692 ecc_simulator.scalar_mul(p, scalar);
694 TestTraceContainer
trace({
695 { { C::precomputed_first_row, 1 } },
698 ToRadixTraceBuilder to_radix_builder;
699 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
700 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
701 to_radix_builder.
process(to_radix_event_emitter.dump_events(), trace);
709TEST(ScalarMulConstrainingTest, MulAddInteractionsInfinity)
713 EventEmitter<EccAddEvent> ecc_add_event_emitter;
714 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
715 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
718 StrictMock<MockGreaterThan>
gt;
719 PureToRadix to_radix_simulator = PureToRadix();
723 ecc_add_event_emitter,
724 scalar_mul_event_emitter,
725 ecc_add_memory_event_emitter);
728 ASSERT_TRUE(result.is_infinity());
730 TestTraceContainer
trace({
731 { { C::precomputed_first_row, 1 } },
734 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
735 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
737 check_interaction<EccTraceBuilder, lookup_scalar_mul_double_settings, lookup_scalar_mul_add_settings>(trace);
739 check_relation<scalar_mul>(trace);
740 check_relation<ecc>(trace);
743TEST(ScalarMulConstrainingTest, NegativeMulAddInteractions)
747 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
748 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
749 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
752 StrictMock<MockGreaterThan>
gt;
753 PureToRadix to_radix_simulator = PureToRadix();
757 ecc_add_event_emitter,
758 scalar_mul_event_emitter,
759 ecc_add_memory_event_emitter);
761 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
762 ecc_simulator.scalar_mul(p, scalar);
764 TestTraceContainer
trace({
765 { { C::precomputed_first_row, 1 } },
768 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
771 "Failed.*SCALAR_MUL_DOUBLE. Could not find tuple in destination.");
773 "Failed.*SCALAR_MUL_ADD. Could not find tuple in destination.");
776TEST(ScalarMulConstrainingTest, NegativeMulRadixInteractions)
780 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
781 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
782 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
785 StrictMock<MockGreaterThan>
gt;
786 PureToRadix to_radix_simulator = PureToRadix();
790 ecc_add_event_emitter,
791 scalar_mul_event_emitter,
792 ecc_add_memory_event_emitter);
794 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
795 ecc_simulator.scalar_mul(p, scalar);
797 TestTraceContainer
trace({
798 { { C::precomputed_first_row, 1 } },
801 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
804 "Failed.*SCALAR_MUL_TO_RADIX. Could not find tuple in destination.");
806 check_relation<scalar_mul>(trace);
809TEST(ScalarMulConstrainingTest, NegativeDisableSel)
813 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
814 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
815 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
818 StrictMock<MockGreaterThan>
gt;
819 PureToRadix to_radix_simulator = PureToRadix();
823 ecc_add_event_emitter,
824 scalar_mul_event_emitter,
825 ecc_add_memory_event_emitter);
827 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
828 ecc_simulator.scalar_mul(p, scalar);
830 TestTraceContainer
trace({
831 { { C::precomputed_first_row, 1 } },
834 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
836 trace.
set(Column::scalar_mul_sel, 5, 0);
838 "SELECTOR_CONSISTENCY");
841TEST(ScalarMulConstrainingTest, NegativeEnableStartFirstRow)
845 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
846 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
847 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
850 StrictMock<MockGreaterThan>
gt;
851 PureToRadix to_radix_simulator = PureToRadix();
855 ecc_add_event_emitter,
856 scalar_mul_event_emitter,
857 ecc_add_memory_event_emitter);
859 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
860 ecc_simulator.scalar_mul(p, scalar);
862 TestTraceContainer
trace({
863 { { C::precomputed_first_row, 1 } },
866 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
868 trace.
set(Column::scalar_mul_start, 0, 1);
872TEST(ScalarMulConstrainingTest, NegativeMutateScalarOnEnd)
876 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
877 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
878 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
881 StrictMock<MockGreaterThan>
gt;
882 PureToRadix to_radix_simulator = PureToRadix();
886 ecc_add_event_emitter,
887 scalar_mul_event_emitter,
888 ecc_add_memory_event_emitter);
890 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
891 ecc_simulator.scalar_mul(p, scalar);
893 TestTraceContainer
trace({
894 { { C::precomputed_first_row, 1 } },
897 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
899 trace.
set(Column::scalar_mul_scalar, 254, 27);
901 "INPUT_CONSISTENCY_SCALAR");
904TEST(ScalarMulConstrainingTest, NegativeMutatePointXOnEnd)
908 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
909 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
910 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
913 StrictMock<MockGreaterThan>
gt;
914 PureToRadix to_radix_simulator = PureToRadix();
918 ecc_add_event_emitter,
919 scalar_mul_event_emitter,
920 ecc_add_memory_event_emitter);
922 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
923 ecc_simulator.scalar_mul(p, scalar);
925 TestTraceContainer
trace({
926 { { C::precomputed_first_row, 1 } },
929 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
931 trace.
set(Column::scalar_mul_point_x, 254, q.x());
934 "INPUT_CONSISTENCY_X");
937TEST(ScalarMulConstrainingTest, NegativeMutatePointYOnEnd)
941 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
942 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
943 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
946 StrictMock<MockGreaterThan>
gt;
947 PureToRadix to_radix_simulator = PureToRadix();
951 ecc_add_event_emitter,
952 scalar_mul_event_emitter,
953 ecc_add_memory_event_emitter);
955 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
956 ecc_simulator.scalar_mul(p, scalar);
958 TestTraceContainer
trace({
959 { { C::precomputed_first_row, 1 } },
962 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
964 trace.
set(Column::scalar_mul_point_y, 254, q.y());
967 "INPUT_CONSISTENCY_Y");
970TEST(ScalarMulConstrainingTest, NegativeMutatePointInfOnEnd)
974 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
975 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
976 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
979 StrictMock<MockGreaterThan>
gt;
980 PureToRadix to_radix_simulator = PureToRadix();
984 ecc_add_event_emitter,
985 scalar_mul_event_emitter,
986 ecc_add_memory_event_emitter);
988 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
989 ecc_simulator.scalar_mul(p, scalar);
991 TestTraceContainer
trace({
992 { { C::precomputed_first_row, 1 } },
995 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
997 trace.
set(Column::scalar_mul_point_inf, 254, 1);
1000 "INPUT_CONSISTENCY_INF");
1007TEST(EccAddMemoryConstrainingTest, EccAddMemoryEmptyRow)
1012TEST(EccAddMemoryConstrainingTest, EccAddMemory)
1014 TestTraceContainer
trace;
1018 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1019 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1020 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1021 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1025 .WillRepeatedly(Return(0));
1027 PureToRadix to_radix_simulator = PureToRadix();
1031 ecc_add_event_emitter,
1032 scalar_mul_event_emitter,
1033 ecc_add_memory_event_emitter);
1037 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1038 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
1040 check_relation<mem_aware_ecc>(trace);
1043TEST(EccAddMemoryConstrainingTest, EccAddMemoryInteractions)
1051 .WillRepeatedly(Return(0));
1053 PureToRadix to_radix_simulator = PureToRadix();
1055 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1056 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1057 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1058 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1062 ecc_add_event_emitter,
1063 scalar_mul_event_emitter,
1064 ecc_add_memory_event_emitter);
1070 TestTraceContainer
trace = TestTraceContainer({
1074 { C::execution_sel, 1 },
1075 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1077 { C::execution_register_0_, p.x() },
1078 { C::execution_register_1_, p.y() },
1079 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1080 { C::execution_register_3_, q.x() },
1081 { C::execution_register_4_, q.y() },
1082 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1090 { C::memory_value, result.x() },
1091 { C::memory_sel, 1 },
1092 { C::memory_rw, 1 },
1098 { C::memory_value, result.y() },
1099 { C::memory_sel, 1 },
1100 { C::memory_rw, 1 },
1106 { C::memory_value, result.is_infinity() },
1107 { C::memory_sel, 1 },
1108 { C::memory_rw, 1 },
1115 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1116 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
1118 check_all_interactions<EccTraceBuilder>(trace);
1119 check_relation<mem_aware_ecc>(trace);
1122TEST(EccAddMemoryConstrainingTest, EccAddMemoryInvalidDstRange)
1128 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1129 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1130 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1131 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1135 .WillRepeatedly(Return(0));
1137 PureToRadix to_radix_simulator = PureToRadix();
1142 ecc_add_event_emitter,
1143 scalar_mul_event_emitter,
1144 ecc_add_memory_event_emitter);
1148 TestTraceContainer
trace = TestTraceContainer({
1152 { C::execution_sel, 1 },
1153 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1155 { C::execution_register_0_, p.x() },
1156 { C::execution_register_1_, p.y() },
1157 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1158 { C::execution_register_3_, q.x() },
1159 { C::execution_register_4_, q.y() },
1160 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1161 { C::execution_sel_opcode_error, 1 },
1164 { C::gt_input_a,
static_cast<uint64_t
>(
dst_address) + 2 },
1172 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1173 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1175 check_all_interactions<EccTraceBuilder>(trace);
1176 check_relation<mem_aware_ecc>(trace);
1179TEST(EccAddMemoryConstrainingTest, EccAddMemoryPointError)
1184 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1185 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1186 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1190 .WillRepeatedly(Return(0));
1192 PureToRadix to_radix_simulator = PureToRadix();
1197 ecc_add_event_emitter,
1198 scalar_mul_event_emitter,
1199 ecc_add_memory_event_emitter);
1202 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
1203 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
1210 TestTraceContainer
trace = TestTraceContainer({
1214 { C::execution_sel, 1 },
1215 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1217 { C::execution_register_0_, p.x() },
1218 { C::execution_register_1_, p.y() },
1219 { C::execution_register_2_, p.is_infinity() ? 1 : 0 },
1220 { C::execution_register_3_, q.x() },
1221 { C::execution_register_4_, q.y() },
1222 { C::execution_register_5_, q.is_infinity() ? 1 : 0 },
1223 { C::execution_sel_opcode_error, 1 },
1232 EXPECT_THROW(ecc_simulator.add(memory, p, q,
dst_address), simulation::EccException);
1234 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1236 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1238 check_all_interactions<EccTraceBuilder>(trace);
1239 check_relation<mem_aware_ecc>(trace);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
#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)
Process the ALU events and populate the ALU relevant columns in the trace.
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
ExecutionIdManager execution_id_manager
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
TestTraceContainer empty_trace()
lookup_settings< lookup_scalar_mul_double_settings_ > lookup_scalar_mul_double_settings
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
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
static constexpr field zero()