@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/dest/pxe.js
CHANGED
|
@@ -13,11 +13,14 @@ import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
|
13
13
|
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
14
14
|
import { ContractFunctionSimulator, generateSimulatedProvingResult } from './contract_function_simulator/contract_function_simulator.js';
|
|
15
15
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
16
|
-
import {
|
|
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';
|
|
17
19
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
18
20
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
19
21
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
20
22
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
23
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
21
24
|
import { PrivateKernelExecutionProver } from './private_kernel/private_kernel_execution_prover.js';
|
|
22
25
|
import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
|
|
23
26
|
import { AddressStore } from './storage/address_store/address_store.js';
|
|
@@ -34,6 +37,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
34
37
|
* manage private state of users.
|
|
35
38
|
*/ export class PXE {
|
|
36
39
|
node;
|
|
40
|
+
db;
|
|
37
41
|
blockStateSynchronizer;
|
|
38
42
|
keyStore;
|
|
39
43
|
contractStore;
|
|
@@ -45,6 +49,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
45
49
|
recipientTaggingStore;
|
|
46
50
|
addressStore;
|
|
47
51
|
privateEventStore;
|
|
52
|
+
contractSyncService;
|
|
53
|
+
messageContextService;
|
|
54
|
+
l2TipsStore;
|
|
48
55
|
simulator;
|
|
49
56
|
proverEnabled;
|
|
50
57
|
proofCreator;
|
|
@@ -53,8 +60,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
53
60
|
jobQueue;
|
|
54
61
|
jobCoordinator;
|
|
55
62
|
debug;
|
|
56
|
-
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){
|
|
57
64
|
this.node = node;
|
|
65
|
+
this.db = db;
|
|
58
66
|
this.blockStateSynchronizer = blockStateSynchronizer;
|
|
59
67
|
this.keyStore = keyStore;
|
|
60
68
|
this.contractStore = contractStore;
|
|
@@ -66,6 +74,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
66
74
|
this.recipientTaggingStore = recipientTaggingStore;
|
|
67
75
|
this.addressStore = addressStore;
|
|
68
76
|
this.privateEventStore = privateEventStore;
|
|
77
|
+
this.contractSyncService = contractSyncService;
|
|
78
|
+
this.messageContextService = messageContextService;
|
|
79
|
+
this.l2TipsStore = l2TipsStore;
|
|
69
80
|
this.simulator = simulator;
|
|
70
81
|
this.proverEnabled = proverEnabled;
|
|
71
82
|
this.proofCreator = proofCreator;
|
|
@@ -81,9 +92,12 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
81
92
|
* can be contacted.
|
|
82
93
|
*
|
|
83
94
|
* @returns A promise that resolves PXE is ready to be used.
|
|
84
|
-
*/ 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;
|
|
85
98
|
const log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
|
|
86
|
-
const
|
|
99
|
+
const info = await node.getNodeInfo();
|
|
100
|
+
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
87
101
|
const addressStore = new AddressStore(store);
|
|
88
102
|
const privateEventStore = new PrivateEventStore(store);
|
|
89
103
|
const contractStore = new ContractStore(store);
|
|
@@ -95,29 +109,46 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
95
109
|
const capsuleStore = new CapsuleStore(store);
|
|
96
110
|
const keyStore = new KeyStore(store);
|
|
97
111
|
const tipsStore = new L2TipsKVStore(store, 'pxe');
|
|
98
|
-
const
|
|
99
|
-
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);
|
|
100
116
|
jobCoordinator.registerStores([
|
|
101
117
|
capsuleStore,
|
|
102
118
|
senderTaggingStore,
|
|
103
119
|
recipientTaggingStore,
|
|
104
120
|
privateEventStore,
|
|
105
|
-
noteStore
|
|
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
|
}
|
|
@@ -169,14 +200,18 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
169
200
|
}
|
|
170
201
|
// Executes the entrypoint private function, as well as all nested private
|
|
171
202
|
// functions that might arise.
|
|
172
|
-
async #executePrivate(contractFunctionSimulator, txRequest, scopes, jobId) {
|
|
203
|
+
async #executePrivate({ contractFunctionSimulator, txRequest, anchorBlockHeader, scopes, jobId, senderForTags }) {
|
|
173
204
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
174
205
|
try {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
206
|
+
await this.contractSyncService.ensureContractSynced(contractAddress, functionSelector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
|
|
207
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
208
|
+
contractAddress,
|
|
209
|
+
selector: functionSelector,
|
|
210
|
+
anchorBlockHeader,
|
|
211
|
+
scopes,
|
|
212
|
+
jobId,
|
|
213
|
+
senderForTags
|
|
214
|
+
});
|
|
180
215
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
181
216
|
return result;
|
|
182
217
|
} catch (err) {
|
|
@@ -187,18 +222,22 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
187
222
|
}
|
|
188
223
|
}
|
|
189
224
|
/**
|
|
190
|
-
*
|
|
225
|
+
* Execute a utility function call on the given contract.
|
|
191
226
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
192
227
|
* @param call - The function call to execute.
|
|
193
228
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
194
229
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
195
230
|
* accounts if not specified.
|
|
196
231
|
* @param jobId - The job ID for staged writes.
|
|
197
|
-
* @returns The
|
|
198
|
-
*/ async #
|
|
232
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
233
|
+
*/ async #executeUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
|
|
199
234
|
try {
|
|
200
235
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
201
|
-
|
|
236
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
|
|
237
|
+
return {
|
|
238
|
+
result,
|
|
239
|
+
offchainEffects
|
|
240
|
+
};
|
|
202
241
|
} catch (err) {
|
|
203
242
|
if (err instanceof SimulationError) {
|
|
204
243
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -241,16 +280,26 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
241
280
|
* @param privateExecutionResult - The result of the private execution
|
|
242
281
|
* @param config - The configuration for the kernel execution prover.
|
|
243
282
|
* @returns An object that contains the output of the kernel execution, including the ChonkProof if proving is enabled.
|
|
244
|
-
*/ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, config) {
|
|
245
|
-
const
|
|
246
|
-
const
|
|
247
|
-
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
248
|
-
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
|
|
283
|
+
*/ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, anchorBlockHeader, config) {
|
|
284
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
285
|
+
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled, this.log.getBindings());
|
|
249
286
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
250
287
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
251
288
|
}
|
|
252
289
|
// Public API
|
|
253
|
-
|
|
290
|
+
/**
|
|
291
|
+
* Returns the block header up to which the PXE has synced.
|
|
292
|
+
* @returns The synced block header
|
|
293
|
+
*/ getSyncedBlockHeader() {
|
|
294
|
+
return this.#putInJobQueue(()=>{
|
|
295
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Returns the contract instance for a given address, if it's registered in the PXE.
|
|
300
|
+
* @param address - The contract address.
|
|
301
|
+
* @returns The contract instance if found, undefined otherwise.
|
|
302
|
+
*/ getContractInstance(address) {
|
|
254
303
|
return this.contractStore.getContractInstance(address);
|
|
255
304
|
}
|
|
256
305
|
/**
|
|
@@ -292,6 +341,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
292
341
|
* @returns The address of the sender.
|
|
293
342
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
294
343
|
*/ async registerSender(sender) {
|
|
344
|
+
if (!await sender.isValid()) {
|
|
345
|
+
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.`);
|
|
346
|
+
}
|
|
295
347
|
const accounts = await this.keyStore.getAccounts();
|
|
296
348
|
if (accounts.includes(sender)) {
|
|
297
349
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
@@ -300,6 +352,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
300
352
|
const wasAdded = await this.senderAddressBookStore.addSender(sender);
|
|
301
353
|
if (wasAdded) {
|
|
302
354
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
355
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
356
|
+
// all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
|
|
357
|
+
await this.#putInJobQueue(()=>Promise.resolve(this.contractSyncService.wipe()));
|
|
303
358
|
} else {
|
|
304
359
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
305
360
|
}
|
|
@@ -337,8 +392,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
337
392
|
*
|
|
338
393
|
* @param artifact - The build artifact for the contract class.
|
|
339
394
|
*/ async registerContractClass(artifact) {
|
|
340
|
-
const
|
|
341
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
395
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
342
396
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
343
397
|
}
|
|
344
398
|
/**
|
|
@@ -354,15 +408,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
354
408
|
if (artifact) {
|
|
355
409
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
356
410
|
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})`);
|
|
411
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
412
|
+
throw new Error(`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`);
|
|
360
413
|
}
|
|
361
414
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
362
415
|
if (!computedAddress.equals(instance.address)) {
|
|
363
416
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
364
417
|
}
|
|
365
|
-
await this.contractStore.addContractArtifact(
|
|
418
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
366
419
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
367
420
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
368
421
|
} else {
|
|
@@ -398,11 +451,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
398
451
|
if (!contractClass.id.equals(currentClassId)) {
|
|
399
452
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
400
453
|
}
|
|
401
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
402
454
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
403
455
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
404
456
|
currentInstance.currentContractClassId = contractClass.id;
|
|
405
|
-
await
|
|
457
|
+
await Promise.all([
|
|
458
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
459
|
+
this.contractStore.addContractInstance(currentInstance)
|
|
460
|
+
]);
|
|
406
461
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
407
462
|
});
|
|
408
463
|
}
|
|
@@ -417,10 +472,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
417
472
|
* (where validators prove the public portion).
|
|
418
473
|
*
|
|
419
474
|
* @param txRequest - An authenticated tx request ready for proving
|
|
475
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
420
476
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
421
477
|
* @throws If contract code not found, or public simulation reverts.
|
|
422
478
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
423
|
-
*/ proveTx(txRequest) {
|
|
479
|
+
*/ proveTx(txRequest, { scopes, senderForTags }) {
|
|
424
480
|
let privateExecutionResult;
|
|
425
481
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
426
482
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -429,10 +485,18 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
429
485
|
try {
|
|
430
486
|
const syncTimer = new Timer();
|
|
431
487
|
await this.blockStateSynchronizer.sync();
|
|
488
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
432
489
|
const syncTime = syncTimer.ms();
|
|
433
490
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
434
|
-
privateExecutionResult = await this.#executePrivate(
|
|
435
|
-
|
|
491
|
+
privateExecutionResult = await this.#executePrivate({
|
|
492
|
+
contractFunctionSimulator,
|
|
493
|
+
txRequest,
|
|
494
|
+
anchorBlockHeader,
|
|
495
|
+
scopes,
|
|
496
|
+
jobId,
|
|
497
|
+
senderForTags
|
|
498
|
+
});
|
|
499
|
+
const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
436
500
|
simulate: false,
|
|
437
501
|
skipFeeEnforcement: false,
|
|
438
502
|
profileMode: 'none'
|
|
@@ -462,16 +526,16 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
462
526
|
// transaction before this one is included in a block from this PXE, and that transaction contains a log with
|
|
463
527
|
// a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
|
|
464
528
|
// storing the tags here prevents linkage of txs sent from the same PXE.
|
|
465
|
-
const
|
|
466
|
-
if (
|
|
529
|
+
const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
|
|
530
|
+
if (taggingIndexRangesUsedInTheTx.length > 0) {
|
|
467
531
|
// TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
|
|
468
532
|
const txHash = (await txProvingResult.toTx()).txHash;
|
|
469
|
-
await this.senderTaggingStore.storePendingIndexes(
|
|
470
|
-
this.log.debug(`Stored used
|
|
471
|
-
|
|
533
|
+
await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
|
|
534
|
+
this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
|
|
535
|
+
taggingIndexRangesUsedInTheTx
|
|
472
536
|
});
|
|
473
537
|
} else {
|
|
474
|
-
this.log.debug(`No
|
|
538
|
+
this.log.debug(`No tagging index ranges used in the tx`);
|
|
475
539
|
}
|
|
476
540
|
return txProvingResult;
|
|
477
541
|
} catch (err) {
|
|
@@ -481,13 +545,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
481
545
|
}
|
|
482
546
|
/**
|
|
483
547
|
* 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.
|
|
548
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
488
549
|
* @returns A trace of the program execution with gate counts.
|
|
489
550
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
490
|
-
*/ profileTx(txRequest, profileMode, skipProofGeneration = true) {
|
|
551
|
+
*/ profileTx(txRequest, { profileMode, skipProofGeneration = true, scopes, senderForTags }) {
|
|
491
552
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
492
553
|
return this.#putInJobQueue(async (jobId)=>{
|
|
493
554
|
const totalTimer = new Timer();
|
|
@@ -503,10 +564,18 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
503
564
|
this.log.info(`Profiling transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, txInfo);
|
|
504
565
|
const syncTimer = new Timer();
|
|
505
566
|
await this.blockStateSynchronizer.sync();
|
|
567
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
506
568
|
const syncTime = syncTimer.ms();
|
|
507
569
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
508
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
509
|
-
|
|
570
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
571
|
+
contractFunctionSimulator,
|
|
572
|
+
txRequest,
|
|
573
|
+
anchorBlockHeader,
|
|
574
|
+
scopes,
|
|
575
|
+
jobId,
|
|
576
|
+
senderForTags
|
|
577
|
+
});
|
|
578
|
+
const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
510
579
|
simulate: skipProofGeneration,
|
|
511
580
|
skipFeeEnforcement: false,
|
|
512
581
|
profileMode
|
|
@@ -550,18 +619,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
550
619
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
551
620
|
*
|
|
552
621
|
*
|
|
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.
|
|
622
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
559
623
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
560
624
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
561
625
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
562
626
|
*
|
|
563
627
|
* TODO(#7456) Prevent msgSender being defined here for the first call
|
|
564
|
-
*/ simulateTx(txRequest, simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes) {
|
|
628
|
+
*/ simulateTx(txRequest, { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, skipKernels = true, overrides, scopes, senderForTags }) {
|
|
565
629
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
566
630
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
567
631
|
// delete the same read value, or reading values that another simulation is currently modifying).
|
|
@@ -579,21 +643,35 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
579
643
|
this.log.info(`Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, txInfo);
|
|
580
644
|
const syncTimer = new Timer();
|
|
581
645
|
await this.blockStateSynchronizer.sync();
|
|
646
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
582
647
|
const syncTime = syncTimer.ms();
|
|
648
|
+
const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
|
|
649
|
+
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
650
|
+
if (hasOverriddenContracts && !skipKernels) {
|
|
651
|
+
throw new Error('Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.');
|
|
652
|
+
}
|
|
583
653
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
654
|
+
if (hasOverriddenContracts) {
|
|
655
|
+
// Overridden contracts don't have a sync function, so calling sync on them would fail.
|
|
656
|
+
// We exclude them so the sync service skips them entirely.
|
|
657
|
+
this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
|
|
658
|
+
}
|
|
588
659
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
589
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
660
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
661
|
+
contractFunctionSimulator,
|
|
662
|
+
txRequest,
|
|
663
|
+
anchorBlockHeader,
|
|
664
|
+
scopes,
|
|
665
|
+
jobId,
|
|
666
|
+
senderForTags
|
|
667
|
+
});
|
|
590
668
|
let publicInputs;
|
|
591
669
|
let executionSteps = [];
|
|
592
670
|
if (skipKernels) {
|
|
593
|
-
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, this.contractStore));
|
|
671
|
+
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, (addr, sel)=>this.contractStore.getDebugFunctionName(addr, sel), this.node));
|
|
594
672
|
} else {
|
|
595
673
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
596
|
-
({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
674
|
+
({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
597
675
|
simulate: true,
|
|
598
676
|
skipFeeEnforcement,
|
|
599
677
|
profileMode: 'none'
|
|
@@ -607,6 +685,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
607
685
|
const publicSimulationTimer = new Timer();
|
|
608
686
|
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
609
687
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
688
|
+
if (publicOutput?.debugLogs?.length) {
|
|
689
|
+
await displayDebugLogs(publicOutput.debugLogs, (addr)=>this.contractStore.getDebugContractName(addr));
|
|
690
|
+
}
|
|
610
691
|
}
|
|
611
692
|
let validationTime;
|
|
612
693
|
if (!skipTxValidation) {
|
|
@@ -617,7 +698,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
617
698
|
});
|
|
618
699
|
validationTime = validationTimer.ms();
|
|
619
700
|
if (validationResult.result === 'invalid') {
|
|
620
|
-
|
|
701
|
+
const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
|
|
702
|
+
throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
|
|
621
703
|
}
|
|
622
704
|
}
|
|
623
705
|
const txHash = simulatedTx.getTxHash();
|
|
@@ -650,22 +732,19 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
650
732
|
nodeRPCCalls: simulatorStats.nodeRPCCalls
|
|
651
733
|
});
|
|
652
734
|
} catch (err) {
|
|
653
|
-
throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes
|
|
735
|
+
throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
|
|
654
736
|
}
|
|
655
737
|
});
|
|
656
738
|
}
|
|
657
739
|
/**
|
|
658
|
-
*
|
|
659
|
-
*
|
|
740
|
+
* Executes a contract utility function.
|
|
660
741
|
* @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.
|
|
742
|
+
*/ executeUtility(call, { authwits, scopes } = {
|
|
743
|
+
scopes: []
|
|
744
|
+
}) {
|
|
745
|
+
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
667
746
|
// 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
|
|
747
|
+
// delete the same read value, or reading values that another execution is currently modifying).
|
|
669
748
|
return this.#putInJobQueue(async (jobId)=>{
|
|
670
749
|
try {
|
|
671
750
|
const totalTimer = new Timer();
|
|
@@ -675,8 +754,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
675
754
|
const functionTimer = new Timer();
|
|
676
755
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
677
756
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
678
|
-
await ensureContractSynced(call.to, call.selector, (privateSyncCall)=>this.#
|
|
679
|
-
const executionResult = await this.#
|
|
757
|
+
await this.contractSyncService.ensureContractSynced(call.to, call.selector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
|
|
758
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(contractFunctionSimulator, call, authwits ?? [], scopes, jobId);
|
|
680
759
|
const functionTime = functionTimer.ms();
|
|
681
760
|
const totalTime = totalTimer.ms();
|
|
682
761
|
const perFunction = [
|
|
@@ -694,6 +773,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
694
773
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
695
774
|
return {
|
|
696
775
|
result: executionResult,
|
|
776
|
+
offchainEffects,
|
|
777
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
697
778
|
stats: {
|
|
698
779
|
timings,
|
|
699
780
|
nodeRPCCalls: simulationStats.nodeRPCCalls
|
|
@@ -702,7 +783,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
702
783
|
} catch (err) {
|
|
703
784
|
const { to, name, args } = call;
|
|
704
785
|
const stringifiedArgs = args.map((arg)=>arg.toString()).join(', ');
|
|
705
|
-
throw this.#contextualizeError(err, `
|
|
786
|
+
throw this.#contextualizeError(err, `executeUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
|
|
706
787
|
}
|
|
707
788
|
});
|
|
708
789
|
}
|
|
@@ -725,7 +806,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
725
806
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
726
807
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
727
808
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
728
|
-
await ensureContractSynced(filter.contractAddress, null, async (privateSyncCall)=>await this.#
|
|
809
|
+
await this.contractSyncService.ensureContractSynced(filter.contractAddress, null, async (privateSyncCall, execScopes)=>await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes);
|
|
729
810
|
});
|
|
730
811
|
// anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
|
|
731
812
|
const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber).validate(filter);
|
|
@@ -733,8 +814,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
733
814
|
return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
|
|
734
815
|
}
|
|
735
816
|
/**
|
|
736
|
-
* Stops the PXE's job queue.
|
|
737
|
-
*/ stop() {
|
|
738
|
-
|
|
817
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
818
|
+
*/ async stop() {
|
|
819
|
+
await this.jobQueue.end();
|
|
820
|
+
await this.blockStateSynchronizer.stop();
|
|
821
|
+
await this.db.close();
|
|
739
822
|
}
|
|
740
823
|
}
|
|
@@ -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"}
|