@aztec/pxe 0.0.1-commit.0b941701 → 0.0.1-commit.0dc957cde
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_synchronizer.d.ts +10 -4
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +30 -6
- 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 +206 -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 +62 -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 -44
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +310 -113
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +54 -79
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +116 -88
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +128 -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 +330 -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 +24 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +28 -18
- 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 +74 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +147 -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/private_event_store/stored_private_event.d.ts +4 -4
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
- package/dest/storage/private_event_store/stored_private_event.js +2 -2
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/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 +4 -4
- 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 +5 -6
- 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 +7 -8
- 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 +5 -9
- 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 +6 -8
- 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_synchronizer.ts +45 -21
- package/src/config/index.ts +3 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +366 -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 +90 -62
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
- package/src/contract_function_simulator/oracle/oracle.ts +391 -150
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +147 -183
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +550 -177
- 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 +63 -19
- 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 +286 -136
- 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/private_event_store/stored_private_event.ts +3 -3
- 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 +31 -7
- package/src/tagging/index.ts +2 -2
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +14 -27
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +12 -17
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +25 -12
- 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 +30 -29
- 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,17 @@ 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) {
|
|
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
|
+
});
|
|
180
214
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
181
215
|
return result;
|
|
182
216
|
} catch (err) {
|
|
@@ -187,18 +221,22 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
187
221
|
}
|
|
188
222
|
}
|
|
189
223
|
/**
|
|
190
|
-
*
|
|
224
|
+
* Execute a utility function call on the given contract.
|
|
191
225
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
192
226
|
* @param call - The function call to execute.
|
|
193
227
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
194
228
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
195
229
|
* accounts if not specified.
|
|
196
230
|
* @param jobId - The job ID for staged writes.
|
|
197
|
-
* @returns The
|
|
198
|
-
*/ async #
|
|
231
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
232
|
+
*/ async #executeUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
|
|
199
233
|
try {
|
|
200
234
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
201
|
-
|
|
235
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
|
|
236
|
+
return {
|
|
237
|
+
result,
|
|
238
|
+
offchainEffects
|
|
239
|
+
};
|
|
202
240
|
} catch (err) {
|
|
203
241
|
if (err instanceof SimulationError) {
|
|
204
242
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -241,16 +279,26 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
241
279
|
* @param privateExecutionResult - The result of the private execution
|
|
242
280
|
* @param config - The configuration for the kernel execution prover.
|
|
243
281
|
* @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);
|
|
282
|
+
*/ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, anchorBlockHeader, config) {
|
|
283
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
284
|
+
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled, this.log.getBindings());
|
|
249
285
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
250
286
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
251
287
|
}
|
|
252
288
|
// Public API
|
|
253
|
-
|
|
289
|
+
/**
|
|
290
|
+
* Returns the block header up to which the PXE has synced.
|
|
291
|
+
* @returns The synced block header
|
|
292
|
+
*/ getSyncedBlockHeader() {
|
|
293
|
+
return this.#putInJobQueue(()=>{
|
|
294
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Returns the contract instance for a given address, if it's registered in the PXE.
|
|
299
|
+
* @param address - The contract address.
|
|
300
|
+
* @returns The contract instance if found, undefined otherwise.
|
|
301
|
+
*/ getContractInstance(address) {
|
|
254
302
|
return this.contractStore.getContractInstance(address);
|
|
255
303
|
}
|
|
256
304
|
/**
|
|
@@ -292,6 +340,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
292
340
|
* @returns The address of the sender.
|
|
293
341
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
294
342
|
*/ async registerSender(sender) {
|
|
343
|
+
if (!await sender.isValid()) {
|
|
344
|
+
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.`);
|
|
345
|
+
}
|
|
295
346
|
const accounts = await this.keyStore.getAccounts();
|
|
296
347
|
if (accounts.includes(sender)) {
|
|
297
348
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
@@ -300,6 +351,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
300
351
|
const wasAdded = await this.senderAddressBookStore.addSender(sender);
|
|
301
352
|
if (wasAdded) {
|
|
302
353
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
354
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
355
|
+
// all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
|
|
356
|
+
await this.#putInJobQueue(()=>Promise.resolve(this.contractSyncService.wipe()));
|
|
303
357
|
} else {
|
|
304
358
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
305
359
|
}
|
|
@@ -337,8 +391,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
337
391
|
*
|
|
338
392
|
* @param artifact - The build artifact for the contract class.
|
|
339
393
|
*/ async registerContractClass(artifact) {
|
|
340
|
-
const
|
|
341
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
394
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
342
395
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
343
396
|
}
|
|
344
397
|
/**
|
|
@@ -354,15 +407,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
354
407
|
if (artifact) {
|
|
355
408
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
356
409
|
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})`);
|
|
410
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
411
|
+
throw new Error(`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`);
|
|
360
412
|
}
|
|
361
413
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
362
414
|
if (!computedAddress.equals(instance.address)) {
|
|
363
415
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
364
416
|
}
|
|
365
|
-
await this.contractStore.addContractArtifact(
|
|
417
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
366
418
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
367
419
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
368
420
|
} else {
|
|
@@ -398,11 +450,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
398
450
|
if (!contractClass.id.equals(currentClassId)) {
|
|
399
451
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
400
452
|
}
|
|
401
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
402
453
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
403
454
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
404
455
|
currentInstance.currentContractClassId = contractClass.id;
|
|
405
|
-
await
|
|
456
|
+
await Promise.all([
|
|
457
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
458
|
+
this.contractStore.addContractInstance(currentInstance)
|
|
459
|
+
]);
|
|
406
460
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
407
461
|
});
|
|
408
462
|
}
|
|
@@ -417,10 +471,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
417
471
|
* (where validators prove the public portion).
|
|
418
472
|
*
|
|
419
473
|
* @param txRequest - An authenticated tx request ready for proving
|
|
474
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
420
475
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
421
476
|
* @throws If contract code not found, or public simulation reverts.
|
|
422
477
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
423
|
-
*/ proveTx(txRequest) {
|
|
478
|
+
*/ proveTx(txRequest, scopes) {
|
|
424
479
|
let privateExecutionResult;
|
|
425
480
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
426
481
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -429,10 +484,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
429
484
|
try {
|
|
430
485
|
const syncTimer = new Timer();
|
|
431
486
|
await this.blockStateSynchronizer.sync();
|
|
487
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
432
488
|
const syncTime = syncTimer.ms();
|
|
433
489
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
434
|
-
privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest,
|
|
435
|
-
const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
490
|
+
privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, anchorBlockHeader, scopes, jobId);
|
|
491
|
+
const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
436
492
|
simulate: false,
|
|
437
493
|
skipFeeEnforcement: false,
|
|
438
494
|
profileMode: 'none'
|
|
@@ -462,16 +518,16 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
462
518
|
// transaction before this one is included in a block from this PXE, and that transaction contains a log with
|
|
463
519
|
// a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
|
|
464
520
|
// storing the tags here prevents linkage of txs sent from the same PXE.
|
|
465
|
-
const
|
|
466
|
-
if (
|
|
521
|
+
const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
|
|
522
|
+
if (taggingIndexRangesUsedInTheTx.length > 0) {
|
|
467
523
|
// TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
|
|
468
524
|
const txHash = (await txProvingResult.toTx()).txHash;
|
|
469
|
-
await this.senderTaggingStore.storePendingIndexes(
|
|
470
|
-
this.log.debug(`Stored used
|
|
471
|
-
|
|
525
|
+
await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
|
|
526
|
+
this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
|
|
527
|
+
taggingIndexRangesUsedInTheTx
|
|
472
528
|
});
|
|
473
529
|
} else {
|
|
474
|
-
this.log.debug(`No
|
|
530
|
+
this.log.debug(`No tagging index ranges used in the tx`);
|
|
475
531
|
}
|
|
476
532
|
return txProvingResult;
|
|
477
533
|
} catch (err) {
|
|
@@ -481,13 +537,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
481
537
|
}
|
|
482
538
|
/**
|
|
483
539
|
* 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.
|
|
540
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
488
541
|
* @returns A trace of the program execution with gate counts.
|
|
489
542
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
490
|
-
*/ profileTx(txRequest, profileMode, skipProofGeneration = true) {
|
|
543
|
+
*/ profileTx(txRequest, { profileMode, skipProofGeneration = true, scopes }) {
|
|
491
544
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
492
545
|
return this.#putInJobQueue(async (jobId)=>{
|
|
493
546
|
const totalTimer = new Timer();
|
|
@@ -503,10 +556,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
503
556
|
this.log.info(`Profiling transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, txInfo);
|
|
504
557
|
const syncTimer = new Timer();
|
|
505
558
|
await this.blockStateSynchronizer.sync();
|
|
559
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
506
560
|
const syncTime = syncTimer.ms();
|
|
507
561
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
508
|
-
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest,
|
|
509
|
-
const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
562
|
+
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, anchorBlockHeader, scopes, jobId);
|
|
563
|
+
const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
510
564
|
simulate: skipProofGeneration,
|
|
511
565
|
skipFeeEnforcement: false,
|
|
512
566
|
profileMode
|
|
@@ -550,18 +604,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
550
604
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
551
605
|
*
|
|
552
606
|
*
|
|
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.
|
|
607
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
559
608
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
560
609
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
561
610
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
562
611
|
*
|
|
563
612
|
* TODO(#7456) Prevent msgSender being defined here for the first call
|
|
564
|
-
*/ simulateTx(txRequest, simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes) {
|
|
613
|
+
*/ simulateTx(txRequest, { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, skipKernels = true, overrides, scopes }) {
|
|
565
614
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
566
615
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
567
616
|
// delete the same read value, or reading values that another simulation is currently modifying).
|
|
@@ -579,21 +628,28 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
579
628
|
this.log.info(`Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, txInfo);
|
|
580
629
|
const syncTimer = new Timer();
|
|
581
630
|
await this.blockStateSynchronizer.sync();
|
|
631
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
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
|
-
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
|
|
645
|
+
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, anchorBlockHeader, 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
|
-
({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
652
|
+
({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
597
653
|
simulate: true,
|
|
598
654
|
skipFeeEnforcement,
|
|
599
655
|
profileMode: 'none'
|
|
@@ -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();
|
|
@@ -675,8 +732,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
675
732
|
const functionTimer = new Timer();
|
|
676
733
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
677
734
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
678
|
-
await ensureContractSynced(call.to, call.selector, (privateSyncCall)=>this.#
|
|
679
|
-
const executionResult = await this.#
|
|
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);
|
|
680
737
|
const functionTime = functionTimer.ms();
|
|
681
738
|
const totalTime = totalTimer.ms();
|
|
682
739
|
const perFunction = [
|
|
@@ -694,6 +751,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
694
751
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
695
752
|
return {
|
|
696
753
|
result: executionResult,
|
|
754
|
+
offchainEffects,
|
|
755
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
697
756
|
stats: {
|
|
698
757
|
timings,
|
|
699
758
|
nodeRPCCalls: simulationStats.nodeRPCCalls
|
|
@@ -702,7 +761,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
702
761
|
} catch (err) {
|
|
703
762
|
const { to, name, args } = call;
|
|
704
763
|
const stringifiedArgs = args.map((arg)=>arg.toString()).join(', ');
|
|
705
|
-
throw this.#contextualizeError(err, `
|
|
764
|
+
throw this.#contextualizeError(err, `executeUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
|
|
706
765
|
}
|
|
707
766
|
});
|
|
708
767
|
}
|
|
@@ -725,7 +784,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
725
784
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
726
785
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
727
786
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
728
|
-
await ensureContractSynced(filter.contractAddress, null, async (privateSyncCall)=>await this.#
|
|
787
|
+
await this.contractSyncService.ensureContractSynced(filter.contractAddress, null, async (privateSyncCall, execScopes)=>await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes);
|
|
729
788
|
});
|
|
730
789
|
// anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
|
|
731
790
|
const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber).validate(filter);
|
|
@@ -733,8 +792,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
|
|
|
733
792
|
return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
|
|
734
793
|
}
|
|
735
794
|
/**
|
|
736
|
-
* Stops the PXE's job queue.
|
|
737
|
-
*/ stop() {
|
|
738
|
-
|
|
795
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
796
|
+
*/ async stop() {
|
|
797
|
+
await this.jobQueue.end();
|
|
798
|
+
await this.blockStateSynchronizer.stop();
|
|
799
|
+
await this.db.close();
|
|
739
800
|
}
|
|
740
801
|
}
|
|
@@ -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,11 +6,18 @@ 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() {
|
|
13
|
-
const headerBuffer = await this.#synchronizedHeader.getAsync();
|
|
20
|
+
const headerBuffer = await this.#store.transactionAsync(()=>this.#synchronizedHeader.getAsync());
|
|
14
21
|
if (!headerBuffer) {
|
|
15
22
|
throw new Error(`Trying to get block header with a not-yet-synchronized PXE - this should never happen`);
|
|
16
23
|
}
|