@aztec/pxe 0.0.1-commit.29c6b1a3 → 0.0.1-commit.2c0ee1788
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/bin/check_oracle_version.js +4 -4
- package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
- package/dest/block_synchronizer/block_stream_source.js +37 -0
- package/dest/block_synchronizer/block_synchronizer.d.ts +10 -4
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +38 -12
- package/dest/config/index.d.ts +2 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +8 -15
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +63 -31
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +207 -77
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
- 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 +4 -6
- 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 +8 -10
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
- 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 +2 -4
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
- 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 +6 -11
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +63 -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 +47 -0
- package/dest/contract_function_simulator/oracle/oracle.d.ts +76 -44
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +312 -108
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +58 -85
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +123 -97
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +134 -70
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +379 -143
- 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 +20 -3
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +3 -0
- 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 +44 -0
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
- package/dest/contract_sync/contract_sync_service.js +116 -0
- package/dest/contract_sync/helpers.d.ts +28 -0
- package/dest/contract_sync/helpers.d.ts.map +1 -0
- package/dest/contract_sync/{index.js → helpers.js} +19 -13
- 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 +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 +23 -9
- 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 +3 -3
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +24 -10
- package/dest/entrypoints/pxe_creation_options.d.ts +5 -2
- 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 +4 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -2
- 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 +30 -11
- package/dest/events/event_service.d.ts +5 -5
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +30 -10
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/job_coordinator/job_coordinator.d.ts +3 -2
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +3 -2
- package/dest/logs/log_service.d.ts +10 -9
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +41 -61
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +36 -0
- package/dest/notes/note_service.d.ts +7 -8
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +23 -14
- 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 +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- 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 +3 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +20 -15
- package/dest/private_kernel/private_kernel_oracle.d.ts +10 -6
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +19 -18
- package/dest/pxe.d.ts +85 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +169 -86
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +9 -2
- 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 +42 -36
- 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 +160 -73
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +13 -3
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +147 -107
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +87 -61
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +233 -137
- package/dest/tagging/get_all_logs_by_tags.d.ts +1 -1
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +17 -3
- package/dest/tagging/index.d.ts +3 -3
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +4 -5
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -22
- 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/bin/check_oracle_version.ts +4 -4
- package/src/block_synchronizer/block_stream_source.ts +52 -0
- package/src/block_synchronizer/block_synchronizer.ts +53 -22
- package/src/config/index.ts +3 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +367 -136
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- 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 +9 -9
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -10
- package/src/contract_function_simulator/oracle/interfaces.ts +97 -59
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
- package/src/contract_function_simulator/oracle/oracle.ts +399 -144
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +155 -190
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +623 -172
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/proxied_contract_data_source.ts +8 -1
- package/src/contract_logging.ts +52 -0
- package/src/contract_sync/contract_sync_service.ts +176 -0
- package/src/contract_sync/{index.ts → helpers.ts} +22 -22
- package/src/debug/pxe_debug_utils.ts +48 -18
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +18 -18
- package/src/entrypoints/client/lazy/index.ts +2 -0
- package/src/entrypoints/client/lazy/utils.ts +19 -18
- package/src/entrypoints/pxe_creation_options.ts +9 -1
- package/src/entrypoints/server/index.ts +3 -2
- package/src/entrypoints/server/utils.ts +24 -29
- package/src/events/event_service.ts +34 -11
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +77 -105
- package/src/messages/message_context_service.ts +44 -0
- package/src/notes/note_service.ts +24 -15
- package/src/notes_filter.ts +24 -0
- package/src/oracle_version.ts +20 -10
- 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 +24 -19
- package/src/private_kernel/private_kernel_oracle.ts +21 -21
- package/src/pxe.ts +318 -143
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +9 -1
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +52 -34
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +193 -81
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +166 -132
- package/src/storage/private_event_store/private_event_store.ts +106 -81
- package/src/storage/tagging_store/recipient_tagging_store.ts +38 -24
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +287 -156
- package/src/tagging/get_all_logs_by_tags.ts +28 -4
- package/src/tagging/index.ts +2 -2
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +12 -25
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +10 -15
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +23 -10
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -26
- package/dest/contract_sync/index.d.ts +0 -23
- package/dest/contract_sync/index.d.ts.map +0 -1
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
package/src/pxe.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
7
|
import { KeyStore } from '@aztec/key-store';
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from '@aztec/stdlib/abi';
|
|
19
19
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
20
20
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
21
|
+
import type { L2TipsProvider } from '@aztec/stdlib/block';
|
|
21
22
|
import {
|
|
22
23
|
CompleteAddress,
|
|
23
24
|
type ContractInstanceWithAddress,
|
|
@@ -33,6 +34,7 @@ import type {
|
|
|
33
34
|
PrivateKernelTailCircuitPublicInputs,
|
|
34
35
|
} from '@aztec/stdlib/kernel';
|
|
35
36
|
import {
|
|
37
|
+
BlockHeader,
|
|
36
38
|
type ContractOverrides,
|
|
37
39
|
type InTx,
|
|
38
40
|
PrivateExecutionResult,
|
|
@@ -46,7 +48,7 @@ import {
|
|
|
46
48
|
TxProfileResult,
|
|
47
49
|
TxProvingResult,
|
|
48
50
|
TxSimulationResult,
|
|
49
|
-
|
|
51
|
+
UtilityExecutionResult,
|
|
50
52
|
} from '@aztec/stdlib/tx';
|
|
51
53
|
|
|
52
54
|
import { inspect } from 'util';
|
|
@@ -59,11 +61,14 @@ import {
|
|
|
59
61
|
generateSimulatedProvingResult,
|
|
60
62
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
61
63
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
62
|
-
import {
|
|
64
|
+
import { displayDebugLogs } from './contract_logging.js';
|
|
65
|
+
import { ContractSyncService } from './contract_sync/contract_sync_service.js';
|
|
66
|
+
import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
63
67
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
64
68
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
65
69
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
66
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
67
72
|
import {
|
|
68
73
|
PrivateKernelExecutionProver,
|
|
69
74
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -84,6 +89,70 @@ export type PackedPrivateEvent = InTx & {
|
|
|
84
89
|
eventSelector: EventSelector;
|
|
85
90
|
};
|
|
86
91
|
|
|
92
|
+
/** Options for PXE.proveTx. */
|
|
93
|
+
export type ProveTxOpts = {
|
|
94
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
95
|
+
scopes: AztecAddress[];
|
|
96
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
97
|
+
senderForTags?: AztecAddress;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/** Options for PXE.profileTx. */
|
|
101
|
+
export type ProfileTxOpts = {
|
|
102
|
+
/** The profiling mode to use. */
|
|
103
|
+
profileMode: 'full' | 'execution-steps' | 'gates';
|
|
104
|
+
/** If true, proof generation is skipped during profiling. Defaults to true. */
|
|
105
|
+
skipProofGeneration?: boolean;
|
|
106
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
107
|
+
scopes: AztecAddress[];
|
|
108
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
109
|
+
senderForTags?: AztecAddress;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/** Options for PXE.simulateTx. */
|
|
113
|
+
export type SimulateTxOpts = {
|
|
114
|
+
/** Whether to simulate the public part of the transaction. */
|
|
115
|
+
simulatePublic: boolean;
|
|
116
|
+
/** If false, this function throws if the transaction is unable to be included in a block at the current state. */
|
|
117
|
+
skipTxValidation?: boolean;
|
|
118
|
+
/** If false, fees are enforced. */
|
|
119
|
+
skipFeeEnforcement?: boolean;
|
|
120
|
+
/** If true, kernel logic is emulated in TS for simulation */
|
|
121
|
+
skipKernels?: boolean;
|
|
122
|
+
/** State overrides for the simulation, such as contract instances and artifacts. Requires skipKernels: true */
|
|
123
|
+
overrides?: SimulationOverrides;
|
|
124
|
+
/** Addresses whose private state and keys are accessible during private execution */
|
|
125
|
+
scopes: AztecAddress[];
|
|
126
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
127
|
+
senderForTags?: AztecAddress;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/** Options for PXE.executeUtility. */
|
|
131
|
+
export type ExecuteUtilityOpts = {
|
|
132
|
+
/** The authentication witnesses required for the function call. */
|
|
133
|
+
authwits?: AuthWitness[];
|
|
134
|
+
/** The accounts whose notes we can access in this call */
|
|
135
|
+
scopes: AztecAddress[];
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/** Args for PXE.create. */
|
|
139
|
+
export type PXECreateArgs = {
|
|
140
|
+
/** The Aztec node to connect to. */
|
|
141
|
+
node: AztecNode;
|
|
142
|
+
/** The key-value store for persisting PXE state. */
|
|
143
|
+
store: AztecAsyncKVStore;
|
|
144
|
+
/** The prover for generating private kernel proofs. */
|
|
145
|
+
proofCreator: PrivateKernelProver;
|
|
146
|
+
/** The circuit simulator for executing ACIR circuits. */
|
|
147
|
+
simulator: CircuitSimulator;
|
|
148
|
+
/** Provider for protocol contract artifacts and instances. */
|
|
149
|
+
protocolContractsProvider: ProtocolContractsProvider;
|
|
150
|
+
/** PXE configuration options. */
|
|
151
|
+
config: PXEConfig;
|
|
152
|
+
/** Optional logger instance or string suffix for the logger name. */
|
|
153
|
+
loggerOrSuffix?: string | Logger;
|
|
154
|
+
};
|
|
155
|
+
|
|
87
156
|
/**
|
|
88
157
|
* Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
|
|
89
158
|
* manage private state of users.
|
|
@@ -91,6 +160,7 @@ export type PackedPrivateEvent = InTx & {
|
|
|
91
160
|
export class PXE {
|
|
92
161
|
private constructor(
|
|
93
162
|
private node: AztecNode,
|
|
163
|
+
private db: AztecAsyncKVStore,
|
|
94
164
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
95
165
|
private keyStore: KeyStore,
|
|
96
166
|
private contractStore: ContractStore,
|
|
@@ -102,6 +172,9 @@ export class PXE {
|
|
|
102
172
|
private recipientTaggingStore: RecipientTaggingStore,
|
|
103
173
|
private addressStore: AddressStore,
|
|
104
174
|
private privateEventStore: PrivateEventStore,
|
|
175
|
+
private contractSyncService: ContractSyncService,
|
|
176
|
+
private messageContextService: MessageContextService,
|
|
177
|
+
private l2TipsStore: L2TipsProvider,
|
|
105
178
|
private simulator: CircuitSimulator,
|
|
106
179
|
private proverEnabled: boolean,
|
|
107
180
|
private proofCreator: PrivateKernelProver,
|
|
@@ -119,21 +192,27 @@ export class PXE {
|
|
|
119
192
|
*
|
|
120
193
|
* @returns A promise that resolves PXE is ready to be used.
|
|
121
194
|
*/
|
|
122
|
-
public static async create(
|
|
123
|
-
node
|
|
124
|
-
store
|
|
125
|
-
proofCreator
|
|
126
|
-
simulator
|
|
127
|
-
protocolContractsProvider
|
|
128
|
-
config
|
|
129
|
-
loggerOrSuffix
|
|
130
|
-
) {
|
|
195
|
+
public static async create({
|
|
196
|
+
node,
|
|
197
|
+
store,
|
|
198
|
+
proofCreator,
|
|
199
|
+
simulator,
|
|
200
|
+
protocolContractsProvider,
|
|
201
|
+
config,
|
|
202
|
+
loggerOrSuffix,
|
|
203
|
+
}: PXECreateArgs) {
|
|
204
|
+
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
205
|
+
const bindings: LoggerBindings | undefined =
|
|
206
|
+
loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
|
|
207
|
+
|
|
131
208
|
const log =
|
|
132
209
|
!loggerOrSuffix || typeof loggerOrSuffix === 'string'
|
|
133
210
|
? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
|
|
134
211
|
: loggerOrSuffix;
|
|
135
212
|
|
|
136
|
-
const
|
|
213
|
+
const info = await node.getNodeInfo();
|
|
214
|
+
|
|
215
|
+
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
137
216
|
const addressStore = new AddressStore(store);
|
|
138
217
|
const privateEventStore = new PrivateEventStore(store);
|
|
139
218
|
const contractStore = new ContractStore(store);
|
|
@@ -145,6 +224,14 @@ export class PXE {
|
|
|
145
224
|
const capsuleStore = new CapsuleStore(store);
|
|
146
225
|
const keyStore = new KeyStore(store);
|
|
147
226
|
const tipsStore = new L2TipsKVStore(store, 'pxe');
|
|
227
|
+
const contractSyncService = new ContractSyncService(
|
|
228
|
+
node,
|
|
229
|
+
contractStore,
|
|
230
|
+
noteStore,
|
|
231
|
+
createLogger('pxe:contract_sync', bindings),
|
|
232
|
+
);
|
|
233
|
+
const messageContextService = new MessageContextService(node);
|
|
234
|
+
|
|
148
235
|
const synchronizer = new BlockSynchronizer(
|
|
149
236
|
node,
|
|
150
237
|
store,
|
|
@@ -152,25 +239,28 @@ export class PXE {
|
|
|
152
239
|
noteStore,
|
|
153
240
|
privateEventStore,
|
|
154
241
|
tipsStore,
|
|
242
|
+
contractSyncService,
|
|
155
243
|
config,
|
|
156
|
-
|
|
244
|
+
bindings,
|
|
157
245
|
);
|
|
158
246
|
|
|
159
|
-
const jobCoordinator = new JobCoordinator(store);
|
|
247
|
+
const jobCoordinator = new JobCoordinator(store, bindings);
|
|
160
248
|
jobCoordinator.registerStores([
|
|
161
249
|
capsuleStore,
|
|
162
250
|
senderTaggingStore,
|
|
163
251
|
recipientTaggingStore,
|
|
164
252
|
privateEventStore,
|
|
165
253
|
noteStore,
|
|
254
|
+
contractSyncService,
|
|
166
255
|
]);
|
|
167
256
|
|
|
168
|
-
const debugUtils = new PXEDebugUtils(
|
|
257
|
+
const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
|
|
169
258
|
|
|
170
259
|
const jobQueue = new SerialQueue();
|
|
171
260
|
|
|
172
261
|
const pxe = new PXE(
|
|
173
262
|
node,
|
|
263
|
+
store,
|
|
174
264
|
synchronizer,
|
|
175
265
|
keyStore,
|
|
176
266
|
contractStore,
|
|
@@ -182,6 +272,9 @@ export class PXE {
|
|
|
182
272
|
recipientTaggingStore,
|
|
183
273
|
addressStore,
|
|
184
274
|
privateEventStore,
|
|
275
|
+
contractSyncService,
|
|
276
|
+
messageContextService,
|
|
277
|
+
tipsStore,
|
|
185
278
|
simulator,
|
|
186
279
|
proverEnabled,
|
|
187
280
|
proofCreator,
|
|
@@ -192,12 +285,15 @@ export class PXE {
|
|
|
192
285
|
debugUtils,
|
|
193
286
|
);
|
|
194
287
|
|
|
195
|
-
debugUtils.
|
|
288
|
+
debugUtils.setPXEHelpers(
|
|
289
|
+
pxe.#putInJobQueue.bind(pxe),
|
|
290
|
+
pxe.#getSimulatorForTx.bind(pxe),
|
|
291
|
+
pxe.#executeUtility.bind(pxe),
|
|
292
|
+
);
|
|
196
293
|
|
|
197
294
|
pxe.jobQueue.start();
|
|
198
295
|
|
|
199
296
|
await pxe.#registerProtocolContracts();
|
|
200
|
-
const info = await node.getNodeInfo();
|
|
201
297
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
202
298
|
return pxe;
|
|
203
299
|
}
|
|
@@ -207,20 +303,22 @@ export class PXE {
|
|
|
207
303
|
#getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
|
|
208
304
|
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
209
305
|
|
|
210
|
-
return new ContractFunctionSimulator(
|
|
211
|
-
proxyContractStore,
|
|
212
|
-
this.noteStore,
|
|
213
|
-
this.keyStore,
|
|
214
|
-
this.addressStore,
|
|
215
|
-
BenchmarkedNodeFactory.create(this.node),
|
|
216
|
-
this.
|
|
217
|
-
this.senderTaggingStore,
|
|
218
|
-
this.recipientTaggingStore,
|
|
219
|
-
this.senderAddressBookStore,
|
|
220
|
-
this.capsuleStore,
|
|
221
|
-
this.privateEventStore,
|
|
222
|
-
this.simulator,
|
|
223
|
-
|
|
306
|
+
return new ContractFunctionSimulator({
|
|
307
|
+
contractStore: proxyContractStore,
|
|
308
|
+
noteStore: this.noteStore,
|
|
309
|
+
keyStore: this.keyStore,
|
|
310
|
+
addressStore: this.addressStore,
|
|
311
|
+
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
312
|
+
l2TipsStore: this.l2TipsStore,
|
|
313
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
314
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
315
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
316
|
+
capsuleStore: this.capsuleStore,
|
|
317
|
+
privateEventStore: this.privateEventStore,
|
|
318
|
+
simulator: this.simulator,
|
|
319
|
+
contractSyncService: this.contractSyncService,
|
|
320
|
+
messageContextService: this.messageContextService,
|
|
321
|
+
});
|
|
224
322
|
}
|
|
225
323
|
|
|
226
324
|
#contextualizeError(err: Error, ...context: string[]): Error {
|
|
@@ -272,9 +370,8 @@ export class PXE {
|
|
|
272
370
|
async #registerProtocolContracts() {
|
|
273
371
|
const registered: Record<string, string> = {};
|
|
274
372
|
for (const name of protocolContractNames) {
|
|
275
|
-
const { address,
|
|
276
|
-
|
|
277
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
373
|
+
const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
374
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
278
375
|
await this.contractStore.addContractInstance(instance);
|
|
279
376
|
registered[name] = address.toString();
|
|
280
377
|
}
|
|
@@ -283,38 +380,42 @@ export class PXE {
|
|
|
283
380
|
|
|
284
381
|
// Executes the entrypoint private function, as well as all nested private
|
|
285
382
|
// functions that might arise.
|
|
286
|
-
async #executePrivate(
|
|
287
|
-
contractFunctionSimulator
|
|
288
|
-
txRequest
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
383
|
+
async #executePrivate({
|
|
384
|
+
contractFunctionSimulator,
|
|
385
|
+
txRequest,
|
|
386
|
+
anchorBlockHeader,
|
|
387
|
+
scopes,
|
|
388
|
+
jobId,
|
|
389
|
+
senderForTags,
|
|
390
|
+
}: {
|
|
391
|
+
contractFunctionSimulator: ContractFunctionSimulator;
|
|
392
|
+
txRequest: TxExecutionRequest;
|
|
393
|
+
anchorBlockHeader: BlockHeader;
|
|
394
|
+
scopes: AztecAddress[];
|
|
395
|
+
jobId: string;
|
|
396
|
+
senderForTags?: AztecAddress;
|
|
397
|
+
}): Promise<PrivateExecutionResult> {
|
|
292
398
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
293
399
|
|
|
294
400
|
try {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
await ensureContractSynced(
|
|
401
|
+
await this.contractSyncService.ensureContractSynced(
|
|
298
402
|
contractAddress,
|
|
299
403
|
functionSelector,
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.contractStore,
|
|
404
|
+
(privateSyncCall, execScopes) =>
|
|
405
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
303
406
|
anchorBlockHeader,
|
|
407
|
+
jobId,
|
|
408
|
+
scopes,
|
|
304
409
|
);
|
|
305
410
|
|
|
306
|
-
const result = await contractFunctionSimulator.run(
|
|
307
|
-
txRequest,
|
|
411
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
308
412
|
contractAddress,
|
|
309
|
-
functionSelector,
|
|
310
|
-
undefined,
|
|
413
|
+
selector: functionSelector,
|
|
311
414
|
anchorBlockHeader,
|
|
312
|
-
// The sender for tags is set by contracts, typically by an account
|
|
313
|
-
// contract entrypoint
|
|
314
|
-
undefined, // senderForTags
|
|
315
415
|
scopes,
|
|
316
416
|
jobId,
|
|
317
|
-
|
|
417
|
+
senderForTags,
|
|
418
|
+
});
|
|
318
419
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
319
420
|
return result;
|
|
320
421
|
} catch (err) {
|
|
@@ -326,25 +427,32 @@ export class PXE {
|
|
|
326
427
|
}
|
|
327
428
|
|
|
328
429
|
/**
|
|
329
|
-
*
|
|
430
|
+
* Execute a utility function call on the given contract.
|
|
330
431
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
331
432
|
* @param call - The function call to execute.
|
|
332
433
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
333
434
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
334
435
|
* accounts if not specified.
|
|
335
436
|
* @param jobId - The job ID for staged writes.
|
|
336
|
-
* @returns The
|
|
437
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
337
438
|
*/
|
|
338
|
-
async #
|
|
439
|
+
async #executeUtility(
|
|
339
440
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
340
441
|
call: FunctionCall,
|
|
341
442
|
authWitnesses: AuthWitness[] | undefined,
|
|
342
|
-
scopes: AztecAddress[]
|
|
443
|
+
scopes: AztecAddress[],
|
|
343
444
|
jobId: string,
|
|
344
445
|
) {
|
|
345
446
|
try {
|
|
346
447
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
347
|
-
|
|
448
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
449
|
+
call,
|
|
450
|
+
authWitnesses ?? [],
|
|
451
|
+
anchorBlockHeader,
|
|
452
|
+
scopes,
|
|
453
|
+
jobId,
|
|
454
|
+
);
|
|
455
|
+
return { result, offchainEffects };
|
|
348
456
|
} catch (err) {
|
|
349
457
|
if (err instanceof SimulationError) {
|
|
350
458
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -395,18 +503,37 @@ export class PXE {
|
|
|
395
503
|
txExecutionRequest: TxExecutionRequest,
|
|
396
504
|
proofCreator: PrivateKernelProver,
|
|
397
505
|
privateExecutionResult: PrivateExecutionResult,
|
|
506
|
+
anchorBlockHeader: BlockHeader,
|
|
398
507
|
config: PrivateKernelExecutionProverConfig,
|
|
399
508
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
400
|
-
const
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
|
|
509
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
510
|
+
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
511
|
+
kernelOracle,
|
|
512
|
+
proofCreator,
|
|
513
|
+
!this.proverEnabled,
|
|
514
|
+
this.log.getBindings(),
|
|
515
|
+
);
|
|
404
516
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
405
517
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
406
518
|
}
|
|
407
519
|
|
|
408
520
|
// Public API
|
|
409
521
|
|
|
522
|
+
/**
|
|
523
|
+
* Returns the block header up to which the PXE has synced.
|
|
524
|
+
* @returns The synced block header
|
|
525
|
+
*/
|
|
526
|
+
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
527
|
+
return this.#putInJobQueue(() => {
|
|
528
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Returns the contract instance for a given address, if it's registered in the PXE.
|
|
534
|
+
* @param address - The contract address.
|
|
535
|
+
* @returns The contract instance if found, undefined otherwise.
|
|
536
|
+
*/
|
|
410
537
|
public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
|
|
411
538
|
return this.contractStore.getContractInstance(address);
|
|
412
539
|
}
|
|
@@ -456,6 +583,12 @@ export class PXE {
|
|
|
456
583
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
457
584
|
*/
|
|
458
585
|
public async registerSender(sender: AztecAddress): Promise<AztecAddress> {
|
|
586
|
+
if (!(await sender.isValid())) {
|
|
587
|
+
throw new Error(
|
|
588
|
+
`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
|
|
459
592
|
const accounts = await this.keyStore.getAccounts();
|
|
460
593
|
if (accounts.includes(sender)) {
|
|
461
594
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
@@ -466,6 +599,9 @@ export class PXE {
|
|
|
466
599
|
|
|
467
600
|
if (wasAdded) {
|
|
468
601
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
602
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
603
|
+
// all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
|
|
604
|
+
await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
|
|
469
605
|
} else {
|
|
470
606
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
471
607
|
}
|
|
@@ -515,8 +651,7 @@ export class PXE {
|
|
|
515
651
|
* @param artifact - The build artifact for the contract class.
|
|
516
652
|
*/
|
|
517
653
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
518
|
-
const
|
|
519
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
654
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
520
655
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
521
656
|
}
|
|
522
657
|
|
|
@@ -535,17 +670,17 @@ export class PXE {
|
|
|
535
670
|
if (artifact) {
|
|
536
671
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
537
672
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
538
|
-
|
|
539
|
-
if (!contractClassId.equals(instance.currentContractClassId)) {
|
|
673
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
540
674
|
throw new Error(
|
|
541
|
-
`Artifact does not match expected class id (computed ${
|
|
675
|
+
`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
|
|
542
676
|
);
|
|
543
677
|
}
|
|
544
678
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
545
679
|
if (!computedAddress.equals(instance.address)) {
|
|
546
680
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
547
681
|
}
|
|
548
|
-
|
|
682
|
+
|
|
683
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
549
684
|
|
|
550
685
|
const publicFunctionSignatures = artifact.functions
|
|
551
686
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
@@ -594,15 +729,16 @@ export class PXE {
|
|
|
594
729
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
595
730
|
}
|
|
596
731
|
|
|
597
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
598
|
-
|
|
599
732
|
const publicFunctionSignatures = artifact.functions
|
|
600
733
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
601
734
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
602
735
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
603
736
|
|
|
604
737
|
currentInstance.currentContractClassId = contractClass.id;
|
|
605
|
-
await
|
|
738
|
+
await Promise.all([
|
|
739
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
740
|
+
this.contractStore.addContractInstance(currentInstance),
|
|
741
|
+
]);
|
|
606
742
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
607
743
|
});
|
|
608
744
|
}
|
|
@@ -620,11 +756,12 @@ export class PXE {
|
|
|
620
756
|
* (where validators prove the public portion).
|
|
621
757
|
*
|
|
622
758
|
* @param txRequest - An authenticated tx request ready for proving
|
|
759
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
623
760
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
624
761
|
* @throws If contract code not found, or public simulation reverts.
|
|
625
762
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
626
763
|
*/
|
|
627
|
-
public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
|
|
764
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
628
765
|
let privateExecutionResult: PrivateExecutionResult;
|
|
629
766
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
630
767
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -633,16 +770,24 @@ export class PXE {
|
|
|
633
770
|
try {
|
|
634
771
|
const syncTimer = new Timer();
|
|
635
772
|
await this.blockStateSynchronizer.sync();
|
|
773
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
636
774
|
const syncTime = syncTimer.ms();
|
|
637
775
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
638
|
-
privateExecutionResult = await this.#executePrivate(
|
|
776
|
+
privateExecutionResult = await this.#executePrivate({
|
|
777
|
+
contractFunctionSimulator,
|
|
778
|
+
txRequest,
|
|
779
|
+
anchorBlockHeader,
|
|
780
|
+
scopes,
|
|
781
|
+
jobId,
|
|
782
|
+
senderForTags,
|
|
783
|
+
});
|
|
639
784
|
|
|
640
785
|
const {
|
|
641
786
|
publicInputs,
|
|
642
787
|
chonkProof,
|
|
643
788
|
executionSteps,
|
|
644
789
|
timings: { proving } = {},
|
|
645
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
790
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
646
791
|
simulate: false,
|
|
647
792
|
skipFeeEnforcement: false,
|
|
648
793
|
profileMode: 'none',
|
|
@@ -677,17 +822,17 @@ export class PXE {
|
|
|
677
822
|
// transaction before this one is included in a block from this PXE, and that transaction contains a log with
|
|
678
823
|
// a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
|
|
679
824
|
// storing the tags here prevents linkage of txs sent from the same PXE.
|
|
680
|
-
const
|
|
681
|
-
if (
|
|
825
|
+
const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
|
|
826
|
+
if (taggingIndexRangesUsedInTheTx.length > 0) {
|
|
682
827
|
// TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
|
|
683
828
|
const txHash = (await txProvingResult.toTx()).txHash;
|
|
684
829
|
|
|
685
|
-
await this.senderTaggingStore.storePendingIndexes(
|
|
686
|
-
this.log.debug(`Stored used
|
|
687
|
-
|
|
830
|
+
await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
|
|
831
|
+
this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
|
|
832
|
+
taggingIndexRangesUsedInTheTx,
|
|
688
833
|
});
|
|
689
834
|
} else {
|
|
690
|
-
this.log.debug(`No
|
|
835
|
+
this.log.debug(`No tagging index ranges used in the tx`);
|
|
691
836
|
}
|
|
692
837
|
|
|
693
838
|
return txProvingResult;
|
|
@@ -699,17 +844,13 @@ export class PXE {
|
|
|
699
844
|
|
|
700
845
|
/**
|
|
701
846
|
* Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
|
|
702
|
-
*
|
|
703
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
704
|
-
* @param msgSender - (Optional) The message sender to use for the simulation.
|
|
705
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
847
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
706
848
|
* @returns A trace of the program execution with gate counts.
|
|
707
849
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
708
850
|
*/
|
|
709
851
|
public profileTx(
|
|
710
852
|
txRequest: TxExecutionRequest,
|
|
711
|
-
profileMode
|
|
712
|
-
skipProofGeneration: boolean = true,
|
|
853
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
713
854
|
): Promise<TxProfileResult> {
|
|
714
855
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
715
856
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -729,20 +870,24 @@ export class PXE {
|
|
|
729
870
|
);
|
|
730
871
|
const syncTimer = new Timer();
|
|
731
872
|
await this.blockStateSynchronizer.sync();
|
|
873
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
732
874
|
const syncTime = syncTimer.ms();
|
|
733
875
|
|
|
734
876
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
735
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
877
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
736
878
|
contractFunctionSimulator,
|
|
737
879
|
txRequest,
|
|
738
|
-
|
|
880
|
+
anchorBlockHeader,
|
|
881
|
+
scopes,
|
|
739
882
|
jobId,
|
|
740
|
-
|
|
883
|
+
senderForTags,
|
|
884
|
+
});
|
|
741
885
|
|
|
742
886
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
743
887
|
txRequest,
|
|
744
888
|
this.proofCreator,
|
|
745
889
|
privateExecutionResult,
|
|
890
|
+
anchorBlockHeader,
|
|
746
891
|
{
|
|
747
892
|
simulate: skipProofGeneration,
|
|
748
893
|
skipFeeEnforcement: false,
|
|
@@ -794,12 +939,7 @@ export class PXE {
|
|
|
794
939
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
795
940
|
*
|
|
796
941
|
*
|
|
797
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
798
|
-
* @param simulatePublic - Whether to simulate the public part of the transaction.
|
|
799
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
800
|
-
* @param skipFeeEnforcement - (Optional) If false, fees are enforced.
|
|
801
|
-
* @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
|
|
802
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
942
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
803
943
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
804
944
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
805
945
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
@@ -808,11 +948,15 @@ export class PXE {
|
|
|
808
948
|
*/
|
|
809
949
|
public simulateTx(
|
|
810
950
|
txRequest: TxExecutionRequest,
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
951
|
+
{
|
|
952
|
+
simulatePublic,
|
|
953
|
+
skipTxValidation = false,
|
|
954
|
+
skipFeeEnforcement = false,
|
|
955
|
+
skipKernels = true,
|
|
956
|
+
overrides,
|
|
957
|
+
scopes,
|
|
958
|
+
senderForTags,
|
|
959
|
+
}: SimulateTxOpts,
|
|
816
960
|
): Promise<TxSimulationResult> {
|
|
817
961
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
818
962
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -834,16 +978,34 @@ export class PXE {
|
|
|
834
978
|
);
|
|
835
979
|
const syncTimer = new Timer();
|
|
836
980
|
await this.blockStateSynchronizer.sync();
|
|
981
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
837
982
|
const syncTime = syncTimer.ms();
|
|
838
983
|
|
|
984
|
+
const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
|
|
985
|
+
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
986
|
+
|
|
987
|
+
if (hasOverriddenContracts && !skipKernels) {
|
|
988
|
+
throw new Error(
|
|
989
|
+
'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
|
|
990
|
+
);
|
|
991
|
+
}
|
|
839
992
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
993
|
+
|
|
994
|
+
if (hasOverriddenContracts) {
|
|
995
|
+
// Overridden contracts don't have a sync function, so calling sync on them would fail.
|
|
996
|
+
// We exclude them so the sync service skips them entirely.
|
|
997
|
+
this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
|
|
998
|
+
}
|
|
844
999
|
|
|
845
1000
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
846
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1001
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1002
|
+
contractFunctionSimulator,
|
|
1003
|
+
txRequest,
|
|
1004
|
+
anchorBlockHeader,
|
|
1005
|
+
scopes,
|
|
1006
|
+
jobId,
|
|
1007
|
+
senderForTags,
|
|
1008
|
+
});
|
|
847
1009
|
|
|
848
1010
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
849
1011
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -851,15 +1013,22 @@ export class PXE {
|
|
|
851
1013
|
if (skipKernels) {
|
|
852
1014
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
853
1015
|
privateExecutionResult,
|
|
854
|
-
this.contractStore,
|
|
1016
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
1017
|
+
this.node,
|
|
855
1018
|
));
|
|
856
1019
|
} else {
|
|
857
1020
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
858
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
1021
|
+
({ publicInputs, executionSteps } = await this.#prove(
|
|
1022
|
+
txRequest,
|
|
1023
|
+
this.proofCreator,
|
|
1024
|
+
privateExecutionResult,
|
|
1025
|
+
anchorBlockHeader,
|
|
1026
|
+
{
|
|
1027
|
+
simulate: true,
|
|
1028
|
+
skipFeeEnforcement,
|
|
1029
|
+
profileMode: 'none',
|
|
1030
|
+
},
|
|
1031
|
+
));
|
|
863
1032
|
}
|
|
864
1033
|
|
|
865
1034
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -870,6 +1039,9 @@ export class PXE {
|
|
|
870
1039
|
const publicSimulationTimer = new Timer();
|
|
871
1040
|
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
872
1041
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
1042
|
+
if (publicOutput?.debugLogs?.length) {
|
|
1043
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
1044
|
+
}
|
|
873
1045
|
}
|
|
874
1046
|
|
|
875
1047
|
let validationTime: number | undefined;
|
|
@@ -878,7 +1050,8 @@ export class PXE {
|
|
|
878
1050
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
879
1051
|
validationTime = validationTimer.ms();
|
|
880
1052
|
if (validationResult.result === 'invalid') {
|
|
881
|
-
|
|
1053
|
+
const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
|
|
1054
|
+
throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
|
|
882
1055
|
}
|
|
883
1056
|
}
|
|
884
1057
|
|
|
@@ -929,29 +1102,23 @@ export class PXE {
|
|
|
929
1102
|
inspect(txRequest),
|
|
930
1103
|
`simulatePublic=${simulatePublic}`,
|
|
931
1104
|
`skipTxValidation=${skipTxValidation}`,
|
|
932
|
-
`scopes=${scopes
|
|
1105
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
933
1106
|
);
|
|
934
1107
|
}
|
|
935
1108
|
});
|
|
936
1109
|
}
|
|
937
1110
|
|
|
938
1111
|
/**
|
|
939
|
-
*
|
|
940
|
-
*
|
|
1112
|
+
* Executes a contract utility function.
|
|
941
1113
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
942
|
-
* @param authwits - (Optional) The authentication witnesses required for the function call.
|
|
943
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
|
|
944
|
-
* default to all.
|
|
945
|
-
* @returns The result of the utility function call, structured based on the function ABI.
|
|
946
1114
|
*/
|
|
947
|
-
public
|
|
1115
|
+
public executeUtility(
|
|
948
1116
|
call: FunctionCall,
|
|
949
|
-
authwits
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1117
|
+
{ authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
|
|
1118
|
+
): Promise<UtilityExecutionResult> {
|
|
1119
|
+
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
953
1120
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
954
|
-
// delete the same read value, or reading values that another
|
|
1121
|
+
// delete the same read value, or reading values that another execution is currently modifying).
|
|
955
1122
|
return this.#putInJobQueue(async jobId => {
|
|
956
1123
|
try {
|
|
957
1124
|
const totalTimer = new Timer();
|
|
@@ -962,16 +1129,17 @@ export class PXE {
|
|
|
962
1129
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
963
1130
|
|
|
964
1131
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
965
|
-
await ensureContractSynced(
|
|
1132
|
+
await this.contractSyncService.ensureContractSynced(
|
|
966
1133
|
call.to,
|
|
967
1134
|
call.selector,
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
this.contractStore,
|
|
1135
|
+
(privateSyncCall, execScopes) =>
|
|
1136
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
971
1137
|
anchorBlockHeader,
|
|
1138
|
+
jobId,
|
|
1139
|
+
scopes,
|
|
972
1140
|
);
|
|
973
1141
|
|
|
974
|
-
const executionResult = await this.#
|
|
1142
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
975
1143
|
contractFunctionSimulator,
|
|
976
1144
|
call,
|
|
977
1145
|
authwits ?? [],
|
|
@@ -992,14 +1160,19 @@ export class PXE {
|
|
|
992
1160
|
};
|
|
993
1161
|
|
|
994
1162
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
995
|
-
return {
|
|
1163
|
+
return {
|
|
1164
|
+
result: executionResult,
|
|
1165
|
+
offchainEffects,
|
|
1166
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1167
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1168
|
+
};
|
|
996
1169
|
} catch (err: any) {
|
|
997
1170
|
const { to, name, args } = call;
|
|
998
1171
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
999
1172
|
throw this.#contextualizeError(
|
|
1000
1173
|
err,
|
|
1001
|
-
`
|
|
1002
|
-
`scopes=${scopes
|
|
1174
|
+
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1175
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1003
1176
|
);
|
|
1004
1177
|
}
|
|
1005
1178
|
});
|
|
@@ -1032,14 +1205,14 @@ export class PXE {
|
|
|
1032
1205
|
|
|
1033
1206
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1034
1207
|
|
|
1035
|
-
await ensureContractSynced(
|
|
1208
|
+
await this.contractSyncService.ensureContractSynced(
|
|
1036
1209
|
filter.contractAddress,
|
|
1037
1210
|
null,
|
|
1038
|
-
async privateSyncCall =>
|
|
1039
|
-
await this.#
|
|
1040
|
-
this.node,
|
|
1041
|
-
this.contractStore,
|
|
1211
|
+
async (privateSyncCall, execScopes) =>
|
|
1212
|
+
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1042
1213
|
anchorBlockHeader,
|
|
1214
|
+
jobId,
|
|
1215
|
+
filter.scopes,
|
|
1043
1216
|
);
|
|
1044
1217
|
});
|
|
1045
1218
|
|
|
@@ -1054,9 +1227,11 @@ export class PXE {
|
|
|
1054
1227
|
}
|
|
1055
1228
|
|
|
1056
1229
|
/**
|
|
1057
|
-
* Stops the PXE's job queue.
|
|
1230
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1058
1231
|
*/
|
|
1059
|
-
public stop(): Promise<void> {
|
|
1060
|
-
|
|
1232
|
+
public async stop(): Promise<void> {
|
|
1233
|
+
await this.jobQueue.end();
|
|
1234
|
+
await this.blockStateSynchronizer.stop();
|
|
1235
|
+
await this.db.close();
|
|
1061
1236
|
}
|
|
1062
1237
|
}
|