Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
smt_examples.test.cpp
Go to the documentation of this file.
3#include <fstream>
4#include <gtest/gtest.h>
5#include <iostream>
6#include <string>
7
9
11
12using namespace bb;
13
18
19TEST(smtExample, multiplication_true)
20{
22
25 field_t c = (a + a) / (b + b + b);
26
27 builder.set_variable_name(a.witness_index, "a");
28 builder.set_variable_name(b.witness_index, "b");
29 builder.set_variable_name(c.witness_index, "c");
30 ASSERT_TRUE(CircuitChecker::check(builder));
31
32 auto buf = builder.export_circuit();
33
35 smt_solver::Solver s(circuit_info.modulus);
37 smt_terms::STerm a1 = circuit["a"];
38 smt_terms::STerm b1 = circuit["b"];
39 smt_terms::STerm c1 = circuit["c"];
40 smt_terms::STerm two = smt_terms::FFConst("2", &s, 10);
41 smt_terms::STerm thr = smt_terms::FFConst("3", &s, 10);
43 cr = (two * a1) / (thr * b1);
44 c1 != cr;
45
46 bool res = s.check();
47 ASSERT_FALSE(res);
48}
49
50TEST(smtExample, multiplication_true_kind)
51{
53
56 field_t c = (a + a) / (b + b + b);
57
58 builder.set_variable_name(a.witness_index, "a");
59 builder.set_variable_name(b.witness_index, "b");
60 builder.set_variable_name(c.witness_index, "c");
61 ASSERT_TRUE(CircuitChecker::check(builder));
62
63 auto buf = builder.export_circuit();
64
66 smt_solver::Solver s(circuit_info.modulus);
68 smt_terms::STerm a1 = circuit["a"];
69 smt_terms::STerm b1 = circuit["b"];
70 smt_terms::STerm c1 = circuit["c"];
71 smt_terms::STerm two = smt_terms::FFConst("2", &s, 10);
72 smt_terms::STerm thr = smt_terms::FFConst("3", &s, 10);
74 cr* thr* b1 == two* a1;
75 c1 != cr;
76
77 bool res = s.check();
78 ASSERT_FALSE(res);
79}
80
81TEST(smtExample, multiplication_false)
82{
84
87 field_t c = (a) / (b + b + b); // mistake was here
88
89 builder.set_variable_name(a.witness_index, "a");
90 builder.set_variable_name(b.witness_index, "b");
91 builder.set_variable_name(c.witness_index, "c");
92 ASSERT_TRUE(CircuitChecker::check(builder));
93
94 auto buf = builder.export_circuit();
95
97 smt_solver::Solver s(circuit_info.modulus);
99
100 smt_terms::STerm a1 = circuit["a"];
101 smt_terms::STerm b1 = circuit["b"];
102 smt_terms::STerm c1 = circuit["c"];
103
104 smt_terms::STerm two = smt_terms::FFConst("2", &s, 10);
105 smt_terms::STerm thr = smt_terms::FFConst("3", &s, 10);
106 smt_terms::STerm cr = smt_terms::FFVar("cr", &s);
107 cr = (two * a1) / (thr * b1);
108 c1 != cr;
109
110 bool res = s.check();
111 ASSERT_TRUE(res);
112
113 std::unordered_map<std::string, cvc5::Term> terms({ { "a", a1 }, { "b", b1 }, { "c", c1 }, { "cr", cr } });
114
116
117 info("a = ", vals["a"]);
118 info("b = ", vals["b"]);
119 info("c = ", vals["c"]);
120 info("c_res = ", vals["cr"]);
121}
122
123// Make sure that quadratic polynomial evaluation doesn't have unique
124// witness using unique_witness_ext function
125// Find both roots of a quadratic equation x^2 + a * x + b = s
126TEST(smtExample, unique_witness_ext)
127{
129
132 builder.set_variable_name(a.witness_index, "a");
133 builder.set_variable_name(b.witness_index, "b");
135 field_t ev = z * z + a * z + b;
136 builder.set_variable_name(z.witness_index, "z");
137 builder.set_variable_name(ev.witness_index, "ev");
138
139 auto buf = builder.export_circuit();
140
142 smt_solver::Solver s(circuit_info.modulus);
143
146
147 bool res = s.check();
148 ASSERT_TRUE(res);
149
150 std::unordered_map<std::string, cvc5::Term> terms = { { "z_c1", cirs.first["z"] }, { "z_c2", cirs.second["z"] } };
152 ASSERT_NE(vals["z_c1"], vals["z_c2"]);
153}
154
155// Make sure that quadratic polynomial evaluation doesn't have unique
156// witness using unique_witness function
157// Finds both roots of a quadratic eq x^2 + a * x + b = s
158TEST(smtExample, unique_witness)
159{
161
164 builder.set_variable_name(a.witness_index, "a");
165 builder.set_variable_name(b.witness_index, "b");
167 field_t ev = z * z + a * z + b;
168 builder.set_variable_name(z.witness_index, "z");
169 builder.set_variable_name(ev.witness_index, "ev");
170
171 auto buf = builder.export_circuit();
172
174 smt_solver::Solver s(circuit_info.modulus);
175
178
179 bool res = s.check();
180 ASSERT_TRUE(res);
181
182 std::unordered_map<std::string, cvc5::Term> terms = { { "z_c1", cirs.first["z"] }, { "z_c2", cirs.second["z"] } };
184 ASSERT_NE(vals["z_c1"], vals["z_c2"]);
185}
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
uint32_t witness_index
Definition field.hpp:132
Symbolic Circuit class for Standard Circuit Builder.
static std::pair< UltraCircuit, UltraCircuit > unique_witness(CircuitSchema &circuit_info, Solver *s, TermType type, const std::vector< std::string > &equal={}, bool enable_optimizations=false)
Check your circuit for witness uniqueness.
static std::pair< UltraCircuit, UltraCircuit > unique_witness_ext(CircuitSchema &circuit_info, Solver *s, TermType type, const std::vector< std::string > &equal={}, const std::vector< std::string > &not_equal={}, const std::vector< std::string > &equal_at_the_same_time={}, const std::vector< std::string > &not_equal_at_the_same_time={}, bool enable_optimizations=false)
Check your circuit for witness uniqueness.
Class for the solver.
Definition solver.hpp:80
std::unordered_map< std::string, std::string > model(std::unordered_map< std::string, cvc5::Term > &terms) const
Definition solver.cpp:80
Symbolic term element class.
Definition term.hpp:114
void info(Args... args)
Definition log.hpp:70
AluTraceBuilder builder
Definition alu.test.cpp:123
FF a
FF b
uint8_t const * buf
Definition data_store.hpp:9
Entry point for Barretenberg command-line interface.
TEST(MegaCircuitBuilder, CopyConstructor)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
CircuitSchema unpack_from_buffer(const msgpack::sbuffer &buf)
Get the CircuitSchema object.
STerm FFVar(const std::string &name, Solver *slv)
Definition term.cpp:570
STerm FFConst(const std::string &val, Solver *slv, uint32_t base)
Definition term.cpp:575
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
stdlib::witness_t< Builder > witness_t
stdlib::public_witness_t< Builder > pub_witness_t
static field random_element(numeric::RNG *engine=nullptr) noexcept
Serialized state of a circuit.