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