@aztec/pxe 0.0.1-commit.e2b2873ed → 0.0.1-commit.e304674f1
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/block_synchronizer/block_synchronizer.d.ts +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +6 -0
- 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 +14 -7
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +138 -45
- 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 +3 -5
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +7 -9
- 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/note_validation_request.d.ts +3 -6
- 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 +5 -10
- 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 +38 -0
- package/dest/contract_function_simulator/oracle/oracle.d.ts +64 -44
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +187 -97
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +23 -48
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +50 -81
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +66 -46
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +190 -99
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +9 -2
- package/dest/contract_logging.d.ts +27 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +38 -0
- package/dest/contract_sync/contract_sync_service.d.ts +7 -5
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +45 -38
- package/dest/contract_sync/helpers.d.ts +2 -2
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +9 -4
- package/dest/debug/pxe_debug_utils.d.ts +4 -3
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +4 -4
- package/dest/entrypoints/client/bundle/index.d.ts +3 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +2 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +2 -2
- package/dest/entrypoints/client/lazy/index.d.ts +3 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +2 -0
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +2 -2
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +2 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +1 -0
- package/dest/entrypoints/server/utils.d.ts +2 -2
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +2 -2
- package/dest/events/event_service.d.ts +3 -2
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +16 -4
- package/dest/logs/log_service.d.ts +6 -6
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +34 -32
- 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 -4
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +17 -7
- package/dest/notes_filter.d.ts +24 -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 +18 -14
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +74 -48
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +33 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- 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 +140 -64
- 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 -2
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- 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 +16 -16
- 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 +254 -65
- 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 -8
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -4
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +3 -9
- package/src/contract_function_simulator/oracle/interfaces.ts +63 -54
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +98 -0
- package/src/contract_function_simulator/oracle/oracle.ts +223 -139
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +58 -102
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +320 -122
- package/src/contract_function_simulator/pick_notes.ts +9 -2
- package/src/contract_logging.ts +52 -0
- package/src/contract_sync/contract_sync_service.ts +79 -54
- package/src/contract_sync/helpers.ts +8 -3
- package/src/debug/pxe_debug_utils.ts +8 -7
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +2 -3
- package/src/entrypoints/client/lazy/index.ts +2 -0
- package/src/entrypoints/client/lazy/utils.ts +2 -3
- package/src/entrypoints/pxe_creation_options.ts +7 -0
- package/src/entrypoints/server/index.ts +1 -0
- package/src/entrypoints/server/utils.ts +2 -3
- package/src/events/event_service.ts +17 -4
- package/src/logs/log_service.ts +68 -51
- package/src/messages/message_context_service.ts +44 -0
- package/src/notes/note_service.ts +19 -8
- package/src/notes_filter.ts +24 -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 +104 -61
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +34 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +170 -71
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +4 -3
- 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/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
|
@@ -77,6 +77,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
77
77
|
const blockHeader = await this.node.getBlockHeader(BlockNumber(event.block.number));
|
|
78
78
|
if (blockHeader) {
|
|
79
79
|
await this.updateAnchorBlockHeader(blockHeader);
|
|
80
|
+
} else {
|
|
81
|
+
this.log.warn(`Block header not found for proven block ${event.block.number}, skipping anchor update`);
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
break;
|
|
@@ -86,6 +88,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
86
88
|
const blockHeader = await this.node.getBlockHeader(BlockNumber(event.block.number));
|
|
87
89
|
if (blockHeader) {
|
|
88
90
|
await this.updateAnchorBlockHeader(blockHeader);
|
|
91
|
+
} else {
|
|
92
|
+
this.log.warn(`Block header not found for finalized block ${event.block.number}, skipping anchor update`);
|
|
89
93
|
}
|
|
90
94
|
}
|
|
91
95
|
break;
|
|
@@ -152,6 +156,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
152
156
|
}
|
|
153
157
|
|
|
154
158
|
this.log.debug(`Syncing PXE with the node`);
|
|
159
|
+
// Capture the promise locally so we always await the exact promise we created, even if this.isSyncing is modified
|
|
160
|
+
// between assignment and await (e.g. due to future refactors introducing a yield point).
|
|
155
161
|
const isSyncing = this.doSync();
|
|
156
162
|
this.isSyncing = isSyncing;
|
|
157
163
|
try {
|
package/src/config/index.ts
CHANGED
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
numberConfigHelper,
|
|
6
6
|
parseBooleanEnv,
|
|
7
7
|
} from '@aztec/foundation/config';
|
|
8
|
-
import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
|
|
9
8
|
import { type ChainConfig, chainConfigMappings } from '@aztec/stdlib/config';
|
|
9
|
+
import { type DataStoreConfig, dataConfigMappings } from '@aztec/stdlib/kv-store';
|
|
10
10
|
|
|
11
11
|
export { getPackageInfo } from './package_info.js';
|
|
12
12
|
|
|
@@ -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
|
|
|
75
92
|
import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
|
|
93
|
+
import type { MessageContextService } from '../messages/message_context_service.js';
|
|
76
94
|
import type { AddressStore } from '../storage/address_store/address_store.js';
|
|
95
|
+
import { CapsuleService } from '../storage/capsule_store/capsule_service.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';
|
|
@@ -102,8 +121,8 @@ export type ContractSimulatorRunOpts = {
|
|
|
102
121
|
anchorBlockHeader: BlockHeader;
|
|
103
122
|
/** The address used as a tagging sender when emitting private logs. */
|
|
104
123
|
senderForTags?: AztecAddress;
|
|
105
|
-
/** The accounts whose notes we can access in this call.
|
|
106
|
-
scopes
|
|
124
|
+
/** The accounts whose notes we can access in this call. */
|
|
125
|
+
scopes: AztecAddress[];
|
|
107
126
|
/** The job ID for staged writes. */
|
|
108
127
|
jobId: string;
|
|
109
128
|
};
|
|
@@ -122,6 +141,7 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
122
141
|
privateEventStore: PrivateEventStore;
|
|
123
142
|
simulator: CircuitSimulator;
|
|
124
143
|
contractSyncService: ContractSyncService;
|
|
144
|
+
messageContextService: MessageContextService;
|
|
125
145
|
};
|
|
126
146
|
|
|
127
147
|
/**
|
|
@@ -141,6 +161,7 @@ export class ContractFunctionSimulator {
|
|
|
141
161
|
private readonly privateEventStore: PrivateEventStore;
|
|
142
162
|
private readonly simulator: CircuitSimulator;
|
|
143
163
|
private readonly contractSyncService: ContractSyncService;
|
|
164
|
+
private readonly messageContextService: MessageContextService;
|
|
144
165
|
|
|
145
166
|
constructor(args: ContractFunctionSimulatorArgs) {
|
|
146
167
|
this.contractStore = args.contractStore;
|
|
@@ -155,6 +176,7 @@ export class ContractFunctionSimulator {
|
|
|
155
176
|
this.privateEventStore = args.privateEventStore;
|
|
156
177
|
this.simulator = args.simulator;
|
|
157
178
|
this.contractSyncService = args.contractSyncService;
|
|
179
|
+
this.messageContextService = args.messageContextService;
|
|
158
180
|
this.log = createLogger('simulator');
|
|
159
181
|
}
|
|
160
182
|
|
|
@@ -223,8 +245,9 @@ export class ContractFunctionSimulator {
|
|
|
223
245
|
senderTaggingStore: this.senderTaggingStore,
|
|
224
246
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
225
247
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
226
|
-
|
|
248
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
227
249
|
privateEventStore: this.privateEventStore,
|
|
250
|
+
messageContextService: this.messageContextService,
|
|
228
251
|
contractSyncService: this.contractSyncService,
|
|
229
252
|
jobId,
|
|
230
253
|
totalPublicCalldataCount: 0,
|
|
@@ -261,7 +284,7 @@ export class ContractFunctionSimulator {
|
|
|
261
284
|
);
|
|
262
285
|
const publicFunctionsCalldata = await Promise.all(
|
|
263
286
|
publicCallRequests.map(async r => {
|
|
264
|
-
const calldata = await privateExecutionOracle.
|
|
287
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
265
288
|
return new HashedValues(calldata, r.calldataHash);
|
|
266
289
|
}),
|
|
267
290
|
);
|
|
@@ -296,9 +319,9 @@ export class ContractFunctionSimulator {
|
|
|
296
319
|
call: FunctionCall,
|
|
297
320
|
authwits: AuthWitness[],
|
|
298
321
|
anchorBlockHeader: BlockHeader,
|
|
299
|
-
scopes: AztecAddress[]
|
|
322
|
+
scopes: AztecAddress[],
|
|
300
323
|
jobId: string,
|
|
301
|
-
): Promise<Fr[]> {
|
|
324
|
+
): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
|
|
302
325
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
303
326
|
|
|
304
327
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
@@ -317,8 +340,10 @@ export class ContractFunctionSimulator {
|
|
|
317
340
|
aztecNode: this.aztecNode,
|
|
318
341
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
319
342
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
320
|
-
|
|
343
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
321
344
|
privateEventStore: this.privateEventStore,
|
|
345
|
+
messageContextService: this.messageContextService,
|
|
346
|
+
contractSyncService: this.contractSyncService,
|
|
322
347
|
jobId,
|
|
323
348
|
scopes,
|
|
324
349
|
});
|
|
@@ -345,8 +370,11 @@ export class ContractFunctionSimulator {
|
|
|
345
370
|
);
|
|
346
371
|
});
|
|
347
372
|
|
|
348
|
-
this.log.verbose(`Utility
|
|
349
|
-
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
|
+
};
|
|
350
378
|
} catch (err) {
|
|
351
379
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
352
380
|
}
|
|
@@ -387,7 +415,8 @@ class OrderedSideEffect<T> {
|
|
|
387
415
|
* (allowing state overrides) and is much faster, while still generating a valid
|
|
388
416
|
* output that can be sent to the node for public simulation
|
|
389
417
|
* @param privateExecutionResult - The result of the private execution.
|
|
390
|
-
* @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.
|
|
391
420
|
* @param minRevertibleSideEffectCounterOverride - Optional override for the min revertible side effect counter.
|
|
392
421
|
* Used by TXE to simulate account contract behavior (setting the counter before app execution).
|
|
393
422
|
* @returns The simulated proving result.
|
|
@@ -395,58 +424,73 @@ class OrderedSideEffect<T> {
|
|
|
395
424
|
export async function generateSimulatedProvingResult(
|
|
396
425
|
privateExecutionResult: PrivateExecutionResult,
|
|
397
426
|
debugFunctionNameGetter: (contractAddress: AztecAddress, functionSelector: FunctionSelector) => Promise<string>,
|
|
427
|
+
node: AztecNode,
|
|
398
428
|
minRevertibleSideEffectCounterOverride?: number,
|
|
399
429
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
400
|
-
const
|
|
401
|
-
const nullifiers: OrderedSideEffect<Fr>[] = [];
|
|
402
|
-
const taggedPrivateLogs: OrderedSideEffect<PrivateLog>[] = [];
|
|
430
|
+
const taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[] = [];
|
|
403
431
|
const l2ToL1Messages: OrderedSideEffect<ScopedL2ToL1Message>[] = [];
|
|
404
432
|
const contractClassLogsHashes: OrderedSideEffect<ScopedLogHash>[] = [];
|
|
405
433
|
const publicCallRequests: OrderedSideEffect<PublicCallRequest>[] = [];
|
|
406
434
|
const executionSteps: PrivateExecutionStep[] = [];
|
|
407
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
|
+
|
|
408
445
|
let publicTeardownCallRequest;
|
|
409
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
|
+
|
|
410
454
|
const executions = [privateExecutionResult.entrypoint];
|
|
411
455
|
|
|
412
456
|
while (executions.length !== 0) {
|
|
413
457
|
const execution = executions.shift()!;
|
|
414
458
|
executions.unshift(...execution!.nestedExecutionResults);
|
|
415
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
|
+
|
|
416
466
|
const { contractAddress } = execution.publicInputs.callContext;
|
|
417
467
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
new OrderedSideEffect(await siloNoteHash(contractAddress, noteHash.value), noteHash.counter),
|
|
425
|
-
),
|
|
426
|
-
);
|
|
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
|
+
}
|
|
427
474
|
|
|
428
|
-
|
|
429
|
-
execution.publicInputs.
|
|
475
|
+
scopedNoteHashes.push(
|
|
476
|
+
...execution.publicInputs.noteHashes
|
|
430
477
|
.getActiveItems()
|
|
431
|
-
.
|
|
432
|
-
|
|
433
|
-
new OrderedSideEffect(await siloNullifier(contractAddress, nullifier.value), nullifier.counter),
|
|
434
|
-
),
|
|
478
|
+
.filter(nh => !nh.isEmpty())
|
|
479
|
+
.map(nh => nh.scope(contractAddress)),
|
|
435
480
|
);
|
|
481
|
+
scopedNullifiers.push(...execution.publicInputs.nullifiers.getActiveItems().map(n => n.scope(contractAddress)));
|
|
436
482
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
[contractAddress, metadata.log.fields[0]
|
|
441
|
-
|
|
442
|
-
)
|
|
443
|
-
|
|
444
|
-
}),
|
|
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
|
+
)),
|
|
445
490
|
);
|
|
446
491
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
nullifiers.push(...nullifiersFromExecution);
|
|
492
|
+
noteHashReadRequests.push(...execution.publicInputs.noteHashReadRequests.getActiveItems());
|
|
493
|
+
nullifierReadRequests.push(...execution.publicInputs.nullifierReadRequests.getActiveItems());
|
|
450
494
|
l2ToL1Messages.push(
|
|
451
495
|
...execution.publicInputs.l2ToL1Msgs
|
|
452
496
|
.getActiveItems()
|
|
@@ -486,6 +530,47 @@ export async function generateSimulatedProvingResult(
|
|
|
486
530
|
});
|
|
487
531
|
}
|
|
488
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
|
+
|
|
489
574
|
const constantData = new TxConstantData(
|
|
490
575
|
privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader,
|
|
491
576
|
privateExecutionResult.entrypoint.publicInputs.txContext,
|
|
@@ -502,11 +587,9 @@ export async function generateSimulatedProvingResult(
|
|
|
502
587
|
const getEffect = <T>(orderedSideEffect: OrderedSideEffect<T>) => orderedSideEffect.sideEffect;
|
|
503
588
|
|
|
504
589
|
const isPrivateOnlyTx = privateExecutionResult.publicFunctionCalldata.length === 0;
|
|
505
|
-
const minRevertibleSideEffectCounter =
|
|
506
|
-
minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
|
|
507
590
|
|
|
508
591
|
const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(
|
|
509
|
-
|
|
592
|
+
siloedNullifiers,
|
|
510
593
|
minRevertibleSideEffectCounter,
|
|
511
594
|
);
|
|
512
595
|
const nonceGenerator = privateExecutionResult.firstNullifier;
|
|
@@ -520,7 +603,7 @@ export async function generateSimulatedProvingResult(
|
|
|
520
603
|
// We must make the note hashes unique by using the
|
|
521
604
|
// nonce generator and their index in the tx.
|
|
522
605
|
const uniqueNoteHashes = await Promise.all(
|
|
523
|
-
siloedNoteHashes.
|
|
606
|
+
siloedNoteHashes.map(async (orderedSideEffect, i) => {
|
|
524
607
|
const siloedNoteHash = orderedSideEffect.sideEffect;
|
|
525
608
|
const nonce = await computeNoteHashNonce(nonceGenerator, i);
|
|
526
609
|
const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
|
|
@@ -535,18 +618,18 @@ export async function generateSimulatedProvingResult(
|
|
|
535
618
|
ScopedL2ToL1Message.empty(),
|
|
536
619
|
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
537
620
|
),
|
|
538
|
-
padArrayEnd(
|
|
621
|
+
padArrayEnd(filteredPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
539
622
|
padArrayEnd(
|
|
540
623
|
contractClassLogsHashes.sort(sortByCounter).map(getEffect),
|
|
541
624
|
ScopedLogHash.empty(),
|
|
542
625
|
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
543
626
|
),
|
|
544
627
|
);
|
|
545
|
-
gasUsed = meterGasUsed(accumulatedDataForRollup);
|
|
628
|
+
gasUsed = meterGasUsed(accumulatedDataForRollup, isPrivateOnlyTx);
|
|
546
629
|
inputsForRollup = new PartialPrivateTailPublicInputsForRollup(accumulatedDataForRollup);
|
|
547
630
|
} else {
|
|
548
631
|
const [nonRevertibleNoteHashes, revertibleNoteHashes] = splitOrderedSideEffects(
|
|
549
|
-
siloedNoteHashes
|
|
632
|
+
siloedNoteHashes,
|
|
550
633
|
minRevertibleSideEffectCounter,
|
|
551
634
|
);
|
|
552
635
|
const nonRevertibleUniqueNoteHashes = await Promise.all(
|
|
@@ -560,7 +643,7 @@ export async function generateSimulatedProvingResult(
|
|
|
560
643
|
minRevertibleSideEffectCounter,
|
|
561
644
|
);
|
|
562
645
|
const [nonRevertibleTaggedPrivateLogs, revertibleTaggedPrivateLogs] = splitOrderedSideEffects(
|
|
563
|
-
|
|
646
|
+
filteredPrivateLogs,
|
|
564
647
|
minRevertibleSideEffectCounter,
|
|
565
648
|
);
|
|
566
649
|
const [nonRevertibleContractClassLogHashes, revertibleContractClassLogHashes] = splitOrderedSideEffects(
|
|
@@ -589,9 +672,9 @@ export async function generateSimulatedProvingResult(
|
|
|
589
672
|
padArrayEnd(revertibleContractClassLogHashes, ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX),
|
|
590
673
|
padArrayEnd(revertiblePublicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX),
|
|
591
674
|
);
|
|
592
|
-
gasUsed = meterGasUsed(revertibleData).add(meterGasUsed(nonRevertibleData));
|
|
675
|
+
gasUsed = meterGasUsed(revertibleData, isPrivateOnlyTx).add(meterGasUsed(nonRevertibleData, isPrivateOnlyTx));
|
|
593
676
|
if (publicTeardownCallRequest) {
|
|
594
|
-
gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
|
|
677
|
+
gasUsed = gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
|
|
595
678
|
}
|
|
596
679
|
|
|
597
680
|
inputsForPublic = new PartialPrivateTailPublicInputsForPublic(
|
|
@@ -603,9 +686,14 @@ export async function generateSimulatedProvingResult(
|
|
|
603
686
|
|
|
604
687
|
const publicInputs = new PrivateKernelTailCircuitPublicInputs(
|
|
605
688
|
constantData,
|
|
606
|
-
/*gasUsed=*/ gasUsed.add(
|
|
607
|
-
|
|
608
|
-
|
|
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,
|
|
609
697
|
hasPublicCalls ? inputsForPublic : undefined,
|
|
610
698
|
!hasPublicCalls ? inputsForRollup : undefined,
|
|
611
699
|
);
|
|
@@ -617,6 +705,104 @@ export async function generateSimulatedProvingResult(
|
|
|
617
705
|
};
|
|
618
706
|
}
|
|
619
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
|
+
|
|
620
806
|
function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertibleSideEffectCounter: number) {
|
|
621
807
|
const revertibleSideEffects: T[] = [];
|
|
622
808
|
const nonRevertibleSideEffects: T[] = [];
|
|
@@ -630,21 +816,24 @@ function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertib
|
|
|
630
816
|
return [nonRevertibleSideEffects, revertibleSideEffects];
|
|
631
817
|
}
|
|
632
818
|
|
|
633
|
-
function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData) {
|
|
819
|
+
function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData, isPrivateOnlyTx: boolean) {
|
|
634
820
|
let meteredDAFields = 0;
|
|
635
821
|
let meteredL2Gas = 0;
|
|
636
822
|
|
|
637
823
|
const numNoteHashes = arrayNonEmptyLength(data.noteHashes, hash => hash.isEmpty());
|
|
638
824
|
meteredDAFields += numNoteHashes;
|
|
639
|
-
|
|
825
|
+
const noteHashBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NOTE_HASH : AVM_EMITNOTEHASH_BASE_L2_GAS;
|
|
826
|
+
meteredL2Gas += numNoteHashes * noteHashBaseGas;
|
|
640
827
|
|
|
641
828
|
const numNullifiers = arrayNonEmptyLength(data.nullifiers, nullifier => nullifier.isEmpty());
|
|
642
829
|
meteredDAFields += numNullifiers;
|
|
643
|
-
|
|
830
|
+
const nullifierBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NULLIFIER : AVM_EMITNULLIFIER_BASE_L2_GAS;
|
|
831
|
+
meteredL2Gas += numNullifiers * nullifierBaseGas;
|
|
644
832
|
|
|
645
833
|
const numL2toL1Messages = arrayNonEmptyLength(data.l2ToL1Msgs, msg => msg.isEmpty());
|
|
646
834
|
meteredDAFields += numL2toL1Messages;
|
|
647
|
-
|
|
835
|
+
const l2ToL1MessageBaseGas = isPrivateOnlyTx ? L2_GAS_PER_L2_TO_L1_MSG : AVM_SENDL2TOL1MSG_BASE_L2_GAS;
|
|
836
|
+
meteredL2Gas += numL2toL1Messages * l2ToL1MessageBaseGas;
|
|
648
837
|
|
|
649
838
|
const numPrivatelogs = arrayNonEmptyLength(data.privateLogs, log => log.isEmpty());
|
|
650
839
|
// Every private log emits its length as an additional field
|
|
@@ -652,14 +841,14 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
|
|
|
652
841
|
meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
|
|
653
842
|
|
|
654
843
|
const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
|
|
655
|
-
// Every contract class log emits its
|
|
844
|
+
// Every contract class log emits its contract address as an additional field
|
|
656
845
|
meteredDAFields += data.contractClassLogsHashes.reduce(
|
|
657
|
-
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length +
|
|
846
|
+
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
|
|
658
847
|
0,
|
|
659
848
|
);
|
|
660
849
|
meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
|
|
661
850
|
|
|
662
|
-
const meteredDAGas = meteredDAFields *
|
|
851
|
+
const meteredDAGas = meteredDAFields * DA_GAS_PER_FIELD;
|
|
663
852
|
|
|
664
853
|
if ((data as PrivateToPublicAccumulatedData).publicCallRequests) {
|
|
665
854
|
const dataForPublic = data as PrivateToPublicAccumulatedData;
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ExtendedDirectionalAppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* A map that stores the tagging index for a given directional app tagging secret.
|
|
4
|
+
* A map that stores the tagging index range for a given extended directional app tagging secret.
|
|
5
5
|
* Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
|
|
6
6
|
* of sender -> recipient matters.
|
|
7
7
|
*/
|
|
8
8
|
export class ExecutionTaggingIndexCache {
|
|
9
|
-
private taggingIndexMap: Map<string, number> = new Map();
|
|
9
|
+
private taggingIndexMap: Map<string, { lowestIndex: number; highestIndex: number }> = new Map();
|
|
10
10
|
|
|
11
|
-
public getLastUsedIndex(secret:
|
|
12
|
-
return this.taggingIndexMap.get(secret.toString());
|
|
11
|
+
public getLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret): number | undefined {
|
|
12
|
+
return this.taggingIndexMap.get(secret.toString())?.highestIndex;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
public setLastUsedIndex(secret:
|
|
15
|
+
public setLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret, index: number) {
|
|
16
16
|
const currentValue = this.taggingIndexMap.get(secret.toString());
|
|
17
|
-
if (currentValue !== undefined && currentValue !== index - 1) {
|
|
18
|
-
throw new Error(`Invalid tagging index update. Current value: ${currentValue}, new value: ${index}`);
|
|
17
|
+
if (currentValue !== undefined && currentValue.highestIndex !== index - 1) {
|
|
18
|
+
throw new Error(`Invalid tagging index update. Current value: ${currentValue.highestIndex}, new value: ${index}`);
|
|
19
|
+
}
|
|
20
|
+
if (currentValue !== undefined) {
|
|
21
|
+
currentValue.highestIndex = index;
|
|
22
|
+
} else {
|
|
23
|
+
this.taggingIndexMap.set(secret.toString(), { lowestIndex: index, highestIndex: index });
|
|
19
24
|
}
|
|
20
|
-
this.taggingIndexMap.set(secret.toString(), index);
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
/**
|
|
24
|
-
* Returns the
|
|
28
|
+
* Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
|
|
25
29
|
*/
|
|
26
|
-
public
|
|
27
|
-
return Array.from(this.taggingIndexMap.entries()).map(([secret,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
public getUsedTaggingIndexRanges(): TaggingIndexRange[] {
|
|
31
|
+
return Array.from(this.taggingIndexMap.entries()).map(([secret, { lowestIndex, highestIndex }]) => ({
|
|
32
|
+
extendedSecret: ExtendedDirectionalAppTaggingSecret.fromString(secret),
|
|
33
|
+
lowestIndex,
|
|
34
|
+
highestIndex,
|
|
30
35
|
}));
|
|
31
36
|
}
|
|
32
37
|
}
|