Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir_bincode_mocks.hpp
Go to the documentation of this file.
1#pragma once
2
5#include <cstddef>
6#include <vector>
7
9
10const size_t BIT_COUNT = 254;
11
20{
21 Acir::Circuit circuit;
22
23 // No public inputs
25
26 std::string one = "0000000000000000000000000000000000000000000000000000000000000001";
27 std::string minus_one = "30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000";
28
30
31 // Create constraint: w0 * w1 - w2 = 0
32 expr.mul_terms = { { one, Acir::Witness{ 0 }, Acir::Witness{ 1 } } }; // w0 * w1
33 expr.linear_combinations = { { minus_one, Acir::Witness{ 2 } } }; // -1 * w2
34 expr.q_c = "0000000000000000000000000000000000000000000000000000000000000000";
35
36 Acir::Opcode::AssertZero assert_zero;
37 assert_zero.value = expr;
38 Acir::Opcode opcode;
39 opcode.value = assert_zero;
40 circuit.opcodes.push_back(opcode);
41
42 circuit.current_witness_index = 3;
44 circuit.private_parameters = {};
45 circuit.return_values = Acir::PublicInputs{ {} };
46 circuit.assert_messages = {};
47
48 // Create the program
49 Acir::Program program;
50 program.functions = { circuit };
51 program.unconstrained_functions = {};
52
53 // Create witness data
54 Witnesses::WitnessStack witness_stack;
55 Witnesses::StackItem stack_item{};
56
57 // w0=2, w1=3, w2=6 (so 2*3=6)
58 stack_item.witness.value = {
59 { Witnesses::Witness{ 0 }, "0000000000000000000000000000000000000000000000000000000000000002" }, // w0 = 2
60 { Witnesses::Witness{ 1 }, "0000000000000000000000000000000000000000000000000000000000000003" }, // w1 = 3
61 { Witnesses::Witness{ 2 }, "0000000000000000000000000000000000000000000000000000000000000006" } // w2 = 6
62 };
63 witness_stack.stack.push_back(stack_item);
64
65 return { program.bincodeSerialize(), witness_stack.bincodeSerialize() };
66}
67
73inline std::vector<uint8_t> create_simple_kernel(size_t vk_size, bool is_init_kernel)
74{
75 Acir::Circuit circuit;
76 // Create witnesses equal to size of a mega VK in fields.
77 std::vector<Acir::FunctionInput> vk_inputs;
78 for (uint32_t i = 0; i < vk_size; i++) {
80 vk_inputs.push_back(input);
81 }
82 Acir::FunctionInput key_hash{ { Acir::ConstantOrWitnessEnum::Witness{ static_cast<uint32_t>(vk_size) } },
83 BIT_COUNT };
84 size_t total_num_witnesses = /* vk */ vk_size + /* key_hash */ 1;
85
86 // Modeled after noir-projects/mock-protocol-circuits/crates/mock-private-kernel-init/src/main.nr
87 // We mock the init or tail kernels using OINK or PG respectively.
89 .proof = {},
90 .public_inputs = {},
91 .key_hash = key_hash,
92 .proof_type = is_init_kernel
95
96 Acir::BlackBoxFuncCall black_box_call;
97 black_box_call.value = recursion;
98
99 circuit.opcodes.push_back(Acir::Opcode{ Acir::Opcode::BlackBoxFuncCall{ black_box_call } });
100 circuit.current_witness_index = static_cast<uint32_t>(total_num_witnesses);
102
103 // Create the program with the circuit
104 Acir::Program program;
105 program.functions = { circuit };
106 // Serialize the program using bincode
107 return program.bincodeSerialize();
108}
109
115inline std::vector<uint8_t> create_kernel_witness(const std::vector<bb::fr>& app_vk_fields)
116{
117 Witnesses::WitnessStack kernel_witness;
118 kernel_witness.stack.push_back({});
119 for (uint32_t i = 0; i < app_vk_fields.size(); i++) {
120 std::stringstream ss;
121 ss << app_vk_fields[i];
122 kernel_witness.stack.back().witness.value[Witnesses::Witness{ i }] = ss.str();
123 }
124 std::stringstream ss;
125 ss << crypto::Poseidon2<crypto::Poseidon2Bn254ScalarFieldParams>::hash(app_vk_fields);
126 kernel_witness.stack.back().witness.value[Witnesses::Witness{ static_cast<uint32_t>(app_vk_fields.size()) }] =
127 ss.str();
128
129 return kernel_witness.bincodeSerialize();
130}
131
132} // namespace bb::acir_bincode_mocks
std::vector< uint8_t > create_simple_kernel(size_t vk_size, bool is_init_kernel)
Create a simple kernel circuit for IVC testing.
std::vector< uint8_t > create_kernel_witness(const std::vector< bb::fr > &app_vk_fields)
Create a kernel witness for IVC testing.
std::pair< std::vector< uint8_t >, std::vector< uint8_t > > create_simple_circuit_bytecode()
Helper function to create a minimal circuit bytecode and witness for testing.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:3363
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, BigIntAdd, BigIntSub, BigIntMul, BigIntDiv, BigIntFromLeBytes, BigIntToLeBytes, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:3628
Acir::PublicInputs return_values
Definition acir.hpp:5159
std::vector< Acir::Opcode > opcodes
Definition acir.hpp:5155
Acir::ExpressionWidth expression_width
Definition acir.hpp:5156
uint32_t current_witness_index
Definition acir.hpp:5154
std::vector< Acir::Witness > private_parameters
Definition acir.hpp:5157
Acir::PublicInputs public_parameters
Definition acir.hpp:5158
std::vector< std::tuple< Acir::OpcodeLocation, Acir::AssertionPayload > > assert_messages
Definition acir.hpp:5160
std::vector< std::tuple< std::string, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:4109
std::string q_c
Definition acir.hpp:4111
std::vector< std::tuple< std::string, Acir::Witness > > linear_combinations
Definition acir.hpp:4110
Acir::Expression value
Definition acir.hpp:4451
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:4604
std::vector< Acir::Circuit > functions
Definition acir.hpp:5214
std::vector< Acir::BrilligBytecode > unconstrained_functions
Definition acir.hpp:5215
std::vector< uint8_t > bincodeSerialize() const
Definition acir.hpp:12247
Witnesses::WitnessMap witness
std::map< Witnesses::Witness, std::string > value
std::vector< Witnesses::StackItem > stack
std::vector< uint8_t > bincodeSerialize() const