@aztec/pxe 0.0.1-commit.934299a21 → 0.0.1-commit.949a33fd8
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 +6 -2
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +30 -10
- 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/contract_function_simulator/contract_function_simulator.d.ts +13 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +39 -13
- 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 +288 -96
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +32 -59
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +67 -86
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +100 -60
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +326 -111
- 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 +9 -4
- package/dest/contract_logging.d.ts.map +1 -1
- package/dest/contract_logging.js +21 -6
- package/dest/contract_sync/contract_sync_service.d.ts +6 -5
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +62 -43
- package/dest/contract_sync/helpers.d.ts +2 -3
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +7 -2
- package/dest/debug/pxe_debug_utils.d.ts +3 -3
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.d.ts +1 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +0 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +2 -2
- package/dest/entrypoints/client/lazy/index.d.ts +1 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +0 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +2 -2
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +2 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +1 -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 +2 -2
- package/dest/events/event_service.d.ts +3 -2
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +26 -5
- 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/logs/log_service.d.ts +7 -8
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +29 -39
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +36 -0
- package/dest/notes/note_service.d.ts +4 -5
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +14 -5
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- 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/private_kernel_execution_prover.d.ts +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +4 -7
- package/dest/private_kernel/private_kernel_oracle.d.ts +5 -5
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +12 -15
- package/dest/pxe.d.ts +25 -10
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +91 -42
- package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +36 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/contract_store/contract_store.d.ts +1 -1
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +4 -2
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- package/dest/storage/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 +3 -0
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
- package/dest/tagging/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 +4 -18
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +6 -7
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +12 -11
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -8
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -24
- package/package.json +16 -16
- package/src/bin/check_oracle_version.ts +4 -4
- package/src/block_synchronizer/block_stream_source.ts +52 -0
- package/src/block_synchronizer/block_synchronizer.ts +33 -11
- package/src/config/index.ts +3 -9
- package/src/contract_function_simulator/contract_function_simulator.ts +52 -16
- 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 +91 -53
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
- package/src/contract_function_simulator/oracle/oracle.ts +377 -139
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +87 -109
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +530 -148
- 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 +18 -5
- package/src/contract_sync/contract_sync_service.ts +99 -75
- package/src/contract_sync/helpers.ts +4 -4
- package/src/debug/pxe_debug_utils.ts +3 -3
- package/src/entrypoints/client/bundle/index.ts +0 -1
- package/src/entrypoints/client/bundle/utils.ts +2 -3
- package/src/entrypoints/client/lazy/index.ts +0 -1
- package/src/entrypoints/client/lazy/utils.ts +2 -3
- package/src/entrypoints/pxe_creation_options.ts +7 -0
- package/src/entrypoints/server/index.ts +1 -2
- package/src/entrypoints/server/utils.ts +2 -3
- package/src/events/event_service.ts +30 -5
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/logs/log_service.ts +59 -75
- package/src/messages/message_context_service.ts +44 -0
- package/src/notes/note_service.ts +18 -8
- package/src/notes_filter.ts +1 -3
- package/src/oracle_version.ts +20 -10
- package/src/private_kernel/private_kernel_execution_prover.ts +4 -9
- package/src/private_kernel/private_kernel_oracle.ts +14 -14
- package/src/pxe.ts +153 -53
- package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +44 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +8 -6
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -5
- package/src/storage/private_event_store/private_event_store.ts +4 -0
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +9 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
- package/src/tagging/index.ts +2 -2
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +8 -21
- 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/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- package/src/access_scopes.ts +0 -9
|
@@ -9,8 +9,9 @@ import { ORACLE_INTERFACE_HASH } from '../oracle_version.js';
|
|
|
9
9
|
*
|
|
10
10
|
* The Oracle interface needs to be versioned to ensure compatibility between Aztec.nr and PXE. This function computes
|
|
11
11
|
* a hash of the Oracle interface and compares it against a known hash. If they don't match, it means the interface has
|
|
12
|
-
* changed and the
|
|
13
|
-
*
|
|
12
|
+
* changed and the oracle version needs to be bumped:
|
|
13
|
+
* - If the change is backward-breaking (e.g. removing/renaming an oracle), bump ORACLE_VERSION_MAJOR.
|
|
14
|
+
* - If the change is an oracle addition (non-breaking), bump ORACLE_VERSION_MINOR.
|
|
14
15
|
*
|
|
15
16
|
* TODO(#16581): The following only takes into consideration changes to the oracles defined in Oracle.ts and omits TXE
|
|
16
17
|
* oracles. Ensure this checks TXE oracles as well. This hasn't been implemented yet since we don't have a clean TXE
|
|
@@ -20,8 +21,7 @@ import { ORACLE_INTERFACE_HASH } from '../oracle_version.js';
|
|
|
20
21
|
// We use keccak256 here just because we already have it in the dependencies.
|
|
21
22
|
const oracleInterfaceHash = keccak256String(oracleInterfaceSignature);
|
|
22
23
|
if (oracleInterfaceHash !== ORACLE_INTERFACE_HASH) {
|
|
23
|
-
|
|
24
|
-
throw new Error(`The Oracle interface has changed, which implies a breaking change in the aztec.nr/PXE oracle interface. Update ORACLE_INTERFACE_HASH to ${oracleInterfaceHash} and bump ORACLE_VERSION in pxe/src/oracle_version.ts.`);
|
|
24
|
+
throw new Error(`The Oracle interface has changed. Update ORACLE_INTERFACE_HASH to ${oracleInterfaceHash} in pxe/src/oracle_version.ts and bump the oracle version (ORACLE_VERSION_MAJOR for breaking changes, ORACLE_VERSION_MINOR for oracle additions).`);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type L2BlockSource } from '@aztec/stdlib/block';
|
|
2
|
+
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
3
|
+
/**
|
|
4
|
+
* Lifts an {@link AztecNode} RPC client into the shape {@link L2BlockStream} expects. `getBlocks`
|
|
5
|
+
* requests transaction bodies so that real `L2Block` instances can be constructed;
|
|
6
|
+
* `getCheckpoints` requests blocks + L1 info + attestations so that `PublishedCheckpoint`
|
|
7
|
+
* instances are fully populated.
|
|
8
|
+
*/
|
|
9
|
+
export declare function blockStreamSourceFromAztecNode(node: AztecNode): Pick<L2BlockSource, 'getBlocks' | 'getBlockHeader' | 'getL2Tips' | 'getCheckpoints' | 'getCheckpointedBlocks'>;
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfc3RyZWFtX3NvdXJjZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrX3N5bmNocm9uaXplci9ibG9ja19zdHJlYW1fc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBVyxLQUFLLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBS2pFOzs7OztHQUtHO0FBQ0gsd0JBQWdCLDhCQUE4QixDQUM1QyxJQUFJLEVBQUUsU0FBUyxHQUNkLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxHQUFHLGdCQUFnQixHQUFHLFdBQVcsR0FBRyxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQyxDQWtDaEgifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block_stream_source.d.ts","sourceRoot":"","sources":["../../src/block_synchronizer/block_stream_source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAKjE;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,SAAS,GACd,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,gBAAgB,GAAG,WAAW,GAAG,gBAAgB,GAAG,uBAAuB,CAAC,CAkChH"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
+
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
4
|
+
// TODO(spl/new-rpc-api): delete once `L2BlockStream` is refactored to consume the new
|
|
5
|
+
// `BlockResponse` / `CheckpointResponse` shapes. For now the stream requires concrete `L2Block`
|
|
6
|
+
// and `PublishedCheckpoint` instances, so we rehydrate them from RPC responses.
|
|
7
|
+
/**
|
|
8
|
+
* Lifts an {@link AztecNode} RPC client into the shape {@link L2BlockStream} expects. `getBlocks`
|
|
9
|
+
* requests transaction bodies so that real `L2Block` instances can be constructed;
|
|
10
|
+
* `getCheckpoints` requests blocks + L1 info + attestations so that `PublishedCheckpoint`
|
|
11
|
+
* instances are fully populated.
|
|
12
|
+
*/ export function blockStreamSourceFromAztecNode(node) {
|
|
13
|
+
return {
|
|
14
|
+
getL2Tips: ()=>node.getL2Tips(),
|
|
15
|
+
getBlockHeader: (number)=>node.getBlockHeader(number),
|
|
16
|
+
getCheckpointedBlocks: (from, limit)=>node.getCheckpointedBlocks(from, limit),
|
|
17
|
+
async getBlocks (from, limit) {
|
|
18
|
+
const responses = await node.getBlocks(from, limit, {
|
|
19
|
+
includeTransactions: true
|
|
20
|
+
});
|
|
21
|
+
return responses.map((r)=>new L2Block(r.archive, r.header, r.body, r.checkpointNumber, r.indexWithinCheckpoint));
|
|
22
|
+
},
|
|
23
|
+
async getCheckpoints (from, limit) {
|
|
24
|
+
const responses = await node.getCheckpoints(from, limit, {
|
|
25
|
+
includeBlocks: true,
|
|
26
|
+
includeTransactions: true,
|
|
27
|
+
includeL1PublishInfo: true,
|
|
28
|
+
includeAttestations: true
|
|
29
|
+
});
|
|
30
|
+
return responses.map((r)=>{
|
|
31
|
+
const checkpoint = new Checkpoint(r.archive, r.header, r.blocks.map((b)=>new L2Block(b.archive, b.header, b.body, b.checkpointNumber, b.indexWithinCheckpoint)), r.number, r.feeAssetPriceModifier);
|
|
32
|
+
const l1 = r.l1?.published === true ? new L1PublishedData(r.l1.blockNumber, r.l1.timestamp, r.l1.blockHash) : new L1PublishedData(0n, 0n, Fr.ZERO.toString());
|
|
33
|
+
return new PublishedCheckpoint(checkpoint, l1, r.attestations ?? []);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -24,11 +24,13 @@ export declare class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
24
24
|
private config;
|
|
25
25
|
private log;
|
|
26
26
|
private isSyncing;
|
|
27
|
+
private readonly eventQueue;
|
|
27
28
|
protected readonly blockStream: L2BlockStream;
|
|
28
29
|
constructor(node: AztecNode, store: AztecAsyncKVStore, anchorBlockStore: AnchorBlockStore, noteStore: NoteStore, privateEventStore: PrivateEventStore, l2TipsStore: L2TipsKVStore, contractSyncService: ContractSyncService, config?: Partial<BlockSynchronizerConfig>, bindings?: LoggerBindings);
|
|
29
30
|
protected createBlockStream(config: Partial<BlockSynchronizerConfig>): L2BlockStream;
|
|
30
|
-
/** Handle events emitted by the block stream. */
|
|
31
|
+
/** Handle events emitted by the block stream. Serialized to prevent concurrent mutations to anchor state. */
|
|
31
32
|
handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
|
|
33
|
+
private doHandleBlockStreamEvent;
|
|
32
34
|
private updateAnchorBlockHeader;
|
|
33
35
|
/**
|
|
34
36
|
* Syncs PXE and the node by downloading the metadata of the latest blocks, allowing simulations to use
|
|
@@ -40,6 +42,8 @@ export declare class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
40
42
|
* We do this so PXE can ensure data consistency.
|
|
41
43
|
*/
|
|
42
44
|
sync(): Promise<void>;
|
|
45
|
+
/** Stops the block synchronizer, waiting for any in-progress sync and queued events to complete. */
|
|
46
|
+
stop(): Promise<void>;
|
|
43
47
|
private doSync;
|
|
44
48
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2tfc3luY2hyb25pemVyL2Jsb2NrX3N5bmNocm9uaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFdkYsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQWEsYUFBYSxFQUFFLEtBQUssa0JBQWtCLEVBQUUsS0FBSyx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hILE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2pFLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzVGLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFHL0Y7Ozs7R0FJRztBQUNILHFCQUFhLGlCQUFrQixZQUFXLHlCQUF5QjtJQU8vRCxPQUFPLENBQUMsSUFBSTtJQUNaLE9BQU8sQ0FBQyxLQUFLO0lBQ2IsT0FBTyxDQUFDLGdCQUFnQjtJQUN4QixPQUFPLENBQUMsU0FBUztJQUNqQixPQUFPLENBQUMsaUJBQWlCO0lBQ3pCLE9BQU8sQ0FBQyxXQUFXO0lBQ25CLE9BQU8sQ0FBQyxtQkFBbUI7SUFDM0IsT0FBTyxDQUFDLE1BQU07SUFiaEIsT0FBTyxDQUFDLEdBQUcsQ0FBUztJQUNwQixPQUFPLENBQUMsU0FBUyxDQUE0QjtJQUM3QyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBcUI7SUFDaEQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDO0lBRTlDLFlBQ1UsSUFBSSxFQUFFLFNBQVMsRUFDZixLQUFLLEVBQUUsaUJBQWlCLEVBQ3hCLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxTQUFTLEVBQUUsU0FBUyxFQUNwQixpQkFBaUIsRUFBRSxpQkFBaUIsRUFDcEMsV0FBVyxFQUFFLGFBQWEsRUFDMUIsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQ3hDLE1BQU0sR0FBRSxPQUFPLENBQUMsdUJBQXVCLENBQU0sRUFDckQsUUFBUSxDQUFDLEVBQUUsY0FBYyxFQUsxQjtJQUVELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsYUFBYSxDQWFuRjtJQUVELDZHQUE2RztJQUN0RyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUV0RTtZQUVhLHdCQUF3QjtZQThFeEIsdUJBQXVCO0lBU3JDOzs7Ozs7OztPQVFHO0lBQ1UsSUFBSSxrQkFpQmhCO0lBRUQsb0dBQW9HO0lBQ3ZGLElBQUksa0JBSWhCO1lBRWEsTUFBTTtDQWNyQiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_synchronizer.d.ts","sourceRoot":"","sources":["../../src/block_synchronizer/block_synchronizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"block_synchronizer.d.ts","sourceRoot":"","sources":["../../src/block_synchronizer/block_synchronizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAa,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACxH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAG/F;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,yBAAyB;IAO/D,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,MAAM;IAbhB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IAE9C,YACU,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,iBAAiB,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,aAAa,EAC1B,mBAAmB,EAAE,mBAAmB,EACxC,MAAM,GAAE,OAAO,CAAC,uBAAuB,CAAM,EACrD,QAAQ,CAAC,EAAE,cAAc,EAK1B;IAED,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,aAAa,CAanF;IAED,6GAA6G;IACtG,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;YAEa,wBAAwB;YA8ExB,uBAAuB;IASrC;;;;;;;;OAQG;IACU,IAAI,kBAiBhB;IAED,oGAAoG;IACvF,IAAI,kBAIhB;YAEa,MAAM;CAcrB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { SerialQueue } from '@aztec/foundation/queue';
|
|
3
4
|
import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
5
|
+
import { blockStreamSourceFromAztecNode } from './block_stream_source.js';
|
|
4
6
|
/**
|
|
5
7
|
* The BlockSynchronizer class orchestrates synchronization between PXE and Aztec node, maintaining an up-to-date
|
|
6
8
|
* view of the L2 chain state. It handles block header retrieval, chain reorganizations, and provides an interface
|
|
@@ -16,6 +18,7 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
16
18
|
config;
|
|
17
19
|
log;
|
|
18
20
|
isSyncing;
|
|
21
|
+
eventQueue;
|
|
19
22
|
blockStream;
|
|
20
23
|
constructor(node, store, anchorBlockStore, noteStore, privateEventStore, l2TipsStore, contractSyncService, config = {}, bindings){
|
|
21
24
|
this.node = node;
|
|
@@ -26,18 +29,23 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
26
29
|
this.l2TipsStore = l2TipsStore;
|
|
27
30
|
this.contractSyncService = contractSyncService;
|
|
28
31
|
this.config = config;
|
|
32
|
+
this.eventQueue = new SerialQueue();
|
|
29
33
|
this.log = createLogger('pxe:block_synchronizer', bindings);
|
|
30
34
|
this.blockStream = this.createBlockStream(config);
|
|
35
|
+
this.eventQueue.start();
|
|
31
36
|
}
|
|
32
37
|
createBlockStream(config) {
|
|
33
|
-
return new L2BlockStream(this.node, this.l2TipsStore, this, createLogger('pxe:block_stream', this.log.getBindings()), {
|
|
38
|
+
return new L2BlockStream(blockStreamSourceFromAztecNode(this.node), this.l2TipsStore, this, createLogger('pxe:block_stream', this.log.getBindings()), {
|
|
34
39
|
batchSize: config.l2BlockBatchSize,
|
|
35
40
|
// Skipping finalized blocks makes us sync much faster - we only need to download blocks other than the latest one
|
|
36
41
|
// in order to detect reorgs, and there can be no reorgs on finalized block, making this safe.
|
|
37
42
|
skipFinalized: true
|
|
38
43
|
});
|
|
39
44
|
}
|
|
40
|
-
/** Handle events emitted by the block stream. */
|
|
45
|
+
/** Handle events emitted by the block stream. Serialized to prevent concurrent mutations to anchor state. */ handleBlockStreamEvent(event) {
|
|
46
|
+
return this.eventQueue.put(()=>this.doHandleBlockStreamEvent(event));
|
|
47
|
+
}
|
|
48
|
+
async doHandleBlockStreamEvent(event) {
|
|
41
49
|
await this.l2TipsStore.handleBlockStreamEvent(event);
|
|
42
50
|
switch(event.type){
|
|
43
51
|
case 'blocks-added':
|
|
@@ -60,9 +68,11 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
60
68
|
case 'chain-proven':
|
|
61
69
|
{
|
|
62
70
|
if (this.config.syncChainTip === 'proven') {
|
|
63
|
-
const
|
|
64
|
-
if (
|
|
65
|
-
await this.updateAnchorBlockHeader(
|
|
71
|
+
const block = await this.node.getBlock(BlockNumber(event.block.number));
|
|
72
|
+
if (block) {
|
|
73
|
+
await this.updateAnchorBlockHeader(block.header);
|
|
74
|
+
} else {
|
|
75
|
+
this.log.warn(`Block header not found for proven block ${event.block.number}, skipping anchor update`);
|
|
66
76
|
}
|
|
67
77
|
}
|
|
68
78
|
break;
|
|
@@ -70,9 +80,11 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
70
80
|
case 'chain-finalized':
|
|
71
81
|
{
|
|
72
82
|
if (this.config.syncChainTip === 'finalized') {
|
|
73
|
-
const
|
|
74
|
-
if (
|
|
75
|
-
await this.updateAnchorBlockHeader(
|
|
83
|
+
const block = await this.node.getBlock(BlockNumber(event.block.number));
|
|
84
|
+
if (block) {
|
|
85
|
+
await this.updateAnchorBlockHeader(block.header);
|
|
86
|
+
} else {
|
|
87
|
+
this.log.warn(`Block header not found for finalized block ${event.block.number}, skipping anchor update`);
|
|
76
88
|
}
|
|
77
89
|
}
|
|
78
90
|
break;
|
|
@@ -92,7 +104,8 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
92
104
|
// Note that the following is not necessarily the anchor block that will be used in the transaction - if
|
|
93
105
|
// the chain has already moved past the reorg, we'll also see blocks-added events that will push the anchor
|
|
94
106
|
// forward.
|
|
95
|
-
const
|
|
107
|
+
const newAnchorBlock = await this.node.getBlock(BlockHash.fromString(event.block.hash));
|
|
108
|
+
const newAnchorBlockHeader = newAnchorBlock?.header;
|
|
96
109
|
if (!newAnchorBlockHeader) {
|
|
97
110
|
throw new Error(`Block header for block number ${event.block.number} and hash ${event.block.hash} not found during chain prune. This likely indicates a bug in the node, as we receive block stream events and fetch block headers from the same node.`);
|
|
98
111
|
}
|
|
@@ -129,6 +142,8 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
129
142
|
return;
|
|
130
143
|
}
|
|
131
144
|
this.log.debug(`Syncing PXE with the node`);
|
|
145
|
+
// Capture the promise locally so we always await the exact promise we created, even if this.isSyncing is modified
|
|
146
|
+
// between assignment and await (e.g. due to future refactors introducing a yield point).
|
|
132
147
|
const isSyncing = this.doSync();
|
|
133
148
|
this.isSyncing = isSyncing;
|
|
134
149
|
try {
|
|
@@ -137,6 +152,11 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
137
152
|
this.isSyncing = undefined;
|
|
138
153
|
}
|
|
139
154
|
}
|
|
155
|
+
/** Stops the block synchronizer, waiting for any in-progress sync and queued events to complete. */ async stop() {
|
|
156
|
+
await this.isSyncing;
|
|
157
|
+
await this.blockStream.stop();
|
|
158
|
+
await this.eventQueue.end();
|
|
159
|
+
}
|
|
140
160
|
async doSync() {
|
|
141
161
|
let currentHeader;
|
|
142
162
|
try {
|
|
@@ -146,7 +166,7 @@ import { BlockHash, L2BlockStream } from '@aztec/stdlib/block';
|
|
|
146
166
|
}
|
|
147
167
|
if (!currentHeader) {
|
|
148
168
|
// REFACTOR: We should know the header of the genesis block without having to request it from the node.
|
|
149
|
-
await this.anchorBlockStore.setHeader(await this.node.
|
|
169
|
+
await this.anchorBlockStore.setHeader((await this.node.getBlock(BlockNumber.ZERO)).header);
|
|
150
170
|
}
|
|
151
171
|
await this.blockStream.sync();
|
|
152
172
|
}
|
package/dest/config/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
|
-
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
2
|
import { type ChainConfig } from '@aztec/stdlib/config';
|
|
3
|
+
import { type DataStoreConfig } from '@aztec/stdlib/kv-store';
|
|
4
4
|
export { getPackageInfo } from './package_info.js';
|
|
5
5
|
/**
|
|
6
6
|
* Configuration settings for the prover factory
|
|
@@ -34,4 +34,4 @@ export declare const allPxeConfigMappings: ConfigMappingsType<CliPXEOptions & PX
|
|
|
34
34
|
* Creates an instance of CliPxeOptions out of environment variables
|
|
35
35
|
*/
|
|
36
36
|
export declare function getCliPXEOptions(): CliPXEOptions & PXEConfig;
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssa0JBQWtCLEVBTXhCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUF1QixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsa0JBQWtCO0lBQ2pDLDhDQUE4QztJQUM5QyxhQUFhLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDekI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyx1QkFBdUI7SUFDdEMseUZBQXlGO0lBQ3pGLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztJQUN6Qiw2RUFBNkU7SUFDN0UsWUFBWSxDQUFDLEVBQUUsVUFBVSxHQUFHLGNBQWMsR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDO0NBQ3JFO0FBRUQsTUFBTSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsR0FBRyxlQUFlLEdBQUcsV0FBVyxHQUFHLHVCQUF1QixDQUFDO0FBRXJHLE1BQU0sTUFBTSxhQUFhLEdBQUc7SUFDMUIsMkNBQTJDO0lBQzNDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNsQixDQUFDO0FBRUYsZUFBTyxNQUFNLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLFNBQVMsQ0F5QjNELENBQUM7QUFFRjs7R0FFRztBQUNILHdCQUFnQixZQUFZLElBQUksU0FBUyxDQUV4QztBQUVELGVBQU8sTUFBTSxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhLENBS2xFLENBQUM7QUFFRixlQUFPLE1BQU0sb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FXOUUsQ0FBQztBQUVGOztHQUVHO0FBQ0gsd0JBQWdCLGdCQUFnQixJQUFJLGFBQWEsR0FBRyxTQUFTLENBUTVEIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;CACrE;AAED,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,eAAe,GAAG,WAAW,GAAG,uBAAuB,CAAC;AAErG,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,SAAS,CAyB3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAED,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,aAAa,CAKlE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,aAAa,GAAG,SAAS,CAW9E,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAQ5D"}
|
package/dest/config/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper, parseBooleanEnv } from '@aztec/foundation/config';
|
|
2
|
-
import { dataConfigMappings } from '@aztec/kv-store/config';
|
|
1
|
+
import { booleanConfigHelper, enumConfigHelper, getConfigFromMappings, numberConfigHelper, parseBooleanEnv } from '@aztec/foundation/config';
|
|
3
2
|
import { chainConfigMappings } from '@aztec/stdlib/config';
|
|
3
|
+
import { dataConfigMappings } from '@aztec/stdlib/kv-store';
|
|
4
4
|
export { getPackageInfo } from './package_info.js';
|
|
5
5
|
export const pxeConfigMappings = {
|
|
6
6
|
...dataConfigMappings,
|
|
@@ -25,19 +25,12 @@ export const pxeConfigMappings = {
|
|
|
25
25
|
syncChainTip: {
|
|
26
26
|
env: 'PXE_SYNC_CHAIN_TIP',
|
|
27
27
|
description: 'Which chain tip to sync to (proposed, checkpointed, proven, finalized)',
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
'finalized'
|
|
35
|
-
];
|
|
36
|
-
if (allowedValues.includes(val)) {
|
|
37
|
-
return val;
|
|
38
|
-
}
|
|
39
|
-
throw new Error(`Invalid value for PXE_SYNC_CHAIN_TIP: ${val}. Allowed values are: ${allowedValues.join(', ')}`);
|
|
40
|
-
}
|
|
28
|
+
...enumConfigHelper([
|
|
29
|
+
'proposed',
|
|
30
|
+
'checkpointed',
|
|
31
|
+
'proven',
|
|
32
|
+
'finalized'
|
|
33
|
+
], 'proposed')
|
|
41
34
|
}
|
|
42
35
|
};
|
|
43
36
|
/**
|
|
@@ -5,11 +5,12 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
|
|
|
5
5
|
import { FunctionSelector } from '@aztec/stdlib/abi';
|
|
6
6
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
7
7
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
8
|
+
import type { L2TipsProvider } from '@aztec/stdlib/block';
|
|
8
9
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
9
10
|
import { type PrivateKernelExecutionProofOutput, PrivateKernelTailCircuitPublicInputs } from '@aztec/stdlib/kernel';
|
|
10
|
-
import { BlockHeader, PrivateExecutionResult, TxExecutionRequest } from '@aztec/stdlib/tx';
|
|
11
|
-
import type { AccessScopes } from '../access_scopes.js';
|
|
11
|
+
import { BlockHeader, type OffchainEffect, PrivateExecutionResult, TxExecutionRequest } from '@aztec/stdlib/tx';
|
|
12
12
|
import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
|
|
13
|
+
import type { MessageContextService } from '../messages/message_context_service.js';
|
|
13
14
|
import type { AddressStore } from '../storage/address_store/address_store.js';
|
|
14
15
|
import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
|
|
15
16
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
@@ -31,7 +32,7 @@ export type ContractSimulatorRunOpts = {
|
|
|
31
32
|
/** The address used as a tagging sender when emitting private logs. */
|
|
32
33
|
senderForTags?: AztecAddress;
|
|
33
34
|
/** The accounts whose notes we can access in this call. */
|
|
34
|
-
scopes:
|
|
35
|
+
scopes: AztecAddress[];
|
|
35
36
|
/** The job ID for staged writes. */
|
|
36
37
|
jobId: string;
|
|
37
38
|
};
|
|
@@ -42,6 +43,7 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
42
43
|
keyStore: KeyStore;
|
|
43
44
|
addressStore: AddressStore;
|
|
44
45
|
aztecNode: AztecNode;
|
|
46
|
+
l2TipsStore: L2TipsProvider;
|
|
45
47
|
senderTaggingStore: SenderTaggingStore;
|
|
46
48
|
recipientTaggingStore: RecipientTaggingStore;
|
|
47
49
|
senderAddressBookStore: SenderAddressBookStore;
|
|
@@ -49,6 +51,7 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
49
51
|
privateEventStore: PrivateEventStore;
|
|
50
52
|
simulator: CircuitSimulator;
|
|
51
53
|
contractSyncService: ContractSyncService;
|
|
54
|
+
messageContextService: MessageContextService;
|
|
52
55
|
};
|
|
53
56
|
/**
|
|
54
57
|
* The contract function simulator.
|
|
@@ -60,6 +63,7 @@ export declare class ContractFunctionSimulator {
|
|
|
60
63
|
private readonly keyStore;
|
|
61
64
|
private readonly addressStore;
|
|
62
65
|
private readonly aztecNode;
|
|
66
|
+
private readonly l2TipsStore;
|
|
63
67
|
private readonly senderTaggingStore;
|
|
64
68
|
private readonly recipientTaggingStore;
|
|
65
69
|
private readonly senderAddressBookStore;
|
|
@@ -67,6 +71,7 @@ export declare class ContractFunctionSimulator {
|
|
|
67
71
|
private readonly privateEventStore;
|
|
68
72
|
private readonly simulator;
|
|
69
73
|
private readonly contractSyncService;
|
|
74
|
+
private readonly messageContextService;
|
|
70
75
|
constructor(args: ContractFunctionSimulatorArgs);
|
|
71
76
|
/**
|
|
72
77
|
* Runs a private function.
|
|
@@ -82,7 +87,10 @@ export declare class ContractFunctionSimulator {
|
|
|
82
87
|
* accounts if not specified.
|
|
83
88
|
* @returns A return value of the utility function in a form as returned by the simulator (Noir fields)
|
|
84
89
|
*/
|
|
85
|
-
runUtility(call: FunctionCall, authwits: AuthWitness[], anchorBlockHeader: BlockHeader, scopes:
|
|
90
|
+
runUtility(call: FunctionCall, authwits: AuthWitness[], anchorBlockHeader: BlockHeader, scopes: AztecAddress[], jobId: string): Promise<{
|
|
91
|
+
result: Fr[];
|
|
92
|
+
offchainEffects: OffchainEffect[];
|
|
93
|
+
}>;
|
|
86
94
|
/**
|
|
87
95
|
* Returns the execution statistics collected during the simulator run.
|
|
88
96
|
* @returns The execution statistics.
|
|
@@ -105,4 +113,4 @@ export declare class ContractFunctionSimulator {
|
|
|
105
113
|
* @returns The simulated proving result.
|
|
106
114
|
*/
|
|
107
115
|
export declare function generateSimulatedProvingResult(privateExecutionResult: PrivateExecutionResult, debugFunctionNameGetter: (contractAddress: AztecAddress, functionSelector: FunctionSelector) => Promise<string>, node: AztecNode, minRevertibleSideEffectCounterOverride?: number): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>>;
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yL2NvbnRyYWN0X2Z1bmN0aW9uX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF5QkEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3BELE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR2pELE9BQU8sRUFDTCxLQUFLLGdCQUFnQixFQU90QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQWtCLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVTFFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFLTCxLQUFLLGlDQUFpQyxFQUN0QyxvQ0FBb0MsRUFhckMsTUFBTSxzQkFBc0IsQ0FBQztBQUk5QixPQUFPLEVBQ0wsV0FBVyxFQUdYLEtBQUssY0FBYyxFQUNuQixzQkFBc0IsRUFFdEIsa0JBQWtCLEVBSW5CLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3BGLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract_function_simulator.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/contract_function_simulator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract_function_simulator.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/contract_function_simulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AVM_EMITNOTEHASH_BASE_L2_GAS, AVM_EMITNULLIFIER_BASE_L2_GAS, AVM_SENDL2TOL1MSG_BASE_L2_GAS, DA_GAS_PER_FIELD, FIXED_AVM_STARTUP_L2_GAS, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, PRIVATE_TX_L2_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD, TX_DA_GAS_OVERHEAD } from '@aztec/constants';
|
|
1
|
+
import { AVM_EMITNOTEHASH_BASE_L2_GAS, AVM_EMITNULLIFIER_BASE_L2_GAS, AVM_SENDL2TOL1MSG_BASE_L2_GAS, DA_GAS_PER_FIELD, FIXED_AVM_STARTUP_L2_GAS, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, MAX_TX_LIFETIME, PRIVATE_TX_L2_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD, TX_DA_GAS_OVERHEAD } from '@aztec/constants';
|
|
2
2
|
import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -15,6 +15,7 @@ import { PrivateLog } from '@aztec/stdlib/logs';
|
|
|
15
15
|
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
16
16
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
17
17
|
import { CallContext, HashedValues, PrivateExecutionResult, TxConstantData, collectNested, collectNoteHashNullifierCounterMap, getFinalMinRevertibleSideEffectCounter } from '@aztec/stdlib/tx';
|
|
18
|
+
import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
|
|
18
19
|
import { ExecutionNoteCache } from './execution_note_cache.js';
|
|
19
20
|
import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
|
|
20
21
|
import { HashedValuesCache } from './hashed_values_cache.js';
|
|
@@ -31,6 +32,7 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
31
32
|
keyStore;
|
|
32
33
|
addressStore;
|
|
33
34
|
aztecNode;
|
|
35
|
+
l2TipsStore;
|
|
34
36
|
senderTaggingStore;
|
|
35
37
|
recipientTaggingStore;
|
|
36
38
|
senderAddressBookStore;
|
|
@@ -38,12 +40,14 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
38
40
|
privateEventStore;
|
|
39
41
|
simulator;
|
|
40
42
|
contractSyncService;
|
|
43
|
+
messageContextService;
|
|
41
44
|
constructor(args){
|
|
42
45
|
this.contractStore = args.contractStore;
|
|
43
46
|
this.noteStore = args.noteStore;
|
|
44
47
|
this.keyStore = args.keyStore;
|
|
45
48
|
this.addressStore = args.addressStore;
|
|
46
49
|
this.aztecNode = args.aztecNode;
|
|
50
|
+
this.l2TipsStore = args.l2TipsStore;
|
|
47
51
|
this.senderTaggingStore = args.senderTaggingStore;
|
|
48
52
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
49
53
|
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
@@ -51,6 +55,7 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
51
55
|
this.privateEventStore = args.privateEventStore;
|
|
52
56
|
this.simulator = args.simulator;
|
|
53
57
|
this.contractSyncService = args.contractSyncService;
|
|
58
|
+
this.messageContextService = args.messageContextService;
|
|
54
59
|
this.log = createLogger('simulator');
|
|
55
60
|
}
|
|
56
61
|
/**
|
|
@@ -63,7 +68,7 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
63
68
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as private`);
|
|
64
69
|
}
|
|
65
70
|
if (request.origin !== contractAddress) {
|
|
66
|
-
|
|
71
|
+
throw new Error(`Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`);
|
|
67
72
|
}
|
|
68
73
|
// reserve the first side effect for the tx hash (inserted by the private kernel)
|
|
69
74
|
const startSideEffectCounter = 2;
|
|
@@ -92,15 +97,17 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
92
97
|
senderTaggingStore: this.senderTaggingStore,
|
|
93
98
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
94
99
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
95
|
-
|
|
100
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
96
101
|
privateEventStore: this.privateEventStore,
|
|
102
|
+
messageContextService: this.messageContextService,
|
|
97
103
|
contractSyncService: this.contractSyncService,
|
|
98
104
|
jobId,
|
|
99
105
|
totalPublicCalldataCount: 0,
|
|
100
106
|
sideEffectCounter: startSideEffectCounter,
|
|
101
107
|
scopes,
|
|
102
108
|
senderForTags,
|
|
103
|
-
simulator: this.simulator
|
|
109
|
+
simulator: this.simulator,
|
|
110
|
+
l2TipsStore: this.l2TipsStore
|
|
104
111
|
});
|
|
105
112
|
const setupTime = simulatorSetupTimer.ms();
|
|
106
113
|
try {
|
|
@@ -118,7 +125,7 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
118
125
|
r.publicInputs.publicTeardownCallRequest
|
|
119
126
|
]));
|
|
120
127
|
const publicFunctionsCalldata = await Promise.all(publicCallRequests.map(async (r)=>{
|
|
121
|
-
const calldata = await privateExecutionOracle.
|
|
128
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
122
129
|
return new HashedValues(calldata, r.calldataHash);
|
|
123
130
|
}));
|
|
124
131
|
const teardownTime = simulatorTeardownTimer.ms();
|
|
@@ -134,7 +141,6 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
134
141
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
135
142
|
}
|
|
136
143
|
}
|
|
137
|
-
// docs:start:execute_utility_function
|
|
138
144
|
/**
|
|
139
145
|
* Runs a utility function.
|
|
140
146
|
* @param call - The function call to execute.
|
|
@@ -160,10 +166,14 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
160
166
|
aztecNode: this.aztecNode,
|
|
161
167
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
162
168
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
163
|
-
|
|
169
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
164
170
|
privateEventStore: this.privateEventStore,
|
|
171
|
+
messageContextService: this.messageContextService,
|
|
172
|
+
contractSyncService: this.contractSyncService,
|
|
173
|
+
l2TipsStore: this.l2TipsStore,
|
|
165
174
|
jobId,
|
|
166
|
-
scopes
|
|
175
|
+
scopes,
|
|
176
|
+
simulator: this.simulator
|
|
167
177
|
});
|
|
168
178
|
try {
|
|
169
179
|
this.log.verbose(`Executing utility function ${entryPointArtifact.name}`, {
|
|
@@ -181,12 +191,14 @@ import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
|
181
191
|
});
|
|
182
192
|
});
|
|
183
193
|
this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
184
|
-
return
|
|
194
|
+
return {
|
|
195
|
+
result: witnessMapToFields(acirExecutionResult.returnWitness),
|
|
196
|
+
offchainEffects: oracle.getOffchainEffects()
|
|
197
|
+
};
|
|
185
198
|
} catch (err) {
|
|
186
199
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
187
200
|
}
|
|
188
201
|
}
|
|
189
|
-
// docs:end:execute_utility_function
|
|
190
202
|
/**
|
|
191
203
|
* Returns the execution statistics collected during the simulator run.
|
|
192
204
|
* @returns The execution statistics.
|
|
@@ -239,13 +251,27 @@ class OrderedSideEffect {
|
|
|
239
251
|
const noteHashReadRequests = [];
|
|
240
252
|
const nullifierReadRequests = [];
|
|
241
253
|
let publicTeardownCallRequest;
|
|
254
|
+
// We set expiration timestamp to anchor_block_timestamp + MAX_TX_LIFETIME (24h) just like kernels do
|
|
255
|
+
let expirationTimestamp = privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.globalVariables.timestamp + BigInt(MAX_TX_LIFETIME);
|
|
256
|
+
let feePayer = AztecAddress.zero();
|
|
242
257
|
const executions = [
|
|
243
258
|
privateExecutionResult.entrypoint
|
|
244
259
|
];
|
|
245
260
|
while(executions.length !== 0){
|
|
246
261
|
const execution = executions.shift();
|
|
247
262
|
executions.unshift(...execution.nestedExecutionResults);
|
|
263
|
+
// Just like kernels we overwrite the default value if the call sets it.
|
|
264
|
+
const callExpirationTimestamp = execution.publicInputs.expirationTimestamp;
|
|
265
|
+
if (callExpirationTimestamp !== 0n && callExpirationTimestamp < expirationTimestamp) {
|
|
266
|
+
expirationTimestamp = callExpirationTimestamp;
|
|
267
|
+
}
|
|
248
268
|
const { contractAddress } = execution.publicInputs.callContext;
|
|
269
|
+
if (execution.publicInputs.isFeePayer) {
|
|
270
|
+
if (!feePayer.isZero()) {
|
|
271
|
+
throw new Error('Multiple fee payers found in private execution result');
|
|
272
|
+
}
|
|
273
|
+
feePayer = contractAddress;
|
|
274
|
+
}
|
|
249
275
|
scopedNoteHashes.push(...execution.publicInputs.noteHashes.getActiveItems().filter((nh)=>!nh.isEmpty()).map((nh)=>nh.scope(contractAddress)));
|
|
250
276
|
scopedNullifiers.push(...execution.publicInputs.nullifiers.getActiveItems().map((n)=>n.scope(contractAddress)));
|
|
251
277
|
taggedPrivateLogs.push(...await Promise.all(execution.publicInputs.privateLogs.getActiveItems().map(async (metadata)=>{
|
|
@@ -328,7 +354,7 @@ class OrderedSideEffect {
|
|
|
328
354
|
const publicInputs = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ gasUsed.add(Gas.from({
|
|
329
355
|
l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
330
356
|
daGas: TX_DA_GAS_OVERHEAD
|
|
331
|
-
})), /*feePayer=*/
|
|
357
|
+
})), /*feePayer=*/ feePayer, /*expirationTimestamp=*/ expirationTimestamp, hasPublicCalls ? inputsForPublic : undefined, !hasPublicCalls ? inputsForRollup : undefined);
|
|
332
358
|
return {
|
|
333
359
|
publicInputs,
|
|
334
360
|
chonkProof: ChonkProof.empty(),
|
|
@@ -429,8 +455,8 @@ function meterGasUsed(data, isPrivateOnlyTx) {
|
|
|
429
455
|
meteredDAFields += data.privateLogs.reduce((acc, log)=>!log.isEmpty() ? acc + log.emittedLength + 1 : acc, 0);
|
|
430
456
|
meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
|
|
431
457
|
const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, (log)=>log.isEmpty());
|
|
432
|
-
// Every contract class log emits its
|
|
433
|
-
meteredDAFields += data.contractClassLogsHashes.reduce((acc, log)=>!log.isEmpty() ? acc + log.logHash.length +
|
|
458
|
+
// Every contract class log emits its contract address as an additional field
|
|
459
|
+
meteredDAFields += data.contractClassLogsHashes.reduce((acc, log)=>!log.isEmpty() ? acc + log.logHash.length + 1 : acc, 0);
|
|
434
460
|
meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
|
|
435
461
|
const meteredDAGas = meteredDAFields * DA_GAS_PER_FIELD;
|
|
436
462
|
if (data.publicCallRequests) {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
/** In-memory store for ephemeral arrays scoped to a single contract call frame. */
|
|
3
|
+
export declare class EphemeralArrayService {
|
|
4
|
+
#private;
|
|
5
|
+
/** Returns all elements in the array, or an empty array if uninitialized. */
|
|
6
|
+
readArrayAt(slot: Fr): Fr[][];
|
|
7
|
+
/** Returns the number of elements in the array at the given slot. */
|
|
8
|
+
len(slot: Fr): number;
|
|
9
|
+
/** Appends an element to the array and returns the new length. */
|
|
10
|
+
push(slot: Fr, elements: Fr[]): number;
|
|
11
|
+
/** Removes and returns the last element. Throws if empty. */
|
|
12
|
+
pop(slot: Fr): Fr[];
|
|
13
|
+
/** Returns the element at the given index. Throws if out of bounds. */
|
|
14
|
+
get(slot: Fr, index: number): Fr[];
|
|
15
|
+
/** Overwrites the element at the given index. Throws if out of bounds. */
|
|
16
|
+
set(slot: Fr, index: number, value: Fr[]): void;
|
|
17
|
+
/** Removes the element at the given index, shifting subsequent elements backward. Throws if out of bounds. */
|
|
18
|
+
remove(slot: Fr, index: number): void;
|
|
19
|
+
/** Removes all elements from the array. */
|
|
20
|
+
clear(slot: Fr): void;
|
|
21
|
+
/** Allocates a fresh, unused slot for a new ephemeral array. */
|
|
22
|
+
allocateSlot(): Fr;
|
|
23
|
+
/** Creates a new ephemeral array pre-populated with the given elements and returns its slot. */
|
|
24
|
+
newArray(elements: Fr[][]): Fr;
|
|
25
|
+
/** Copies `count` elements from the source array to the destination array (overwrites destination). */
|
|
26
|
+
copy(srcSlot: Fr, dstSlot: Fr, count: number): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBoZW1lcmFsX2FycmF5X3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdF9mdW5jdGlvbl9zaW11bGF0b3IvZXBoZW1lcmFsX2FycmF5X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELG1GQUFtRjtBQUNuRixxQkFBYSxxQkFBcUI7O0lBT2hDLDZFQUE2RTtJQUM3RSxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUU1QjtJQU1ELHFFQUFxRTtJQUNyRSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBRXBCO0lBRUQsa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBS3JDO0lBRUQsNkRBQTZEO0lBQzdELEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQVFsQjtJQUVELHVFQUF1RTtJQUN2RSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQVFqQztJQUVELDBFQUEwRTtJQUMxRSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBUTlDO0lBRUQsOEdBQThHO0lBQzlHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxDQVFwQztJQUVELDJDQUEyQztJQUMzQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBRXBCO0lBRUQsZ0VBQWdFO0lBQ2hFLFlBQVksSUFBSSxFQUFFLENBTWpCO0lBRUQsZ0dBQWdHO0lBQ2hHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBSTdCO0lBRUQsdUdBQXVHO0lBQ3ZHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBVWxEO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ephemeral_array_service.d.ts","sourceRoot":"","sources":["../../src/contract_function_simulator/ephemeral_array_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,mFAAmF;AACnF,qBAAa,qBAAqB;;IAOhC,6EAA6E;IAC7E,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAE5B;IAMD,qEAAqE;IACrE,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAEpB;IAED,kEAAkE;IAClE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,CAKrC;IAED,6DAA6D;IAC7D,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAQlB;IAED,uEAAuE;IACvE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,CAQjC;IAED,0EAA0E;IAC1E,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,CAQ9C;IAED,8GAA8G;IAC9G,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQpC;IAED,2CAA2C;IAC3C,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAEpB;IAED,gEAAgE;IAChE,YAAY,IAAI,EAAE,CAMjB;IAED,gGAAgG;IAChG,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAI7B;IAED,uGAAuG;IACvG,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAUlD;CACF"}
|