@aztec/simulator 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/acvm/oracle/oracle.d.ts +4 -4
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +13 -13
- package/dest/acvm/serialize.d.ts.map +1 -1
- package/dest/acvm/serialize.js +2 -1
- package/dest/avm/opcodes/ec_add.js +3 -3
- package/dest/avm/opcodes/multi_scalar_mul.js +3 -3
- package/dest/client/client_execution_context.d.ts +0 -1
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +9 -9
- package/dest/client/execution_result.js +2 -2
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +2 -2
- package/dest/mocks/fixtures.js +5 -5
- package/dest/public/abstract_phase_manager.d.ts +8 -3
- package/dest/public/abstract_phase_manager.d.ts.map +1 -1
- package/dest/public/abstract_phase_manager.js +37 -24
- package/dest/public/app_logic_phase_manager.d.ts +3 -1
- package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
- package/dest/public/app_logic_phase_manager.js +11 -4
- package/dest/public/execution.d.ts +4 -4
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +5 -5
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +2 -3
- package/dest/public/hints_builder.d.ts +3 -3
- package/dest/public/hints_builder.d.ts.map +1 -1
- package/dest/public/hints_builder.js +1 -1
- package/dest/public/public_kernel.d.ts.map +1 -1
- package/dest/public/public_kernel.js +6 -6
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +4 -2
- package/dest/public/setup_phase_manager.d.ts +3 -1
- package/dest/public/setup_phase_manager.d.ts.map +1 -1
- package/dest/public/setup_phase_manager.js +11 -4
- package/dest/public/side_effect_trace.d.ts +3 -5
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +16 -19
- package/dest/public/tail_phase_manager.d.ts +3 -1
- package/dest/public/tail_phase_manager.d.ts.map +1 -1
- package/dest/public/tail_phase_manager.js +10 -9
- package/dest/public/teardown_phase_manager.d.ts +3 -1
- package/dest/public/teardown_phase_manager.d.ts.map +1 -1
- package/dest/public/teardown_phase_manager.js +11 -4
- package/dest/rollup/rollup.d.ts.map +1 -1
- package/dest/rollup/rollup.js +7 -7
- package/package.json +9 -9
- package/src/acvm/oracle/oracle.ts +13 -23
- package/src/acvm/serialize.ts +1 -0
- package/src/avm/opcodes/ec_add.ts +2 -2
- package/src/avm/opcodes/multi_scalar_mul.ts +2 -2
- package/src/client/client_execution_context.ts +4 -8
- package/src/client/execution_result.ts +1 -1
- package/src/client/simulator.ts +0 -1
- package/src/mocks/fixtures.ts +4 -4
- package/src/public/abstract_phase_manager.ts +65 -28
- package/src/public/app_logic_phase_manager.ts +29 -10
- package/src/public/execution.ts +9 -9
- package/src/public/executor.ts +0 -3
- package/src/public/hints_builder.ts +3 -3
- package/src/public/public_kernel.ts +5 -8
- package/src/public/public_processor.ts +4 -1
- package/src/public/setup_phase_manager.ts +16 -4
- package/src/public/side_effect_trace.ts +13 -19
- package/src/public/tail_phase_manager.ts +19 -9
- package/src/public/teardown_phase_manager.ts +16 -4
- package/src/rollup/rollup.ts +20 -10
|
@@ -10,9 +10,9 @@ export class TeardownPhaseManager extends AbstractPhaseManager {
|
|
|
10
10
|
this.publicContractsDB = publicContractsDB;
|
|
11
11
|
this.publicStateDB = publicStateDB;
|
|
12
12
|
}
|
|
13
|
-
async handle(tx, previousPublicKernelOutput) {
|
|
13
|
+
async handle(tx, previousPublicKernelOutput, previousKernelArtifact) {
|
|
14
14
|
this.log.verbose(`Processing tx ${tx.getTxHash()}`);
|
|
15
|
-
const { publicProvingInformation, kernelOutput, newUnencryptedLogs, revertReason, gasUsed } = await this.processEnqueuedPublicCalls(tx, previousPublicKernelOutput).catch(
|
|
15
|
+
const { publicProvingInformation, kernelOutput, lastKernelArtifact, newUnencryptedLogs, revertReason, gasUsed } = await this.processEnqueuedPublicCalls(tx, previousPublicKernelOutput, previousKernelArtifact).catch(
|
|
16
16
|
// the abstract phase manager throws if simulation gives error in a non-revertible phase
|
|
17
17
|
async (err) => {
|
|
18
18
|
await this.publicStateDB.rollbackToCommit();
|
|
@@ -31,7 +31,14 @@ export class TeardownPhaseManager extends AbstractPhaseManager {
|
|
|
31
31
|
const publicProvingRequests = publicProvingInformation.map(info => {
|
|
32
32
|
return makeAvmProvingRequest(info, PublicKernelType.TEARDOWN);
|
|
33
33
|
});
|
|
34
|
-
return {
|
|
34
|
+
return {
|
|
35
|
+
publicProvingRequests,
|
|
36
|
+
publicKernelOutput: kernelOutput,
|
|
37
|
+
lastKernelArtifact,
|
|
38
|
+
revertReason,
|
|
39
|
+
returnValues: [],
|
|
40
|
+
gasUsed,
|
|
41
|
+
};
|
|
35
42
|
}
|
|
36
43
|
getTransactionFee(tx, previousPublicKernelOutput) {
|
|
37
44
|
const gasSettings = tx.data.constants.txContext.gasSettings;
|
|
@@ -46,4 +53,4 @@ export class TeardownPhaseManager extends AbstractPhaseManager {
|
|
|
46
53
|
return tx.data.constants.txContext.gasSettings.getTeardownLimits();
|
|
47
54
|
}
|
|
48
55
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhcmRvd25fcGhhc2VfbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvdGVhcmRvd25fcGhhc2VfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXNDLE1BQU0sc0JBQXNCLENBQUM7QUFZNUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUkxRjs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxvQkFBb0I7SUFDNUQsWUFDRSxFQUF3QixFQUN4QixjQUE4QixFQUM5QixZQUEwQyxFQUMxQyxlQUFnQyxFQUNoQyxnQkFBd0IsRUFDZCxpQkFBOEMsRUFDOUMsYUFBNEIsRUFDdEMsUUFBMEIsZ0JBQWdCLENBQUMsUUFBUTtRQUVuRCxLQUFLLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSnhFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNkI7UUFDOUMsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFJeEMsQ0FBQztJQUVRLEtBQUssQ0FBQyxNQUFNLENBQ25CLEVBQU0sRUFDTiwwQkFBMkQsRUFDM0Qsc0JBQXdDO1FBRXhDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUM3RyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxLQUFLO1FBQ2pHLHdGQUF3RjtRQUN4RixLQUFLLEVBQUMsR0FBRyxFQUFDLEVBQUU7WUFDVixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FDRixDQUFDO1FBQ0osSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNoRCxFQUFFLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFDTixnRkFBZ0Y7WUFDaEYsb0NBQW9DO1lBQ3BDLEVBQUUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxNQUFNLHFCQUFxQixHQUEyQix3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEYsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wscUJBQXFCO1lBQ3JCLGtCQUFrQixFQUFFLFlBQVk7WUFDaEMsa0JBQWtCO1lBQ2xCLFlBQVk7WUFDWixZQUFZLEVBQUUsRUFBRTtZQUNoQixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFa0IsaUJBQWlCLENBQUMsRUFBTSxFQUFFLDBCQUEyRDtRQUN0RyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQzdDLGdGQUFnRjtRQUNoRixNQUFNLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwSCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFa0IsZUFBZSxDQUFDLEVBQU0sRUFBRSwyQkFBNEQ7UUFDckcsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDckUsQ0FBQztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/rollup/rollup.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/rollup/rollup.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAkB5B,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzE;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzE;;;;OAIG;IACH,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACnF;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACrF;;;;OAIG;IACH,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,qBAAa,0BAA2B,YAAW,eAAe;IAMpD,OAAO,CAAC,kBAAkB;IALtC,OAAO,CAAC,GAAG,CAA+C;IAG1D,OAAO,CAAC,aAAa,CAAsC;gBAEvC,kBAAkB,EAAE,kBAAkB;IAE1D;;;;OAIG;IACU,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAarF;;;;OAIG;IACU,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAarF;;;;OAIG;IACU,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAY/F;;;;OAIG;IACU,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAajG;;;;OAIG;IACU,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAkBzF"}
|
package/dest/rollup/rollup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { elapsed } from '@aztec/foundation/timer';
|
|
3
|
-
import {
|
|
3
|
+
import { SimulatedServerCircuitArtifacts, convertBaseParityInputsToWitnessMap, convertBaseParityOutputsFromWitnessMap, convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap, convertRootParityInputsToWitnessMap, convertRootParityOutputsFromWitnessMap, convertRootRollupInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap, convertSimulatedBaseRollupInputsToWitnessMap, convertSimulatedBaseRollupOutputsFromWitnessMap, } from '@aztec/noir-protocol-circuits-types';
|
|
4
4
|
import { WASMSimulator } from '../providers/acvm_wasm.js';
|
|
5
5
|
/**
|
|
6
6
|
* Implements the rollup circuit simulator.
|
|
@@ -19,7 +19,7 @@ export class RealRollupCircuitSimulator {
|
|
|
19
19
|
*/
|
|
20
20
|
async baseParityCircuit(inputs) {
|
|
21
21
|
const witnessMap = convertBaseParityInputsToWitnessMap(inputs);
|
|
22
|
-
const witness = await this.simulationProvider.simulateCircuit(witnessMap, BaseParityArtifact);
|
|
22
|
+
const witness = await this.simulationProvider.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts.BaseParityArtifact);
|
|
23
23
|
const result = convertBaseParityOutputsFromWitnessMap(witness);
|
|
24
24
|
return Promise.resolve(result);
|
|
25
25
|
}
|
|
@@ -30,7 +30,7 @@ export class RealRollupCircuitSimulator {
|
|
|
30
30
|
*/
|
|
31
31
|
async rootParityCircuit(inputs) {
|
|
32
32
|
const witnessMap = convertRootParityInputsToWitnessMap(inputs);
|
|
33
|
-
const witness = await this.simulationProvider.simulateCircuit(witnessMap, RootParityArtifact);
|
|
33
|
+
const witness = await this.simulationProvider.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts.RootParityArtifact);
|
|
34
34
|
const result = convertRootParityOutputsFromWitnessMap(witness);
|
|
35
35
|
return Promise.resolve(result);
|
|
36
36
|
}
|
|
@@ -41,7 +41,7 @@ export class RealRollupCircuitSimulator {
|
|
|
41
41
|
*/
|
|
42
42
|
async baseRollupCircuit(input) {
|
|
43
43
|
const witnessMap = convertSimulatedBaseRollupInputsToWitnessMap(input);
|
|
44
|
-
const witness = await this.simulationProvider.simulateCircuit(witnessMap,
|
|
44
|
+
const witness = await this.simulationProvider.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts.BaseRollupArtifact);
|
|
45
45
|
const result = convertSimulatedBaseRollupOutputsFromWitnessMap(witness);
|
|
46
46
|
return Promise.resolve(result);
|
|
47
47
|
}
|
|
@@ -52,7 +52,7 @@ export class RealRollupCircuitSimulator {
|
|
|
52
52
|
*/
|
|
53
53
|
async mergeRollupCircuit(input) {
|
|
54
54
|
const witnessMap = convertMergeRollupInputsToWitnessMap(input);
|
|
55
|
-
const witness = await this.wasmSimulator.simulateCircuit(witnessMap, MergeRollupArtifact);
|
|
55
|
+
const witness = await this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts.MergeRollupArtifact);
|
|
56
56
|
const result = convertMergeRollupOutputsFromWitnessMap(witness);
|
|
57
57
|
return result;
|
|
58
58
|
}
|
|
@@ -63,7 +63,7 @@ export class RealRollupCircuitSimulator {
|
|
|
63
63
|
*/
|
|
64
64
|
async rootRollupCircuit(input) {
|
|
65
65
|
const witnessMap = convertRootRollupInputsToWitnessMap(input);
|
|
66
|
-
const [duration, witness] = await elapsed(() => this.wasmSimulator.simulateCircuit(witnessMap, RootRollupArtifact));
|
|
66
|
+
const [duration, witness] = await elapsed(() => this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts.RootRollupArtifact));
|
|
67
67
|
const result = convertRootRollupOutputsFromWitnessMap(witness);
|
|
68
68
|
this.log.debug(`Simulated root rollup circuit`, {
|
|
69
69
|
eventName: 'circuit-simulation',
|
|
@@ -75,4 +75,4 @@ export class RealRollupCircuitSimulator {
|
|
|
75
75
|
return result;
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbHVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvbGx1cC9yb2xsdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxvQ0FBb0MsRUFDcEMsdUNBQXVDLEVBQ3ZDLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEdBQ2hELE1BQU0scUNBQXFDLENBQUM7QUFFN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBdUMxRDs7R0FFRztBQUNILE1BQU0sT0FBTywwQkFBMEI7SUFNckMsWUFBb0Isa0JBQXNDO1FBQXRDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFMbEQsUUFBRyxHQUFHLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFMUQsc0RBQXNEO1FBQzlDLGtCQUFhLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7SUFFRSxDQUFDO0lBRTlEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBd0I7UUFDckQsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUMzRCxVQUFVLEVBQ1YsK0JBQStCLENBQUMsa0JBQWtCLENBQ25ELENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBd0I7UUFDckQsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUMzRCxVQUFVLEVBQ1YsK0JBQStCLENBQUMsa0JBQWtCLENBQ25ELENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBdUI7UUFDcEQsTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUMzRCxVQUFVLEVBQ1YsK0JBQStCLENBQUMsa0JBQWtCLENBQ25ELENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRywrQ0FBK0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBd0I7UUFDdEQsTUFBTSxVQUFVLEdBQUcsb0NBQW9DLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FDdEQsVUFBVSxFQUNWLCtCQUErQixDQUFDLG1CQUFtQixDQUNwRCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsdUNBQXVDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFaEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBdUI7UUFDcEQsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLCtCQUErQixDQUFDLGtCQUFrQixDQUFDLENBQ25HLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRTtZQUM5QyxTQUFTLEVBQUUsb0JBQW9CO1lBQy9CLFdBQVcsRUFBRSxhQUFhO1lBQzFCLFFBQVE7WUFDUixTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU07WUFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNO1NBQ0osQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,14 +56,14 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/circuit-types": "0.
|
|
60
|
-
"@aztec/circuits.js": "0.
|
|
61
|
-
"@aztec/foundation": "0.
|
|
62
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
63
|
-
"@aztec/protocol-contracts": "0.
|
|
64
|
-
"@aztec/telemetry-client": "0.
|
|
65
|
-
"@aztec/types": "0.
|
|
66
|
-
"@aztec/world-state": "0.
|
|
59
|
+
"@aztec/circuit-types": "0.46.1",
|
|
60
|
+
"@aztec/circuits.js": "0.46.1",
|
|
61
|
+
"@aztec/foundation": "0.46.1",
|
|
62
|
+
"@aztec/noir-protocol-circuits-types": "0.46.1",
|
|
63
|
+
"@aztec/protocol-contracts": "0.46.1",
|
|
64
|
+
"@aztec/telemetry-client": "0.46.1",
|
|
65
|
+
"@aztec/types": "0.46.1",
|
|
66
|
+
"@aztec/world-state": "0.46.1",
|
|
67
67
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
68
68
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
69
69
|
"levelup": "^5.1.1",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
2
|
import { KeyValidationRequest } from '@aztec/circuits.js';
|
|
3
|
-
import {
|
|
3
|
+
import { FunctionSelector, NoteSelector } from '@aztec/foundation/abi';
|
|
4
4
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
5
5
|
import { Fr, Point } from '@aztec/foundation/fields';
|
|
6
6
|
|
|
@@ -60,7 +60,7 @@ export class Oracle {
|
|
|
60
60
|
async getKeyValidationRequest([pkMHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
61
61
|
const { pkM, skApp } = await this.typedOracle.getKeyValidationRequest(fromACVMField(pkMHash));
|
|
62
62
|
|
|
63
|
-
return [toACVMField(pkM.x), toACVMField(pkM.y), toACVMField(skApp)];
|
|
63
|
+
return [toACVMField(pkM.x), toACVMField(pkM.y), toACVMField(pkM.isInfinite), toACVMField(skApp)];
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
async getContractInstance([address]: ACVMField[]) {
|
|
@@ -336,13 +336,15 @@ export class Oracle {
|
|
|
336
336
|
[ovskApp]: ACVMField[],
|
|
337
337
|
[ovpkMX]: ACVMField[],
|
|
338
338
|
[ovpkMY]: ACVMField[],
|
|
339
|
+
[ovpkMIsInfinite]: ACVMField[],
|
|
339
340
|
[ivpkMX]: ACVMField[],
|
|
340
341
|
[ivpkMY]: ACVMField[],
|
|
342
|
+
[ivpkMIsInfinite]: ACVMField[],
|
|
341
343
|
preimage: ACVMField[],
|
|
342
344
|
): ACVMField[] {
|
|
343
|
-
const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
|
|
345
|
+
const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY), !fromACVMField(ovpkMIsInfinite).isZero());
|
|
344
346
|
const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
|
|
345
|
-
const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
|
|
347
|
+
const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY), !fromACVMField(ivpkMIsInfinite).isZero());
|
|
346
348
|
const encLog = this.typedOracle.computeEncryptedEventLog(
|
|
347
349
|
AztecAddress.fromString(contractAddress),
|
|
348
350
|
Fr.fromString(randomness),
|
|
@@ -365,13 +367,15 @@ export class Oracle {
|
|
|
365
367
|
[ovskApp]: ACVMField[],
|
|
366
368
|
[ovpkMX]: ACVMField[],
|
|
367
369
|
[ovpkMY]: ACVMField[],
|
|
370
|
+
[ovpkMIsInfinite]: ACVMField[],
|
|
368
371
|
[ivpkMX]: ACVMField[],
|
|
369
372
|
[ivpkMY]: ACVMField[],
|
|
373
|
+
[ivpkMIsInfinite]: ACVMField[],
|
|
370
374
|
preimage: ACVMField[],
|
|
371
375
|
): ACVMField[] {
|
|
372
|
-
const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
|
|
376
|
+
const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY), !fromACVMField(ovpkMIsInfinite).isZero());
|
|
373
377
|
const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
|
|
374
|
-
const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
|
|
378
|
+
const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY), !fromACVMField(ivpkMIsInfinite).isZero());
|
|
375
379
|
const encLog = this.typedOracle.computeEncryptedNoteLog(
|
|
376
380
|
AztecAddress.fromString(contractAddress),
|
|
377
381
|
Fr.fromString(storageSlot),
|
|
@@ -387,18 +391,9 @@ export class Oracle {
|
|
|
387
391
|
return bytes;
|
|
388
392
|
}
|
|
389
393
|
|
|
390
|
-
emitUnencryptedLog(
|
|
391
|
-
[contractAddress]: ACVMField[],
|
|
392
|
-
[eventSelector]: ACVMField[],
|
|
393
|
-
message: ACVMField[],
|
|
394
|
-
[counter]: ACVMField[],
|
|
395
|
-
): ACVMField {
|
|
394
|
+
emitUnencryptedLog([contractAddress]: ACVMField[], message: ACVMField[], [counter]: ACVMField[]): ACVMField {
|
|
396
395
|
const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
|
|
397
|
-
const log = new UnencryptedL2Log(
|
|
398
|
-
AztecAddress.fromString(contractAddress),
|
|
399
|
-
EventSelector.fromField(fromACVMField(eventSelector)),
|
|
400
|
-
logPayload,
|
|
401
|
-
);
|
|
396
|
+
const log = new UnencryptedL2Log(AztecAddress.fromString(contractAddress), logPayload);
|
|
402
397
|
|
|
403
398
|
this.typedOracle.emitUnencryptedLog(log, +counter);
|
|
404
399
|
return toACVMField(0);
|
|
@@ -406,16 +401,11 @@ export class Oracle {
|
|
|
406
401
|
|
|
407
402
|
emitContractClassUnencryptedLog(
|
|
408
403
|
[contractAddress]: ACVMField[],
|
|
409
|
-
[eventSelector]: ACVMField[],
|
|
410
404
|
message: ACVMField[],
|
|
411
405
|
[counter]: ACVMField[],
|
|
412
406
|
): ACVMField {
|
|
413
407
|
const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
|
|
414
|
-
const log = new UnencryptedL2Log(
|
|
415
|
-
AztecAddress.fromString(contractAddress),
|
|
416
|
-
EventSelector.fromField(fromACVMField(eventSelector)),
|
|
417
|
-
logPayload,
|
|
418
|
-
);
|
|
408
|
+
const log = new UnencryptedL2Log(AztecAddress.fromString(contractAddress), logPayload);
|
|
419
409
|
|
|
420
410
|
const logHash = this.typedOracle.emitContractClassUnencryptedLog(log, +counter);
|
|
421
411
|
return toACVMField(logHash);
|
package/src/acvm/serialize.ts
CHANGED
|
@@ -57,6 +57,7 @@ export function toAcvmEnqueuePublicFunctionResult(item: PublicCallRequest): ACVM
|
|
|
57
57
|
item.contractAddress.toField(),
|
|
58
58
|
item.functionSelector.toField(),
|
|
59
59
|
...item.callContext.toFields(),
|
|
60
|
+
item.sideEffectCounter,
|
|
60
61
|
item.getArgsHash(),
|
|
61
62
|
];
|
|
62
63
|
if (fields.length !== ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH) {
|
|
@@ -59,7 +59,7 @@ export class EcAdd extends Instruction {
|
|
|
59
59
|
const p1X = memory.get(p1XOffset);
|
|
60
60
|
const p1Y = memory.get(p1YOffset);
|
|
61
61
|
const p1IsInfinite = memory.get(p1IsInfiniteOffset).toNumber() === 1;
|
|
62
|
-
const p1 = new Point(p1X.toFr(), p1Y.toFr());
|
|
62
|
+
const p1 = new Point(p1X.toFr(), p1Y.toFr(), p1IsInfinite);
|
|
63
63
|
if (!p1.isOnGrumpkin()) {
|
|
64
64
|
throw new Error(`Point1 is not on the curve`);
|
|
65
65
|
}
|
|
@@ -68,7 +68,7 @@ export class EcAdd extends Instruction {
|
|
|
68
68
|
const p2Y = memory.get(p2YOffset);
|
|
69
69
|
// unused. Point doesn't store this information
|
|
70
70
|
const p2IsInfinite = memory.get(p2IsInfiniteOffset).toNumber() === 1;
|
|
71
|
-
const p2 = new Point(p2X.toFr(), p2Y.toFr());
|
|
71
|
+
const p2 = new Point(p2X.toFr(), p2Y.toFr(), p2IsInfinite);
|
|
72
72
|
if (!p2.isOnGrumpkin()) {
|
|
73
73
|
throw new Error(`Point1 is not on the curve`);
|
|
74
74
|
}
|
|
@@ -76,7 +76,7 @@ export class MultiScalarMul extends Instruction {
|
|
|
76
76
|
// Now we need to reconstruct the points and scalars into something we can operate on.
|
|
77
77
|
const grumpkinPoints: Point[] = [];
|
|
78
78
|
for (let i = 0; i < numPoints; i++) {
|
|
79
|
-
const p: Point = new Point(pointsVector[3 * i].toFr(), pointsVector[3 * i + 1].toFr());
|
|
79
|
+
const p: Point = new Point(pointsVector[3 * i].toFr(), pointsVector[3 * i + 1].toFr(), false);
|
|
80
80
|
// Include this later when we have a standard for representing infinity
|
|
81
81
|
// const isInf = pointsVector[i + 2].toBoolean();
|
|
82
82
|
|
|
@@ -104,7 +104,7 @@ export class MultiScalarMul extends Instruction {
|
|
|
104
104
|
(acc, curr) => grumpkin.add(acc, grumpkin.mul(curr[0], curr[1])),
|
|
105
105
|
grumpkin.mul(firstBaseScalarPair[0], firstBaseScalarPair[1]),
|
|
106
106
|
);
|
|
107
|
-
const output = outputPoint.
|
|
107
|
+
const output = outputPoint.toFields().map(f => new Field(f));
|
|
108
108
|
|
|
109
109
|
memory.setSlice(outputOffset, output);
|
|
110
110
|
|
|
@@ -459,9 +459,9 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
459
459
|
|
|
460
460
|
#checkValidStaticCall(childExecutionResult: ExecutionResult) {
|
|
461
461
|
if (
|
|
462
|
-
childExecutionResult.callStackItem.publicInputs.
|
|
463
|
-
childExecutionResult.callStackItem.publicInputs.
|
|
464
|
-
childExecutionResult.callStackItem.publicInputs.
|
|
462
|
+
childExecutionResult.callStackItem.publicInputs.noteHashes.some(item => !item.isEmpty()) ||
|
|
463
|
+
childExecutionResult.callStackItem.publicInputs.nullifiers.some(item => !item.isEmpty()) ||
|
|
464
|
+
childExecutionResult.callStackItem.publicInputs.l2ToL1Msgs.some(item => !item.isEmpty()) ||
|
|
465
465
|
childExecutionResult.callStackItem.publicInputs.encryptedLogsHashes.some(item => !item.isEmpty()) ||
|
|
466
466
|
childExecutionResult.callStackItem.publicInputs.unencryptedLogsHashes.some(item => !item.isEmpty())
|
|
467
467
|
) {
|
|
@@ -500,7 +500,6 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
500
500
|
const derivedCallContext = this.deriveCallContext(
|
|
501
501
|
targetContractAddress,
|
|
502
502
|
targetArtifact,
|
|
503
|
-
sideEffectCounter,
|
|
504
503
|
isDelegateCall,
|
|
505
504
|
isStaticCall,
|
|
506
505
|
);
|
|
@@ -559,7 +558,6 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
559
558
|
const derivedCallContext = this.deriveCallContext(
|
|
560
559
|
targetContractAddress,
|
|
561
560
|
targetArtifact,
|
|
562
|
-
sideEffectCounter,
|
|
563
561
|
isDelegateCall,
|
|
564
562
|
isStaticCall,
|
|
565
563
|
);
|
|
@@ -579,6 +577,7 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
579
577
|
parentCallContext: this.callContext,
|
|
580
578
|
functionSelector,
|
|
581
579
|
contractAddress: targetContractAddress,
|
|
580
|
+
sideEffectCounter,
|
|
582
581
|
});
|
|
583
582
|
}
|
|
584
583
|
|
|
@@ -654,7 +653,6 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
654
653
|
* Derives the call context for a nested execution.
|
|
655
654
|
* @param targetContractAddress - The address of the contract being called.
|
|
656
655
|
* @param targetArtifact - The artifact of the function being called.
|
|
657
|
-
* @param startSideEffectCounter - The side effect counter at the start of the call.
|
|
658
656
|
* @param isDelegateCall - Whether the call is a delegate call.
|
|
659
657
|
* @param isStaticCall - Whether the call is a static call.
|
|
660
658
|
* @returns The derived call context.
|
|
@@ -662,7 +660,6 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
662
660
|
private deriveCallContext(
|
|
663
661
|
targetContractAddress: AztecAddress,
|
|
664
662
|
targetArtifact: FunctionArtifact,
|
|
665
|
-
startSideEffectCounter: number,
|
|
666
663
|
isDelegateCall = false,
|
|
667
664
|
isStaticCall = false,
|
|
668
665
|
) {
|
|
@@ -672,7 +669,6 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
672
669
|
FunctionSelector.fromNameAndParameters(targetArtifact.name, targetArtifact.parameters),
|
|
673
670
|
isDelegateCall,
|
|
674
671
|
isStaticCall,
|
|
675
|
-
startSideEffectCounter,
|
|
676
672
|
);
|
|
677
673
|
}
|
|
678
674
|
|
|
@@ -172,7 +172,7 @@ export function collectEnqueuedPublicFunctionCalls(execResult: ExecutionResult):
|
|
|
172
172
|
return [
|
|
173
173
|
...execResult.enqueuedPublicFunctionCalls,
|
|
174
174
|
...execResult.nestedExecutions.flatMap(collectEnqueuedPublicFunctionCalls),
|
|
175
|
-
].sort((a, b) => b.
|
|
175
|
+
].sort((a, b) => b.sideEffectCounter - a.sideEffectCounter);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
export function collectPublicTeardownFunctionCall(execResult: ExecutionResult): PublicCallRequest {
|
package/src/client/simulator.ts
CHANGED
|
@@ -67,7 +67,6 @@ export class AcirSimulator {
|
|
|
67
67
|
FunctionSelector.fromNameAndParameters(entryPointArtifact.name, entryPointArtifact.parameters),
|
|
68
68
|
false,
|
|
69
69
|
entryPointArtifact.isStatic,
|
|
70
|
-
startSideEffectCounter,
|
|
71
70
|
);
|
|
72
71
|
const context = new ClientExecutionContext(
|
|
73
72
|
contractAddress,
|
package/src/mocks/fixtures.ts
CHANGED
|
@@ -75,7 +75,7 @@ export class PublicExecutionResultBuilder {
|
|
|
75
75
|
revertReason?: SimulationError;
|
|
76
76
|
}) {
|
|
77
77
|
const builder = new PublicExecutionResultBuilder({
|
|
78
|
-
callContext: new CallContext(from, tx.to, tx.selector, false, false
|
|
78
|
+
callContext: new CallContext(from, tx.to, tx.selector, false, false),
|
|
79
79
|
contractAddress: tx.to,
|
|
80
80
|
functionSelector: tx.selector,
|
|
81
81
|
args: tx.args,
|
|
@@ -128,9 +128,9 @@ export class PublicExecutionResultBuilder {
|
|
|
128
128
|
l1ToL2MsgReadRequests: [],
|
|
129
129
|
contractStorageUpdateRequests: this._contractStorageUpdateRequests,
|
|
130
130
|
returnValues: padArrayEnd(this._returnValues, Fr.ZERO, 4), // TODO(#5450) Need to use the proper return values here
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
noteHashes: [],
|
|
132
|
+
nullifiers: [],
|
|
133
|
+
l2ToL1Messages: [],
|
|
134
134
|
contractStorageReads: [],
|
|
135
135
|
unencryptedLogsHashes: [],
|
|
136
136
|
unencryptedLogs: UnencryptedFunctionL2Logs.empty(),
|
|
@@ -25,17 +25,16 @@ import {
|
|
|
25
25
|
L2ToL1Message,
|
|
26
26
|
LogHash,
|
|
27
27
|
MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
MAX_NEW_NULLIFIERS_PER_CALL,
|
|
28
|
+
MAX_L2_TO_L1_MSGS_PER_CALL,
|
|
29
|
+
MAX_NOTE_HASHES_PER_CALL,
|
|
31
30
|
MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,
|
|
31
|
+
MAX_NULLIFIERS_PER_CALL,
|
|
32
32
|
MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,
|
|
33
33
|
MAX_NULLIFIER_READ_REQUESTS_PER_CALL,
|
|
34
34
|
MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,
|
|
35
35
|
MAX_PUBLIC_DATA_READS_PER_CALL,
|
|
36
36
|
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
|
|
37
37
|
MAX_UNENCRYPTED_LOGS_PER_CALL,
|
|
38
|
-
MembershipWitness,
|
|
39
38
|
NESTED_RECURSIVE_PROOF_LENGTH,
|
|
40
39
|
NoteHash,
|
|
41
40
|
Nullifier,
|
|
@@ -48,14 +47,19 @@ import {
|
|
|
48
47
|
PublicKernelData,
|
|
49
48
|
ReadRequest,
|
|
50
49
|
RevertCode,
|
|
51
|
-
VK_TREE_HEIGHT,
|
|
52
|
-
VerificationKeyData,
|
|
53
50
|
makeEmptyProof,
|
|
54
51
|
makeEmptyRecursiveProof,
|
|
55
52
|
} from '@aztec/circuits.js';
|
|
56
53
|
import { computeVarArgsHash } from '@aztec/circuits.js/hash';
|
|
57
54
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
58
55
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
56
|
+
import {
|
|
57
|
+
type ProtocolArtifact,
|
|
58
|
+
ProtocolCircuitVkIndexes,
|
|
59
|
+
ProtocolCircuitVks,
|
|
60
|
+
getVKIndex,
|
|
61
|
+
getVKSiblingPath,
|
|
62
|
+
} from '@aztec/noir-protocol-circuits-types';
|
|
59
63
|
import {
|
|
60
64
|
type PublicExecutionRequest,
|
|
61
65
|
type PublicExecutionResult,
|
|
@@ -106,6 +110,8 @@ export type TxPublicCallsResult = {
|
|
|
106
110
|
publicProvingInformation: PublicProvingInformation[];
|
|
107
111
|
/** The public kernel output at the end of the Tx */
|
|
108
112
|
kernelOutput: PublicKernelCircuitPublicInputs;
|
|
113
|
+
/** The last circuit ran by this phase */
|
|
114
|
+
lastKernelArtifact: ProtocolArtifact;
|
|
109
115
|
/** Unencrypted logs generated during the execution of this Tx */
|
|
110
116
|
newUnencryptedLogs: UnencryptedFunctionL2Logs[];
|
|
111
117
|
/** Revert reason, if any */
|
|
@@ -121,6 +127,8 @@ export type PhaseResult = {
|
|
|
121
127
|
publicProvingRequests: PublicProvingRequest[];
|
|
122
128
|
/** The output of the public kernel circuit simulation for this phase */
|
|
123
129
|
publicKernelOutput: PublicKernelCircuitPublicInputs;
|
|
130
|
+
/** The last circuit ran by this phase */
|
|
131
|
+
lastKernelArtifact: ProtocolArtifact;
|
|
124
132
|
/** The final output of the public kernel circuit for this phase */
|
|
125
133
|
finalKernelOutput?: KernelCircuitPublicInputs;
|
|
126
134
|
/** Revert reason, if any */
|
|
@@ -150,7 +158,11 @@ export abstract class AbstractPhaseManager {
|
|
|
150
158
|
* @param tx - the tx to be processed
|
|
151
159
|
* @param publicKernelPublicInputs - the output of the public kernel circuit for the previous phase
|
|
152
160
|
*/
|
|
153
|
-
abstract handle(
|
|
161
|
+
abstract handle(
|
|
162
|
+
tx: Tx,
|
|
163
|
+
publicKernelPublicInputs: PublicKernelCircuitPublicInputs,
|
|
164
|
+
previousKernelArtifact: ProtocolArtifact,
|
|
165
|
+
): Promise<PhaseResult>;
|
|
154
166
|
|
|
155
167
|
public static extractEnqueuedPublicCallsByPhase(tx: Tx): Record<PublicKernelType, PublicCallRequest[]> {
|
|
156
168
|
const data = tx.data.forPublic;
|
|
@@ -230,6 +242,7 @@ export abstract class AbstractPhaseManager {
|
|
|
230
242
|
protected async processEnqueuedPublicCalls(
|
|
231
243
|
tx: Tx,
|
|
232
244
|
previousPublicKernelOutput: PublicKernelCircuitPublicInputs,
|
|
245
|
+
previousKernelArtifact: ProtocolArtifact,
|
|
233
246
|
): Promise<TxPublicCallsResult> {
|
|
234
247
|
const enqueuedCalls = this.extractEnqueuedPublicCalls(tx);
|
|
235
248
|
|
|
@@ -237,6 +250,7 @@ export abstract class AbstractPhaseManager {
|
|
|
237
250
|
return {
|
|
238
251
|
publicProvingInformation: [],
|
|
239
252
|
kernelOutput: previousPublicKernelOutput,
|
|
253
|
+
lastKernelArtifact: previousKernelArtifact,
|
|
240
254
|
newUnencryptedLogs: [],
|
|
241
255
|
returnValues: [],
|
|
242
256
|
gasUsed: Gas.empty(),
|
|
@@ -253,6 +267,7 @@ export abstract class AbstractPhaseManager {
|
|
|
253
267
|
const transactionFee = this.getTransactionFee(tx, previousPublicKernelOutput);
|
|
254
268
|
let gasUsed = Gas.empty();
|
|
255
269
|
let kernelPublicOutput: PublicKernelCircuitPublicInputs = previousPublicKernelOutput;
|
|
270
|
+
|
|
256
271
|
const enqueuedCallResults = [];
|
|
257
272
|
|
|
258
273
|
for (const enqueuedCall of enqueuedCalls) {
|
|
@@ -313,8 +328,13 @@ export abstract class AbstractPhaseManager {
|
|
|
313
328
|
})`,
|
|
314
329
|
);
|
|
315
330
|
const callData = await this.getPublicCallData(result, isExecutionRequest);
|
|
316
|
-
const [privateInputs, publicInputs] = await this.runKernelCircuit(
|
|
331
|
+
const [privateInputs, publicInputs, artifact] = await this.runKernelCircuit(
|
|
332
|
+
kernelPublicOutput,
|
|
333
|
+
previousKernelArtifact,
|
|
334
|
+
callData,
|
|
335
|
+
);
|
|
317
336
|
kernelPublicOutput = publicInputs;
|
|
337
|
+
previousKernelArtifact = artifact;
|
|
318
338
|
|
|
319
339
|
// Capture the inputs for later proving in the AVM and kernel.
|
|
320
340
|
const publicProvingInformation: PublicProvingInformation = {
|
|
@@ -349,6 +369,7 @@ export abstract class AbstractPhaseManager {
|
|
|
349
369
|
return {
|
|
350
370
|
publicProvingInformation: [],
|
|
351
371
|
kernelOutput: kernelPublicOutput,
|
|
372
|
+
lastKernelArtifact: previousKernelArtifact,
|
|
352
373
|
newUnencryptedLogs: [],
|
|
353
374
|
revertReason: result.revertReason,
|
|
354
375
|
returnValues: [],
|
|
@@ -367,6 +388,7 @@ export abstract class AbstractPhaseManager {
|
|
|
367
388
|
return {
|
|
368
389
|
publicProvingInformation: provingInformationList,
|
|
369
390
|
kernelOutput: kernelPublicOutput,
|
|
391
|
+
lastKernelArtifact: previousKernelArtifact,
|
|
370
392
|
newUnencryptedLogs: newUnencryptedFunctionLogs,
|
|
371
393
|
returnValues: enqueuedCallResults,
|
|
372
394
|
gasUsed,
|
|
@@ -375,7 +397,7 @@ export abstract class AbstractPhaseManager {
|
|
|
375
397
|
|
|
376
398
|
/** Returns all pending private and public nullifiers. */
|
|
377
399
|
private getSiloedPendingNullifiers(ko: PublicKernelCircuitPublicInputs) {
|
|
378
|
-
return [...ko.end.
|
|
400
|
+
return [...ko.end.nullifiers, ...ko.endNonRevertibleData.nullifiers].filter(n => !n.isEmpty());
|
|
379
401
|
}
|
|
380
402
|
|
|
381
403
|
protected getAvailableGas(tx: Tx, previousPublicKernelOutput: PublicKernelCircuitPublicInputs) {
|
|
@@ -391,31 +413,46 @@ export abstract class AbstractPhaseManager {
|
|
|
391
413
|
|
|
392
414
|
private async runKernelCircuit(
|
|
393
415
|
previousOutput: PublicKernelCircuitPublicInputs,
|
|
416
|
+
previousCircuit: ProtocolArtifact,
|
|
394
417
|
callData: PublicCallData,
|
|
395
|
-
): Promise<[PublicKernelCircuitPrivateInputs, PublicKernelCircuitPublicInputs]> {
|
|
396
|
-
const previousKernel = this.getPreviousKernelData(previousOutput);
|
|
418
|
+
): Promise<[PublicKernelCircuitPrivateInputs, PublicKernelCircuitPublicInputs, ProtocolArtifact]> {
|
|
419
|
+
const previousKernel = this.getPreviousKernelData(previousOutput, previousCircuit);
|
|
397
420
|
|
|
398
421
|
// We take a deep copy (clone) of these inputs to be passed to the prover
|
|
399
422
|
const inputs = new PublicKernelCircuitPrivateInputs(previousKernel, callData);
|
|
400
423
|
switch (this.phase) {
|
|
401
424
|
case PublicKernelType.SETUP:
|
|
402
|
-
return [inputs.clone(), await this.publicKernel.publicKernelCircuitSetup(inputs)];
|
|
425
|
+
return [inputs.clone(), await this.publicKernel.publicKernelCircuitSetup(inputs), 'PublicKernelSetupArtifact'];
|
|
403
426
|
case PublicKernelType.APP_LOGIC:
|
|
404
|
-
return [
|
|
427
|
+
return [
|
|
428
|
+
inputs.clone(),
|
|
429
|
+
await this.publicKernel.publicKernelCircuitAppLogic(inputs),
|
|
430
|
+
'PublicKernelAppLogicArtifact',
|
|
431
|
+
];
|
|
405
432
|
case PublicKernelType.TEARDOWN:
|
|
406
|
-
return [
|
|
433
|
+
return [
|
|
434
|
+
inputs.clone(),
|
|
435
|
+
await this.publicKernel.publicKernelCircuitTeardown(inputs),
|
|
436
|
+
'PublicKernelTeardownArtifact',
|
|
437
|
+
];
|
|
407
438
|
default:
|
|
408
439
|
throw new Error(`No public kernel circuit for inputs`);
|
|
409
440
|
}
|
|
410
441
|
}
|
|
411
442
|
|
|
412
|
-
protected getPreviousKernelData(
|
|
413
|
-
|
|
414
|
-
|
|
443
|
+
protected getPreviousKernelData(
|
|
444
|
+
previousOutput: PublicKernelCircuitPublicInputs,
|
|
445
|
+
previousCircuit: ProtocolArtifact,
|
|
446
|
+
): PublicKernelData {
|
|
447
|
+
// The proof is not used in simulation
|
|
415
448
|
const proof = makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH);
|
|
416
|
-
|
|
417
|
-
const
|
|
418
|
-
|
|
449
|
+
|
|
450
|
+
const vk = ProtocolCircuitVks[previousCircuit];
|
|
451
|
+
const vkIndex = ProtocolCircuitVkIndexes[previousCircuit];
|
|
452
|
+
|
|
453
|
+
const leafIndex = getVKIndex(vk);
|
|
454
|
+
|
|
455
|
+
return new PublicKernelData(previousOutput, proof, vk, vkIndex, getVKSiblingPath(leafIndex));
|
|
419
456
|
}
|
|
420
457
|
|
|
421
458
|
protected async getPublicCallStackItem(result: PublicExecutionResult, isExecutionRequest = false) {
|
|
@@ -424,7 +461,7 @@ export abstract class AbstractPhaseManager {
|
|
|
424
461
|
|
|
425
462
|
const callStackPreimages = await this.getPublicCallStackPreimages(result);
|
|
426
463
|
const publicCallStackHashes = padArrayEnd(
|
|
427
|
-
callStackPreimages.map(c => c.hash()),
|
|
464
|
+
callStackPreimages.map(c => c.getCompressed().hash()),
|
|
428
465
|
Fr.ZERO,
|
|
429
466
|
MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,
|
|
430
467
|
);
|
|
@@ -433,9 +470,9 @@ export abstract class AbstractPhaseManager {
|
|
|
433
470
|
callContext: result.executionRequest.callContext,
|
|
434
471
|
proverAddress: AztecAddress.ZERO,
|
|
435
472
|
argsHash: computeVarArgsHash(result.executionRequest.args),
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
473
|
+
noteHashes: padArrayEnd(result.noteHashes, NoteHash.empty(), MAX_NOTE_HASHES_PER_CALL),
|
|
474
|
+
nullifiers: padArrayEnd(result.nullifiers, Nullifier.empty(), MAX_NULLIFIERS_PER_CALL),
|
|
475
|
+
l2ToL1Msgs: padArrayEnd(result.l2ToL1Messages, L2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_CALL),
|
|
439
476
|
startSideEffectCounter: result.startSideEffectCounter,
|
|
440
477
|
endSideEffectCounter: result.endSideEffectCounter,
|
|
441
478
|
returnsHash: computeVarArgsHash(result.returnValues),
|
|
@@ -506,15 +543,15 @@ export abstract class AbstractPhaseManager {
|
|
|
506
543
|
*/
|
|
507
544
|
static getMaxSideEffectCounter(inputs: PublicKernelCircuitPublicInputs): number {
|
|
508
545
|
const sideEffectCounters = [
|
|
509
|
-
...inputs.endNonRevertibleData.
|
|
510
|
-
...inputs.endNonRevertibleData.
|
|
546
|
+
...inputs.endNonRevertibleData.noteHashes,
|
|
547
|
+
...inputs.endNonRevertibleData.nullifiers,
|
|
511
548
|
...inputs.endNonRevertibleData.noteEncryptedLogsHashes,
|
|
512
549
|
...inputs.endNonRevertibleData.encryptedLogsHashes,
|
|
513
550
|
...inputs.endNonRevertibleData.unencryptedLogsHashes,
|
|
514
551
|
...inputs.endNonRevertibleData.publicCallStack,
|
|
515
552
|
...inputs.endNonRevertibleData.publicDataUpdateRequests,
|
|
516
|
-
...inputs.end.
|
|
517
|
-
...inputs.end.
|
|
553
|
+
...inputs.end.noteHashes,
|
|
554
|
+
...inputs.end.nullifiers,
|
|
518
555
|
...inputs.end.noteEncryptedLogsHashes,
|
|
519
556
|
...inputs.end.encryptedLogsHashes,
|
|
520
557
|
...inputs.end.unencryptedLogsHashes,
|