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