@aztec/pxe 0.0.1-commit.d431d1c → 0.0.1-commit.d939eb5aa
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 +5 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +68 -16
- package/dest/config/index.d.ts +4 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +12 -2
- 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 +206 -78
- 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 +5 -7
- 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 +9 -11
- 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 +5 -8
- 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 +7 -12
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +65 -46
- 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 +75 -42
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +319 -112
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -40
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +59 -77
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +120 -86
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +134 -67
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +337 -151
- 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_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/helpers.js +60 -0
- package/dest/debug/pxe_debug_utils.d.ts +24 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +28 -17
- package/dest/entrypoints/client/bundle/index.d.ts +3 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +2 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +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 -2
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -1
- 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 +6 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +21 -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 +50 -64
- 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 +8 -8
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +29 -19
- 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 -9
- 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 +8 -4
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +7 -3
- package/dest/pxe.d.ts +74 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +142 -80
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
- package/dest/storage/capsule_store/capsule_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 +39 -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 -16
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +157 -84
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +47 -49
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +278 -252
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +198 -147
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +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 +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +60 -0
- package/dest/tagging/index.d.ts +4 -3
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -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 -21
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -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 +16 -12
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -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 +23 -16
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +6 -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 +42 -27
- package/package.json +25 -16
- package/src/bin/check_oracle_version.ts +5 -4
- package/src/block_synchronizer/block_synchronizer.ts +82 -33
- package/src/config/index.ts +9 -1
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +366 -142
- 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 +10 -10
- 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 +5 -11
- package/src/contract_function_simulator/oracle/interfaces.ts +95 -58
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
- package/src/contract_function_simulator/oracle/oracle.ts +404 -150
- package/src/contract_function_simulator/oracle/private_execution.ts +5 -64
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +160 -182
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +564 -182
- package/src/contract_function_simulator/pick_notes.ts +9 -2
- 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/helpers.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +63 -18
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +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 -1
- package/src/entrypoints/server/utils.ts +24 -29
- package/src/events/event_service.ts +22 -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 +93 -105
- package/src/messages/message_context_service.ts +44 -0
- package/src/notes/note_service.ts +38 -26
- package/src/notes_filter.ts +24 -0
- package/src/oracle_version.ts +20 -9
- 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 +9 -9
- package/src/pxe.ts +272 -126
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +42 -34
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +186 -96
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +318 -318
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +250 -190
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- 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 +92 -0
- package/src/tagging/index.ts +3 -2
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +19 -24
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +17 -16
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +25 -10
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +29 -26
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +39 -29
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.d.ts +0 -50
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -75
- package/src/tree_membership/tree_membership_service.ts +0 -97
package/dest/pxe.js
CHANGED
|
@@ -5,7 +5,6 @@ import { KeyStore } from '@aztec/key-store';
|
|
|
5
5
|
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
6
6
|
import { protocolContractNames } from '@aztec/protocol-contracts';
|
|
7
7
|
import { FunctionType, decodeFunctionSignature } from '@aztec/stdlib/abi';
|
|
8
|
-
import { L2BlockHash } from '@aztec/stdlib/block';
|
|
9
8
|
import { computeContractAddressFromInstance, getContractClassFromArtifact } from '@aztec/stdlib/contract';
|
|
10
9
|
import { SimulationError } from '@aztec/stdlib/errors';
|
|
11
10
|
import { PrivateSimulationResult, TxProfileResult, TxProvingResult, TxSimulationResult } from '@aztec/stdlib/tx';
|
|
@@ -13,12 +12,15 @@ import { inspect } from 'util';
|
|
|
13
12
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
14
13
|
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
15
14
|
import { ContractFunctionSimulator, generateSimulatedProvingResult } from './contract_function_simulator/contract_function_simulator.js';
|
|
16
|
-
import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
|
|
17
15
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
16
|
+
import { displayDebugLogs } from './contract_logging.js';
|
|
17
|
+
import { ContractSyncService } from './contract_sync/contract_sync_service.js';
|
|
18
|
+
import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
18
19
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
19
20
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
20
21
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
21
22
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
23
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
22
24
|
import { PrivateKernelExecutionProver } from './private_kernel/private_kernel_execution_prover.js';
|
|
23
25
|
import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
|
|
24
26
|
import { AddressStore } from './storage/address_store/address_store.js';
|
|
@@ -35,6 +37,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
35
37
|
* manage private state of users.
|
|
36
38
|
*/ export class PXE {
|
|
37
39
|
node;
|
|
40
|
+
db;
|
|
38
41
|
blockStateSynchronizer;
|
|
39
42
|
keyStore;
|
|
40
43
|
contractStore;
|
|
@@ -46,6 +49,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
46
49
|
recipientTaggingStore;
|
|
47
50
|
addressStore;
|
|
48
51
|
privateEventStore;
|
|
52
|
+
contractSyncService;
|
|
53
|
+
messageContextService;
|
|
54
|
+
l2TipsStore;
|
|
49
55
|
simulator;
|
|
50
56
|
proverEnabled;
|
|
51
57
|
proofCreator;
|
|
@@ -54,8 +60,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
54
60
|
jobQueue;
|
|
55
61
|
jobCoordinator;
|
|
56
62
|
debug;
|
|
57
|
-
constructor(node, blockStateSynchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debug){
|
|
63
|
+
constructor(node, db, blockStateSynchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, messageContextService, l2TipsStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debug){
|
|
58
64
|
this.node = node;
|
|
65
|
+
this.db = db;
|
|
59
66
|
this.blockStateSynchronizer = blockStateSynchronizer;
|
|
60
67
|
this.keyStore = keyStore;
|
|
61
68
|
this.contractStore = contractStore;
|
|
@@ -67,6 +74,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
67
74
|
this.recipientTaggingStore = recipientTaggingStore;
|
|
68
75
|
this.addressStore = addressStore;
|
|
69
76
|
this.privateEventStore = privateEventStore;
|
|
77
|
+
this.contractSyncService = contractSyncService;
|
|
78
|
+
this.messageContextService = messageContextService;
|
|
79
|
+
this.l2TipsStore = l2TipsStore;
|
|
70
80
|
this.simulator = simulator;
|
|
71
81
|
this.proverEnabled = proverEnabled;
|
|
72
82
|
this.proofCreator = proofCreator;
|
|
@@ -82,13 +92,16 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
82
92
|
* can be contacted.
|
|
83
93
|
*
|
|
84
94
|
* @returns A promise that resolves PXE is ready to be used.
|
|
85
|
-
*/ static async create(node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix) {
|
|
95
|
+
*/ static async create({ node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix }) {
|
|
96
|
+
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
97
|
+
const bindings = loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
|
|
86
98
|
const log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
|
|
87
|
-
const
|
|
99
|
+
const info = await node.getNodeInfo();
|
|
100
|
+
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
88
101
|
const addressStore = new AddressStore(store);
|
|
89
102
|
const privateEventStore = new PrivateEventStore(store);
|
|
90
103
|
const contractStore = new ContractStore(store);
|
|
91
|
-
const noteStore =
|
|
104
|
+
const noteStore = new NoteStore(store);
|
|
92
105
|
const anchorBlockStore = new AnchorBlockStore(store);
|
|
93
106
|
const senderTaggingStore = new SenderTaggingStore(store);
|
|
94
107
|
const senderAddressBookStore = new SenderAddressBookStore(store);
|
|
@@ -96,28 +109,46 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
96
109
|
const capsuleStore = new CapsuleStore(store);
|
|
97
110
|
const keyStore = new KeyStore(store);
|
|
98
111
|
const tipsStore = new L2TipsKVStore(store, 'pxe');
|
|
99
|
-
const
|
|
100
|
-
const
|
|
112
|
+
const contractSyncService = new ContractSyncService(node, contractStore, noteStore, createLogger('pxe:contract_sync', bindings));
|
|
113
|
+
const messageContextService = new MessageContextService(node);
|
|
114
|
+
const synchronizer = new BlockSynchronizer(node, store, anchorBlockStore, noteStore, privateEventStore, tipsStore, contractSyncService, config, bindings);
|
|
115
|
+
const jobCoordinator = new JobCoordinator(store, bindings);
|
|
101
116
|
jobCoordinator.registerStores([
|
|
102
117
|
capsuleStore,
|
|
103
118
|
senderTaggingStore,
|
|
104
119
|
recipientTaggingStore,
|
|
105
|
-
privateEventStore
|
|
120
|
+
privateEventStore,
|
|
121
|
+
noteStore,
|
|
122
|
+
contractSyncService
|
|
106
123
|
]);
|
|
107
|
-
const debugUtils = new PXEDebugUtils(
|
|
124
|
+
const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
|
|
108
125
|
const jobQueue = new SerialQueue();
|
|
109
|
-
const pxe = new PXE(node, synchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debugUtils);
|
|
110
|
-
debugUtils.
|
|
126
|
+
const pxe = new PXE(node, store, synchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, messageContextService, tipsStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debugUtils);
|
|
127
|
+
debugUtils.setPXEHelpers(pxe.#putInJobQueue.bind(pxe), pxe.#getSimulatorForTx.bind(pxe), pxe.#executeUtility.bind(pxe));
|
|
111
128
|
pxe.jobQueue.start();
|
|
112
129
|
await pxe.#registerProtocolContracts();
|
|
113
|
-
const info = await node.getNodeInfo();
|
|
114
130
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
115
131
|
return pxe;
|
|
116
132
|
}
|
|
117
133
|
// Internal methods
|
|
118
134
|
#getSimulatorForTx(overrides) {
|
|
119
135
|
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
120
|
-
return new ContractFunctionSimulator(
|
|
136
|
+
return new ContractFunctionSimulator({
|
|
137
|
+
contractStore: proxyContractStore,
|
|
138
|
+
noteStore: this.noteStore,
|
|
139
|
+
keyStore: this.keyStore,
|
|
140
|
+
addressStore: this.addressStore,
|
|
141
|
+
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
142
|
+
l2TipsStore: this.l2TipsStore,
|
|
143
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
144
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
145
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
146
|
+
capsuleStore: this.capsuleStore,
|
|
147
|
+
privateEventStore: this.privateEventStore,
|
|
148
|
+
simulator: this.simulator,
|
|
149
|
+
contractSyncService: this.contractSyncService,
|
|
150
|
+
messageContextService: this.messageContextService
|
|
151
|
+
});
|
|
121
152
|
}
|
|
122
153
|
#contextualizeError(err, ...context) {
|
|
123
154
|
let contextStr = '';
|
|
@@ -160,8 +191,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
160
191
|
async #registerProtocolContracts() {
|
|
161
192
|
const registered = {};
|
|
162
193
|
for (const name of protocolContractNames){
|
|
163
|
-
const { address,
|
|
164
|
-
await this.contractStore.addContractArtifact(
|
|
194
|
+
const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
195
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
165
196
|
await this.contractStore.addContractInstance(instance);
|
|
166
197
|
registered[name] = address.toString();
|
|
167
198
|
}
|
|
@@ -173,9 +204,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
173
204
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
174
205
|
try {
|
|
175
206
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
207
|
+
await this.contractSyncService.ensureContractSynced(contractAddress, functionSelector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
|
|
208
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
209
|
+
contractAddress,
|
|
210
|
+
selector: functionSelector,
|
|
211
|
+
anchorBlockHeader,
|
|
212
|
+
scopes,
|
|
213
|
+
jobId
|
|
214
|
+
});
|
|
179
215
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
180
216
|
return result;
|
|
181
217
|
} catch (err) {
|
|
@@ -186,18 +222,22 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
186
222
|
}
|
|
187
223
|
}
|
|
188
224
|
/**
|
|
189
|
-
*
|
|
225
|
+
* Execute a utility function call on the given contract.
|
|
190
226
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
191
227
|
* @param call - The function call to execute.
|
|
192
228
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
193
229
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
194
230
|
* accounts if not specified.
|
|
195
231
|
* @param jobId - The job ID for staged writes.
|
|
196
|
-
* @returns The
|
|
197
|
-
*/ async #
|
|
232
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
233
|
+
*/ async #executeUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
|
|
198
234
|
try {
|
|
199
235
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
200
|
-
|
|
236
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
|
|
237
|
+
return {
|
|
238
|
+
result,
|
|
239
|
+
offchainEffects
|
|
240
|
+
};
|
|
201
241
|
} catch (err) {
|
|
202
242
|
if (err instanceof SimulationError) {
|
|
203
243
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -242,14 +282,26 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
242
282
|
* @returns An object that contains the output of the kernel execution, including the ChonkProof if proving is enabled.
|
|
243
283
|
*/ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, config) {
|
|
244
284
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
245
|
-
const anchorBlockHash =
|
|
285
|
+
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
246
286
|
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
247
|
-
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
|
|
287
|
+
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled, this.log.getBindings());
|
|
248
288
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
249
289
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
250
290
|
}
|
|
251
291
|
// Public API
|
|
252
|
-
|
|
292
|
+
/**
|
|
293
|
+
* Returns the block header up to which the PXE has synced.
|
|
294
|
+
* @returns The synced block header
|
|
295
|
+
*/ getSyncedBlockHeader() {
|
|
296
|
+
return this.#putInJobQueue(()=>{
|
|
297
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Returns the contract instance for a given address, if it's registered in the PXE.
|
|
302
|
+
* @param address - The contract address.
|
|
303
|
+
* @returns The contract instance if found, undefined otherwise.
|
|
304
|
+
*/ getContractInstance(address) {
|
|
253
305
|
return this.contractStore.getContractInstance(address);
|
|
254
306
|
}
|
|
255
307
|
/**
|
|
@@ -279,7 +331,6 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
279
331
|
this.log.debug(`Registered account\n ${accountCompleteAddress.toReadableString()}`);
|
|
280
332
|
}
|
|
281
333
|
await this.addressStore.addCompleteAddress(accountCompleteAddress);
|
|
282
|
-
await this.noteStore.addScope(accountCompleteAddress.address);
|
|
283
334
|
return accountCompleteAddress;
|
|
284
335
|
}
|
|
285
336
|
/**
|
|
@@ -292,6 +343,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
292
343
|
* @returns The address of the sender.
|
|
293
344
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
294
345
|
*/ async registerSender(sender) {
|
|
346
|
+
if (!await sender.isValid()) {
|
|
347
|
+
throw new Error(`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`);
|
|
348
|
+
}
|
|
295
349
|
const accounts = await this.keyStore.getAccounts();
|
|
296
350
|
if (accounts.includes(sender)) {
|
|
297
351
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
@@ -300,6 +354,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
300
354
|
const wasAdded = await this.senderAddressBookStore.addSender(sender);
|
|
301
355
|
if (wasAdded) {
|
|
302
356
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
357
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
358
|
+
// all contracts must re-sync to discover them.
|
|
359
|
+
this.contractSyncService.wipe();
|
|
303
360
|
} else {
|
|
304
361
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
305
362
|
}
|
|
@@ -337,8 +394,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
337
394
|
*
|
|
338
395
|
* @param artifact - The build artifact for the contract class.
|
|
339
396
|
*/ async registerContractClass(artifact) {
|
|
340
|
-
const
|
|
341
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
397
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
342
398
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
343
399
|
}
|
|
344
400
|
/**
|
|
@@ -354,15 +410,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
354
410
|
if (artifact) {
|
|
355
411
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
356
412
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
throw new Error(`Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`);
|
|
413
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
414
|
+
throw new Error(`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`);
|
|
360
415
|
}
|
|
361
416
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
362
417
|
if (!computedAddress.equals(instance.address)) {
|
|
363
418
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
364
419
|
}
|
|
365
|
-
await this.contractStore.addContractArtifact(
|
|
420
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
366
421
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
367
422
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
368
423
|
} else {
|
|
@@ -398,11 +453,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
398
453
|
if (!contractClass.id.equals(currentClassId)) {
|
|
399
454
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
400
455
|
}
|
|
401
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
402
456
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
403
457
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
404
458
|
currentInstance.currentContractClassId = contractClass.id;
|
|
405
|
-
await
|
|
459
|
+
await Promise.all([
|
|
460
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
461
|
+
this.contractStore.addContractInstance(currentInstance)
|
|
462
|
+
]);
|
|
406
463
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
407
464
|
});
|
|
408
465
|
}
|
|
@@ -417,10 +474,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
417
474
|
* (where validators prove the public portion).
|
|
418
475
|
*
|
|
419
476
|
* @param txRequest - An authenticated tx request ready for proving
|
|
477
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
420
478
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
421
479
|
* @throws If contract code not found, or public simulation reverts.
|
|
422
480
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
423
|
-
*/ proveTx(txRequest) {
|
|
481
|
+
*/ proveTx(txRequest, scopes) {
|
|
424
482
|
let privateExecutionResult;
|
|
425
483
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
426
484
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -431,7 +489,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
431
489
|
await this.blockStateSynchronizer.sync();
|
|
432
490
|
const syncTime = syncTimer.ms();
|
|
433
491
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
434
|
-
privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest,
|
|
492
|
+
privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
|
|
435
493
|
const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
436
494
|
simulate: false,
|
|
437
495
|
skipFeeEnforcement: false,
|
|
@@ -462,16 +520,16 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
462
520
|
// transaction before this one is included in a block from this PXE, and that transaction contains a log with
|
|
463
521
|
// a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
|
|
464
522
|
// storing the tags here prevents linkage of txs sent from the same PXE.
|
|
465
|
-
const
|
|
466
|
-
if (
|
|
523
|
+
const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
|
|
524
|
+
if (taggingIndexRangesUsedInTheTx.length > 0) {
|
|
467
525
|
// TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
|
|
468
526
|
const txHash = (await txProvingResult.toTx()).txHash;
|
|
469
|
-
await this.senderTaggingStore.storePendingIndexes(
|
|
470
|
-
this.log.debug(`Stored used
|
|
471
|
-
|
|
527
|
+
await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
|
|
528
|
+
this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
|
|
529
|
+
taggingIndexRangesUsedInTheTx
|
|
472
530
|
});
|
|
473
531
|
} else {
|
|
474
|
-
this.log.debug(`No
|
|
532
|
+
this.log.debug(`No tagging index ranges used in the tx`);
|
|
475
533
|
}
|
|
476
534
|
return txProvingResult;
|
|
477
535
|
} catch (err) {
|
|
@@ -481,13 +539,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
481
539
|
}
|
|
482
540
|
/**
|
|
483
541
|
* Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
|
|
484
|
-
*
|
|
485
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
486
|
-
* @param msgSender - (Optional) The message sender to use for the simulation.
|
|
487
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
542
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
488
543
|
* @returns A trace of the program execution with gate counts.
|
|
489
544
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
490
|
-
*/ profileTx(txRequest, profileMode, skipProofGeneration = true) {
|
|
545
|
+
*/ profileTx(txRequest, { profileMode, skipProofGeneration = true, scopes }) {
|
|
491
546
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
492
547
|
return this.#putInJobQueue(async (jobId)=>{
|
|
493
548
|
const totalTimer = new Timer();
|
|
@@ -505,7 +560,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
505
560
|
await this.blockStateSynchronizer.sync();
|
|
506
561
|
const syncTime = syncTimer.ms();
|
|
507
562
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
508
|
-
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest,
|
|
563
|
+
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
|
|
509
564
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
510
565
|
simulate: skipProofGeneration,
|
|
511
566
|
skipFeeEnforcement: false,
|
|
@@ -550,18 +605,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
550
605
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
551
606
|
*
|
|
552
607
|
*
|
|
553
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
554
|
-
* @param simulatePublic - Whether to simulate the public part of the transaction.
|
|
555
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
556
|
-
* @param skipFeeEnforcement - (Optional) If false, fees are enforced.
|
|
557
|
-
* @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
|
|
558
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
608
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
559
609
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
560
610
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
561
611
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
562
612
|
*
|
|
563
613
|
* TODO(#7456) Prevent msgSender being defined here for the first call
|
|
564
|
-
*/ simulateTx(txRequest, simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes) {
|
|
614
|
+
*/ simulateTx(txRequest, { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, skipKernels = true, overrides, scopes }) {
|
|
565
615
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
566
616
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
567
617
|
// delete the same read value, or reading values that another simulation is currently modifying).
|
|
@@ -580,17 +630,23 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
580
630
|
const syncTimer = new Timer();
|
|
581
631
|
await this.blockStateSynchronizer.sync();
|
|
582
632
|
const syncTime = syncTimer.ms();
|
|
633
|
+
const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
|
|
634
|
+
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
635
|
+
if (hasOverriddenContracts && !skipKernels) {
|
|
636
|
+
throw new Error('Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.');
|
|
637
|
+
}
|
|
583
638
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
639
|
+
if (hasOverriddenContracts) {
|
|
640
|
+
// Overridden contracts don't have a sync function, so calling sync on them would fail.
|
|
641
|
+
// We exclude them so the sync service skips them entirely.
|
|
642
|
+
this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
|
|
643
|
+
}
|
|
588
644
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
589
645
|
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
|
|
590
646
|
let publicInputs;
|
|
591
647
|
let executionSteps = [];
|
|
592
648
|
if (skipKernels) {
|
|
593
|
-
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, this.contractStore));
|
|
649
|
+
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, (addr, sel)=>this.contractStore.getDebugFunctionName(addr, sel), this.node));
|
|
594
650
|
} else {
|
|
595
651
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
596
652
|
({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
@@ -607,6 +663,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
607
663
|
const publicSimulationTimer = new Timer();
|
|
608
664
|
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
609
665
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
666
|
+
if (publicOutput?.debugLogs?.length) {
|
|
667
|
+
await displayDebugLogs(publicOutput.debugLogs, (addr)=>this.contractStore.getDebugContractName(addr));
|
|
668
|
+
}
|
|
610
669
|
}
|
|
611
670
|
let validationTime;
|
|
612
671
|
if (!skipTxValidation) {
|
|
@@ -617,7 +676,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
617
676
|
});
|
|
618
677
|
validationTime = validationTimer.ms();
|
|
619
678
|
if (validationResult.result === 'invalid') {
|
|
620
|
-
|
|
679
|
+
const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
|
|
680
|
+
throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
|
|
621
681
|
}
|
|
622
682
|
}
|
|
623
683
|
const txHash = simulatedTx.getTxHash();
|
|
@@ -650,22 +710,19 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
650
710
|
nodeRPCCalls: simulatorStats.nodeRPCCalls
|
|
651
711
|
});
|
|
652
712
|
} catch (err) {
|
|
653
|
-
throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes
|
|
713
|
+
throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
|
|
654
714
|
}
|
|
655
715
|
});
|
|
656
716
|
}
|
|
657
717
|
/**
|
|
658
|
-
*
|
|
659
|
-
*
|
|
718
|
+
* Executes a contract utility function.
|
|
660
719
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
*/ simulateUtility(call, authwits, scopes) {
|
|
666
|
-
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
720
|
+
*/ executeUtility(call, { authwits, scopes } = {
|
|
721
|
+
scopes: []
|
|
722
|
+
}) {
|
|
723
|
+
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
667
724
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
668
|
-
// delete the same read value, or reading values that another
|
|
725
|
+
// delete the same read value, or reading values that another execution is currently modifying).
|
|
669
726
|
return this.#putInJobQueue(async (jobId)=>{
|
|
670
727
|
try {
|
|
671
728
|
const totalTimer = new Timer();
|
|
@@ -674,8 +731,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
674
731
|
const syncTime = syncTimer.ms();
|
|
675
732
|
const functionTimer = new Timer();
|
|
676
733
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
677
|
-
await this.
|
|
678
|
-
|
|
734
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
735
|
+
await this.contractSyncService.ensureContractSynced(call.to, call.selector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
|
|
736
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(contractFunctionSimulator, call, authwits ?? [], scopes, jobId);
|
|
679
737
|
const functionTime = functionTimer.ms();
|
|
680
738
|
const totalTime = totalTimer.ms();
|
|
681
739
|
const perFunction = [
|
|
@@ -693,6 +751,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
693
751
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
694
752
|
return {
|
|
695
753
|
result: executionResult,
|
|
754
|
+
offchainEffects,
|
|
755
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
696
756
|
stats: {
|
|
697
757
|
timings,
|
|
698
758
|
nodeRPCCalls: simulationStats.nodeRPCCalls
|
|
@@ -701,7 +761,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
701
761
|
} catch (err) {
|
|
702
762
|
const { to, name, args } = call;
|
|
703
763
|
const stringifiedArgs = args.map((arg)=>arg.toString()).join(', ');
|
|
704
|
-
throw this.#contextualizeError(err, `
|
|
764
|
+
throw this.#contextualizeError(err, `executeUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
|
|
705
765
|
}
|
|
706
766
|
});
|
|
707
767
|
}
|
|
@@ -721,9 +781,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
721
781
|
let anchorBlockNumber;
|
|
722
782
|
await this.#putInJobQueue(async (jobId)=>{
|
|
723
783
|
await this.blockStateSynchronizer.sync();
|
|
724
|
-
|
|
784
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
785
|
+
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
725
786
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
726
|
-
await this.
|
|
787
|
+
await this.contractSyncService.ensureContractSynced(filter.contractAddress, null, async (privateSyncCall, execScopes)=>await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes);
|
|
727
788
|
});
|
|
728
789
|
// anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
|
|
729
790
|
const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber).validate(filter);
|
|
@@ -731,8 +792,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
731
792
|
return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
|
|
732
793
|
}
|
|
733
794
|
/**
|
|
734
|
-
* Stops the PXE's job queue.
|
|
735
|
-
*/ stop() {
|
|
736
|
-
|
|
795
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
796
|
+
*/ async stop() {
|
|
797
|
+
await this.jobQueue.end();
|
|
798
|
+
await this.db.close();
|
|
737
799
|
}
|
|
738
800
|
}
|
|
@@ -8,4 +8,4 @@ export declare class AddressStore {
|
|
|
8
8
|
getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined>;
|
|
9
9
|
getCompleteAddresses(): Promise<CompleteAddress[]>;
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc19zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JhZ2UvYWRkcmVzc19zdG9yZS9hZGRyZXNzX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFtQixpQkFBaUIsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQscUJBQWEsWUFBWTs7SUFLdkIsWUFBWSxLQUFLLEVBQUUsaUJBQWlCLEVBS25DO0lBRUQsa0JBQWtCLENBQUMsZUFBZSxFQUFFLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBMEJyRTtJQUVELGtCQUFrQixDQUFDLE9BQU8sRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsQ0FVOUU7SUFFRCxvQkFBb0IsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FNakQ7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address_store.d.ts","sourceRoot":"","sources":["../../../src/storage/address_store/address_store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,qBAAa,YAAY;;IAKvB,YAAY,KAAK,EAAE,iBAAiB,EAKnC;IAED,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BrE;
|
|
1
|
+
{"version":3,"file":"address_store.d.ts","sourceRoot":"","sources":["../../../src/storage/address_store/address_store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,qBAAa,YAAY;;IAKvB,YAAY,KAAK,EAAE,iBAAiB,EAKnC;IAED,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BrE;IAED,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAU9E;IAED,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAMjD;CACF"}
|
|
@@ -30,18 +30,19 @@ export class AddressStore {
|
|
|
30
30
|
}
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
-
async #getCompleteAddress(address) {
|
|
34
|
-
const index = await this.#completeAddressIndex.getAsync(address.toString());
|
|
35
|
-
if (index === undefined) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
const value = await this.#completeAddresses.atAsync(index);
|
|
39
|
-
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
40
|
-
}
|
|
41
33
|
getCompleteAddress(account) {
|
|
42
|
-
return this.#
|
|
34
|
+
return this.#store.transactionAsync(async ()=>{
|
|
35
|
+
const index = await this.#completeAddressIndex.getAsync(account.toString());
|
|
36
|
+
if (index === undefined) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const value = await this.#completeAddresses.atAsync(index);
|
|
40
|
+
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
41
|
+
});
|
|
43
42
|
}
|
|
44
|
-
|
|
45
|
-
return
|
|
43
|
+
getCompleteAddresses() {
|
|
44
|
+
return this.#store.transactionAsync(async ()=>{
|
|
45
|
+
return await Promise.all((await toArray(this.#completeAddresses.valuesAsync())).map((v)=>CompleteAddress.fromBuffer(v)));
|
|
46
|
+
});
|
|
46
47
|
}
|
|
47
48
|
}
|
|
@@ -3,7 +3,15 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
3
3
|
export declare class AnchorBlockStore {
|
|
4
4
|
#private;
|
|
5
5
|
constructor(store: AztecAsyncKVStore);
|
|
6
|
+
/**
|
|
7
|
+
* Sets the currently synchronized block
|
|
8
|
+
*
|
|
9
|
+
* Important: this method is only called from BlockSynchronizer, and since we need it to run atomically with other
|
|
10
|
+
* stores in the case of a reorg, it MUST NOT be wrapped in a `transactionAsync` call. Doing so would result in a
|
|
11
|
+
* deadlock when the backend is IndexedDB, because `transactionAsync` is not designed to support reentrancy.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
6
14
|
setHeader(header: BlockHeader): Promise<void>;
|
|
7
15
|
getBlockHeader(): Promise<BlockHeader>;
|
|
8
16
|
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yX2Jsb2NrX3N0b3JlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmFnZS9hbmNob3JfYmxvY2tfc3RvcmUvYW5jaG9yX2Jsb2NrX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxxQkFBYSxnQkFBZ0I7O0lBSTNCLFlBQVksS0FBSyxFQUFFLGlCQUFpQixFQUduQztJQUVEOzs7Ozs7O09BT0c7SUFDRyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRWxEO0lBRUssY0FBYyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FPM0M7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor_block_store.d.ts","sourceRoot":"","sources":["../../../src/storage/anchor_block_store/anchor_block_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,gBAAgB;;IAI3B,YAAY,KAAK,EAAE,iBAAiB,EAGnC;
|
|
1
|
+
{"version":3,"file":"anchor_block_store.d.ts","sourceRoot":"","sources":["../../../src/storage/anchor_block_store/anchor_block_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,gBAAgB;;IAI3B,YAAY,KAAK,EAAE,iBAAiB,EAGnC;IAED;;;;;;;OAOG;IACG,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAElD;IAEK,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAO3C;CACF"}
|
|
@@ -6,7 +6,14 @@ export class AnchorBlockStore {
|
|
|
6
6
|
this.#store = store;
|
|
7
7
|
this.#synchronizedHeader = this.#store.openSingleton('header');
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Sets the currently synchronized block
|
|
11
|
+
*
|
|
12
|
+
* Important: this method is only called from BlockSynchronizer, and since we need it to run atomically with other
|
|
13
|
+
* stores in the case of a reorg, it MUST NOT be wrapped in a `transactionAsync` call. Doing so would result in a
|
|
14
|
+
* deadlock when the backend is IndexedDB, because `transactionAsync` is not designed to support reentrancy.
|
|
15
|
+
*
|
|
16
|
+
*/ async setHeader(header) {
|
|
10
17
|
await this.#synchronizedHeader.set(header.toBuffer());
|
|
11
18
|
}
|
|
12
19
|
async getBlockHeader() {
|