Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ecc_trace.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
8
9namespace bb::avm2::tracegen {
10namespace {
11
12using testing::ElementsAre;
13using testing::Field;
14
16
17TEST(EccTraceGenTest, TraceGenerationAdd)
18{
19 TestTraceContainer trace;
20 EccTraceBuilder builder;
21
22 FF p_x("0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
23 FF p_y("0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
24 EmbeddedCurvePoint p(p_x, p_y, false);
25 FF q_x("0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
26 FF q_y("0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
27 EmbeddedCurvePoint q(q_x, q_y, false);
28 FF r_x("0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
29 FF r_y("0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
30 EmbeddedCurvePoint r(r_x, r_y, false);
31 builder.process_add({ { .p = p, .q = q, .result = r } }, trace);
32
33 EXPECT_THAT(trace.as_rows(),
34 ElementsAre(
35 // Only one row.
36 AllOf(ROW_FIELD_EQ(ecc_add_op, 1),
37 ROW_FIELD_EQ(ecc_double_op, 0),
38 ROW_FIELD_EQ(ecc_inv_2_p_y, FF::zero()),
39 ROW_FIELD_EQ(ecc_inv_x_diff, (q.x() - p.x()).invert()),
40 ROW_FIELD_EQ(ecc_inv_y_diff, (q.y() - p.y()).invert()),
41 ROW_FIELD_EQ(ecc_lambda, (q.y() - p.y()) / (q.x() - p.x())),
42 ROW_FIELD_EQ(ecc_p_is_inf, p.is_infinity()),
43 ROW_FIELD_EQ(ecc_p_x, p.x()),
44 ROW_FIELD_EQ(ecc_p_y, p.y()),
45 ROW_FIELD_EQ(ecc_q_is_inf, q.is_infinity()),
46 ROW_FIELD_EQ(ecc_q_x, q.x()),
47 ROW_FIELD_EQ(ecc_q_y, q.y()),
48 ROW_FIELD_EQ(ecc_r_is_inf, r.is_infinity()),
49 ROW_FIELD_EQ(ecc_r_x, r.x()),
50 ROW_FIELD_EQ(ecc_r_y, r.y()),
51 ROW_FIELD_EQ(ecc_result_infinity, 0),
52 ROW_FIELD_EQ(ecc_sel, 1),
53 ROW_FIELD_EQ(ecc_x_match, 0),
54 ROW_FIELD_EQ(ecc_y_match, 0))));
55}
56
57TEST(EccTraceGenTest, TraceGenerationDouble)
58{
59 TestTraceContainer trace;
60 EccTraceBuilder builder;
61
62 FF p_x("0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
63 FF p_y("0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
64 EmbeddedCurvePoint p(p_x, p_y, false);
66 FF r_x("0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
67 FF r_y("0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
68 EmbeddedCurvePoint r(r_x, r_y, false);
69
70 builder.process_add({ { .p = p, .q = q, .result = r } }, trace);
71
72 EXPECT_THAT(trace.as_rows(),
73 ElementsAre(
74 // Only one row.
75 AllOf(ROW_FIELD_EQ(ecc_add_op, 0),
76 ROW_FIELD_EQ(ecc_double_op, 1),
77 ROW_FIELD_EQ(ecc_inv_2_p_y, (p.y() * 2).invert()),
78 ROW_FIELD_EQ(ecc_inv_x_diff, FF::zero()),
79 ROW_FIELD_EQ(ecc_inv_y_diff, FF::zero()),
80 ROW_FIELD_EQ(ecc_lambda, (p.x() * p.x() * 3) / (p.y() * 2)),
81 ROW_FIELD_EQ(ecc_p_is_inf, p.is_infinity()),
82 ROW_FIELD_EQ(ecc_p_x, p.x()),
83 ROW_FIELD_EQ(ecc_p_y, p.y()),
84 ROW_FIELD_EQ(ecc_q_is_inf, q.is_infinity()),
85 ROW_FIELD_EQ(ecc_q_x, p.x()),
86 ROW_FIELD_EQ(ecc_q_y, p.y()),
87 ROW_FIELD_EQ(ecc_r_is_inf, r.is_infinity()),
88 ROW_FIELD_EQ(ecc_r_x, r.x()),
89 ROW_FIELD_EQ(ecc_r_y, r.y()),
90 ROW_FIELD_EQ(ecc_result_infinity, 0),
91 ROW_FIELD_EQ(ecc_sel, 1),
92 ROW_FIELD_EQ(ecc_x_match, 1),
93 ROW_FIELD_EQ(ecc_y_match, 1))));
94}
95
96TEST(EccTraceGenTest, TraceGenerationInf)
97{
98 TestTraceContainer trace;
99 EccTraceBuilder builder;
100
101 FF p_x("0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
102 FF p_y("0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
103 EmbeddedCurvePoint p(p_x, p_y, false);
104
105 EmbeddedCurvePoint q(p.x(), -p.y(), false);
106 EmbeddedCurvePoint r = p + q;
107
108 builder.process_add({ { .p = p, .q = q, .result = r } }, trace);
109
110 EXPECT_THAT(trace.as_rows(),
111 ElementsAre(
112 // Only one row.
113 AllOf(ROW_FIELD_EQ(ecc_add_op, 0),
114 ROW_FIELD_EQ(ecc_double_op, 0),
115 ROW_FIELD_EQ(ecc_inv_2_p_y, 0),
116 ROW_FIELD_EQ(ecc_inv_x_diff, FF::zero()),
117 ROW_FIELD_EQ(ecc_inv_y_diff, (q.y() - p.y()).invert()),
118 ROW_FIELD_EQ(ecc_lambda, 0),
119 ROW_FIELD_EQ(ecc_p_is_inf, p.is_infinity()),
120 ROW_FIELD_EQ(ecc_p_x, p.x()),
121 ROW_FIELD_EQ(ecc_p_y, p.y()),
122 ROW_FIELD_EQ(ecc_q_is_inf, q.is_infinity()),
123 ROW_FIELD_EQ(ecc_q_x, q.x()),
124 ROW_FIELD_EQ(ecc_q_y, q.y()),
125 ROW_FIELD_EQ(ecc_r_is_inf, r.is_infinity()),
126 ROW_FIELD_EQ(ecc_r_x, r.x()),
127 ROW_FIELD_EQ(ecc_r_y, r.y()),
128 ROW_FIELD_EQ(ecc_result_infinity, 1),
129 ROW_FIELD_EQ(ecc_sel, 1),
130 ROW_FIELD_EQ(ecc_x_match, 1),
131 ROW_FIELD_EQ(ecc_y_match, 0))));
132}
133
134} // namespace
135} // namespace bb::avm2::tracegen
std::vector< AvmFullRowConstRef > as_rows() const
AluTraceBuilder builder
Definition alu.test.cpp:123
TestTraceContainer trace
#define ROW_FIELD_EQ(field_name, expression)
Definition macros.hpp:15
TEST(EmitUnencryptedLogTest, Basic)
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
Definition field.hpp:12
static constexpr field zero()