Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: private tail circuits #7148

Merged
merged 21 commits into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
d017c95
Build hints for private init in noir.
LeilaWang Jun 5, 2024
304e5b9
Build private tail hints in noir.
LeilaWang Jun 16, 2024
609af30
Merge remote-tracking branch 'origin/master' into lw/build_hints_in_noir
LeilaWang Jun 16, 2024
b9c2823
Update type.
LeilaWang Jun 16, 2024
3050229
Private tail to public output composer.
LeilaWang Jun 19, 2024
3d921ca
Merge remote-tracking branch 'origin/master' into lw/build_hints_in_noir
LeilaWang Jun 19, 2024
c089385
Verify the output of private_tail_to_public against previous kernel.
LeilaWang Jun 27, 2024
b91742f
Move util.
LeilaWang Jun 27, 2024
c2435ef
Test tail circuits in constrained mode to run output validator.
LeilaWang Jun 27, 2024
af8f82f
Fix test.
LeilaWang Jun 27, 2024
a4ae476
Merge remote-tracking branch 'origin/master' into lw/build_hints_in_noir
LeilaWang Jun 27, 2024
86bfffe
Remove hints for private tail circuit from ts.
LeilaWang Jun 27, 2024
59dbfa3
Revert changes to public call stack.
LeilaWang Jun 29, 2024
1afa3fd
Reverse public call requests.
LeilaWang Jun 29, 2024
201c1b4
Update fixture.
LeilaWang Jun 30, 2024
c2b19a4
Increase timeout.
LeilaWang Jun 30, 2024
e7ba8bc
Add script for generating flamegraph.
LeilaWang Jul 1, 2024
e510c66
Merge remote-tracking branch 'origin/master' into lw/build_hints_in_noir
LeilaWang Jul 1, 2024
267516c
Rename files.
LeilaWang Jul 1, 2024
e1252ba
Update assert_split_sorted_transformed_value_arrays and tests.
LeilaWang Jul 1, 2024
5828970
Merge remote-tracking branch 'origin/master' into lw/build_hints_in_noir
LeilaWang Jul 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
mod kernel_circuit_output_hints;
mod kernel_circuit_output_validator;
mod kernel_circuit_public_inputs_composer;
mod kernel_circuit_output_validator; // TODO: Rename to tail_output_validator
mod previous_kernel_validator;
mod private_call_data_validator;
mod private_kernel_circuit_output_validator;
mod private_kernel_circuit_public_inputs_composer;
mod tail_output_composer;
mod tail_to_public_output_composer;
mod tail_to_public_output_validator;
Original file line number Diff line number Diff line change
@@ -1,42 +1,25 @@
use crate::components::{kernel_circuit_output_hints::{Hints, OrderHint}};
mod kernel_circuit_output_hints;
mod validate_value_transformation;

use crate::components::kernel_circuit_output_validator::{
kernel_circuit_output_hints::{generate_kernel_circuit_output_hints, Hints},
validate_value_transformation::{validate_transformed_values, validate_value_transformation}
};
use dep::types::{
abis::{
kernel_circuit_public_inputs::{KernelCircuitPublicInputs, PrivateKernelCircuitPublicInputs},
log_hash::{LogHash, NoteLogHash, ScopedEncryptedLogHash, ScopedLogHash}
},
constants::MAX_NEW_NOTE_HASHES_PER_TX,
hash::{
compute_tx_logs_hash, compute_tx_note_logs_hash, silo_encrypted_log_hash, silo_l2_to_l1_message,
silo_note_hash, silo_nullifier, silo_unencrypted_log_hash
},
traits::{Empty, is_empty}, utils::arrays::assert_sorted_transformed_value_array
traits::is_empty, utils::arrays::assert_sorted_transformed_value_array
};

fn validate_transformed_value_array<T, S, N, Env>(
original_array: [T; N],
transformed_value_array: [S; N],
is_transformed: fn[Env](T, S) -> bool
) {
for i in 0..N {
assert(is_transformed(original_array[i], transformed_value_array[i]), "invalid transformed value");
}
}

fn validate_siloed_value_array<T, S, N, Env>(
original_array: [T; N],
transformed_value_array: [S; N],
silo_value: fn[Env](T) -> S
) where S: Empty + Eq {
validate_transformed_value_array(
original_array,
transformed_value_array,
|original: T, transformed: S| transformed == silo_value(original)
);
}

struct KernelCircuitOutputValidator {
output: KernelCircuitPublicInputs,
previous_kernel: PrivateKernelCircuitPublicInputs
previous_kernel: PrivateKernelCircuitPublicInputs,
}

