@aztec/pxe 0.0.1-commit.c7c42ec → 0.0.1-commit.cd76b27
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 +197 -79
- 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/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 +92 -53
- 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 +132 -108
- 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 +3 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +2 -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 +3 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +2 -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 +28 -30
- 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 +28 -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} +16 -10
- 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 +12 -13
- package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +90 -2
- package/dest/pxe.d.ts +76 -58
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +135 -125
- 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 +1 -1
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +27 -18
- 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 +15 -8
- 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 +19 -9
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +253 -101
- 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 +3 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -10
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
- 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 +12 -12
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
- 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 +5 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
- 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 +5 -2
- 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 +10 -5
- 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 +351 -137
- package/src/contract_function_simulator/execution_note_cache.ts +44 -25
- 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 +129 -132
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +197 -115
- 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 +2 -0
- package/src/entrypoints/client/bundle/utils.ts +23 -16
- package/src/entrypoints/client/lazy/index.ts +2 -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 +40 -34
- 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} +39 -28
- package/src/private_kernel/private_kernel_execution_prover.ts +15 -14
- package/src/private_kernel/private_kernel_oracle.ts +116 -36
- package/src/pxe.ts +266 -189
- 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 +26 -15
- 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 +106 -20
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +294 -109
- package/src/tagging/constants.ts +10 -0
- package/src/tagging/get_all_logs_by_tags.ts +92 -0
- package/src/tagging/index.ts +2 -11
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +25 -11
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
- 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 +16 -4
- 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
|
@@ -2,22 +2,25 @@ import {
|
|
|
2
2
|
AVM_EMITNOTEHASH_BASE_L2_GAS,
|
|
3
3
|
AVM_EMITNULLIFIER_BASE_L2_GAS,
|
|
4
4
|
AVM_SENDL2TOL1MSG_BASE_L2_GAS,
|
|
5
|
-
|
|
6
|
-
DA_GAS_PER_BYTE,
|
|
5
|
+
DA_GAS_PER_FIELD,
|
|
7
6
|
FIXED_AVM_STARTUP_L2_GAS,
|
|
8
7
|
FIXED_DA_GAS,
|
|
9
8
|
FIXED_L2_GAS,
|
|
10
9
|
L2_GAS_PER_CONTRACT_CLASS_LOG,
|
|
10
|
+
L2_GAS_PER_L2_TO_L1_MSG,
|
|
11
|
+
L2_GAS_PER_NOTE_HASH,
|
|
12
|
+
L2_GAS_PER_NULLIFIER,
|
|
11
13
|
L2_GAS_PER_PRIVATE_LOG,
|
|
12
14
|
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
13
15
|
MAX_ENQUEUED_CALLS_PER_TX,
|
|
14
16
|
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
15
17
|
MAX_NOTE_HASHES_PER_TX,
|
|
18
|
+
MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
16
19
|
MAX_NULLIFIERS_PER_TX,
|
|
20
|
+
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
17
21
|
MAX_PRIVATE_LOGS_PER_TX,
|
|
18
22
|
} from '@aztec/constants';
|
|
19
23
|
import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
|
|
20
|
-
import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
|
|
21
24
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
22
25
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
23
26
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -37,25 +40,36 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
|
|
|
37
40
|
import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
|
|
38
41
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
39
42
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
43
|
+
import type { BlockParameter } from '@aztec/stdlib/block';
|
|
40
44
|
import { Gas } from '@aztec/stdlib/gas';
|
|
41
45
|
import {
|
|
42
46
|
computeNoteHashNonce,
|
|
43
47
|
computeProtocolNullifier,
|
|
48
|
+
computeSiloedPrivateLogFirstField,
|
|
44
49
|
computeUniqueNoteHash,
|
|
45
50
|
siloNoteHash,
|
|
46
51
|
siloNullifier,
|
|
47
52
|
} from '@aztec/stdlib/hash';
|
|
48
53
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
49
54
|
import {
|
|
55
|
+
ClaimedLengthArray,
|
|
50
56
|
PartialPrivateTailPublicInputsForPublic,
|
|
51
57
|
PartialPrivateTailPublicInputsForRollup,
|
|
52
58
|
type PrivateExecutionStep,
|
|
53
59
|
type PrivateKernelExecutionProofOutput,
|
|
54
60
|
PrivateKernelTailCircuitPublicInputs,
|
|
61
|
+
PrivateLogData,
|
|
55
62
|
PrivateToPublicAccumulatedData,
|
|
56
63
|
PrivateToRollupAccumulatedData,
|
|
57
64
|
PublicCallRequest,
|
|
65
|
+
ReadRequestActionEnum,
|
|
58
66
|
ScopedLogHash,
|
|
67
|
+
ScopedNoteHash,
|
|
68
|
+
ScopedNullifier,
|
|
69
|
+
ScopedReadRequest,
|
|
70
|
+
buildTransientDataHints,
|
|
71
|
+
getNoteHashReadRequestResetActions,
|
|
72
|
+
getNullifierReadRequestResetActions,
|
|
59
73
|
} from '@aztec/stdlib/kernel';
|
|
60
74
|
import { PrivateLog } from '@aztec/stdlib/logs';
|
|
61
75
|
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
@@ -68,11 +82,13 @@ import {
|
|
|
68
82
|
TxConstantData,
|
|
69
83
|
TxExecutionRequest,
|
|
70
84
|
collectNested,
|
|
85
|
+
collectNoteHashNullifierCounterMap,
|
|
71
86
|
getFinalMinRevertibleSideEffectCounter,
|
|
72
87
|
} from '@aztec/stdlib/tx';
|
|
73
88
|
|
|
89
|
+
import type { AccessScopes } from '../access_scopes.js';
|
|
90
|
+
import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
|
|
74
91
|
import type { AddressStore } from '../storage/address_store/address_store.js';
|
|
75
|
-
import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
|
|
76
92
|
import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
|
|
77
93
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
78
94
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
@@ -80,64 +96,101 @@ import type { PrivateEventStore } from '../storage/private_event_store/private_e
|
|
|
80
96
|
import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js';
|
|
81
97
|
import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js';
|
|
82
98
|
import type { SenderTaggingStore } from '../storage/tagging_store/sender_tagging_store.js';
|
|
99
|
+
import type { BenchmarkedNode } from './benchmarked_node.js';
|
|
83
100
|
import { ExecutionNoteCache } from './execution_note_cache.js';
|
|
84
101
|
import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
|
|
85
102
|
import { HashedValuesCache } from './hashed_values_cache.js';
|
|
86
103
|
import { Oracle } from './oracle/oracle.js';
|
|
87
|
-
import { executePrivateFunction
|
|
104
|
+
import { executePrivateFunction } from './oracle/private_execution.js';
|
|
88
105
|
import { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
|
|
89
106
|
import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
90
|
-
|
|
107
|
+
|
|
108
|
+
/** Options for ContractFunctionSimulator.run. */
|
|
109
|
+
export type ContractSimulatorRunOpts = {
|
|
110
|
+
/** The address of the contract (should match request.origin). */
|
|
111
|
+
contractAddress: AztecAddress;
|
|
112
|
+
/** The function selector of the entry point. */
|
|
113
|
+
selector: FunctionSelector;
|
|
114
|
+
/** The address calling the function. Can be replaced to simulate a call from another contract or account. */
|
|
115
|
+
msgSender?: AztecAddress;
|
|
116
|
+
/** The block header to use as base state for this run. */
|
|
117
|
+
anchorBlockHeader: BlockHeader;
|
|
118
|
+
/** The address used as a tagging sender when emitting private logs. */
|
|
119
|
+
senderForTags?: AztecAddress;
|
|
120
|
+
/** The accounts whose notes we can access in this call. */
|
|
121
|
+
scopes: AccessScopes;
|
|
122
|
+
/** The job ID for staged writes. */
|
|
123
|
+
jobId: string;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/** Args for ContractFunctionSimulator constructor. */
|
|
127
|
+
export type ContractFunctionSimulatorArgs = {
|
|
128
|
+
contractStore: ContractStore;
|
|
129
|
+
noteStore: NoteStore;
|
|
130
|
+
keyStore: KeyStore;
|
|
131
|
+
addressStore: AddressStore;
|
|
132
|
+
aztecNode: AztecNode;
|
|
133
|
+
senderTaggingStore: SenderTaggingStore;
|
|
134
|
+
recipientTaggingStore: RecipientTaggingStore;
|
|
135
|
+
senderAddressBookStore: SenderAddressBookStore;
|
|
136
|
+
capsuleStore: CapsuleStore;
|
|
137
|
+
privateEventStore: PrivateEventStore;
|
|
138
|
+
simulator: CircuitSimulator;
|
|
139
|
+
contractSyncService: ContractSyncService;
|
|
140
|
+
};
|
|
91
141
|
|
|
92
142
|
/**
|
|
93
143
|
* The contract function simulator.
|
|
94
144
|
*/
|
|
95
145
|
export class ContractFunctionSimulator {
|
|
96
|
-
private log: Logger;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
146
|
+
private readonly log: Logger;
|
|
147
|
+
private readonly contractStore: ContractStore;
|
|
148
|
+
private readonly noteStore: NoteStore;
|
|
149
|
+
private readonly keyStore: KeyStore;
|
|
150
|
+
private readonly addressStore: AddressStore;
|
|
151
|
+
private readonly aztecNode: AztecNode;
|
|
152
|
+
private readonly senderTaggingStore: SenderTaggingStore;
|
|
153
|
+
private readonly recipientTaggingStore: RecipientTaggingStore;
|
|
154
|
+
private readonly senderAddressBookStore: SenderAddressBookStore;
|
|
155
|
+
private readonly capsuleStore: CapsuleStore;
|
|
156
|
+
private readonly privateEventStore: PrivateEventStore;
|
|
157
|
+
private readonly simulator: CircuitSimulator;
|
|
158
|
+
private readonly contractSyncService: ContractSyncService;
|
|
159
|
+
|
|
160
|
+
constructor(args: ContractFunctionSimulatorArgs) {
|
|
161
|
+
this.contractStore = args.contractStore;
|
|
162
|
+
this.noteStore = args.noteStore;
|
|
163
|
+
this.keyStore = args.keyStore;
|
|
164
|
+
this.addressStore = args.addressStore;
|
|
165
|
+
this.aztecNode = args.aztecNode;
|
|
166
|
+
this.senderTaggingStore = args.senderTaggingStore;
|
|
167
|
+
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
168
|
+
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
169
|
+
this.capsuleStore = args.capsuleStore;
|
|
170
|
+
this.privateEventStore = args.privateEventStore;
|
|
171
|
+
this.simulator = args.simulator;
|
|
172
|
+
this.contractSyncService = args.contractSyncService;
|
|
112
173
|
this.log = createLogger('simulator');
|
|
113
174
|
}
|
|
114
175
|
|
|
115
176
|
/**
|
|
116
177
|
* Runs a private function.
|
|
117
178
|
* @param request - The transaction request.
|
|
118
|
-
* @param entryPointArtifact - The artifact of the entry point function.
|
|
119
|
-
* @param contractAddress - The address of the contract (should match request.origin)
|
|
120
|
-
* @param msgSender - The address calling the function. This can be replaced to simulate a call from another contract
|
|
121
|
-
* or a specific account.
|
|
122
|
-
* @param anchorBlockHeader - The block header to use as base state for this run.
|
|
123
|
-
* @param senderForTags - The address that is used as a tagging sender when emitting private logs. Returned from
|
|
124
|
-
* the `privateGetSenderForTags` oracle.
|
|
125
|
-
* @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
126
|
-
* @returns The result of the execution.
|
|
127
179
|
*/
|
|
128
180
|
public async run(
|
|
129
181
|
request: TxExecutionRequest,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
182
|
+
{
|
|
183
|
+
contractAddress,
|
|
184
|
+
selector,
|
|
185
|
+
msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE),
|
|
186
|
+
anchorBlockHeader,
|
|
187
|
+
senderForTags,
|
|
188
|
+
scopes,
|
|
189
|
+
jobId,
|
|
190
|
+
}: ContractSimulatorRunOpts,
|
|
136
191
|
): Promise<PrivateExecutionResult> {
|
|
137
192
|
const simulatorSetupTimer = new Timer();
|
|
138
193
|
|
|
139
|
-
await verifyCurrentClassId(contractAddress, this.aztecNode, this.contractStore, anchorBlockHeader);
|
|
140
|
-
|
|
141
194
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(contractAddress, selector);
|
|
142
195
|
|
|
143
196
|
if (entryPointArtifact.functionType !== FunctionType.PRIVATE) {
|
|
@@ -164,34 +217,37 @@ export class ContractFunctionSimulator {
|
|
|
164
217
|
const noteCache = new ExecutionNoteCache(protocolNullifier);
|
|
165
218
|
const taggingIndexCache = new ExecutionTaggingIndexCache();
|
|
166
219
|
|
|
167
|
-
const privateExecutionOracle = new PrivateExecutionOracle(
|
|
168
|
-
request.firstCallArgsHash,
|
|
169
|
-
request.txContext,
|
|
220
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
221
|
+
argsHash: request.firstCallArgsHash,
|
|
222
|
+
txContext: request.txContext,
|
|
170
223
|
callContext,
|
|
171
224
|
anchorBlockHeader,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
225
|
+
utilityExecutor: async (call, execScopes) => {
|
|
226
|
+
await this.runUtility(call, [], anchorBlockHeader, execScopes, jobId);
|
|
227
|
+
},
|
|
228
|
+
authWitnesses: request.authWitnesses,
|
|
229
|
+
capsules: request.capsules,
|
|
230
|
+
executionCache: HashedValuesCache.create(request.argsOfCalls),
|
|
175
231
|
noteCache,
|
|
176
232
|
taggingIndexCache,
|
|
177
|
-
this.contractStore,
|
|
178
|
-
this.noteStore,
|
|
179
|
-
this.keyStore,
|
|
180
|
-
this.addressStore,
|
|
181
|
-
this.aztecNode,
|
|
182
|
-
this.
|
|
183
|
-
this.
|
|
184
|
-
this.
|
|
185
|
-
this.
|
|
186
|
-
this.
|
|
187
|
-
this.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
233
|
+
contractStore: this.contractStore,
|
|
234
|
+
noteStore: this.noteStore,
|
|
235
|
+
keyStore: this.keyStore,
|
|
236
|
+
addressStore: this.addressStore,
|
|
237
|
+
aztecNode: this.aztecNode,
|
|
238
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
239
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
240
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
241
|
+
capsuleStore: this.capsuleStore,
|
|
242
|
+
privateEventStore: this.privateEventStore,
|
|
243
|
+
contractSyncService: this.contractSyncService,
|
|
244
|
+
jobId,
|
|
245
|
+
totalPublicCalldataCount: 0,
|
|
246
|
+
sideEffectCounter: startSideEffectCounter,
|
|
191
247
|
scopes,
|
|
192
248
|
senderForTags,
|
|
193
|
-
this.simulator,
|
|
194
|
-
);
|
|
249
|
+
simulator: this.simulator,
|
|
250
|
+
});
|
|
195
251
|
|
|
196
252
|
const setupTime = simulatorSetupTimer.ms();
|
|
197
253
|
|
|
@@ -208,8 +264,9 @@ export class ContractFunctionSimulator {
|
|
|
208
264
|
request.functionSelector,
|
|
209
265
|
);
|
|
210
266
|
const simulatorTeardownTimer = new Timer();
|
|
211
|
-
|
|
212
|
-
|
|
267
|
+
|
|
268
|
+
noteCache.finish();
|
|
269
|
+
const firstNullifierHint = noteCache.getNonceGenerator();
|
|
213
270
|
|
|
214
271
|
const publicCallRequests = collectNested([executionResult], r =>
|
|
215
272
|
r.publicInputs.publicCallRequests
|
|
@@ -254,34 +311,32 @@ export class ContractFunctionSimulator {
|
|
|
254
311
|
call: FunctionCall,
|
|
255
312
|
authwits: AuthWitness[],
|
|
256
313
|
anchorBlockHeader: BlockHeader,
|
|
257
|
-
scopes
|
|
314
|
+
scopes: AccessScopes,
|
|
315
|
+
jobId: string,
|
|
258
316
|
): Promise<Fr[]> {
|
|
259
|
-
await verifyCurrentClassId(call.to, this.aztecNode, this.contractStore, anchorBlockHeader);
|
|
260
|
-
|
|
261
317
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
262
318
|
|
|
263
319
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
264
320
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
265
321
|
}
|
|
266
322
|
|
|
267
|
-
const oracle = new UtilityExecutionOracle(
|
|
268
|
-
call.to,
|
|
269
|
-
authwits,
|
|
270
|
-
[],
|
|
323
|
+
const oracle = new UtilityExecutionOracle({
|
|
324
|
+
contractAddress: call.to,
|
|
325
|
+
authWitnesses: authwits,
|
|
326
|
+
capsules: [],
|
|
271
327
|
anchorBlockHeader,
|
|
272
|
-
this.contractStore,
|
|
273
|
-
this.noteStore,
|
|
274
|
-
this.keyStore,
|
|
275
|
-
this.addressStore,
|
|
276
|
-
this.aztecNode,
|
|
277
|
-
this.
|
|
278
|
-
this.
|
|
279
|
-
this.
|
|
280
|
-
this.
|
|
281
|
-
|
|
282
|
-
undefined,
|
|
328
|
+
contractStore: this.contractStore,
|
|
329
|
+
noteStore: this.noteStore,
|
|
330
|
+
keyStore: this.keyStore,
|
|
331
|
+
addressStore: this.addressStore,
|
|
332
|
+
aztecNode: this.aztecNode,
|
|
333
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
334
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
335
|
+
capsuleStore: this.capsuleStore,
|
|
336
|
+
privateEventStore: this.privateEventStore,
|
|
337
|
+
jobId,
|
|
283
338
|
scopes,
|
|
284
|
-
);
|
|
339
|
+
});
|
|
285
340
|
|
|
286
341
|
try {
|
|
287
342
|
this.log.verbose(`Executing utility function ${entryPointArtifact.name}`, {
|
|
@@ -305,7 +360,7 @@ export class ContractFunctionSimulator {
|
|
|
305
360
|
);
|
|
306
361
|
});
|
|
307
362
|
|
|
308
|
-
this.log.verbose(`Utility
|
|
363
|
+
this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
309
364
|
return witnessMapToFields(acirExecutionResult.returnWitness);
|
|
310
365
|
} catch (err) {
|
|
311
366
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
@@ -319,7 +374,12 @@ export class ContractFunctionSimulator {
|
|
|
319
374
|
*/
|
|
320
375
|
getStats() {
|
|
321
376
|
const nodeRPCCalls =
|
|
322
|
-
typeof (this.aztecNode as
|
|
377
|
+
typeof (this.aztecNode as BenchmarkedNode).getStats === 'function'
|
|
378
|
+
? (this.aztecNode as BenchmarkedNode).getStats()
|
|
379
|
+
: {
|
|
380
|
+
perMethod: {},
|
|
381
|
+
roundTrips: { roundTrips: 0, totalBlockingTime: 0, roundTripDurations: [], roundTripMethods: [] },
|
|
382
|
+
};
|
|
323
383
|
|
|
324
384
|
return { nodeRPCCalls };
|
|
325
385
|
}
|
|
@@ -342,24 +402,33 @@ class OrderedSideEffect<T> {
|
|
|
342
402
|
* (allowing state overrides) and is much faster, while still generating a valid
|
|
343
403
|
* output that can be sent to the node for public simulation
|
|
344
404
|
* @param privateExecutionResult - The result of the private execution.
|
|
345
|
-
* @param
|
|
346
|
-
*
|
|
347
|
-
* @param
|
|
405
|
+
* @param debugFunctionNameGetter - A provider for contract data in order to get function names and debug info.
|
|
406
|
+
* @param node - AztecNode for verifying settled read requests against the note hash and nullifier trees.
|
|
407
|
+
* @param minRevertibleSideEffectCounterOverride - Optional override for the min revertible side effect counter.
|
|
408
|
+
* Used by TXE to simulate account contract behavior (setting the counter before app execution).
|
|
348
409
|
* @returns The simulated proving result.
|
|
349
410
|
*/
|
|
350
411
|
export async function generateSimulatedProvingResult(
|
|
351
412
|
privateExecutionResult: PrivateExecutionResult,
|
|
352
|
-
|
|
353
|
-
|
|
413
|
+
debugFunctionNameGetter: (contractAddress: AztecAddress, functionSelector: FunctionSelector) => Promise<string>,
|
|
414
|
+
node: AztecNode,
|
|
415
|
+
minRevertibleSideEffectCounterOverride?: number,
|
|
354
416
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
355
|
-
const
|
|
356
|
-
const nullifiers: OrderedSideEffect<Fr>[] = [];
|
|
357
|
-
const taggedPrivateLogs: OrderedSideEffect<PrivateLog>[] = [];
|
|
417
|
+
const taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[] = [];
|
|
358
418
|
const l2ToL1Messages: OrderedSideEffect<ScopedL2ToL1Message>[] = [];
|
|
359
419
|
const contractClassLogsHashes: OrderedSideEffect<ScopedLogHash>[] = [];
|
|
360
420
|
const publicCallRequests: OrderedSideEffect<PublicCallRequest>[] = [];
|
|
361
421
|
const executionSteps: PrivateExecutionStep[] = [];
|
|
362
422
|
|
|
423
|
+
// Unsiloed scoped arrays — used for squashing, read request verification,
|
|
424
|
+
// and siloed at the end only for the surviving items
|
|
425
|
+
const scopedNoteHashes: ScopedNoteHash[] = [];
|
|
426
|
+
const scopedNullifiers: ScopedNullifier[] = [];
|
|
427
|
+
|
|
428
|
+
// Read requests for verification
|
|
429
|
+
const noteHashReadRequests: ScopedReadRequest[] = [];
|
|
430
|
+
const nullifierReadRequests: ScopedReadRequest[] = [];
|
|
431
|
+
|
|
363
432
|
let publicTeardownCallRequest;
|
|
364
433
|
|
|
365
434
|
const executions = [privateExecutionResult.entrypoint];
|
|
@@ -370,35 +439,25 @@ export async function generateSimulatedProvingResult(
|
|
|
370
439
|
|
|
371
440
|
const { contractAddress } = execution.publicInputs.callContext;
|
|
372
441
|
|
|
373
|
-
|
|
374
|
-
execution.publicInputs.noteHashes
|
|
375
|
-
.getActiveItems()
|
|
376
|
-
.filter(noteHash => !noteHash.isEmpty())
|
|
377
|
-
.map(
|
|
378
|
-
async noteHash =>
|
|
379
|
-
new OrderedSideEffect(await siloNoteHash(contractAddress, noteHash.value), noteHash.counter),
|
|
380
|
-
),
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
const nullifiersFromExecution = await Promise.all(
|
|
384
|
-
execution.publicInputs.nullifiers
|
|
442
|
+
scopedNoteHashes.push(
|
|
443
|
+
...execution.publicInputs.noteHashes
|
|
385
444
|
.getActiveItems()
|
|
386
|
-
.
|
|
387
|
-
|
|
388
|
-
new OrderedSideEffect(await siloNullifier(contractAddress, nullifier.value), nullifier.counter),
|
|
389
|
-
),
|
|
445
|
+
.filter(nh => !nh.isEmpty())
|
|
446
|
+
.map(nh => nh.scope(contractAddress)),
|
|
390
447
|
);
|
|
448
|
+
scopedNullifiers.push(...execution.publicInputs.nullifiers.getActiveItems().map(n => n.scope(contractAddress)));
|
|
391
449
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
450
|
+
taggedPrivateLogs.push(
|
|
451
|
+
...(await Promise.all(
|
|
452
|
+
execution.publicInputs.privateLogs.getActiveItems().map(async metadata => {
|
|
453
|
+
metadata.log.fields[0] = await computeSiloedPrivateLogFirstField(contractAddress, metadata.log.fields[0]);
|
|
454
|
+
return new OrderedSideEffect(metadata, metadata.counter);
|
|
455
|
+
}),
|
|
456
|
+
)),
|
|
397
457
|
);
|
|
398
458
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
nullifiers.push(...nullifiersFromExecution);
|
|
459
|
+
noteHashReadRequests.push(...execution.publicInputs.noteHashReadRequests.getActiveItems());
|
|
460
|
+
nullifierReadRequests.push(...execution.publicInputs.nullifierReadRequests.getActiveItems());
|
|
402
461
|
l2ToL1Messages.push(
|
|
403
462
|
...execution.publicInputs.l2ToL1Msgs
|
|
404
463
|
.getActiveItems()
|
|
@@ -427,7 +486,7 @@ export async function generateSimulatedProvingResult(
|
|
|
427
486
|
: execution.publicInputs.publicTeardownCallRequest;
|
|
428
487
|
|
|
429
488
|
executionSteps.push({
|
|
430
|
-
functionName: await
|
|
489
|
+
functionName: await debugFunctionNameGetter(
|
|
431
490
|
execution.publicInputs.callContext.contractAddress,
|
|
432
491
|
execution.publicInputs.callContext.functionSelector,
|
|
433
492
|
),
|
|
@@ -438,6 +497,47 @@ export async function generateSimulatedProvingResult(
|
|
|
438
497
|
});
|
|
439
498
|
}
|
|
440
499
|
|
|
500
|
+
const noteHashNullifierCounterMap = collectNoteHashNullifierCounterMap(privateExecutionResult);
|
|
501
|
+
const minRevertibleSideEffectCounter =
|
|
502
|
+
minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
|
|
503
|
+
|
|
504
|
+
const scopedNoteHashesCLA = new ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>(
|
|
505
|
+
padArrayEnd(scopedNoteHashes, ScopedNoteHash.empty(), MAX_NOTE_HASHES_PER_TX),
|
|
506
|
+
scopedNoteHashes.length,
|
|
507
|
+
);
|
|
508
|
+
const scopedNullifiersCLA = new ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>(
|
|
509
|
+
padArrayEnd(scopedNullifiers, ScopedNullifier.empty(), MAX_NULLIFIERS_PER_TX),
|
|
510
|
+
scopedNullifiers.length,
|
|
511
|
+
);
|
|
512
|
+
|
|
513
|
+
const { filteredNoteHashes, filteredNullifiers, filteredPrivateLogs } = squashTransientSideEffects(
|
|
514
|
+
taggedPrivateLogs,
|
|
515
|
+
scopedNoteHashesCLA,
|
|
516
|
+
scopedNullifiersCLA,
|
|
517
|
+
noteHashNullifierCounterMap,
|
|
518
|
+
minRevertibleSideEffectCounter,
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
await verifyReadRequests(
|
|
522
|
+
node,
|
|
523
|
+
await privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.hash(),
|
|
524
|
+
noteHashReadRequests,
|
|
525
|
+
nullifierReadRequests,
|
|
526
|
+
scopedNoteHashesCLA,
|
|
527
|
+
scopedNullifiersCLA,
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
const siloedNoteHashes = await Promise.all(
|
|
531
|
+
filteredNoteHashes
|
|
532
|
+
.sort((a, b) => a.counter - b.counter)
|
|
533
|
+
.map(async nh => new OrderedSideEffect(await siloNoteHash(nh.contractAddress, nh.value), nh.counter)),
|
|
534
|
+
);
|
|
535
|
+
const siloedNullifiers = await Promise.all(
|
|
536
|
+
filteredNullifiers
|
|
537
|
+
.sort((a, b) => a.counter - b.counter)
|
|
538
|
+
.map(async n => new OrderedSideEffect(await siloNullifier(n.contractAddress, n.value), n.counter)),
|
|
539
|
+
);
|
|
540
|
+
|
|
441
541
|
const constantData = new TxConstantData(
|
|
442
542
|
privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader,
|
|
443
543
|
privateExecutionResult.entrypoint.publicInputs.txContext,
|
|
@@ -454,23 +554,23 @@ export async function generateSimulatedProvingResult(
|
|
|
454
554
|
const getEffect = <T>(orderedSideEffect: OrderedSideEffect<T>) => orderedSideEffect.sideEffect;
|
|
455
555
|
|
|
456
556
|
const isPrivateOnlyTx = privateExecutionResult.publicFunctionCalldata.length === 0;
|
|
457
|
-
const minRevertibleSideEffectCounter = getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
|
|
458
557
|
|
|
459
558
|
const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(
|
|
460
|
-
|
|
559
|
+
siloedNullifiers,
|
|
461
560
|
minRevertibleSideEffectCounter,
|
|
462
561
|
);
|
|
463
|
-
|
|
562
|
+
const nonceGenerator = privateExecutionResult.firstNullifier;
|
|
563
|
+
if (nonRevertibleNullifiers.length === 0) {
|
|
564
|
+
nonRevertibleNullifiers.push(nonceGenerator);
|
|
565
|
+
} else if (!nonRevertibleNullifiers[0].equals(nonceGenerator)) {
|
|
464
566
|
throw new Error('The first non revertible nullifier should be equal to the nonce generator. This is a bug!');
|
|
465
|
-
} else {
|
|
466
|
-
nonRevertibleNullifiers.unshift(nonceGenerator);
|
|
467
567
|
}
|
|
468
568
|
|
|
469
569
|
if (isPrivateOnlyTx) {
|
|
470
570
|
// We must make the note hashes unique by using the
|
|
471
571
|
// nonce generator and their index in the tx.
|
|
472
572
|
const uniqueNoteHashes = await Promise.all(
|
|
473
|
-
siloedNoteHashes.
|
|
573
|
+
siloedNoteHashes.map(async (orderedSideEffect, i) => {
|
|
474
574
|
const siloedNoteHash = orderedSideEffect.sideEffect;
|
|
475
575
|
const nonce = await computeNoteHashNonce(nonceGenerator, i);
|
|
476
576
|
const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
|
|
@@ -485,26 +585,32 @@ export async function generateSimulatedProvingResult(
|
|
|
485
585
|
ScopedL2ToL1Message.empty(),
|
|
486
586
|
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
487
587
|
),
|
|
488
|
-
padArrayEnd(
|
|
588
|
+
padArrayEnd(filteredPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
489
589
|
padArrayEnd(
|
|
490
590
|
contractClassLogsHashes.sort(sortByCounter).map(getEffect),
|
|
491
591
|
ScopedLogHash.empty(),
|
|
492
592
|
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
493
593
|
),
|
|
494
594
|
);
|
|
495
|
-
gasUsed = meterGasUsed(accumulatedDataForRollup);
|
|
595
|
+
gasUsed = meterGasUsed(accumulatedDataForRollup, isPrivateOnlyTx);
|
|
496
596
|
inputsForRollup = new PartialPrivateTailPublicInputsForRollup(accumulatedDataForRollup);
|
|
497
597
|
} else {
|
|
498
598
|
const [nonRevertibleNoteHashes, revertibleNoteHashes] = splitOrderedSideEffects(
|
|
499
|
-
siloedNoteHashes
|
|
599
|
+
siloedNoteHashes,
|
|
500
600
|
minRevertibleSideEffectCounter,
|
|
501
601
|
);
|
|
602
|
+
const nonRevertibleUniqueNoteHashes = await Promise.all(
|
|
603
|
+
nonRevertibleNoteHashes.map(async (noteHash, i) => {
|
|
604
|
+
const nonce = await computeNoteHashNonce(nonceGenerator, i);
|
|
605
|
+
return await computeUniqueNoteHash(nonce, noteHash);
|
|
606
|
+
}),
|
|
607
|
+
);
|
|
502
608
|
const [nonRevertibleL2ToL1Messages, revertibleL2ToL1Messages] = splitOrderedSideEffects(
|
|
503
609
|
l2ToL1Messages.sort(sortByCounter),
|
|
504
610
|
minRevertibleSideEffectCounter,
|
|
505
611
|
);
|
|
506
612
|
const [nonRevertibleTaggedPrivateLogs, revertibleTaggedPrivateLogs] = splitOrderedSideEffects(
|
|
507
|
-
|
|
613
|
+
filteredPrivateLogs,
|
|
508
614
|
minRevertibleSideEffectCounter,
|
|
509
615
|
);
|
|
510
616
|
const [nonRevertibleContractClassLogHashes, revertibleContractClassLogHashes] = splitOrderedSideEffects(
|
|
@@ -517,7 +623,7 @@ export async function generateSimulatedProvingResult(
|
|
|
517
623
|
);
|
|
518
624
|
|
|
519
625
|
const nonRevertibleData = new PrivateToPublicAccumulatedData(
|
|
520
|
-
padArrayEnd(
|
|
626
|
+
padArrayEnd(nonRevertibleUniqueNoteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
|
|
521
627
|
padArrayEnd(nonRevertibleNullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
|
|
522
628
|
padArrayEnd(nonRevertibleL2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX),
|
|
523
629
|
padArrayEnd(nonRevertibleTaggedPrivateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
@@ -533,9 +639,9 @@ export async function generateSimulatedProvingResult(
|
|
|
533
639
|
padArrayEnd(revertibleContractClassLogHashes, ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX),
|
|
534
640
|
padArrayEnd(revertiblePublicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX),
|
|
535
641
|
);
|
|
536
|
-
gasUsed = meterGasUsed(revertibleData).add(meterGasUsed(nonRevertibleData));
|
|
642
|
+
gasUsed = meterGasUsed(revertibleData, isPrivateOnlyTx).add(meterGasUsed(nonRevertibleData, isPrivateOnlyTx));
|
|
537
643
|
if (publicTeardownCallRequest) {
|
|
538
|
-
gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
|
|
644
|
+
gasUsed = gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
|
|
539
645
|
}
|
|
540
646
|
|
|
541
647
|
inputsForPublic = new PartialPrivateTailPublicInputsForPublic(
|
|
@@ -549,7 +655,7 @@ export async function generateSimulatedProvingResult(
|
|
|
549
655
|
constantData,
|
|
550
656
|
/*gasUsed=*/ gasUsed.add(Gas.from({ l2Gas: FIXED_L2_GAS, daGas: FIXED_DA_GAS })),
|
|
551
657
|
/*feePayer=*/ AztecAddress.zero(),
|
|
552
|
-
/*
|
|
658
|
+
/*expirationTimestamp=*/ 0n,
|
|
553
659
|
hasPublicCalls ? inputsForPublic : undefined,
|
|
554
660
|
!hasPublicCalls ? inputsForRollup : undefined,
|
|
555
661
|
);
|
|
@@ -561,11 +667,116 @@ export async function generateSimulatedProvingResult(
|
|
|
561
667
|
};
|
|
562
668
|
}
|
|
563
669
|
|
|
670
|
+
/**
|
|
671
|
+
* Squashes transient note hashes and nullifiers, mimicking the behavior
|
|
672
|
+
* of the reset kernels. Returns the filtered (surviving) scoped items and private logs.
|
|
673
|
+
*/
|
|
674
|
+
function squashTransientSideEffects(
|
|
675
|
+
taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[],
|
|
676
|
+
scopedNoteHashesCLA: ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>,
|
|
677
|
+
scopedNullifiersCLA: ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>,
|
|
678
|
+
noteHashNullifierCounterMap: Map<number, number>,
|
|
679
|
+
minRevertibleSideEffectCounter: number,
|
|
680
|
+
) {
|
|
681
|
+
const { numTransientData, hints: transientDataHints } = buildTransientDataHints(
|
|
682
|
+
scopedNoteHashesCLA,
|
|
683
|
+
scopedNullifiersCLA,
|
|
684
|
+
/*futureNoteHashReads=*/ [],
|
|
685
|
+
/*futureNullifierReads=*/ [],
|
|
686
|
+
noteHashNullifierCounterMap,
|
|
687
|
+
minRevertibleSideEffectCounter,
|
|
688
|
+
);
|
|
689
|
+
|
|
690
|
+
const squashedNoteHashCounters = new Set<number>();
|
|
691
|
+
const squashedNullifierCounters = new Set<number>();
|
|
692
|
+
for (let i = 0; i < numTransientData; i++) {
|
|
693
|
+
const hint = transientDataHints[i];
|
|
694
|
+
squashedNoteHashCounters.add(scopedNoteHashesCLA.array[hint.noteHashIndex].counter);
|
|
695
|
+
squashedNullifierCounters.add(scopedNullifiersCLA.array[hint.nullifierIndex].counter);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
return {
|
|
699
|
+
filteredNoteHashes: scopedNoteHashesCLA.getActiveItems().filter(nh => !squashedNoteHashCounters.has(nh.counter)),
|
|
700
|
+
filteredNullifiers: scopedNullifiersCLA.getActiveItems().filter(n => !squashedNullifierCounters.has(n.counter)),
|
|
701
|
+
filteredPrivateLogs: taggedPrivateLogs
|
|
702
|
+
.filter(item => !squashedNoteHashCounters.has(item.sideEffect.noteHashCounter))
|
|
703
|
+
.map(item => new OrderedSideEffect(item.sideEffect.log, item.counter)),
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Verifies settled read requests by checking membership in the note hash and nullifier trees
|
|
709
|
+
* at the tx's anchor block, mimicking the behavior of the kernels
|
|
710
|
+
*/
|
|
711
|
+
async function verifyReadRequests(
|
|
712
|
+
node: Pick<AztecNode, 'getNoteHashMembershipWitness' | 'getNullifierMembershipWitness'>,
|
|
713
|
+
anchorBlockHash: BlockParameter,
|
|
714
|
+
noteHashReadRequests: ScopedReadRequest[],
|
|
715
|
+
nullifierReadRequests: ScopedReadRequest[],
|
|
716
|
+
scopedNoteHashesCLA: ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>,
|
|
717
|
+
scopedNullifiersCLA: ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>,
|
|
718
|
+
) {
|
|
719
|
+
const noteHashReadRequestsCLA = new ClaimedLengthArray<ScopedReadRequest, typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX>(
|
|
720
|
+
padArrayEnd(noteHashReadRequests, ScopedReadRequest.empty(), MAX_NOTE_HASH_READ_REQUESTS_PER_TX),
|
|
721
|
+
noteHashReadRequests.length,
|
|
722
|
+
);
|
|
723
|
+
const nullifierReadRequestsCLA = new ClaimedLengthArray<ScopedReadRequest, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>(
|
|
724
|
+
padArrayEnd(nullifierReadRequests, ScopedReadRequest.empty(), MAX_NULLIFIER_READ_REQUESTS_PER_TX),
|
|
725
|
+
nullifierReadRequests.length,
|
|
726
|
+
);
|
|
727
|
+
|
|
728
|
+
const noteHashResetActions = getNoteHashReadRequestResetActions(
|
|
729
|
+
noteHashReadRequestsCLA,
|
|
730
|
+
scopedNoteHashesCLA,
|
|
731
|
+
/*futureNoteHashes=*/ [],
|
|
732
|
+
);
|
|
733
|
+
const nullifierResetActions = getNullifierReadRequestResetActions(
|
|
734
|
+
nullifierReadRequestsCLA,
|
|
735
|
+
scopedNullifiersCLA,
|
|
736
|
+
/*futureNullifiers=*/ [],
|
|
737
|
+
);
|
|
738
|
+
|
|
739
|
+
const settledNoteHashReads: { index: number; value: Fr }[] = [];
|
|
740
|
+
for (let i = 0; i < noteHashResetActions.actions.length; i++) {
|
|
741
|
+
if (noteHashResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
|
|
742
|
+
settledNoteHashReads.push({ index: i, value: noteHashReadRequests[i].value });
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
const settledNullifierReads: { index: number; value: Fr }[] = [];
|
|
747
|
+
for (let i = 0; i < nullifierResetActions.actions.length; i++) {
|
|
748
|
+
if (nullifierResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
|
|
749
|
+
settledNullifierReads.push({ index: i, value: nullifierReadRequests[i].value });
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
const [noteHashWitnesses, nullifierWitnesses] = await Promise.all([
|
|
754
|
+
Promise.all(settledNoteHashReads.map(({ value }) => node.getNoteHashMembershipWitness(anchorBlockHash, value))),
|
|
755
|
+
Promise.all(settledNullifierReads.map(({ value }) => node.getNullifierMembershipWitness(anchorBlockHash, value))),
|
|
756
|
+
]);
|
|
757
|
+
|
|
758
|
+
for (let i = 0; i < settledNoteHashReads.length; i++) {
|
|
759
|
+
if (!noteHashWitnesses[i]) {
|
|
760
|
+
throw new Error(
|
|
761
|
+
`Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
for (let i = 0; i < settledNullifierReads.length; i++) {
|
|
767
|
+
if (!nullifierWitnesses[i]) {
|
|
768
|
+
throw new Error(
|
|
769
|
+
`Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
564
775
|
function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertibleSideEffectCounter: number) {
|
|
565
776
|
const revertibleSideEffects: T[] = [];
|
|
566
777
|
const nonRevertibleSideEffects: T[] = [];
|
|
567
778
|
effects.forEach(effect => {
|
|
568
|
-
if (effect.counter < minRevertibleSideEffectCounter) {
|
|
779
|
+
if (minRevertibleSideEffectCounter === 0 || effect.counter < minRevertibleSideEffectCounter) {
|
|
569
780
|
nonRevertibleSideEffects.push(effect.sideEffect);
|
|
570
781
|
} else {
|
|
571
782
|
revertibleSideEffects.push(effect.sideEffect);
|
|
@@ -574,21 +785,24 @@ function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertib
|
|
|
574
785
|
return [nonRevertibleSideEffects, revertibleSideEffects];
|
|
575
786
|
}
|
|
576
787
|
|
|
577
|
-
function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData) {
|
|
788
|
+
function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData, isPrivateOnlyTx: boolean) {
|
|
578
789
|
let meteredDAFields = 0;
|
|
579
790
|
let meteredL2Gas = 0;
|
|
580
791
|
|
|
581
792
|
const numNoteHashes = arrayNonEmptyLength(data.noteHashes, hash => hash.isEmpty());
|
|
582
793
|
meteredDAFields += numNoteHashes;
|
|
583
|
-
|
|
794
|
+
const noteHashBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NOTE_HASH : AVM_EMITNOTEHASH_BASE_L2_GAS;
|
|
795
|
+
meteredL2Gas += numNoteHashes * noteHashBaseGas;
|
|
584
796
|
|
|
585
797
|
const numNullifiers = arrayNonEmptyLength(data.nullifiers, nullifier => nullifier.isEmpty());
|
|
586
798
|
meteredDAFields += numNullifiers;
|
|
587
|
-
|
|
799
|
+
const nullifierBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NULLIFIER : AVM_EMITNULLIFIER_BASE_L2_GAS;
|
|
800
|
+
meteredL2Gas += numNullifiers * nullifierBaseGas;
|
|
588
801
|
|
|
589
802
|
const numL2toL1Messages = arrayNonEmptyLength(data.l2ToL1Msgs, msg => msg.isEmpty());
|
|
590
803
|
meteredDAFields += numL2toL1Messages;
|
|
591
|
-
|
|
804
|
+
const l2ToL1MessageBaseGas = isPrivateOnlyTx ? L2_GAS_PER_L2_TO_L1_MSG : AVM_SENDL2TOL1MSG_BASE_L2_GAS;
|
|
805
|
+
meteredL2Gas += numL2toL1Messages * l2ToL1MessageBaseGas;
|
|
592
806
|
|
|
593
807
|
const numPrivatelogs = arrayNonEmptyLength(data.privateLogs, log => log.isEmpty());
|
|
594
808
|
// Every private log emits its length as an additional field
|
|
@@ -603,7 +817,7 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
|
|
|
603
817
|
);
|
|
604
818
|
meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
|
|
605
819
|
|
|
606
|
-
const meteredDAGas = meteredDAFields *
|
|
820
|
+
const meteredDAGas = meteredDAFields * DA_GAS_PER_FIELD;
|
|
607
821
|
|
|
608
822
|
if ((data as PrivateToPublicAccumulatedData).publicCallRequests) {
|
|
609
823
|
const dataForPublic = data as PrivateToPublicAccumulatedData;
|