@aztec/pxe 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c
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 +1 -1
- 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 +66 -18
- package/dest/config/index.d.ts +3 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +17 -0
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
- package/dest/contract_function_simulator/benchmarked_node.js +77 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +8 -9
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +32 -21
- package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +45 -28
- package/dest/contract_function_simulator/index.d.ts +2 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
- 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 +6 -3
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -11
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts +10 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +43 -32
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +11 -17
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +23 -39
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +27 -17
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +72 -72
- package/dest/contract_sync/index.d.ts +23 -0
- package/dest/contract_sync/index.d.ts.map +1 -0
- package/dest/contract_sync/index.js +54 -0
- package/dest/debug/pxe_debug_utils.d.ts +1 -1
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +3 -2
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +10 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +10 -1
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +3 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -0
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +11 -7
- package/dest/events/event_service.d.ts +4 -3
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +17 -19
- package/dest/events/private_event_filter_validator.d.ts +5 -5
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +5 -6
- package/dest/job_coordinator/job_coordinator.d.ts +74 -0
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
- package/dest/job_coordinator/job_coordinator.js +93 -0
- package/dest/logs/log_service.d.ts +3 -2
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +21 -13
- package/dest/notes/note_service.d.ts +5 -4
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +30 -34
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +4 -3
- package/dest/private_kernel/hints/index.d.ts +2 -2
- package/dest/private_kernel/hints/index.d.ts.map +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
- package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
- 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 -5
- package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +90 -2
- package/dest/pxe.d.ts +8 -36
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +70 -93
- package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +132 -23
- package/dest/storage/contract_store/contract_store.d.ts +1 -2
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +0 -12
- package/dest/storage/note_store/note_store.d.ts +45 -56
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +244 -263
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +203 -68
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +69 -12
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +110 -28
- package/dest/tagging/constants.d.ts +2 -0
- package/dest/tagging/constants.d.ts.map +1 -0
- package/dest/tagging/constants.js +10 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +46 -0
- package/dest/tagging/index.d.ts +3 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -10
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
- 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 -8
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
- 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 +5 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
- 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 +5 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
- 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 +10 -5
- package/package.json +18 -18
- package/src/bin/check_oracle_version.ts +1 -0
- package/src/block_synchronizer/block_synchronizer.ts +77 -20
- package/src/config/index.ts +14 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/benchmarked_node.ts +103 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +37 -26
- package/src/contract_function_simulator/execution_note_cache.ts +44 -25
- package/src/contract_function_simulator/index.ts +1 -1
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
- package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
- package/src/contract_function_simulator/oracle/oracle.ts +56 -41
- package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +39 -44
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +90 -76
- package/src/contract_sync/index.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +3 -2
- package/src/entrypoints/client/bundle/utils.ts +7 -1
- package/src/entrypoints/client/lazy/utils.ts +7 -2
- package/src/entrypoints/pxe_creation_options.ts +2 -1
- package/src/entrypoints/server/index.ts +2 -0
- package/src/entrypoints/server/utils.ts +11 -15
- package/src/events/event_service.ts +17 -21
- package/src/events/private_event_filter_validator.ts +3 -5
- package/src/job_coordinator/job_coordinator.ts +149 -0
- package/src/logs/log_service.ts +27 -9
- package/src/notes/note_service.ts +37 -40
- package/src/oracle_version.ts +4 -3
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
- package/src/private_kernel/private_kernel_execution_prover.ts +3 -5
- package/src/private_kernel/private_kernel_oracle.ts +116 -36
- package/src/pxe.ts +123 -127
- package/src/storage/capsule_store/capsule_store.ts +159 -23
- package/src/storage/contract_store/contract_store.ts +0 -20
- package/src/storage/note_store/note_store.ts +286 -317
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +277 -76
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +89 -13
- package/src/storage/tagging_store/sender_tagging_store.ts +129 -28
- package/src/tagging/constants.ts +10 -0
- package/src/tagging/get_all_logs_by_tags.ts +68 -0
- package/src/tagging/index.ts +2 -11
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
- package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
- package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_node.js +0 -27
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
- package/dest/public_storage/public_storage_service.d.ts +0 -24
- package/dest/public_storage/public_storage_service.d.ts.map +0 -1
- package/dest/public_storage/public_storage_service.js +0 -26
- package/dest/tree_membership/tree_membership_service.d.ts +0 -52
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -84
- package/src/contract_function_simulator/proxied_node.ts +0 -33
- package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
- package/src/public_storage/public_storage_service.ts +0 -33
- package/src/tree_membership/tree_membership_service.ts +0 -112
|
@@ -1,72 +1,152 @@
|
|
|
1
|
-
import { FUNCTION_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, VK_TREE_HEIGHT } from '@aztec/constants';
|
|
1
|
+
import { FUNCTION_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, VK_TREE_HEIGHT } from '@aztec/constants';
|
|
2
2
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import type { GrumpkinScalar, Point } from '@aztec/foundation/curves/grumpkin';
|
|
4
4
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
5
|
+
import type { KeyStore } from '@aztec/key-store';
|
|
6
|
+
import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
7
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
5
8
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
6
9
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
10
|
+
import { L2BlockHash } from '@aztec/stdlib/block';
|
|
11
|
+
import {
|
|
12
|
+
type ContractInstanceWithAddress,
|
|
13
|
+
computeContractClassIdPreimage,
|
|
14
|
+
computeSaltedInitializationHash,
|
|
15
|
+
} from '@aztec/stdlib/contract';
|
|
16
|
+
import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable';
|
|
17
|
+
import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
|
|
18
|
+
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
7
19
|
import { UpdatedClassIdHints } from '@aztec/stdlib/kernel';
|
|
8
|
-
import type { PublicKeys } from '@aztec/stdlib/keys';
|
|
9
20
|
import type { NullifierMembershipWitness } from '@aztec/stdlib/trees';
|
|
10
21
|
import type { VerificationKeyAsFields } from '@aztec/stdlib/vks';
|
|
11
22
|
|
|
23
|
+
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
24
|
+
|
|
12
25
|
/**
|
|
13
26
|
* Provides functionality needed by the private kernel for interacting with our state trees.
|
|
14
|
-
* This is either PrivateKernelOracleImpl, or a mocked test implementation.
|
|
15
27
|
*/
|
|
16
|
-
export
|
|
28
|
+
export class PrivateKernelOracle {
|
|
29
|
+
constructor(
|
|
30
|
+
private contractStore: ContractStore,
|
|
31
|
+
private keyStore: KeyStore,
|
|
32
|
+
private node: AztecNode,
|
|
33
|
+
private blockHash: L2BlockHash,
|
|
34
|
+
) {}
|
|
35
|
+
|
|
17
36
|
/** Retrieves the preimage of a contract address from the registered contract instances db. */
|
|
18
|
-
getContractAddressPreimage(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
37
|
+
public async getContractAddressPreimage(
|
|
38
|
+
address: AztecAddress,
|
|
39
|
+
): Promise<ContractInstanceWithAddress & { saltedInitializationHash: Fr }> {
|
|
40
|
+
const instance = await this.contractStore.getContractInstance(address);
|
|
41
|
+
if (!instance) {
|
|
42
|
+
throw new Error(`Contract instance not found when getting address preimage. Contract address: ${address}.`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
saltedInitializationHash: await computeSaltedInitializationHash(instance),
|
|
46
|
+
...instance,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
24
49
|
|
|
25
50
|
/** Retrieves the preimage of a contract class id from the contract classes db. */
|
|
26
|
-
getContractClassIdPreimage(
|
|
27
|
-
contractClassId
|
|
28
|
-
|
|
51
|
+
public async getContractClassIdPreimage(contractClassId: Fr) {
|
|
52
|
+
const contractClass = await this.contractStore.getContractClass(contractClassId);
|
|
53
|
+
if (!contractClass) {
|
|
54
|
+
throw new Error(`Contract class not found when getting class id preimage. Class id: ${contractClassId}.`);
|
|
55
|
+
}
|
|
56
|
+
return computeContractClassIdPreimage(contractClass);
|
|
57
|
+
}
|
|
29
58
|
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
*/
|
|
33
|
-
getFunctionMembershipWitness(
|
|
59
|
+
/** Returns a membership witness with the sibling path and leaf index in our private functions tree. */
|
|
60
|
+
public async getFunctionMembershipWitness(
|
|
34
61
|
contractClassId: Fr,
|
|
35
62
|
selector: FunctionSelector,
|
|
36
|
-
): Promise<MembershipWitness<typeof FUNCTION_TREE_HEIGHT
|
|
63
|
+
): Promise<MembershipWitness<typeof FUNCTION_TREE_HEIGHT>> {
|
|
64
|
+
const membershipWitness = await this.contractStore.getFunctionMembershipWitness(contractClassId, selector);
|
|
65
|
+
if (!membershipWitness) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`Membership witness not found for contract class id ${contractClassId} and selector ${selector}.`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return membershipWitness;
|
|
71
|
+
}
|
|
37
72
|
|
|
38
73
|
/**
|
|
39
74
|
* Returns a membership witness with the sibling path and leaf index in our protocol VK indexed merkle tree.
|
|
40
75
|
* Used to validate the previous kernel's verification key.
|
|
41
76
|
*/
|
|
42
|
-
getVkMembershipWitness(vk: VerificationKeyAsFields): Promise<MembershipWitness<typeof VK_TREE_HEIGHT
|
|
77
|
+
public getVkMembershipWitness(vk: VerificationKeyAsFields): Promise<MembershipWitness<typeof VK_TREE_HEIGHT>> {
|
|
78
|
+
const leafIndex = getVKIndex(vk);
|
|
79
|
+
return Promise.resolve(new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)));
|
|
80
|
+
}
|
|
43
81
|
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
82
|
+
/** Returns a membership witness with the sibling path and leaf index in our note hash tree. */
|
|
83
|
+
getNoteHashMembershipWitness(noteHash: Fr): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
|
|
84
|
+
return this.node.getNoteHashMembershipWitness(this.blockHash, noteHash);
|
|
85
|
+
}
|
|
47
86
|
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
87
|
+
/** Returns a membership witness with the sibling path and leaf index in our nullifier indexed merkle tree. */
|
|
88
|
+
getNullifierMembershipWitness(nullifier: Fr): Promise<NullifierMembershipWitness | undefined> {
|
|
89
|
+
return this.node.getNullifierMembershipWitness(this.blockHash, nullifier);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Returns the root of our note hash merkle tree. */
|
|
93
|
+
async getNoteHashTreeRoot(): Promise<Fr> {
|
|
94
|
+
const header = await this.node.getBlockHeader(this.blockHash);
|
|
95
|
+
if (!header) {
|
|
96
|
+
throw new Error(`No block header found for block hash ${this.blockHash}`);
|
|
97
|
+
}
|
|
98
|
+
return header.state.partial.noteHashTree.root;
|
|
99
|
+
}
|
|
56
100
|
|
|
57
101
|
/**
|
|
58
102
|
* Retrieves the sk_m corresponding to the pk_m.
|
|
59
103
|
* @throws If the provided public key is not associated with any of the registered accounts.
|
|
60
|
-
* @param
|
|
104
|
+
* @param masterPublicKey - The master public key to get secret key for.
|
|
61
105
|
* @returns A Promise that resolves to sk_m.
|
|
62
106
|
* @dev Used when feeding the sk_m to the kernel circuit for keys verification.
|
|
63
107
|
*/
|
|
64
|
-
getMasterSecretKey(masterPublicKey: Point): Promise<GrumpkinScalar
|
|
108
|
+
public getMasterSecretKey(masterPublicKey: Point): Promise<GrumpkinScalar> {
|
|
109
|
+
return this.keyStore.getMasterSecretKey(masterPublicKey);
|
|
110
|
+
}
|
|
65
111
|
|
|
66
112
|
/** Use debug data to get the function name corresponding to a selector. */
|
|
67
|
-
getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string | undefined
|
|
113
|
+
public getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string | undefined> {
|
|
114
|
+
return this.contractStore.getDebugFunctionName(contractAddress, selector);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Returns a membership witness and leaf index to our public data indexed merkle tree,
|
|
119
|
+
* along with an associated DelayedPublicMutable containing the class ID to update.
|
|
120
|
+
*/
|
|
121
|
+
public async getUpdatedClassIdHints(contractAddress: AztecAddress): Promise<UpdatedClassIdHints> {
|
|
122
|
+
const { delayedPublicMutableSlot, delayedPublicMutableHashSlot } =
|
|
123
|
+
await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
|
|
124
|
+
|
|
125
|
+
const hashLeafSlot = await computePublicDataTreeLeafSlot(
|
|
126
|
+
ProtocolContractAddress.ContractInstanceRegistry,
|
|
127
|
+
delayedPublicMutableHashSlot,
|
|
128
|
+
);
|
|
129
|
+
const updatedClassIdWitness = await this.node.getPublicDataWitness(this.blockHash, hashLeafSlot);
|
|
130
|
+
|
|
131
|
+
if (!updatedClassIdWitness) {
|
|
132
|
+
throw new Error(`No public data tree witness found for ${hashLeafSlot}`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const readStorage = (storageSlot: Fr) =>
|
|
136
|
+
this.node.getPublicStorageAt(this.blockHash, ProtocolContractAddress.ContractInstanceRegistry, storageSlot);
|
|
137
|
+
const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(
|
|
138
|
+
delayedPublicMutableSlot,
|
|
139
|
+
readStorage,
|
|
140
|
+
);
|
|
68
141
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
142
|
+
return new UpdatedClassIdHints(
|
|
143
|
+
new MembershipWitness(
|
|
144
|
+
PUBLIC_DATA_TREE_HEIGHT,
|
|
145
|
+
updatedClassIdWitness.index,
|
|
146
|
+
updatedClassIdWitness.siblingPath.toTuple(),
|
|
147
|
+
),
|
|
148
|
+
updatedClassIdWitness.leafPreimage,
|
|
149
|
+
delayedPublicMutableValues,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
72
152
|
}
|
package/src/pxe.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
|
|
2
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
5
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
@@ -19,14 +20,12 @@ import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
|
19
20
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
20
21
|
import {
|
|
21
22
|
CompleteAddress,
|
|
22
|
-
type ContractClassWithId,
|
|
23
23
|
type ContractInstanceWithAddress,
|
|
24
24
|
type PartialAddress,
|
|
25
25
|
computeContractAddressFromInstance,
|
|
26
26
|
getContractClassFromArtifact,
|
|
27
27
|
} from '@aztec/stdlib/contract';
|
|
28
28
|
import { SimulationError } from '@aztec/stdlib/errors';
|
|
29
|
-
import { computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
|
|
30
29
|
import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
|
|
31
30
|
import type {
|
|
32
31
|
PrivateExecutionStep,
|
|
@@ -54,20 +53,22 @@ import { inspect } from 'util';
|
|
|
54
53
|
|
|
55
54
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
56
55
|
import type { PXEConfig } from './config/index.js';
|
|
56
|
+
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
57
57
|
import {
|
|
58
58
|
ContractFunctionSimulator,
|
|
59
59
|
generateSimulatedProvingResult,
|
|
60
60
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
61
|
-
import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
|
|
62
61
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
62
|
+
import { ensureContractSynced, readCurrentClassId } from './contract_sync/index.js';
|
|
63
63
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
64
64
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
65
65
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
66
|
+
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
66
67
|
import {
|
|
67
68
|
PrivateKernelExecutionProver,
|
|
68
69
|
type PrivateKernelExecutionProverConfig,
|
|
69
70
|
} from './private_kernel/private_kernel_execution_prover.js';
|
|
70
|
-
import {
|
|
71
|
+
import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
|
|
71
72
|
import { AddressStore } from './storage/address_store/address_store.js';
|
|
72
73
|
import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
|
|
73
74
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
@@ -107,6 +108,7 @@ export class PXE {
|
|
|
107
108
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
108
109
|
private log: Logger,
|
|
109
110
|
private jobQueue: SerialQueue,
|
|
111
|
+
private jobCoordinator: JobCoordinator,
|
|
110
112
|
public debug: PXEDebugUtils,
|
|
111
113
|
) {}
|
|
112
114
|
|
|
@@ -135,7 +137,7 @@ export class PXE {
|
|
|
135
137
|
const addressStore = new AddressStore(store);
|
|
136
138
|
const privateEventStore = new PrivateEventStore(store);
|
|
137
139
|
const contractStore = new ContractStore(store);
|
|
138
|
-
const noteStore =
|
|
140
|
+
const noteStore = new NoteStore(store);
|
|
139
141
|
const anchorBlockStore = new AnchorBlockStore(store);
|
|
140
142
|
const senderTaggingStore = new SenderTaggingStore(store);
|
|
141
143
|
const senderAddressBookStore = new SenderAddressBookStore(store);
|
|
@@ -143,7 +145,25 @@ export class PXE {
|
|
|
143
145
|
const capsuleStore = new CapsuleStore(store);
|
|
144
146
|
const keyStore = new KeyStore(store);
|
|
145
147
|
const tipsStore = new L2TipsKVStore(store, 'pxe');
|
|
146
|
-
const synchronizer = new BlockSynchronizer(
|
|
148
|
+
const synchronizer = new BlockSynchronizer(
|
|
149
|
+
node,
|
|
150
|
+
store,
|
|
151
|
+
anchorBlockStore,
|
|
152
|
+
noteStore,
|
|
153
|
+
privateEventStore,
|
|
154
|
+
tipsStore,
|
|
155
|
+
config,
|
|
156
|
+
loggerOrSuffix,
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const jobCoordinator = new JobCoordinator(store);
|
|
160
|
+
jobCoordinator.registerStores([
|
|
161
|
+
capsuleStore,
|
|
162
|
+
senderTaggingStore,
|
|
163
|
+
recipientTaggingStore,
|
|
164
|
+
privateEventStore,
|
|
165
|
+
noteStore,
|
|
166
|
+
]);
|
|
147
167
|
|
|
148
168
|
const debugUtils = new PXEDebugUtils(contractStore, noteStore);
|
|
149
169
|
|
|
@@ -168,6 +188,7 @@ export class PXE {
|
|
|
168
188
|
protocolContractsProvider,
|
|
169
189
|
log,
|
|
170
190
|
jobQueue,
|
|
191
|
+
jobCoordinator,
|
|
171
192
|
debugUtils,
|
|
172
193
|
);
|
|
173
194
|
|
|
@@ -191,7 +212,7 @@ export class PXE {
|
|
|
191
212
|
this.noteStore,
|
|
192
213
|
this.keyStore,
|
|
193
214
|
this.addressStore,
|
|
194
|
-
this.node,
|
|
215
|
+
BenchmarkedNodeFactory.create(this.node),
|
|
195
216
|
this.anchorBlockStore,
|
|
196
217
|
this.senderTaggingStore,
|
|
197
218
|
this.recipientTaggingStore,
|
|
@@ -222,7 +243,7 @@ export class PXE {
|
|
|
222
243
|
*
|
|
223
244
|
* Useful for tasks that cannot run concurrently, such as contract function simulation.
|
|
224
245
|
*/
|
|
225
|
-
#putInJobQueue<T>(fn: () => Promise<T>): Promise<T> {
|
|
246
|
+
#putInJobQueue<T>(fn: (jobId: string) => Promise<T>): Promise<T> {
|
|
226
247
|
// TODO(#12636): relax the conditions under which we forbid concurrency.
|
|
227
248
|
if (this.jobQueue.length() != 0) {
|
|
228
249
|
this.log.warn(
|
|
@@ -230,7 +251,22 @@ export class PXE {
|
|
|
230
251
|
);
|
|
231
252
|
}
|
|
232
253
|
|
|
233
|
-
return this.jobQueue.put(
|
|
254
|
+
return this.jobQueue.put(async () => {
|
|
255
|
+
const jobId = this.jobCoordinator.beginJob();
|
|
256
|
+
this.log.verbose(`Beginning job ${jobId}`);
|
|
257
|
+
|
|
258
|
+
try {
|
|
259
|
+
const result = await fn(jobId);
|
|
260
|
+
this.log.verbose(`Committing job ${jobId}`);
|
|
261
|
+
|
|
262
|
+
await this.jobCoordinator.commitJob(jobId);
|
|
263
|
+
return result;
|
|
264
|
+
} catch (err) {
|
|
265
|
+
this.log.verbose(`Aborting job ${jobId}`);
|
|
266
|
+
await this.jobCoordinator.abortJob(jobId);
|
|
267
|
+
throw err;
|
|
268
|
+
}
|
|
269
|
+
});
|
|
234
270
|
}
|
|
235
271
|
|
|
236
272
|
async #registerProtocolContracts() {
|
|
@@ -245,31 +281,28 @@ export class PXE {
|
|
|
245
281
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
246
282
|
}
|
|
247
283
|
|
|
248
|
-
async #isContractClassPubliclyRegistered(id: Fr): Promise<boolean> {
|
|
249
|
-
return !!(await this.node.getContractClass(id));
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
async #isContractPublished(address: AztecAddress): Promise<boolean> {
|
|
253
|
-
return !!(await this.node.getContract(address));
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
async #isContractInitialized(address: AztecAddress): Promise<boolean> {
|
|
257
|
-
const initNullifier = await siloNullifier(address, address.toField());
|
|
258
|
-
return !!(await this.node.getNullifierMembershipWitness('latest', initNullifier));
|
|
259
|
-
}
|
|
260
|
-
|
|
261
284
|
// Executes the entrypoint private function, as well as all nested private
|
|
262
285
|
// functions that might arise.
|
|
263
286
|
async #executePrivate(
|
|
264
287
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
265
288
|
txRequest: TxExecutionRequest,
|
|
266
|
-
scopes
|
|
289
|
+
scopes: AztecAddress[] | undefined,
|
|
290
|
+
jobId: string,
|
|
267
291
|
): Promise<PrivateExecutionResult> {
|
|
268
292
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
269
293
|
|
|
270
294
|
try {
|
|
271
295
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
272
296
|
|
|
297
|
+
await ensureContractSynced(
|
|
298
|
+
contractAddress,
|
|
299
|
+
functionSelector,
|
|
300
|
+
privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
|
|
301
|
+
this.node,
|
|
302
|
+
this.contractStore,
|
|
303
|
+
anchorBlockHeader,
|
|
304
|
+
);
|
|
305
|
+
|
|
273
306
|
const result = await contractFunctionSimulator.run(
|
|
274
307
|
txRequest,
|
|
275
308
|
contractAddress,
|
|
@@ -280,6 +313,7 @@ export class PXE {
|
|
|
280
313
|
// contract entrypoint
|
|
281
314
|
undefined, // senderForTags
|
|
282
315
|
scopes,
|
|
316
|
+
jobId,
|
|
283
317
|
);
|
|
284
318
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
285
319
|
return result;
|
|
@@ -298,17 +332,19 @@ export class PXE {
|
|
|
298
332
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
299
333
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
300
334
|
* accounts if not specified.
|
|
335
|
+
* @param jobId - The job ID for staged writes.
|
|
301
336
|
* @returns The simulation result containing the outputs of the utility function.
|
|
302
337
|
*/
|
|
303
338
|
async #simulateUtility(
|
|
304
339
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
305
340
|
call: FunctionCall,
|
|
306
|
-
authWitnesses
|
|
307
|
-
scopes
|
|
341
|
+
authWitnesses: AuthWitness[] | undefined,
|
|
342
|
+
scopes: AztecAddress[] | undefined,
|
|
343
|
+
jobId: string,
|
|
308
344
|
) {
|
|
309
345
|
try {
|
|
310
346
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
311
|
-
return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes);
|
|
347
|
+
return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
|
|
312
348
|
} catch (err) {
|
|
313
349
|
if (err instanceof SimulationError) {
|
|
314
350
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -361,13 +397,9 @@ export class PXE {
|
|
|
361
397
|
privateExecutionResult: PrivateExecutionResult,
|
|
362
398
|
config: PrivateKernelExecutionProverConfig,
|
|
363
399
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
364
|
-
const
|
|
365
|
-
const
|
|
366
|
-
|
|
367
|
-
this.keyStore,
|
|
368
|
-
this.node,
|
|
369
|
-
simulationAnchorBlock,
|
|
370
|
-
);
|
|
400
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
401
|
+
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
402
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
371
403
|
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
|
|
372
404
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
373
405
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
@@ -380,66 +412,12 @@ export class PXE {
|
|
|
380
412
|
}
|
|
381
413
|
|
|
382
414
|
/**
|
|
383
|
-
* Returns the contract
|
|
384
|
-
*
|
|
385
|
-
* @
|
|
386
|
-
* @param id - Identifier of the class.
|
|
387
|
-
* @param includeArtifact - Identifier of the class.
|
|
388
|
-
* @returns - It returns the contract class metadata, with the artifact field being optional, and will only be returned if true is passed in
|
|
389
|
-
* for `includeArtifact`
|
|
390
|
-
* TODO(@spalladino): The PXE actually holds artifacts and not classes, what should we return? Also,
|
|
391
|
-
* should the pxe query the node for contract public info, and merge it with its own definitions?
|
|
392
|
-
* TODO(@spalladino): This method is strictly needed to decide whether to publicly register a class or not
|
|
393
|
-
* during a public deployment. We probably want a nicer and more general API for this, but it'll have to
|
|
394
|
-
* do for the time being.
|
|
415
|
+
* Returns the contract artifact for a given contract class id, if it's registered in the PXE.
|
|
416
|
+
* @param id - Identifier of the contract class.
|
|
417
|
+
* @returns The contract artifact if found, undefined otherwise.
|
|
395
418
|
*/
|
|
396
|
-
public async
|
|
397
|
-
id
|
|
398
|
-
includeArtifact: boolean = false,
|
|
399
|
-
): Promise<{
|
|
400
|
-
contractClass: ContractClassWithId | undefined;
|
|
401
|
-
isContractClassPubliclyRegistered: boolean;
|
|
402
|
-
artifact: ContractArtifact | undefined;
|
|
403
|
-
}> {
|
|
404
|
-
const artifact = await this.contractStore.getContractArtifact(id);
|
|
405
|
-
if (!artifact) {
|
|
406
|
-
this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
return {
|
|
410
|
-
contractClass: artifact && (await getContractClassFromArtifact(artifact)),
|
|
411
|
-
isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
|
|
412
|
-
artifact: includeArtifact ? artifact : undefined,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
/**
|
|
417
|
-
* Returns the contract metadata given an address.
|
|
418
|
-
* The metadata consists of its contract instance, which includes the contract class identifier,
|
|
419
|
-
* initialization hash, deployment salt, and public keys hash; whether the contract instance has been initialized;
|
|
420
|
-
* and whether the contract instance with the given address has been publicly deployed.
|
|
421
|
-
* @remark - it queries the node to check whether the contract instance has been initialized / publicly deployed through a node.
|
|
422
|
-
* This query is not dependent on the PXE.
|
|
423
|
-
* @param address - The address that the contract instance resides at.
|
|
424
|
-
* @returns - It returns the contract metadata
|
|
425
|
-
* TODO(@spalladino): Should we return the public keys in plain as well here?
|
|
426
|
-
*/
|
|
427
|
-
public async getContractMetadata(address: AztecAddress): Promise<{
|
|
428
|
-
contractInstance: ContractInstanceWithAddress | undefined;
|
|
429
|
-
isContractInitialized: boolean;
|
|
430
|
-
isContractPublished: boolean;
|
|
431
|
-
}> {
|
|
432
|
-
let instance;
|
|
433
|
-
try {
|
|
434
|
-
instance = await this.contractStore.getContractInstance(address);
|
|
435
|
-
} catch {
|
|
436
|
-
this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
|
|
437
|
-
}
|
|
438
|
-
return {
|
|
439
|
-
contractInstance: instance,
|
|
440
|
-
isContractInitialized: await this.#isContractInitialized(address),
|
|
441
|
-
isContractPublished: await this.#isContractPublished(address),
|
|
442
|
-
};
|
|
419
|
+
public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
|
|
420
|
+
return await this.contractStore.getContractArtifact(id);
|
|
443
421
|
}
|
|
444
422
|
|
|
445
423
|
/**
|
|
@@ -464,7 +442,6 @@ export class PXE {
|
|
|
464
442
|
}
|
|
465
443
|
|
|
466
444
|
await this.addressStore.addCompleteAddress(accountCompleteAddress);
|
|
467
|
-
await this.noteStore.addScope(accountCompleteAddress.address);
|
|
468
445
|
return accountCompleteAddress;
|
|
469
446
|
}
|
|
470
447
|
|
|
@@ -612,13 +589,7 @@ export class PXE {
|
|
|
612
589
|
|
|
613
590
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
614
591
|
|
|
615
|
-
const currentClassId = await readCurrentClassId(
|
|
616
|
-
contractAddress,
|
|
617
|
-
currentInstance,
|
|
618
|
-
this.node,
|
|
619
|
-
header.globalVariables.blockNumber,
|
|
620
|
-
header.globalVariables.timestamp,
|
|
621
|
-
);
|
|
592
|
+
const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
|
|
622
593
|
if (!contractClass.id.equals(currentClassId)) {
|
|
623
594
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
624
595
|
}
|
|
@@ -657,14 +628,14 @@ export class PXE {
|
|
|
657
628
|
let privateExecutionResult: PrivateExecutionResult;
|
|
658
629
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
659
630
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
660
|
-
return this.#putInJobQueue(async
|
|
631
|
+
return this.#putInJobQueue(async jobId => {
|
|
661
632
|
const totalTimer = new Timer();
|
|
662
633
|
try {
|
|
663
634
|
const syncTimer = new Timer();
|
|
664
635
|
await this.blockStateSynchronizer.sync();
|
|
665
636
|
const syncTime = syncTimer.ms();
|
|
666
637
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
667
|
-
privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest);
|
|
638
|
+
privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
|
|
668
639
|
|
|
669
640
|
const {
|
|
670
641
|
publicInputs,
|
|
@@ -711,7 +682,7 @@ export class PXE {
|
|
|
711
682
|
// TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
|
|
712
683
|
const txHash = (await txProvingResult.toTx()).txHash;
|
|
713
684
|
|
|
714
|
-
await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash);
|
|
685
|
+
await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
|
|
715
686
|
this.log.debug(`Stored used pre-tags as sender for the tx`, {
|
|
716
687
|
preTagsUsedInTheTx,
|
|
717
688
|
});
|
|
@@ -741,7 +712,7 @@ export class PXE {
|
|
|
741
712
|
skipProofGeneration: boolean = true,
|
|
742
713
|
): Promise<TxProfileResult> {
|
|
743
714
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
744
|
-
return this.#putInJobQueue(async
|
|
715
|
+
return this.#putInJobQueue(async jobId => {
|
|
745
716
|
const totalTimer = new Timer();
|
|
746
717
|
try {
|
|
747
718
|
const txInfo = {
|
|
@@ -761,7 +732,12 @@ export class PXE {
|
|
|
761
732
|
const syncTime = syncTimer.ms();
|
|
762
733
|
|
|
763
734
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
764
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
735
|
+
const privateExecutionResult = await this.#executePrivate(
|
|
736
|
+
contractFunctionSimulator,
|
|
737
|
+
txRequest,
|
|
738
|
+
undefined,
|
|
739
|
+
jobId,
|
|
740
|
+
);
|
|
765
741
|
|
|
766
742
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
767
743
|
txRequest,
|
|
@@ -841,7 +817,7 @@ export class PXE {
|
|
|
841
817
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
842
818
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
843
819
|
// delete the same read value, or reading values that another simulation is currently modifying).
|
|
844
|
-
return this.#putInJobQueue(async
|
|
820
|
+
return this.#putInJobQueue(async jobId => {
|
|
845
821
|
try {
|
|
846
822
|
const totalTimer = new Timer();
|
|
847
823
|
const txInfo = {
|
|
@@ -867,20 +843,14 @@ export class PXE {
|
|
|
867
843
|
const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
|
|
868
844
|
|
|
869
845
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
870
|
-
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes);
|
|
846
|
+
const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
|
|
871
847
|
|
|
872
848
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
873
849
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
874
850
|
|
|
875
851
|
if (skipKernels) {
|
|
876
|
-
// According to the protocol rules, the nonce generator for the note hashes
|
|
877
|
-
// can either be the first nullifier in the tx or the protocol nullifier if there are none.
|
|
878
|
-
const nonceGenerator = privateExecutionResult.firstNullifier.equals(Fr.ZERO)
|
|
879
|
-
? await computeProtocolNullifier(await txRequest.toTxRequest().hash())
|
|
880
|
-
: privateExecutionResult.firstNullifier;
|
|
881
852
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
882
853
|
privateExecutionResult,
|
|
883
|
-
nonceGenerator,
|
|
884
854
|
this.contractStore,
|
|
885
855
|
));
|
|
886
856
|
} else {
|
|
@@ -982,7 +952,7 @@ export class PXE {
|
|
|
982
952
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
983
953
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
984
954
|
// delete the same read value, or reading values that another simulation is currently modifying).
|
|
985
|
-
return this.#putInJobQueue(async
|
|
955
|
+
return this.#putInJobQueue(async jobId => {
|
|
986
956
|
try {
|
|
987
957
|
const totalTimer = new Timer();
|
|
988
958
|
const syncTimer = new Timer();
|
|
@@ -991,11 +961,23 @@ export class PXE {
|
|
|
991
961
|
const functionTimer = new Timer();
|
|
992
962
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
993
963
|
|
|
994
|
-
await this.
|
|
995
|
-
|
|
964
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
965
|
+
await ensureContractSynced(
|
|
966
|
+
call.to,
|
|
967
|
+
call.selector,
|
|
968
|
+
privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
|
|
969
|
+
this.node,
|
|
970
|
+
this.contractStore,
|
|
971
|
+
anchorBlockHeader,
|
|
996
972
|
);
|
|
997
973
|
|
|
998
|
-
const executionResult = await this.#simulateUtility(
|
|
974
|
+
const executionResult = await this.#simulateUtility(
|
|
975
|
+
contractFunctionSimulator,
|
|
976
|
+
call,
|
|
977
|
+
authwits ?? [],
|
|
978
|
+
scopes,
|
|
979
|
+
jobId,
|
|
980
|
+
);
|
|
999
981
|
const functionTime = functionTimer.ms();
|
|
1000
982
|
|
|
1001
983
|
const totalTime = totalTimer.ms();
|
|
@@ -1036,25 +1018,39 @@ export class PXE {
|
|
|
1036
1018
|
* Defaults to the latest known block to PXE + 1.
|
|
1037
1019
|
* @returns - The packed events with block and tx metadata.
|
|
1038
1020
|
*/
|
|
1039
|
-
public getPrivateEvents(
|
|
1040
|
-
|
|
1021
|
+
public async getPrivateEvents(
|
|
1022
|
+
eventSelector: EventSelector,
|
|
1023
|
+
filter: PrivateEventFilter,
|
|
1024
|
+
): Promise<PackedPrivateEvent[]> {
|
|
1025
|
+
let anchorBlockNumber: BlockNumber;
|
|
1026
|
+
|
|
1027
|
+
await this.#putInJobQueue(async jobId => {
|
|
1041
1028
|
await this.blockStateSynchronizer.sync();
|
|
1029
|
+
|
|
1030
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1031
|
+
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
1032
|
+
|
|
1042
1033
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1043
1034
|
|
|
1044
|
-
await
|
|
1035
|
+
await ensureContractSynced(
|
|
1045
1036
|
filter.contractAddress,
|
|
1046
1037
|
null,
|
|
1047
|
-
async privateSyncCall =>
|
|
1038
|
+
async privateSyncCall =>
|
|
1039
|
+
await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
|
|
1040
|
+
this.node,
|
|
1041
|
+
this.contractStore,
|
|
1042
|
+
anchorBlockHeader,
|
|
1048
1043
|
);
|
|
1044
|
+
});
|
|
1049
1045
|
|
|
1050
|
-
|
|
1046
|
+
// anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
|
|
1047
|
+
const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
|
|
1051
1048
|
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1049
|
+
this.log.debug(
|
|
1050
|
+
`Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
|
|
1051
|
+
);
|
|
1055
1052
|
|
|
1056
|
-
|
|
1057
|
-
});
|
|
1053
|
+
return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
|
|
1058
1054
|
}
|
|
1059
1055
|
|
|
1060
1056
|
/**
|