@aztec/pxe 0.0.1-commit.c7c42ec → 0.0.1-commit.c949de6bc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/access_scopes.d.ts +9 -0
- package/dest/access_scopes.d.ts.map +1 -0
- package/dest/access_scopes.js +6 -0
- package/dest/bin/check_oracle_version.js +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts +13 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +74 -20
- package/dest/config/index.d.ts +3 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +17 -0
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
- package/dest/contract_function_simulator/benchmarked_node.js +77 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +57 -34
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +199 -81
- package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +45 -28
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -5
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -3
- package/dest/contract_function_simulator/index.d.ts +2 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +7 -4
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -3
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +17 -13
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts +12 -10
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +67 -44
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +45 -47
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +91 -60
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +67 -33
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +131 -110
- package/dest/contract_logging.d.ts +22 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +23 -0
- package/dest/contract_sync/contract_sync_service.d.ts +43 -0
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
- package/dest/contract_sync/contract_sync_service.js +97 -0
- package/dest/contract_sync/helpers.d.ts +29 -0
- package/dest/contract_sync/helpers.d.ts.map +1 -0
- package/dest/contract_sync/helpers.js +55 -0
- package/dest/debug/pxe_debug_utils.d.ts +24 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +28 -17
- package/dest/entrypoints/client/bundle/index.d.ts +4 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +3 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +31 -8
- package/dest/entrypoints/client/lazy/index.d.ts +4 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +3 -0
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +32 -9
- package/dest/entrypoints/pxe_creation_options.d.ts +5 -3
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +5 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -0
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +39 -16
- package/dest/events/event_service.d.ts +6 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +19 -22
- package/dest/events/private_event_filter_validator.d.ts +5 -5
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +5 -6
- package/dest/job_coordinator/job_coordinator.d.ts +75 -0
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
- package/dest/job_coordinator/job_coordinator.js +94 -0
- package/dest/logs/log_service.d.ts +8 -5
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +31 -33
- package/dest/notes/note_service.d.ts +10 -9
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +34 -38
- package/dest/notes_filter.d.ts +25 -0
- package/dest/notes_filter.d.ts.map +1 -0
- package/dest/notes_filter.js +4 -0
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +4 -3
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
- package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
- package/dest/private_kernel/hints/index.d.ts +3 -3
- package/dest/private_kernel/hints/index.d.ts.map +1 -1
- package/dest/private_kernel/hints/index.js +2 -2
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +29 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
- package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +141 -74
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +203 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +24 -17
- package/dest/private_kernel/private_kernel_oracle.d.ts +24 -24
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +94 -2
- package/dest/pxe.d.ts +76 -58
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +151 -136
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
- package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +130 -23
- package/dest/storage/contract_store/contract_store.d.ts +42 -15
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +157 -72
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +50 -51
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +284 -263
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +231 -73
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +16 -9
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +20 -10
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +254 -102
- package/dest/tagging/constants.d.ts +2 -0
- package/dest/tagging/constants.d.ts.map +1 -0
- package/dest/tagging/constants.js +10 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +60 -0
- package/dest/tagging/index.d.ts +4 -3
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +3 -11
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -5
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +13 -13
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -7
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +16 -12
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -8
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +9 -12
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +7 -7
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +23 -19
- package/package.json +27 -18
- package/src/access_scopes.ts +9 -0
- package/src/bin/check_oracle_version.ts +1 -0
- package/src/block_synchronizer/block_synchronizer.ts +93 -32
- package/src/config/index.ts +14 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/benchmarked_node.ts +103 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +353 -140
- package/src/contract_function_simulator/execution_note_cache.ts +44 -25
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -5
- package/src/contract_function_simulator/index.ts +1 -1
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +6 -2
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
- package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
- package/src/contract_function_simulator/oracle/interfaces.ts +22 -12
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
- package/src/contract_function_simulator/oracle/oracle.ts +79 -47
- package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +131 -140
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +198 -115
- package/src/contract_logging.ts +39 -0
- package/src/contract_sync/contract_sync_service.ts +152 -0
- package/src/contract_sync/helpers.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +63 -18
- package/src/entrypoints/client/bundle/index.ts +3 -0
- package/src/entrypoints/client/bundle/utils.ts +23 -16
- package/src/entrypoints/client/lazy/index.ts +3 -0
- package/src/entrypoints/client/lazy/utils.ts +24 -17
- package/src/entrypoints/pxe_creation_options.ts +4 -2
- package/src/entrypoints/server/index.ts +4 -0
- package/src/entrypoints/server/utils.ts +33 -41
- package/src/events/event_service.ts +19 -25
- package/src/events/private_event_filter_validator.ts +3 -5
- package/src/job_coordinator/job_coordinator.ts +150 -0
- package/src/logs/log_service.ts +51 -40
- package/src/notes/note_service.ts +41 -45
- package/src/notes_filter.ts +26 -0
- package/src/oracle_version.ts +4 -3
- package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
- package/src/private_kernel/hints/index.ts +2 -2
- package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +196 -138
- package/src/private_kernel/hints/test_utils.ts +325 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +27 -19
- package/src/private_kernel/private_kernel_oracle.ts +116 -36
- package/src/pxe.ts +283 -202
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
- package/src/storage/capsule_store/capsule_store.ts +159 -23
- package/src/storage/contract_store/contract_store.ts +186 -76
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +326 -320
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +301 -79
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +111 -21
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +297 -112
- package/src/tagging/constants.ts +10 -0
- package/src/tagging/get_all_logs_by_tags.ts +92 -0
- package/src/tagging/index.ts +3 -12
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +27 -16
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +17 -16
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +13 -15
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +26 -23
- package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
- package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_node.js +0 -27
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
- package/dest/public_storage/public_storage_service.d.ts +0 -24
- package/dest/public_storage/public_storage_service.d.ts.map +0 -1
- package/dest/public_storage/public_storage_service.js +0 -26
- package/dest/tree_membership/tree_membership_service.d.ts +0 -52
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -84
- package/src/contract_function_simulator/proxied_node.ts +0 -33
- package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
- package/src/public_storage/public_storage_service.ts +0 -33
- package/src/tree_membership/tree_membership_service.ts +0 -112
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MAX_TX_LIFETIME } from '@aztec/constants';
|
|
2
2
|
import type { PrivateKernelCircuitPublicInputs } from '@aztec/stdlib/kernel';
|
|
3
3
|
import type { UInt64 } from '@aztec/stdlib/types';
|
|
4
4
|
|
|
@@ -8,12 +8,12 @@ const ROUNDED_DURATIONS = [
|
|
|
8
8
|
1, // 1 second
|
|
9
9
|
];
|
|
10
10
|
|
|
11
|
-
function roundTimestamp(blockTimestamp: bigint,
|
|
11
|
+
function roundTimestamp(blockTimestamp: bigint, expirationTimestamp: bigint): UInt64 {
|
|
12
12
|
return ROUNDED_DURATIONS.reduce((timestamp, duration) => {
|
|
13
13
|
if (timestamp <= blockTimestamp) {
|
|
14
14
|
// The timestamp must be greater than the block timestamp.
|
|
15
15
|
// If it is too small, round it down again using a smaller duration.
|
|
16
|
-
const totalDuration =
|
|
16
|
+
const totalDuration = expirationTimestamp - blockTimestamp;
|
|
17
17
|
const roundedDuration = totalDuration - (totalDuration % BigInt(duration));
|
|
18
18
|
return blockTimestamp + roundedDuration;
|
|
19
19
|
}
|
|
@@ -21,36 +21,36 @@ function roundTimestamp(blockTimestamp: bigint, includeByTimestamp: bigint): UIn
|
|
|
21
21
|
}, 0n);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export function
|
|
24
|
+
export function computeTxExpirationTimestamp(
|
|
25
25
|
previousKernel: PrivateKernelCircuitPublicInputs,
|
|
26
|
-
|
|
26
|
+
txLifetime = MAX_TX_LIFETIME,
|
|
27
27
|
): UInt64 {
|
|
28
|
-
if (
|
|
28
|
+
if (txLifetime > MAX_TX_LIFETIME) {
|
|
29
29
|
throw new Error(
|
|
30
|
-
`Custom
|
|
30
|
+
`Custom tx lifetime cannot be greater than the max allowed. Max allowed: ${MAX_TX_LIFETIME}. Custom value: ${txLifetime}.`,
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
const anchorBlockTimestamp = previousKernel.constants.anchorBlockHeader.globalVariables.timestamp;
|
|
35
|
-
const maxTimestamp = anchorBlockTimestamp + BigInt(
|
|
36
|
-
const
|
|
35
|
+
const maxTimestamp = anchorBlockTimestamp + BigInt(txLifetime);
|
|
36
|
+
const expirationTimestamp = previousKernel.expirationTimestamp;
|
|
37
37
|
|
|
38
|
-
// If the
|
|
38
|
+
// If the expirationTimestamp set during the tx execution is greater than or equal to the max allowed duration,
|
|
39
39
|
// use the maximum allowed timestamp.
|
|
40
40
|
// Note: It shouldn't be larger than the max allowed duration, but we check for it anyway.
|
|
41
|
-
if (
|
|
41
|
+
if (expirationTimestamp >= maxTimestamp) {
|
|
42
42
|
return maxTimestamp;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
// Round it down to the nearest hour/min/second to reduce precision and avoid revealing the exact value.
|
|
46
46
|
// This makes it harder for others to infer what function calls may have been used to produce a specific timestamp.
|
|
47
|
-
const roundedTimestamp = roundTimestamp(anchorBlockTimestamp,
|
|
47
|
+
const roundedTimestamp = roundTimestamp(anchorBlockTimestamp, expirationTimestamp);
|
|
48
48
|
|
|
49
49
|
// The tx can't be published if the timestamp is the same or less than the anchor block's timestamp.
|
|
50
50
|
// Future blocks will have a greater timestamp, so the tx would never be included.
|
|
51
51
|
if (roundedTimestamp <= anchorBlockTimestamp) {
|
|
52
52
|
throw new Error(
|
|
53
|
-
`Include-by timestamp must be greater than the anchor block timestamp. Anchor block timestamp: ${anchorBlockTimestamp}. Include-by timestamp: ${
|
|
53
|
+
`Include-by timestamp must be greater than the anchor block timestamp. Anchor block timestamp: ${anchorBlockTimestamp}. Include-by timestamp: ${expirationTimestamp}.`,
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
1
|
+
export * from './private_kernel_reset_private_inputs_builder.js';
|
|
2
|
+
export * from './compute_tx_expiration_timestamp.js';
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import { makeTuple } from '@aztec/foundation/array';
|
|
11
11
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
12
12
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
13
|
-
import {
|
|
13
|
+
import { assertLength } from '@aztec/foundation/serialize';
|
|
14
14
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
15
15
|
import { privateKernelResetDimensionsConfig } from '@aztec/noir-protocol-circuits-types/client';
|
|
16
16
|
import {
|
|
@@ -26,14 +26,12 @@ import {
|
|
|
26
26
|
type PrivateKernelSimulateOutput,
|
|
27
27
|
ReadRequestActionEnum,
|
|
28
28
|
ReadRequestResetActions,
|
|
29
|
-
type
|
|
30
|
-
ScopedNoteHash,
|
|
31
|
-
ScopedNullifier,
|
|
32
|
-
ScopedReadRequest,
|
|
29
|
+
type ScopedKeyValidationRequestAndSeparator,
|
|
33
30
|
TransientDataSquashingHint,
|
|
34
31
|
buildNoteHashReadRequestHintsFromResetActions,
|
|
35
32
|
buildNullifierReadRequestHintsFromResetActions,
|
|
36
33
|
buildTransientDataHints,
|
|
34
|
+
countSquashedLogs,
|
|
37
35
|
findPrivateKernelResetDimensions,
|
|
38
36
|
getNoteHashReadRequestResetActions,
|
|
39
37
|
getNullifierReadRequestResetActions,
|
|
@@ -44,15 +42,6 @@ import { VkData } from '@aztec/stdlib/vks';
|
|
|
44
42
|
|
|
45
43
|
import type { PrivateKernelOracle } from '../private_kernel_oracle.js';
|
|
46
44
|
|
|
47
|
-
function collectNestedReadRequests<N extends number>(
|
|
48
|
-
executionStack: PrivateCallExecutionResult[],
|
|
49
|
-
extractReadRequests: (execution: PrivateCallExecutionResult) => ClaimedLengthArray<ScopedReadRequest, N>,
|
|
50
|
-
): ScopedReadRequest[] {
|
|
51
|
-
return collectNested(executionStack, executionResult => {
|
|
52
|
-
return extractReadRequests(executionResult).getActiveItems();
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
45
|
function getNullifierMembershipWitnessResolver(oracle: PrivateKernelOracle) {
|
|
57
46
|
return async (nullifier: Fr) => {
|
|
58
47
|
const res = await oracle.getNullifierMembershipWitness(nullifier);
|
|
@@ -68,9 +57,9 @@ function getNullifierMembershipWitnessResolver(oracle: PrivateKernelOracle) {
|
|
|
68
57
|
};
|
|
69
58
|
}
|
|
70
59
|
|
|
71
|
-
async function
|
|
60
|
+
async function getMasterSecretKeysAndKeyTypeDomainSeparators(
|
|
72
61
|
keyValidationRequests: ClaimedLengthArray<
|
|
73
|
-
|
|
62
|
+
ScopedKeyValidationRequestAndSeparator,
|
|
74
63
|
typeof MAX_KEY_VALIDATION_REQUESTS_PER_TX
|
|
75
64
|
>,
|
|
76
65
|
numRequestsToVerify: number,
|
|
@@ -91,11 +80,14 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
91
80
|
// If there's no next iteration, it's the final reset.
|
|
92
81
|
private nextIteration?: PrivateCircuitPublicInputs;
|
|
93
82
|
|
|
94
|
-
private noteHashResetActions
|
|
95
|
-
private nullifierResetActions
|
|
83
|
+
private noteHashResetActions = ReadRequestResetActions.empty(MAX_NOTE_HASH_READ_REQUESTS_PER_TX);
|
|
84
|
+
private nullifierResetActions = ReadRequestResetActions.empty(MAX_NULLIFIER_READ_REQUESTS_PER_TX);
|
|
96
85
|
private numTransientData?: number;
|
|
97
|
-
private transientDataSquashingHints
|
|
98
|
-
|
|
86
|
+
private transientDataSquashingHints = makeTuple(
|
|
87
|
+
MAX_NULLIFIERS_PER_TX,
|
|
88
|
+
() => new TransientDataSquashingHint(MAX_NULLIFIERS_PER_TX, MAX_NOTE_HASHES_PER_TX),
|
|
89
|
+
);
|
|
90
|
+
private requestedDimensions = PrivateKernelResetDimensions.empty();
|
|
99
91
|
|
|
100
92
|
constructor(
|
|
101
93
|
private previousKernelOutput: PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>,
|
|
@@ -104,21 +96,18 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
104
96
|
private splitCounter: number,
|
|
105
97
|
) {
|
|
106
98
|
this.previousKernel = previousKernelOutput.publicInputs;
|
|
107
|
-
this.requestedDimensions = PrivateKernelResetDimensions.empty();
|
|
108
|
-
this.noteHashResetActions = ReadRequestResetActions.empty(MAX_NOTE_HASH_READ_REQUESTS_PER_TX);
|
|
109
|
-
this.nullifierResetActions = ReadRequestResetActions.empty(MAX_NULLIFIER_READ_REQUESTS_PER_TX);
|
|
110
|
-
this.transientDataSquashingHints = makeTuple(
|
|
111
|
-
MAX_NULLIFIERS_PER_TX,
|
|
112
|
-
() => new TransientDataSquashingHint(MAX_NULLIFIERS_PER_TX, MAX_NOTE_HASHES_PER_TX),
|
|
113
|
-
);
|
|
114
99
|
this.nextIteration = executionStack[this.executionStack.length - 1]?.publicInputs;
|
|
115
100
|
}
|
|
116
101
|
|
|
102
|
+
getRequestedDimensions(): PrivateKernelResetDimensions {
|
|
103
|
+
return this.requestedDimensions;
|
|
104
|
+
}
|
|
105
|
+
|
|
117
106
|
needsReset(): boolean {
|
|
118
107
|
const fns: (() => boolean)[] = [
|
|
119
108
|
() => this.needsResetNoteHashReadRequests(),
|
|
120
109
|
() => this.needsResetNullifierReadRequests(),
|
|
121
|
-
() => this.
|
|
110
|
+
() => this.needsResetKeyValidationRequests(),
|
|
122
111
|
() => this.needsResetTransientData(),
|
|
123
112
|
];
|
|
124
113
|
|
|
@@ -138,15 +127,14 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
138
127
|
}
|
|
139
128
|
}
|
|
140
129
|
|
|
141
|
-
async build(oracle: PrivateKernelOracle
|
|
130
|
+
async build(oracle: PrivateKernelOracle) {
|
|
142
131
|
if (privateKernelResetDimensionNames.every(name => !this.requestedDimensions[name])) {
|
|
143
132
|
throw new Error('Reset is not required.');
|
|
144
133
|
}
|
|
145
134
|
|
|
146
135
|
const isInner = !!this.nextIteration;
|
|
147
136
|
|
|
148
|
-
// "final" reset must be done
|
|
149
|
-
// Because the code that silo note hashes can't be run repeatedly.
|
|
137
|
+
// "final" reset must be done exactly once, because siloing can't be run repeatedly.
|
|
150
138
|
// The dimensions found must be big enough to reset all values, i.e. empty remainder.
|
|
151
139
|
const allowRemainder = isInner;
|
|
152
140
|
|
|
@@ -157,16 +145,6 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
157
145
|
allowRemainder,
|
|
158
146
|
);
|
|
159
147
|
|
|
160
|
-
const previousVkMembershipWitness = await oracle.getVkMembershipWitness(
|
|
161
|
-
this.previousKernelOutput.verificationKey.keyAsFields,
|
|
162
|
-
);
|
|
163
|
-
const vkData = new VkData(
|
|
164
|
-
this.previousKernelOutput.verificationKey,
|
|
165
|
-
Number(previousVkMembershipWitness.leafIndex),
|
|
166
|
-
previousVkMembershipWitness.siblingPath,
|
|
167
|
-
);
|
|
168
|
-
const previousKernelData = new PrivateKernelData(this.previousKernelOutput.publicInputs, vkData);
|
|
169
|
-
|
|
170
148
|
this.reduceReadRequestActions(
|
|
171
149
|
this.noteHashResetActions,
|
|
172
150
|
dimensions.NOTE_HASH_PENDING_READ,
|
|
@@ -178,30 +156,51 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
178
156
|
dimensions.NULLIFIER_SETTLED_READ,
|
|
179
157
|
);
|
|
180
158
|
|
|
181
|
-
//
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
159
|
+
// Execute all the expensive node querying operations in parallel.
|
|
160
|
+
const [previousVkMembershipWitness, noteHashReadRequestHints, nullifierReadRequestHints, keyValidationHints] =
|
|
161
|
+
await Promise.all([
|
|
162
|
+
oracle.getVkMembershipWitness(this.previousKernelOutput.verificationKey.keyAsFields),
|
|
163
|
+
buildNoteHashReadRequestHintsFromResetActions<
|
|
164
|
+
typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
165
|
+
typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX
|
|
166
|
+
>(
|
|
189
167
|
oracle,
|
|
190
168
|
this.previousKernel.validationRequests.noteHashReadRequests,
|
|
191
169
|
this.previousKernel.end.noteHashes,
|
|
192
170
|
this.noteHashResetActions,
|
|
193
|
-
noteHashLeafIndexMap,
|
|
194
171
|
),
|
|
195
|
-
|
|
172
|
+
buildNullifierReadRequestHintsFromResetActions<
|
|
173
|
+
typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
174
|
+
typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX
|
|
175
|
+
>(
|
|
196
176
|
{ getNullifierMembershipWitness: getNullifierMembershipWitnessResolver(oracle) },
|
|
197
177
|
this.previousKernel.validationRequests.nullifierReadRequests,
|
|
198
178
|
this.nullifierResetActions,
|
|
199
179
|
),
|
|
200
|
-
|
|
201
|
-
this.previousKernel.validationRequests.
|
|
180
|
+
getMasterSecretKeysAndKeyTypeDomainSeparators(
|
|
181
|
+
this.previousKernel.validationRequests.scopedKeyValidationRequestsAndSeparators,
|
|
202
182
|
dimensions.KEY_VALIDATION,
|
|
203
183
|
oracle,
|
|
204
184
|
),
|
|
185
|
+
]);
|
|
186
|
+
|
|
187
|
+
const vkData = new VkData(
|
|
188
|
+
this.previousKernelOutput.verificationKey,
|
|
189
|
+
Number(previousVkMembershipWitness.leafIndex),
|
|
190
|
+
previousVkMembershipWitness.siblingPath,
|
|
191
|
+
);
|
|
192
|
+
const previousKernelData = new PrivateKernelData(this.previousKernelOutput.publicInputs, vkData);
|
|
193
|
+
|
|
194
|
+
// TODO: Enable padding when we have a better idea what are the final amounts we should pad to.
|
|
195
|
+
const paddedSideEffects = PaddedSideEffects.empty();
|
|
196
|
+
|
|
197
|
+
return new PrivateKernelResetCircuitPrivateInputs(
|
|
198
|
+
previousKernelData,
|
|
199
|
+
paddedSideEffects,
|
|
200
|
+
new PrivateKernelResetHints(
|
|
201
|
+
noteHashReadRequestHints,
|
|
202
|
+
nullifierReadRequestHints,
|
|
203
|
+
keyValidationHints,
|
|
205
204
|
this.transientDataSquashingHints,
|
|
206
205
|
),
|
|
207
206
|
dimensions,
|
|
@@ -235,24 +234,17 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
235
234
|
resetActions.pendingReadHints = resetActions.pendingReadHints.slice(0, maxPending);
|
|
236
235
|
}
|
|
237
236
|
|
|
238
|
-
private needsResetNoteHashReadRequests(
|
|
237
|
+
private needsResetNoteHashReadRequests(forceReset = false) {
|
|
239
238
|
const numCurr = this.previousKernel.validationRequests.noteHashReadRequests.claimedLength;
|
|
240
239
|
const numNext = this.nextIteration ? this.nextIteration.noteHashReadRequests.claimedLength : 0;
|
|
241
|
-
const maxAmountToKeep = !this.nextIteration ||
|
|
240
|
+
const maxAmountToKeep = !this.nextIteration || forceReset ? 0 : MAX_NOTE_HASH_READ_REQUESTS_PER_TX;
|
|
242
241
|
if (numCurr + numNext <= maxAmountToKeep) {
|
|
243
242
|
return false;
|
|
244
243
|
}
|
|
245
244
|
|
|
246
|
-
const futureNoteHashes = collectNested(this.executionStack, executionResult => {
|
|
247
|
-
return executionResult.publicInputs.noteHashes
|
|
248
|
-
.getActiveItems()
|
|
249
|
-
.map(noteHash => new ScopedNoteHash(noteHash, executionResult.publicInputs.callContext.contractAddress));
|
|
250
|
-
});
|
|
251
|
-
|
|
252
245
|
const resetActions = getNoteHashReadRequestResetActions(
|
|
253
246
|
this.previousKernel.validationRequests.noteHashReadRequests,
|
|
254
247
|
this.previousKernel.end.noteHashes,
|
|
255
|
-
futureNoteHashes,
|
|
256
248
|
);
|
|
257
249
|
|
|
258
250
|
const numPendingReads = resetActions.pendingReadHints.length;
|
|
@@ -261,53 +253,72 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
261
253
|
0,
|
|
262
254
|
);
|
|
263
255
|
|
|
256
|
+
const totalReadsToReset = numPendingReads + numSettledReads;
|
|
257
|
+
const minResetNeeded = numCurr + numNext - maxAmountToKeep;
|
|
258
|
+
if (totalReadsToReset < minResetNeeded) {
|
|
259
|
+
if (!this.nextIteration) {
|
|
260
|
+
// In the final reset, all note hashes have been emitted. So if we can't reset all requests, at least one
|
|
261
|
+
// pending read request doesn't match any of them.
|
|
262
|
+
throw new Error('No matching note hash found for note hash read request.');
|
|
263
|
+
} else if (!forceReset) {
|
|
264
|
+
// A pending read request can only be reset if its note hash has already been included (e.g. a parent call might
|
|
265
|
+
// be reading a note hash emitted by a child call. The read request of the parent call is included before the note
|
|
266
|
+
// hash of the child call).
|
|
267
|
+
// If we can't clear enough read requests to make room for the next iteration's reads, we're stuck.
|
|
268
|
+
throw new Error('Number of note hash read requests exceeds the limit.');
|
|
269
|
+
} else if (totalReadsToReset == 0) {
|
|
270
|
+
// It's transient data squashing asking for the read requests to be reset first (forceReset == true), and
|
|
271
|
+
// there's nothing to reset, returns false and let needsResetTransientData throw a more descriptive error.
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
// Otherwise, forceReset is true, we should proceed to reset as many as we can.
|
|
275
|
+
}
|
|
276
|
+
|
|
264
277
|
if (!this.nextIteration) {
|
|
278
|
+
// If there's no next iteration, we need to reset all the read requests.
|
|
265
279
|
this.noteHashResetActions = resetActions;
|
|
266
280
|
this.requestedDimensions.NOTE_HASH_PENDING_READ = numPendingReads;
|
|
267
281
|
this.requestedDimensions.NOTE_HASH_SETTLED_READ = numSettledReads;
|
|
268
282
|
} else {
|
|
269
|
-
//
|
|
283
|
+
// If there's a next iteration, only one dimension can be reset at a time.
|
|
284
|
+
// So we pick the dimension that has more read requests to reset.
|
|
270
285
|
if (numPendingReads > numSettledReads) {
|
|
271
|
-
|
|
272
|
-
|
|
286
|
+
// Reset the pending read requests.
|
|
287
|
+
const pendingOnlyActions = assertLength(
|
|
273
288
|
resetActions.actions.map(action =>
|
|
274
289
|
action === ReadRequestActionEnum.READ_AS_PENDING ? action : ReadRequestActionEnum.SKIP,
|
|
275
290
|
),
|
|
276
291
|
MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
277
292
|
);
|
|
278
|
-
this.noteHashResetActions
|
|
293
|
+
this.noteHashResetActions = new ReadRequestResetActions(pendingOnlyActions, resetActions.pendingReadHints);
|
|
294
|
+
this.requestedDimensions.NOTE_HASH_PENDING_READ = numPendingReads;
|
|
279
295
|
} else {
|
|
280
|
-
|
|
281
|
-
|
|
296
|
+
// Reset the settled read requests.
|
|
297
|
+
const settledOnlyActions = assertLength(
|
|
282
298
|
resetActions.actions.map(action =>
|
|
283
299
|
action === ReadRequestActionEnum.READ_AS_SETTLED ? action : ReadRequestActionEnum.SKIP,
|
|
284
300
|
),
|
|
285
301
|
MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
286
302
|
);
|
|
303
|
+
this.noteHashResetActions = new ReadRequestResetActions(settledOnlyActions, []);
|
|
304
|
+
this.requestedDimensions.NOTE_HASH_SETTLED_READ = numSettledReads;
|
|
287
305
|
}
|
|
288
306
|
}
|
|
289
307
|
|
|
290
308
|
return true;
|
|
291
309
|
}
|
|
292
310
|
|
|
293
|
-
private needsResetNullifierReadRequests(
|
|
311
|
+
private needsResetNullifierReadRequests(forceReset = false) {
|
|
294
312
|
const numCurr = this.previousKernel.validationRequests.nullifierReadRequests.claimedLength;
|
|
295
313
|
const numNext = this.nextIteration ? this.nextIteration.nullifierReadRequests.claimedLength : 0;
|
|
296
|
-
const maxAmountToKeep = !this.nextIteration ||
|
|
314
|
+
const maxAmountToKeep = !this.nextIteration || forceReset ? 0 : MAX_NULLIFIER_READ_REQUESTS_PER_TX;
|
|
297
315
|
if (numCurr + numNext <= maxAmountToKeep) {
|
|
298
316
|
return false;
|
|
299
317
|
}
|
|
300
318
|
|
|
301
|
-
const futureNullifiers = collectNested(this.executionStack, executionResult => {
|
|
302
|
-
return executionResult.publicInputs.nullifiers
|
|
303
|
-
.getActiveItems()
|
|
304
|
-
.map(nullifier => new ScopedNullifier(nullifier, executionResult.publicInputs.callContext.contractAddress));
|
|
305
|
-
});
|
|
306
|
-
|
|
307
319
|
const resetActions = getNullifierReadRequestResetActions(
|
|
308
320
|
this.previousKernel.validationRequests.nullifierReadRequests,
|
|
309
321
|
this.previousKernel.end.nullifiers,
|
|
310
|
-
futureNullifiers,
|
|
311
322
|
);
|
|
312
323
|
|
|
313
324
|
const numPendingReads = resetActions.pendingReadHints.length;
|
|
@@ -316,38 +327,63 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
316
327
|
0,
|
|
317
328
|
);
|
|
318
329
|
|
|
330
|
+
const totalReadsToReset = numPendingReads + numSettledReads;
|
|
331
|
+
const minResetNeeded = numCurr + numNext - maxAmountToKeep;
|
|
332
|
+
if (totalReadsToReset < minResetNeeded) {
|
|
333
|
+
if (!this.nextIteration) {
|
|
334
|
+
// In the final reset, all nullifiers have been emitted. So if we can't reset all requests, at least one pending
|
|
335
|
+
// read request doesn't match any of them.
|
|
336
|
+
throw new Error('No matching nullifier found for nullifier read request.');
|
|
337
|
+
} else if (!forceReset) {
|
|
338
|
+
// A pending read request can only be reset if its nullifier has already been included (e.g. a parent call might
|
|
339
|
+
// be reading a nullifier emitted by a child call. The read request of the parent call is included before the
|
|
340
|
+
// nullifier of the child call).
|
|
341
|
+
// If we can't clear enough read requests to make room for the next iteration's reads, we're stuck.
|
|
342
|
+
throw new Error('Number of nullifier read requests exceeds the limit.');
|
|
343
|
+
} else if (totalReadsToReset == 0) {
|
|
344
|
+
// It's transient data squashing asking for the read requests to be reset first (forceReset == true), and
|
|
345
|
+
// there's nothing to reset, returns false and let needsResetTransientData throw a more descriptive error.
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
// Otherwise, forceReset is true, we should proceed to reset as many as we can.
|
|
349
|
+
}
|
|
350
|
+
|
|
319
351
|
if (!this.nextIteration) {
|
|
352
|
+
// If there's no next iteration, we need to reset all the read requests.
|
|
320
353
|
this.nullifierResetActions = resetActions;
|
|
321
354
|
this.requestedDimensions.NULLIFIER_PENDING_READ = numPendingReads;
|
|
322
355
|
this.requestedDimensions.NULLIFIER_SETTLED_READ = numSettledReads;
|
|
323
356
|
} else {
|
|
324
|
-
//
|
|
357
|
+
// If there's a next iteration, we can only reset one dimension at a time.
|
|
325
358
|
if (numPendingReads > numSettledReads) {
|
|
326
|
-
|
|
327
|
-
|
|
359
|
+
// Reset the pending read requests.
|
|
360
|
+
const pendingOnlyActions = assertLength(
|
|
328
361
|
resetActions.actions.map(action =>
|
|
329
362
|
action === ReadRequestActionEnum.READ_AS_PENDING ? action : ReadRequestActionEnum.SKIP,
|
|
330
363
|
),
|
|
331
364
|
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
332
365
|
);
|
|
333
|
-
this.nullifierResetActions
|
|
366
|
+
this.nullifierResetActions = new ReadRequestResetActions(pendingOnlyActions, resetActions.pendingReadHints);
|
|
367
|
+
this.requestedDimensions.NULLIFIER_PENDING_READ = numPendingReads;
|
|
334
368
|
} else {
|
|
335
|
-
|
|
336
|
-
|
|
369
|
+
// Reset the settled read requests.
|
|
370
|
+
const settledOnlyActions = assertLength(
|
|
337
371
|
resetActions.actions.map(action =>
|
|
338
372
|
action === ReadRequestActionEnum.READ_AS_SETTLED ? action : ReadRequestActionEnum.SKIP,
|
|
339
373
|
),
|
|
340
374
|
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
341
375
|
);
|
|
376
|
+
this.nullifierResetActions = new ReadRequestResetActions(settledOnlyActions, []);
|
|
377
|
+
this.requestedDimensions.NULLIFIER_SETTLED_READ = numSettledReads;
|
|
342
378
|
}
|
|
343
379
|
}
|
|
344
380
|
|
|
345
381
|
return true;
|
|
346
382
|
}
|
|
347
383
|
|
|
348
|
-
private
|
|
349
|
-
const numCurr = this.previousKernel.validationRequests.
|
|
350
|
-
const numNext = this.nextIteration ? this.nextIteration.
|
|
384
|
+
private needsResetKeyValidationRequests() {
|
|
385
|
+
const numCurr = this.previousKernel.validationRequests.scopedKeyValidationRequestsAndSeparators.claimedLength;
|
|
386
|
+
const numNext = this.nextIteration ? this.nextIteration.keyValidationRequestsAndSeparators.claimedLength : 0;
|
|
351
387
|
const maxAmountToKeep = !this.nextIteration ? 0 : MAX_KEY_VALIDATION_REQUESTS_PER_TX;
|
|
352
388
|
if (numCurr + numNext <= maxAmountToKeep) {
|
|
353
389
|
return false;
|
|
@@ -359,9 +395,6 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
359
395
|
}
|
|
360
396
|
|
|
361
397
|
private needsResetTransientData() {
|
|
362
|
-
// Initialize this to 0 so that needsSilo can be run.
|
|
363
|
-
this.numTransientData = 0;
|
|
364
|
-
|
|
365
398
|
const nextAccumNoteHashes =
|
|
366
399
|
this.previousKernel.end.noteHashes.claimedLength + (this.nextIteration?.noteHashes.claimedLength ?? 0);
|
|
367
400
|
const noteHashWillOverflow = nextAccumNoteHashes > MAX_NOTE_HASHES_PER_TX;
|
|
@@ -376,19 +409,19 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
376
409
|
return false;
|
|
377
410
|
}
|
|
378
411
|
|
|
379
|
-
const futureNoteHashReads =
|
|
380
|
-
|
|
381
|
-
|
|
412
|
+
const futureNoteHashReads = collectNested(this.executionStack, executionResult =>
|
|
413
|
+
executionResult.publicInputs.noteHashReadRequests.getActiveItems(),
|
|
414
|
+
);
|
|
415
|
+
const futureNullifierReads = collectNested(this.executionStack, executionResult =>
|
|
416
|
+
executionResult.publicInputs.nullifierReadRequests.getActiveItems(),
|
|
382
417
|
);
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
executionResult => executionResult.publicInputs.nullifierReadRequests,
|
|
418
|
+
const futureLogs = collectNested(this.executionStack, executionResult =>
|
|
419
|
+
executionResult.publicInputs.privateLogs.getActiveItems(),
|
|
386
420
|
);
|
|
387
|
-
// TODO(#15902): Collect future logs and only allow squashing a note hash when all its logs have been emitted
|
|
388
|
-
// (i.e. none of the future logs are linked to the to-be-squashed note hashes).
|
|
389
421
|
if (this.nextIteration) {
|
|
390
|
-
// If it's not the final reset, only one dimension will be reset at a time.
|
|
391
|
-
//
|
|
422
|
+
// If it's not the final reset, only one dimension will be reset at a time. Since we are resetting the transient
|
|
423
|
+
// data, the note hash and nullifier read requests in the previous kernel won't be squashed and need to be
|
|
424
|
+
// included in the future read requests.
|
|
392
425
|
futureNoteHashReads.push(...this.previousKernel.validationRequests.noteHashReadRequests.getActiveItems());
|
|
393
426
|
futureNullifierReads.push(...this.previousKernel.validationRequests.nullifierReadRequests.getActiveItems());
|
|
394
427
|
}
|
|
@@ -398,27 +431,50 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
398
431
|
this.previousKernel.end.nullifiers,
|
|
399
432
|
futureNoteHashReads,
|
|
400
433
|
futureNullifierReads,
|
|
434
|
+
futureLogs,
|
|
401
435
|
this.noteHashNullifierCounterMap,
|
|
402
436
|
this.splitCounter,
|
|
403
437
|
);
|
|
404
438
|
|
|
405
|
-
if (this.nextIteration
|
|
406
|
-
const
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
439
|
+
if (this.nextIteration) {
|
|
440
|
+
const noteHashOverflowBy = noteHashWillOverflow
|
|
441
|
+
? nextAccumNoteHashes - MAX_NOTE_HASHES_PER_TX - numTransientData
|
|
442
|
+
: 0;
|
|
443
|
+
const nullifierOverflowBy = nullifierWillOverflow
|
|
444
|
+
? nextAccumNullifiers - MAX_NULLIFIERS_PER_TX - numTransientData
|
|
445
|
+
: 0;
|
|
446
|
+
const numSquashedLogs = logsWillOverflow
|
|
447
|
+
? countSquashedLogs(
|
|
448
|
+
this.previousKernel.end.noteHashes,
|
|
449
|
+
this.previousKernel.end.privateLogs,
|
|
450
|
+
transientDataSquashingHints.slice(0, numTransientData),
|
|
451
|
+
)
|
|
452
|
+
: 0;
|
|
453
|
+
const logsOverflowBy = logsWillOverflow ? nextAccumLogs - MAX_PRIVATE_LOGS_PER_TX - numSquashedLogs : 0;
|
|
454
|
+
|
|
455
|
+
if (noteHashOverflowBy > 0 || nullifierOverflowBy > 0 || logsOverflowBy > 0) {
|
|
456
|
+
// There's not enough transient data to squash to clear space for the overflow. It may be because some data is
|
|
457
|
+
// still required for read requests. Force a reset of the read requests first, and return to transient data
|
|
458
|
+
// squashing in the next round of reset.
|
|
459
|
+
// Note that clearing the read requests might not be enough to clear more space for the overflow. In this case,
|
|
460
|
+
// running the next reset will fail at the following check.
|
|
461
|
+
// Only one dimension can be reset at a time for an inner reset, so we try the note hash read requests first
|
|
462
|
+
// (which also helps with log overflow), then fall back to nullifier read requests.
|
|
463
|
+
const forceReset = true;
|
|
464
|
+
if ((noteHashOverflowBy > 0 || logsOverflowBy > 0) && this.needsResetNoteHashReadRequests(forceReset)) {
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
if (nullifierOverflowBy > 0 && this.needsResetNullifierReadRequests(forceReset)) {
|
|
468
|
+
return true;
|
|
469
|
+
}
|
|
470
|
+
if (noteHashWillOverflow) {
|
|
471
|
+
throw new Error('Number of note hashes exceeds the limit.');
|
|
472
|
+
}
|
|
473
|
+
if (nullifierWillOverflow) {
|
|
474
|
+
throw new Error('Number of nullifiers exceeds the limit.');
|
|
475
|
+
}
|
|
476
|
+
throw new Error('Number of private logs exceeds the limit.');
|
|
418
477
|
}
|
|
419
|
-
// Clearing the read requests might not be enough to squash the overflown data.
|
|
420
|
-
// In this case, the next iteration will fail at the above check.
|
|
421
|
-
return true;
|
|
422
478
|
}
|
|
423
479
|
|
|
424
480
|
this.numTransientData = numTransientData;
|
|
@@ -433,10 +489,13 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
433
489
|
throw new Error('`needsResetTransientData` must be run before `needsSiloNoteHashes`.');
|
|
434
490
|
}
|
|
435
491
|
|
|
436
|
-
const
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
492
|
+
const noteHashes = this.previousKernel.end.noteHashes;
|
|
493
|
+
if (noteHashes.claimedLength > 0 && noteHashes.array[0].contractAddress.isZero()) {
|
|
494
|
+
// Already siloed.
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const numToSilo = noteHashes.claimedLength - this.numTransientData;
|
|
440
499
|
this.requestedDimensions.NOTE_HASH_SILOING = numToSilo;
|
|
441
500
|
|
|
442
501
|
return numToSilo > 0;
|
|
@@ -447,15 +506,14 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
447
506
|
throw new Error('`needsResetTransientData` must be run before `needsSiloNullifiers`.');
|
|
448
507
|
}
|
|
449
508
|
|
|
450
|
-
const
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
this.requestedDimensions.NULLIFIER_SILOING = cappedSize;
|
|
509
|
+
const nullifiers = this.previousKernel.end.nullifiers;
|
|
510
|
+
if (nullifiers.claimedLength > 0 && nullifiers.array[0].contractAddress.isZero()) {
|
|
511
|
+
// Already siloed.
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
const numToSilo = nullifiers.claimedLength - this.numTransientData;
|
|
516
|
+
this.requestedDimensions.NULLIFIER_SILOING = numToSilo;
|
|
459
517
|
|
|
460
518
|
return numToSilo > 0;
|
|
461
519
|
}
|
|
@@ -466,17 +524,17 @@ export class PrivateKernelResetPrivateInputsBuilder {
|
|
|
466
524
|
}
|
|
467
525
|
|
|
468
526
|
const privateLogs = this.previousKernel.end.privateLogs;
|
|
469
|
-
|
|
527
|
+
if (privateLogs.claimedLength > 0 && privateLogs.array[0].contractAddress.isZero()) {
|
|
528
|
+
// Already siloed.
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
470
531
|
|
|
471
|
-
const
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
.
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
.filter(l => squashedNoteHashCounters.includes(l.inner.noteHashCounter)).length;
|
|
478
|
-
|
|
479
|
-
const numToSilo = numLogs - numSquashedLogs;
|
|
532
|
+
const numSquashedLogs = countSquashedLogs(
|
|
533
|
+
this.previousKernel.end.noteHashes,
|
|
534
|
+
privateLogs,
|
|
535
|
+
this.transientDataSquashingHints.slice(0, this.numTransientData),
|
|
536
|
+
);
|
|
537
|
+
const numToSilo = privateLogs.claimedLength - numSquashedLogs;
|
|
480
538
|
this.requestedDimensions.PRIVATE_LOG_SILOING = numToSilo;
|
|
481
539
|
|
|
482
540
|
return numToSilo > 0;
|