@aztec/txe 0.0.1-commit.181e2d196 → 0.0.1-commit.189eedb3
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/ContractClassRegistry-PII7Q556.js +3 -0
- package/dest/ContractClassRegistry-PII7Q556.js.map +7 -0
- package/dest/ContractInstanceRegistry-3MHLGFNZ.js +3 -0
- package/dest/ContractInstanceRegistry-3MHLGFNZ.js.map +7 -0
- package/dest/FeeJuice-TQV5AQK7.js +3 -0
- package/dest/FeeJuice-TQV5AQK7.js.map +7 -0
- package/dest/MultiCallEntrypoint-SBJUIJY7.js +3 -0
- package/dest/MultiCallEntrypoint-SBJUIJY7.js.map +7 -0
- package/dest/SchnorrAccount-MQXPIZ44.js +3 -0
- package/dest/SchnorrAccount-MQXPIZ44.js.map +7 -0
- package/dest/bin/check_txe_oracle_version.d.ts +2 -0
- package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
- package/dest/bin/check_txe_oracle_version.js +61 -0
- package/dest/bin/index.js +3 -30
- package/dest/bin/index.js.map +7 -0
- package/dest/bin/oracle_test_server.d.ts +3 -0
- package/dest/bin/oracle_test_server.d.ts.map +1 -0
- package/dest/bin/oracle_test_server.js +41 -0
- package/dest/chunk-6DNQGQKE.js +265 -0
- package/dest/chunk-6DNQGQKE.js.map +7 -0
- package/dest/chunk-BJVAAXNA.js +3 -0
- package/dest/chunk-BJVAAXNA.js.map +7 -0
- package/dest/chunk-IGFYWSUP.js +304 -0
- package/dest/chunk-IGFYWSUP.js.map +7 -0
- package/dest/constants.d.ts +5 -1
- package/dest/constants.d.ts.map +1 -1
- package/dest/constants.js +8 -0
- package/dest/dispatcher_pool.d.ts +67 -0
- package/dest/dispatcher_pool.d.ts.map +1 -0
- package/dest/dispatcher_pool.js +284 -0
- package/dest/index.d.ts +185 -7
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +70 -188
- package/dest/metafile.json +38642 -0
- package/dest/msgpackr_fr_extension.d.ts +2 -0
- package/dest/msgpackr_fr_extension.d.ts.map +1 -0
- package/dest/msgpackr_fr_extension.js +21 -0
- package/dest/oracle/interfaces.d.ts +55 -30
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/test-resolver/fixtures.d.ts +43 -0
- package/dest/oracle/test-resolver/fixtures.d.ts.map +1 -0
- package/dest/oracle/test-resolver/fixtures.js +39 -0
- package/dest/oracle/test-resolver/index.d.ts +9 -0
- package/dest/oracle/test-resolver/index.d.ts.map +1 -0
- package/dest/oracle/test-resolver/index.js +33 -0
- package/dest/oracle/test-resolver/resolver.d.ts +34 -0
- package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
- package/dest/oracle/test-resolver/resolver.js +114 -0
- package/dest/oracle/txe_oracle_public_context.d.ts +38 -14
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +55 -13
- package/dest/oracle/txe_oracle_registry.d.ts +147 -0
- package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_registry.js +562 -0
- package/dest/oracle/txe_oracle_top_level_context.d.ts +43 -23
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +163 -69
- package/dest/oracle/txe_oracle_version.d.ts +17 -0
- package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_version.js +14 -0
- package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
- package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
- package/dest/oracle/txe_private_execution_oracle.js +15 -0
- package/dest/rpc_server.d.ts +14 -0
- package/dest/rpc_server.d.ts.map +1 -0
- package/dest/rpc_server.js +78 -0
- package/dest/rpc_translator.d.ts +96 -228
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +815 -636
- package/dest/server.bundle.js +3 -0
- package/dest/server.bundle.js.map +7 -0
- package/dest/state_machine/archiver.d.ts +6 -5
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +30 -21
- package/dest/state_machine/dummy_p2p_client.d.ts +13 -7
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +16 -4
- package/dest/state_machine/global_variable_builder.d.ts +9 -4
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +9 -3
- package/dest/state_machine/index.d.ts +7 -3
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +23 -5
- package/dest/state_machine/mock_epoch_cache.d.ts +16 -3
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +29 -2
- package/dest/state_machine/synchronizer.d.ts +5 -5
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +4 -4
- package/dest/txe_session.d.ts +74 -12
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +175 -37
- package/dest/utils/encoding.d.ts +191 -0
- package/dest/utils/encoding.d.ts.map +1 -0
- package/dest/{util → utils}/encoding.js +7 -2
- package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
- package/dest/utils/expected_failure_error.d.ts.map +1 -0
- package/dest/{util → utils}/txe_account_store.d.ts +1 -1
- package/dest/utils/txe_account_store.d.ts.map +1 -0
- package/dest/utils/txe_artifact_resolver.d.ts +37 -0
- package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
- package/dest/utils/txe_artifact_resolver.js +161 -0
- package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
- package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
- package/dest/{util → utils}/txe_public_contract_data_source.js +1 -3
- package/dest/worker.bundle.js +3 -0
- package/dest/worker.bundle.js.map +7 -0
- package/dest/worker.d.ts +2 -0
- package/dest/worker.d.ts.map +1 -0
- package/dest/worker.js +92 -0
- package/package.json +38 -21
- package/src/bin/check_txe_oracle_version.ts +70 -0
- package/src/bin/index.ts +11 -2
- package/src/bin/oracle_test_server.ts +51 -0
- package/src/constants.ts +10 -0
- package/src/dispatcher_pool.ts +316 -0
- package/src/index.ts +97 -224
- package/src/msgpackr_fr_extension.ts +23 -0
- package/src/oracle/interfaces.ts +53 -35
- package/src/oracle/test-resolver/fixtures.ts +84 -0
- package/src/oracle/test-resolver/index.ts +45 -0
- package/src/oracle/test-resolver/resolver.ts +165 -0
- package/src/oracle/txe_oracle_public_context.ts +72 -12
- package/src/oracle/txe_oracle_registry.ts +401 -0
- package/src/oracle/txe_oracle_top_level_context.ts +197 -79
- package/src/oracle/txe_oracle_version.ts +17 -0
- package/src/oracle/txe_private_execution_oracle.ts +30 -0
- package/src/rpc_server.ts +87 -0
- package/src/rpc_translator.ts +1000 -1021
- package/src/state_machine/archiver.ts +42 -20
- package/src/state_machine/dummy_p2p_client.ts +31 -11
- package/src/state_machine/global_variable_builder.ts +18 -3
- package/src/state_machine/index.ts +25 -6
- package/src/state_machine/mock_epoch_cache.ts +38 -3
- package/src/state_machine/synchronizer.ts +5 -5
- package/src/txe_session.ts +286 -40
- package/src/{util → utils}/encoding.ts +8 -2
- package/src/utils/txe_artifact_resolver.ts +217 -0
- package/src/{util → utils}/txe_public_contract_data_source.ts +0 -2
- package/src/worker.ts +98 -0
- package/dest/util/encoding.d.ts +0 -720
- package/dest/util/encoding.d.ts.map +0 -1
- package/dest/util/expected_failure_error.d.ts.map +0 -1
- package/dest/util/txe_account_store.d.ts.map +0 -1
- package/dest/util/txe_public_contract_data_source.d.ts +0 -20
- package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
- /package/dest/{util → utils}/expected_failure_error.js +0 -0
- /package/dest/{util → utils}/txe_account_store.js +0 -0
- /package/src/{util → utils}/expected_failure_error.ts +0 -0
- /package/src/{util → utils}/txe_account_store.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txe_oracle_top_level_context.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_top_level_context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"txe_oracle_top_level_context.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_top_level_context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS,
|
|
1
|
+
import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS, MAX_PRIVATE_LOGS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Schnorr } from '@aztec/foundation/crypto/schnorr';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { TestDateProvider } from '@aztec/foundation/timer';
|
|
7
|
-
import {
|
|
7
|
+
import { CapsuleService, ORACLE_VERSION_MAJOR, composeHooks, enrichPublicSimulationError } from '@aztec/pxe/server';
|
|
8
8
|
import { ExecutionNoteCache, ExecutionTaggingIndexCache, HashedValuesCache, Oracle, PrivateExecutionOracle, UtilityExecutionOracle, executePrivateFunction, generateSimulatedProvingResult } from '@aztec/pxe/simulator';
|
|
9
9
|
import { ExecutionError, WASMSimulator, createSimulationError, extractCallStack, resolveAssertionMessageFromError, toACVMWitness, witnessMapToFields } from '@aztec/simulator/client';
|
|
10
10
|
import { CppPublicTxSimulator, GuardedMerkleTreeOperations, PublicContractsDB, PublicProcessor } from '@aztec/simulator/server';
|
|
@@ -13,17 +13,18 @@ import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
|
13
13
|
import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
14
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
15
|
import { computePartialAddress } from '@aztec/stdlib/contract';
|
|
16
|
-
import { Gas, GasFees
|
|
16
|
+
import { Gas, GasFees } from '@aztec/stdlib/gas';
|
|
17
17
|
import { computeCalldataHash, computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
|
|
18
18
|
import { PartialPrivateTailPublicInputsForPublic, PrivateKernelTailCircuitPublicInputs, PrivateToPublicAccumulatedData, PublicCallRequest } from '@aztec/stdlib/kernel';
|
|
19
|
+
import { hashPublicKey } from '@aztec/stdlib/keys';
|
|
19
20
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
20
21
|
import { makeGlobalVariables } from '@aztec/stdlib/testing';
|
|
21
22
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
22
23
|
import { CallContext, HashedValues, PrivateExecutionResult, Tx, TxConstantData, TxContext, TxEffect, TxHash, collectNested } from '@aztec/stdlib/tx';
|
|
23
|
-
import { ForkCheckpoint } from '@aztec/world-state';
|
|
24
|
-
import { DEFAULT_ADDRESS } from '../constants.js';
|
|
25
|
-
import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
|
|
24
|
+
import { ForkCheckpoint } from '@aztec/world-state/native';
|
|
25
|
+
import { DEFAULT_ADDRESS, MAX_PRIVATE_EVENTS_PER_TXE_QUERY, MAX_PRIVATE_EVENT_LEN } from '../constants.js';
|
|
26
26
|
import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
|
|
27
|
+
import { TXEPublicContractDataSource } from '../utils/txe_public_contract_data_source.js';
|
|
27
28
|
export class TXEOracleTopLevelContext {
|
|
28
29
|
stateMachine;
|
|
29
30
|
contractStore;
|
|
@@ -40,10 +41,13 @@ export class TXEOracleTopLevelContext {
|
|
|
40
41
|
version;
|
|
41
42
|
chainId;
|
|
42
43
|
authwits;
|
|
44
|
+
artifactResolver;
|
|
45
|
+
rootPath;
|
|
46
|
+
packageName;
|
|
43
47
|
isMisc;
|
|
44
48
|
isTxe;
|
|
45
49
|
logger;
|
|
46
|
-
constructor(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, nextBlockTimestamp, version, chainId, authwits){
|
|
50
|
+
constructor(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, nextBlockTimestamp, version, chainId, authwits, artifactResolver, rootPath, packageName){
|
|
47
51
|
this.stateMachine = stateMachine;
|
|
48
52
|
this.contractStore = contractStore;
|
|
49
53
|
this.noteStore = noteStore;
|
|
@@ -59,23 +63,36 @@ export class TXEOracleTopLevelContext {
|
|
|
59
63
|
this.version = version;
|
|
60
64
|
this.chainId = chainId;
|
|
61
65
|
this.authwits = authwits;
|
|
66
|
+
this.artifactResolver = artifactResolver;
|
|
67
|
+
this.rootPath = rootPath;
|
|
68
|
+
this.packageName = packageName;
|
|
62
69
|
this.isMisc = true;
|
|
63
70
|
this.isTxe = true;
|
|
64
71
|
this.logger = createLogger('txe:top_level_context');
|
|
65
72
|
this.logger.debug('Entering Top Level Context');
|
|
66
73
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
contractOracleVersion;
|
|
75
|
+
assertCompatibleOracleVersion(major, minor) {
|
|
76
|
+
if (major !== ORACLE_VERSION_MAJOR) {
|
|
77
|
+
const hint = major > ORACLE_VERSION_MAJOR ? 'The contract was compiled with a newer version of Aztec.nr than this aztec cli version supports. Upgrade your aztec cli version to a compatible version.' : 'The contract was compiled with an older version of Aztec.nr than this aztec cli version supports. Recompile the contract with a compatible version of Aztec.nr.';
|
|
78
|
+
throw new Error(`Incompatible aztec cli version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${ORACLE_VERSION_MAJOR}, got ${major})`);
|
|
70
79
|
}
|
|
80
|
+
this.contractOracleVersion = {
|
|
81
|
+
major,
|
|
82
|
+
minor
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Prefixed with "nonOracleFunction" as it is not used as an oracle handler.
|
|
86
|
+
nonOracleFunctionGetContractOracleVersion() {
|
|
87
|
+
return this.contractOracleVersion;
|
|
71
88
|
}
|
|
72
89
|
// This is typically only invoked in private contexts, but it is convenient to also have it in top-level for testing
|
|
73
90
|
// setup.
|
|
74
|
-
|
|
91
|
+
getRandomField() {
|
|
75
92
|
return Fr.random();
|
|
76
93
|
}
|
|
77
94
|
// We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
|
|
78
|
-
|
|
95
|
+
log(level, message, _fieldsSize, fields) {
|
|
79
96
|
if (!LogLevels[level]) {
|
|
80
97
|
throw new Error(`Invalid log level: ${level}`);
|
|
81
98
|
}
|
|
@@ -85,35 +102,42 @@ export class TXEOracleTopLevelContext {
|
|
|
85
102
|
});
|
|
86
103
|
return Promise.resolve();
|
|
87
104
|
}
|
|
88
|
-
|
|
105
|
+
getDefaultAddress() {
|
|
89
106
|
return DEFAULT_ADDRESS;
|
|
90
107
|
}
|
|
91
|
-
async
|
|
108
|
+
async getNextBlockNumber() {
|
|
92
109
|
return BlockNumber(await this.getLastBlockNumber() + 1);
|
|
93
110
|
}
|
|
94
|
-
|
|
111
|
+
getNextBlockTimestamp() {
|
|
95
112
|
return Promise.resolve(this.nextBlockTimestamp);
|
|
96
113
|
}
|
|
97
|
-
async
|
|
98
|
-
return (await this.stateMachine.node.
|
|
114
|
+
async getLastBlockTimestamp() {
|
|
115
|
+
return (await this.stateMachine.node.getBlockData('latest')).header.globalVariables.timestamp;
|
|
99
116
|
}
|
|
100
|
-
async
|
|
117
|
+
async getLastTxEffects() {
|
|
101
118
|
const latestBlockNumber = await this.stateMachine.archiver.getBlockNumber();
|
|
102
|
-
const block = await this.stateMachine.archiver.getBlock(
|
|
119
|
+
const block = await this.stateMachine.archiver.getBlock({
|
|
120
|
+
number: latestBlockNumber
|
|
121
|
+
});
|
|
103
122
|
if (block.body.txEffects.length != 1) {
|
|
104
123
|
// Note that calls like env.mine() will result in blocks with no transactions, hitting this
|
|
105
124
|
throw new Error(`Expected a single transaction in the last block, found ${block.body.txEffects.length}`);
|
|
106
125
|
}
|
|
107
126
|
const txEffects = block.body.txEffects[0];
|
|
127
|
+
const privateLogs = txEffects.privateLogs;
|
|
128
|
+
if (privateLogs.length > MAX_PRIVATE_LOGS_PER_TX) {
|
|
129
|
+
throw new Error(`${privateLogs.length} private logs exceed max ${MAX_PRIVATE_LOGS_PER_TX}`);
|
|
130
|
+
}
|
|
108
131
|
return {
|
|
109
132
|
txHash: txEffects.txHash,
|
|
110
133
|
noteHashes: txEffects.noteHashes,
|
|
111
|
-
nullifiers: txEffects.nullifiers
|
|
134
|
+
nullifiers: txEffects.nullifiers,
|
|
135
|
+
privateLogs
|
|
112
136
|
};
|
|
113
137
|
}
|
|
114
138
|
async syncContractNonOracleMethod(contractAddress, scope, jobId) {
|
|
115
139
|
if (contractAddress.equals(DEFAULT_ADDRESS)) {
|
|
116
|
-
this.logger.debug(`Skipping sync in
|
|
140
|
+
this.logger.debug(`Skipping sync in getPrivateEvents because the events correspond to the default address.`);
|
|
117
141
|
return;
|
|
118
142
|
}
|
|
119
143
|
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
@@ -123,8 +147,8 @@ export class TXEOracleTopLevelContext {
|
|
|
123
147
|
scope
|
|
124
148
|
]);
|
|
125
149
|
}
|
|
126
|
-
async
|
|
127
|
-
|
|
150
|
+
async getPrivateEvents(selector, contractAddress, scope) {
|
|
151
|
+
const events = (await this.privateEventStore.getPrivateEvents(selector, {
|
|
128
152
|
contractAddress,
|
|
129
153
|
scopes: [
|
|
130
154
|
scope
|
|
@@ -132,33 +156,72 @@ export class TXEOracleTopLevelContext {
|
|
|
132
156
|
fromBlock: 0,
|
|
133
157
|
toBlock: await this.getLastBlockNumber() + 1
|
|
134
158
|
})).map((e)=>e.packedEvent);
|
|
159
|
+
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
160
|
+
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
161
|
+
}
|
|
162
|
+
if (events.some((e)=>e.length > MAX_PRIVATE_EVENT_LEN)) {
|
|
163
|
+
throw new Error(`Some private event has length larger than maxLen ${MAX_PRIVATE_EVENT_LEN}`);
|
|
164
|
+
}
|
|
165
|
+
return events;
|
|
135
166
|
}
|
|
136
|
-
async
|
|
167
|
+
async advanceBlocksBy(blocks) {
|
|
137
168
|
this.logger.debug(`time traveling ${blocks} blocks`);
|
|
138
169
|
for(let i = 0; i < blocks; i++){
|
|
139
170
|
await this.mineBlock();
|
|
140
171
|
}
|
|
141
172
|
}
|
|
142
|
-
|
|
173
|
+
advanceTimestampBy(duration) {
|
|
143
174
|
this.logger.debug(`time traveling ${duration} seconds`);
|
|
144
175
|
this.nextBlockTimestamp += duration;
|
|
145
176
|
}
|
|
146
|
-
|
|
177
|
+
deploymentNullifier(address) {
|
|
178
|
+
return siloNullifier(AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS), address.toField());
|
|
179
|
+
}
|
|
180
|
+
async deploy(contractPath, initializer, args, secret, salt, deployer) {
|
|
181
|
+
const { artifact, instance } = await this.artifactResolver.resolveDeployArtifact({
|
|
182
|
+
rootPath: this.rootPath,
|
|
183
|
+
packageName: this.packageName,
|
|
184
|
+
contractPath,
|
|
185
|
+
initializer,
|
|
186
|
+
args,
|
|
187
|
+
secret,
|
|
188
|
+
salt,
|
|
189
|
+
deployer
|
|
190
|
+
});
|
|
147
191
|
// Emit deployment nullifier
|
|
148
192
|
await this.mineBlock({
|
|
149
193
|
nullifiers: [
|
|
150
|
-
await
|
|
194
|
+
await this.deploymentNullifier(instance.address)
|
|
151
195
|
]
|
|
152
196
|
});
|
|
153
197
|
if (!secret.equals(Fr.ZERO)) {
|
|
154
|
-
await this.
|
|
198
|
+
await this.registerContractAndAddAccount(artifact, instance, secret);
|
|
155
199
|
} else {
|
|
156
200
|
await this.contractStore.addContractInstance(instance);
|
|
157
201
|
await this.contractStore.addContractArtifact(artifact);
|
|
158
202
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
159
203
|
}
|
|
204
|
+
return [
|
|
205
|
+
instance.salt,
|
|
206
|
+
instance.deployer.toField(),
|
|
207
|
+
instance.currentContractClassId,
|
|
208
|
+
instance.initializationHash,
|
|
209
|
+
instance.immutablesHash,
|
|
210
|
+
...instance.publicKeys.toFields()
|
|
211
|
+
];
|
|
160
212
|
}
|
|
161
|
-
|
|
213
|
+
/**
|
|
214
|
+
* Mines a single block containing only the deployment nullifiers for the contracts at the given addresses.
|
|
215
|
+
*/ async mineDeploymentNullifiers(addresses) {
|
|
216
|
+
await this.mineBlock({
|
|
217
|
+
nullifiers: await Promise.all(addresses.map((address)=>this.deploymentNullifier(address)))
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async addAccount(secret) {
|
|
221
|
+
const { artifact, instance } = await this.artifactResolver.resolveAccountArtifact(secret);
|
|
222
|
+
return this.registerContractAndAddAccount(artifact, instance, secret);
|
|
223
|
+
}
|
|
224
|
+
async registerContractAndAddAccount(artifact, instance, secret) {
|
|
162
225
|
const partialAddress = await computePartialAddress(instance);
|
|
163
226
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
164
227
|
await this.contractStore.addContractInstance(instance);
|
|
@@ -169,7 +232,7 @@ export class TXEOracleTopLevelContext {
|
|
|
169
232
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
170
233
|
return completeAddress;
|
|
171
234
|
}
|
|
172
|
-
async
|
|
235
|
+
async createAccount(secret) {
|
|
173
236
|
// This is a foot gun !
|
|
174
237
|
const completeAddress = await this.keyStore.addAccount(secret, secret);
|
|
175
238
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
@@ -177,18 +240,17 @@ export class TXEOracleTopLevelContext {
|
|
|
177
240
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
178
241
|
return completeAddress;
|
|
179
242
|
}
|
|
180
|
-
async
|
|
243
|
+
async addAuthWitness(address, messageHash) {
|
|
181
244
|
const account = await this.accountStore.getAccount(address);
|
|
182
|
-
const
|
|
245
|
+
const ivpkMHash = await hashPublicKey(account.publicKeys.ivpkM);
|
|
246
|
+
const privateKey = await this.keyStore.getMasterSecretKey(ivpkMHash);
|
|
183
247
|
const schnorr = new Schnorr();
|
|
184
|
-
const signature = await schnorr.constructSignature(messageHash
|
|
185
|
-
const authWitness = new AuthWitness(messageHash,
|
|
186
|
-
...signature.toBuffer()
|
|
187
|
-
]);
|
|
248
|
+
const signature = await schnorr.constructSignature(messageHash, privateKey);
|
|
249
|
+
const authWitness = new AuthWitness(messageHash, signature.toLimbFields());
|
|
188
250
|
this.authwits.set(authWitness.requestHash.toString(), authWitness);
|
|
189
251
|
}
|
|
190
252
|
async mineBlock(options = {}) {
|
|
191
|
-
const blockNumber = await this.
|
|
253
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
192
254
|
const txEffect = TxEffect.empty();
|
|
193
255
|
txEffect.nullifiers = [
|
|
194
256
|
getSingleTxBlockRequestHash(blockNumber),
|
|
@@ -210,29 +272,26 @@ export class TXEOracleTopLevelContext {
|
|
|
210
272
|
this.logger.info(`Created block ${blockNumber} with timestamp ${block.header.globalVariables.timestamp}`);
|
|
211
273
|
await this.stateMachine.handleL2Block(block);
|
|
212
274
|
}
|
|
213
|
-
async
|
|
275
|
+
async privateCallNewFlow(from, targetContractAddress = AztecAddress.zero(), functionSelector = FunctionSelector.empty(), args, argsHash = Fr.zero(), isStaticCall = false, additionalScopes = [], jobId, authorizedUtilityCallTargets, gasSettings) {
|
|
214
276
|
this.logger.verbose(`Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`);
|
|
215
277
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
216
278
|
if (!artifact) {
|
|
217
279
|
const message = functionSelector.equals(await FunctionSelector.fromSignature('verify_private_authwit(Field)')) ? 'Found no account contract artifact for a private authwit check - use `create_contract_account` instead of `create_light_account` for authwit support.' : 'Function Artifact does not exist';
|
|
218
280
|
throw new Error(message);
|
|
219
281
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
from
|
|
282
|
+
const scopes = from === undefined ? additionalScopes : [
|
|
283
|
+
from,
|
|
284
|
+
...additionalScopes
|
|
224
285
|
];
|
|
225
286
|
// Sync notes before executing private function to discover notes from previous transactions
|
|
226
287
|
const utilityExecutor = async (call, execScopes)=>{
|
|
227
288
|
await this.executeUtilityCall(call, execScopes, jobId);
|
|
228
289
|
};
|
|
229
290
|
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
230
|
-
await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, utilityExecutor, blockHeader, jobId,
|
|
231
|
-
const blockNumber = await this.
|
|
232
|
-
const
|
|
233
|
-
const
|
|
234
|
-
const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
|
|
235
|
-
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
291
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, utilityExecutor, blockHeader, jobId, scopes);
|
|
292
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
293
|
+
const msgSender = from ?? AztecAddress.NULL_MSG_SENDER;
|
|
294
|
+
const callContext = new CallContext(msgSender, targetContractAddress, functionSelector, isStaticCall);
|
|
236
295
|
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
237
296
|
const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber));
|
|
238
297
|
const noteCache = new ExecutionNoteCache(protocolNullifier);
|
|
@@ -264,17 +323,22 @@ export class TXEOracleTopLevelContext {
|
|
|
264
323
|
senderTaggingStore: this.senderTaggingStore,
|
|
265
324
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
266
325
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
267
|
-
|
|
326
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
268
327
|
privateEventStore: this.privateEventStore,
|
|
269
328
|
contractSyncService: this.stateMachine.contractSyncService,
|
|
270
329
|
jobId,
|
|
271
330
|
totalPublicCalldataCount: 0,
|
|
272
331
|
sideEffectCounter: minRevertibleSideEffectCounter,
|
|
273
|
-
scopes
|
|
332
|
+
scopes,
|
|
274
333
|
// In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
|
|
275
334
|
// contract would perform, including setting senderForTags.
|
|
276
335
|
senderForTags: from,
|
|
277
|
-
simulator
|
|
336
|
+
simulator,
|
|
337
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
338
|
+
l2TipsStore: this.stateMachine.l2TipsProvider,
|
|
339
|
+
hooks: composeHooks({
|
|
340
|
+
authorizeUtilityCall: this.buildAuthorizeUtilityCallHook(isStaticCall ? 'private view' : 'private', authorizedUtilityCallTargets)
|
|
341
|
+
})
|
|
278
342
|
});
|
|
279
343
|
// Note: This is a slight modification of simulator.run without any of the checks. Maybe we should modify simulator.run with a boolean value to skip checks.
|
|
280
344
|
let result;
|
|
@@ -287,7 +351,7 @@ export class TXEOracleTopLevelContext {
|
|
|
287
351
|
r.publicInputs.publicTeardownCallRequest
|
|
288
352
|
]));
|
|
289
353
|
const publicFunctionsCalldata = await Promise.all(publicCallRequests.map(async (r)=>{
|
|
290
|
-
const calldata = await privateExecutionOracle.
|
|
354
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
291
355
|
return new HashedValues(calldata, r.calldataHash);
|
|
292
356
|
}));
|
|
293
357
|
noteCache.finish();
|
|
@@ -346,10 +410,20 @@ export class TXEOracleTopLevelContext {
|
|
|
346
410
|
throw new Error('Contract execution has reverted');
|
|
347
411
|
}
|
|
348
412
|
}
|
|
413
|
+
// Walk the nested private-call tree and collect every offchain effect the transaction emitted.
|
|
414
|
+
// PXE stores these on each `PrivateCallExecutionResult` and they never reach TXE via the
|
|
415
|
+
// `aztec_utl_emitOffchainEffect` foreign-call path (that path only fires at the top-level), so
|
|
416
|
+
// we pull them out here and the RPC wrapper will hand them to `TXESession` for buffering.
|
|
417
|
+
const offchainEffects = collectNested([
|
|
418
|
+
executionResult
|
|
419
|
+
], (r)=>r.offchainEffects.map((e)=>e.data));
|
|
349
420
|
if (isStaticCall) {
|
|
350
421
|
await checkpoint.revert();
|
|
351
422
|
await forkedWorldTrees.close();
|
|
352
|
-
return
|
|
423
|
+
return {
|
|
424
|
+
returnValues: executionResult.returnValues ?? [],
|
|
425
|
+
offchainEffects
|
|
426
|
+
};
|
|
353
427
|
}
|
|
354
428
|
const txEffect = TxEffect.empty();
|
|
355
429
|
txEffect.noteHashes = processedTx.txEffect.noteHashes;
|
|
@@ -365,14 +439,14 @@ export class TXEOracleTopLevelContext {
|
|
|
365
439
|
]);
|
|
366
440
|
await this.stateMachine.handleL2Block(l2Block);
|
|
367
441
|
await forkedWorldTrees.close();
|
|
368
|
-
return
|
|
442
|
+
return {
|
|
443
|
+
returnValues: executionResult.returnValues ?? [],
|
|
444
|
+
offchainEffects
|
|
445
|
+
};
|
|
369
446
|
}
|
|
370
|
-
async
|
|
447
|
+
async publicCallNewFlow(from, targetContractAddress, calldata, isStaticCall, gasSettings) {
|
|
371
448
|
this.logger.verbose(`Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`);
|
|
372
|
-
const blockNumber = await this.
|
|
373
|
-
const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
|
|
374
|
-
const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
|
|
375
|
-
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
449
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
376
450
|
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
377
451
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
378
452
|
const calldataHash = await computeCalldataHash(calldata);
|
|
@@ -405,7 +479,7 @@ export class TXEOracleTopLevelContext {
|
|
|
405
479
|
// The enqueued public call itself we make be revertible so that the public execution is itself revertible, as tests
|
|
406
480
|
// may require producing reverts.
|
|
407
481
|
const revertibleAccumulatedData = PrivateToPublicAccumulatedData.empty();
|
|
408
|
-
revertibleAccumulatedData.publicCallRequests[0] = new PublicCallRequest(from, targetContractAddress, isStaticCall, calldataHash);
|
|
482
|
+
revertibleAccumulatedData.publicCallRequests[0] = new PublicCallRequest(from ?? AztecAddress.NULL_MSG_SENDER, targetContractAddress, isStaticCall, calldataHash);
|
|
409
483
|
const inputsForPublic = new PartialPrivateTailPublicInputsForPublic(nonRevertibleAccumulatedData, revertibleAccumulatedData, PublicCallRequest.empty());
|
|
410
484
|
const constantData = new TxConstantData(anchorBlockHeader, txContext, Fr.zero(), Fr.zero());
|
|
411
485
|
const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ new Gas(0, 0), /*feePayer=*/ AztecAddress.zero(), /*expirationTimestamp=*/ 0n, inputsForPublic, undefined);
|
|
@@ -461,7 +535,7 @@ export class TXEOracleTopLevelContext {
|
|
|
461
535
|
await forkedWorldTrees.close();
|
|
462
536
|
return returnValues ?? [];
|
|
463
537
|
}
|
|
464
|
-
async
|
|
538
|
+
async executeUtilityFunction(targetContractAddress, functionSelector, args, jobId, authorizedUtilityCallTargets) {
|
|
465
539
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
466
540
|
if (!artifact) {
|
|
467
541
|
throw new Error(`Cannot call ${functionSelector} as there is no artifact found at ${targetContractAddress}.`);
|
|
@@ -470,7 +544,7 @@ export class TXEOracleTopLevelContext {
|
|
|
470
544
|
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
471
545
|
await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, async (call, execScopes)=>{
|
|
472
546
|
await this.executeUtilityCall(call, execScopes, jobId);
|
|
473
|
-
}, blockHeader, jobId,
|
|
547
|
+
}, blockHeader, jobId, await this.keyStore.getAccounts());
|
|
474
548
|
const call = FunctionCall.from({
|
|
475
549
|
name: artifact.name,
|
|
476
550
|
to: targetContractAddress,
|
|
@@ -481,9 +555,9 @@ export class TXEOracleTopLevelContext {
|
|
|
481
555
|
args,
|
|
482
556
|
returnTypes: []
|
|
483
557
|
});
|
|
484
|
-
return this.executeUtilityCall(call,
|
|
558
|
+
return this.executeUtilityCall(call, await this.keyStore.getAccounts(), jobId, authorizedUtilityCallTargets);
|
|
485
559
|
}
|
|
486
|
-
async executeUtilityCall(call, scopes, jobId) {
|
|
560
|
+
async executeUtilityCall(call, scopes, jobId, authorizedUtilityCallTargets = []) {
|
|
487
561
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
488
562
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
489
563
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
@@ -494,6 +568,10 @@ export class TXEOracleTopLevelContext {
|
|
|
494
568
|
});
|
|
495
569
|
try {
|
|
496
570
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
571
|
+
const simulator = new WASMSimulator();
|
|
572
|
+
const utilityExecutor = async (syncCall, execScopes)=>{
|
|
573
|
+
await this.executeUtilityCall(syncCall, execScopes, jobId);
|
|
574
|
+
};
|
|
497
575
|
const oracle = new UtilityExecutionOracle({
|
|
498
576
|
contractAddress: call.to,
|
|
499
577
|
authWitnesses: [],
|
|
@@ -506,12 +584,20 @@ export class TXEOracleTopLevelContext {
|
|
|
506
584
|
aztecNode: this.stateMachine.node,
|
|
507
585
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
508
586
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
509
|
-
|
|
587
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
510
588
|
privateEventStore: this.privateEventStore,
|
|
589
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
590
|
+
contractSyncService: this.stateMachine.contractSyncService,
|
|
591
|
+
l2TipsStore: this.stateMachine.l2TipsProvider,
|
|
511
592
|
jobId,
|
|
512
|
-
scopes
|
|
593
|
+
scopes,
|
|
594
|
+
simulator,
|
|
595
|
+
hooks: composeHooks({
|
|
596
|
+
authorizeUtilityCall: this.buildAuthorizeUtilityCallHook('utility', authorizedUtilityCallTargets)
|
|
597
|
+
}),
|
|
598
|
+
utilityExecutor
|
|
513
599
|
});
|
|
514
|
-
const acirExecutionResult = await
|
|
600
|
+
const acirExecutionResult = await simulator.executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback()).catch((err)=>{
|
|
515
601
|
err.message = resolveAssertionMessageFromError(err, entryPointArtifact);
|
|
516
602
|
throw new ExecutionError(err.message, {
|
|
517
603
|
contractAddress: call.to,
|
|
@@ -534,7 +620,15 @@ export class TXEOracleTopLevelContext {
|
|
|
534
620
|
];
|
|
535
621
|
}
|
|
536
622
|
async getLastBlockNumber() {
|
|
537
|
-
const
|
|
538
|
-
return
|
|
623
|
+
const block = await this.stateMachine.node.getBlock('latest');
|
|
624
|
+
return block ? block.header.globalVariables.blockNumber : BlockNumber.ZERO;
|
|
625
|
+
}
|
|
626
|
+
buildAuthorizeUtilityCallHook(callerContext, authorizedTargets) {
|
|
627
|
+
if (authorizedTargets.length === 0) {
|
|
628
|
+
return undefined;
|
|
629
|
+
}
|
|
630
|
+
return (req)=>Promise.resolve({
|
|
631
|
+
authorized: req.callerContext === callerContext && authorizedTargets.some((t)=>t.equals(req.target))
|
|
632
|
+
});
|
|
539
633
|
}
|
|
540
634
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The TXE oracle version constants are used to check that the oracle interface used for tests is in sync between
|
|
3
|
+
* TXE and Aztec.nr. This is separate from the contract oracle version in `pxe/src/oracle_version.ts`, which covers
|
|
4
|
+
* oracles used during contract execution by PXE.
|
|
5
|
+
*
|
|
6
|
+
* The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TXE_ORACLE_VERSION_MAJOR = 1;
|
|
9
|
+
export declare const TXE_ORACLE_VERSION_MINOR = 2;
|
|
10
|
+
/**
|
|
11
|
+
* This hash is computed from the TXE oracle interfaces (IAvmExecutionOracle and ITxeExecutionOracle) and is used to
|
|
12
|
+
* detect when those interfaces change. When it does, bump:
|
|
13
|
+
* - TXE_ORACLE_VERSION_MAJOR (and reset MINOR to 0) for breaking changes, or
|
|
14
|
+
* - TXE_ORACLE_VERSION_MINOR for additive changes (new oracle method added).
|
|
15
|
+
*/
|
|
16
|
+
export declare const TXE_ORACLE_INTERFACE_HASH = "9e5f6ad5fd170d1de5ddd417f19cce47b17382567e08360dc6a783154828e218";
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX29yYWNsZV92ZXJzaW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JhY2xlL3R4ZV9vcmFjbGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxlQUFPLE1BQU0sd0JBQXdCLElBQUksQ0FBQztBQUMxQyxlQUFPLE1BQU0sd0JBQXdCLElBQUksQ0FBQztBQUUxQzs7Ozs7R0FLRztBQUNILGVBQU8sTUFBTSx5QkFBeUIscUVBQXFFLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txe_oracle_version.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,qEAAqE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The TXE oracle version constants are used to check that the oracle interface used for tests is in sync between
|
|
3
|
+
* TXE and Aztec.nr. This is separate from the contract oracle version in `pxe/src/oracle_version.ts`, which covers
|
|
4
|
+
* oracles used during contract execution by PXE.
|
|
5
|
+
*
|
|
6
|
+
* The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr`.
|
|
7
|
+
*/ export const TXE_ORACLE_VERSION_MAJOR = 1;
|
|
8
|
+
export const TXE_ORACLE_VERSION_MINOR = 2;
|
|
9
|
+
/**
|
|
10
|
+
* This hash is computed from the TXE oracle interfaces (IAvmExecutionOracle and ITxeExecutionOracle) and is used to
|
|
11
|
+
* detect when those interfaces change. When it does, bump:
|
|
12
|
+
* - TXE_ORACLE_VERSION_MAJOR (and reset MINOR to 0) for breaking changes, or
|
|
13
|
+
* - TXE_ORACLE_VERSION_MINOR for additive changes (new oracle method added).
|
|
14
|
+
*/ export const TXE_ORACLE_INTERFACE_HASH = '9e5f6ad5fd170d1de5ddd417f19cce47b17382567e08360dc6a783154828e218';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { PrivateExecutionOracle } from '@aztec/pxe/simulator';
|
|
3
|
+
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
4
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
/**
|
|
6
|
+
* TXE-specific subclass of PrivateExecutionOracle that forbids operations not supported in
|
|
7
|
+
* TestEnvironment::private_context. TXE uses dedicated oracle flows (e.g. private_call) instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare class TXEPrivateExecutionOracle extends PrivateExecutionOracle {
|
|
10
|
+
callPrivateFunction(_targetContractAddress: AztecAddress, _functionSelector: FunctionSelector, _argsHash: Fr, _sideEffectCounter: number, _isStaticCall: boolean): Promise<{
|
|
11
|
+
endSideEffectCounter: Fr;
|
|
12
|
+
returnsHash: Fr;
|
|
13
|
+
}>;
|
|
14
|
+
assertValidPublicCalldata(_calldataHash: Fr): Promise<void>;
|
|
15
|
+
notifyRevertiblePhaseStart(_minRevertibleSideEffectCounter: number): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3ByaXZhdGVfZXhlY3V0aW9uX29yYWNsZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yYWNsZS90eGVfcHJpdmF0ZV9leGVjdXRpb25fb3JhY2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFaEU7OztHQUdHO0FBQ0gscUJBQWEseUJBQTBCLFNBQVEsc0JBQXNCO0lBQzFELG1CQUFtQixDQUMxQixzQkFBc0IsRUFBRSxZQUFZLEVBQ3BDLGlCQUFpQixFQUFFLGdCQUFnQixFQUNuQyxTQUFTLEVBQUUsRUFBRSxFQUNiLGtCQUFrQixFQUFFLE1BQU0sRUFDMUIsYUFBYSxFQUFFLE9BQU8sR0FDckIsT0FBTyxDQUFDO1FBQUUsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQTtLQUFFLENBQUMsQ0FJeEQ7SUFFUSx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFbkU7SUFFUSwwQkFBMEIsQ0FBQywrQkFBK0IsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUUxRjtDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txe_private_execution_oracle.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_private_execution_oracle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IAC1D,mBAAmB,CAC1B,sBAAsB,EAAE,YAAY,EACpC,iBAAiB,EAAE,gBAAgB,EACnC,SAAS,EAAE,EAAE,EACb,kBAAkB,EAAE,MAAM,EAC1B,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC;QAAE,oBAAoB,EAAE,EAAE,CAAC;QAAC,WAAW,EAAE,EAAE,CAAA;KAAE,CAAC,CAIxD;IAEQ,yBAAyB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;IAEQ,0BAA0B,CAAC,+BAA+B,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1F;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PrivateExecutionOracle } from '@aztec/pxe/simulator';
|
|
2
|
+
/**
|
|
3
|
+
* TXE-specific subclass of PrivateExecutionOracle that forbids operations not supported in
|
|
4
|
+
* TestEnvironment::private_context. TXE uses dedicated oracle flows (e.g. private_call) instead.
|
|
5
|
+
*/ export class TXEPrivateExecutionOracle extends PrivateExecutionOracle {
|
|
6
|
+
callPrivateFunction(_targetContractAddress, _functionSelector, _argsHash, _sideEffectCounter, _isStaticCall) {
|
|
7
|
+
throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
|
|
8
|
+
}
|
|
9
|
+
assertValidPublicCalldata(_calldataHash) {
|
|
10
|
+
throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
|
|
11
|
+
}
|
|
12
|
+
notifyRevertiblePhaseStart(_minRevertibleSideEffectCounter) {
|
|
13
|
+
throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
2
|
+
/**
|
|
3
|
+
* Creates the TXE RPC server. With `TXE_WORKERS=1` oracle calls run on the main thread (no
|
|
4
|
+
* worker_threads, no IPC overhead). With any other value oracle calls are
|
|
5
|
+
* routed to a pool of worker threads sized to that value, sticky by `session_id`.
|
|
6
|
+
*
|
|
7
|
+
* Each incoming TCP socket is tagged with the `session_id` of the first oracle call it carries —
|
|
8
|
+
* nargo uses one HTTP client per test, so the socket-to-session mapping is 1:1. When the socket
|
|
9
|
+
* closes (end of test), the dispatcher disposes the session and frees its world state + LMDB.
|
|
10
|
+
*
|
|
11
|
+
* Lives in its own module so the worker bundle does not pull in the HTTP server stack.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createTXERpcServer(logger: Logger): Promise<import("@aztec/foundation/json-rpc/server").SafeJsonRpcServer>;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnBjX3NlcnZlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JwY19zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFlcEQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHdCQUFzQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSwwRUE0Q3REIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc_server.d.ts","sourceRoot":"","sources":["../src/rpc_server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAepD;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,0EA4CtD"}
|