@aztec/simulator 3.0.0-nightly.20251218 → 3.0.0-nightly.20251220
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/public/fixtures/index.d.ts +2 -2
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +1 -1
- package/dest/public/fixtures/minimal_public_tx.d.ts +2 -7
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
- package/dest/public/fixtures/minimal_public_tx.js +0 -10
- package/dest/public/fixtures/opcode_spammer.d.ts +39 -2
- package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
- package/dest/public/fixtures/opcode_spammer.js +146 -4
- package/dest/public/fixtures/utils.d.ts +1 -1
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +3 -2
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +1 -1
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
- package/dest/public/fuzzing/avm_fuzzer_simulator.js +4 -1
- package/dest/public/fuzzing/avm_simulator_bin.js +1 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +1 -1
- package/package.json +16 -16
- package/src/public/fixtures/index.ts +1 -1
- package/src/public/fixtures/minimal_public_tx.ts +1 -10
- package/src/public/fixtures/opcode_spammer.ts +127 -5
- package/src/public/fixtures/utils.ts +1 -2
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +8 -1
- package/src/public/fuzzing/avm_simulator_bin.ts +1 -0
- package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './public_tx_simulation_tester.js';
|
|
2
2
|
export * from './utils.js';
|
|
3
3
|
export * from './simple_contract_data_source.js';
|
|
4
|
-
export {
|
|
4
|
+
export { executeAvmMinimalPublicTx } from './minimal_public_tx.js';
|
|
5
5
|
export { TestExecutorMetrics } from '../test_executor_metrics.js';
|
|
6
6
|
export { ammTest } from './amm_test.js';
|
|
7
7
|
export { bulkTest, megaBulkTest } from './bulk_test.js';
|
|
@@ -9,4 +9,4 @@ export { tokenTest } from './token_test.js';
|
|
|
9
9
|
export * from './custom_bytecode_tests.js';
|
|
10
10
|
export { deployCustomBytecode, executeCustomBytecode, deployAndExecuteCustomBytecode, } from './custom_bytecode_tester.js';
|
|
11
11
|
export { getSpamConfigsPerOpcode, testOpcodeSpamCase } from './opcode_spammer.js';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQiw4QkFBOEIsR0FDL0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './public_tx_simulation_tester.js';
|
|
2
2
|
export * from './utils.js';
|
|
3
3
|
export * from './simple_contract_data_source.js';
|
|
4
|
-
export {
|
|
4
|
+
export { executeAvmMinimalPublicTx } from './minimal_public_tx.js';
|
|
5
5
|
export { TestExecutorMetrics } from '../test_executor_metrics.js';
|
|
6
6
|
export { ammTest } from './amm_test.js';
|
|
7
7
|
export { bulkTest, megaBulkTest } from './bulk_test.js';
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { PublicTxResult } from '@aztec/stdlib/avm';
|
|
2
2
|
import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
|
|
3
3
|
export declare function executeAvmMinimalPublicTx(tester: PublicTxSimulationTester): Promise<PublicTxResult>;
|
|
4
|
-
|
|
5
|
-
* Reads the AVM circuit inputs for the minimal public tx from a pre-generated JSON file.
|
|
6
|
-
* @returns The AvmCircuitInputs for the minimal public tx.
|
|
7
|
-
*/
|
|
8
|
-
export declare function readAvmMinimalPublicTxInputsFromFile(): AvmCircuitInputs;
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hbF9wdWJsaWNfdHguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvbWluaW1hbF9wdWJsaWNfdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFTMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFNUUsd0JBQXNCLHlCQUF5QixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBZXpHO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLG9DQUFvQyxJQUFJLGdCQUFnQixDQUV2RSJ9
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hbF9wdWJsaWNfdHguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvbWluaW1hbF9wdWJsaWNfdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFReEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFNUUsd0JBQXNCLHlCQUF5QixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBZXpHIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimal_public_tx.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/minimal_public_tx.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"minimal_public_tx.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/minimal_public_tx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAezG"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import { AvmCircuitInputs } from '@aztec/stdlib/avm';
|
|
2
1
|
import { ProtocolContracts } from '@aztec/stdlib/tx';
|
|
3
|
-
import avmMinimalCircuitInputsJson from '../../../artifacts/avm_minimal_inputs.json' with {
|
|
4
|
-
type: 'json'
|
|
5
|
-
};
|
|
6
2
|
import { TypeTag } from '../avm/avm_memory_types.js';
|
|
7
3
|
import { Add, Return, Set } from '../avm/opcodes/index.js';
|
|
8
4
|
import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
|
|
@@ -21,9 +17,3 @@ export async function executeAvmMinimalPublicTx(tester) {
|
|
|
21
17
|
result.publicInputs.protocolContracts = ProtocolContracts.empty();
|
|
22
18
|
return result;
|
|
23
19
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Reads the AVM circuit inputs for the minimal public tx from a pre-generated JSON file.
|
|
26
|
-
* @returns The AvmCircuitInputs for the minimal public tx.
|
|
27
|
-
*/ export function readAvmMinimalPublicTxInputsFromFile() {
|
|
28
|
-
return AvmCircuitInputs.schema.parse(avmMinimalCircuitInputsJson);
|
|
29
|
-
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
1
2
|
import type { Bufferable } from '@aztec/foundation/serialize';
|
|
2
|
-
import type
|
|
3
|
+
import { type PublicTxResult } from '@aztec/stdlib/avm';
|
|
4
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
3
6
|
import { type MemoryValue } from '../avm/avm_memory_types.js';
|
|
4
7
|
import { Opcode } from '../avm/serialization/instruction_serialization.js';
|
|
5
8
|
import type { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
|
|
@@ -49,6 +52,40 @@ export interface SpamConfigsForOpcode {
|
|
|
49
52
|
/** All spam configs for this opcode (one or more) */
|
|
50
53
|
configs: SpamConfig[];
|
|
51
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Constants for "warm" tree reads - these values are inserted into the trees
|
|
57
|
+
* before running the spammer so that existence checks can find them.
|
|
58
|
+
*/
|
|
59
|
+
export declare const WARM_NOTE_HASH: Fr;
|
|
60
|
+
export declare const WARM_L1_TO_L2_MSG: Fr;
|
|
61
|
+
/** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */
|
|
62
|
+
export declare const WARM_NULLIFIER: Fr;
|
|
63
|
+
export declare const WARM_NULLIFIER_ADDRESS: AztecAddress;
|
|
64
|
+
/** Warm storage constants - storage is inserted for the deployed contract's address */
|
|
65
|
+
export declare const WARM_STORAGE_SLOT: Fr;
|
|
66
|
+
export declare const WARM_STORAGE_VALUE: Fr;
|
|
67
|
+
/**
|
|
68
|
+
* Leaf indices inserted to by insertWarmTreeEntries().
|
|
69
|
+
* Ideally we'd getTreeInfo and set dynamically, but that doesn't
|
|
70
|
+
* work easily with static spam configs, so we assume intial index 0.
|
|
71
|
+
*/
|
|
72
|
+
export declare const WARM_NOTE_HASH_LEAF_INDEX = 0n;
|
|
73
|
+
export declare const WARM_L1_TO_L2_MSG_LEAF_INDEX = 0n;
|
|
74
|
+
/**
|
|
75
|
+
* Insert entries into the trees so that "warm" configs can find them with existence checks.
|
|
76
|
+
* Call this before running the opcode spammer to enable warm tree reads.
|
|
77
|
+
*
|
|
78
|
+
* Inserts:
|
|
79
|
+
* - Note hash into NOTE_HASH_TREE
|
|
80
|
+
* - L1 to L2 message into L1_TO_L2_MESSAGE_TREE
|
|
81
|
+
* - Siloed nullifier into NULLIFIER_TREE (for NULLIFIEREXISTS warm check)
|
|
82
|
+
* - Storage value into PUBLIC_DATA_TREE (for SLOAD warm check)
|
|
83
|
+
*/
|
|
84
|
+
export declare function insertWarmTreeEntries(merkleTrees: MerkleTreeWriteOperations, contractAddress: AztecAddress): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* A SpamConfig for to make external CALLs to an address specified in calldata[0].
|
|
87
|
+
*/
|
|
88
|
+
export declare const EXTERNAL_CALL_CONFIG: SpamConfig;
|
|
52
89
|
/**
|
|
53
90
|
* Opcode spammer configs for ~all opcodes.
|
|
54
91
|
* Each opcode maps to an array of configs (usually one, but can be multiple for type variants, etc.)
|
|
@@ -83,4 +120,4 @@ export declare function createOpcodeSpamBytecode(config: SpamConfig): Buffer;
|
|
|
83
120
|
export declare function createSideEffectSpamBytecode(config: SpamConfig): Buffer;
|
|
84
121
|
export declare function testOpcodeSpamCase(tester: PublicTxSimulationTester, config: SpamConfig, expectToBeTrue?: (x: boolean) => void): Promise<PublicTxResult>;
|
|
85
122
|
export {};
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Bjb2RlX3NwYW1tZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvb3Bjb2RlX3NwYW1tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0tBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQTJDLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLakYsT0FBTyxFQUFTLEtBQUssV0FBVyxFQUFnRCxNQUFNLDRCQUE0QixDQUFDO0FBa0RuSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFFM0UsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU1qRjs7R0FFRztBQUNILFVBQVUsUUFBUTtJQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsS0FBSyxFQUFFLFdBQVcsQ0FBQztDQUNwQjtBQUVEOzs7R0FHRztBQUNILEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQztBQUVqRDs7R0FFRztBQUNILE1BQU0sV0FBVyxVQUFVO0lBQ3pCLGlDQUFpQztJQUNqQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFFbkIsc0RBQXNEO0lBQ3RELGtCQUFrQixFQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7SUFFdkMsMkRBQTJEO0lBQzNELG1CQUFtQixDQUFDLEVBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRWYsc0VBQXNFO0lBQ3RFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVmLDBEQUEwRDtJQUMxRCxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUM3QjtBQUVEOzs7R0FHRztBQUNILE1BQU0sV0FBVyxvQkFBb0I7SUFDbkMsa0NBQWtDO0lBQ2xDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFZixxREFBcUQ7SUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ3ZCO0FBTUQ7OztHQUdHO0FBQ0gsZUFBTyxNQUFNLGNBQWMsSUFBc0IsQ0FBQztBQUNsRCxlQUFPLE1BQU0saUJBQWlCLElBQThCLENBQUM7QUFFN0QsdUdBQXVHO0FBQ3ZHLGVBQU8sTUFBTSxjQUFjLElBQTBCLENBQUM7QUFDdEQsZUFBTyxNQUFNLHNCQUFzQixjQUFrQyxDQUFDO0FBRXRFLHVGQUF1RjtBQUN2RixlQUFPLE1BQU0saUJBQWlCLElBQTBCLENBQUM7QUFDekQsZUFBTyxNQUFNLGtCQUFrQixJQUEwQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0seUJBQXlCLEtBQUssQ0FBQztBQUM1QyxlQUFPLE1BQU0sNEJBQTRCLEtBQUssQ0FBQztBQUUvQzs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBc0IscUJBQXFCLENBQ3pDLFdBQVcsRUFBRSx5QkFBeUIsRUFDdEMsZUFBZSxFQUFFLFlBQVksR0FDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWVmO0FBbUdEOztHQUVHO0FBQ0gsZUFBTyxNQUFNLG9CQUFvQixFQUFFLFVBMEJsQyxDQUFDO0FBa0NGOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBcTNCOUQsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQWdCLHVCQUF1QixDQUFDLG1CQUFtQixHQUFFLE1BQWlCLEdBQUcsb0JBQW9CLEVBQUUsQ0FzQnRHO0FBNEZEOzs7R0FHRztBQUNILHdCQUFnQix3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FlbkU7QUFFRDs7Ozs7O0dBTUc7QUFDSCx3QkFBZ0IsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxNQUFNLENBbUJ2RTtBQTRERCx3QkFBc0Isa0JBQWtCLENBQ3RDLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsTUFBTSxFQUFFLFVBQVUsRUFDbEIsY0FBYyxHQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxJQUFlLEdBQzlDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FLekIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opcode_spammer.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/opcode_spammer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"opcode_spammer.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/opcode_spammer.ts"],"names":[],"mappings":"AAkKA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAKjF,OAAO,EAAS,KAAK,WAAW,EAAgD,MAAM,4BAA4B,CAAC;AAkDnH,OAAO,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAC;AAE3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAMjF;;GAEG;AACH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IAEnB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,UAAU,EAAE,CAAC;IAEvC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,UAAU,EAAE,CAAC;IAEzC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,IAAsB,CAAC;AAClD,eAAO,MAAM,iBAAiB,IAA8B,CAAC;AAE7D,uGAAuG;AACvG,eAAO,MAAM,cAAc,IAA0B,CAAC;AACtD,eAAO,MAAM,sBAAsB,cAAkC,CAAC;AAEtE,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,IAA0B,CAAC;AACzD,eAAO,MAAM,kBAAkB,IAA0B,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,yBAAyB,EACtC,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAef;AAmGD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UA0BlC,CAAC;AAkCF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAq3B9D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,mBAAmB,GAAE,MAAiB,GAAG,oBAAoB,EAAE,CAsBtG;AA4FD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAenE;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBvE;AA4DD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,UAAU,EAClB,cAAc,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAe,GAC9C,OAAO,CAAC,cAAc,CAAC,CAKzB"}
|
|
@@ -151,8 +151,12 @@
|
|
|
151
151
|
import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
|
|
152
152
|
import { randomBigInt } from '@aztec/foundation/crypto/random';
|
|
153
153
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
154
|
+
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
155
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
156
|
+
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
|
|
157
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
154
158
|
import assert from 'assert';
|
|
155
|
-
import { Field, TaggedMemory, TypeTag, Uint1, Uint32 } from '../avm/avm_memory_types.js';
|
|
159
|
+
import { Field, TaggedMemory, TypeTag, Uint1, Uint32, Uint64 } from '../avm/avm_memory_types.js';
|
|
156
160
|
import { Add, And, Call, CalldataCopy, Cast, DebugLog, Div, EcAdd, EmitNoteHash, EmitNullifier, EmitUnencryptedLog, Eq, FieldDiv, GetContractInstance, GetEnvVar, InternalCall, InternalReturn, Jump, JumpI, KeccakF1600, L1ToL2MessageExists, Lt, Lte, Mov, Mul, Not, NoteHashExists, NullifierExists, Or, Poseidon2, Return, ReturndataCopy, ReturndataSize, Revert, SLoad, SStore, SendL2ToL1Message, Set, Sha256Compression, Shl, Shr, StaticCall, Sub, SuccessCopy, ToRadixBE, Xor } from '../avm/opcodes/index.js';
|
|
157
161
|
import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
|
|
158
162
|
import { Opcode } from '../avm/serialization/instruction_serialization.js';
|
|
@@ -160,6 +164,51 @@ import { deployCustomBytecode, executeCustomBytecode } from './custom_bytecode_t
|
|
|
160
164
|
// ============================================================================
|
|
161
165
|
// Constants
|
|
162
166
|
// ============================================================================
|
|
167
|
+
/**
|
|
168
|
+
* Constants for "warm" tree reads - these values are inserted into the trees
|
|
169
|
+
* before running the spammer so that existence checks can find them.
|
|
170
|
+
*/ export const WARM_NOTE_HASH = new Fr(0xdeadbeefn);
|
|
171
|
+
export const WARM_L1_TO_L2_MSG = new Fr(0xcafebabedeadbeefn);
|
|
172
|
+
/** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */ export const WARM_NULLIFIER = new Fr(0xdeadbeef0001n);
|
|
173
|
+
export const WARM_NULLIFIER_ADDRESS = AztecAddress.fromNumber(0xbeef);
|
|
174
|
+
/** Warm storage constants - storage is inserted for the deployed contract's address */ export const WARM_STORAGE_SLOT = new Fr(0xdeadbeef0002n);
|
|
175
|
+
export const WARM_STORAGE_VALUE = new Fr(0xcafebabe0003n);
|
|
176
|
+
/**
|
|
177
|
+
* Leaf indices inserted to by insertWarmTreeEntries().
|
|
178
|
+
* Ideally we'd getTreeInfo and set dynamically, but that doesn't
|
|
179
|
+
* work easily with static spam configs, so we assume intial index 0.
|
|
180
|
+
*/ export const WARM_NOTE_HASH_LEAF_INDEX = 0n;
|
|
181
|
+
export const WARM_L1_TO_L2_MSG_LEAF_INDEX = 0n;
|
|
182
|
+
/**
|
|
183
|
+
* Insert entries into the trees so that "warm" configs can find them with existence checks.
|
|
184
|
+
* Call this before running the opcode spammer to enable warm tree reads.
|
|
185
|
+
*
|
|
186
|
+
* Inserts:
|
|
187
|
+
* - Note hash into NOTE_HASH_TREE
|
|
188
|
+
* - L1 to L2 message into L1_TO_L2_MESSAGE_TREE
|
|
189
|
+
* - Siloed nullifier into NULLIFIER_TREE (for NULLIFIEREXISTS warm check)
|
|
190
|
+
* - Storage value into PUBLIC_DATA_TREE (for SLOAD warm check)
|
|
191
|
+
*/ export async function insertWarmTreeEntries(merkleTrees, contractAddress) {
|
|
192
|
+
// Insert into note hash tree
|
|
193
|
+
await merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [
|
|
194
|
+
WARM_NOTE_HASH
|
|
195
|
+
]);
|
|
196
|
+
// Insert into L1 to L2 message tree
|
|
197
|
+
await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [
|
|
198
|
+
WARM_L1_TO_L2_MSG
|
|
199
|
+
]);
|
|
200
|
+
// Insert siloed nullifier into nullifier tree
|
|
201
|
+
const siloedNullifier = await siloNullifier(WARM_NULLIFIER_ADDRESS, WARM_NULLIFIER);
|
|
202
|
+
await merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [
|
|
203
|
+
siloedNullifier.toBuffer()
|
|
204
|
+
]);
|
|
205
|
+
// Insert storage value into public data tree
|
|
206
|
+
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, WARM_STORAGE_SLOT);
|
|
207
|
+
const publicDataWrite = new PublicDataWrite(leafSlot, WARM_STORAGE_VALUE);
|
|
208
|
+
await merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
|
|
209
|
+
publicDataWrite.toBuffer()
|
|
210
|
+
]);
|
|
211
|
+
}
|
|
163
212
|
/**
|
|
164
213
|
* Maximum bytecode size in bytes.
|
|
165
214
|
*
|
|
@@ -251,7 +300,7 @@ const CALL_ARGS_SIZE_OFFSET = CONST_1_OFFSET; // argsSize = 1 (forward calldata[
|
|
|
251
300
|
const MAX_U32 = 0xffffffffn;
|
|
252
301
|
/**
|
|
253
302
|
* A SpamConfig for to make external CALLs to an address specified in calldata[0].
|
|
254
|
-
*/ const EXTERNAL_CALL_CONFIG = {
|
|
303
|
+
*/ export const EXTERNAL_CALL_CONFIG = {
|
|
255
304
|
setup: [
|
|
256
305
|
// calldata will contain 1 item: the external call address
|
|
257
306
|
{
|
|
@@ -855,7 +904,20 @@ const STATIC_CALL_CONFIG = {
|
|
|
855
904
|
]
|
|
856
905
|
},
|
|
857
906
|
{
|
|
858
|
-
label: 'Warm read (
|
|
907
|
+
label: 'Warm read (from tree)',
|
|
908
|
+
// Uses pre-inserted storage from insertWarmTreeEntries() which is called after contract deployment
|
|
909
|
+
setup: [
|
|
910
|
+
{
|
|
911
|
+
offset: 0,
|
|
912
|
+
value: new Field(WARM_STORAGE_SLOT)
|
|
913
|
+
}
|
|
914
|
+
],
|
|
915
|
+
targetInstructions: ()=>[
|
|
916
|
+
new SLoad(/*indirect=*/ 0, /*slotOffset=*/ 0, /*dstOffset=*/ 1)
|
|
917
|
+
]
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
label: 'Warm read (SSTORE first, unique slot per SLOAD)',
|
|
859
921
|
// Memory layout: slot (incremented), value, constant 1, revertSize, loaded value
|
|
860
922
|
setup: [
|
|
861
923
|
{
|
|
@@ -888,6 +950,7 @@ const STATIC_CALL_CONFIG = {
|
|
|
888
950
|
],
|
|
889
951
|
[Opcode.NOTEHASHEXISTS]: [
|
|
890
952
|
{
|
|
953
|
+
label: 'Cold (non-existent)',
|
|
891
954
|
// Note: Can't easily do "write first" version - would need to know the leaf index
|
|
892
955
|
// that EMITNOTEHASH will produce, which depends on tree state
|
|
893
956
|
setup: [
|
|
@@ -903,6 +966,23 @@ const STATIC_CALL_CONFIG = {
|
|
|
903
966
|
targetInstructions: ()=>[
|
|
904
967
|
new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2)
|
|
905
968
|
]
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
label: 'Warm (exists in tree)',
|
|
972
|
+
// Uses pre-inserted note hash from insertWarmTreeEntries()
|
|
973
|
+
setup: [
|
|
974
|
+
{
|
|
975
|
+
offset: 0,
|
|
976
|
+
value: new Field(WARM_NOTE_HASH)
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
offset: 1,
|
|
980
|
+
value: new Uint64(WARM_NOTE_HASH_LEAF_INDEX)
|
|
981
|
+
}
|
|
982
|
+
],
|
|
983
|
+
targetInstructions: ()=>[
|
|
984
|
+
new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2)
|
|
985
|
+
]
|
|
906
986
|
}
|
|
907
987
|
],
|
|
908
988
|
[Opcode.NULLIFIEREXISTS]: [
|
|
@@ -923,7 +1003,24 @@ const STATIC_CALL_CONFIG = {
|
|
|
923
1003
|
]
|
|
924
1004
|
},
|
|
925
1005
|
{
|
|
926
|
-
label: 'Existing nullifier (
|
|
1006
|
+
label: 'Existing nullifier (warm - from tree)',
|
|
1007
|
+
// Uses pre-inserted nullifier from insertWarmTreeEntries()
|
|
1008
|
+
setup: [
|
|
1009
|
+
{
|
|
1010
|
+
offset: 0,
|
|
1011
|
+
value: new Field(WARM_NULLIFIER)
|
|
1012
|
+
},
|
|
1013
|
+
{
|
|
1014
|
+
offset: 1,
|
|
1015
|
+
value: new Field(WARM_NULLIFIER_ADDRESS.toField())
|
|
1016
|
+
}
|
|
1017
|
+
],
|
|
1018
|
+
targetInstructions: ()=>[
|
|
1019
|
+
new NullifierExists(/*indirect=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 1, /*existsOffset=*/ 2)
|
|
1020
|
+
]
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
label: 'Existing nullifier (warm - EMITNULLIFIER first)',
|
|
927
1024
|
// Memory layout: nullifier (incremented), constant 1, current address (from GETENVVAR), revertSize, exists result
|
|
928
1025
|
setup: [
|
|
929
1026
|
{
|
|
@@ -956,6 +1053,7 @@ const STATIC_CALL_CONFIG = {
|
|
|
956
1053
|
],
|
|
957
1054
|
[Opcode.L1TOL2MSGEXISTS]: [
|
|
958
1055
|
{
|
|
1056
|
+
label: 'Cold (non-existent)',
|
|
959
1057
|
setup: [
|
|
960
1058
|
{
|
|
961
1059
|
offset: 0,
|
|
@@ -969,6 +1067,23 @@ const STATIC_CALL_CONFIG = {
|
|
|
969
1067
|
targetInstructions: ()=>[
|
|
970
1068
|
new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2)
|
|
971
1069
|
]
|
|
1070
|
+
},
|
|
1071
|
+
{
|
|
1072
|
+
label: 'Warm (exists in tree)',
|
|
1073
|
+
// Uses pre-inserted L1 to L2 message from insertWarmTreeEntries()
|
|
1074
|
+
setup: [
|
|
1075
|
+
{
|
|
1076
|
+
offset: 0,
|
|
1077
|
+
value: new Field(WARM_L1_TO_L2_MSG)
|
|
1078
|
+
},
|
|
1079
|
+
{
|
|
1080
|
+
offset: 1,
|
|
1081
|
+
value: new Uint64(WARM_L1_TO_L2_MSG_LEAF_INDEX)
|
|
1082
|
+
}
|
|
1083
|
+
],
|
|
1084
|
+
targetInstructions: ()=>[
|
|
1085
|
+
new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2)
|
|
1086
|
+
]
|
|
972
1087
|
}
|
|
973
1088
|
],
|
|
974
1089
|
[Opcode.GETCONTRACTINSTANCE]: [
|
|
@@ -1303,6 +1418,32 @@ const STATIC_CALL_CONFIG = {
|
|
|
1303
1418
|
targetInstructions: ()=>[
|
|
1304
1419
|
new ToRadixBE(/*indirect=*/ 0, /*srcOffset=*/ 0, /*radixOffset=*/ 1, /*numLimbsOffset=*/ 2, /*outputBitsOffset=*/ 3, /*dstOffset=*/ 4)
|
|
1305
1420
|
]
|
|
1421
|
+
},
|
|
1422
|
+
{
|
|
1423
|
+
label: 'Radix 3 (slow divmod path)',
|
|
1424
|
+
// Radix 3 bypasses the fast path for power-of-2 radixes (4, 8, 16, 32, 64, 128, 256)
|
|
1425
|
+
// and uses the slow divmod implementation instead
|
|
1426
|
+
setup: [
|
|
1427
|
+
{
|
|
1428
|
+
offset: 0,
|
|
1429
|
+
value: new Field(Fr.random())
|
|
1430
|
+
},
|
|
1431
|
+
{
|
|
1432
|
+
offset: 1,
|
|
1433
|
+
value: new Uint32(3n)
|
|
1434
|
+
},
|
|
1435
|
+
{
|
|
1436
|
+
offset: 2,
|
|
1437
|
+
value: new Uint32(161n)
|
|
1438
|
+
},
|
|
1439
|
+
{
|
|
1440
|
+
offset: 3,
|
|
1441
|
+
value: new Uint1(0n)
|
|
1442
|
+
}
|
|
1443
|
+
],
|
|
1444
|
+
targetInstructions: ()=>[
|
|
1445
|
+
new ToRadixBE(/*indirect=*/ 0, /*srcOffset=*/ 0, /*radixOffset=*/ 1, /*numLimbsOffset=*/ 2, /*outputBitsOffset=*/ 3, /*dstOffset=*/ 4)
|
|
1446
|
+
]
|
|
1306
1447
|
}
|
|
1307
1448
|
],
|
|
1308
1449
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -1479,6 +1620,7 @@ const STATIC_CALL_CONFIG = {
|
|
|
1479
1620
|
async function testStandardOpcodeSpam(tester, config, expectToBeTrue) {
|
|
1480
1621
|
const bytecode = createOpcodeSpamBytecode(config);
|
|
1481
1622
|
const contract = await deployCustomBytecode(bytecode, tester, config.label);
|
|
1623
|
+
await insertWarmTreeEntries(tester.merkleTrees, contract.address);
|
|
1482
1624
|
// Should we pass the contract address as calldata?
|
|
1483
1625
|
const calldata = config.addressAsCalldata ? [
|
|
1484
1626
|
contract.address.toField()
|
|
@@ -23,4 +23,4 @@ export declare function createTxForPublicCalls(privateInsertions: TestPrivateIns
|
|
|
23
23
|
export declare function createTxForPrivateOnly(feePayer?: AztecAddress, gasUsedByPrivate?: Gas): Promise<Tx>;
|
|
24
24
|
export declare function addNewContractClassToTx(tx: Tx, contractClass: ContractClassPublic, skipNullifierInsertion?: boolean): Promise<void>;
|
|
25
25
|
export declare function addNewContractInstanceToTx(tx: Tx, contractInstance: ContractInstanceWithAddress, skipNullifierInsertion?: boolean): Promise<void>;
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxHQUFHLEVBQXdCLE1BQU0sbUJBQW1CLENBQUM7QUFVOUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFPLEVBRUwsZUFBZSxFQUVmLDZCQUE2QixFQUM3QixFQUFFLEVBR0gsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixNQUFNLE1BQU0scUJBQXFCLEdBQUc7SUFDbEMsVUFBVSxDQUFDLEVBQUU7UUFDWCxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0tBQ3BDLENBQUM7SUFDRixhQUFhLENBQUMsRUFBRTtRQUNkLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUM7S0FDcEMsQ0FBQztDQUNILENBQUM7QUFFRjs7R0FFRztBQUNILHdCQUFzQixzQkFBc0IsQ0FDMUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQ3hDLGlCQUFpQixFQUFFLDZCQUE2QixFQUFFLEVBQ2xELGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxFQUNoRCxtQkFBbUIsQ0FBQyxFQUFFLDZCQUE2QixFQUNuRCxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQWlCLEVBQ25DLE9BQU8sR0FBRSxlQUF5QyxHQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLENBOEZiO0FBRUQsd0JBQXNCLHNCQUFzQixDQUMxQyxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQXFCLEdBQ3RDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0EwQmI7QUFFRCx3QkFBc0IsdUJBQXVCLENBQzNDLEVBQUUsRUFBRSxFQUFFLEVBQ04sYUFBYSxFQUFFLG1CQUFtQixFQUNsQyxzQkFBc0IsVUFBUSxpQkE2Qi9CO0FBRUQsd0JBQXNCLDBCQUEwQixDQUM5QyxFQUFFLEVBQUUsRUFBRSxFQUNOLGdCQUFnQixFQUFFLDJCQUEyQixFQUM3QyxzQkFBc0IsVUFBUSxpQkEwQy9CIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/utils.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,GAAG,EAAwB,MAAM,mBAAmB,CAAC;AAU9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAEL,eAAe,EAEf,6BAA6B,EAC7B,EAAE,EAGH,MAAM,kBAAkB,CAAC;AAI1B,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,qBAAqB,EACxC,iBAAiB,EAAE,6BAA6B,EAAE,EAClD,eAAe,EAAE,6BAA6B,EAAE,EAChD,mBAAmB,CAAC,EAAE,6BAA6B,EACnD,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAiB,EACnC,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/utils.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,GAAG,EAAwB,MAAM,mBAAmB,CAAC;AAU9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAEL,eAAe,EAEf,6BAA6B,EAC7B,EAAE,EAGH,MAAM,kBAAkB,CAAC;AAI1B,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,qBAAqB,EACxC,iBAAiB,EAAE,6BAA6B,EAAE,EAClD,eAAe,EAAE,6BAA6B,EAAE,EAChD,mBAAmB,CAAC,EAAE,6BAA6B,EACnD,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAiB,EACnC,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,EAAE,CAAC,CA8Fb;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAqB,GACtC,OAAO,CAAC,EAAE,CAAC,CA0Bb;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,mBAAmB,EAClC,sBAAsB,UAAQ,iBA6B/B;AAED,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,gBAAgB,EAAE,2BAA2B,EAC7C,sBAAsB,UAAQ,iBA0C/B"}
|
|
@@ -72,8 +72,9 @@ import { strict as assert } from 'assert';
|
|
|
72
72
|
const teardownGasLimits = teardownCallRequest ? new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT) : Gas.empty();
|
|
73
73
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
|
|
74
74
|
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
75
|
-
const header = BlockHeader.empty(
|
|
76
|
-
|
|
75
|
+
const header = BlockHeader.empty({
|
|
76
|
+
globalVariables: globals
|
|
77
|
+
});
|
|
77
78
|
const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
|
|
78
79
|
const includeByTimestamp = 0n; // Not used in the simulator.
|
|
79
80
|
const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ gasUsedByPrivate, feePayer, includeByTimestamp, forPublic);
|
|
@@ -43,4 +43,4 @@ export declare class AvmFuzzerSimulator extends BaseAvmSimulationTester {
|
|
|
43
43
|
*/
|
|
44
44
|
addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void>;
|
|
45
45
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX2Z1enplcl9zaW11bGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZnV6emluZy9hdm1fZnV6emVyX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFZbkUsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRSxPQUFPLEVBQWUsZUFBZSxFQUF1RCxNQUFNLGtCQUFrQixDQUFDO0FBQ3JILE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJdEY7OztHQUdHO0FBQ0gscUJBQWEsdUJBQXVCO2FBRWhCLFNBQVMsRUFBRSxNQUFNO2FBQ2pCLFdBQVcsRUFBRSxNQUFNO2FBQ25CLEVBQUUsRUFBRSxTQUFTO2FBQ2IsT0FBTyxFQUFFLGVBQWU7YUFDeEIsZUFBZSxFQUFFLEdBQUcsRUFBRTthQUN0QixpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtJQU5qRCxZQUNrQixTQUFTLEVBQUUsTUFBTSxFQUNqQixXQUFXLEVBQUUsTUFBTSxFQUNuQixFQUFFLEVBQUUsU0FBUyxFQUNiLE9BQU8sRUFBRSxlQUFlLEVBQ3hCLGVBQWUsRUFBRSxHQUFHLEVBQUUsRUFDdEIsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDN0M7SUFFSixNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsdUJBQXVCLENBWXhEO0NBQ0Y7QUFtSEQ7OztHQUdHO0FBQ0gscUJBQWEsa0JBQW1CLFNBQVEsdUJBQXVCO0lBQzdELE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBRXJDLFlBQ0UsV0FBVyxFQUFFLHlCQUF5QixFQUN0QyxrQkFBa0IsRUFBRSx3QkFBd0IsRUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFXekI7SUFFRDs7T0FFRztJQUNILE9BQW9CLE1BQU0sQ0FDeEIsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQzFDLE9BQU8sRUFBRSxlQUFlLEdBQ3ZCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUk3QjtJQUVEOztPQUVHO0lBQ1UsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQVVoRTtJQUVEOztPQUVHO0lBQ1UsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBR2pFO0lBRUQ7OztPQUdHO0lBQ1UsMEJBQTBCLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJeEY7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avm_fuzzer_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/fuzzing/avm_fuzzer_simulator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAe,eAAe,EAAuD,MAAM,kBAAkB,CAAC;AACrH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAItF;;;GAGG;AACH,qBAAa,uBAAuB;aAEhB,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;aACnB,EAAE,EAAE,SAAS;aACb,OAAO,EAAE,eAAe;aACxB,eAAe,EAAE,GAAG,EAAE;aACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IANjD,YACkB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,GAAG,EAAE,EACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC7C;IAEJ,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,uBAAuB,CAYxD;CACF;AAmHD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,uBAAuB;IAC7D,OAAO,CAAC,SAAS,CAAoB;IAErC,YACE,WAAW,EAAE,yBAAyB,EACtC,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,eAAe,EAWzB;IAED;;OAEG;IACH,OAAoB,MAAM,CACxB,iBAAiB,EAAE,uBAAuB,EAC1C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;IAED;;OAEG;IACU,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"avm_fuzzer_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/fuzzing/avm_fuzzer_simulator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAe,eAAe,EAAuD,MAAM,kBAAkB,CAAC;AACrH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAItF;;;GAGG;AACH,qBAAa,uBAAuB;aAEhB,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;aACnB,EAAE,EAAE,SAAS;aACb,OAAO,EAAE,eAAe;aACxB,eAAe,EAAE,GAAG,EAAE;aACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IANjD,YACkB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,GAAG,EAAE,EACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC7C;IAEJ,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,uBAAuB,CAYxD;CACF;AAmHD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,uBAAuB;IAC7D,OAAO,CAAC,SAAS,CAAoB;IAErC,YACE,WAAW,EAAE,yBAAyB,EACtC,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,eAAe,EAWzB;IAED;;OAEG;IACH,OAAoB,MAAM,CACxB,iBAAiB,EAAE,uBAAuB,EAC1C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;IAED;;OAEG;IACU,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAUhE;IAED;;OAEG;IACU,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;IAED;;;OAGG;IACU,0BAA0B,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxF;CACF"}
|
|
@@ -99,7 +99,7 @@ import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js
|
|
|
99
99
|
super(contractDataSource, merkleTrees);
|
|
100
100
|
const contractsDb = new PublicContractsDB(contractDataSource);
|
|
101
101
|
this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
|
|
102
|
-
skipFeeEnforcement:
|
|
102
|
+
skipFeeEnforcement: false,
|
|
103
103
|
collectDebugLogs: false,
|
|
104
104
|
collectHints: false,
|
|
105
105
|
collectStatistics: false,
|
|
@@ -116,6 +116,9 @@ import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js
|
|
|
116
116
|
/**
|
|
117
117
|
* Simulate a transaction from a C++ AvmTxHint.
|
|
118
118
|
*/ async simulate(txHint) {
|
|
119
|
+
// Compute fee from gas limits and max fees per gas (upper bound on fee)
|
|
120
|
+
const totalFee = BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas + BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
|
|
121
|
+
await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
|
|
119
122
|
const tx = await createTxFromHint(txHint);
|
|
120
123
|
return await this.simulator.simulate(tx);
|
|
121
124
|
}
|
|
@@ -15,7 +15,7 @@ import { PublicTxSimulator } from './public_tx_simulator.js';
|
|
|
15
15
|
log;
|
|
16
16
|
constructor(merkleTree, contractsDB, globalVariables, config){
|
|
17
17
|
super(merkleTree, contractsDB, globalVariables, config);
|
|
18
|
-
this.log = createLogger(`simulator:
|
|
18
|
+
this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Simulate a transaction's public portion using the C++ avvm simulator.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.20251220",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./server": "./dest/server.js",
|
|
@@ -64,26 +64,26 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/constants": "3.0.0-nightly.
|
|
68
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
69
|
-
"@aztec/native": "3.0.0-nightly.
|
|
70
|
-
"@aztec/noir-acvm_js": "3.0.0-nightly.
|
|
71
|
-
"@aztec/noir-noirc_abi": "3.0.0-nightly.
|
|
72
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.
|
|
73
|
-
"@aztec/noir-types": "3.0.0-nightly.
|
|
74
|
-
"@aztec/protocol-contracts": "3.0.0-nightly.
|
|
75
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
76
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
77
|
-
"@aztec/world-state": "3.0.0-nightly.
|
|
67
|
+
"@aztec/constants": "3.0.0-nightly.20251220",
|
|
68
|
+
"@aztec/foundation": "3.0.0-nightly.20251220",
|
|
69
|
+
"@aztec/native": "3.0.0-nightly.20251220",
|
|
70
|
+
"@aztec/noir-acvm_js": "3.0.0-nightly.20251220",
|
|
71
|
+
"@aztec/noir-noirc_abi": "3.0.0-nightly.20251220",
|
|
72
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251220",
|
|
73
|
+
"@aztec/noir-types": "3.0.0-nightly.20251220",
|
|
74
|
+
"@aztec/protocol-contracts": "3.0.0-nightly.20251220",
|
|
75
|
+
"@aztec/stdlib": "3.0.0-nightly.20251220",
|
|
76
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251220",
|
|
77
|
+
"@aztec/world-state": "3.0.0-nightly.20251220",
|
|
78
78
|
"lodash.clonedeep": "^4.5.0",
|
|
79
79
|
"lodash.merge": "^4.6.2",
|
|
80
80
|
"tslib": "^2.4.0"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
|
-
"@aztec/kv-store": "3.0.0-nightly.
|
|
84
|
-
"@aztec/merkle-tree": "3.0.0-nightly.
|
|
85
|
-
"@aztec/noir-contracts.js": "3.0.0-nightly.
|
|
86
|
-
"@aztec/noir-test-contracts.js": "3.0.0-nightly.
|
|
83
|
+
"@aztec/kv-store": "3.0.0-nightly.20251220",
|
|
84
|
+
"@aztec/merkle-tree": "3.0.0-nightly.20251220",
|
|
85
|
+
"@aztec/noir-contracts.js": "3.0.0-nightly.20251220",
|
|
86
|
+
"@aztec/noir-test-contracts.js": "3.0.0-nightly.20251220",
|
|
87
87
|
"@jest/globals": "^30.0.0",
|
|
88
88
|
"@types/jest": "^30.0.0",
|
|
89
89
|
"@types/lodash.clonedeep": "^4.5.7",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './public_tx_simulation_tester.js';
|
|
2
2
|
export * from './utils.js';
|
|
3
3
|
export * from './simple_contract_data_source.js';
|
|
4
|
-
export {
|
|
4
|
+
export { executeAvmMinimalPublicTx } from './minimal_public_tx.js';
|
|
5
5
|
export { TestExecutorMetrics } from '../test_executor_metrics.js';
|
|
6
6
|
export { ammTest } from './amm_test.js';
|
|
7
7
|
export { bulkTest, megaBulkTest } from './bulk_test.js';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { PublicTxResult } from '@aztec/stdlib/avm';
|
|
2
2
|
import { ProtocolContracts } from '@aztec/stdlib/tx';
|
|
3
3
|
|
|
4
|
-
import avmMinimalCircuitInputsJson from '../../../artifacts/avm_minimal_inputs.json' with { type: 'json' };
|
|
5
4
|
import { TypeTag } from '../avm/avm_memory_types.js';
|
|
6
5
|
import { Add, Return, Set } from '../avm/opcodes/index.js';
|
|
7
6
|
import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
|
|
@@ -25,11 +24,3 @@ export async function executeAvmMinimalPublicTx(tester: PublicTxSimulationTester
|
|
|
25
24
|
|
|
26
25
|
return result;
|
|
27
26
|
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Reads the AVM circuit inputs for the minimal public tx from a pre-generated JSON file.
|
|
31
|
-
* @returns The AvmCircuitInputs for the minimal public tx.
|
|
32
|
-
*/
|
|
33
|
-
export function readAvmMinimalPublicTxInputsFromFile(): AvmCircuitInputs {
|
|
34
|
-
return AvmCircuitInputs.schema.parse(avmMinimalCircuitInputsJson);
|
|
35
|
-
}
|
|
@@ -162,11 +162,15 @@ import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
|
|
|
162
162
|
import { randomBigInt } from '@aztec/foundation/crypto/random';
|
|
163
163
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
164
164
|
import type { Bufferable } from '@aztec/foundation/serialize';
|
|
165
|
-
import type
|
|
165
|
+
import { type CallStackMetadata, PublicDataWrite, type PublicTxResult } from '@aztec/stdlib/avm';
|
|
166
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
167
|
+
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
|
|
168
|
+
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
169
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
166
170
|
|
|
167
171
|
import assert from 'assert';
|
|
168
172
|
|
|
169
|
-
import { Field, type MemoryValue, TaggedMemory, TypeTag, Uint1, Uint32 } from '../avm/avm_memory_types.js';
|
|
173
|
+
import { Field, type MemoryValue, TaggedMemory, TypeTag, Uint1, Uint32, Uint64 } from '../avm/avm_memory_types.js';
|
|
170
174
|
import {
|
|
171
175
|
Add,
|
|
172
176
|
And,
|
|
@@ -284,6 +288,59 @@ export interface SpamConfigsForOpcode {
|
|
|
284
288
|
// Constants
|
|
285
289
|
// ============================================================================
|
|
286
290
|
|
|
291
|
+
/**
|
|
292
|
+
* Constants for "warm" tree reads - these values are inserted into the trees
|
|
293
|
+
* before running the spammer so that existence checks can find them.
|
|
294
|
+
*/
|
|
295
|
+
export const WARM_NOTE_HASH = new Fr(0xdeadbeefn);
|
|
296
|
+
export const WARM_L1_TO_L2_MSG = new Fr(0xcafebabedeadbeefn);
|
|
297
|
+
|
|
298
|
+
/** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */
|
|
299
|
+
export const WARM_NULLIFIER = new Fr(0xdeadbeef0001n);
|
|
300
|
+
export const WARM_NULLIFIER_ADDRESS = AztecAddress.fromNumber(0xbeef);
|
|
301
|
+
|
|
302
|
+
/** Warm storage constants - storage is inserted for the deployed contract's address */
|
|
303
|
+
export const WARM_STORAGE_SLOT = new Fr(0xdeadbeef0002n);
|
|
304
|
+
export const WARM_STORAGE_VALUE = new Fr(0xcafebabe0003n);
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Leaf indices inserted to by insertWarmTreeEntries().
|
|
308
|
+
* Ideally we'd getTreeInfo and set dynamically, but that doesn't
|
|
309
|
+
* work easily with static spam configs, so we assume intial index 0.
|
|
310
|
+
*/
|
|
311
|
+
export const WARM_NOTE_HASH_LEAF_INDEX = 0n;
|
|
312
|
+
export const WARM_L1_TO_L2_MSG_LEAF_INDEX = 0n;
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Insert entries into the trees so that "warm" configs can find them with existence checks.
|
|
316
|
+
* Call this before running the opcode spammer to enable warm tree reads.
|
|
317
|
+
*
|
|
318
|
+
* Inserts:
|
|
319
|
+
* - Note hash into NOTE_HASH_TREE
|
|
320
|
+
* - L1 to L2 message into L1_TO_L2_MESSAGE_TREE
|
|
321
|
+
* - Siloed nullifier into NULLIFIER_TREE (for NULLIFIEREXISTS warm check)
|
|
322
|
+
* - Storage value into PUBLIC_DATA_TREE (for SLOAD warm check)
|
|
323
|
+
*/
|
|
324
|
+
export async function insertWarmTreeEntries(
|
|
325
|
+
merkleTrees: MerkleTreeWriteOperations,
|
|
326
|
+
contractAddress: AztecAddress,
|
|
327
|
+
): Promise<void> {
|
|
328
|
+
// Insert into note hash tree
|
|
329
|
+
await merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [WARM_NOTE_HASH]);
|
|
330
|
+
|
|
331
|
+
// Insert into L1 to L2 message tree
|
|
332
|
+
await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [WARM_L1_TO_L2_MSG]);
|
|
333
|
+
|
|
334
|
+
// Insert siloed nullifier into nullifier tree
|
|
335
|
+
const siloedNullifier = await siloNullifier(WARM_NULLIFIER_ADDRESS, WARM_NULLIFIER);
|
|
336
|
+
await merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [siloedNullifier.toBuffer()]);
|
|
337
|
+
|
|
338
|
+
// Insert storage value into public data tree
|
|
339
|
+
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, WARM_STORAGE_SLOT);
|
|
340
|
+
const publicDataWrite = new PublicDataWrite(leafSlot, WARM_STORAGE_VALUE);
|
|
341
|
+
await merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [publicDataWrite.toBuffer()]);
|
|
342
|
+
}
|
|
343
|
+
|
|
287
344
|
/**
|
|
288
345
|
* Maximum bytecode size in bytes.
|
|
289
346
|
*
|
|
@@ -384,7 +441,7 @@ const MAX_U32 = 0xffffffffn;
|
|
|
384
441
|
/**
|
|
385
442
|
* A SpamConfig for to make external CALLs to an address specified in calldata[0].
|
|
386
443
|
*/
|
|
387
|
-
const EXTERNAL_CALL_CONFIG: SpamConfig = {
|
|
444
|
+
export const EXTERNAL_CALL_CONFIG: SpamConfig = {
|
|
388
445
|
setup: [
|
|
389
446
|
// calldata will contain 1 item: the external call address
|
|
390
447
|
{ offset: CONST_0_OFFSET, value: new Uint32(0) }, // used for cdStartOffset
|
|
@@ -883,7 +940,13 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
883
940
|
targetInstructions: () => [new SLoad(/*indirect=*/ 0, /*slotOffset=*/ 0, /*dstOffset=*/ 1)],
|
|
884
941
|
},
|
|
885
942
|
{
|
|
886
|
-
label: 'Warm read (
|
|
943
|
+
label: 'Warm read (from tree)',
|
|
944
|
+
// Uses pre-inserted storage from insertWarmTreeEntries() which is called after contract deployment
|
|
945
|
+
setup: [{ offset: 0, value: new Field(WARM_STORAGE_SLOT) }], // pre-inserted slot
|
|
946
|
+
targetInstructions: () => [new SLoad(/*indirect=*/ 0, /*slotOffset=*/ 0, /*dstOffset=*/ 1)],
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
label: 'Warm read (SSTORE first, unique slot per SLOAD)',
|
|
887
950
|
// Memory layout: slot (incremented), value, constant 1, revertSize, loaded value
|
|
888
951
|
setup: [
|
|
889
952
|
{ offset: 0, value: new Field(Fr.random()) }, // slot (will be incremented)
|
|
@@ -905,6 +968,7 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
905
968
|
|
|
906
969
|
[Opcode.NOTEHASHEXISTS]: [
|
|
907
970
|
{
|
|
971
|
+
label: 'Cold (non-existent)',
|
|
908
972
|
// Note: Can't easily do "write first" version - would need to know the leaf index
|
|
909
973
|
// that EMITNOTEHASH will produce, which depends on tree state
|
|
910
974
|
setup: [
|
|
@@ -915,6 +979,17 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
915
979
|
new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2),
|
|
916
980
|
],
|
|
917
981
|
},
|
|
982
|
+
{
|
|
983
|
+
label: 'Warm (exists in tree)',
|
|
984
|
+
// Uses pre-inserted note hash from insertWarmTreeEntries()
|
|
985
|
+
setup: [
|
|
986
|
+
{ offset: 0, value: new Field(WARM_NOTE_HASH) }, // pre-inserted noteHash
|
|
987
|
+
{ offset: 1, value: new Uint64(WARM_NOTE_HASH_LEAF_INDEX) }, // known leafIndex
|
|
988
|
+
],
|
|
989
|
+
targetInstructions: () => [
|
|
990
|
+
new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2),
|
|
991
|
+
],
|
|
992
|
+
},
|
|
918
993
|
],
|
|
919
994
|
|
|
920
995
|
[Opcode.NULLIFIEREXISTS]: [
|
|
@@ -929,7 +1004,18 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
929
1004
|
],
|
|
930
1005
|
},
|
|
931
1006
|
{
|
|
932
|
-
label: 'Existing nullifier (
|
|
1007
|
+
label: 'Existing nullifier (warm - from tree)',
|
|
1008
|
+
// Uses pre-inserted nullifier from insertWarmTreeEntries()
|
|
1009
|
+
setup: [
|
|
1010
|
+
{ offset: 0, value: new Field(WARM_NULLIFIER) }, // pre-inserted nullifier
|
|
1011
|
+
{ offset: 1, value: new Field(WARM_NULLIFIER_ADDRESS.toField()) }, // address it was siloed with
|
|
1012
|
+
],
|
|
1013
|
+
targetInstructions: () => [
|
|
1014
|
+
new NullifierExists(/*indirect=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 1, /*existsOffset=*/ 2),
|
|
1015
|
+
],
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
label: 'Existing nullifier (warm - EMITNULLIFIER first)',
|
|
933
1019
|
// Memory layout: nullifier (incremented), constant 1, current address (from GETENVVAR), revertSize, exists result
|
|
934
1020
|
setup: [
|
|
935
1021
|
{ offset: 0, value: new Field(Fr.random()) }, // nullifier (will be incremented)
|
|
@@ -957,6 +1043,7 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
957
1043
|
|
|
958
1044
|
[Opcode.L1TOL2MSGEXISTS]: [
|
|
959
1045
|
{
|
|
1046
|
+
label: 'Cold (non-existent)',
|
|
960
1047
|
setup: [
|
|
961
1048
|
{ offset: 0, value: new Field(Fr.random()) }, // random msgHash
|
|
962
1049
|
{ offset: 1, value: randomWithTag(TypeTag.UINT64) }, // random msgLeafIndex
|
|
@@ -965,6 +1052,17 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
965
1052
|
new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2),
|
|
966
1053
|
],
|
|
967
1054
|
},
|
|
1055
|
+
{
|
|
1056
|
+
label: 'Warm (exists in tree)',
|
|
1057
|
+
// Uses pre-inserted L1 to L2 message from insertWarmTreeEntries()
|
|
1058
|
+
setup: [
|
|
1059
|
+
{ offset: 0, value: new Field(WARM_L1_TO_L2_MSG) }, // pre-inserted msgHash
|
|
1060
|
+
{ offset: 1, value: new Uint64(WARM_L1_TO_L2_MSG_LEAF_INDEX) }, // known msgLeafIndex
|
|
1061
|
+
],
|
|
1062
|
+
targetInstructions: () => [
|
|
1063
|
+
new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2),
|
|
1064
|
+
],
|
|
1065
|
+
},
|
|
968
1066
|
],
|
|
969
1067
|
|
|
970
1068
|
[Opcode.GETCONTRACTINSTANCE]: [
|
|
@@ -1222,6 +1320,27 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
|
|
|
1222
1320
|
),
|
|
1223
1321
|
],
|
|
1224
1322
|
},
|
|
1323
|
+
{
|
|
1324
|
+
label: 'Radix 3 (slow divmod path)',
|
|
1325
|
+
// Radix 3 bypasses the fast path for power-of-2 radixes (4, 8, 16, 32, 64, 128, 256)
|
|
1326
|
+
// and uses the slow divmod implementation instead
|
|
1327
|
+
setup: [
|
|
1328
|
+
{ offset: 0, value: new Field(Fr.random()) }, // random field value
|
|
1329
|
+
{ offset: 1, value: new Uint32(3n) }, // radix = 3 (non-power-of-2)
|
|
1330
|
+
{ offset: 2, value: new Uint32(161n) }, // numLimbs = 161 (ceil(256 / log2(3)) ≈ 161 limbs to represent 256 bits)
|
|
1331
|
+
{ offset: 3, value: new Uint1(0n) }, // outputBits = false
|
|
1332
|
+
],
|
|
1333
|
+
targetInstructions: () => [
|
|
1334
|
+
new ToRadixBE(
|
|
1335
|
+
/*indirect=*/ 0,
|
|
1336
|
+
/*srcOffset=*/ 0,
|
|
1337
|
+
/*radixOffset=*/ 1,
|
|
1338
|
+
/*numLimbsOffset=*/ 2,
|
|
1339
|
+
/*outputBitsOffset=*/ 3,
|
|
1340
|
+
/*dstOffset=*/ 4,
|
|
1341
|
+
),
|
|
1342
|
+
],
|
|
1343
|
+
},
|
|
1225
1344
|
],
|
|
1226
1345
|
|
|
1227
1346
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -1456,6 +1575,9 @@ async function testStandardOpcodeSpam(
|
|
|
1456
1575
|
): Promise<PublicTxResult> {
|
|
1457
1576
|
const bytecode = createOpcodeSpamBytecode(config);
|
|
1458
1577
|
const contract = await deployCustomBytecode(bytecode, tester, config.label);
|
|
1578
|
+
|
|
1579
|
+
await insertWarmTreeEntries(tester.merkleTrees, contract.address);
|
|
1580
|
+
|
|
1459
1581
|
// Should we pass the contract address as calldata?
|
|
1460
1582
|
const calldata = config.addressAsCalldata ? [contract.address.toField()] : [];
|
|
1461
1583
|
const result = await executeCustomBytecode(contract, tester, config.label, calldata);
|
|
@@ -132,8 +132,7 @@ export async function createTxForPublicCalls(
|
|
|
132
132
|
: Gas.empty();
|
|
133
133
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
|
|
134
134
|
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
135
|
-
const header = BlockHeader.empty();
|
|
136
|
-
header.globalVariables = globals;
|
|
135
|
+
const header = BlockHeader.empty({ globalVariables: globals });
|
|
137
136
|
const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
|
|
138
137
|
const includeByTimestamp = 0n; // Not used in the simulator.
|
|
139
138
|
|
|
@@ -185,7 +185,7 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
|
|
|
185
185
|
super(contractDataSource, merkleTrees);
|
|
186
186
|
const contractsDb = new PublicContractsDB(contractDataSource);
|
|
187
187
|
this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
|
|
188
|
-
skipFeeEnforcement:
|
|
188
|
+
skipFeeEnforcement: false,
|
|
189
189
|
collectDebugLogs: false,
|
|
190
190
|
collectHints: false,
|
|
191
191
|
collectStatistics: false,
|
|
@@ -209,6 +209,13 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
|
|
|
209
209
|
* Simulate a transaction from a C++ AvmTxHint.
|
|
210
210
|
*/
|
|
211
211
|
public async simulate(txHint: AvmTxHint): Promise<PublicTxResult> {
|
|
212
|
+
// Compute fee from gas limits and max fees per gas (upper bound on fee)
|
|
213
|
+
const totalFee =
|
|
214
|
+
BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas +
|
|
215
|
+
BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
|
|
216
|
+
|
|
217
|
+
await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
|
|
218
|
+
|
|
212
219
|
const tx = await createTxFromHint(txHint);
|
|
213
220
|
return await this.simulator.simulate(tx);
|
|
214
221
|
}
|
|
@@ -98,6 +98,7 @@ async function execute(base64Line: string): Promise<void> {
|
|
|
98
98
|
});
|
|
99
99
|
writeSync(process.stdout.fd, resultBuffer.toString('base64') + '\n');
|
|
100
100
|
} catch (error: any) {
|
|
101
|
+
// If we error, treat as reverted
|
|
101
102
|
const errorResult = serializeWithMessagePack({
|
|
102
103
|
reverted: true,
|
|
103
104
|
output: [] as string[],
|
|
@@ -39,7 +39,7 @@ export class CppVsTsPublicTxSimulator extends PublicTxSimulator implements Publi
|
|
|
39
39
|
config?: Partial<PublicSimulatorConfig>,
|
|
40
40
|
) {
|
|
41
41
|
super(merkleTree, contractsDB, globalVariables, config);
|
|
42
|
-
this.log = createLogger(`simulator:
|
|
42
|
+
this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|