@aztec/simulator 0.87.7 → 1.0.0-nightly.20250605
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/avm/avm_gas.d.ts +4 -5
- package/dest/public/avm/avm_gas.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +29 -19
- package/dest/public/avm/fixtures/utils.js +1 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +8 -7
- package/dest/public/avm/opcodes/addressing_mode.d.ts +2 -0
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +6 -0
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +1 -1
- package/dest/public/avm/opcodes/bitwise.d.ts +5 -1
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +17 -2
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/public/avm/opcodes/comparators.js +1 -1
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +1 -1
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.js +4 -4
- package/dest/public/avm/opcodes/conversion.d.ts +1 -0
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +263 -2
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +1 -1
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +1 -1
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +6 -8
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +3 -3
- package/dest/public/avm/opcodes/instruction.d.ts +9 -3
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction.js +12 -7
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +8 -6
- package/dest/public/avm/opcodes/misc.js +1 -3
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/opcodes/storage.js +5 -3
- package/dest/public/fixtures/index.d.ts +1 -0
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +1 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
- package/dest/public/fixtures/minimal_public_tx.js +43 -0
- package/dest/public/fixtures/utils.js +3 -3
- package/dest/public/hinting_db_sources.d.ts +3 -0
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +9 -0
- package/dest/public/index.d.ts +2 -1
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +2 -1
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +2 -2
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +44 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
- package/dest/public/public_processor/guarded_merkle_tree.js +105 -0
- package/dest/public/public_processor/public_processor.d.ts +6 -16
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +32 -16
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +3 -1
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +18 -15
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +0 -3
- package/dest/public/side_effect_trace.d.ts +4 -1
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +13 -2
- package/dest/public/side_effect_trace_interface.d.ts +1 -0
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.d.ts +1 -0
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +3 -0
- package/package.json +15 -15
- package/src/public/avm/avm_gas.ts +21 -15
- package/src/public/avm/fixtures/utils.ts +1 -1
- package/src/public/avm/opcodes/accrued_substate.ts +23 -7
- package/src/public/avm/opcodes/addressing_mode.ts +8 -0
- package/src/public/avm/opcodes/arithmetic.ts +3 -1
- package/src/public/avm/opcodes/bitwise.ts +26 -2
- package/src/public/avm/opcodes/comparators.ts +3 -1
- package/src/public/avm/opcodes/contract.ts +3 -1
- package/src/public/avm/opcodes/control_flow.ts +6 -4
- package/src/public/avm/opcodes/conversion.ts +21 -2
- package/src/public/avm/opcodes/ec_add.ts +3 -1
- package/src/public/avm/opcodes/environment_getters.ts +3 -1
- package/src/public/avm/opcodes/external_calls.ts +16 -8
- package/src/public/avm/opcodes/hashing.ts +11 -3
- package/src/public/avm/opcodes/instruction.ts +14 -7
- package/src/public/avm/opcodes/memory.ts +23 -6
- package/src/public/avm/opcodes/misc.ts +4 -4
- package/src/public/avm/opcodes/storage.ts +13 -3
- package/src/public/fixtures/index.ts +1 -0
- package/src/public/fixtures/minimal_public_tx.ts +57 -0
- package/src/public/fixtures/utils.ts +3 -3
- package/src/public/hinting_db_sources.ts +15 -0
- package/src/public/index.ts +2 -1
- package/src/public/public_db_sources.ts +3 -13
- package/src/public/public_processor/guarded_merkle_tree.ts +148 -0
- package/src/public/public_processor/public_processor.ts +47 -34
- package/src/public/public_tx_simulator/public_tx_context.ts +39 -20
- package/src/public/public_tx_simulator/public_tx_simulator.ts +0 -3
- package/src/public/side_effect_trace.ts +13 -0
- package/src/public/side_effect_trace_interface.ts +1 -0
- package/src/public/state_manager/state_manager.ts +4 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { MAX_ENQUEUED_CALLS_PER_TX,
|
|
1
|
+
import { MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX } from '@aztec/constants';
|
|
2
2
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
3
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
-
import { AvmAccumulatedData, AvmCircuitPublicInputs, PublicDataWrite, RevertCode } from '@aztec/stdlib/avm';
|
|
6
|
-
import { computeTransactionFee } from '@aztec/stdlib/fees';
|
|
5
|
+
import { AvmAccumulatedData, AvmAccumulatedDataArrayLengths, AvmCircuitPublicInputs, PublicDataWrite, RevertCode, clampGasSettingsForAVM } from '@aztec/stdlib/avm';
|
|
6
|
+
import { computeEffectiveGasFees, computeTransactionFee } from '@aztec/stdlib/fees';
|
|
7
7
|
import { Gas } from '@aztec/stdlib/gas';
|
|
8
|
-
import { PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, countAccumulatedItems } from '@aztec/stdlib/kernel';
|
|
8
|
+
import { PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, PublicCallRequestArrayLengths, countAccumulatedItems } from '@aztec/stdlib/kernel';
|
|
9
9
|
import { PublicLog } from '@aztec/stdlib/logs';
|
|
10
10
|
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
11
11
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
@@ -23,8 +23,10 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
|
|
|
23
23
|
startTreeSnapshots;
|
|
24
24
|
globalVariables;
|
|
25
25
|
gasSettings;
|
|
26
|
+
clampedGasSettings;
|
|
26
27
|
gasUsedByPrivate;
|
|
27
28
|
gasAllocatedToPublic;
|
|
29
|
+
gasAllocatedToPublicTeardown;
|
|
28
30
|
setupCallRequests;
|
|
29
31
|
appLogicCallRequests;
|
|
30
32
|
teardownCallRequests;
|
|
@@ -38,14 +40,16 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
|
|
|
38
40
|
/* Entire transaction execution is done. */ halted;
|
|
39
41
|
/* Where did reverts happen (if at all)? */ revertCode;
|
|
40
42
|
/* What caused a revert (if one occurred)? */ revertReason;
|
|
41
|
-
constructor(txHash, state, startTreeSnapshots, globalVariables, gasSettings, gasUsedByPrivate, gasAllocatedToPublic, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, feePayer, trace){
|
|
43
|
+
constructor(txHash, state, startTreeSnapshots, globalVariables, gasSettings, clampedGasSettings, gasUsedByPrivate, gasAllocatedToPublic, gasAllocatedToPublicTeardown, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, feePayer, trace){
|
|
42
44
|
this.txHash = txHash;
|
|
43
45
|
this.state = state;
|
|
44
46
|
this.startTreeSnapshots = startTreeSnapshots;
|
|
45
47
|
this.globalVariables = globalVariables;
|
|
46
48
|
this.gasSettings = gasSettings;
|
|
49
|
+
this.clampedGasSettings = clampedGasSettings;
|
|
47
50
|
this.gasUsedByPrivate = gasUsedByPrivate;
|
|
48
51
|
this.gasAllocatedToPublic = gasAllocatedToPublic;
|
|
52
|
+
this.gasAllocatedToPublicTeardown = gasAllocatedToPublicTeardown;
|
|
49
53
|
this.setupCallRequests = setupCallRequests;
|
|
50
54
|
this.appLogicCallRequests = appLogicCallRequests;
|
|
51
55
|
this.teardownCallRequests = teardownCallRequests;
|
|
@@ -68,8 +72,10 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
|
|
|
68
72
|
const gasSettings = tx.data.constants.txContext.gasSettings;
|
|
69
73
|
const gasUsedByPrivate = tx.data.gasUsed;
|
|
70
74
|
// Gas allocated to public is "whatever's left" after private, but with some max applied.
|
|
71
|
-
const
|
|
72
|
-
|
|
75
|
+
const clampedGasSettings = clampGasSettingsForAVM(gasSettings, gasUsedByPrivate);
|
|
76
|
+
const gasAllocatedToPublic = clampedGasSettings.gasLimits.sub(gasUsedByPrivate);
|
|
77
|
+
const gasAllocatedToPublicTeardown = clampedGasSettings.teardownGasLimits;
|
|
78
|
+
return new PublicTxContext(await tx.getTxHash(), new PhaseStateManager(txStateManager), await txStateManager.getTreeSnapshots(), globalVariables, gasSettings, clampedGasSettings, gasUsedByPrivate, gasAllocatedToPublic, gasAllocatedToPublicTeardown, getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.SETUP), getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.APP_LOGIC), getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.TEARDOWN), tx.data.forPublic.nonRevertibleAccumulatedData, tx.data.forPublic.revertibleAccumulatedData, tx.data.feePayer, trace);
|
|
73
79
|
}
|
|
74
80
|
/**
|
|
75
81
|
* Signal that the entire transaction execution is done.
|
|
@@ -144,7 +150,8 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
|
|
|
144
150
|
* How much gas is left as of the specified phase?
|
|
145
151
|
*/ getGasLeftAtPhase(phase) {
|
|
146
152
|
if (phase === TxExecutionPhase.TEARDOWN) {
|
|
147
|
-
|
|
153
|
+
const gasLeftForPublicTeardown = this.gasAllocatedToPublicTeardown.sub(this.teardownGasUsed);
|
|
154
|
+
return gasLeftForPublicTeardown;
|
|
148
155
|
} else {
|
|
149
156
|
const gasLeftForPublic = this.gasAllocatedToPublic.sub(this.gasUsedByPublic);
|
|
150
157
|
return gasLeftForPublic;
|
|
@@ -241,8 +248,9 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
|
|
|
241
248
|
const endTreeSnapshots = await stateManager.getTreeSnapshots();
|
|
242
249
|
// This converts the private accumulated data to the avm accumulated data format.
|
|
243
250
|
const convertAccumulatedData = (from)=>new PrivateToAvmAccumulatedData(from.noteHashes, from.nullifiers, from.l2ToL1Msgs);
|
|
244
|
-
const
|
|
245
|
-
|
|
251
|
+
const getPreviousAccumulatedDataArrayLengths = (from)=>new PrivateToAvmAccumulatedDataArrayLengths(countAccumulatedItems(from.noteHashes), countAccumulatedItems(from.nullifiers), countAccumulatedItems(from.l2ToL1Msgs));
|
|
252
|
+
const getAvmAccumulatedDataArrayLengths = (from)=>new AvmAccumulatedDataArrayLengths(from.noteHashes.length, from.nullifiers.length, from.l2ToL1Msgs.length, from.publicLogs.length, from.publicDataWrites.length);
|
|
253
|
+
return new AvmCircuitPublicInputs(this.globalVariables, this.startTreeSnapshots, /*startGasUsed=*/ this.gasUsedByPrivate, this.clampedGasSettings, computeEffectiveGasFees(this.globalVariables.gasFees, this.gasSettings), this.feePayer, /*publicCallRequestArrayLengths=*/ new PublicCallRequestArrayLengths(this.setupCallRequests.length, this.appLogicCallRequests.length, this.teardownCallRequests.length > 0), /*publicSetupCallRequests=*/ padArrayEnd(this.setupCallRequests.map((r)=>r.request), PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), /*publicAppLogicCallRequests=*/ padArrayEnd(this.appLogicCallRequests.map((r)=>r.request), PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), /*publicTeardownCallRequests=*/ this.teardownCallRequests.length > 0 ? this.teardownCallRequests[0].request : PublicCallRequest.empty(), getPreviousAccumulatedDataArrayLengths(this.nonRevertibleAccumulatedDataFromPrivate), getPreviousAccumulatedDataArrayLengths(this.revertibleAccumulatedDataFromPrivate), convertAccumulatedData(this.nonRevertibleAccumulatedDataFromPrivate), convertAccumulatedData(this.revertibleAccumulatedDataFromPrivate), endTreeSnapshots, this.getTotalGasUsed(), getAvmAccumulatedDataArrayLengths(accumulatedData), accumulatedData, /*transactionFee=*/ this.getTransactionFeeUnsafe(), /*isReverted=*/ !this.revertCode.isOK());
|
|
246
254
|
}
|
|
247
255
|
}
|
|
248
256
|
/**
|
|
@@ -288,8 +296,3 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
|
|
|
288
296
|
this.currentlyActiveStateManager = undefined;
|
|
289
297
|
}
|
|
290
298
|
}
|
|
291
|
-
/**
|
|
292
|
-
* Apply L2 gas maximum.
|
|
293
|
-
*/ function applyMaxToAvailableGas(availableGas) {
|
|
294
|
-
return new Gas(/*daGas=*/ availableGas.daGas, /*l2Gas=*/ Math.min(availableGas.l2Gas, MAX_L2_GAS_PER_TX_PUBLIC_PORTION));
|
|
295
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public_tx_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/public_tx_simulator/public_tx_simulator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAIL,KAAK,iBAAiB,EAEtB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EACL,KAAK,eAAe,EACpB,yBAAyB,EACzB,6BAA6B,EAC7B,EAAE,EACF,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAIjF,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,yBAAyB,EAAE,CAAC;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC,CAAC;AAEF,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,yBAAyB;IARnC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGZ,UAAU,EAAE,yBAAyB,EACrC,WAAW,EAAE,iBAAiB,EAC9B,eAAe,EAAE,eAAe,EAChC,kBAAkB,GAAE,OAAe,EACnC,kBAAkB,GAAE,OAAe,EACnC,yBAAyB,GAAE,OAAe;IAKpD;;;;OAIG;IACU,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"public_tx_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/public_tx_simulator/public_tx_simulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,9 +70,6 @@ export class PublicTxSimulator {
|
|
|
70
70
|
const publicInputs = await context.generateAvmCircuitPublicInputs();
|
|
71
71
|
const avmProvingRequest = PublicTxSimulator.generateProvingRequest(publicInputs, hints);
|
|
72
72
|
const revertCode = context.getFinalRevertCode();
|
|
73
|
-
if (!revertCode.isOK()) {
|
|
74
|
-
await tx.filterRevertedLogs();
|
|
75
|
-
}
|
|
76
73
|
// Commit contracts from this TX to the block-level cache and clear tx cache
|
|
77
74
|
// If the tx reverted, only commit non-revertible contracts
|
|
78
75
|
// NOTE: You can't create contracts in public, so this is only relevant for private-created contracts
|
|
@@ -40,6 +40,7 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
40
40
|
private readonly previousSideEffectArrayLengths;
|
|
41
41
|
/** We need to track the set of class IDs used, to enforce limits. */
|
|
42
42
|
private uniqueClassIds;
|
|
43
|
+
private writtenPublicDataSlots;
|
|
43
44
|
log: import("@aztec/foundation/log").Logger;
|
|
44
45
|
/** The side effect counter increments with every call to the trace. */
|
|
45
46
|
private sideEffectCounter;
|
|
@@ -60,13 +61,15 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
60
61
|
*/
|
|
61
62
|
previousSideEffectArrayLengths?: SideEffectArrayLengths,
|
|
62
63
|
/** We need to track the set of class IDs used, to enforce limits. */
|
|
63
|
-
uniqueClassIds?: UniqueClassIds);
|
|
64
|
+
uniqueClassIds?: UniqueClassIds, writtenPublicDataSlots?: Set<string>);
|
|
64
65
|
fork(): SideEffectTrace;
|
|
65
66
|
merge(forkedTrace: this, reverted?: boolean): void;
|
|
66
67
|
getCounter(): number;
|
|
67
68
|
private incrementSideEffectCounter;
|
|
68
69
|
getNoteHashCount(): number;
|
|
69
70
|
tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite: boolean): Promise<void>;
|
|
71
|
+
private computePublicDataSlotKey;
|
|
72
|
+
isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
|
|
70
73
|
traceNewNoteHash(noteHash: Fr): void;
|
|
71
74
|
traceNewNullifier(siloedNullifier: Fr): void;
|
|
72
75
|
traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAiB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAK7E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;IAII;AACJ,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AAEF,qBAAa,sBAAsB;aAEf,gBAAgB,EAAE,MAAM;aACxB,wBAAwB,EAAE,MAAM;aAChC,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;gBALlB,gBAAgB,EAAE,MAAM,EACxB,wBAAwB,EAAE,MAAM,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM;IAGpC,MAAM,CAAC,KAAK;CAGb;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,8BAA8B;IAkBlE,qDAAqD;aACrC,sBAAsB,EAAE,MAAM;IAC9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,8BAA8B;IAC/C,qEAAqE;IACrE,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ export class SideEffectArrayLengths {
|
|
|
36
36
|
startSideEffectCounter;
|
|
37
37
|
previousSideEffectArrayLengths;
|
|
38
38
|
uniqueClassIds;
|
|
39
|
+
writtenPublicDataSlots;
|
|
39
40
|
log;
|
|
40
41
|
/** The side effect counter increments with every call to the trace. */ sideEffectCounter;
|
|
41
42
|
publicDataWrites;
|
|
@@ -48,10 +49,11 @@ export class SideEffectArrayLengths {
|
|
|
48
49
|
/** Make sure a forked trace is never merged twice. */ alreadyMergedIntoParent;
|
|
49
50
|
constructor(/** The counter of this trace's first side effect. */ startSideEffectCounter = 0, /** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
|
|
50
51
|
* otherwise the public kernel can fail to prove because TX limits are breached.
|
|
51
|
-
*/ previousSideEffectArrayLengths = SideEffectArrayLengths.empty(), /** We need to track the set of class IDs used, to enforce limits. */ uniqueClassIds = new UniqueClassIds()){
|
|
52
|
+
*/ previousSideEffectArrayLengths = SideEffectArrayLengths.empty(), /** We need to track the set of class IDs used, to enforce limits. */ uniqueClassIds = new UniqueClassIds(), writtenPublicDataSlots = new Set()){
|
|
52
53
|
this.startSideEffectCounter = startSideEffectCounter;
|
|
53
54
|
this.previousSideEffectArrayLengths = previousSideEffectArrayLengths;
|
|
54
55
|
this.uniqueClassIds = uniqueClassIds;
|
|
56
|
+
this.writtenPublicDataSlots = writtenPublicDataSlots;
|
|
55
57
|
this.log = createLogger('simulator:side_effect_trace');
|
|
56
58
|
this.publicDataWrites = [];
|
|
57
59
|
this.protocolPublicDataWritesLength = 0;
|
|
@@ -64,7 +66,7 @@ export class SideEffectArrayLengths {
|
|
|
64
66
|
this.sideEffectCounter = startSideEffectCounter;
|
|
65
67
|
}
|
|
66
68
|
fork() {
|
|
67
|
-
return new SideEffectTrace(this.sideEffectCounter, new SideEffectArrayLengths(this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength, this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength, this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length, this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length, this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length, this.previousSideEffectArrayLengths.publicLogs + this.publicLogs.length), this.uniqueClassIds.fork());
|
|
69
|
+
return new SideEffectTrace(this.sideEffectCounter, new SideEffectArrayLengths(this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength, this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength, this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length, this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length, this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length, this.previousSideEffectArrayLengths.publicLogs + this.publicLogs.length), this.uniqueClassIds.fork(), new Set(this.writtenPublicDataSlots));
|
|
68
70
|
}
|
|
69
71
|
merge(forkedTrace, reverted = false) {
|
|
70
72
|
// sanity check to avoid merging the same forked trace twice
|
|
@@ -72,6 +74,8 @@ export class SideEffectArrayLengths {
|
|
|
72
74
|
forkedTrace.alreadyMergedIntoParent = true;
|
|
73
75
|
this.sideEffectCounter = forkedTrace.sideEffectCounter;
|
|
74
76
|
this.uniqueClassIds.acceptAndMerge(forkedTrace.uniqueClassIds);
|
|
77
|
+
// Accept even if reverted, since the user already paid for the writes
|
|
78
|
+
this.writtenPublicDataSlots = new Set(forkedTrace.writtenPublicDataSlots);
|
|
75
79
|
if (!reverted) {
|
|
76
80
|
this.publicDataWrites.push(...forkedTrace.publicDataWrites);
|
|
77
81
|
this.noteHashes.push(...forkedTrace.noteHashes);
|
|
@@ -105,6 +109,13 @@ export class SideEffectArrayLengths {
|
|
|
105
109
|
this.publicDataWrites.push(new PublicDataUpdateRequest(leafSlot, value, this.sideEffectCounter));
|
|
106
110
|
this.log.trace(`Traced public data write (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter}, isProtocol:${protocolWrite})`);
|
|
107
111
|
this.incrementSideEffectCounter();
|
|
112
|
+
this.writtenPublicDataSlots.add(this.computePublicDataSlotKey(contractAddress, slot));
|
|
113
|
+
}
|
|
114
|
+
computePublicDataSlotKey(contractAddress, slot) {
|
|
115
|
+
return `${contractAddress.toString()}:${slot.toString()}`;
|
|
116
|
+
}
|
|
117
|
+
isStorageCold(contractAddress, slot) {
|
|
118
|
+
return !this.writtenPublicDataSlots.has(this.computePublicDataSlotKey(contractAddress, slot));
|
|
108
119
|
}
|
|
109
120
|
traceNewNoteHash(noteHash) {
|
|
110
121
|
if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) {
|
|
@@ -6,6 +6,7 @@ export interface PublicSideEffectTraceInterface {
|
|
|
6
6
|
getCounter(): number;
|
|
7
7
|
tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, // This is the storage slot not the computed leaf slot
|
|
8
8
|
value: Fr, protocolWrite: boolean): Promise<void>;
|
|
9
|
+
isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
|
|
9
10
|
traceNewNoteHash(uniqueNoteHash: Fr): void;
|
|
10
11
|
getNoteHashCount(): number;
|
|
11
12
|
traceNewNullifier(siloedNullifier: Fr): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side_effect_trace_interface.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace_interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,8BAA8B;IAC7C,IAAI,IAAI,8BAA8B,CAAC;IACvC,KAAK,CAAC,WAAW,EAAE,8BAA8B,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7E,UAAU,IAAI,MAAM,CAAC;IAErB,uBAAuB,CACrB,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EAAE,sDAAsD;IAChE,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,gBAAgB,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC;IAC3C,gBAAgB,IAAI,MAAM,CAAC;IAC3B,iBAAiB,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,CAAC;IAC7C,qBAAqB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACvF,cAAc,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAC/D,qBAAqB,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACnE"}
|
|
1
|
+
{"version":3,"file":"side_effect_trace_interface.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace_interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,8BAA8B;IAC7C,IAAI,IAAI,8BAA8B,CAAC;IACvC,KAAK,CAAC,WAAW,EAAE,8BAA8B,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7E,UAAU,IAAI,MAAM,CAAC;IAErB,uBAAuB,CACrB,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EAAE,sDAAsD;IAChE,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC;IAChE,gBAAgB,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC;IAC3C,gBAAgB,IAAI,MAAM,CAAC;IAC3B,iBAAiB,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,CAAC;IAC7C,qBAAqB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACvF,cAAc,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAC/D,qBAAqB,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACnE"}
|
|
@@ -60,6 +60,7 @@ export declare class PublicPersistableStateManager {
|
|
|
60
60
|
* @param value - the value being written to the slot
|
|
61
61
|
*/
|
|
62
62
|
writeStorage(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite?: boolean): Promise<void>;
|
|
63
|
+
isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
|
|
63
64
|
/**
|
|
64
65
|
* Read from public storage.
|
|
65
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state_manager.d.ts","sourceRoot":"","sources":["../../../src/public/state_manager/state_manager.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAI9C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,iCAAiC,EAA+B,MAAM,wBAAwB,CAAC;AAC7G,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,EAA2B,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;GAQG;AACH,qBAAa,6BAA6B;IAOtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAb7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA2C;IAE/D,sDAAsD;IACtD,OAAO,CAAC,uBAAuB,CAAS;gBAGrB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,0BAA0B,EACvC,KAAK,EAAE,8BAA8B,EACrC,cAAc,EAAE,EAAE,EAAE,0BAA0B;IAC9C,WAAW,EAAE,MAAM,EAAE,+BAA+B;IACpD,kBAAkB,GAAE,OAAe,EACnC,aAAa,GAAE,aAA0C,EACzD,UAAU,GAAE,gBAAgD;IAG/E;;OAEG;WACW,MAAM,CAClB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,0BAA0B,EACvC,KAAK,EAAE,8BAA8B,EACrC,kBAAkB,EAAE,OAAO,YAAQ,EACnC,cAAc,EAAE,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,6BAA6B;IAWhC;;OAEG;IACU,IAAI;IAcjB;;OAEG;IACU,KAAK,CAAC,WAAW,EAAE,6BAA6B;IAI7D;;OAEG;IACU,MAAM,CAAC,WAAW,EAAE,6BAA6B;YAIhD,MAAM;IAmBpB;;;;;;OAMG;IACU,YAAY,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"state_manager.d.ts","sourceRoot":"","sources":["../../../src/public/state_manager/state_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -95,6 +95,9 @@ import { PublicStorage } from './public_storage.js';
|
|
|
95
95
|
}
|
|
96
96
|
await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
|
|
97
97
|
}
|
|
98
|
+
isStorageCold(contractAddress, slot) {
|
|
99
|
+
return this.trace.isStorageCold(contractAddress, slot);
|
|
100
|
+
}
|
|
98
101
|
/**
|
|
99
102
|
* Read from public storage.
|
|
100
103
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-nightly.20250605",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./server": "./dest/server.js",
|
|
@@ -58,25 +58,25 @@
|
|
|
58
58
|
]
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@aztec/constants": "0.
|
|
62
|
-
"@aztec/foundation": "0.
|
|
63
|
-
"@aztec/noir-acvm_js": "0.
|
|
64
|
-
"@aztec/noir-noirc_abi": "0.
|
|
65
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
66
|
-
"@aztec/noir-types": "0.
|
|
67
|
-
"@aztec/protocol-contracts": "0.
|
|
68
|
-
"@aztec/stdlib": "0.
|
|
69
|
-
"@aztec/telemetry-client": "0.
|
|
70
|
-
"@aztec/world-state": "0.
|
|
61
|
+
"@aztec/constants": "1.0.0-nightly.20250605",
|
|
62
|
+
"@aztec/foundation": "1.0.0-nightly.20250605",
|
|
63
|
+
"@aztec/noir-acvm_js": "1.0.0-nightly.20250605",
|
|
64
|
+
"@aztec/noir-noirc_abi": "1.0.0-nightly.20250605",
|
|
65
|
+
"@aztec/noir-protocol-circuits-types": "1.0.0-nightly.20250605",
|
|
66
|
+
"@aztec/noir-types": "1.0.0-nightly.20250605",
|
|
67
|
+
"@aztec/protocol-contracts": "1.0.0-nightly.20250605",
|
|
68
|
+
"@aztec/stdlib": "1.0.0-nightly.20250605",
|
|
69
|
+
"@aztec/telemetry-client": "1.0.0-nightly.20250605",
|
|
70
|
+
"@aztec/world-state": "1.0.0-nightly.20250605",
|
|
71
71
|
"lodash.clonedeep": "^4.5.0",
|
|
72
72
|
"lodash.merge": "^4.6.2",
|
|
73
73
|
"tslib": "^2.4.0"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@aztec/kv-store": "0.
|
|
77
|
-
"@aztec/merkle-tree": "0.
|
|
78
|
-
"@aztec/noir-contracts.js": "0.
|
|
79
|
-
"@aztec/noir-test-contracts.js": "0.
|
|
76
|
+
"@aztec/kv-store": "1.0.0-nightly.20250605",
|
|
77
|
+
"@aztec/merkle-tree": "1.0.0-nightly.20250605",
|
|
78
|
+
"@aztec/noir-contracts.js": "1.0.0-nightly.20250605",
|
|
79
|
+
"@aztec/noir-test-contracts.js": "1.0.0-nightly.20250605",
|
|
80
80
|
"@jest/globals": "^29.5.0",
|
|
81
81
|
"@types/jest": "^29.5.0",
|
|
82
82
|
"@types/lodash.clonedeep": "^4.5.7",
|
|
@@ -104,7 +104,7 @@ const BASE_GAS_COSTS: Record<Opcode, Gas> = {
|
|
|
104
104
|
[Opcode.MOV_8]: makeCost(c.AVM_MOV_BASE_L2_GAS, 0),
|
|
105
105
|
[Opcode.MOV_16]: makeCost(c.AVM_MOV_BASE_L2_GAS, 0),
|
|
106
106
|
[Opcode.SLOAD]: makeCost(c.AVM_SLOAD_BASE_L2_GAS, 0),
|
|
107
|
-
[Opcode.SSTORE]: makeCost(c.AVM_SSTORE_BASE_L2_GAS,
|
|
107
|
+
[Opcode.SSTORE]: makeCost(c.AVM_SSTORE_BASE_L2_GAS, 0), // DA gas is dynamic
|
|
108
108
|
[Opcode.NOTEHASHEXISTS]: makeCost(c.AVM_NOTEHASHEXISTS_BASE_L2_GAS, 0),
|
|
109
109
|
[Opcode.EMITNOTEHASH]: makeCost(c.AVM_EMITNOTEHASH_BASE_L2_GAS, c.AVM_EMITNOTEHASH_BASE_DA_GAS),
|
|
110
110
|
[Opcode.NULLIFIEREXISTS]: makeCost(c.AVM_NULLIFIEREXISTS_BASE_L2_GAS, 0),
|
|
@@ -129,13 +129,16 @@ const BASE_GAS_COSTS: Record<Opcode, Gas> = {
|
|
|
129
129
|
const DYNAMIC_GAS_COSTS = new Map<Opcode, Gas>([
|
|
130
130
|
[Opcode.CALLDATACOPY, makeCost(c.AVM_CALLDATACOPY_DYN_L2_GAS, 0)],
|
|
131
131
|
[Opcode.RETURNDATACOPY, makeCost(c.AVM_RETURNDATACOPY_DYN_L2_GAS, 0)],
|
|
132
|
-
|
|
133
|
-
[Opcode.
|
|
134
|
-
[Opcode.STATICCALL, makeCost(c.AVM_STATICCALL_DYN_L2_GAS, 0)],
|
|
135
|
-
[Opcode.RETURN, makeCost(c.AVM_RETURN_DYN_L2_GAS, 0)],
|
|
136
|
-
[Opcode.REVERT_8, makeCost(c.AVM_REVERT_DYN_L2_GAS, 0)],
|
|
137
|
-
[Opcode.REVERT_16, makeCost(c.AVM_REVERT_DYN_L2_GAS, 0)],
|
|
132
|
+
// TODO: Call and static call based on bytecode length
|
|
133
|
+
[Opcode.EMITUNENCRYPTEDLOG, makeCost(0, c.AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS)],
|
|
138
134
|
[Opcode.TORADIXBE, makeCost(c.AVM_TORADIXBE_DYN_L2_GAS, 0)],
|
|
135
|
+
[Opcode.AND_8, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
|
|
136
|
+
[Opcode.AND_16, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
|
|
137
|
+
[Opcode.OR_8, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
|
|
138
|
+
[Opcode.OR_16, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
|
|
139
|
+
[Opcode.XOR_8, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
|
|
140
|
+
[Opcode.XOR_16, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
|
|
141
|
+
[Opcode.SSTORE, makeCost(0, c.AVM_SSTORE_DYN_DA_GAS)],
|
|
139
142
|
]);
|
|
140
143
|
|
|
141
144
|
/** Returns the fixed base gas cost for a given opcode. */
|
|
@@ -143,17 +146,20 @@ export function getBaseGasCost(opcode: Opcode): Gas {
|
|
|
143
146
|
return BASE_GAS_COSTS[opcode];
|
|
144
147
|
}
|
|
145
148
|
|
|
146
|
-
export function
|
|
147
|
-
return
|
|
149
|
+
export function computeAddressingCost(indirectOperandsCount: number, relativeOperandsCount: number): Gas {
|
|
150
|
+
return makeCost(
|
|
151
|
+
indirectOperandsCount * c.AVM_ADDRESSING_INDIRECT_L2_GAS + relativeOperandsCount * c.AVM_ADDRESSING_RELATIVE_L2_GAS,
|
|
152
|
+
0,
|
|
153
|
+
);
|
|
148
154
|
}
|
|
149
155
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
return mulGas(baseCost, getGasCostMultiplierFromTypeTag(tag));
|
|
156
|
+
export function getDynamicGasCost(opcode: Opcode): Gas {
|
|
157
|
+
return DYNAMIC_GAS_COSTS.has(opcode) ? DYNAMIC_GAS_COSTS.get(opcode)! : makeCost(0, 0);
|
|
153
158
|
}
|
|
154
159
|
|
|
155
|
-
/** Returns a multiplier based on the size of the type represented by the tag.
|
|
156
|
-
|
|
160
|
+
/** Returns a multiplier based on the byte size of the type represented by the integer tag.
|
|
161
|
+
* Used to account for necessary rows in the bitwise trace. Throws on invalid. */
|
|
162
|
+
export function getBitwiseDynamicGasMultiplier(tag: TypeTag) {
|
|
157
163
|
switch (tag) {
|
|
158
164
|
case TypeTag.UINT1: // same as u8
|
|
159
165
|
return 1;
|
|
@@ -168,7 +174,7 @@ function getGasCostMultiplierFromTypeTag(tag: TypeTag) {
|
|
|
168
174
|
case TypeTag.UINT128:
|
|
169
175
|
return 16;
|
|
170
176
|
case TypeTag.FIELD:
|
|
171
|
-
return
|
|
177
|
+
return 0; // Field is not allowed for bitwise operations. However we don't fail in gas, since we'll fail in bitwise.
|
|
172
178
|
case TypeTag.INVALID:
|
|
173
179
|
throw new InstructionExecutionError(`Invalid tag type for gas cost multiplier: ${TypeTag[tag]}`);
|
|
174
180
|
}
|
|
@@ -122,7 +122,7 @@ export async function createContractClassAndInstance(
|
|
|
122
122
|
const contractClass = await makeContractClassPublic(seed, bytecode);
|
|
123
123
|
|
|
124
124
|
const constructorAbi = getContractFunctionAbi('constructor', contractArtifact);
|
|
125
|
-
const { publicKeys } = await deriveKeys(Fr
|
|
125
|
+
const { publicKeys } = await deriveKeys(new Fr(seed));
|
|
126
126
|
const initializationHash = await computeInitializationHash(constructorAbi, constructorArgs);
|
|
127
127
|
const contractInstance =
|
|
128
128
|
originalContractClassId === undefined
|
|
@@ -31,7 +31,9 @@ export class NoteHashExists extends Instruction {
|
|
|
31
31
|
const memory = context.machineState.memory;
|
|
32
32
|
const addressing = Addressing.fromWire(this.indirect);
|
|
33
33
|
|
|
34
|
-
context.machineState.consumeGas(
|
|
34
|
+
context.machineState.consumeGas(
|
|
35
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
36
|
+
);
|
|
35
37
|
const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
|
|
36
38
|
const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
37
39
|
memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
|
|
@@ -62,7 +64,9 @@ export class EmitNoteHash extends Instruction {
|
|
|
62
64
|
const memory = context.machineState.memory;
|
|
63
65
|
const addressing = Addressing.fromWire(this.indirect);
|
|
64
66
|
|
|
65
|
-
context.machineState.consumeGas(
|
|
67
|
+
context.machineState.consumeGas(
|
|
68
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
69
|
+
);
|
|
66
70
|
|
|
67
71
|
const operands = [this.noteHashOffset];
|
|
68
72
|
const [noteHashOffset] = addressing.resolve(operands, memory);
|
|
@@ -102,7 +106,9 @@ export class NullifierExists extends Instruction {
|
|
|
102
106
|
const memory = context.machineState.memory;
|
|
103
107
|
const addressing = Addressing.fromWire(this.indirect);
|
|
104
108
|
|
|
105
|
-
context.machineState.consumeGas(
|
|
109
|
+
context.machineState.consumeGas(
|
|
110
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
111
|
+
);
|
|
106
112
|
|
|
107
113
|
const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
|
|
108
114
|
const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
@@ -137,7 +143,9 @@ export class EmitNullifier extends Instruction {
|
|
|
137
143
|
const memory = context.machineState.memory;
|
|
138
144
|
const addressing = Addressing.fromWire(this.indirect);
|
|
139
145
|
|
|
140
|
-
context.machineState.consumeGas(
|
|
146
|
+
context.machineState.consumeGas(
|
|
147
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
148
|
+
);
|
|
141
149
|
|
|
142
150
|
const operands = [this.nullifierOffset];
|
|
143
151
|
const [nullifierOffset] = addressing.resolve(operands, memory);
|
|
@@ -184,7 +192,9 @@ export class L1ToL2MessageExists extends Instruction {
|
|
|
184
192
|
const memory = context.machineState.memory;
|
|
185
193
|
const addressing = Addressing.fromWire(this.indirect);
|
|
186
194
|
|
|
187
|
-
context.machineState.consumeGas(
|
|
195
|
+
context.machineState.consumeGas(
|
|
196
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
197
|
+
);
|
|
188
198
|
|
|
189
199
|
const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
|
|
190
200
|
const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
@@ -220,6 +230,10 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
220
230
|
const memory = context.machineState.memory;
|
|
221
231
|
const addressing = Addressing.fromWire(this.indirect);
|
|
222
232
|
|
|
233
|
+
context.machineState.consumeGas(
|
|
234
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
235
|
+
);
|
|
236
|
+
|
|
223
237
|
const operands = [this.logOffset, this.logSizeOffset];
|
|
224
238
|
const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
|
|
225
239
|
memory.checkTag(TypeTag.UINT32, logSizeOffset);
|
|
@@ -228,7 +242,7 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
228
242
|
|
|
229
243
|
const contractAddress = context.environment.address;
|
|
230
244
|
|
|
231
|
-
context.machineState.consumeGas(this.
|
|
245
|
+
context.machineState.consumeGas(this.dynamicGasCost(logSize));
|
|
232
246
|
const log = memory.getSlice(logOffset, logSize).map(f => f.toFr());
|
|
233
247
|
context.persistableState.writePublicLog(contractAddress, log);
|
|
234
248
|
}
|
|
@@ -256,7 +270,9 @@ export class SendL2ToL1Message extends Instruction {
|
|
|
256
270
|
const memory = context.machineState.memory;
|
|
257
271
|
const addressing = Addressing.fromWire(this.indirect);
|
|
258
272
|
|
|
259
|
-
context.machineState.consumeGas(
|
|
273
|
+
context.machineState.consumeGas(
|
|
274
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
275
|
+
);
|
|
260
276
|
|
|
261
277
|
const operands = [this.recipientOffset, this.contentOffset];
|
|
262
278
|
const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
|
|
@@ -54,6 +54,14 @@ export class Addressing {
|
|
|
54
54
|
return wire;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
public indirectOperandsCount(): number {
|
|
58
|
+
return this.modePerOperand.filter(mode => mode & AddressingMode.INDIRECT).length;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public relativeOperandsCount(): number {
|
|
62
|
+
return this.modePerOperand.filter(mode => mode & AddressingMode.RELATIVE).length;
|
|
63
|
+
}
|
|
64
|
+
|
|
57
65
|
/**
|
|
58
66
|
* Resolves the offsets using the addressing mode.
|
|
59
67
|
* @param offsets The offsets to resolve.
|
|
@@ -16,7 +16,9 @@ export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInst
|
|
|
16
16
|
const memory = context.machineState.memory;
|
|
17
17
|
const addressing = Addressing.fromWire(this.indirect);
|
|
18
18
|
|
|
19
|
-
context.machineState.consumeGas(
|
|
19
|
+
context.machineState.consumeGas(
|
|
20
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
21
|
+
);
|
|
20
22
|
|
|
21
23
|
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
22
24
|
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AvmContext } from '../avm_context.js';
|
|
2
|
+
import { getBitwiseDynamicGasMultiplier } from '../avm_gas.js';
|
|
2
3
|
import { type IntegralValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
|
|
3
4
|
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
4
5
|
import { Addressing } from './addressing_mode.js';
|
|
@@ -10,12 +11,17 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
|
|
|
10
11
|
const memory = context.machineState.memory;
|
|
11
12
|
const addressing = Addressing.fromWire(this.indirect);
|
|
12
13
|
|
|
13
|
-
context.machineState.consumeGas(
|
|
14
|
+
context.machineState.consumeGas(
|
|
15
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
16
|
+
);
|
|
14
17
|
|
|
15
18
|
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
16
19
|
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
17
20
|
this.checkTags(memory, aOffset, bOffset);
|
|
18
21
|
|
|
22
|
+
const multiplier = this.getDynamicMultiplier(memory.getTag(aOffset));
|
|
23
|
+
context.machineState.consumeGas(this.dynamicGasCost(multiplier));
|
|
24
|
+
|
|
19
25
|
const a = memory.getAs<IntegralValue>(aOffset);
|
|
20
26
|
const b = memory.getAs<IntegralValue>(bOffset);
|
|
21
27
|
|
|
@@ -28,6 +34,10 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
|
|
|
28
34
|
TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset));
|
|
29
35
|
memory.checkTagsAreSame(aOffset, bOffset);
|
|
30
36
|
}
|
|
37
|
+
|
|
38
|
+
protected getDynamicMultiplier(_lhsTag: TypeTag): number {
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
31
41
|
}
|
|
32
42
|
|
|
33
43
|
export class And extends ThreeOperandBitwiseInstruction {
|
|
@@ -37,6 +47,10 @@ export class And extends ThreeOperandBitwiseInstruction {
|
|
|
37
47
|
protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
|
|
38
48
|
return a.and(b);
|
|
39
49
|
}
|
|
50
|
+
|
|
51
|
+
protected override getDynamicMultiplier(lhsTag: TypeTag): number {
|
|
52
|
+
return getBitwiseDynamicGasMultiplier(lhsTag);
|
|
53
|
+
}
|
|
40
54
|
}
|
|
41
55
|
|
|
42
56
|
export class Or extends ThreeOperandBitwiseInstruction {
|
|
@@ -46,6 +60,10 @@ export class Or extends ThreeOperandBitwiseInstruction {
|
|
|
46
60
|
protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
|
|
47
61
|
return a.or(b);
|
|
48
62
|
}
|
|
63
|
+
|
|
64
|
+
protected override getDynamicMultiplier(lhsTag: TypeTag): number {
|
|
65
|
+
return getBitwiseDynamicGasMultiplier(lhsTag);
|
|
66
|
+
}
|
|
49
67
|
}
|
|
50
68
|
|
|
51
69
|
export class Xor extends ThreeOperandBitwiseInstruction {
|
|
@@ -55,6 +73,10 @@ export class Xor extends ThreeOperandBitwiseInstruction {
|
|
|
55
73
|
protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
|
|
56
74
|
return a.xor(b);
|
|
57
75
|
}
|
|
76
|
+
|
|
77
|
+
protected override getDynamicMultiplier(lhsTag: TypeTag): number {
|
|
78
|
+
return getBitwiseDynamicGasMultiplier(lhsTag);
|
|
79
|
+
}
|
|
58
80
|
}
|
|
59
81
|
|
|
60
82
|
export class Shl extends ThreeOperandBitwiseInstruction {
|
|
@@ -102,7 +124,9 @@ export class Not extends Instruction {
|
|
|
102
124
|
const memory = context.machineState.memory;
|
|
103
125
|
const addressing = Addressing.fromWire(this.indirect);
|
|
104
126
|
|
|
105
|
-
context.machineState.consumeGas(
|
|
127
|
+
context.machineState.consumeGas(
|
|
128
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
129
|
+
);
|
|
106
130
|
|
|
107
131
|
const operands = [this.srcOffset, this.dstOffset];
|
|
108
132
|
const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
@@ -9,7 +9,9 @@ abstract class ComparatorInstruction extends ThreeOperandInstruction {
|
|
|
9
9
|
const memory = context.machineState.memory;
|
|
10
10
|
const addressing = Addressing.fromWire(this.indirect);
|
|
11
11
|
|
|
12
|
-
context.machineState.consumeGas(
|
|
12
|
+
context.machineState.consumeGas(
|
|
13
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
14
|
+
);
|
|
13
15
|
|
|
14
16
|
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
15
17
|
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
@@ -36,7 +36,9 @@ export class GetContractInstance extends Instruction {
|
|
|
36
36
|
const memory = context.machineState.memory;
|
|
37
37
|
const addressing = Addressing.fromWire(this.indirect);
|
|
38
38
|
|
|
39
|
-
context.machineState.consumeGas(
|
|
39
|
+
context.machineState.consumeGas(
|
|
40
|
+
this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
|
|
41
|
+
);
|
|
40
42
|
|
|
41
43
|
if (!(this.memberEnum in ContractInstanceMember)) {
|
|
42
44
|
throw new InstructionExecutionError(`Invalid GETCONSTRACTINSTANCE member enum ${this.memberEnum}`);
|