@aztec/pxe 0.77.1 → 0.78.1
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/index.js +1 -1
- package/dest/config/index.d.ts +1 -0
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -0
- package/dest/entrypoints/client/bundle/index.d.ts +6 -0
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -0
- package/dest/entrypoints/client/bundle/index.js +5 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +16 -0
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -0
- package/dest/entrypoints/client/bundle/utils.js +30 -0
- package/dest/entrypoints/client/lazy/index.d.ts +6 -0
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -0
- package/dest/entrypoints/client/lazy/index.js +5 -0
- package/dest/entrypoints/client/lazy/utils.d.ts +15 -0
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -0
- package/dest/entrypoints/client/lazy/utils.js +29 -0
- package/dest/entrypoints/client/pxe_creation_options.d.ts +11 -0
- package/dest/entrypoints/client/pxe_creation_options.d.ts.map +1 -0
- package/dest/entrypoints/server/index.d.ts +7 -0
- package/dest/entrypoints/server/index.d.ts.map +1 -0
- package/dest/entrypoints/server/index.js +6 -0
- package/dest/{utils/create_pxe_service.d.ts → entrypoints/server/utils.d.ts} +4 -4
- package/dest/entrypoints/server/utils.d.ts.map +1 -0
- package/dest/{utils/create_pxe_service.js → entrypoints/server/utils.js} +5 -11
- package/dest/kernel_oracle/index.d.ts +2 -1
- package/dest/kernel_oracle/index.d.ts.map +1 -1
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
- package/dest/kernel_prover/kernel_prover.js +0 -28
- package/dest/note_decryption_utils/add_public_values_to_payload.d.ts +2 -2
- package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +1 -1
- package/dest/note_decryption_utils/add_public_values_to_payload.js +3 -3
- package/dest/{pxe_data_provider → pxe_oracle_interface}/index.d.ts +17 -9
- package/dest/pxe_oracle_interface/index.d.ts.map +1 -0
- package/dest/{pxe_data_provider → pxe_oracle_interface}/index.js +104 -61
- package/dest/pxe_oracle_interface/tagging_utils.d.ts.map +1 -0
- package/dest/pxe_service/error_enriching.d.ts +3 -4
- package/dest/pxe_service/error_enriching.d.ts.map +1 -1
- package/dest/pxe_service/error_enriching.js +4 -4
- package/dest/pxe_service/pxe_service.d.ts +18 -14
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +118 -65
- package/dest/storage/address_data_provider/address_data_provider.d.ts +13 -0
- package/dest/storage/address_data_provider/address_data_provider.d.ts.map +1 -0
- package/dest/storage/address_data_provider/address_data_provider.js +50 -0
- package/dest/storage/address_data_provider/index.d.ts +2 -0
- package/dest/storage/address_data_provider/index.d.ts.map +1 -0
- package/dest/storage/address_data_provider/index.js +1 -0
- package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts +11 -0
- package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts.map +1 -0
- package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.js +20 -0
- package/dest/storage/auth_witness_data_provider/index.d.ts +2 -0
- package/dest/storage/auth_witness_data_provider/index.d.ts.map +1 -0
- package/dest/storage/auth_witness_data_provider/index.js +1 -0
- package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts +16 -0
- package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts.map +1 -0
- package/dest/storage/capsule_data_provider/capsule_data_provider.js +57 -0
- package/dest/storage/capsule_data_provider/index.d.ts +2 -0
- package/dest/storage/capsule_data_provider/index.d.ts.map +1 -0
- package/dest/storage/capsule_data_provider/index.js +1 -0
- package/dest/{contract_data_provider → storage/contract_data_provider}/contract_data_provider.d.ts +38 -33
- package/dest/storage/contract_data_provider/contract_data_provider.d.ts.map +1 -0
- package/dest/{contract_data_provider → storage/contract_data_provider}/contract_data_provider.js +87 -42
- package/dest/storage/contract_data_provider/index.d.ts.map +1 -0
- package/dest/storage/contract_data_provider/private_functions_tree.d.ts.map +1 -0
- package/dest/storage/data_provider.d.ts +4 -0
- package/dest/storage/data_provider.d.ts.map +1 -0
- package/dest/storage/data_provider.js +1 -0
- package/dest/storage/index.d.ts +10 -0
- package/dest/storage/index.d.ts.map +1 -0
- package/dest/storage/index.js +9 -0
- package/dest/storage/note_data_provider/index.d.ts +3 -0
- package/dest/storage/note_data_provider/index.d.ts.map +1 -0
- package/dest/storage/note_data_provider/index.js +2 -0
- package/dest/storage/note_data_provider/note_dao.d.ts.map +1 -0
- package/dest/storage/note_data_provider/note_data_provider.d.ts +20 -0
- package/dest/storage/note_data_provider/note_data_provider.d.ts.map +1 -0
- package/dest/storage/note_data_provider/note_data_provider.js +249 -0
- package/dest/storage/sync_data_provider/index.d.ts +2 -0
- package/dest/storage/sync_data_provider/index.d.ts.map +1 -0
- package/dest/storage/sync_data_provider/index.js +1 -0
- package/dest/storage/sync_data_provider/sync_data_provider.d.ts +12 -0
- package/dest/storage/sync_data_provider/sync_data_provider.d.ts.map +1 -0
- package/dest/storage/sync_data_provider/sync_data_provider.js +29 -0
- package/dest/storage/tagging_data_provider/index.d.ts +2 -0
- package/dest/storage/tagging_data_provider/index.d.ts.map +1 -0
- package/dest/storage/tagging_data_provider/index.js +1 -0
- package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts +18 -0
- package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts.map +1 -0
- package/dest/storage/tagging_data_provider/tagging_data_provider.js +65 -0
- package/dest/synchronizer/synchronizer.d.ts +7 -3
- package/dest/synchronizer/synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/synchronizer.js +16 -11
- package/dest/test/pxe_test_suite.d.ts.map +1 -0
- package/dest/{pxe_service/test → test}/pxe_test_suite.js +2 -6
- package/package.json +19 -26
- package/src/bin/index.ts +1 -1
- package/src/config/index.ts +2 -0
- package/src/entrypoints/client/bundle/index.ts +5 -0
- package/src/entrypoints/client/bundle/utils.ts +58 -0
- package/src/entrypoints/client/lazy/index.ts +5 -0
- package/src/entrypoints/client/lazy/utils.ts +53 -0
- package/src/entrypoints/client/pxe_creation_options.ts +7 -0
- package/src/entrypoints/server/index.ts +6 -0
- package/src/{utils/create_pxe_service.ts → entrypoints/server/utils.ts} +7 -18
- package/src/kernel_oracle/index.ts +1 -1
- package/src/kernel_prover/kernel_prover.ts +0 -51
- package/src/note_decryption_utils/add_public_values_to_payload.ts +4 -4
- package/src/{pxe_data_provider → pxe_oracle_interface}/index.ts +128 -96
- package/src/pxe_service/error_enriching.ts +8 -6
- package/src/pxe_service/pxe_service.ts +155 -89
- package/src/storage/address_data_provider/address_data_provider.ts +71 -0
- package/src/storage/address_data_provider/index.ts +1 -0
- package/src/storage/auth_witness_data_provider/auth_witness_data_provider.ts +34 -0
- package/src/storage/auth_witness_data_provider/index.ts +1 -0
- package/src/storage/capsule_data_provider/capsule_data_provider.ts +80 -0
- package/src/storage/capsule_data_provider/index.ts +1 -0
- package/src/{contract_data_provider → storage/contract_data_provider}/contract_data_provider.ts +128 -48
- package/src/storage/data_provider.ts +3 -0
- package/src/storage/index.ts +10 -0
- package/src/storage/note_data_provider/index.ts +2 -0
- package/src/storage/note_data_provider/note_data_provider.ts +345 -0
- package/src/storage/sync_data_provider/index.ts +1 -0
- package/src/storage/sync_data_provider/sync_data_provider.ts +40 -0
- package/src/storage/tagging_data_provider/index.ts +1 -0
- package/src/storage/tagging_data_provider/tagging_data_provider.ts +92 -0
- package/src/synchronizer/synchronizer.ts +15 -10
- package/src/{pxe_service/test → test}/pxe_test_suite.ts +2 -9
- package/dest/contract_data_provider/contract_data_provider.d.ts.map +0 -1
- package/dest/contract_data_provider/index.d.ts.map +0 -1
- package/dest/contract_data_provider/private_functions_tree.d.ts.map +0 -1
- package/dest/database/index.d.ts +0 -3
- package/dest/database/index.d.ts.map +0 -1
- package/dest/database/index.js +0 -2
- package/dest/database/interfaces/contract_artifact_db.d.ts +0 -20
- package/dest/database/interfaces/contract_artifact_db.d.ts.map +0 -1
- package/dest/database/interfaces/contract_artifact_db.js +0 -3
- package/dest/database/interfaces/contract_instance_db.d.ts +0 -20
- package/dest/database/interfaces/contract_instance_db.d.ts.map +0 -1
- package/dest/database/interfaces/contract_instance_db.js +0 -3
- package/dest/database/interfaces/index.d.ts +0 -4
- package/dest/database/interfaces/index.d.ts.map +0 -1
- package/dest/database/interfaces/pxe_database.d.ts +0 -211
- package/dest/database/interfaces/pxe_database.d.ts.map +0 -1
- package/dest/database/interfaces/pxe_database.js +0 -4
- package/dest/database/interfaces/pxe_database_test_suite.d.ts +0 -7
- package/dest/database/interfaces/pxe_database_test_suite.d.ts.map +0 -1
- package/dest/database/interfaces/pxe_database_test_suite.js +0 -557
- package/dest/database/kv_pxe_database.d.ts +0 -58
- package/dest/database/kv_pxe_database.d.ts.map +0 -1
- package/dest/database/kv_pxe_database.js +0 -480
- package/dest/database/note_dao.d.ts.map +0 -1
- package/dest/index.d.ts +0 -9
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -8
- package/dest/pxe_data_provider/index.d.ts.map +0 -1
- package/dest/pxe_data_provider/tagging_utils.d.ts.map +0 -1
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +0 -1
- package/dest/utils/create_pxe_service.d.ts.map +0 -1
- package/src/database/index.ts +0 -2
- package/src/database/interfaces/contract_artifact_db.ts +0 -20
- package/src/database/interfaces/contract_instance_db.ts +0 -21
- package/src/database/interfaces/index.ts +0 -3
- package/src/database/interfaces/pxe_database.ts +0 -240
- package/src/database/interfaces/pxe_database_test_suite.ts +0 -558
- package/src/database/kv_pxe_database.ts +0 -670
- package/src/index.ts +0 -9
- /package/dest/{database/interfaces/index.js → entrypoints/client/pxe_creation_options.js} +0 -0
- /package/dest/{pxe_data_provider → pxe_oracle_interface}/tagging_utils.d.ts +0 -0
- /package/dest/{pxe_data_provider → pxe_oracle_interface}/tagging_utils.js +0 -0
- /package/dest/{contract_data_provider → storage/contract_data_provider}/index.d.ts +0 -0
- /package/dest/{contract_data_provider → storage/contract_data_provider}/index.js +0 -0
- /package/dest/{contract_data_provider → storage/contract_data_provider}/private_functions_tree.d.ts +0 -0
- /package/dest/{contract_data_provider → storage/contract_data_provider}/private_functions_tree.js +0 -0
- /package/dest/{database → storage/note_data_provider}/note_dao.d.ts +0 -0
- /package/dest/{database → storage/note_data_provider}/note_dao.js +0 -0
- /package/dest/{pxe_service/test → test}/pxe_test_suite.d.ts +0 -0
- /package/src/{pxe_data_provider → pxe_oracle_interface}/tagging_utils.ts +0 -0
- /package/src/{contract_data_provider → storage/contract_data_provider}/index.ts +0 -0
- /package/src/{contract_data_provider → storage/contract_data_provider}/private_functions_tree.ts +0 -0
- /package/src/{database → storage/note_data_provider}/note_dao.ts +0 -0
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
1
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
3
|
import { Timer } from '@aztec/foundation/timer';
|
|
4
|
+
import { KeyStore } from '@aztec/key-store';
|
|
5
|
+
import { L2TipsStore } from '@aztec/kv-store/stores';
|
|
3
6
|
import { ProtocolContractAddress, protocolContractNames } from '@aztec/protocol-contracts';
|
|
4
7
|
import { AcirSimulator, readCurrentClassId } from '@aztec/simulator/client';
|
|
5
8
|
import { EventSelector, FunctionSelector, FunctionType, decodeFunctionSignature, encodeArguments } from '@aztec/stdlib/abi';
|
|
@@ -10,73 +13,125 @@ import { siloNullifier } from '@aztec/stdlib/hash';
|
|
|
10
13
|
import { computeAddressSecret } from '@aztec/stdlib/keys';
|
|
11
14
|
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
12
15
|
import { UniqueNote } from '@aztec/stdlib/note';
|
|
16
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
13
17
|
import { PrivateSimulationResult, TxProvingResult, TxSimulationResult } from '@aztec/stdlib/tx';
|
|
14
18
|
import { inspect } from 'util';
|
|
15
19
|
import { getPackageInfo } from '../config/package_info.js';
|
|
16
|
-
import { ContractDataProvider } from '../contract_data_provider/index.js';
|
|
17
20
|
import { KernelOracle } from '../kernel_oracle/index.js';
|
|
18
21
|
import { KernelProver } from '../kernel_prover/kernel_prover.js';
|
|
19
|
-
import {
|
|
22
|
+
import { PXEOracleInterface } from '../pxe_oracle_interface/index.js';
|
|
23
|
+
import { AddressDataProvider } from '../storage/address_data_provider/address_data_provider.js';
|
|
24
|
+
import { AuthWitnessDataProvider } from '../storage/auth_witness_data_provider/auth_witness_data_provider.js';
|
|
25
|
+
import { CapsuleDataProvider } from '../storage/capsule_data_provider/capsule_data_provider.js';
|
|
26
|
+
import { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js';
|
|
27
|
+
import { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js';
|
|
28
|
+
import { SyncDataProvider } from '../storage/sync_data_provider/sync_data_provider.js';
|
|
29
|
+
import { TaggingDataProvider } from '../storage/tagging_data_provider/tagging_data_provider.js';
|
|
20
30
|
import { Synchronizer } from '../synchronizer/index.js';
|
|
21
31
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
22
32
|
/**
|
|
23
33
|
* A Private eXecution Environment (PXE) implementation.
|
|
24
34
|
*/ export class PXEService {
|
|
25
|
-
keyStore;
|
|
26
35
|
node;
|
|
27
|
-
db;
|
|
28
|
-
proofCreator;
|
|
29
|
-
protocolContractsProvider;
|
|
30
36
|
synchronizer;
|
|
37
|
+
keyStore;
|
|
31
38
|
contractDataProvider;
|
|
32
|
-
|
|
39
|
+
noteDataProvider;
|
|
40
|
+
capsuleDataProvider;
|
|
41
|
+
syncDataProvider;
|
|
42
|
+
taggingDataProvider;
|
|
43
|
+
addressDataProvider;
|
|
44
|
+
authWitnessDataProvider;
|
|
33
45
|
simulator;
|
|
34
|
-
log;
|
|
35
46
|
packageVersion;
|
|
36
47
|
proverEnabled;
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
proofCreator;
|
|
49
|
+
protocolContractsProvider;
|
|
50
|
+
log;
|
|
51
|
+
constructor(node, synchronizer, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, authWitnessDataProvider, simulator, packageVersion, proverEnabled, proofCreator, protocolContractsProvider, log){
|
|
39
52
|
this.node = node;
|
|
40
|
-
this.
|
|
53
|
+
this.synchronizer = synchronizer;
|
|
54
|
+
this.keyStore = keyStore;
|
|
55
|
+
this.contractDataProvider = contractDataProvider;
|
|
56
|
+
this.noteDataProvider = noteDataProvider;
|
|
57
|
+
this.capsuleDataProvider = capsuleDataProvider;
|
|
58
|
+
this.syncDataProvider = syncDataProvider;
|
|
59
|
+
this.taggingDataProvider = taggingDataProvider;
|
|
60
|
+
this.addressDataProvider = addressDataProvider;
|
|
61
|
+
this.authWitnessDataProvider = authWitnessDataProvider;
|
|
62
|
+
this.simulator = simulator;
|
|
63
|
+
this.packageVersion = packageVersion;
|
|
64
|
+
this.proverEnabled = proverEnabled;
|
|
41
65
|
this.proofCreator = proofCreator;
|
|
42
66
|
this.protocolContractsProvider = protocolContractsProvider;
|
|
43
|
-
this.log =
|
|
44
|
-
this.synchronizer = new Synchronizer(node, db, tipsStore, config, loggerOrSuffix);
|
|
45
|
-
this.contractDataProvider = new ContractDataProvider(db);
|
|
46
|
-
this.pxeDataProvider = new PXEDataProvider(db, keyStore, node, simulationProvider, this.contractDataProvider, this.log);
|
|
47
|
-
this.simulator = new AcirSimulator(this.pxeDataProvider, simulationProvider);
|
|
48
|
-
this.packageVersion = getPackageInfo().version;
|
|
49
|
-
this.proverEnabled = !!config.proverEnabled;
|
|
67
|
+
this.log = log;
|
|
50
68
|
}
|
|
51
69
|
/**
|
|
52
|
-
*
|
|
70
|
+
* Creates an instance of a PXE Service by instantiating all the necessary data providers and services.
|
|
71
|
+
* Also triggers the registration of the protocol contracts and makes sure the provided node
|
|
72
|
+
* can be contacted.
|
|
53
73
|
*
|
|
54
|
-
* @returns A promise that resolves
|
|
55
|
-
*/ async
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
74
|
+
* @returns A promise that resolves PXE service is ready to be used.
|
|
75
|
+
*/ static async create(node, store, proofCreator, simulationProvider, protocolContractsProvider, config, loggerOrSuffix) {
|
|
76
|
+
const log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
|
|
77
|
+
const packageVersion = getPackageInfo().version;
|
|
78
|
+
const proverEnabled = !!config.proverEnabled;
|
|
79
|
+
const addressDataProvider = new AddressDataProvider(store);
|
|
80
|
+
const authWitnessDataProvider = new AuthWitnessDataProvider(store);
|
|
81
|
+
const contractDataProvider = new ContractDataProvider(store);
|
|
82
|
+
const noteDataProvider = await NoteDataProvider.create(store);
|
|
83
|
+
const syncDataProvider = new SyncDataProvider(store);
|
|
84
|
+
const taggingDataProvider = new TaggingDataProvider(store);
|
|
85
|
+
const capsuleDataProvider = new CapsuleDataProvider(store);
|
|
86
|
+
const keyStore = new KeyStore(store);
|
|
87
|
+
const tipsStore = new L2TipsStore(store, 'pxe');
|
|
88
|
+
const synchronizer = new Synchronizer(node, syncDataProvider, noteDataProvider, taggingDataProvider, tipsStore, config, loggerOrSuffix);
|
|
89
|
+
const pxeOracleInterface = new PXEOracleInterface(node, keyStore, simulationProvider, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, authWitnessDataProvider, log);
|
|
90
|
+
const simulator = new AcirSimulator(pxeOracleInterface, simulationProvider);
|
|
91
|
+
const pxeService = new PXEService(node, synchronizer, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, authWitnessDataProvider, simulator, packageVersion, proverEnabled, proofCreator, protocolContractsProvider, log);
|
|
92
|
+
await pxeService.#registerProtocolContracts();
|
|
93
|
+
const info = await pxeService.getNodeInfo();
|
|
94
|
+
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.protocolVersion}`);
|
|
95
|
+
return pxeService;
|
|
59
96
|
}
|
|
60
97
|
isL1ToL2MessageSynced(l1ToL2Message) {
|
|
61
98
|
return this.node.isL1ToL2MessageSynced(l1ToL2Message);
|
|
62
99
|
}
|
|
63
|
-
/** Returns an estimate of the db size in bytes. */ estimateDbSize() {
|
|
64
|
-
|
|
100
|
+
/** Returns an estimate of the db size in bytes. */ async estimateDbSize() {
|
|
101
|
+
const treeRootsSize = Object.keys(MerkleTreeId).length * Fr.SIZE_IN_BYTES;
|
|
102
|
+
const dbSizes = await Promise.all([
|
|
103
|
+
this.addressDataProvider.getSize(),
|
|
104
|
+
this.authWitnessDataProvider.getSize(),
|
|
105
|
+
this.capsuleDataProvider.getSize(),
|
|
106
|
+
this.contractDataProvider.getSize(),
|
|
107
|
+
this.noteDataProvider.getSize(),
|
|
108
|
+
this.syncDataProvider.getSize(),
|
|
109
|
+
this.taggingDataProvider.getSize()
|
|
110
|
+
]);
|
|
111
|
+
return [
|
|
112
|
+
...dbSizes,
|
|
113
|
+
treeRootsSize
|
|
114
|
+
].reduce((sum, size)=>sum + size, 0);
|
|
65
115
|
}
|
|
66
116
|
addAuthWitness(witness) {
|
|
67
|
-
return this.
|
|
117
|
+
return this.authWitnessDataProvider.addAuthWitness(witness.requestHash, witness.witness);
|
|
68
118
|
}
|
|
69
119
|
getAuthWitness(messageHash) {
|
|
70
|
-
return this.
|
|
120
|
+
return this.authWitnessDataProvider.getAuthWitness(messageHash);
|
|
71
121
|
}
|
|
72
122
|
storeCapsule(contract, storageSlot, capsule) {
|
|
73
|
-
return this.
|
|
123
|
+
return this.capsuleDataProvider.storeCapsule(contract, storageSlot, capsule);
|
|
74
124
|
}
|
|
75
125
|
getContractInstance(address) {
|
|
76
|
-
return this.
|
|
126
|
+
return this.contractDataProvider.getContractInstance(address);
|
|
77
127
|
}
|
|
78
128
|
async getContractClassMetadata(id, includeArtifact = false) {
|
|
79
|
-
|
|
129
|
+
let artifact;
|
|
130
|
+
try {
|
|
131
|
+
artifact = await this.contractDataProvider.getContractArtifact(id);
|
|
132
|
+
} catch {
|
|
133
|
+
this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
|
|
134
|
+
}
|
|
80
135
|
return {
|
|
81
136
|
contractClass: artifact && await getContractClassFromArtifact(artifact),
|
|
82
137
|
isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
|
|
@@ -84,8 +139,14 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
84
139
|
};
|
|
85
140
|
}
|
|
86
141
|
async getContractMetadata(address) {
|
|
142
|
+
let instance;
|
|
143
|
+
try {
|
|
144
|
+
instance = await this.contractDataProvider.getContractInstance(address);
|
|
145
|
+
} catch {
|
|
146
|
+
this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
|
|
147
|
+
}
|
|
87
148
|
return {
|
|
88
|
-
contractInstance:
|
|
149
|
+
contractInstance: instance,
|
|
89
150
|
isContractInitialized: await this.#isContractInitialized(address),
|
|
90
151
|
isContractPubliclyDeployed: await this.#isContractPubliclyDeployed(address)
|
|
91
152
|
};
|
|
@@ -100,7 +161,8 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
100
161
|
this.log.info(`Registered account ${accountCompleteAddress.address.toString()}`);
|
|
101
162
|
this.log.debug(`Registered account\n ${accountCompleteAddress.toReadableString()}`);
|
|
102
163
|
}
|
|
103
|
-
await this.
|
|
164
|
+
await this.addressDataProvider.addCompleteAddress(accountCompleteAddress);
|
|
165
|
+
await this.noteDataProvider.addScope(accountCompleteAddress.address);
|
|
104
166
|
return accountCompleteAddress;
|
|
105
167
|
}
|
|
106
168
|
async registerSender(address) {
|
|
@@ -109,7 +171,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
109
171
|
this.log.info(`Sender:\n "${address.toString()}"\n already registered.`);
|
|
110
172
|
return address;
|
|
111
173
|
}
|
|
112
|
-
const wasAdded = await this.
|
|
174
|
+
const wasAdded = await this.taggingDataProvider.addSenderAddress(address);
|
|
113
175
|
if (wasAdded) {
|
|
114
176
|
this.log.info(`Added sender:\n ${address.toString()}`);
|
|
115
177
|
} else {
|
|
@@ -118,11 +180,11 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
118
180
|
return address;
|
|
119
181
|
}
|
|
120
182
|
getSenders() {
|
|
121
|
-
const senders = this.
|
|
183
|
+
const senders = this.taggingDataProvider.getSenderAddresses();
|
|
122
184
|
return Promise.resolve(senders);
|
|
123
185
|
}
|
|
124
186
|
async removeSender(address) {
|
|
125
|
-
const wasRemoved = await this.
|
|
187
|
+
const wasRemoved = await this.taggingDataProvider.removeSenderAddress(address);
|
|
126
188
|
if (wasRemoved) {
|
|
127
189
|
this.log.info(`Removed sender:\n ${address.toString()}`);
|
|
128
190
|
} else {
|
|
@@ -132,14 +194,14 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
132
194
|
}
|
|
133
195
|
async getRegisteredAccounts() {
|
|
134
196
|
// Get complete addresses of both the recipients and the accounts
|
|
135
|
-
const completeAddresses = await this.
|
|
197
|
+
const completeAddresses = await this.addressDataProvider.getCompleteAddresses();
|
|
136
198
|
// Filter out the addresses not corresponding to accounts
|
|
137
199
|
const accounts = await this.keyStore.getAccounts();
|
|
138
200
|
return completeAddresses.filter((completeAddress)=>accounts.find((address)=>address.equals(completeAddress.address)));
|
|
139
201
|
}
|
|
140
202
|
async registerContractClass(artifact) {
|
|
141
203
|
const { id: contractClassId } = await getContractClassFromArtifact(artifact);
|
|
142
|
-
await this.
|
|
204
|
+
await this.contractDataProvider.addContractArtifact(contractClassId, artifact);
|
|
143
205
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
144
206
|
}
|
|
145
207
|
async registerContract(contract) {
|
|
@@ -156,7 +218,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
156
218
|
if (!computedAddress.equals(instance.address)) {
|
|
157
219
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
158
220
|
}
|
|
159
|
-
await this.
|
|
221
|
+
await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
|
|
160
222
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
161
223
|
await this.node.registerContractFunctionSignatures(instance.address, publicFunctionSignatures);
|
|
162
224
|
// TODO(#10007): Node should get public contract class from the registration event, not from PXE registration
|
|
@@ -167,27 +229,21 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
167
229
|
});
|
|
168
230
|
} else {
|
|
169
231
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
170
|
-
artifact = await this.
|
|
171
|
-
if (!artifact) {
|
|
172
|
-
throw new Error(`Missing contract artifact for class id ${instance.currentContractClassId} for contract ${instance.address}`);
|
|
173
|
-
}
|
|
232
|
+
artifact = await this.contractDataProvider.getContractArtifact(instance.currentContractClassId);
|
|
174
233
|
}
|
|
175
|
-
await this.
|
|
234
|
+
await this.contractDataProvider.addContractInstance(instance);
|
|
176
235
|
this.log.info(`Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`);
|
|
177
236
|
}
|
|
178
237
|
async updateContract(contractAddress, artifact) {
|
|
179
|
-
const currentInstance = await this.
|
|
180
|
-
if (!currentInstance) {
|
|
181
|
-
throw new Error(`Contract ${contractAddress.toString()} is not registered.`);
|
|
182
|
-
}
|
|
238
|
+
const currentInstance = await this.contractDataProvider.getContractInstance(contractAddress);
|
|
183
239
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
184
240
|
await this.synchronizer.sync();
|
|
185
|
-
const header = await this.
|
|
186
|
-
const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.
|
|
241
|
+
const header = await this.syncDataProvider.getBlockHeader();
|
|
242
|
+
const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header.globalVariables.blockNumber.toNumber());
|
|
187
243
|
if (!contractClass.id.equals(currentClassId)) {
|
|
188
244
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
189
245
|
}
|
|
190
|
-
await this.
|
|
246
|
+
await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
|
|
191
247
|
const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
192
248
|
await this.node.registerContractFunctionSignatures(contractAddress, publicFunctionSignatures);
|
|
193
249
|
// TODO(#10007): Node should get public contract class from the registration event, not from PXE registration
|
|
@@ -197,24 +253,21 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
197
253
|
unconstrainedFunctions: []
|
|
198
254
|
});
|
|
199
255
|
currentInstance.currentContractClassId = contractClass.id;
|
|
200
|
-
await this.
|
|
256
|
+
await this.contractDataProvider.addContractInstance(currentInstance);
|
|
201
257
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
202
258
|
}
|
|
203
259
|
getContracts() {
|
|
204
|
-
return this.
|
|
260
|
+
return this.contractDataProvider.getContractsAddresses();
|
|
205
261
|
}
|
|
206
262
|
async getPublicStorageAt(contract, slot) {
|
|
207
|
-
if (!await this.getContractInstance(contract)) {
|
|
208
|
-
throw new Error(`Contract ${contract.toString()} is not deployed`);
|
|
209
|
-
}
|
|
210
263
|
return await this.node.getPublicStorageAt('latest', contract, slot);
|
|
211
264
|
}
|
|
212
265
|
async getNotes(filter) {
|
|
213
|
-
const noteDaos = await this.
|
|
266
|
+
const noteDaos = await this.noteDataProvider.getNotes(filter);
|
|
214
267
|
const extendedNotes = noteDaos.map(async (dao)=>{
|
|
215
268
|
let owner = filter.owner;
|
|
216
269
|
if (owner === undefined) {
|
|
217
|
-
const completeAddresses = await this.
|
|
270
|
+
const completeAddresses = await this.addressDataProvider.getCompleteAddresses();
|
|
218
271
|
const completeAddressIndex = (await Promise.all(completeAddresses.map((completeAddresses)=>completeAddresses.address.toAddressPoint()))).findIndex((addressPoint)=>addressPoint.equals(dao.addressPoint));
|
|
219
272
|
const completeAddress = completeAddresses[completeAddressIndex];
|
|
220
273
|
if (completeAddress === undefined) {
|
|
@@ -360,7 +413,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
360
413
|
return this.node.getContractClassLogs(filter);
|
|
361
414
|
}
|
|
362
415
|
async #getFunctionCall(functionName, args, to) {
|
|
363
|
-
const contract = await this.
|
|
416
|
+
const contract = await this.contractDataProvider.getContract(to);
|
|
364
417
|
if (!contract) {
|
|
365
418
|
throw new Error(`Unknown contract ${to}: add it to PXE Service by calling server.addContracts(...).\nSee docs for context: https://docs.aztec.network/developers/reference/debugging/aztecnr-errors#unknown-contract-0x0-add-it-to-pxe-by-calling-serveraddcontracts`);
|
|
366
419
|
}
|
|
@@ -412,8 +465,8 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
412
465
|
const registered = {};
|
|
413
466
|
for (const name of protocolContractNames){
|
|
414
467
|
const { address, contractClass, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
415
|
-
await this.
|
|
416
|
-
await this.
|
|
468
|
+
await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
|
|
469
|
+
await this.contractDataProvider.addContractInstance(instance);
|
|
417
470
|
registered[name] = address.toString();
|
|
418
471
|
}
|
|
419
472
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
@@ -441,7 +494,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
441
494
|
return result;
|
|
442
495
|
} catch (err) {
|
|
443
496
|
if (err instanceof SimulationError) {
|
|
444
|
-
await enrichSimulationError(err, this.
|
|
497
|
+
await enrichSimulationError(err, this.contractDataProvider, this.log);
|
|
445
498
|
}
|
|
446
499
|
throw err;
|
|
447
500
|
}
|
|
@@ -463,7 +516,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
463
516
|
return result;
|
|
464
517
|
} catch (err) {
|
|
465
518
|
if (err instanceof SimulationError) {
|
|
466
|
-
await enrichSimulationError(err, this.
|
|
519
|
+
await enrichSimulationError(err, this.contractDataProvider, this.log);
|
|
467
520
|
}
|
|
468
521
|
throw err;
|
|
469
522
|
}
|
|
@@ -485,7 +538,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
485
538
|
} catch (err) {
|
|
486
539
|
if (err instanceof SimulationError) {
|
|
487
540
|
try {
|
|
488
|
-
await enrichPublicSimulationError(err, this.contractDataProvider, this.
|
|
541
|
+
await enrichPublicSimulationError(err, this.contractDataProvider, this.log);
|
|
489
542
|
} catch (enrichErr) {
|
|
490
543
|
this.log.error(`Failed to enrich public simulation error: ${enrichErr}`);
|
|
491
544
|
}
|
|
@@ -593,7 +646,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
|
|
|
593
646
|
return decodedEvents;
|
|
594
647
|
}
|
|
595
648
|
async resetNoteSyncData() {
|
|
596
|
-
return await this.
|
|
649
|
+
return await this.taggingDataProvider.resetNoteSyncData();
|
|
597
650
|
}
|
|
598
651
|
contextualizeError(err, ...context) {
|
|
599
652
|
let contextStr = '';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
2
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
|
+
import { CompleteAddress } from '@aztec/stdlib/contract';
|
|
4
|
+
import type { DataProvider } from '../data_provider.js';
|
|
5
|
+
export declare class AddressDataProvider implements DataProvider {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(store: AztecAsyncKVStore);
|
|
8
|
+
addCompleteAddress(completeAddress: CompleteAddress): Promise<boolean>;
|
|
9
|
+
getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined>;
|
|
10
|
+
getCompleteAddresses(): Promise<CompleteAddress[]>;
|
|
11
|
+
getSize(): Promise<number>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=address_data_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address_data_provider.d.ts","sourceRoot":"","sources":["../../../src/storage/address_data_provider/address_data_provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,mBAAoB,YAAW,YAAY;;gBAK1C,KAAK,EAAE,iBAAiB;IAOpC,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCtE,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAIzE,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAMlD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAGjC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { toArray } from '@aztec/foundation/iterable';
|
|
2
|
+
import { CompleteAddress } from '@aztec/stdlib/contract';
|
|
3
|
+
export class AddressDataProvider {
|
|
4
|
+
#store;
|
|
5
|
+
#completeAddresses;
|
|
6
|
+
#completeAddressIndex;
|
|
7
|
+
constructor(store){
|
|
8
|
+
this.#store = store;
|
|
9
|
+
this.#completeAddresses = this.#store.openArray('complete_addresses');
|
|
10
|
+
this.#completeAddressIndex = this.#store.openMap('complete_address_index');
|
|
11
|
+
}
|
|
12
|
+
addCompleteAddress(completeAddress) {
|
|
13
|
+
return this.#store.transactionAsync(async ()=>{
|
|
14
|
+
// TODO readd this
|
|
15
|
+
// await this.#addScope(completeAddress.address);
|
|
16
|
+
const addressString = completeAddress.address.toString();
|
|
17
|
+
const buffer = completeAddress.toBuffer();
|
|
18
|
+
const existing = await this.#completeAddressIndex.getAsync(addressString);
|
|
19
|
+
if (existing === undefined) {
|
|
20
|
+
const index = await this.#completeAddresses.lengthAsync();
|
|
21
|
+
await this.#completeAddresses.push(buffer);
|
|
22
|
+
await this.#completeAddressIndex.set(addressString, index);
|
|
23
|
+
return true;
|
|
24
|
+
} else {
|
|
25
|
+
const existingBuffer = await this.#completeAddresses.atAsync(existing);
|
|
26
|
+
if (existingBuffer && Buffer.from(existingBuffer).equals(buffer)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Complete address with aztec address ${addressString} but different public key or partial key already exists in memory database`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async #getCompleteAddress(address) {
|
|
34
|
+
const index = await this.#completeAddressIndex.getAsync(address.toString());
|
|
35
|
+
if (index === undefined) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const value = await this.#completeAddresses.atAsync(index);
|
|
39
|
+
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
40
|
+
}
|
|
41
|
+
getCompleteAddress(account) {
|
|
42
|
+
return this.#getCompleteAddress(account);
|
|
43
|
+
}
|
|
44
|
+
async getCompleteAddresses() {
|
|
45
|
+
return await Promise.all((await toArray(this.#completeAddresses.valuesAsync())).map((v)=>CompleteAddress.fromBuffer(v)));
|
|
46
|
+
}
|
|
47
|
+
async getSize() {
|
|
48
|
+
return await this.#completeAddresses.lengthAsync() * CompleteAddress.SIZE_IN_BYTES;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/address_data_provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AddressDataProvider } from './address_data_provider.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
|
+
import type { DataProvider } from '../data_provider.js';
|
|
4
|
+
export declare class AuthWitnessDataProvider implements DataProvider {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(store: AztecAsyncKVStore);
|
|
7
|
+
addAuthWitness(messageHash: Fr, witness: Fr[]): Promise<void>;
|
|
8
|
+
getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined>;
|
|
9
|
+
getSize(): Promise<number>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=auth_witness_data_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth_witness_data_provider.d.ts","sourceRoot":"","sources":["../../../src/storage/auth_witness_data_provider/auth_witness_data_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,uBAAwB,YAAW,YAAY;;gBAI9C,KAAK,EAAE,iBAAiB;IAK9B,cAAc,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D,cAAc,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC;IAK1D,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAMjC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { toArray } from '@aztec/foundation/iterable';
|
|
3
|
+
export class AuthWitnessDataProvider {
|
|
4
|
+
#store;
|
|
5
|
+
#authWitnesses;
|
|
6
|
+
constructor(store){
|
|
7
|
+
this.#store = store;
|
|
8
|
+
this.#authWitnesses = this.#store.openMap('auth_witnesses');
|
|
9
|
+
}
|
|
10
|
+
async addAuthWitness(messageHash, witness) {
|
|
11
|
+
await this.#authWitnesses.set(messageHash.toString(), witness.map((w)=>w.toBuffer()));
|
|
12
|
+
}
|
|
13
|
+
async getAuthWitness(messageHash) {
|
|
14
|
+
const witness = await this.#authWitnesses.getAsync(messageHash.toString());
|
|
15
|
+
return witness?.map((w)=>Fr.fromBuffer(w));
|
|
16
|
+
}
|
|
17
|
+
async getSize() {
|
|
18
|
+
return (await toArray(this.#authWitnesses.valuesAsync())).reduce((sum, value)=>sum + value.length * Fr.SIZE_IN_BYTES, 0);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/auth_witness_data_provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AuthWitnessDataProvider } from './auth_witness_data_provider.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { type LogFn } from '@aztec/foundation/log';
|
|
3
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
import type { DataProvider } from '../data_provider.js';
|
|
6
|
+
export declare class CapsuleDataProvider implements DataProvider {
|
|
7
|
+
#private;
|
|
8
|
+
debug: LogFn;
|
|
9
|
+
constructor(store: AztecAsyncKVStore);
|
|
10
|
+
storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void>;
|
|
11
|
+
loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null>;
|
|
12
|
+
deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void>;
|
|
13
|
+
copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void>;
|
|
14
|
+
getSize(): Promise<number>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=capsule_data_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsule_data_provider.d.ts","sourceRoot":"","sources":["../../../src/storage/capsule_data_provider/capsule_data_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,KAAK,EAAyB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,mBAAoB,YAAW,YAAY;;IAMtD,KAAK,EAAE,KAAK,CAAC;gBAED,KAAK,EAAE,iBAAiB;IAQ9B,YAAY,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,WAAW,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;IAa1E,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,WAAW,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhG,OAAO;CAMrB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { toArray } from '@aztec/foundation/iterable';
|
|
3
|
+
import { createDebugOnlyLogger } from '@aztec/foundation/log';
|
|
4
|
+
export class CapsuleDataProvider {
|
|
5
|
+
#store;
|
|
6
|
+
// Arbitrary data stored by contracts. Key is computed as `${contractAddress}:${key}`
|
|
7
|
+
#capsules;
|
|
8
|
+
debug;
|
|
9
|
+
constructor(store){
|
|
10
|
+
this.#store = store;
|
|
11
|
+
this.#capsules = this.#store.openMap('capsules');
|
|
12
|
+
this.debug = createDebugOnlyLogger('pxe:capsule-data-provider');
|
|
13
|
+
}
|
|
14
|
+
async storeCapsule(contractAddress, slot, capsule) {
|
|
15
|
+
await this.#capsules.set(dbSlotToKey(contractAddress, slot), Buffer.concat(capsule.map((value)=>value.toBuffer())));
|
|
16
|
+
}
|
|
17
|
+
async loadCapsule(contractAddress, slot) {
|
|
18
|
+
const dataBuffer = await this.#capsules.getAsync(dbSlotToKey(contractAddress, slot));
|
|
19
|
+
if (!dataBuffer) {
|
|
20
|
+
this.debug(`Data not found for contract ${contractAddress.toString()} and slot ${slot.toString()}`);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const capsule = [];
|
|
24
|
+
for(let i = 0; i < dataBuffer.length; i += Fr.SIZE_IN_BYTES){
|
|
25
|
+
capsule.push(Fr.fromBuffer(dataBuffer.subarray(i, i + Fr.SIZE_IN_BYTES)));
|
|
26
|
+
}
|
|
27
|
+
return capsule;
|
|
28
|
+
}
|
|
29
|
+
async deleteCapsule(contractAddress, slot) {
|
|
30
|
+
await this.#capsules.delete(dbSlotToKey(contractAddress, slot));
|
|
31
|
+
}
|
|
32
|
+
async copyCapsule(contractAddress, srcSlot, dstSlot, numEntries) {
|
|
33
|
+
// In order to support overlapping source and destination regions, we need to check the relative positions of source
|
|
34
|
+
// and destination. If destination is ahead of source, then by the time we overwrite source elements using forward
|
|
35
|
+
// indexes we'll have already read those. On the contrary, if source is ahead of destination we need to use backward
|
|
36
|
+
// indexes to avoid reading elements that've been overwritten.
|
|
37
|
+
const indexes = Array.from(Array(numEntries).keys());
|
|
38
|
+
if (srcSlot.lt(dstSlot)) {
|
|
39
|
+
indexes.reverse();
|
|
40
|
+
}
|
|
41
|
+
for (const i of indexes){
|
|
42
|
+
const currentSrcSlot = dbSlotToKey(contractAddress, srcSlot.add(new Fr(i)));
|
|
43
|
+
const currentDstSlot = dbSlotToKey(contractAddress, dstSlot.add(new Fr(i)));
|
|
44
|
+
const toCopy = await this.#capsules.getAsync(currentSrcSlot);
|
|
45
|
+
if (!toCopy) {
|
|
46
|
+
throw new Error(`Attempted to copy empty slot ${currentSrcSlot} for contract ${contractAddress.toString()}`);
|
|
47
|
+
}
|
|
48
|
+
await this.#capsules.set(currentDstSlot, toCopy);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async getSize() {
|
|
52
|
+
return (await toArray(this.#capsules.valuesAsync())).reduce((sum, value)=>sum + value.length * Fr.SIZE_IN_BYTES, 0);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function dbSlotToKey(contractAddress, slot) {
|
|
56
|
+
return `${contractAddress.toString()}:${slot.toString()}`;
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/capsule_data_provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CapsuleDataProvider } from './capsule_data_provider.js';
|