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
12inline uint8_t hex_char_to_value(char c)
13{
14 if (c >= '0' && c <= '9') {
15 return static_cast<uint8_t>(c - '0');
16 }
17 if (c >= 'a' && c <= 'f') {
18 return static_cast<uint8_t>(10 + (c - 'a'));
19 }
20 if (c >= 'A' && c <= 'F') {
21 return static_cast<uint8_t>(10 + (c - 'A'));
22 }
23 throw std::invalid_argument(std::string("Invalid hex character: '") + c + "'");
24}
25
26// Converts a hex string (must have even length) to a vector<uint8_t>
27inline std::vector<uint8_t> hex_string_to_bytes(const std::string& str)
28{
29 // Allow optional "0x" or "0X" prefix
30 size_t offset = 0;
31 if (str.size() >= 2 && (str[0] == '0') && (str[1] == 'x' || str[1] == 'X')) {
32 offset = 2;
33 }
34 size_t hex_len = str.size() - offset;
35 // Enforce that the input string must represent exactly 32 bytes (64 hex chars)
36 if (hex_len != 64) {
37 throw std::invalid_argument(
38 "Hex string must be exactly 64 characters (32 bytes), excluding optional 0x prefix");
39 }
40 std::vector<uint8_t> bytes;
41 bytes.reserve(32);
42 for (size_t i = 0; i < hex_len; i += 2) {
43 uint8_t high = hex_char_to_value(str[offset + i]);
44 uint8_t low = hex_char_to_value(str[offset + i + 1]);
45 bytes.push_back(static_cast<uint8_t>((high << 4) | low));
46 }
47 return bytes;
48}
49
57inline std::pair<std::vector<uint8_t>, std::vector<uint8_t>> create_simple_circuit_bytecode(size_t num_constraints = 1)
58{
59 Acir::Circuit circuit;
60
61 // No public inputs
63
64 std::vector<uint8_t> one = hex_string_to_bytes("0000000000000000000000000000000000000000000000000000000000000001");
65 std::vector<uint8_t> minus_one =
66 hex_string_to_bytes("30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000");
67
68 // Add num_constraints identical constraints, each using different witnesses
69 for (size_t i = 0; i < num_constraints; ++i) {
71 uint32_t base_witness = static_cast<uint32_t>(i * 3);
72
73 // Create constraint: w[base] * w[base+1] - w[base+2] = 0
74 expr.mul_terms = { { one, Acir::Witness{ base_witness }, Acir::Witness{ base_witness + 1 } } };
75 expr.linear_combinations = { { minus_one, Acir::Witness{ base_witness + 2 } } };
76 expr.q_c = hex_string_to_bytes("0000000000000000000000000000000000000000000000000000000000000000");
77
78 Acir::Opcode::AssertZero assert_zero;
79 assert_zero.value = expr;
80 Acir::Opcode opcode;
81 opcode.value = assert_zero;
82 circuit.opcodes.push_back(opcode);
83 }
84
85 circuit.current_witness_index = static_cast<uint32_t>(num_constraints * 3);
86 circuit.function_name = "simple_circuit";
87 circuit.private_parameters = {};
88 circuit.return_values = Acir::PublicInputs{ {} };
89 circuit.assert_messages = {};
90
91 // Create the program
92 Acir::Program program;
93 program.functions = { circuit };
94 program.unconstrained_functions = {};
95
96 // Create witness data
97 Witnesses::WitnessStack witness_stack;
98 Witnesses::StackItem stack_item{};
99
100 // For each constraint, add witnesses: w[i*3]=2, w[i*3+1]=3, w[i*3+2]=6 (so 2*3=6)
101 for (size_t i = 0; i < num_constraints; ++i) {
102 uint32_t base_witness = static_cast<uint32_t>(i * 3);
103 stack_item.witness.value[Witnesses::Witness{ base_witness }] =
104 hex_string_to_bytes("0000000000000000000000000000000000000000000000000000000000000002"); // = 2
105 stack_item.witness.value[Witnesses::Witness{ base_witness + 1 }] =
106 hex_string_to_bytes("0000000000000000000000000000000000000000000000000000000000000003"); // = 3
107 stack_item.witness.value[Witnesses::Witness{ base_witness + 2 }] =
108 hex_string_to_bytes("0000000000000000000000000000000000000000000000000000000000000006"); // = 6
109 }
110 witness_stack.stack.push_back(stack_item);
111
112 return { program.bincodeSerialize(), witness_stack.bincodeSerialize() };
113}
114
120inline std::vector<uint8_t> create_simple_kernel(size_t vk_size, bool is_init_kernel)
121{
122 Acir::Circuit circuit;
123 // Create witnesses equal to size of a mega VK in fields.
124 std::vector<Acir::FunctionInput> vk_inputs;
125 for (uint32_t i = 0; i < vk_size; i++) {
128 };
129 vk_inputs.push_back(Acir::FunctionInput{ .value = i_wit });
130 ;
131 }
132
134 std::in_place_type<Acir::FunctionInput::Witness>, Acir::Witness{ static_cast<uint32_t>(vk_size) }
135 };
136 Acir::FunctionInput key_hash{ .value = vk_size_wit };
137 ;
138 size_t total_num_witnesses = /* vk */ vk_size + /* key_hash */ 1;
139
142 hex_string_to_bytes("0000000000000000000000000000000000000000000000000000000000000001")
143 };
144 Acir::FunctionInput predicate{ .value = predicate_const };
145
146 // Modeled after noir-projects/mock-protocol-circuits/crates/mock-private-kernel-init/src/main.nr
147 // We mock the init or tail kernels using OINK or PG respectively.
149 .proof = {},
150 .public_inputs = {},
151 .key_hash = key_hash,
152 .proof_type = is_init_kernel ? acir_format::PROOF_TYPE::OINK
154 .predicate = predicate };
155
156 Acir::BlackBoxFuncCall black_box_call;
157 black_box_call.value = recursion;
158
159 circuit.opcodes.push_back(Acir::Opcode{ Acir::Opcode::BlackBoxFuncCall{ black_box_call } });
160 circuit.current_witness_index = static_cast<uint32_t>(total_num_witnesses);
161 circuit.function_name = "simple_circuit";
162
163 // Create the program with the circuit
164 Acir::Program program;
165 program.functions = { circuit };
166 // Serialize the program using bincode
167 return program.bincodeSerialize();
168}
169
175inline std::vector<uint8_t> create_kernel_witness(const std::vector<bb::fr>& app_vk_fields)
176{
177 Witnesses::WitnessStack kernel_witness;
178 kernel_witness.stack.push_back({});
179 for (uint32_t i = 0; i < app_vk_fields.size(); i++) {
180 std::stringstream ss;
181 ss << app_vk_fields[i];
182 kernel_witness.stack.back().witness.value[Witnesses::Witness{ i }] = hex_string_to_bytes(ss.str());
183 }
184 std::stringstream ss;
185 ss << crypto::Poseidon2<crypto::Poseidon2Bn254ScalarFieldParams>::hash(app_vk_fields);
186 kernel_witness.stack.back().witness.value[Witnesses::Witness{ static_cast<uint32_t>(app_vk_fields.size()) }] =
187 hex_string_to_bytes(ss.str());
188
189 return kernel_witness.bincodeSerialize();
190}
191
192} // namespace bb::acir_bincode_mocks
ssize_t offset
Definition engine.cpp:36
std::pair< std::vector< uint8_t >, std::vector< uint8_t > > create_simple_circuit_bytecode(size_t num_constraints=1)
Helper function to create a minimal circuit bytecode and witness for testing.
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.
uint8_t hex_char_to_value(char c)
std::vector< uint8_t > hex_string_to_bytes(const std::string &str)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:3069
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:3169
Acir::PublicInputs return_values
Definition acir.hpp:4504
std::vector< Acir::Opcode > opcodes
Definition acir.hpp:4501
uint32_t current_witness_index
Definition acir.hpp:4500
std::vector< Acir::Witness > private_parameters
Definition acir.hpp:4502
Acir::PublicInputs public_parameters
Definition acir.hpp:4503
std::string function_name
Definition acir.hpp:4499
std::vector< std::tuple< Acir::OpcodeLocation, Acir::AssertionPayload > > assert_messages
Definition acir.hpp:4505
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:3567
std::vector< uint8_t > q_c
Definition acir.hpp:3568
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:3566
std::variant< Constant, Witness > value
Definition acir.hpp:2664
Acir::Expression value
Definition acir.hpp:3908
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:4058
std::vector< Acir::Circuit > functions
Definition acir.hpp:4562
std::vector< Acir::BrilligBytecode > unconstrained_functions
Definition acir.hpp:4563
std::vector< uint8_t > bincodeSerialize() const
Definition acir.hpp:10954
Witnesses::WitnessMap witness
std::map< Witnesses::Witness, std::vector< uint8_t > > value
std::vector< Witnesses::StackItem > stack
std::vector< uint8_t > bincodeSerialize() const