diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index 41ee122490f..a6fb98c7c8c 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -76,6 +76,7 @@ library Constants { uint256 internal constant PRIVATE_KERNEL_RESET_BIG_INDEX = 3; uint256 internal constant PRIVATE_KERNEL_RESET_MEDIUM_INDEX = 4; uint256 internal constant PRIVATE_KERNEL_RESET_SMALL_INDEX = 5; + uint256 internal constant PRIVATE_KERNEL_RESET_TINY_INDEX = 6; uint256 internal constant PRIVATE_KERNEL_TAIL_INDEX = 10; uint256 internal constant PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX = 11; uint256 internal constant EMPTY_NESTED_INDEX = 12; diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr index 2f34b4de60b..51ca50f4d3b 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr @@ -12,7 +12,8 @@ use dep::types::{ }, constants::{ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX + PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX } }; @@ -23,6 +24,7 @@ global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX, ]; struct PrivateKernelInnerCircuitPrivateInputs { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr index c76e0cdeada..40196869689 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr @@ -6,7 +6,8 @@ use dep::types::{ abis::{private_kernel_data::PrivateKernelData, kernel_circuit_public_inputs::KernelCircuitPublicInputs}, constants::{ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX + PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX } }; @@ -17,6 +18,7 @@ global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX, ]; struct PrivateKernelTailCircuitPrivateInputs { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr index 6a3aeaf375a..6180ea6c315 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr @@ -7,7 +7,8 @@ use dep::types::{ abis::{private_kernel_data::PrivateKernelData, kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs}, constants::{ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX + PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX } }; @@ -18,6 +19,7 @@ global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX, ]; struct PrivateKernelTailToPublicCircuitPrivateInputs { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index 49f67780fcc..e63fc49bd8f 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -104,6 +104,7 @@ global PRIVATE_KERNEL_RESET_FULL_INDEX: u32 = 2; global PRIVATE_KERNEL_RESET_BIG_INDEX: u32 = 3; global PRIVATE_KERNEL_RESET_MEDIUM_INDEX: u32 = 4; global PRIVATE_KERNEL_RESET_SMALL_INDEX: u32 = 5; +global PRIVATE_KERNEL_RESET_TINY_INDEX: u32 = 6; global PRIVATE_KERNEL_TAIL_INDEX: u32 = 10; global PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX: u32 = 11; global EMPTY_NESTED_INDEX: u32 = 12; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr index c26f9b12554..1069bfb9ec9 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr @@ -4,7 +4,8 @@ use crate::constants::{ PRIVATE_KERNEL_RESET_SMALL_INDEX, PRIVATE_KERNEL_TAIL_INDEX, PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX, EMPTY_NESTED_INDEX, PRIVATE_KERNEL_EMPTY_INDEX, PUBLIC_KERNEL_SETUP_INDEX, PUBLIC_KERNEL_APP_LOGIC_INDEX, PUBLIC_KERNEL_TEARDOWN_INDEX, PUBLIC_KERNEL_TAIL_INDEX, - BASE_PARITY_INDEX, ROOT_PARITY_INDEX, BASE_ROLLUP_INDEX, MERGE_ROLLUP_INDEX, ROOT_ROLLUP_INDEX + BASE_PARITY_INDEX, ROOT_PARITY_INDEX, BASE_ROLLUP_INDEX, MERGE_ROLLUP_INDEX, ROOT_ROLLUP_INDEX, + PRIVATE_KERNEL_RESET_TINY_INDEX }; use crate::merkle_tree::merkle_tree::MerkleTree; @@ -25,6 +26,7 @@ pub fn get_vk_merkle_tree() -> MerkleTree { leaves[PRIVATE_KERNEL_RESET_BIG_INDEX] = 3; leaves[PRIVATE_KERNEL_RESET_MEDIUM_INDEX] = 4; leaves[PRIVATE_KERNEL_RESET_SMALL_INDEX] = 5; + leaves[PRIVATE_KERNEL_RESET_TINY_INDEX] = 6; leaves[PRIVATE_KERNEL_TAIL_INDEX] = 10; leaves[PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX] = 11; leaves[EMPTY_NESTED_INDEX] = 12; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_split_sorted_transformed_value_arrays.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_split_sorted_transformed_value_arrays.nr index 94e1871ab3f..13213932d66 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_split_sorted_transformed_value_arrays.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_split_sorted_transformed_value_arrays.nr @@ -29,27 +29,13 @@ fn assert_split_sorted_transformed_value_arrays( let value = transformed_value_array[i]; let sorted_index = index_hints[i]; let is_lt = original.counter() < split_counter; - let (sorted_value, sorted_counter, num) = if is_lt { - ( - sorted_transformed_value_array_lt[sorted_index], sorted_counters_lt[sorted_index], num_lt - ) + let (sorted_value, sorted_counter) = if is_lt { + (sorted_transformed_value_array_lt[sorted_index], sorted_counters_lt[sorted_index]) } else { - ( - sorted_transformed_value_array_gte[sorted_index], sorted_counters_gte[sorted_index], num_gte - ) + (sorted_transformed_value_array_gte[sorted_index], sorted_counters_gte[sorted_index]) }; assert_eq(value, sorted_value, "mismatch sorted values"); assert_eq(original.counter(), sorted_counter, "mismatch counters"); - if num != 0 { - let (counter, prev_counter) = if is_lt { - (sorted_counters_lt[num], sorted_counters_lt[num - 1]) - } else { - (sorted_counters_gte[num], sorted_counters_gte[num - 1]) - }; - let is_incrementing = counter > prev_counter; - assert(ascending == is_incrementing, "value array must be sorted by counter"); - assert(counter != prev_counter, "counters must not be the same"); - } if is_lt { num_lt += 1; } else { @@ -58,6 +44,21 @@ fn assert_split_sorted_transformed_value_arrays( } } + for i in 1..N { + if i < num_lt { + let counter = sorted_counters_lt[i]; + let prev_counter = sorted_counters_lt[i - 1]; + assert(ascending == (counter > prev_counter), "value array must be sorted by counter"); + assert(counter != prev_counter, "counters must not be the same"); + } + if i < num_gte { + let counter = sorted_counters_gte[i]; + let prev_counter = sorted_counters_gte[i - 1]; + assert(ascending == (counter > prev_counter), "value array must be sorted by counter"); + assert(counter != prev_counter, "counters must not be the same"); + } + } + let num_non_empty_values_lt = validate_array(sorted_transformed_value_array_lt); assert_eq(num_non_empty_values_lt, num_lt, "mismatch number of values lt"); diff --git a/noir-projects/noir-protocol-circuits/reset_variants.json b/noir-projects/noir-protocol-circuits/reset_variants.json index 514570386cf..88fdf280fa6 100644 --- a/noir-projects/noir-protocol-circuits/reset_variants.json +++ b/noir-projects/noir-protocol-circuits/reset_variants.json @@ -31,5 +31,16 @@ "NULLIFIER_SETTLED_AMOUNT": 8, "NULLIFIER_KEYS": 8 } + }, + { + "tag": "tiny", + "priority": 101, + "replacements": { + "NOTE_HASH_PENDING_AMOUNT": 4, + "NOTE_HASH_SETTLED_AMOUNT": 4, + "NULLIFIER_PENDING_AMOUNT": 4, + "NULLIFIER_SETTLED_AMOUNT": 4, + "NULLIFIER_KEYS": 4 + } } ] \ No newline at end of file diff --git a/yarn-project/bb-prover/src/stats.ts b/yarn-project/bb-prover/src/stats.ts index f31e611dd8c..e7f3da9302a 100644 --- a/yarn-project/bb-prover/src/stats.ts +++ b/yarn-project/bb-prover/src/stats.ts @@ -41,6 +41,8 @@ export function mapProtocolArtifactNameToCircuitName( return 'private-kernel-reset-medium'; case 'PrivateKernelResetSmallArtifact': return 'private-kernel-reset-small'; + case 'PrivateKernelResetTinyArtifact': + return 'private-kernel-reset-tiny'; case 'EmptyNestedArtifact': return 'empty-nested'; case 'PrivateKernelEmptyArtifact': diff --git a/yarn-project/circuit-types/src/stats/stats.ts b/yarn-project/circuit-types/src/stats/stats.ts index 8abab96dde9..ac87473565e 100644 --- a/yarn-project/circuit-types/src/stats/stats.ts +++ b/yarn-project/circuit-types/src/stats/stats.ts @@ -83,6 +83,7 @@ export type CircuitName = | 'private-kernel-reset-big' | 'private-kernel-reset-medium' | 'private-kernel-reset-small' + | 'private-kernel-reset-tiny' | 'private-kernel-tail' | 'private-kernel-tail-to-public' | 'app-circuit' diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index 308495143d7..f3331eef127 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -62,6 +62,7 @@ export const PRIVATE_KERNEL_RESET_FULL_INDEX = 2; export const PRIVATE_KERNEL_RESET_BIG_INDEX = 3; export const PRIVATE_KERNEL_RESET_MEDIUM_INDEX = 4; export const PRIVATE_KERNEL_RESET_SMALL_INDEX = 5; +export const PRIVATE_KERNEL_RESET_TINY_INDEX = 6; export const PRIVATE_KERNEL_TAIL_INDEX = 10; export const PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX = 11; export const EMPTY_NESTED_INDEX = 12; diff --git a/yarn-project/noir-protocol-circuits-types/src/artifacts.ts b/yarn-project/noir-protocol-circuits-types/src/artifacts.ts index 97ce2df7a70..9d15d0ca234 100644 --- a/yarn-project/noir-protocol-circuits-types/src/artifacts.ts +++ b/yarn-project/noir-protocol-circuits-types/src/artifacts.ts @@ -19,6 +19,7 @@ import PrivateKernelResetBigSimulatedJson from '../artifacts/private_kernel_rese import PrivateKernelResetMediumSimulatedJson from '../artifacts/private_kernel_reset_simulated_medium.json' assert { type: 'json' }; import PrivateKernelResetSmallSimulatedJson from '../artifacts/private_kernel_reset_simulated_small.json' assert { type: 'json' }; import PrivateKernelResetSmallJson from '../artifacts/private_kernel_reset_small.json' assert { type: 'json' }; +import PrivateKernelResetTinyJson from '../artifacts/private_kernel_reset_tiny.json' assert { type: 'json' }; import PrivateKernelTailJson from '../artifacts/private_kernel_tail.json' assert { type: 'json' }; import PrivateKernelTailSimulatedJson from '../artifacts/private_kernel_tail_simulated.json' assert { type: 'json' }; import PrivateKernelTailToPublicJson from '../artifacts/private_kernel_tail_to_public.json' assert { type: 'json' }; @@ -40,13 +41,15 @@ export type PrivateResetArtifacts = | 'PrivateKernelResetFullArtifact' | 'PrivateKernelResetBigArtifact' | 'PrivateKernelResetMediumArtifact' - | 'PrivateKernelResetSmallArtifact'; + | 'PrivateKernelResetSmallArtifact' + | 'PrivateKernelResetTinyArtifact'; export const PrivateResetTagToArtifactName: Record = { full: 'PrivateKernelResetFullArtifact', big: 'PrivateKernelResetBigArtifact', medium: 'PrivateKernelResetMediumArtifact', small: 'PrivateKernelResetSmallArtifact', + tiny: 'PrivateKernelResetTinyArtifact', }; export type ServerProtocolArtifact = @@ -104,6 +107,7 @@ export const ResetSimulatedArtifacts: Record = { @@ -113,6 +117,7 @@ export const ClientCircuitArtifacts: Record = { PrivateKernelResetBigArtifact: keyJsonToVKData(PrivateKernelResetBigVkJson), PrivateKernelResetMediumArtifact: keyJsonToVKData(PrivateKernelResetMediumVkJson), PrivateKernelResetSmallArtifact: keyJsonToVKData(PrivateKernelResetSmallVkJson), + PrivateKernelResetTinyArtifact: keyJsonToVKData(PrivateKernelResetTinyVkJson), PrivateKernelTailArtifact: keyJsonToVKData(PrivateKernelTailVkJson), PrivateKernelTailToPublicArtifact: keyJsonToVKData(PrivateKernelTailToPublicVkJson), }; @@ -108,6 +111,7 @@ export const ProtocolCircuitVkIndexes: Record = { PrivateKernelResetBigArtifact: PRIVATE_KERNEL_RESET_BIG_INDEX, PrivateKernelResetMediumArtifact: PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PrivateKernelResetSmallArtifact: PRIVATE_KERNEL_RESET_SMALL_INDEX, + PrivateKernelResetTinyArtifact: PRIVATE_KERNEL_RESET_TINY_INDEX, PrivateKernelTailArtifact: PRIVATE_KERNEL_TAIL_INDEX, PrivateKernelTailToPublicArtifact: PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX, PublicKernelSetupArtifact: PUBLIC_KERNEL_SETUP_INDEX,