@aztec/simulator 0.36.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/acvm/acvm.d.ts +1 -1
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +2 -2
- package/dest/acvm/oracle/oracle.d.ts +6 -4
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +39 -8
- package/dest/acvm/oracle/typed_oracle.d.ts +5 -3
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +9 -3
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +2 -1
- package/dest/avm/avm_memory_types.d.ts +1 -1
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +3 -1
- package/dest/avm/journal/journal.d.ts +20 -1
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +69 -9
- package/dest/avm/journal/nullifiers.d.ts +3 -1
- package/dest/avm/journal/nullifiers.d.ts.map +1 -1
- package/dest/avm/journal/nullifiers.js +14 -6
- package/dest/avm/journal/public_storage.d.ts +10 -1
- package/dest/avm/journal/public_storage.d.ts.map +1 -1
- package/dest/avm/journal/public_storage.js +17 -2
- package/dest/avm/journal/trace.d.ts +1 -4
- package/dest/avm/journal/trace.d.ts.map +1 -1
- package/dest/avm/journal/trace.js +4 -5
- package/dest/avm/journal/trace_types.d.ts +1 -0
- package/dest/avm/journal/trace_types.d.ts.map +1 -1
- package/dest/avm/journal/trace_types.js +1 -1
- package/dest/avm/opcodes/bitwise.d.ts +4 -1
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/avm/opcodes/bitwise.js +14 -2
- package/dest/avm/opcodes/environment_getters.d.ts +5 -0
- package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/avm/opcodes/environment_getters.js +8 -1
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +14 -13
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +3 -2
- package/dest/avm/serialization/instruction_serialization.d.ts +39 -38
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +40 -39
- package/dest/client/client_execution_context.d.ts +31 -18
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +48 -31
- package/dest/client/db_oracle.d.ts +11 -4
- package/dest/client/db_oracle.d.ts.map +1 -1
- package/dest/client/execution_result.d.ts +19 -15
- package/dest/client/execution_result.d.ts.map +1 -1
- package/dest/client/execution_result.js +45 -12
- package/dest/client/logs_cache.d.ts +33 -0
- package/dest/client/logs_cache.d.ts.map +1 -0
- package/dest/client/logs_cache.js +59 -0
- package/dest/client/private_execution.d.ts +2 -2
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +3 -7
- package/dest/client/simulator.d.ts +3 -3
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +3 -2
- package/dest/client/unconstrained_execution.d.ts +2 -2
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +1 -1
- package/dest/client/view_data_oracle.d.ts +7 -0
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +10 -1
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +3 -1
- package/dest/public/abstract_phase_manager.d.ts +2 -0
- package/dest/public/abstract_phase_manager.d.ts.map +1 -1
- package/dest/public/abstract_phase_manager.js +13 -6
- package/dest/public/execution.d.ts +9 -0
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -1
- package/dest/public/executor.d.ts +2 -2
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +34 -14
- package/dest/public/public_execution_context.d.ts +10 -4
- package/dest/public/public_execution_context.d.ts.map +1 -1
- package/dest/public/public_execution_context.js +19 -6
- package/dest/public/tail_phase_manager.d.ts +0 -1
- package/dest/public/tail_phase_manager.d.ts.map +1 -1
- package/dest/public/tail_phase_manager.js +3 -26
- package/dest/public/transitional_adaptors.d.ts +4 -17
- package/dest/public/transitional_adaptors.d.ts.map +1 -1
- package/dest/public/transitional_adaptors.js +27 -119
- package/package.json +8 -8
- package/src/acvm/acvm.ts +2 -2
- package/src/acvm/oracle/oracle.ts +63 -10
- package/src/acvm/oracle/typed_oracle.ts +12 -3
- package/src/avm/avm_gas.ts +1 -0
- package/src/avm/avm_memory_types.ts +1 -1
- package/src/avm/avm_simulator.ts +2 -0
- package/src/avm/journal/journal.ts +133 -9
- package/src/avm/journal/nullifiers.ts +19 -8
- package/src/avm/journal/public_storage.ts +23 -2
- package/src/avm/journal/trace.ts +3 -4
- package/src/avm/journal/trace_types.ts +1 -0
- package/src/avm/opcodes/bitwise.ts +18 -7
- package/src/avm/opcodes/environment_getters.ts +9 -0
- package/src/avm/opcodes/external_calls.ts +21 -16
- package/src/avm/serialization/bytecode_serialization.ts +2 -0
- package/src/avm/serialization/instruction_serialization.ts +1 -0
- package/src/client/client_execution_context.ts +55 -31
- package/src/client/db_oracle.ts +12 -10
- package/src/client/execution_result.ts +55 -24
- package/src/client/logs_cache.ts +65 -0
- package/src/client/private_execution.ts +4 -10
- package/src/client/simulator.ts +6 -4
- package/src/client/unconstrained_execution.ts +2 -2
- package/src/client/view_data_oracle.ts +10 -0
- package/src/mocks/fixtures.ts +2 -0
- package/src/public/abstract_phase_manager.ts +13 -5
- package/src/public/execution.ts +9 -0
- package/src/public/executor.ts +47 -10
- package/src/public/public_execution_context.ts +18 -4
- package/src/public/tail_phase_manager.ts +2 -34
- package/src/public/transitional_adaptors.ts +39 -178
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
// All code in this file needs to die once the public executor is phased out in favor of the AVM.
|
|
2
|
-
import { UnencryptedFunctionL2Logs
|
|
3
|
-
import { CallContext,
|
|
2
|
+
import { UnencryptedFunctionL2Logs } from '@aztec/circuit-types';
|
|
3
|
+
import { CallContext, FunctionData, } from '@aztec/circuits.js';
|
|
4
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
5
5
|
import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
|
|
6
|
-
import { AvmContractCallResults } from '../avm/avm_message_call_result.js';
|
|
7
6
|
import { Mov } from '../avm/opcodes/memory.js';
|
|
8
7
|
import { createSimulationError } from '../common/errors.js';
|
|
9
|
-
import { PackedValuesCache, SideEffectCounter } from '../index.js';
|
|
10
|
-
import { PublicExecutionContext } from './public_execution_context.js';
|
|
11
8
|
/**
|
|
12
9
|
* Convert a PublicExecution(Environment) object to an AvmExecutionEnvironment
|
|
13
10
|
*
|
|
@@ -19,131 +16,42 @@ export function createAvmExecutionEnvironment(current, header, globalVariables,
|
|
|
19
16
|
return new AvmExecutionEnvironment(current.contractAddress, current.callContext.storageContractAddress, current.callContext.msgSender, globalVariables.gasFees.feePerL2Gas, globalVariables.gasFees.feePerDaGas,
|
|
20
17
|
/*contractCallDepth=*/ Fr.zero(), header, globalVariables, current.callContext.isStaticCall, current.callContext.isDelegateCall, current.args, gasSettings, transactionFee, current.functionData.selector);
|
|
21
18
|
}
|
|
22
|
-
export function
|
|
23
|
-
const sideEffectCounter = avmContext.persistableState.trace.accessCounter;
|
|
19
|
+
export function createPublicExecution(startSideEffectCounter, avmEnvironment, calldata) {
|
|
24
20
|
const callContext = CallContext.from({
|
|
25
|
-
msgSender:
|
|
26
|
-
storageContractAddress:
|
|
27
|
-
functionSelector:
|
|
28
|
-
isDelegateCall:
|
|
29
|
-
isStaticCall:
|
|
30
|
-
sideEffectCounter:
|
|
21
|
+
msgSender: avmEnvironment.sender,
|
|
22
|
+
storageContractAddress: avmEnvironment.storageAddress,
|
|
23
|
+
functionSelector: avmEnvironment.temporaryFunctionSelector,
|
|
24
|
+
isDelegateCall: avmEnvironment.isDelegateCall,
|
|
25
|
+
isStaticCall: avmEnvironment.isStaticCall,
|
|
26
|
+
sideEffectCounter: startSideEffectCounter,
|
|
31
27
|
});
|
|
32
|
-
const functionData = new FunctionData(
|
|
28
|
+
const functionData = new FunctionData(avmEnvironment.temporaryFunctionSelector, /*isPrivate=*/ false);
|
|
33
29
|
const execution = {
|
|
34
|
-
contractAddress:
|
|
30
|
+
contractAddress: avmEnvironment.address,
|
|
35
31
|
callContext,
|
|
36
32
|
args: calldata,
|
|
37
33
|
functionData,
|
|
38
34
|
};
|
|
39
|
-
|
|
40
|
-
const context = new PublicExecutionContext(execution, avmContext.environment.header, avmContext.environment.globals, packedArgs, new SideEffectCounter(sideEffectCounter), avmContext.persistableState.hostStorage.publicStateDb, avmContext.persistableState.hostStorage.contractsDb, avmContext.persistableState.hostStorage.commitmentsDb, Gas.from(avmContext.machineState.gasLeft), avmContext.environment.transactionFee, avmContext.environment.gasSettings);
|
|
41
|
-
return context;
|
|
35
|
+
return execution;
|
|
42
36
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
* @param execution
|
|
47
|
-
* @param newWorldState
|
|
48
|
-
* @param result
|
|
49
|
-
* @returns
|
|
50
|
-
*/
|
|
51
|
-
export async function convertAvmResults(executionContext, newWorldState, result, endMachineState) {
|
|
52
|
-
const execution = executionContext.execution;
|
|
53
|
-
const contractStorageReads = newWorldState.storageReads.map(read => new ContractStorageRead(read.slot, read.value, read.counter.toNumber(), read.storageAddress));
|
|
54
|
-
const contractStorageUpdateRequests = newWorldState.storageWrites.map(write => new ContractStorageUpdateRequest(write.slot, write.value, write.counter.toNumber(), write.storageAddress));
|
|
55
|
-
// We need to write the storage updates to the DB, because that's what the ACVM expects.
|
|
56
|
-
// Assumes the updates are in the right order.
|
|
57
|
-
for (const write of newWorldState.storageWrites) {
|
|
58
|
-
await executionContext.stateDb.storageWrite(write.storageAddress, write.slot, write.value);
|
|
59
|
-
}
|
|
60
|
-
const newNoteHashes = newWorldState.newNoteHashes.map(noteHash => new NoteHash(noteHash.noteHash, noteHash.counter.toNumber()));
|
|
61
|
-
const nullifierReadRequests = newWorldState.nullifierChecks
|
|
62
|
-
.filter(nullifierCheck => nullifierCheck.exists)
|
|
63
|
-
.map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
|
|
64
|
-
const nullifierNonExistentReadRequests = newWorldState.nullifierChecks
|
|
65
|
-
.filter(nullifierCheck => !nullifierCheck.exists)
|
|
66
|
-
.map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
|
|
67
|
-
const newNullifiers = newWorldState.newNullifiers.map(tracedNullifier => new Nullifier(
|
|
68
|
-
/*value=*/ tracedNullifier.nullifier, tracedNullifier.counter.toNumber(),
|
|
69
|
-
/*noteHash=*/ Fr.ZERO));
|
|
70
|
-
const unencryptedLogs = new UnencryptedFunctionL2Logs(newWorldState.newLogs.map(log => new UnencryptedL2Log(log.contractAddress, log.selector, log.data)));
|
|
71
|
-
const unencryptedLogsHashes = newWorldState.newLogsHashes.map(logHash => new SideEffect(logHash.logHash, logHash.counter));
|
|
72
|
-
const newL2ToL1Messages = newWorldState.newL1Messages.map(m => new L2ToL1Message(m.recipient, m.content));
|
|
73
|
-
const returnValues = result.output;
|
|
74
|
-
// TODO: Support nested executions.
|
|
75
|
-
const nestedExecutions = [];
|
|
76
|
-
// TODO keep track of side effect counters
|
|
77
|
-
const startSideEffectCounter = Fr.ZERO;
|
|
78
|
-
const endSideEffectCounter = Fr.ZERO;
|
|
37
|
+
export function convertAvmResultsToPxResult(avmResult, startSideEffectCounter, fromPx, startGas, endAvmContext) {
|
|
38
|
+
const endPersistableState = endAvmContext.persistableState;
|
|
39
|
+
const endMachineState = endAvmContext.machineState;
|
|
79
40
|
return {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
returnValues,
|
|
91
|
-
nestedExecutions,
|
|
92
|
-
unencryptedLogsHashes,
|
|
93
|
-
unencryptedLogs,
|
|
94
|
-
reverted: result.reverted,
|
|
95
|
-
revertReason: result.revertReason ? createSimulationError(result.revertReason) : undefined,
|
|
96
|
-
startGasLeft: executionContext.availableGas,
|
|
41
|
+
...endPersistableState.transitionalExecutionResult, // includes nestedExecutions
|
|
42
|
+
execution: fromPx,
|
|
43
|
+
returnValues: avmResult.output,
|
|
44
|
+
startSideEffectCounter: new Fr(startSideEffectCounter),
|
|
45
|
+
endSideEffectCounter: new Fr(endPersistableState.trace.accessCounter),
|
|
46
|
+
unencryptedLogs: new UnencryptedFunctionL2Logs(endPersistableState.transitionalExecutionResult.unencryptedLogs),
|
|
47
|
+
allUnencryptedLogs: new UnencryptedFunctionL2Logs(endPersistableState.transitionalExecutionResult.allUnencryptedLogs),
|
|
48
|
+
reverted: avmResult.reverted,
|
|
49
|
+
revertReason: avmResult.revertReason ? createSimulationError(avmResult.revertReason) : undefined,
|
|
50
|
+
startGasLeft: startGas,
|
|
97
51
|
endGasLeft: endMachineState.gasLeft,
|
|
98
|
-
transactionFee:
|
|
52
|
+
transactionFee: endAvmContext.environment.transactionFee,
|
|
99
53
|
};
|
|
100
54
|
}
|
|
101
|
-
export function convertPublicExecutionResult(res) {
|
|
102
|
-
return new AvmContractCallResults(res.reverted, res.returnValues, res.revertReason);
|
|
103
|
-
}
|
|
104
|
-
export function updateAvmContextFromPublicExecutionResult(ctx, result) {
|
|
105
|
-
// We have to push these manually and not use the trace* functions
|
|
106
|
-
// so that we respect the side effect counters.
|
|
107
|
-
for (const readRequest of result.contractStorageReads) {
|
|
108
|
-
ctx.persistableState.trace.publicStorageReads.push({
|
|
109
|
-
storageAddress: ctx.environment.storageAddress,
|
|
110
|
-
exists: true, // FIXME
|
|
111
|
-
slot: readRequest.storageSlot,
|
|
112
|
-
value: readRequest.currentValue,
|
|
113
|
-
counter: new Fr(readRequest.sideEffectCounter ?? Fr.ZERO),
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
for (const updateRequest of result.contractStorageUpdateRequests) {
|
|
117
|
-
ctx.persistableState.trace.publicStorageWrites.push({
|
|
118
|
-
storageAddress: ctx.environment.storageAddress,
|
|
119
|
-
slot: updateRequest.storageSlot,
|
|
120
|
-
value: updateRequest.newValue,
|
|
121
|
-
counter: new Fr(updateRequest.sideEffectCounter ?? Fr.ZERO),
|
|
122
|
-
});
|
|
123
|
-
// We need to manually populate the cache.
|
|
124
|
-
ctx.persistableState.publicStorage.write(ctx.environment.storageAddress, updateRequest.storageSlot, updateRequest.newValue);
|
|
125
|
-
}
|
|
126
|
-
for (const nullifier of result.newNullifiers) {
|
|
127
|
-
ctx.persistableState.trace.newNullifiers.push({
|
|
128
|
-
storageAddress: ctx.environment.storageAddress,
|
|
129
|
-
nullifier: nullifier.value,
|
|
130
|
-
counter: new Fr(nullifier.counter),
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
for (const noteHash of result.newNoteHashes) {
|
|
134
|
-
ctx.persistableState.trace.newNoteHashes.push({
|
|
135
|
-
storageAddress: ctx.environment.storageAddress,
|
|
136
|
-
noteHash: noteHash.value,
|
|
137
|
-
counter: new Fr(noteHash.counter),
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
for (const message of result.newL2ToL1Messages) {
|
|
141
|
-
ctx.persistableState.newL1Messages.push(message);
|
|
142
|
-
}
|
|
143
|
-
for (const log of result.unencryptedLogs.logs) {
|
|
144
|
-
ctx.persistableState.newLogs.push(new UnencryptedL2Log(log.contractAddress, log.selector, log.data));
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
55
|
const AVM_MAGIC_SUFFIX = Buffer.from([
|
|
148
56
|
Mov.opcode, // opcode
|
|
149
57
|
0x00, // indirect
|
|
@@ -157,4 +65,4 @@ export function isAvmBytecode(bytecode) {
|
|
|
157
65
|
const magicSize = AVM_MAGIC_SUFFIX.length;
|
|
158
66
|
return bytecode.subarray(-magicSize).equals(AVM_MAGIC_SUFFIX);
|
|
159
67
|
}
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsWUFBWSxHQUtiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzlDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUc1RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLE9BQXdCLEVBQ3hCLE1BQWMsRUFDZCxlQUFnQyxFQUNoQyxXQUF3QixFQUN4QixjQUFrQjtJQUVsQixPQUFPLElBQUksdUJBQXVCLENBQ2hDLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQzFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUM3QixlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXO0lBQ25DLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFDaEMsTUFBTSxFQUNOLGVBQWUsRUFDZixPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQ2xDLE9BQU8sQ0FBQyxJQUFJLEVBQ1osV0FBVyxFQUNYLGNBQWMsRUFDZCxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDOUIsQ0FBQztBQUNK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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -45,13 +45,13 @@
|
|
|
45
45
|
]
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@aztec/circuit-types": "0.
|
|
49
|
-
"@aztec/circuits.js": "0.
|
|
50
|
-
"@aztec/foundation": "0.
|
|
51
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
52
|
-
"@aztec/protocol-contracts": "0.
|
|
53
|
-
"@aztec/types": "0.
|
|
54
|
-
"@aztec/world-state": "0.
|
|
48
|
+
"@aztec/circuit-types": "0.38.0",
|
|
49
|
+
"@aztec/circuits.js": "0.38.0",
|
|
50
|
+
"@aztec/foundation": "0.38.0",
|
|
51
|
+
"@aztec/noir-protocol-circuits-types": "0.38.0",
|
|
52
|
+
"@aztec/protocol-contracts": "0.38.0",
|
|
53
|
+
"@aztec/types": "0.38.0",
|
|
54
|
+
"@aztec/world-state": "0.38.0",
|
|
55
55
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
56
56
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
57
57
|
"levelup": "^5.1.1",
|
package/src/acvm/acvm.ts
CHANGED
|
@@ -19,7 +19,7 @@ import { type ORACLE_NAMES } from './oracle/index.js';
|
|
|
19
19
|
*/
|
|
20
20
|
type ACIRCallback = Record<
|
|
21
21
|
ORACLE_NAMES,
|
|
22
|
-
(...args: ForeignCallInput[]) => ForeignCallOutput | Promise<ForeignCallOutput>
|
|
22
|
+
(...args: ForeignCallInput[]) => void | ForeignCallOutput | Promise<ForeignCallOutput>
|
|
23
23
|
>;
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -105,7 +105,7 @@ export async function acvm(
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
const result = await oracleFunction.call(callback, ...args);
|
|
108
|
-
return [result];
|
|
108
|
+
return typeof result === 'undefined' ? [] : [result];
|
|
109
109
|
} catch (err) {
|
|
110
110
|
let typedError: Error;
|
|
111
111
|
if (err instanceof Error) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
-
import { acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
|
|
2
|
+
import { type PartialAddress, acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
|
|
3
3
|
import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
|
|
4
4
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
5
5
|
import { Fr, Point } from '@aztec/foundation/fields';
|
|
@@ -53,6 +53,7 @@ export class Oracle {
|
|
|
53
53
|
];
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
// TODO: #5834 Nuke this
|
|
56
57
|
async getPublicKeyAndPartialAddress([address]: ACVMField[]) {
|
|
57
58
|
const { publicKey, partialAddress } = await this.typedOracle.getCompleteAddress(
|
|
58
59
|
AztecAddress.fromField(fromACVMField(address)),
|
|
@@ -171,6 +172,28 @@ export class Oracle {
|
|
|
171
172
|
return capsule.map(toACVMField);
|
|
172
173
|
}
|
|
173
174
|
|
|
175
|
+
async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[]> {
|
|
176
|
+
let publicKeys: Point[] | undefined;
|
|
177
|
+
let partialAddress: PartialAddress;
|
|
178
|
+
|
|
179
|
+
// TODO #5834: This should be reworked to return the public keys as well
|
|
180
|
+
try {
|
|
181
|
+
({ partialAddress } = await this.typedOracle.getCompleteAddress(AztecAddress.fromField(fromACVMField(address))));
|
|
182
|
+
} catch (err) {
|
|
183
|
+
partialAddress = Fr.ZERO;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
publicKeys = await this.typedOracle.getPublicKeysForAddress(AztecAddress.fromField(fromACVMField(address)));
|
|
188
|
+
} catch (err) {
|
|
189
|
+
publicKeys = Array(4).fill(Point.ZERO);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const acvmPublicKeys = publicKeys.flatMap(key => key.toFields());
|
|
193
|
+
|
|
194
|
+
return [...acvmPublicKeys, partialAddress].map(toACVMField);
|
|
195
|
+
}
|
|
196
|
+
|
|
174
197
|
async getNotes(
|
|
175
198
|
[storageSlot]: ACVMField[],
|
|
176
199
|
[numSelects]: ACVMField[],
|
|
@@ -294,19 +317,51 @@ export class Oracle {
|
|
|
294
317
|
[publicKeyX]: ACVMField[],
|
|
295
318
|
[publicKeyY]: ACVMField[],
|
|
296
319
|
log: ACVMField[],
|
|
297
|
-
|
|
320
|
+
[counter]: ACVMField[],
|
|
321
|
+
): ACVMField[] {
|
|
298
322
|
const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
|
|
299
|
-
const
|
|
323
|
+
const encLog = this.typedOracle.emitEncryptedLog(
|
|
300
324
|
AztecAddress.fromString(contractAddress),
|
|
301
325
|
Fr.fromString(storageSlot),
|
|
302
326
|
Fr.fromString(noteTypeId),
|
|
303
327
|
publicKey,
|
|
304
328
|
log.map(fromACVMField),
|
|
329
|
+
+counter,
|
|
305
330
|
);
|
|
306
|
-
|
|
331
|
+
// TODO(1139): We should encrypt in the circuit, but instead we inject here
|
|
332
|
+
// encryption output is 112 + 32 * (N + 3) bytes, for log len N
|
|
333
|
+
// so split into N + 7 fields (gross but avoids 300+ ACVMFields)
|
|
334
|
+
const encLogFields = [];
|
|
335
|
+
for (let i = 0; i < Math.ceil(encLog.length / 31); i++) {
|
|
336
|
+
encLogFields.push(toACVMField(encLog.subarray(31 * i, Math.min(31 * (i + 1), encLog.length))));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return encLogFields;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
emitUnencryptedLog(
|
|
343
|
+
[contractAddress]: ACVMField[],
|
|
344
|
+
[eventSelector]: ACVMField[],
|
|
345
|
+
message: ACVMField[],
|
|
346
|
+
[counter]: ACVMField[],
|
|
347
|
+
): ACVMField {
|
|
348
|
+
const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
|
|
349
|
+
const log = new UnencryptedL2Log(
|
|
350
|
+
AztecAddress.fromString(contractAddress),
|
|
351
|
+
EventSelector.fromField(fromACVMField(eventSelector)),
|
|
352
|
+
logPayload,
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
this.typedOracle.emitUnencryptedLog(log, +counter);
|
|
356
|
+
return toACVMField(0);
|
|
307
357
|
}
|
|
308
358
|
|
|
309
|
-
|
|
359
|
+
emitContractClassUnencryptedLog(
|
|
360
|
+
[contractAddress]: ACVMField[],
|
|
361
|
+
[eventSelector]: ACVMField[],
|
|
362
|
+
message: ACVMField[],
|
|
363
|
+
[counter]: ACVMField[],
|
|
364
|
+
): ACVMField {
|
|
310
365
|
const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
|
|
311
366
|
const log = new UnencryptedL2Log(
|
|
312
367
|
AztecAddress.fromString(contractAddress),
|
|
@@ -314,18 +369,16 @@ export class Oracle {
|
|
|
314
369
|
logPayload,
|
|
315
370
|
);
|
|
316
371
|
|
|
317
|
-
const logHash = this.typedOracle.
|
|
372
|
+
const logHash = this.typedOracle.emitContractClassUnencryptedLog(log, +counter);
|
|
318
373
|
return toACVMField(logHash);
|
|
319
374
|
}
|
|
320
375
|
|
|
321
|
-
debugLog(...args: ACVMField[][]):
|
|
376
|
+
debugLog(...args: ACVMField[][]): void {
|
|
322
377
|
this.log.verbose(oracleDebugCallToFormattedStr(args));
|
|
323
|
-
return toACVMField(0);
|
|
324
378
|
}
|
|
325
379
|
|
|
326
|
-
debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]):
|
|
380
|
+
debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): void {
|
|
327
381
|
this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
|
|
328
|
-
return toACVMField(0);
|
|
329
382
|
}
|
|
330
383
|
|
|
331
384
|
async callPrivateFunction(
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from '@aztec/circuits.js';
|
|
18
18
|
import { type FunctionSelector } from '@aztec/foundation/abi';
|
|
19
19
|
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
20
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
20
|
+
import { Fr, type Point } from '@aztec/foundation/fields';
|
|
21
21
|
import { type ContractInstance } from '@aztec/types/contracts';
|
|
22
22
|
|
|
23
23
|
/** Nullifier keys which both correspond to the same master nullifier secret key. */
|
|
@@ -140,6 +140,10 @@ export abstract class TypedOracle {
|
|
|
140
140
|
throw new OracleMethodNotAvailableError('popCapsule');
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
getPublicKeysForAddress(_address: AztecAddress): Promise<Point[]> {
|
|
144
|
+
throw new OracleMethodNotAvailableError('getPublicKeysForAddress');
|
|
145
|
+
}
|
|
146
|
+
|
|
143
147
|
getNotes(
|
|
144
148
|
_storageSlot: Fr,
|
|
145
149
|
_numSelects: number,
|
|
@@ -193,14 +197,19 @@ export abstract class TypedOracle {
|
|
|
193
197
|
_noteTypeId: Fr,
|
|
194
198
|
_publicKey: PublicKey,
|
|
195
199
|
_log: Fr[],
|
|
196
|
-
|
|
200
|
+
_counter: number,
|
|
201
|
+
): Buffer {
|
|
197
202
|
throw new OracleMethodNotAvailableError('emitEncryptedLog');
|
|
198
203
|
}
|
|
199
204
|
|
|
200
|
-
emitUnencryptedLog(_log: UnencryptedL2Log):
|
|
205
|
+
emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
|
|
201
206
|
throw new OracleMethodNotAvailableError('emitUnencryptedLog');
|
|
202
207
|
}
|
|
203
208
|
|
|
209
|
+
emitContractClassUnencryptedLog(_log: UnencryptedL2Log, _counter: number): Fr {
|
|
210
|
+
throw new OracleMethodNotAvailableError('emitContractClassUnencryptedLog');
|
|
211
|
+
}
|
|
212
|
+
|
|
204
213
|
callPrivateFunction(
|
|
205
214
|
_targetContractAddress: AztecAddress,
|
|
206
215
|
_functionSelector: FunctionSelector,
|
package/src/avm/avm_gas.ts
CHANGED
|
@@ -78,6 +78,7 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
|
|
|
78
78
|
[Opcode.SENDER]: TemporaryDefaultGasCost,
|
|
79
79
|
[Opcode.FEEPERL2GAS]: TemporaryDefaultGasCost,
|
|
80
80
|
[Opcode.FEEPERDAGAS]: TemporaryDefaultGasCost,
|
|
81
|
+
[Opcode.TRANSACTIONFEE]: TemporaryDefaultGasCost,
|
|
81
82
|
[Opcode.CONTRACTCALLDEPTH]: TemporaryDefaultGasCost,
|
|
82
83
|
[Opcode.CHAINID]: TemporaryDefaultGasCost,
|
|
83
84
|
[Opcode.VERSION]: TemporaryDefaultGasCost,
|
|
@@ -225,7 +225,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
/** Returns a MeteredTaggedMemory instance to track the number of reads and writes if TRACK_MEMORY_ACCESSES is set. */
|
|
228
|
-
public track(type: string = 'instruction') {
|
|
228
|
+
public track(type: string = 'instruction'): TaggedMemoryInterface {
|
|
229
229
|
return TaggedMemory.TRACK_MEMORY_ACCESSES ? new MeteredTaggedMemory(this, type) : this;
|
|
230
230
|
}
|
|
231
231
|
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
|
2
2
|
|
|
3
3
|
import { strict as assert } from 'assert';
|
|
4
4
|
|
|
5
|
+
import { isAvmBytecode } from '../public/transitional_adaptors.js';
|
|
5
6
|
import type { AvmContext } from './avm_context.js';
|
|
6
7
|
import { AvmContractCallResults } from './avm_message_call_result.js';
|
|
7
8
|
import { AvmExecutionError, InvalidProgramCounterError, NoBytecodeForContractError } from './errors.js';
|
|
@@ -32,6 +33,7 @@ export class AvmSimulator {
|
|
|
32
33
|
if (!bytecode) {
|
|
33
34
|
throw new NoBytecodeForContractError(this.context.environment.address);
|
|
34
35
|
}
|
|
36
|
+
assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
35
37
|
|
|
36
38
|
return await this.executeBytecode(bytecode);
|
|
37
39
|
}
|