barretenberg
Loading...
Searching...
No Matches
witness.hpp
1#pragma once
2#include "barretenberg/ecc/curves/bn254/fr.hpp"
3
4namespace proof_system::plonk {
5namespace stdlib {
6
7// indicates whether a witness index actually contains a constant
8static constexpr uint32_t IS_CONSTANT = UINT32_MAX;
9
10template <typename Builder> class witness_t {
11 public:
12 witness_t() = default;
13
14 witness_t(Builder* parent_context, const barretenberg::fr& in)
15 {
16 context = parent_context;
17 witness = in;
18 witness_index = context->add_variable(witness);
19 }
20
21 witness_t(Builder* parent_context, const bool in)
22 {
23 context = parent_context;
24 if (in) {
25 barretenberg::fr::__copy(barretenberg::fr::one(), witness);
26 } else {
27 barretenberg::fr::__copy(barretenberg::fr::zero(), witness);
28 }
29 witness_index = context->add_variable(witness);
30 }
31
32 witness_t(Builder* parent_context, IntegralOrEnum auto const in)
33 {
34 context = parent_context;
35 witness = barretenberg::fr{ static_cast<uint64_t>(in), 0, 0, 0 }.to_montgomery_form();
36 witness_index = context->add_variable(witness);
37 }
38
39 static witness_t create_constant_witness(Builder* parent_context, const barretenberg::fr& in)
40 {
41 witness_t out(parent_context, in);
42 parent_context->assert_equal_constant(out.witness_index, in);
43 return out;
44 }
45
46 barretenberg::fr witness;
47 uint32_t witness_index = IS_CONSTANT;
48 Builder* context = nullptr;
49};
50
51template <typename Builder> class public_witness_t : public witness_t<Builder> {
52 public:
53 using witness_t<Builder>::context;
54 using witness_t<Builder>::witness;
55 using witness_t<Builder>::witness_index;
56
57 public_witness_t() = default;
58 public_witness_t(Builder* parent_context, const barretenberg::fr& in)
59 {
60 context = parent_context;
61 barretenberg::fr::__copy(in, witness);
62 witness_index = context->add_public_variable(witness);
63 }
64
65 public_witness_t(Builder* parent_context, const bool in)
66 {
67 context = parent_context;
68 if (in) {
69 barretenberg::fr::__copy(barretenberg::fr::one(), witness);
70 } else {
71 barretenberg::fr::__copy(barretenberg::fr::zero(), witness);
72 }
73 witness_index = context->add_public_variable(witness);
74 }
75
76 template <typename T> public_witness_t(Builder* parent_context, T const in)
77 {
78 context = parent_context;
79 witness = barretenberg::fr{ static_cast<uint64_t>(in), 0, 0, 0 }.to_montgomery_form();
80 witness_index = context->add_public_variable(witness);
81 }
82};
83
84} // namespace stdlib
85} // namespace proof_system::plonk
virtual uint32_t add_variable(const FF &in)
Definition: circuit_builder_base.hpp:163
virtual uint32_t add_public_variable(const FF &in)
Definition: circuit_builder_base.hpp:278
Definition: standard_circuit_builder.hpp:12
Definition: witness.hpp:10
Definition: serialize.hpp:55
Definition: widget.bench.cpp:13