impl KernelCircuitOutputValidator {
Expand All @@ -47,11 +30,13 @@ impl KernelCircuitOutputValidator {
KernelCircuitOutputValidator { output, previous_kernel }
}

pub fn validate<N>(self, hints: Hints) {
pub fn validate<N>(self) {
let hints = generate_kernel_circuit_output_hints(self.previous_kernel);
self.validate_empty_values();
self.validate_propagated_values();
self.validate_propagated_sorted_siloed_values(hints);
self.validate_accumulated_values(hints);
self.validate_gas_limits();
}

fn validate_empty_values(self) {
Expand Down Expand Up @@ -86,7 +71,7 @@ impl KernelCircuitOutputValidator {
);

// new_nullifiers
validate_siloed_value_array(
validate_transformed_values(
self.previous_kernel.end.new_nullifiers,
hints.siloed_nullifiers,
silo_nullifier
Expand All @@ -101,7 +86,7 @@ impl KernelCircuitOutputValidator {

// new_l2_to_l1_msgs
let tx_context = self.previous_kernel.constants.tx_context;
validate_siloed_value_array(
validate_transformed_values(
self.previous_kernel.end.new_l2_to_l1_msgs,
hints.siloed_l2_to_l1_msgs,
|msg| silo_l2_to_l1_message(msg, tx_context.version, tx_context.chain_id)
Expand All @@ -117,7 +102,7 @@ impl KernelCircuitOutputValidator {

fn validate_accumulated_values(self, hints: Hints) {
// note_encrypted_log_hashes
validate_transformed_value_array(
validate_value_transformation(
self.previous_kernel.end.note_encrypted_logs_hashes,
hints.note_encrypted_log_hashes,
|nlh: NoteLogHash, lh: LogHash| (nlh.value == lh.value) & (nlh.length == lh.length)
Expand All @@ -134,7 +119,7 @@ impl KernelCircuitOutputValidator {
assert_eq(hash, self.output.end.note_encrypted_logs_hash, "mismatch note_encrypted_logs_hash");

// encrypted_log_hashes
validate_transformed_value_array(
validate_value_transformation(
self.previous_kernel.end.encrypted_logs_hashes,
hints.siloed_encrypted_log_hashes,
|slh: ScopedEncryptedLogHash, lh: LogHash| (lh.value == silo_encrypted_log_hash(slh)) & (lh.length == slh.log_hash.length)
Expand All @@ -151,7 +136,7 @@ impl KernelCircuitOutputValidator {
assert_eq(hash, self.output.end.encrypted_logs_hash, "mismatch encrypted_logs_hash");

// unencrypted_log_hashes
validate_transformed_value_array(
validate_value_transformation(
self.previous_kernel.end.unencrypted_logs_hashes,
hints.siloed_unencrypted_log_hashes,
|slh: ScopedLogHash, lh: LogHash| (lh.value == silo_unencrypted_log_hash(slh)) & (lh.length == slh.log_hash.length)
Expand All @@ -167,4 +152,9 @@ impl KernelCircuitOutputValidator {
let hash = compute_tx_logs_hash(hints.sorted_siloed_unencrypted_log_hashes);
assert_eq(hash, self.output.end.unencrypted_logs_hash, "mismatch unencrypted_logs_hash");
}

fn validate_gas_limits(self) {
let limits = self.previous_kernel.constants.tx_context.gas_settings.gas_limits;
assert(self.output.end.gas_used.within(limits), "The gas used exceeds the gas limits");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct Hints {
sorted_unencrypted_log_hash_hints: [OrderHint; MAX_UNENCRYPTED_LOGS_PER_TX],
}

unconstrained pub fn generate_hints(previous_kernel: PrivateKernelCircuitPublicInputs) -> Hints {
unconstrained pub fn generate_kernel_circuit_output_hints(previous_kernel: PrivateKernelCircuitPublicInputs) -> Hints {
// note_hashes
let sorted_note_hash_hints = sort_get_order_hints_asc(previous_kernel.end.new_note_hashes);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use dep::types::traits::Empty;

pub fn validate_value_transformation<T, S, N, Env>(
original_array: [T; N],
transformed_value_array: [S; N],
is_transformed: fn[Env](T, S) -> bool
) {
for i in 0..N {
assert(is_transformed(original_array[i], transformed_value_array[i]), "invalid transformed value");
}
}

pub fn validate_transformed_values<T, S, N, Env>(
original_array: [T; N],
transformed_value_array: [S; N],
transform_value: fn[Env](T) -> S
) where S: Empty + Eq {
validate_value_transformation(
original_array,
transformed_value_array,
|original: T, transformed: S| transformed == transform_value(original)
);
}
Loading
Loading