Skip to content

Commit 47eefba

Browse files
authored
feat: merge-train/barretenberg (#16572)
BEGIN_COMMIT_OVERRIDE chore: remove unnecessary initializations in acir tests (#16545) chore: remove the early returns from `complete_kernel_circuit_logic' (#16563) END_COMMIT_OVERRIDE
2 parents aafdd56 + 0daa299 commit 47eefba

14 files changed

+59
-691
lines changed

barretenberg/cpp/scripts/test_civc_standalone_vks_havent_changed.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ cd ..
1111
# - Generate a hash for versioning: sha256sum bb-civc-inputs.tar.gz
1212
# - Upload the compressed results: aws s3 cp bb-civc-inputs.tar.gz s3://aztec-ci-artifacts/protocol/bb-civc-inputs-[hash(0:8)].tar.gz
1313
# Note: In case of the "Test suite failed to run ... Unexpected token 'with' " error, need to run: docker pull aztecprotocol/build:3.0
14-
pinned_short_hash="05a86d89"
14+
15+
pinned_short_hash="884109c4"
16+
1517
pinned_civc_inputs_url="https://aztec-ci-artifacts.s3.us-east-2.amazonaws.com/protocol/bb-civc-inputs-${pinned_short_hash}.tar.gz"
1618

1719
function compress_and_upload {

barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp

Lines changed: 52 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,16 @@ std::pair<ClientIVC::PairingPoints, ClientIVC::TableCommitments> ClientIVC::
103103

104104
// Witness commitments and public inputs corresponding to the incoming instance
105105
WitnessCommitments witness_commitments;
106+
// The pairing points produced by the verification of the decider proof
107+
PairingPoints decider_pairing_points;
106108
std::vector<StdlibFF> public_inputs;
107109

108110
// Input commitments to be passed to the merge recursive verification
109111
MergeCommitments merge_commitments;
110112
merge_commitments.T_prev_commitments = T_prev_commitments;
113+
// The decider proof exists if the tail kernel has been accumulated
114+
bool is_hiding_kernel = !decider_proof.empty();
115+
111116
switch (verifier_inputs.type) {
112117
case QUEUE_TYPE::PG_TAIL:
113118
case QUEUE_TYPE::PG: {
@@ -154,17 +159,45 @@ std::pair<ClientIVC::PairingPoints, ClientIVC::TableCommitments> ClientIVC::
154159
}
155160
case QUEUE_TYPE::PG_FINAL: {
156161
BB_ASSERT_EQ(stdlib_verification_queue.size(), size_t(1));
162+
auto stdlib_proof = verifier_inputs.proof;
163+
auto stdlib_vk_and_hash = verifier_inputs.honk_vk_and_hash;
157164
// Note: reinstate this.
158165
// BB_ASSERT_EQ(num_circuits_accumulated,
159166
// num_circuits - 1,
160167
// "All circuits must be accumulated before constructing the hiding circuit.");
161168
// Complete the hiding circuit construction
162-
auto [pairing_points, merged_table_commitments] =
163-
complete_hiding_circuit_logic(verifier_inputs.proof, verifier_inputs.honk_vk_and_hash, circuit);
164-
// Return early since the hiding circuit method performs merge and public inputs handling
165-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1501): we should remove the code duplication for
166-
// the consistency checks at some point
167-
return { pairing_points, merged_table_commitments };
169+
170+
hide_op_queue_accumulation_result(circuit);
171+
172+
// Construct stdlib accumulator, decider vkey and folding proof
173+
auto stdlib_verifier_accumulator =
174+
std::make_shared<RecursiveDeciderVerificationKey>(&circuit, recursive_verifier_native_accum);
175+
176+
// Propagate the public inputs of the tail kernel by converting them to public inputs of the hiding circuit.
177+
auto num_public_inputs = static_cast<size_t>(honk_vk->num_public_inputs);
178+
num_public_inputs -= KernelIO::PUBLIC_INPUTS_SIZE; // exclude fixed kernel_io public inputs
179+
for (size_t i = 0; i < num_public_inputs; i++) {
180+
stdlib_proof[i].set_public();
181+
}
182+
183+
// Perform recursive folding verification of the last folding proof
184+
FoldingRecursiveVerifier folding_verifier{
185+
&circuit, stdlib_verifier_accumulator, { stdlib_vk_and_hash }, accumulation_recursive_transcript
186+
};
187+
auto recursive_verifier_native_accum = folding_verifier.verify_folding_proof(verifier_inputs.proof);
188+
verification_queue.clear();
189+
190+
// // Get the completed decider verification key corresponding to the tail kernel from the folding verifier
191+
public_inputs = folding_verifier.public_inputs;
192+
193+
witness_commitments = folding_verifier.keys_to_fold[1]->witness_commitments;
194+
195+
// Perform recursive decider verification
196+
DeciderRecursiveVerifier decider{ &circuit, recursive_verifier_native_accum };
197+
BB_ASSERT_EQ(decider_proof.empty(), false, "Decider proof is empty!");
198+
199+
decider_pairing_points = decider.verify_proof(decider_proof);
200+
break;
168201
}
169202
default: {
170203
throw_or_abort("Invalid queue type! Only OINK, PG, PG_TAIL and PG_FINAL are supported");
@@ -177,19 +210,22 @@ std::pair<ClientIVC::PairingPoints, ClientIVC::TableCommitments> ClientIVC::
177210
// Reconstruct the input from the previous kernel from its public inputs
178211
KernelIO kernel_input; // pairing points, databus return data commitments
179212
kernel_input.reconstruct_from_public(public_inputs);
180-
181213
nested_pairing_points = kernel_input.pairing_inputs;
182-
// T_prev is read by the public input of the previous kernel K_{i-1} at the beginning of the recursive
183-
// verification of of the folding of K_{i-1} (kernel), A_{i,1} (app), .., A_{i, n} (app). This verification
184-
// happens in K_{i}
185-
merge_commitments.T_prev_commitments = kernel_input.ecc_op_tables;
186-
187214
// Perform databus consistency checks
188215
kernel_input.kernel_return_data.assert_equal(witness_commitments.calldata);
189216
kernel_input.app_return_data.assert_equal(witness_commitments.secondary_calldata);
190217

218+
// T_prev is read by the public input of the previous kernel K_{i-1} at the beginning of the recursive
219+
// verification of of the folding of K_{i-1} (kernel), A_{i,1} (app), .., A_{i, n} (app). This verification
220+
// happens in K_{i}
221+
merge_commitments.T_prev_commitments = std::move(kernel_input.ecc_op_tables);
222+
191223
// Set the kernel return data commitment to be propagated via the public inputs
192-
bus_depot.set_kernel_return_data_commitment(witness_commitments.return_data);
224+
225+
if (!is_hiding_kernel) {
226+
// The hiding kernel has no return data but uses the traditional public-inputs mechanism
227+
bus_depot.set_kernel_return_data_commitment(witness_commitments.return_data);
228+
}
193229
} else {
194230
// Reconstruct the input from the previous app from its public inputs
195231
AppIO app_input; // pairing points
@@ -208,6 +244,9 @@ std::pair<ClientIVC::PairingPoints, ClientIVC::TableCommitments> ClientIVC::
208244
goblin.recursively_verify_merge(circuit, merge_commitments, accumulation_recursive_transcript);
209245

210246
pairing_points.aggregate(nested_pairing_points);
247+
if (is_hiding_kernel) {
248+
pairing_points.aggregate(decider_pairing_points);
249+
}
211250

212251
return { pairing_points, merged_table_commitments };
213252
}
@@ -423,68 +462,6 @@ void ClientIVC::hide_op_queue_accumulation_result(ClientCircuit& circuit)
423462
circuit.queue_ecc_eq();
424463
}
425464

426-
std::pair<ClientIVC::PairingPoints, ClientIVC::TableCommitments> ClientIVC::complete_hiding_circuit_logic(
427-
const StdlibProof& stdlib_proof,
428-
const std::shared_ptr<RecursiveVKAndHash>& stdlib_vk_and_hash,
429-
ClientCircuit& circuit)
430-
{
431-
using MergeCommitments = Goblin::MergeRecursiveVerifier::InputCommitments;
432-
trace_usage_tracker.print();
433-
434-
// Shared transcript between PG and Merge
435-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1453): Investigate whether Decider/PG/Merge need to
436-
// share a transcript
437-
std::shared_ptr<RecursiveTranscript> pg_merge_transcript = std::make_shared<RecursiveTranscript>();
438-
439-
hide_op_queue_accumulation_result(circuit);
440-
441-
// Construct stdlib accumulator, decider vkey and folding proof
442-
auto stdlib_verifier_accumulator =
443-
std::make_shared<RecursiveDeciderVerificationKey>(&circuit, recursive_verifier_native_accum);
444-
445-
// Propagate the public inputs of the tail kernel by converting them to public inputs of the hiding circuit.
446-
auto num_public_inputs = static_cast<size_t>(honk_vk->num_public_inputs);
447-
num_public_inputs -= KernelIO::PUBLIC_INPUTS_SIZE; // exclude fixed kernel_io public inputs
448-
for (size_t i = 0; i < num_public_inputs; i++) {
449-
stdlib_proof[i].set_public();
450-
}
451-
452-
// Perform recursive folding verification of the last folding proof
453-
FoldingRecursiveVerifier folding_verifier{
454-
&circuit, stdlib_verifier_accumulator, { stdlib_vk_and_hash }, pg_merge_transcript
455-
};
456-
auto recursive_verifier_native_accum = folding_verifier.verify_folding_proof(stdlib_proof);
457-
verification_queue.clear();
458-
459-
// Get the completed decider verification key corresponding to the tail kernel from the folding verifier
460-
const std::vector<StdlibFF>& public_inputs = folding_verifier.public_inputs;
461-
WitnessCommitments& witness_commitments = folding_verifier.keys_to_fold[1]->witness_commitments;
462-
463-
// Reconstruct the KernelIO from the public inputs of the tail kernel and perform databus consistency checks
464-
KernelIO kernel_input; // pairing points, databus return data commitments
465-
kernel_input.reconstruct_from_public(public_inputs);
466-
kernel_input.kernel_return_data.assert_equal(witness_commitments.calldata);
467-
kernel_input.app_return_data.assert_equal(witness_commitments.secondary_calldata);
468-
469-
// Extract the commitments to the subtable corresponding to the incoming circuit
470-
MergeCommitments merge_commitments;
471-
merge_commitments.t_commitments = witness_commitments.get_ecc_op_wires().get_copy();
472-
merge_commitments.T_prev_commitments = std::move(
473-
kernel_input.ecc_op_tables); // Commitment to the status of the op_queue before folding the tail kernel
474-
// Perform recursive verification of the last merge proof
475-
auto [points_accumulator, merged_table_commitments] =
476-
goblin.recursively_verify_merge(circuit, merge_commitments, pg_merge_transcript);
477-
478-
points_accumulator.aggregate(kernel_input.pairing_inputs);
479-
480-
// Perform recursive decider verification
481-
DeciderRecursiveVerifier decider{ &circuit, recursive_verifier_native_accum };
482-
BB_ASSERT_EQ(!decider_proof.empty(), true, "Decider proof is empty!");
483-
PairingPoints decider_pairing_points = decider.verify_proof(decider_proof);
484-
points_accumulator.aggregate(decider_pairing_points);
485-
return { points_accumulator, merged_table_commitments };
486-
}
487-
488465
/**
489466
* @brief Construct the proving key of the hiding circuit, from the hiding_circuit builder in the client_ivc class
490467
*/

barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,12 +256,6 @@ class ClientIVC {
256256
// Complete the logic of a kernel circuit (e.g. PG/merge recursive verification, databus consistency checks)
257257
void complete_kernel_circuit_logic(ClientCircuit& circuit);
258258

259-
// Complete the logic of the hiding circuit, which includes PG, decider and merge recursive verification
260-
std::pair<PairingPoints, TableCommitments> complete_hiding_circuit_logic(
261-
const StdlibProof& stdlib_proof,
262-
const std::shared_ptr<RecursiveVKAndHash>& stdlib_vk_and_hash,
263-
ClientCircuit& circuit);
264-
265259
/**
266260
* @brief Perform prover work for accumulation (e.g. PG folding, merge proving)
267261
*

barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,14 @@ struct AcirFormat {
121121

122122
// Number of gates added to the circuit per original opcode.
123123
// Has length equal to num_acir_opcodes.
124-
std::vector<size_t> gates_per_opcode = {};
124+
std::vector<size_t> gates_per_opcode;
125125

126126
// Set of constrained witnesses
127-
std::set<uint32_t> constrained_witness = {};
127+
std::set<uint32_t> constrained_witness;
128128
// map witness with their minimal bit-range
129-
std::map<uint32_t, uint32_t> minimal_range = {};
129+
std::map<uint32_t, uint32_t> minimal_range;
130130
// map witness with their minimal bit-range implied by array operations
131-
std::map<uint32_t, uint32_t> index_range = {};
131+
std::map<uint32_t, uint32_t> index_range;
132132

133133
// Indices of the original opcode that originated each constraint in AcirFormat.
134134
AcirFormatOriginalOpcodeIndices original_opcode_indices;

barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.test.cpp

Lines changed: 0 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,7 @@ TEST_F(AcirFormatTests, TestASingleConstraintNoPubInputs)
3636
.varnum = 4,
3737
.num_acir_opcodes = 1,
3838
.public_inputs = {},
39-
.logic_constraints = {},
40-
.range_constraints = {},
41-
.aes128_constraints = {},
42-
.sha256_compression = {},
43-
.ecdsa_k1_constraints = {},
44-
.ecdsa_r1_constraints = {},
45-
.blake2s_constraints = {},
46-
.blake3_constraints = {},
47-
.keccak_permutations = {},
48-
.poseidon2_constraints = {},
49-
.multi_scalar_mul_constraints = {},
50-
.ec_add_constraints = {},
51-
.honk_recursion_constraints = {},
52-
.avm_recursion_constraints = {},
53-
.pg_recursion_constraints = {},
54-
.civc_recursion_constraints = {},
55-
.bigint_from_le_bytes_constraints = {},
56-
.bigint_to_le_bytes_constraints = {},
57-
.bigint_operations = {},
58-
.assert_equalities = {},
5939
.poly_triple_constraints = { constraint },
60-
.quad_constraints = {},
61-
.big_quad_constraints = {},
62-
.block_constraints = {},
6340
.original_opcode_indices = create_empty_original_opcode_indices(),
6441
};
6542
mock_opcode_indices(constraint_system);
@@ -152,28 +129,7 @@ TEST_F(AcirFormatTests, TestLogicGateFromNoirCircuit)
152129
.public_inputs = { 1 },
153130
.logic_constraints = { logic_constraint },
154131
.range_constraints = { range_a, range_b },
155-
.aes128_constraints = {},
156-
.sha256_compression = {},
157-
.ecdsa_k1_constraints = {},
158-
.ecdsa_r1_constraints = {},
159-
.blake2s_constraints = {},
160-
.blake3_constraints = {},
161-
.keccak_permutations = {},
162-
.poseidon2_constraints = {},
163-
.multi_scalar_mul_constraints = {},
164-
.ec_add_constraints = {},
165-
.honk_recursion_constraints = {},
166-
.avm_recursion_constraints = {},
167-
.pg_recursion_constraints = {},
168-
.civc_recursion_constraints = {},
169-
.bigint_from_le_bytes_constraints = {},
170-
.bigint_to_le_bytes_constraints = {},
171-
.bigint_operations = {},
172-
.assert_equalities = {},
173132
.poly_triple_constraints = { expr_a, expr_b, expr_c, expr_d },
174-
.quad_constraints = {},
175-
.big_quad_constraints = {},
176-
.block_constraints = {},
177133
.original_opcode_indices = create_empty_original_opcode_indices(),
178134
};
179135
mock_opcode_indices(constraint_system);
@@ -227,30 +183,7 @@ TEST_F(AcirFormatTests, TestKeccakPermutation)
227183
.varnum = 51,
228184
.num_acir_opcodes = 1,
229185
.public_inputs = {},
230-
.logic_constraints = {},
231-
.range_constraints = {},
232-
.aes128_constraints = {},
233-
.sha256_compression = {},
234-
.ecdsa_k1_constraints = {},
235-
.ecdsa_r1_constraints = {},
236-
.blake2s_constraints = {},
237-
.blake3_constraints = {},
238186
.keccak_permutations = { keccak_permutation },
239-
.poseidon2_constraints = {},
240-
.multi_scalar_mul_constraints = {},
241-
.ec_add_constraints = {},
242-
.honk_recursion_constraints = {},
243-
.avm_recursion_constraints = {},
244-
.pg_recursion_constraints = {},
245-
.civc_recursion_constraints = {},
246-
.bigint_from_le_bytes_constraints = {},
247-
.bigint_to_le_bytes_constraints = {},
248-
.bigint_operations = {},
249-
.assert_equalities = {},
250-
.poly_triple_constraints = {},
251-
.quad_constraints = {},
252-
.big_quad_constraints = {},
253-
.block_constraints = {},
254187
.original_opcode_indices = create_empty_original_opcode_indices(),
255188
};
256189
mock_opcode_indices(constraint_system);
@@ -296,30 +229,7 @@ TEST_F(AcirFormatTests, TestCollectsGateCounts)
296229
.varnum = 4,
297230
.num_acir_opcodes = 2,
298231
.public_inputs = {},
299-
.logic_constraints = {},
300-
.range_constraints = {},
301-
.aes128_constraints = {},
302-
.sha256_compression = {},
303-
.ecdsa_k1_constraints = {},
304-
.ecdsa_r1_constraints = {},
305-
.blake2s_constraints = {},
306-
.blake3_constraints = {},
307-
.keccak_permutations = {},
308-
.poseidon2_constraints = {},
309-
.multi_scalar_mul_constraints = {},
310-
.ec_add_constraints = {},
311-
.honk_recursion_constraints = {},
312-
.avm_recursion_constraints = {},
313-
.pg_recursion_constraints = {},
314-
.civc_recursion_constraints = {},
315-
.bigint_from_le_bytes_constraints = {},
316-
.bigint_to_le_bytes_constraints = {},
317-
.bigint_operations = {},
318-
.assert_equalities = {},
319232
.poly_triple_constraints = { first_gate, second_gate },
320-
.quad_constraints = {},
321-
.big_quad_constraints = {},
322-
.block_constraints = {},
323233
.original_opcode_indices = create_empty_original_opcode_indices(),
324234
};
325235
mock_opcode_indices(constraint_system);
@@ -421,29 +331,8 @@ TEST_F(AcirFormatTests, TestBigAdd)
421331
.varnum = static_cast<uint32_t>(num_variables + 1),
422332
.num_acir_opcodes = 1,
423333
.public_inputs = {},
424-
.logic_constraints = {},
425-
.range_constraints = {},
426-
.aes128_constraints = {},
427-
.sha256_compression = {},
428-
.ecdsa_k1_constraints = {},
429-
.ecdsa_r1_constraints = {},
430-
.blake2s_constraints = {},
431-
.blake3_constraints = {},
432-
.keccak_permutations = {},
433-
.poseidon2_constraints = {},
434-
.multi_scalar_mul_constraints = {},
435-
.ec_add_constraints = {},
436-
.honk_recursion_constraints = {},
437-
.avm_recursion_constraints = {},
438-
.civc_recursion_constraints = {},
439-
.bigint_from_le_bytes_constraints = {},
440-
.bigint_to_le_bytes_constraints = {},
441-
.bigint_operations = {},
442-
.assert_equalities = {},
443334
.poly_triple_constraints = { assert_equal },
444-
.quad_constraints = {},
445335
.big_quad_constraints = { quad_constraint },
446-
.block_constraints = {},
447336
.original_opcode_indices = create_empty_original_opcode_indices(),
448337
};
449338
mock_opcode_indices(constraint_system);

0 commit comments

Comments
 (0)