Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_circuit_builder_basic.test.cpp
Go to the documentation of this file.
1
#include "
barretenberg/circuit_checker/circuit_checker.hpp
"
2
#include "
barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp
"
3
4
#include <gtest/gtest.h>
5
6
using namespace
bb
;
7
8
namespace
bb
{
9
10
TEST
(
UltraCircuitBuilder
, CopyConstructor)
11
{
12
UltraCircuitBuilder
builder
;
13
14
for
(
size_t
i = 0; i < 16; ++i) {
15
for
(
size_t
j = 0; j < 16; ++j) {
16
uint64_t left =
static_cast<
uint64_t
>
(j);
17
uint64_t right =
static_cast<
uint64_t
>
(i);
18
uint32_t left_idx =
builder
.
add_variable
(
fr
(left));
19
uint32_t right_idx =
builder
.add_variable(
fr
(right));
20
uint32_t result_idx =
builder
.add_variable(
fr
(left ^ right));
21
22
uint32_t add_idx =
builder
.add_variable(
fr
(left) +
fr
(right) +
builder
.get_variable(result_idx));
23
builder
.create_big_add_gate(
24
{ left_idx, right_idx, result_idx, add_idx,
fr
(1),
fr
(1),
fr
(1),
fr
(-1),
fr
(0) });
25
}
26
}
27
28
EXPECT_TRUE(
CircuitChecker::check
(
builder
));
29
30
UltraCircuitBuilder
duplicate_builder{
builder
};
31
32
EXPECT_EQ(duplicate_builder.get_num_finalized_gates_inefficient(),
builder
.get_num_finalized_gates_inefficient());
33
EXPECT_TRUE(
CircuitChecker::check
(duplicate_builder));
34
}
35
36
TEST
(
UltraCircuitBuilder
, BaseCase)
37
{
38
UltraCircuitBuilder
builder
;
39
fr
a
=
fr::one
();
40
builder
.add_public_variable(
a
);
41
EXPECT_TRUE(
CircuitChecker::check
(
builder
));
42
}
43
44
TEST
(
UltraCircuitBuilder
, TestNoLookupProof)
45
{
46
UltraCircuitBuilder
builder
;
47
48
for
(
size_t
i = 0; i < 16; ++i) {
49
for
(
size_t
j = 0; j < 16; ++j) {
50
uint64_t left =
static_cast<
uint64_t
>
(j);
51
uint64_t right =
static_cast<
uint64_t
>
(i);
52
uint32_t left_idx =
builder
.
add_variable
(
fr
(left));
53
uint32_t right_idx =
builder
.add_variable(
fr
(right));
54
uint32_t result_idx =
builder
.add_variable(
fr
(left ^ right));
55
56
uint32_t add_idx =
builder
.add_variable(
fr
(left) +
fr
(right) +
builder
.get_variable(result_idx));
57
builder
.create_big_add_gate(
58
{ left_idx, right_idx, result_idx, add_idx,
fr
(1),
fr
(1),
fr
(1),
fr
(-1),
fr
(0) });
59
}
60
}
61
62
EXPECT_TRUE(
CircuitChecker::check
(
builder
));
63
}
64
65
TEST
(
UltraCircuitBuilder
, CheckCircuitShowcase)
66
{
67
UltraCircuitBuilder
builder
;
68
// check_circuit allows us to check correctness on the go
69
70
uint32_t
a
=
builder
.add_variable(
fr
(0xdead));
71
uint32_t
b
=
builder
.add_variable(
fr
(0xbeef));
72
// Let's create 2 gates that will bind these 2 variables to be one these two values
73
builder
.create_arithmetic_gate(
74
{
a
,
a
,
builder
.zero_idx(),
fr
(1), -
fr
(0xdead) -
fr
(0xbeef), 0, 0,
fr
(0xdead) *
fr
(0xbeef) });
75
builder
.create_arithmetic_gate(
76
{
b
,
b
,
builder
.zero_idx(),
fr
(1), -
fr
(0xdead) -
fr
(0xbeef), 0, 0,
fr
(0xdead) *
fr
(0xbeef) });
77
78
// We can check if this works
79
EXPECT_TRUE(
CircuitChecker::check
(
builder
));
80
81
// Now let's create a range constraint for b
82
builder
.create_new_range_constraint(
b
, 0xbeef);
83
84
// We can check if this works
85
EXPECT_TRUE(
CircuitChecker::check
(
builder
));
86
87
// But what if we now assert b to be equal to a?
88
builder
.assert_equal(
a
,
b
,
"Oh no"
);
89
90
// It fails, because a is 0xdead and it can't fit in the range constraint
91
EXPECT_FALSE(
CircuitChecker::check
(
builder
));
92
93
// But if we force them both back to be 0xbeef...
94
uint32_t c =
builder
.add_variable(
fr
(0xbeef));
95
builder
.assert_equal(c,
b
);
96
97
// The circuit will magically pass again
98
EXPECT_TRUE(
CircuitChecker::check
(
builder
));
99
}
100
101
}
// namespace bb
circuit_checker.hpp
bb::CircuitBuilderBase::add_variable
virtual uint32_t add_variable(const FF &in)
Add a variable to variables.
Definition
circuit_builder_base_impl.hpp:53
bb::TranslatorCircuitChecker::check
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Definition
translator_circuit_checker.cpp:20
bb::UltraCircuitBuilder_
Definition
ultra_circuit_builder.hpp:41
builder
AluTraceBuilder builder
Definition
alu.test.cpp:124
a
FF a
Definition
field_gt.test.cpp:52
b
FF b
Definition
field_gt.test.cpp:53
bb
Entry point for Barretenberg command-line interface.
Definition
api.hpp:5
bb::fr
field< Bn254FrParams > fr
Definition
fr.hpp:174
bb::TEST
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
Definition
graph_description_megacircuitbuilder.test.cpp:22
bb::field< Bn254FrParams >
bb::field< Bn254FrParams >::one
static constexpr field one()
Definition
field_declarations.hpp:242
ultra_circuit_builder.hpp
src
barretenberg
circuit_checker
ultra_circuit_builder_basic.test.cpp
Generated by
1.9.8