@aztec/sequencer-client 0.15.1 → 0.16.0
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/client/sequencer-client.js +2 -2
- package/dest/index.d.ts +1 -1
- package/dest/index.js +1 -1
- package/dest/sequencer/config.d.ts +1 -17
- package/dest/sequencer/config.d.ts.map +1 -1
- package/dest/sequencer/public_processor.d.ts +6 -6
- package/dest/sequencer/public_processor.d.ts.map +1 -1
- package/dest/sequencer/public_processor.js +28 -21
- package/dest/simulator/public_executor.d.ts +35 -9
- package/dest/simulator/public_executor.d.ts.map +1 -1
- package/dest/simulator/public_executor.js +30 -17
- package/dest/simulator/public_kernel.d.ts +2 -2
- package/dest/simulator/public_kernel.js +2 -2
- package/dest/simulator/rollup.d.ts +2 -2
- package/dest/simulator/rollup.d.ts.map +1 -1
- package/dest/simulator/rollup.js +5 -10
- package/package.json +11 -11
- package/src/client/sequencer-client.ts +2 -2
- package/src/index.ts +1 -1
- package/src/sequencer/config.ts +1 -17
- package/src/sequencer/public_processor.ts +32 -25
- package/src/simulator/public_executor.ts +33 -34
- package/src/simulator/public_kernel.ts +2 -2
- package/src/simulator/rollup.ts +4 -11
|
@@ -3,7 +3,7 @@ import { getGlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
|
3
3
|
import { Sequencer, getL1Publisher, getVerificationKeys } from '../index.js';
|
|
4
4
|
import { EmptyRollupProver } from '../prover/empty.js';
|
|
5
5
|
import { PublicProcessorFactory } from '../sequencer/public_processor.js';
|
|
6
|
-
import {
|
|
6
|
+
import { RealRollupCircuitSimulator } from '../simulator/rollup.js';
|
|
7
7
|
/**
|
|
8
8
|
* Encapsulates the full sequencer and publisher.
|
|
9
9
|
*/
|
|
@@ -25,7 +25,7 @@ export class SequencerClient {
|
|
|
25
25
|
const publisher = getL1Publisher(config);
|
|
26
26
|
const globalsBuilder = getGlobalVariableBuilder(config);
|
|
27
27
|
const merkleTreeDb = worldStateSynchronizer.getLatest();
|
|
28
|
-
const blockBuilder = new SoloBlockBuilder(merkleTreeDb, getVerificationKeys(), new
|
|
28
|
+
const blockBuilder = new SoloBlockBuilder(merkleTreeDb, getVerificationKeys(), new RealRollupCircuitSimulator(), new EmptyRollupProver());
|
|
29
29
|
const publicProcessorFactory = new PublicProcessorFactory(merkleTreeDb, contractDataSource, l1ToL2MessageSource);
|
|
30
30
|
const sequencer = new Sequencer(publisher, globalsBuilder, p2pClient, worldStateSynchronizer, blockBuilder, l2BlockSource, l1ToL2MessageSource, publicProcessorFactory, config);
|
|
31
31
|
await sequencer.start();
|
package/dest/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export * from './client/index.js';
|
|
|
5
5
|
export * from './mocks/verification_keys.js';
|
|
6
6
|
export * from './sequencer/public_processor.js';
|
|
7
7
|
export * from './global_variable_builder/index.js';
|
|
8
|
-
export {
|
|
8
|
+
export { RealRollupCircuitSimulator } from './simulator/rollup.js';
|
|
9
9
|
export { EmptyRollupProver } from './prover/empty.js';
|
|
10
10
|
export { SoloBlockBuilder } from './block_builder/solo_block_builder.js';
|
|
11
11
|
export { makeProcessedTx, makeEmptyProcessedTx } from './sequencer/processed_tx.js';
|
package/dest/index.js
CHANGED
|
@@ -7,7 +7,7 @@ export * from './mocks/verification_keys.js';
|
|
|
7
7
|
export * from './sequencer/public_processor.js';
|
|
8
8
|
export * from './global_variable_builder/index.js';
|
|
9
9
|
// Used by publisher test in e2e
|
|
10
|
-
export {
|
|
10
|
+
export { RealRollupCircuitSimulator } from './simulator/rollup.js';
|
|
11
11
|
export { EmptyRollupProver } from './prover/empty.js';
|
|
12
12
|
export { SoloBlockBuilder } from './block_builder/solo_block_builder.js';
|
|
13
13
|
export { makeProcessedTx, makeEmptyProcessedTx } from './sequencer/processed_tx.js';
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* The sequencer configuration.
|
|
3
|
-
*/
|
|
4
|
-
export interface SequencerConfig {
|
|
5
|
-
/**
|
|
6
|
-
* The number of ms to wait between polling for pending txs.
|
|
7
|
-
*/
|
|
8
|
-
transactionPollingIntervalMS?: number;
|
|
9
|
-
/**
|
|
10
|
-
* The maximum number of txs to include in a block.
|
|
11
|
-
*/
|
|
12
|
-
maxTxsPerBlock?: number;
|
|
13
|
-
/**
|
|
14
|
-
* The minimum number of txs to include in a block.
|
|
15
|
-
*/
|
|
16
|
-
minTxsPerBlock?: number;
|
|
17
|
-
}
|
|
1
|
+
export { SequencerConfig } from '@aztec/types';
|
|
18
2
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sequencer/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sequencer/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { PublicExecutionResult, PublicExecutor } from '@aztec/acir-simulator';
|
|
2
|
-
import { Fr, GlobalVariables, HistoricBlockData, KernelCircuitPublicInputs,
|
|
3
|
-
import { Tuple } from '@aztec/foundation/serialize';
|
|
1
|
+
import { PublicExecutionResult, PublicExecutor, PublicStateDB } from '@aztec/acir-simulator';
|
|
2
|
+
import { Fr, GlobalVariables, HistoricBlockData, KernelCircuitPublicInputs, PreviousKernelData, Proof, PublicCallData, PublicCallStackItem, PublicCircuitPublicInputs, PublicKernelPublicInputs } from '@aztec/circuits.js';
|
|
4
3
|
import { ContractDataSource, FunctionL2Logs, L1ToL2MessageSource, Tx } from '@aztec/types';
|
|
5
4
|
import { MerkleTreeOperations } from '@aztec/world-state';
|
|
6
5
|
import { PublicProver } from '../prover/index.js';
|
|
@@ -36,8 +35,9 @@ export declare class PublicProcessor {
|
|
|
36
35
|
protected globalVariables: GlobalVariables;
|
|
37
36
|
protected blockData: HistoricBlockData;
|
|
38
37
|
protected publicContractsDB: ContractsDataSourcePublicDB;
|
|
38
|
+
protected publicStateDB: PublicStateDB;
|
|
39
39
|
private log;
|
|
40
|
-
constructor(db: MerkleTreeOperations, publicExecutor: PublicExecutor, publicKernel: PublicKernelCircuitSimulator, publicProver: PublicProver, globalVariables: GlobalVariables, blockData: HistoricBlockData, publicContractsDB: ContractsDataSourcePublicDB, log?: import("@aztec/foundation/log").DebugLogger);
|
|
40
|
+
constructor(db: MerkleTreeOperations, publicExecutor: PublicExecutor, publicKernel: PublicKernelCircuitSimulator, publicProver: PublicProver, globalVariables: GlobalVariables, blockData: HistoricBlockData, publicContractsDB: ContractsDataSourcePublicDB, publicStateDB: PublicStateDB, log?: import("@aztec/foundation/log").DebugLogger);
|
|
41
41
|
/**
|
|
42
42
|
* Run each tx through the public circuit and the public kernel circuit if needed.
|
|
43
43
|
* @param txs - Txs to process.
|
|
@@ -56,7 +56,7 @@ export declare class PublicProcessor {
|
|
|
56
56
|
protected getPreviousKernelData(previousOutput: KernelCircuitPublicInputs, previousProof: Proof): PreviousKernelData;
|
|
57
57
|
protected getPublicCircuitPublicInputs(result: PublicExecutionResult): Promise<PublicCircuitPublicInputs>;
|
|
58
58
|
protected getPublicCallStackItem(result: PublicExecutionResult, isExecutionRequest?: boolean): Promise<PublicCallStackItem>;
|
|
59
|
-
protected getPublicCallStackPreimages(result: PublicExecutionResult): Promise<[
|
|
59
|
+
protected getPublicCallStackPreimages(result: PublicExecutionResult): Promise<PublicCallStackItem[]>;
|
|
60
60
|
protected getBytecodeHash(_result: PublicExecutionResult): Promise<Fr>;
|
|
61
61
|
/**
|
|
62
62
|
* Calculates the PublicCircuitOutput for this execution result along with its proof,
|
|
@@ -66,7 +66,7 @@ export declare class PublicProcessor {
|
|
|
66
66
|
* @param isExecutionRequest - Whether the current callstack item should be considered a public fn execution request.
|
|
67
67
|
* @returns A corresponding PublicCallData object.
|
|
68
68
|
*/
|
|
69
|
-
protected getPublicCallData(result: PublicExecutionResult,
|
|
69
|
+
protected getPublicCallData(result: PublicExecutionResult, isExecutionRequest?: boolean): Promise<PublicCallData>;
|
|
70
70
|
/**
|
|
71
71
|
* Patch the ordering of storage actions output from the public kernel.
|
|
72
72
|
* @param publicInputs - to be patched here: public inputs to the kernel iteration up to this point
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public_processor.d.ts","sourceRoot":"","sources":["../../src/sequencer/public_processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,cAAc,
|
|
1
|
+
{"version":3,"file":"public_processor.d.ts","sourceRoot":"","sources":["../../src/sequencer/public_processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { collectPublicDataReads, collectPublicDataUpdateRequests, isPublicExecutionResult, } from '@aztec/acir-simulator';
|
|
2
|
-
import { AztecAddress, CombinedAccumulatedData, ContractStorageRead, ContractStorageUpdateRequest, Fr, KernelCircuitPublicInputs, MAX_NEW_COMMITMENTS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_NULLIFIERS_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MembershipWitness, PreviousKernelData, PublicCallData, PublicCallStackItem, PublicCircuitPublicInputs, PublicDataRead, PublicDataUpdateRequest, PublicKernelInputs, RETURN_VALUES_LENGTH, VK_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
3
|
-
import {
|
|
1
|
+
import { PublicExecutor, collectPublicDataReads, collectPublicDataUpdateRequests, isPublicExecutionResult, } from '@aztec/acir-simulator';
|
|
2
|
+
import { AztecAddress, CallRequest, CombinedAccumulatedData, ContractStorageRead, ContractStorageUpdateRequest, Fr, KernelCircuitPublicInputs, MAX_NEW_COMMITMENTS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_NULLIFIERS_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MembershipWitness, PreviousKernelData, PublicCallData, PublicCallStackItem, PublicCircuitPublicInputs, PublicDataRead, PublicDataUpdateRequest, PublicKernelInputs, RETURN_VALUES_LENGTH, VK_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
3
|
+
import { computeVarArgsHash } from '@aztec/circuits.js/abis';
|
|
4
4
|
import { arrayNonEmptyLength, isArrayEmpty, padArrayEnd } from '@aztec/foundation/collection';
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
-
import {
|
|
6
|
+
import { to2Fields } from '@aztec/foundation/serialize';
|
|
7
7
|
import { MerkleTreeId, Tx } from '@aztec/types';
|
|
8
8
|
import { getVerificationKeys } from '../index.js';
|
|
9
9
|
import { EmptyPublicProver } from '../prover/empty.js';
|
|
10
|
-
import { ContractsDataSourcePublicDB,
|
|
11
|
-
import {
|
|
10
|
+
import { ContractsDataSourcePublicDB, WorldStateDB, WorldStatePublicDB } from '../simulator/public_executor.js';
|
|
11
|
+
import { RealPublicKernelCircuitSimulator } from '../simulator/public_kernel.js';
|
|
12
12
|
import { makeEmptyProcessedTx, makeProcessedTx } from './processed_tx.js';
|
|
13
13
|
import { getHistoricBlockData } from './utils.js';
|
|
14
14
|
/**
|
|
@@ -30,7 +30,10 @@ export class PublicProcessorFactory {
|
|
|
30
30
|
async create(prevGlobalVariables, globalVariables) {
|
|
31
31
|
const blockData = await getHistoricBlockData(this.merkleTree, prevGlobalVariables);
|
|
32
32
|
const publicContractsDB = new ContractsDataSourcePublicDB(this.contractDataSource);
|
|
33
|
-
|
|
33
|
+
const worldStatePublicDB = new WorldStatePublicDB(this.merkleTree);
|
|
34
|
+
const worldStateDB = new WorldStateDB(this.merkleTree, this.l1Tol2MessagesDataSource);
|
|
35
|
+
const publicExecutor = new PublicExecutor(worldStatePublicDB, publicContractsDB, worldStateDB, blockData);
|
|
36
|
+
return new PublicProcessor(this.merkleTree, publicExecutor, new RealPublicKernelCircuitSimulator(), new EmptyPublicProver(), globalVariables, blockData, publicContractsDB, worldStatePublicDB);
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
/**
|
|
@@ -38,7 +41,7 @@ export class PublicProcessorFactory {
|
|
|
38
41
|
* any public function calls in them. Txs with private calls only are unaffected.
|
|
39
42
|
*/
|
|
40
43
|
export class PublicProcessor {
|
|
41
|
-
constructor(db, publicExecutor, publicKernel, publicProver, globalVariables, blockData, publicContractsDB, log = createDebugLogger('aztec:sequencer:public-processor')) {
|
|
44
|
+
constructor(db, publicExecutor, publicKernel, publicProver, globalVariables, blockData, publicContractsDB, publicStateDB, log = createDebugLogger('aztec:sequencer:public-processor')) {
|
|
42
45
|
this.db = db;
|
|
43
46
|
this.publicExecutor = publicExecutor;
|
|
44
47
|
this.publicKernel = publicKernel;
|
|
@@ -46,6 +49,7 @@ export class PublicProcessor {
|
|
|
46
49
|
this.globalVariables = globalVariables;
|
|
47
50
|
this.blockData = blockData;
|
|
48
51
|
this.publicContractsDB = publicContractsDB;
|
|
52
|
+
this.publicStateDB = publicStateDB;
|
|
49
53
|
this.log = log;
|
|
50
54
|
}
|
|
51
55
|
/**
|
|
@@ -64,6 +68,8 @@ export class PublicProcessor {
|
|
|
64
68
|
// add new contracts to the contracts db so that their functions may be found and called
|
|
65
69
|
await this.publicContractsDB.addNewContracts(tx);
|
|
66
70
|
result.push(await this.processTx(tx));
|
|
71
|
+
// commit the state updates from this transaction
|
|
72
|
+
await this.publicStateDB.commit();
|
|
67
73
|
}
|
|
68
74
|
catch (err) {
|
|
69
75
|
this.log.warn(`Error processing tx ${await tx.getTxHash()}: ${err}`);
|
|
@@ -73,6 +79,8 @@ export class PublicProcessor {
|
|
|
73
79
|
});
|
|
74
80
|
// remove contracts on failure
|
|
75
81
|
await this.publicContractsDB.removeNewContracts(tx);
|
|
82
|
+
// rollback any state updates from this failed transaction
|
|
83
|
+
await this.publicStateDB.rollback();
|
|
76
84
|
}
|
|
77
85
|
}
|
|
78
86
|
return [result, failed];
|
|
@@ -86,7 +94,7 @@ export class PublicProcessor {
|
|
|
86
94
|
return makeEmptyProcessedTx(this.blockData, chainId, version);
|
|
87
95
|
}
|
|
88
96
|
async processTx(tx) {
|
|
89
|
-
if (!isArrayEmpty(tx.data.end.publicCallStack, item => item.
|
|
97
|
+
if (!isArrayEmpty(tx.data.end.publicCallStack, item => item.isEmpty())) {
|
|
90
98
|
const [publicKernelOutput, publicKernelProof, newUnencryptedFunctionLogs] = await this.processEnqueuedPublicCalls(tx);
|
|
91
99
|
tx.unencryptedLogs.addFunctionLogs(newUnencryptedFunctionLogs);
|
|
92
100
|
return makeProcessedTx(tx, publicKernelOutput, publicKernelProof);
|
|
@@ -120,8 +128,7 @@ export class PublicProcessor {
|
|
|
120
128
|
const functionSelector = result.execution.functionData.selector.toString();
|
|
121
129
|
this.log(`Running public kernel circuit for ${functionSelector}@${result.execution.contractAddress.toString()}`);
|
|
122
130
|
executionStack.push(...result.nestedExecutions);
|
|
123
|
-
const
|
|
124
|
-
const callData = await this.getPublicCallData(result, preimages, isExecutionRequest);
|
|
131
|
+
const callData = await this.getPublicCallData(result, isExecutionRequest);
|
|
125
132
|
[kernelOutput, kernelProof] = await this.runKernelCircuit(callData, kernelOutput, kernelProof);
|
|
126
133
|
if (!enqueuedExecutionResult) {
|
|
127
134
|
enqueuedExecutionResult = result;
|
|
@@ -165,7 +172,7 @@ export class PublicProcessor {
|
|
|
165
172
|
const publicDataTreeInfo = await this.db.getTreeInfo(MerkleTreeId.PUBLIC_DATA_TREE);
|
|
166
173
|
this.blockData.publicDataTreeRoot = Fr.fromBuffer(publicDataTreeInfo.root);
|
|
167
174
|
const callStackPreimages = await this.getPublicCallStackPreimages(result);
|
|
168
|
-
const
|
|
175
|
+
const publicCallStackHashes = padArrayEnd(callStackPreimages.map(c => c.hash()), Fr.ZERO, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL);
|
|
169
176
|
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165) --> set this in Noir
|
|
170
177
|
const unencryptedLogsHash = to2Fields(result.unencryptedLogs.hash());
|
|
171
178
|
const unencryptedLogPreimagesLength = new Fr(result.unencryptedLogs.getSerializedLength());
|
|
@@ -179,7 +186,7 @@ export class PublicProcessor {
|
|
|
179
186
|
returnValues: padArrayEnd(result.returnValues, Fr.ZERO, RETURN_VALUES_LENGTH),
|
|
180
187
|
contractStorageReads: padArrayEnd(result.contractStorageReads, ContractStorageRead.empty(), MAX_PUBLIC_DATA_READS_PER_CALL),
|
|
181
188
|
contractStorageUpdateRequests: padArrayEnd(result.contractStorageUpdateRequests, ContractStorageUpdateRequest.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL),
|
|
182
|
-
|
|
189
|
+
publicCallStackHashes,
|
|
183
190
|
unencryptedLogsHash,
|
|
184
191
|
unencryptedLogPreimagesLength,
|
|
185
192
|
historicBlockData: this.blockData,
|
|
@@ -190,12 +197,10 @@ export class PublicProcessor {
|
|
|
190
197
|
}
|
|
191
198
|
async getPublicCallStackPreimages(result) {
|
|
192
199
|
const nested = result.nestedExecutions;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
throw new Error(`Public call stack size exceeded (max ${MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL}, got ${preimages.length})`);
|
|
200
|
+
if (nested.length > MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL) {
|
|
201
|
+
throw new Error(`Public call stack size exceeded (max ${MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL}, got ${nested.length})`);
|
|
196
202
|
}
|
|
197
|
-
|
|
198
|
-
return padArrayEnd(preimages, PublicCallStackItem.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL);
|
|
203
|
+
return await Promise.all(nested.map(n => this.getPublicCallStackItem(n)));
|
|
199
204
|
}
|
|
200
205
|
getBytecodeHash(_result) {
|
|
201
206
|
// TODO: Determine how to calculate bytecode hash. Circuits just check it isn't zero for now.
|
|
@@ -211,12 +216,14 @@ export class PublicProcessor {
|
|
|
211
216
|
* @param isExecutionRequest - Whether the current callstack item should be considered a public fn execution request.
|
|
212
217
|
* @returns A corresponding PublicCallData object.
|
|
213
218
|
*/
|
|
214
|
-
async getPublicCallData(result,
|
|
219
|
+
async getPublicCallData(result, isExecutionRequest = false) {
|
|
215
220
|
const bytecodeHash = await this.getBytecodeHash(result);
|
|
216
221
|
const callStackItem = await this.getPublicCallStackItem(result, isExecutionRequest);
|
|
222
|
+
const publicCallRequests = (await this.getPublicCallStackPreimages(result)).map(c => c.toCallRequest());
|
|
223
|
+
const publicCallStack = padArrayEnd(publicCallRequests, CallRequest.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL);
|
|
217
224
|
const portalContractAddress = result.execution.callContext.portalContractAddress.toField();
|
|
218
225
|
const proof = await this.publicProver.getPublicCircuitProof(callStackItem.publicInputs);
|
|
219
|
-
return new PublicCallData(callStackItem,
|
|
226
|
+
return new PublicCallData(callStackItem, publicCallStack, proof, portalContractAddress, bytecodeHash);
|
|
220
227
|
}
|
|
221
228
|
// HACK(#1622): this is a hack to fix ordering of public state in the call stack. Since the private kernel
|
|
222
229
|
// cannot keep track of side effects that happen after or before a nested call, we override the public
|
|
@@ -272,4 +279,4 @@ export class PublicProcessor {
|
|
|
272
279
|
], PublicDataUpdateRequest.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
273
280
|
}
|
|
274
281
|
}
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3Byb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvcHVibGljX3Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsc0JBQXNCLEVBQ3RCLCtCQUErQixFQUMvQix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsWUFBWSxFQUNaLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsNEJBQTRCLEVBQzVCLEVBQUUsRUFHRix5QkFBeUIsRUFDekIsNEJBQTRCLEVBQzVCLDhCQUE4QixFQUM5QiwyQkFBMkIsRUFDM0IscUNBQXFDLEVBQ3JDLDhCQUE4QixFQUM5Qiw0QkFBNEIsRUFDNUIsd0NBQXdDLEVBQ3hDLHNDQUFzQyxFQUN0QyxpQkFBaUIsRUFDakIsa0JBQWtCLEVBRWxCLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCx1QkFBdUIsRUFDdkIsa0JBQWtCLEVBRWxCLG9CQUFvQixFQUNwQixjQUFjLEdBQ2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBUyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUEyRCxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR3pHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUd2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
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3Byb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvcHVibGljX3Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsY0FBYyxFQUVkLHNCQUFzQixFQUN0QiwrQkFBK0IsRUFDL0IsdUJBQXVCLEdBQ3hCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsRUFBRSxFQUdGLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIsOEJBQThCLEVBQzlCLDJCQUEyQixFQUMzQixxQ0FBcUMsRUFDckMsOEJBQThCLEVBQzlCLDRCQUE0QixFQUM1Qix3Q0FBd0MsRUFDeEMsc0NBQXNDLEVBQ3RDLGlCQUFpQixFQUNqQixrQkFBa0IsRUFFbEIsY0FBYyxFQUNkLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBMkQsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHdkQs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
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { CommitmentsDB, MessageLoadOracleInputs, PublicContractsDB,
|
|
3
|
-
import { AztecAddress, EthAddress, Fr, FunctionSelector
|
|
2
|
+
import { CommitmentsDB, MessageLoadOracleInputs, PublicContractsDB, PublicStateDB } from '@aztec/acir-simulator';
|
|
3
|
+
import { AztecAddress, EthAddress, Fr, FunctionSelector } from '@aztec/circuits.js';
|
|
4
4
|
import { ContractDataSource, ExtendedContractData, L1ToL2MessageSource, Tx } from '@aztec/types';
|
|
5
5
|
import { MerkleTreeOperations } from '@aztec/world-state';
|
|
6
|
-
/**
|
|
7
|
-
* Returns a new PublicExecutor simulator backed by the supplied merkle tree db and contract data source.
|
|
8
|
-
* @param merkleTree - A merkle tree database.
|
|
9
|
-
* @param contractDataSource - A contract data source.
|
|
10
|
-
* @returns A new instance of a PublicExecutor.
|
|
11
|
-
*/
|
|
12
|
-
export declare function getPublicExecutor(merkleTree: MerkleTreeOperations, publicContractsDB: PublicContractsDB, l1toL2MessageSource: L1ToL2MessageSource, blockData: HistoricBlockData): PublicExecutor;
|
|
13
6
|
/**
|
|
14
7
|
* Implements the PublicContractsDB using a ContractDataSource.
|
|
15
8
|
* Progressively records contracts in transaction as they are processed in a block.
|
|
@@ -33,6 +26,39 @@ export declare class ContractsDataSourcePublicDB implements PublicContractsDB {
|
|
|
33
26
|
getIsInternal(address: AztecAddress, selector: FunctionSelector): Promise<boolean | undefined>;
|
|
34
27
|
getPortalContractAddress(address: AztecAddress): Promise<EthAddress | undefined>;
|
|
35
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Implements the PublicStateDB using a world-state database.
|
|
31
|
+
*/
|
|
32
|
+
export declare class WorldStatePublicDB implements PublicStateDB {
|
|
33
|
+
private db;
|
|
34
|
+
private commitedWriteCache;
|
|
35
|
+
private uncommitedWriteCache;
|
|
36
|
+
constructor(db: MerkleTreeOperations);
|
|
37
|
+
/**
|
|
38
|
+
* Reads a value from public storage, returning zero if none.
|
|
39
|
+
* @param contract - Owner of the storage.
|
|
40
|
+
* @param slot - Slot to read in the contract storage.
|
|
41
|
+
* @returns The current value in the storage slot.
|
|
42
|
+
*/
|
|
43
|
+
storageRead(contract: AztecAddress, slot: Fr): Promise<Fr>;
|
|
44
|
+
/**
|
|
45
|
+
* Records a write to public storage.
|
|
46
|
+
* @param contract - Owner of the storage.
|
|
47
|
+
* @param slot - Slot to read in the contract storage.
|
|
48
|
+
* @param newValue - The new value to store.
|
|
49
|
+
*/
|
|
50
|
+
storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Commit the pending changes to the DB.
|
|
53
|
+
* @returns Nothing.
|
|
54
|
+
*/
|
|
55
|
+
commit(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Rollback the pending changes.
|
|
58
|
+
* @returns Nothing.
|
|
59
|
+
*/
|
|
60
|
+
rollback(): Promise<void>;
|
|
61
|
+
}
|
|
36
62
|
/**
|
|
37
63
|
* Implements WorldState db using a world state database.
|
|
38
64
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public_executor.d.ts","sourceRoot":"","sources":["../../src/simulator/public_executor.ts"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"public_executor.d.ts","sourceRoot":"","sources":["../../src/simulator/public_executor.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,mBAAmB,EAAgB,EAAE,EAAE,MAAM,cAAc,CAAC;AAC/G,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,iBAAiB;;IAGvD,OAAO,CAAC,EAAE;IAFtB,KAAK,oCAA2C;gBAE5B,EAAE,EAAE,kBAAkB;IAE1C;;;OAGG;IACI,eAAe,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7C;;;OAGG;IACI,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1C,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI3F,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAI9F,wBAAwB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;CAQvF;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAI1C,OAAO,CAAC,EAAE;IAHtB,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,oBAAoB,CAA8B;gBAEtC,EAAE,EAAE,oBAAoB;IAE5C;;;;;OAKG;IACU,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAcvE;;;;;OAKG;IACI,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlF;;;OAGG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvB;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAI1B;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,aAAa;IACpC,OAAO,CAAC,EAAE;IAAwB,OAAO,CAAC,mBAAmB;gBAArD,EAAE,EAAE,oBAAoB,EAAU,mBAAmB,EAAE,mBAAmB;IAEjF,gBAAgB,CAAC,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAalE,kBAAkB,CAAC,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAG7E"}
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
var _ContractsDataSourcePublicDB_instances, _ContractsDataSourcePublicDB_getContract;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { PublicExecutor, } from '@aztec/acir-simulator';
|
|
4
3
|
import { Fr } from '@aztec/circuits.js';
|
|
5
4
|
import { computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
|
|
6
5
|
import { MerkleTreeId } from '@aztec/types';
|
|
7
|
-
/**
|
|
8
|
-
* Returns a new PublicExecutor simulator backed by the supplied merkle tree db and contract data source.
|
|
9
|
-
* @param merkleTree - A merkle tree database.
|
|
10
|
-
* @param contractDataSource - A contract data source.
|
|
11
|
-
* @returns A new instance of a PublicExecutor.
|
|
12
|
-
*/
|
|
13
|
-
export function getPublicExecutor(merkleTree, publicContractsDB, l1toL2MessageSource, blockData) {
|
|
14
|
-
return new PublicExecutor(new WorldStatePublicDB(merkleTree), publicContractsDB, new WorldStateDB(merkleTree, l1toL2MessageSource), blockData);
|
|
15
|
-
}
|
|
16
6
|
/**
|
|
17
7
|
* Implements the PublicContractsDB using a ContractDataSource.
|
|
18
8
|
* Progressively records contracts in transaction as they are processed in a block.
|
|
@@ -70,10 +60,11 @@ _ContractsDataSourcePublicDB_instances = new WeakSet(), _ContractsDataSourcePubl
|
|
|
70
60
|
/**
|
|
71
61
|
* Implements the PublicStateDB using a world-state database.
|
|
72
62
|
*/
|
|
73
|
-
class WorldStatePublicDB {
|
|
63
|
+
export class WorldStatePublicDB {
|
|
74
64
|
constructor(db) {
|
|
75
65
|
this.db = db;
|
|
76
|
-
this.
|
|
66
|
+
this.commitedWriteCache = new Map();
|
|
67
|
+
this.uncommitedWriteCache = new Map();
|
|
77
68
|
}
|
|
78
69
|
/**
|
|
79
70
|
* Reads a value from public storage, returning zero if none.
|
|
@@ -83,9 +74,13 @@ class WorldStatePublicDB {
|
|
|
83
74
|
*/
|
|
84
75
|
async storageRead(contract, slot) {
|
|
85
76
|
const index = computePublicDataTreeIndex(contract, slot).value;
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
return
|
|
77
|
+
const uncommited = this.uncommitedWriteCache.get(index);
|
|
78
|
+
if (uncommited !== undefined) {
|
|
79
|
+
return uncommited;
|
|
80
|
+
}
|
|
81
|
+
const commited = this.commitedWriteCache.get(index);
|
|
82
|
+
if (commited !== undefined) {
|
|
83
|
+
return commited;
|
|
89
84
|
}
|
|
90
85
|
const value = await this.db.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, index);
|
|
91
86
|
return value ? Fr.fromBuffer(value) : Fr.ZERO;
|
|
@@ -98,7 +93,25 @@ class WorldStatePublicDB {
|
|
|
98
93
|
*/
|
|
99
94
|
storageWrite(contract, slot, newValue) {
|
|
100
95
|
const index = computePublicDataTreeIndex(contract, slot).value;
|
|
101
|
-
this.
|
|
96
|
+
this.uncommitedWriteCache.set(index, newValue);
|
|
97
|
+
return Promise.resolve();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Commit the pending changes to the DB.
|
|
101
|
+
* @returns Nothing.
|
|
102
|
+
*/
|
|
103
|
+
commit() {
|
|
104
|
+
for (const [k, v] of this.uncommitedWriteCache) {
|
|
105
|
+
this.commitedWriteCache.set(k, v);
|
|
106
|
+
}
|
|
107
|
+
return this.rollback();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Rollback the pending changes.
|
|
111
|
+
* @returns Nothing.
|
|
112
|
+
*/
|
|
113
|
+
rollback() {
|
|
114
|
+
this.uncommitedWriteCache = new Map();
|
|
102
115
|
return Promise.resolve();
|
|
103
116
|
}
|
|
104
117
|
}
|
|
@@ -125,4 +138,4 @@ export class WorldStateDB {
|
|
|
125
138
|
return await this.db.findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, commitment.toBuffer());
|
|
126
139
|
}
|
|
127
140
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXVsYXRvci9wdWJsaWNfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxPQUFPLEVBQTRCLEVBQUUsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRSxPQUFPLEVBQWlFLFlBQVksRUFBTSxNQUFNLGNBQWMsQ0FBQztBQUcvRzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sMkJBQTJCO0lBR3RDLFlBQW9CLEVBQXNCOztRQUF0QixPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUYxQyxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFFSCxDQUFDO0lBRTlDOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxFQUFNO1FBQzNCLEtBQUssTUFBTSxRQUFRLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRTtZQUN0QyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztZQUU5RCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDNUIsU0FBUzthQUNWO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtCQUFrQixDQUFDLEVBQU07UUFDOUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO1lBRTlELElBQUksZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM1QixTQUFTO2FBQ1Y7WUFFRCxJQUFJLENB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
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { PublicKernelInputs, PublicKernelPublicInputs } from '@aztec/circuits.js';
|
|
2
2
|
import { PublicKernelCircuitSimulator } from './index.js';
|
|
3
3
|
/**
|
|
4
|
-
* Implements the PublicKernelCircuitSimulator
|
|
4
|
+
* Implements the PublicKernelCircuitSimulator.
|
|
5
5
|
*/
|
|
6
|
-
export declare class
|
|
6
|
+
export declare class RealPublicKernelCircuitSimulator implements PublicKernelCircuitSimulator {
|
|
7
7
|
private log;
|
|
8
8
|
/**
|
|
9
9
|
* Simulates the public kernel circuit (with a previous private kernel circuit run) from its inputs.
|
|
@@ -2,9 +2,9 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
2
2
|
import { elapsed } from '@aztec/foundation/timer';
|
|
3
3
|
import { executePublicKernelPrivatePrevious, executePublicKernelPublicPrevious } from '@aztec/noir-protocol-circuits';
|
|
4
4
|
/**
|
|
5
|
-
* Implements the PublicKernelCircuitSimulator
|
|
5
|
+
* Implements the PublicKernelCircuitSimulator.
|
|
6
6
|
*/
|
|
7
|
-
export class
|
|
7
|
+
export class RealPublicKernelCircuitSimulator {
|
|
8
8
|
constructor() {
|
|
9
9
|
this.log = createDebugLogger('aztec:public-kernel-simulator');
|
|
10
10
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BaseOrMergeRollupPublicInputs, BaseRollupInputs, MergeRollupInputs, RootRollupInputs, RootRollupPublicInputs } from '@aztec/circuits.js';
|
|
2
2
|
import { RollupSimulator } from './index.js';
|
|
3
3
|
/**
|
|
4
|
-
* Implements the rollup circuit simulator
|
|
4
|
+
* Implements the rollup circuit simulator.
|
|
5
5
|
*/
|
|
6
|
-
export declare class
|
|
6
|
+
export declare class RealRollupCircuitSimulator implements RollupSimulator {
|
|
7
7
|
private log;
|
|
8
8
|
/**
|
|
9
9
|
* Simulates the base rollup circuit from its inputs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/simulator/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/simulator/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,qBAAa,0BAA2B,YAAW,eAAe;IAChE,OAAO,CAAC,GAAG,CAA+C;IAE1D;;;;OAIG;IACU,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAa/F;;;;OAIG;IACU,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAcjG;;;;OAIG;IACU,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAazF"}
|
package/dest/simulator/rollup.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { CircuitError, CircuitsWasm, baseRollupSim, } from '@aztec/circuits.js';
|
|
2
1
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
2
|
import { elapsed } from '@aztec/foundation/timer';
|
|
4
|
-
import { executeMergeRollup, executeRootRollup } from '@aztec/noir-protocol-circuits';
|
|
3
|
+
import { executeBaseRollup, executeMergeRollup, executeRootRollup } from '@aztec/noir-protocol-circuits';
|
|
5
4
|
/**
|
|
6
|
-
* Implements the rollup circuit simulator
|
|
5
|
+
* Implements the rollup circuit simulator.
|
|
7
6
|
*/
|
|
8
|
-
export class
|
|
7
|
+
export class RealRollupCircuitSimulator {
|
|
9
8
|
constructor() {
|
|
10
9
|
this.log = createDebugLogger('aztec:rollup-simulator');
|
|
11
10
|
}
|
|
@@ -15,11 +14,7 @@ export class WasmRollupCircuitSimulator {
|
|
|
15
14
|
* @returns The public inputs as outputs of the simulation.
|
|
16
15
|
*/
|
|
17
16
|
async baseRollupCircuit(input) {
|
|
18
|
-
const
|
|
19
|
-
const [duration, result] = await elapsed(() => baseRollupSim(wasm, input));
|
|
20
|
-
if (result instanceof CircuitError) {
|
|
21
|
-
throw new CircuitError(result.code, result.message);
|
|
22
|
-
}
|
|
17
|
+
const [duration, result] = await elapsed(() => executeBaseRollup(input));
|
|
23
18
|
this.log(`Simulated base rollup circuit`, {
|
|
24
19
|
eventName: 'circuit-simulation',
|
|
25
20
|
circuitName: 'base-rollup',
|
|
@@ -62,4 +57,4 @@ export class WasmRollupCircuitSimulator {
|
|
|
62
57
|
return result;
|
|
63
58
|
}
|
|
64
59
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbHVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXVsYXRvci9yb2xsdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBS3pHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDBCQUEwQjtJQUF2QztRQUNVLFFBQUcsR0FBRyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBeUQ1RCxDQUFDO0lBdkRDOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBdUI7UUFDcEQsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUU7WUFDeEMsU0FBUyxFQUFFLG9CQUFvQjtZQUMvQixXQUFXLEVBQUUsYUFBYTtZQUMxQixRQUFRO1lBQ1IsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNO1lBQ2xDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTTtTQUNKLENBQUMsQ0FBQztRQUVwQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBd0I7UUFDdEQsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUU7WUFDekMsU0FBUyxFQUFFLG9CQUFvQjtZQUMvQixXQUFXLEVBQUUsY0FBYztZQUMzQixRQUFRO1lBQ1IsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNO1lBQ2xDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTTtTQUNKLENBQUMsQ0FBQztRQUVwQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUF1QjtRQUNwRCxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRTtZQUN4QyxTQUFTLEVBQUUsb0JBQW9CO1lBQy9CLFdBQVcsRUFBRSxhQUFhO1lBQzFCLFFBQVE7WUFDUixTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU07WUFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNO1NBQ0osQ0FBQyxDQUFDO1FBRXBDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -32,16 +32,16 @@
|
|
|
32
32
|
"rootDir": "./src"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@aztec/acir-simulator": "0.
|
|
36
|
-
"@aztec/circuits.js": "0.
|
|
37
|
-
"@aztec/ethereum": "0.
|
|
38
|
-
"@aztec/foundation": "0.
|
|
39
|
-
"@aztec/l1-artifacts": "0.
|
|
40
|
-
"@aztec/merkle-tree": "0.
|
|
41
|
-
"@aztec/noir-protocol-circuits": "0.
|
|
42
|
-
"@aztec/p2p": "0.
|
|
43
|
-
"@aztec/types": "0.
|
|
44
|
-
"@aztec/world-state": "0.
|
|
35
|
+
"@aztec/acir-simulator": "0.16.0",
|
|
36
|
+
"@aztec/circuits.js": "0.16.0",
|
|
37
|
+
"@aztec/ethereum": "0.16.0",
|
|
38
|
+
"@aztec/foundation": "0.16.0",
|
|
39
|
+
"@aztec/l1-artifacts": "0.16.0",
|
|
40
|
+
"@aztec/merkle-tree": "0.16.0",
|
|
41
|
+
"@aztec/noir-protocol-circuits": "0.16.0",
|
|
42
|
+
"@aztec/p2p": "0.16.0",
|
|
43
|
+
"@aztec/types": "0.16.0",
|
|
44
|
+
"@aztec/world-state": "0.16.0",
|
|
45
45
|
"lodash.chunk": "^4.2.0",
|
|
46
46
|
"lodash.flatmap": "^4.5.0",
|
|
47
47
|
"lodash.pick": "^4.4.0",
|
|
@@ -8,7 +8,7 @@ import { getGlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
|
8
8
|
import { Sequencer, SequencerConfig, getL1Publisher, getVerificationKeys } from '../index.js';
|
|
9
9
|
import { EmptyRollupProver } from '../prover/empty.js';
|
|
10
10
|
import { PublicProcessorFactory } from '../sequencer/public_processor.js';
|
|
11
|
-
import {
|
|
11
|
+
import { RealRollupCircuitSimulator } from '../simulator/rollup.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Encapsulates the full sequencer and publisher.
|
|
@@ -41,7 +41,7 @@ export class SequencerClient {
|
|
|
41
41
|
const blockBuilder = new SoloBlockBuilder(
|
|
42
42
|
merkleTreeDb,
|
|
43
43
|
getVerificationKeys(),
|
|
44
|
-
new
|
|
44
|
+
new RealRollupCircuitSimulator(),
|
|
45
45
|
new EmptyRollupProver(),
|
|
46
46
|
);
|
|
47
47
|
|
package/src/index.ts
CHANGED
|
@@ -9,7 +9,7 @@ export * from './sequencer/public_processor.js';
|
|
|
9
9
|
export * from './global_variable_builder/index.js';
|
|
10
10
|
|
|
11
11
|
// Used by publisher test in e2e
|
|
12
|
-
export {
|
|
12
|
+
export { RealRollupCircuitSimulator } from './simulator/rollup.js';
|
|
13
13
|
export { EmptyRollupProver } from './prover/empty.js';
|
|
14
14
|
export { SoloBlockBuilder } from './block_builder/solo_block_builder.js';
|
|
15
15
|
export { makeProcessedTx, makeEmptyProcessedTx } from './sequencer/processed_tx.js';
|
package/src/sequencer/config.ts
CHANGED
|
@@ -1,17 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* The sequencer configuration.
|
|
3
|
-
*/
|
|
4
|
-
export interface SequencerConfig {
|
|
5
|
-
/**
|
|
6
|
-
* The number of ms to wait between polling for pending txs.
|
|
7
|
-
*/
|
|
8
|
-
transactionPollingIntervalMS?: number;
|
|
9
|
-
/**
|
|
10
|
-
* The maximum number of txs to include in a block.
|
|
11
|
-
*/
|
|
12
|
-
maxTxsPerBlock?: number;
|
|
13
|
-
/**
|
|
14
|
-
* The minimum number of txs to include in a block.
|
|
15
|
-
*/
|
|
16
|
-
minTxsPerBlock?: number;
|
|
17
|
-
}
|
|
1
|
+
export { SequencerConfig } from '@aztec/types';
|
|
@@ -2,12 +2,14 @@ import {
|
|
|
2
2
|
PublicExecution,
|
|
3
3
|
PublicExecutionResult,
|
|
4
4
|
PublicExecutor,
|
|
5
|
+
PublicStateDB,
|
|
5
6
|
collectPublicDataReads,
|
|
6
7
|
collectPublicDataUpdateRequests,
|
|
7
8
|
isPublicExecutionResult,
|
|
8
9
|
} from '@aztec/acir-simulator';
|
|
9
10
|
import {
|
|
10
11
|
AztecAddress,
|
|
12
|
+
CallRequest,
|
|
11
13
|
CombinedAccumulatedData,
|
|
12
14
|
ContractStorageRead,
|
|
13
15
|
ContractStorageUpdateRequest,
|
|
@@ -36,10 +38,10 @@ import {
|
|
|
36
38
|
RETURN_VALUES_LENGTH,
|
|
37
39
|
VK_TREE_HEIGHT,
|
|
38
40
|
} from '@aztec/circuits.js';
|
|
39
|
-
import {
|
|
41
|
+
import { computeVarArgsHash } from '@aztec/circuits.js/abis';
|
|
40
42
|
import { arrayNonEmptyLength, isArrayEmpty, padArrayEnd } from '@aztec/foundation/collection';
|
|
41
43
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
42
|
-
import {
|
|
44
|
+
import { to2Fields } from '@aztec/foundation/serialize';
|
|
43
45
|
import { ContractDataSource, FunctionL2Logs, L1ToL2MessageSource, MerkleTreeId, Tx } from '@aztec/types';
|
|
44
46
|
import { MerkleTreeOperations } from '@aztec/world-state';
|
|
45
47
|
|
|
@@ -47,8 +49,8 @@ import { getVerificationKeys } from '../index.js';
|
|
|
47
49
|
import { EmptyPublicProver } from '../prover/empty.js';
|
|
48
50
|
import { PublicProver } from '../prover/index.js';
|
|
49
51
|
import { PublicKernelCircuitSimulator } from '../simulator/index.js';
|
|
50
|
-
import { ContractsDataSourcePublicDB,
|
|
51
|
-
import {
|
|
52
|
+
import { ContractsDataSourcePublicDB, WorldStateDB, WorldStatePublicDB } from '../simulator/public_executor.js';
|
|
53
|
+
import { RealPublicKernelCircuitSimulator } from '../simulator/public_kernel.js';
|
|
52
54
|
import { FailedTx, ProcessedTx, makeEmptyProcessedTx, makeProcessedTx } from './processed_tx.js';
|
|
53
55
|
import { getHistoricBlockData } from './utils.js';
|
|
54
56
|
|
|
@@ -75,14 +77,18 @@ export class PublicProcessorFactory {
|
|
|
75
77
|
): Promise<PublicProcessor> {
|
|
76
78
|
const blockData = await getHistoricBlockData(this.merkleTree, prevGlobalVariables);
|
|
77
79
|
const publicContractsDB = new ContractsDataSourcePublicDB(this.contractDataSource);
|
|
80
|
+
const worldStatePublicDB = new WorldStatePublicDB(this.merkleTree);
|
|
81
|
+
const worldStateDB = new WorldStateDB(this.merkleTree, this.l1Tol2MessagesDataSource);
|
|
82
|
+
const publicExecutor = new PublicExecutor(worldStatePublicDB, publicContractsDB, worldStateDB, blockData);
|
|
78
83
|
return new PublicProcessor(
|
|
79
84
|
this.merkleTree,
|
|
80
|
-
|
|
81
|
-
new
|
|
85
|
+
publicExecutor,
|
|
86
|
+
new RealPublicKernelCircuitSimulator(),
|
|
82
87
|
new EmptyPublicProver(),
|
|
83
88
|
globalVariables,
|
|
84
89
|
blockData,
|
|
85
90
|
publicContractsDB,
|
|
91
|
+
worldStatePublicDB,
|
|
86
92
|
);
|
|
87
93
|
}
|
|
88
94
|
}
|
|
@@ -100,6 +106,7 @@ export class PublicProcessor {
|
|
|
100
106
|
protected globalVariables: GlobalVariables,
|
|
101
107
|
protected blockData: HistoricBlockData,
|
|
102
108
|
protected publicContractsDB: ContractsDataSourcePublicDB,
|
|
109
|
+
protected publicStateDB: PublicStateDB,
|
|
103
110
|
|
|
104
111
|
private log = createDebugLogger('aztec:sequencer:public-processor'),
|
|
105
112
|
) {}
|
|
@@ -121,6 +128,8 @@ export class PublicProcessor {
|
|
|
121
128
|
// add new contracts to the contracts db so that their functions may be found and called
|
|
122
129
|
await this.publicContractsDB.addNewContracts(tx);
|
|
123
130
|
result.push(await this.processTx(tx));
|
|
131
|
+
// commit the state updates from this transaction
|
|
132
|
+
await this.publicStateDB.commit();
|
|
124
133
|
} catch (err) {
|
|
125
134
|
this.log.warn(`Error processing tx ${await tx.getTxHash()}: ${err}`);
|
|
126
135
|
failed.push({
|
|
@@ -129,6 +138,8 @@ export class PublicProcessor {
|
|
|
129
138
|
});
|
|
130
139
|
// remove contracts on failure
|
|
131
140
|
await this.publicContractsDB.removeNewContracts(tx);
|
|
141
|
+
// rollback any state updates from this failed transaction
|
|
142
|
+
await this.publicStateDB.rollback();
|
|
132
143
|
}
|
|
133
144
|
}
|
|
134
145
|
|
|
@@ -145,7 +156,7 @@ export class PublicProcessor {
|
|
|
145
156
|
}
|
|
146
157
|
|
|
147
158
|
protected async processTx(tx: Tx): Promise<ProcessedTx> {
|
|
148
|
-
if (!isArrayEmpty(tx.data.end.publicCallStack, item => item.
|
|
159
|
+
if (!isArrayEmpty(tx.data.end.publicCallStack, item => item.isEmpty())) {
|
|
149
160
|
const [publicKernelOutput, publicKernelProof, newUnencryptedFunctionLogs] = await this.processEnqueuedPublicCalls(
|
|
150
161
|
tx,
|
|
151
162
|
);
|
|
@@ -193,8 +204,7 @@ export class PublicProcessor {
|
|
|
193
204
|
`Running public kernel circuit for ${functionSelector}@${result.execution.contractAddress.toString()}`,
|
|
194
205
|
);
|
|
195
206
|
executionStack.push(...result.nestedExecutions);
|
|
196
|
-
const
|
|
197
|
-
const callData = await this.getPublicCallData(result, preimages, isExecutionRequest);
|
|
207
|
+
const callData = await this.getPublicCallData(result, isExecutionRequest);
|
|
198
208
|
|
|
199
209
|
[kernelOutput, kernelProof] = await this.runKernelCircuit(callData, kernelOutput, kernelProof);
|
|
200
210
|
|
|
@@ -252,9 +262,10 @@ export class PublicProcessor {
|
|
|
252
262
|
this.blockData.publicDataTreeRoot = Fr.fromBuffer(publicDataTreeInfo.root);
|
|
253
263
|
|
|
254
264
|
const callStackPreimages = await this.getPublicCallStackPreimages(result);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
265
|
+
const publicCallStackHashes = padArrayEnd(
|
|
266
|
+
callStackPreimages.map(c => c.hash()),
|
|
267
|
+
Fr.ZERO,
|
|
268
|
+
MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,
|
|
258
269
|
);
|
|
259
270
|
|
|
260
271
|
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165) --> set this in Noir
|
|
@@ -279,7 +290,7 @@ export class PublicProcessor {
|
|
|
279
290
|
ContractStorageUpdateRequest.empty(),
|
|
280
291
|
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
|
|
281
292
|
),
|
|
282
|
-
|
|
293
|
+
publicCallStackHashes,
|
|
283
294
|
unencryptedLogsHash,
|
|
284
295
|
unencryptedLogPreimagesLength,
|
|
285
296
|
historicBlockData: this.blockData,
|
|
@@ -295,17 +306,15 @@ export class PublicProcessor {
|
|
|
295
306
|
);
|
|
296
307
|
}
|
|
297
308
|
|
|
298
|
-
protected async getPublicCallStackPreimages(result: PublicExecutionResult) {
|
|
309
|
+
protected async getPublicCallStackPreimages(result: PublicExecutionResult): Promise<PublicCallStackItem[]> {
|
|
299
310
|
const nested = result.nestedExecutions;
|
|
300
|
-
|
|
301
|
-
if (preimages.length > MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL) {
|
|
311
|
+
if (nested.length > MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL) {
|
|
302
312
|
throw new Error(
|
|
303
|
-
`Public call stack size exceeded (max ${MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL}, got ${
|
|
313
|
+
`Public call stack size exceeded (max ${MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL}, got ${nested.length})`,
|
|
304
314
|
);
|
|
305
315
|
}
|
|
306
316
|
|
|
307
|
-
|
|
308
|
-
return padArrayEnd(preimages, PublicCallStackItem.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL);
|
|
317
|
+
return await Promise.all(nested.map(n => this.getPublicCallStackItem(n)));
|
|
309
318
|
}
|
|
310
319
|
|
|
311
320
|
protected getBytecodeHash(_result: PublicExecutionResult) {
|
|
@@ -323,16 +332,14 @@ export class PublicProcessor {
|
|
|
323
332
|
* @param isExecutionRequest - Whether the current callstack item should be considered a public fn execution request.
|
|
324
333
|
* @returns A corresponding PublicCallData object.
|
|
325
334
|
*/
|
|
326
|
-
protected async getPublicCallData(
|
|
327
|
-
result: PublicExecutionResult,
|
|
328
|
-
preimages: Tuple<PublicCallStackItem, typeof MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,
|
|
329
|
-
isExecutionRequest = false,
|
|
330
|
-
) {
|
|
335
|
+
protected async getPublicCallData(result: PublicExecutionResult, isExecutionRequest = false) {
|
|
331
336
|
const bytecodeHash = await this.getBytecodeHash(result);
|
|
332
337
|
const callStackItem = await this.getPublicCallStackItem(result, isExecutionRequest);
|
|
338
|
+
const publicCallRequests = (await this.getPublicCallStackPreimages(result)).map(c => c.toCallRequest());
|
|
339
|
+
const publicCallStack = padArrayEnd(publicCallRequests, CallRequest.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL);
|
|
333
340
|
const portalContractAddress = result.execution.callContext.portalContractAddress.toField();
|
|
334
341
|
const proof = await this.publicProver.getPublicCircuitProof(callStackItem.publicInputs);
|
|
335
|
-
return new PublicCallData(callStackItem,
|
|
342
|
+
return new PublicCallData(callStackItem, publicCallStack, proof, portalContractAddress, bytecodeHash);
|
|
336
343
|
}
|
|
337
344
|
|
|
338
345
|
// HACK(#1622): this is a hack to fix ordering of public state in the call stack. Since the private kernel
|
|
@@ -1,35 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
MessageLoadOracleInputs,
|
|
4
|
-
PublicContractsDB,
|
|
5
|
-
PublicExecutor,
|
|
6
|
-
PublicStateDB,
|
|
7
|
-
} from '@aztec/acir-simulator';
|
|
8
|
-
import { AztecAddress, EthAddress, Fr, FunctionSelector, HistoricBlockData } from '@aztec/circuits.js';
|
|
1
|
+
import { CommitmentsDB, MessageLoadOracleInputs, PublicContractsDB, PublicStateDB } from '@aztec/acir-simulator';
|
|
2
|
+
import { AztecAddress, EthAddress, Fr, FunctionSelector } from '@aztec/circuits.js';
|
|
9
3
|
import { computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
|
|
10
4
|
import { ContractDataSource, ExtendedContractData, L1ToL2MessageSource, MerkleTreeId, Tx } from '@aztec/types';
|
|
11
5
|
import { MerkleTreeOperations } from '@aztec/world-state';
|
|
12
6
|
|
|
13
|
-
/**
|
|
14
|
-
* Returns a new PublicExecutor simulator backed by the supplied merkle tree db and contract data source.
|
|
15
|
-
* @param merkleTree - A merkle tree database.
|
|
16
|
-
* @param contractDataSource - A contract data source.
|
|
17
|
-
* @returns A new instance of a PublicExecutor.
|
|
18
|
-
*/
|
|
19
|
-
export function getPublicExecutor(
|
|
20
|
-
merkleTree: MerkleTreeOperations,
|
|
21
|
-
publicContractsDB: PublicContractsDB,
|
|
22
|
-
l1toL2MessageSource: L1ToL2MessageSource,
|
|
23
|
-
blockData: HistoricBlockData,
|
|
24
|
-
) {
|
|
25
|
-
return new PublicExecutor(
|
|
26
|
-
new WorldStatePublicDB(merkleTree),
|
|
27
|
-
publicContractsDB,
|
|
28
|
-
new WorldStateDB(merkleTree, l1toL2MessageSource),
|
|
29
|
-
blockData,
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
7
|
/**
|
|
34
8
|
* Implements the PublicContractsDB using a ContractDataSource.
|
|
35
9
|
* Progressively records contracts in transaction as they are processed in a block.
|
|
@@ -95,8 +69,9 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB {
|
|
|
95
69
|
/**
|
|
96
70
|
* Implements the PublicStateDB using a world-state database.
|
|
97
71
|
*/
|
|
98
|
-
class WorldStatePublicDB implements PublicStateDB {
|
|
99
|
-
private
|
|
72
|
+
export class WorldStatePublicDB implements PublicStateDB {
|
|
73
|
+
private commitedWriteCache: Map<bigint, Fr> = new Map();
|
|
74
|
+
private uncommitedWriteCache: Map<bigint, Fr> = new Map();
|
|
100
75
|
|
|
101
76
|
constructor(private db: MerkleTreeOperations) {}
|
|
102
77
|
|
|
@@ -108,9 +83,13 @@ class WorldStatePublicDB implements PublicStateDB {
|
|
|
108
83
|
*/
|
|
109
84
|
public async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
|
|
110
85
|
const index = computePublicDataTreeIndex(contract, slot).value;
|
|
111
|
-
const
|
|
112
|
-
if (
|
|
113
|
-
return
|
|
86
|
+
const uncommited = this.uncommitedWriteCache.get(index);
|
|
87
|
+
if (uncommited !== undefined) {
|
|
88
|
+
return uncommited;
|
|
89
|
+
}
|
|
90
|
+
const commited = this.commitedWriteCache.get(index);
|
|
91
|
+
if (commited !== undefined) {
|
|
92
|
+
return commited;
|
|
114
93
|
}
|
|
115
94
|
const value = await this.db.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, index);
|
|
116
95
|
return value ? Fr.fromBuffer(value) : Fr.ZERO;
|
|
@@ -124,7 +103,27 @@ class WorldStatePublicDB implements PublicStateDB {
|
|
|
124
103
|
*/
|
|
125
104
|
public storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<void> {
|
|
126
105
|
const index = computePublicDataTreeIndex(contract, slot).value;
|
|
127
|
-
this.
|
|
106
|
+
this.uncommitedWriteCache.set(index, newValue);
|
|
107
|
+
return Promise.resolve();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Commit the pending changes to the DB.
|
|
112
|
+
* @returns Nothing.
|
|
113
|
+
*/
|
|
114
|
+
commit(): Promise<void> {
|
|
115
|
+
for (const [k, v] of this.uncommitedWriteCache) {
|
|
116
|
+
this.commitedWriteCache.set(k, v);
|
|
117
|
+
}
|
|
118
|
+
return this.rollback();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Rollback the pending changes.
|
|
123
|
+
* @returns Nothing.
|
|
124
|
+
*/
|
|
125
|
+
rollback(): Promise<void> {
|
|
126
|
+
this.uncommitedWriteCache = new Map<bigint, Fr>();
|
|
128
127
|
return Promise.resolve();
|
|
129
128
|
}
|
|
130
129
|
}
|
|
@@ -7,9 +7,9 @@ import { CircuitSimulationStats } from '@aztec/types/stats';
|
|
|
7
7
|
import { PublicKernelCircuitSimulator } from './index.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Implements the PublicKernelCircuitSimulator
|
|
10
|
+
* Implements the PublicKernelCircuitSimulator.
|
|
11
11
|
*/
|
|
12
|
-
export class
|
|
12
|
+
export class RealPublicKernelCircuitSimulator implements PublicKernelCircuitSimulator {
|
|
13
13
|
private log = createDebugLogger('aztec:public-kernel-simulator');
|
|
14
14
|
|
|
15
15
|
/**
|
package/src/simulator/rollup.ts
CHANGED
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseOrMergeRollupPublicInputs,
|
|
3
3
|
BaseRollupInputs,
|
|
4
|
-
CircuitError,
|
|
5
|
-
CircuitsWasm,
|
|
6
4
|
MergeRollupInputs,
|
|
7
5
|
RootRollupInputs,
|
|
8
6
|
RootRollupPublicInputs,
|
|
9
|
-
baseRollupSim,
|
|
10
7
|
} from '@aztec/circuits.js';
|
|
11
8
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
12
9
|
import { elapsed } from '@aztec/foundation/timer';
|
|
13
|
-
import { executeMergeRollup, executeRootRollup } from '@aztec/noir-protocol-circuits';
|
|
10
|
+
import { executeBaseRollup, executeMergeRollup, executeRootRollup } from '@aztec/noir-protocol-circuits';
|
|
14
11
|
import { CircuitSimulationStats } from '@aztec/types/stats';
|
|
15
12
|
|
|
16
13
|
import { RollupSimulator } from './index.js';
|
|
17
14
|
|
|
18
15
|
/**
|
|
19
|
-
* Implements the rollup circuit simulator
|
|
16
|
+
* Implements the rollup circuit simulator.
|
|
20
17
|
*/
|
|
21
|
-
export class
|
|
18
|
+
export class RealRollupCircuitSimulator implements RollupSimulator {
|
|
22
19
|
private log = createDebugLogger('aztec:rollup-simulator');
|
|
23
20
|
|
|
24
21
|
/**
|
|
@@ -27,11 +24,7 @@ export class WasmRollupCircuitSimulator implements RollupSimulator {
|
|
|
27
24
|
* @returns The public inputs as outputs of the simulation.
|
|
28
25
|
*/
|
|
29
26
|
public async baseRollupCircuit(input: BaseRollupInputs): Promise<BaseOrMergeRollupPublicInputs> {
|
|
30
|
-
const
|
|
31
|
-
const [duration, result] = await elapsed(() => baseRollupSim(wasm, input));
|
|
32
|
-
if (result instanceof CircuitError) {
|
|
33
|
-
throw new CircuitError(result.code, result.message);
|
|
34
|
-
}
|
|
27
|
+
const [duration, result] = await elapsed(() => executeBaseRollup(input));
|
|
35
28
|
|
|
36
29
|
this.log(`Simulated base rollup circuit`, {
|
|
37
30
|
eventName: 'circuit-simulation',
|