@aztec/simulator 0.33.0 → 0.35.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 +4 -1
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +5 -5
- package/dest/acvm/deserialize.d.ts +3 -5
- package/dest/acvm/deserialize.d.ts.map +1 -1
- package/dest/acvm/deserialize.js +6 -9
- package/dest/acvm/oracle/oracle.d.ts +3 -1
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +14 -6
- package/dest/acvm/oracle/typed_oracle.d.ts +2 -0
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +7 -1
- package/dest/avm/avm_execution_environment.d.ts +6 -3
- package/dest/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/avm/avm_execution_environment.js +12 -9
- package/dest/avm/avm_gas.js +2 -2
- package/dest/avm/avm_machine_state.d.ts +2 -0
- package/dest/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/avm/avm_machine_state.js +24 -6
- package/dest/avm/avm_memory_types.js +6 -6
- package/dest/avm/avm_simulator.js +7 -7
- package/dest/avm/fixtures/index.d.ts +3 -0
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +11 -4
- package/dest/avm/journal/journal.d.ts +15 -13
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +16 -5
- package/dest/avm/journal/trace.d.ts +8 -19
- package/dest/avm/journal/trace.d.ts.map +1 -1
- package/dest/avm/journal/trace.js +48 -116
- package/dest/avm/journal/trace_types.d.ts +23 -4
- package/dest/avm/journal/trace_types.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.d.ts +2 -1
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +14 -6
- package/dest/avm/opcodes/context_getters.js +2 -2
- package/dest/avm/opcodes/external_calls.d.ts +2 -2
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +26 -10
- package/dest/avm/opcodes/hashing.d.ts +8 -8
- package/dest/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/avm/opcodes/hashing.js +35 -43
- package/dest/avm/serialization/instruction_serialization.d.ts +1 -1
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +2 -2
- package/dest/client/client_execution_context.d.ts +14 -4
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +28 -13
- package/dest/client/private_execution.d.ts +1 -1
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +10 -8
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +6 -5
- package/dest/client/unconstrained_execution.d.ts +1 -1
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +6 -5
- package/dest/client/view_data_oracle.d.ts +2 -2
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +2 -2
- package/dest/common/index.d.ts +1 -1
- package/dest/common/index.d.ts.map +1 -1
- package/dest/common/index.js +2 -2
- package/dest/common/packed_values_cache.d.ts +28 -0
- package/dest/common/packed_values_cache.d.ts.map +1 -0
- package/dest/common/packed_values_cache.js +50 -0
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/mocks/fixtures.d.ts +42 -0
- package/dest/mocks/fixtures.d.ts.map +1 -0
- package/dest/mocks/fixtures.js +84 -0
- package/dest/mocks/index.d.ts +2 -0
- package/dest/mocks/index.d.ts.map +1 -0
- package/dest/mocks/index.js +2 -0
- package/dest/public/abstract_phase_manager.d.ts +82 -0
- package/dest/public/abstract_phase_manager.d.ts.map +1 -0
- package/dest/public/abstract_phase_manager.js +320 -0
- package/dest/public/app_logic_phase_manager.d.ts +29 -0
- package/dest/public/app_logic_phase_manager.d.ts.map +1 -0
- package/dest/public/app_logic_phase_manager.js +50 -0
- package/dest/public/execution.d.ts +3 -0
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -1
- package/dest/public/executor.d.ts +1 -15
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +80 -83
- package/dest/public/hints_builder.d.ts +23 -0
- package/dest/public/hints_builder.d.ts.map +1 -0
- package/dest/public/hints_builder.js +62 -0
- package/dest/public/index.d.ts +5 -0
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +6 -1
- package/dest/public/phase_manager_factory.d.ts +18 -0
- package/dest/public/phase_manager_factory.d.ts.map +1 -0
- package/dest/public/phase_manager_factory.js +56 -0
- package/dest/public/public_execution_context.d.ts +20 -10
- package/dest/public/public_execution_context.d.ts.map +1 -1
- package/dest/public/public_execution_context.js +35 -23
- package/dest/public/public_executor.d.ts +79 -0
- package/dest/public/public_executor.d.ts.map +1 -0
- package/dest/public/public_executor.js +198 -0
- package/dest/public/public_kernel.d.ts +37 -0
- package/dest/public/public_kernel.d.ts.map +1 -0
- package/dest/public/public_kernel.js +97 -0
- package/dest/public/public_kernel_circuit_simulator.d.ts +31 -0
- package/dest/public/public_kernel_circuit_simulator.d.ts.map +1 -0
- package/dest/public/public_kernel_circuit_simulator.js +2 -0
- package/dest/public/public_processor.d.ts +53 -0
- package/dest/public/public_processor.d.ts.map +1 -0
- package/dest/public/public_processor.js +144 -0
- package/dest/public/setup_phase_manager.d.ts +30 -0
- package/dest/public/setup_phase_manager.d.ts.map +1 -0
- package/dest/public/setup_phase_manager.js +46 -0
- package/dest/public/tail_phase_manager.d.ts +30 -0
- package/dest/public/tail_phase_manager.d.ts.map +1 -0
- package/dest/public/tail_phase_manager.js +60 -0
- package/dest/public/teardown_phase_manager.d.ts +30 -0
- package/dest/public/teardown_phase_manager.d.ts.map +1 -0
- package/dest/public/teardown_phase_manager.js +46 -0
- package/dest/public/transitional_adaptors.d.ts +33 -0
- package/dest/public/transitional_adaptors.d.ts.map +1 -0
- package/dest/public/transitional_adaptors.js +162 -0
- package/dest/public/utils.d.ts +8 -0
- package/dest/public/utils.d.ts.map +1 -0
- package/dest/public/utils.js +29 -0
- package/dest/simulator/acvm_native.d.ts +19 -3
- package/dest/simulator/acvm_native.d.ts.map +1 -1
- package/dest/simulator/acvm_native.js +75 -48
- package/dest/simulator/acvm_wasm.d.ts.map +1 -1
- package/dest/simulator/acvm_wasm.js +3 -4
- package/package.json +8 -5
- package/src/acvm/acvm.ts +8 -5
- package/src/acvm/deserialize.ts +5 -9
- package/src/acvm/oracle/oracle.ts +15 -5
- package/src/acvm/oracle/typed_oracle.ts +8 -0
- package/src/avm/avm_execution_environment.ts +17 -17
- package/src/avm/avm_gas.ts +1 -1
- package/src/avm/avm_machine_state.ts +26 -5
- package/src/avm/avm_memory_types.ts +5 -5
- package/src/avm/avm_simulator.ts +6 -6
- package/src/avm/fixtures/index.ts +14 -1
- package/src/avm/journal/journal.ts +37 -17
- package/src/avm/journal/trace.ts +59 -121
- package/src/avm/journal/trace_types.ts +39 -39
- package/src/avm/opcodes/accrued_substate.ts +17 -5
- package/src/avm/opcodes/context_getters.ts +1 -1
- package/src/avm/opcodes/external_calls.ts +32 -9
- package/src/avm/opcodes/hashing.ts +38 -54
- package/src/avm/serialization/instruction_serialization.ts +1 -1
- package/src/client/client_execution_context.ts +30 -11
- package/src/client/private_execution.ts +9 -8
- package/src/client/simulator.ts +7 -3
- package/src/client/unconstrained_execution.ts +5 -4
- package/src/client/view_data_oracle.ts +1 -1
- package/src/common/index.ts +1 -1
- package/src/common/packed_values_cache.ts +55 -0
- package/src/index.ts +1 -0
- package/src/mocks/fixtures.ts +169 -0
- package/src/mocks/index.ts +1 -0
- package/src/public/abstract_phase_manager.ts +571 -0
- package/src/public/app_logic_phase_manager.ts +76 -0
- package/src/public/execution.ts +4 -0
- package/src/public/executor.ts +93 -93
- package/src/public/hints_builder.ts +119 -0
- package/src/public/index.ts +5 -0
- package/src/public/phase_manager_factory.ts +126 -0
- package/src/public/public_execution_context.ts +43 -37
- package/src/public/public_executor.ts +267 -0
- package/src/public/public_kernel.ts +139 -0
- package/src/public/public_kernel_circuit_simulator.ts +36 -0
- package/src/public/public_processor.ts +212 -0
- package/src/public/setup_phase_manager.ts +66 -0
- package/src/public/tail_phase_manager.ts +120 -0
- package/src/public/teardown_phase_manager.ts +66 -0
- package/src/public/transitional_adaptors.ts +249 -0
- package/src/public/utils.ts +31 -0
- package/src/simulator/acvm_native.ts +94 -47
- package/src/simulator/acvm_wasm.ts +7 -3
- package/dest/avm/temporary_executor_migration.d.ts +0 -27
- package/dest/avm/temporary_executor_migration.d.ts.map +0 -1
- package/dest/avm/temporary_executor_migration.js +0 -94
- package/dest/common/packed_args_cache.d.ts +0 -28
- package/dest/common/packed_args_cache.d.ts.map +0 -1
- package/dest/common/packed_args_cache.js +0 -50
- package/src/avm/temporary_executor_migration.ts +0 -136
- package/src/common/packed_args_cache.ts +0 -55
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// All code in this file needs to die once the public executor is phased out in favor of the AVM.
|
|
2
|
+
import { UnencryptedFunctionL2Logs, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
3
|
+
import { CallContext, ContractStorageRead, ContractStorageUpdateRequest, FunctionData, Gas, L2ToL1Message, ReadRequest, SideEffect, SideEffectLinkedToNoteHash, } from '@aztec/circuits.js';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
|
|
6
|
+
import { AvmContractCallResults } from '../avm/avm_message_call_result.js';
|
|
7
|
+
import { Mov } from '../avm/opcodes/memory.js';
|
|
8
|
+
import { createSimulationError } from '../common/errors.js';
|
|
9
|
+
import { PackedValuesCache, SideEffectCounter } from '../index.js';
|
|
10
|
+
import { PublicExecutionContext } from './public_execution_context.js';
|
|
11
|
+
/**
|
|
12
|
+
* Convert a PublicExecution(Environment) object to an AvmExecutionEnvironment
|
|
13
|
+
*
|
|
14
|
+
* @param current
|
|
15
|
+
* @param globalVariables
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export function createAvmExecutionEnvironment(current, header, globalVariables) {
|
|
19
|
+
return new AvmExecutionEnvironment(current.contractAddress, current.callContext.storageContractAddress, current.callContext.msgSender, // TODO: origin is not available
|
|
20
|
+
current.callContext.msgSender, current.callContext.portalContractAddress, globalVariables.gasFees.feePerL1Gas, globalVariables.gasFees.feePerL2Gas, globalVariables.gasFees.feePerDaGas,
|
|
21
|
+
/*contractCallDepth=*/ Fr.zero(), header, globalVariables, current.callContext.isStaticCall, current.callContext.isDelegateCall, current.args, current.callContext.gasSettings, current.callContext.transactionFee, current.functionData.selector);
|
|
22
|
+
}
|
|
23
|
+
export function createPublicExecutionContext(avmContext, calldata) {
|
|
24
|
+
const sideEffectCounter = avmContext.persistableState.trace.accessCounter;
|
|
25
|
+
const callContext = CallContext.from({
|
|
26
|
+
msgSender: avmContext.environment.sender,
|
|
27
|
+
storageContractAddress: avmContext.environment.storageAddress,
|
|
28
|
+
portalContractAddress: avmContext.environment.portal,
|
|
29
|
+
functionSelector: avmContext.environment.temporaryFunctionSelector,
|
|
30
|
+
gasLeft: Gas.from(avmContext.machineState.gasLeft),
|
|
31
|
+
isDelegateCall: avmContext.environment.isDelegateCall,
|
|
32
|
+
isStaticCall: avmContext.environment.isStaticCall,
|
|
33
|
+
sideEffectCounter: sideEffectCounter,
|
|
34
|
+
gasSettings: avmContext.environment.gasSettings,
|
|
35
|
+
transactionFee: avmContext.environment.transactionFee,
|
|
36
|
+
});
|
|
37
|
+
const functionData = new FunctionData(avmContext.environment.temporaryFunctionSelector, /*isPrivate=*/ false);
|
|
38
|
+
const execution = {
|
|
39
|
+
contractAddress: avmContext.environment.address,
|
|
40
|
+
callContext,
|
|
41
|
+
args: calldata,
|
|
42
|
+
functionData,
|
|
43
|
+
};
|
|
44
|
+
const packedArgs = PackedValuesCache.create([]);
|
|
45
|
+
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);
|
|
46
|
+
return context;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert the result of an AVM contract call to a PublicExecutionResult for the public kernel
|
|
50
|
+
*
|
|
51
|
+
* @param execution
|
|
52
|
+
* @param newWorldState
|
|
53
|
+
* @param result
|
|
54
|
+
* @returns
|
|
55
|
+
*/
|
|
56
|
+
export async function convertAvmResults(executionContext, newWorldState, result, endMachineState) {
|
|
57
|
+
const execution = executionContext.execution;
|
|
58
|
+
const contractStorageReads = newWorldState.storageReads.map(read => new ContractStorageRead(read.slot, read.value, read.counter.toNumber()));
|
|
59
|
+
const contractStorageUpdateRequests = newWorldState.storageWrites.map(write => new ContractStorageUpdateRequest(write.slot, write.value, write.counter.toNumber()));
|
|
60
|
+
// We need to write the storage updates to the DB, because that's what the ACVM expects.
|
|
61
|
+
// Assumes the updates are in the right order.
|
|
62
|
+
for (const write of newWorldState.storageWrites) {
|
|
63
|
+
await executionContext.stateDb.storageWrite(write.storageAddress, write.slot, write.value);
|
|
64
|
+
}
|
|
65
|
+
const newNoteHashes = newWorldState.newNoteHashes.map(noteHash => new SideEffect(noteHash.noteHash, noteHash.counter));
|
|
66
|
+
const nullifierReadRequests = newWorldState.nullifierChecks
|
|
67
|
+
.filter(nullifierCheck => nullifierCheck.exists)
|
|
68
|
+
.map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
|
|
69
|
+
const nullifierNonExistentReadRequests = newWorldState.nullifierChecks
|
|
70
|
+
.filter(nullifierCheck => !nullifierCheck.exists)
|
|
71
|
+
.map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
|
|
72
|
+
const newNullifiers = newWorldState.newNullifiers.map(tracedNullifier => new SideEffectLinkedToNoteHash(
|
|
73
|
+
/*value=*/ tracedNullifier.nullifier,
|
|
74
|
+
/*noteHash=*/ Fr.ZERO, // NEEDED?
|
|
75
|
+
tracedNullifier.counter));
|
|
76
|
+
const unencryptedLogs = new UnencryptedFunctionL2Logs(newWorldState.newLogs.map(log => new UnencryptedL2Log(log.contractAddress, log.selector, log.data)));
|
|
77
|
+
const newL2ToL1Messages = newWorldState.newL1Messages.map(m => new L2ToL1Message(m.recipient, m.content));
|
|
78
|
+
const returnValues = result.output;
|
|
79
|
+
// TODO: Support nested executions.
|
|
80
|
+
const nestedExecutions = [];
|
|
81
|
+
// TODO keep track of side effect counters
|
|
82
|
+
const startSideEffectCounter = Fr.ZERO;
|
|
83
|
+
const endSideEffectCounter = Fr.ZERO;
|
|
84
|
+
return {
|
|
85
|
+
execution,
|
|
86
|
+
nullifierReadRequests,
|
|
87
|
+
nullifierNonExistentReadRequests,
|
|
88
|
+
newNoteHashes,
|
|
89
|
+
newL2ToL1Messages,
|
|
90
|
+
startSideEffectCounter,
|
|
91
|
+
endSideEffectCounter,
|
|
92
|
+
newNullifiers,
|
|
93
|
+
contractStorageReads,
|
|
94
|
+
contractStorageUpdateRequests,
|
|
95
|
+
returnValues,
|
|
96
|
+
nestedExecutions,
|
|
97
|
+
unencryptedLogs,
|
|
98
|
+
reverted: result.reverted,
|
|
99
|
+
revertReason: result.revertReason ? createSimulationError(result.revertReason) : undefined,
|
|
100
|
+
gasLeft: endMachineState.gasLeft,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function convertPublicExecutionResult(res) {
|
|
104
|
+
return new AvmContractCallResults(res.reverted, res.returnValues, res.revertReason);
|
|
105
|
+
}
|
|
106
|
+
export function updateAvmContextFromPublicExecutionResult(ctx, result) {
|
|
107
|
+
// We have to push these manually and not use the trace* functions
|
|
108
|
+
// so that we respect the side effect counters.
|
|
109
|
+
for (const readRequest of result.contractStorageReads) {
|
|
110
|
+
ctx.persistableState.trace.publicStorageReads.push({
|
|
111
|
+
storageAddress: ctx.environment.storageAddress,
|
|
112
|
+
exists: true, // FIXME
|
|
113
|
+
slot: readRequest.storageSlot,
|
|
114
|
+
value: readRequest.currentValue,
|
|
115
|
+
counter: new Fr(readRequest.sideEffectCounter ?? Fr.ZERO),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
for (const updateRequest of result.contractStorageUpdateRequests) {
|
|
119
|
+
ctx.persistableState.trace.publicStorageWrites.push({
|
|
120
|
+
storageAddress: ctx.environment.storageAddress,
|
|
121
|
+
slot: updateRequest.storageSlot,
|
|
122
|
+
value: updateRequest.newValue,
|
|
123
|
+
counter: new Fr(updateRequest.sideEffectCounter ?? Fr.ZERO),
|
|
124
|
+
});
|
|
125
|
+
// We need to manually populate the cache.
|
|
126
|
+
ctx.persistableState.publicStorage.write(ctx.environment.storageAddress, updateRequest.storageSlot, updateRequest.newValue);
|
|
127
|
+
}
|
|
128
|
+
for (const nullifier of result.newNullifiers) {
|
|
129
|
+
ctx.persistableState.trace.newNullifiers.push({
|
|
130
|
+
storageAddress: ctx.environment.storageAddress,
|
|
131
|
+
nullifier: nullifier.value,
|
|
132
|
+
counter: nullifier.counter,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
for (const noteHash of result.newNoteHashes) {
|
|
136
|
+
ctx.persistableState.trace.newNoteHashes.push({
|
|
137
|
+
storageAddress: ctx.environment.storageAddress,
|
|
138
|
+
noteHash: noteHash.value,
|
|
139
|
+
counter: noteHash.counter,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
for (const message of result.newL2ToL1Messages) {
|
|
143
|
+
ctx.persistableState.newL1Messages.push(message);
|
|
144
|
+
}
|
|
145
|
+
for (const log of result.unencryptedLogs.logs) {
|
|
146
|
+
ctx.persistableState.newLogs.push(new UnencryptedL2Log(log.contractAddress, log.selector, log.data));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const AVM_MAGIC_SUFFIX = Buffer.from([
|
|
150
|
+
Mov.opcode, // opcode
|
|
151
|
+
0x00, // indirect
|
|
152
|
+
...Buffer.from('000018ca', 'hex'), // srcOffset
|
|
153
|
+
...Buffer.from('000018ca', 'hex'), // dstOffset
|
|
154
|
+
]);
|
|
155
|
+
export function markBytecodeAsAvm(bytecode) {
|
|
156
|
+
return Buffer.concat([bytecode, AVM_MAGIC_SUFFIX]);
|
|
157
|
+
}
|
|
158
|
+
export function isAvmBytecode(bytecode) {
|
|
159
|
+
const magicSize = AVM_MAGIC_SUFFIX.length;
|
|
160
|
+
return bytecode.subarray(-magicSize).equals(AVM_MAGIC_SUFFIX);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25GLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixZQUFZLEVBQ1osR0FBRyxFQUdILGFBQWEsRUFDYixXQUFXLEVBQ1gsVUFBVSxFQUNWLDBCQUEwQixHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXZFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsT0FBd0IsRUFDeEIsTUFBYyxFQUNkLGVBQWdDO0lBRWhDLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEMsT0FBTyxDQUFDLGVBQWUsRUFDdkIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFDMUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDO0lBQy9ELE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUM3QixPQUFPLENB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Tx } from '@aztec/circuit-types';
|
|
2
|
+
/**
|
|
3
|
+
* Looks at the side effects of a transaction and returns the highest counter
|
|
4
|
+
* @param tx - A transaction
|
|
5
|
+
* @returns The highest side effect counter in the transaction so far
|
|
6
|
+
*/
|
|
7
|
+
export declare function lastSideEffectCounter(tx: Tx): number;
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/public/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAG/C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAsBpD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CallRequest } from '@aztec/circuits.js';
|
|
2
|
+
/**
|
|
3
|
+
* Looks at the side effects of a transaction and returns the highest counter
|
|
4
|
+
* @param tx - A transaction
|
|
5
|
+
* @returns The highest side effect counter in the transaction so far
|
|
6
|
+
*/
|
|
7
|
+
export function lastSideEffectCounter(tx) {
|
|
8
|
+
const data = tx.data.forPublic;
|
|
9
|
+
const sideEffectCounters = [
|
|
10
|
+
...data.endNonRevertibleData.newNoteHashes,
|
|
11
|
+
...data.endNonRevertibleData.newNullifiers,
|
|
12
|
+
...data.endNonRevertibleData.publicCallStack,
|
|
13
|
+
...data.end.newNoteHashes,
|
|
14
|
+
...data.end.newNullifiers,
|
|
15
|
+
...data.end.publicCallStack,
|
|
16
|
+
];
|
|
17
|
+
let max = 0;
|
|
18
|
+
for (const sideEffect of sideEffectCounters) {
|
|
19
|
+
if (sideEffect instanceof CallRequest) {
|
|
20
|
+
// look at both start and end counters because for enqueued public calls start > 0 while end === 0
|
|
21
|
+
max = Math.max(max, sideEffect.startSideEffectCounter.toNumber(), sideEffect.endSideEffectCounter.toNumber());
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
max = Math.max(max, sideEffect.counter.toNumber());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return max;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGljL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEVBQU07SUFDMUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUM7SUFDaEMsTUFBTSxrQkFBa0IsR0FBRztRQUN6QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhO1FBQzFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWE7UUFDMUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZTtRQUM1QyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYTtRQUN6QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYTtRQUN6QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZTtLQUM1QixDQUFDO0lBRUYsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osS0FBSyxNQUFNLFVBQVUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLElBQUksVUFBVSxZQUFZLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLGtHQUFrRztZQUNsRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyJ9
|
|
@@ -2,19 +2,35 @@
|
|
|
2
2
|
import { type NoirCompiledCircuit } from '@aztec/types/noir';
|
|
3
3
|
import { type WitnessMap } from '@noir-lang/types';
|
|
4
4
|
import { type SimulationProvider } from './simulation_provider.js';
|
|
5
|
+
export declare enum ACVM_RESULT {
|
|
6
|
+
SUCCESS = 0,
|
|
7
|
+
FAILURE = 1
|
|
8
|
+
}
|
|
9
|
+
export type ACVMSuccess = {
|
|
10
|
+
status: ACVM_RESULT.SUCCESS;
|
|
11
|
+
duration: number;
|
|
12
|
+
witness: Map<number, string>;
|
|
13
|
+
};
|
|
14
|
+
export type ACVMFailure = {
|
|
15
|
+
status: ACVM_RESULT.FAILURE;
|
|
16
|
+
reason: string;
|
|
17
|
+
};
|
|
18
|
+
export type ACVMResult = ACVMSuccess | ACVMFailure;
|
|
5
19
|
/**
|
|
6
20
|
*
|
|
7
21
|
* @param inputWitness - The circuit's input witness
|
|
8
22
|
* @param bytecode - The circuit bytecode
|
|
9
23
|
* @param workingDirectory - A directory to use for temporary files by the ACVM
|
|
10
|
-
* @param pathToAcvm - The path to the
|
|
24
|
+
* @param pathToAcvm - The path to the ACVM binary
|
|
25
|
+
* @param outputFilename - If specified, the output will be stored as a file, encoded using Bincode
|
|
11
26
|
* @returns The completed partial witness outputted from the circuit
|
|
12
27
|
*/
|
|
13
|
-
export declare function executeNativeCircuit(inputWitness: WitnessMap, bytecode: Buffer, workingDirectory: string, pathToAcvm: string): Promise<
|
|
28
|
+
export declare function executeNativeCircuit(inputWitness: WitnessMap, bytecode: Buffer, workingDirectory: string, pathToAcvm: string, outputFilename?: string): Promise<ACVMResult>;
|
|
14
29
|
export declare class NativeACVMSimulator implements SimulationProvider {
|
|
15
30
|
private workingDirectory;
|
|
16
31
|
private pathToAcvm;
|
|
17
|
-
|
|
32
|
+
private witnessFilename?;
|
|
33
|
+
constructor(workingDirectory: string, pathToAcvm: string, witnessFilename?: string | undefined);
|
|
18
34
|
simulateCircuit(input: WitnessMap, compiledCircuit: NoirCompiledCircuit): Promise<WitnessMap>;
|
|
19
35
|
}
|
|
20
36
|
//# sourceMappingURL=acvm_native.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acvm_native.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_native.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"acvm_native.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_native.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAInE,oBAAY,WAAW;IACrB,OAAO,IAAA;IACP,OAAO,IAAA;CACR;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAmBnD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,UAAU,EACxB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,UAAU,CAAC,CAqErB;AAED,qBAAa,mBAAoB,YAAW,kBAAkB;IAChD,OAAO,CAAC,gBAAgB;IAAU,OAAO,CAAC,UAAU;IAAU,OAAO,CAAC,eAAe,CAAC;gBAA9E,gBAAgB,EAAE,MAAM,EAAU,UAAU,EAAE,MAAM,EAAU,eAAe,CAAC,oBAAQ;IACpG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CAsBpG"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { randomBytes } from '@aztec/foundation/crypto';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
2
4
|
import * as proc from 'child_process';
|
|
3
5
|
import fs from 'fs/promises';
|
|
6
|
+
const logger = createDebugLogger('aztec:acvm-native');
|
|
7
|
+
export var ACVM_RESULT;
|
|
8
|
+
(function (ACVM_RESULT) {
|
|
9
|
+
ACVM_RESULT[ACVM_RESULT["SUCCESS"] = 0] = "SUCCESS";
|
|
10
|
+
ACVM_RESULT[ACVM_RESULT["FAILURE"] = 1] = "FAILURE";
|
|
11
|
+
})(ACVM_RESULT || (ACVM_RESULT = {}));
|
|
4
12
|
/**
|
|
5
13
|
* Parses a TOML format witness map string into a Map structure
|
|
6
14
|
* @param outputString - The witness map in TOML format
|
|
@@ -20,10 +28,11 @@ function parseIntoWitnessMap(outputString) {
|
|
|
20
28
|
* @param inputWitness - The circuit's input witness
|
|
21
29
|
* @param bytecode - The circuit bytecode
|
|
22
30
|
* @param workingDirectory - A directory to use for temporary files by the ACVM
|
|
23
|
-
* @param pathToAcvm - The path to the
|
|
31
|
+
* @param pathToAcvm - The path to the ACVM binary
|
|
32
|
+
* @param outputFilename - If specified, the output will be stored as a file, encoded using Bincode
|
|
24
33
|
* @returns The completed partial witness outputted from the circuit
|
|
25
34
|
*/
|
|
26
|
-
export async function executeNativeCircuit(inputWitness, bytecode, workingDirectory, pathToAcvm) {
|
|
35
|
+
export async function executeNativeCircuit(inputWitness, bytecode, workingDirectory, pathToAcvm, outputFilename) {
|
|
27
36
|
const bytecodeFilename = 'bytecode';
|
|
28
37
|
const witnessFilename = 'input_witness.toml';
|
|
29
38
|
// convert the witness map to TOML format
|
|
@@ -31,66 +40,84 @@ export async function executeNativeCircuit(inputWitness, bytecode, workingDirect
|
|
|
31
40
|
inputWitness.forEach((value, key) => {
|
|
32
41
|
witnessMap = witnessMap.concat(`${key} = '${value}'\n`);
|
|
33
42
|
});
|
|
34
|
-
// In case the directory is still around from some time previously, remove it
|
|
35
|
-
await fs.rm(workingDirectory, { recursive: true, force: true });
|
|
36
|
-
// Create the new working directory
|
|
37
|
-
await fs.mkdir(workingDirectory, { recursive: true });
|
|
38
|
-
// Write the bytecode and input witness to the working directory
|
|
39
|
-
await fs.writeFile(`${workingDirectory}/${bytecodeFilename}`, bytecode);
|
|
40
|
-
await fs.writeFile(`${workingDirectory}/${witnessFilename}`, witnessMap);
|
|
41
|
-
// Execute the ACVM using the given args
|
|
42
|
-
const args = [
|
|
43
|
-
`execute`,
|
|
44
|
-
`--working-directory`,
|
|
45
|
-
`${workingDirectory}`,
|
|
46
|
-
`--bytecode`,
|
|
47
|
-
`${bytecodeFilename}`,
|
|
48
|
-
`--input-witness`,
|
|
49
|
-
`${witnessFilename}`,
|
|
50
|
-
`--print`,
|
|
51
|
-
];
|
|
52
|
-
const processPromise = new Promise((resolve, reject) => {
|
|
53
|
-
let outputWitness = Buffer.alloc(0);
|
|
54
|
-
let errorBuffer = Buffer.alloc(0);
|
|
55
|
-
const acvm = proc.spawn(pathToAcvm, args);
|
|
56
|
-
acvm.stdout.on('data', data => {
|
|
57
|
-
outputWitness = Buffer.concat([outputWitness, data]);
|
|
58
|
-
});
|
|
59
|
-
acvm.stderr.on('data', data => {
|
|
60
|
-
errorBuffer = Buffer.concat([errorBuffer, data]);
|
|
61
|
-
});
|
|
62
|
-
acvm.on('close', code => {
|
|
63
|
-
if (code === 0) {
|
|
64
|
-
resolve(outputWitness.toString('utf-8'));
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
reject(errorBuffer.toString('utf-8'));
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
43
|
try {
|
|
44
|
+
// Check that the directory exists
|
|
45
|
+
await fs.access(workingDirectory);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { status: ACVM_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
// Write the bytecode and input witness to the working directory
|
|
52
|
+
await fs.writeFile(`${workingDirectory}/${bytecodeFilename}`, bytecode);
|
|
53
|
+
await fs.writeFile(`${workingDirectory}/${witnessFilename}`, witnessMap);
|
|
54
|
+
// Execute the ACVM using the given args
|
|
55
|
+
const args = [
|
|
56
|
+
`execute`,
|
|
57
|
+
`--working-directory`,
|
|
58
|
+
`${workingDirectory}`,
|
|
59
|
+
`--bytecode`,
|
|
60
|
+
`${bytecodeFilename}`,
|
|
61
|
+
`--input-witness`,
|
|
62
|
+
`${witnessFilename}`,
|
|
63
|
+
'--print',
|
|
64
|
+
'--output-witness',
|
|
65
|
+
'output-witness',
|
|
66
|
+
];
|
|
67
|
+
logger.debug(`Calling ACVM with ${args.join(' ')}`);
|
|
68
|
+
const processPromise = new Promise((resolve, reject) => {
|
|
69
|
+
let outputWitness = Buffer.alloc(0);
|
|
70
|
+
let errorBuffer = Buffer.alloc(0);
|
|
71
|
+
const acvm = proc.spawn(pathToAcvm, args);
|
|
72
|
+
acvm.stdout.on('data', data => {
|
|
73
|
+
outputWitness = Buffer.concat([outputWitness, data]);
|
|
74
|
+
});
|
|
75
|
+
acvm.stderr.on('data', data => {
|
|
76
|
+
errorBuffer = Buffer.concat([errorBuffer, data]);
|
|
77
|
+
});
|
|
78
|
+
acvm.on('close', code => {
|
|
79
|
+
if (code === 0) {
|
|
80
|
+
resolve(outputWitness.toString('utf-8'));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger.error(`From ACVM: ${errorBuffer.toString('utf-8')}`);
|
|
84
|
+
reject(errorBuffer.toString('utf-8'));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
const duration = new Timer();
|
|
72
89
|
const output = await processPromise;
|
|
73
|
-
|
|
90
|
+
if (outputFilename) {
|
|
91
|
+
const outputWitnessFileName = `${workingDirectory}/output-witness.gz`;
|
|
92
|
+
await fs.copyFile(outputWitnessFileName, outputFilename);
|
|
93
|
+
}
|
|
94
|
+
const witness = parseIntoWitnessMap(output);
|
|
95
|
+
return { status: ACVM_RESULT.SUCCESS, witness, duration: duration.ms() };
|
|
74
96
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
await fs.rm(workingDirectory, { recursive: true, force: true });
|
|
97
|
+
catch (error) {
|
|
98
|
+
return { status: ACVM_RESULT.FAILURE, reason: `${error}` };
|
|
78
99
|
}
|
|
79
100
|
}
|
|
80
101
|
export class NativeACVMSimulator {
|
|
81
|
-
constructor(workingDirectory, pathToAcvm) {
|
|
102
|
+
constructor(workingDirectory, pathToAcvm, witnessFilename) {
|
|
82
103
|
this.workingDirectory = workingDirectory;
|
|
83
104
|
this.pathToAcvm = pathToAcvm;
|
|
105
|
+
this.witnessFilename = witnessFilename;
|
|
84
106
|
}
|
|
85
107
|
async simulateCircuit(input, compiledCircuit) {
|
|
86
108
|
// Execute the circuit on those initial witness values
|
|
87
109
|
// Decode the bytecode from base64 since the acvm does not know about base64 encoding
|
|
88
110
|
const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
|
|
89
111
|
// Provide a unique working directory so we don't get clashes with parallel executions
|
|
90
|
-
const directory = `${this.workingDirectory}/${randomBytes(
|
|
112
|
+
const directory = `${this.workingDirectory}/${randomBytes(8).toString('hex')}`;
|
|
113
|
+
await fs.mkdir(directory, { recursive: true });
|
|
91
114
|
// Execute the circuit
|
|
92
|
-
const
|
|
93
|
-
|
|
115
|
+
const result = await executeNativeCircuit(input, decodedBytecode, directory, this.pathToAcvm, this.witnessFilename);
|
|
116
|
+
await fs.rm(directory, { force: true, recursive: true });
|
|
117
|
+
if (result.status == ACVM_RESULT.FAILURE) {
|
|
118
|
+
throw new Error(`Failed to generate witness: ${result.reason}`);
|
|
119
|
+
}
|
|
120
|
+
return result.witness;
|
|
94
121
|
}
|
|
95
122
|
}
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN2bV9uYXRpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yL2Fjdm1fbmF0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJaEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSTdCLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFOLElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixtREFBTyxDQUFBO0lBQ1AsbURBQU8sQ0FBQTtBQUNULENBQUMsRUFIVyxXQUFXLEtBQVgsV0FBVyxRQUd0QjtBQWVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFlBQW9CO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsT0FBTyxJQUFJLEdBQUcsQ0FDWixLQUFLO1NBQ0YsTUFBTSxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3JDLEdBQUcsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acvm_wasm.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_wasm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"acvm_wasm.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_wasm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAWnE,qBAAa,aAAc,YAAW,kBAAkB;IAChD,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CAgBpG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { foreignCallHandler } from '@aztec/noir-protocol-circuits-types';
|
|
1
2
|
import { createBlackBoxSolver, executeCircuitWithBlackBoxSolver, } from '@noir-lang/acvm_js';
|
|
2
3
|
let solver;
|
|
3
4
|
const getSolver = () => {
|
|
@@ -14,10 +15,8 @@ export class WASMSimulator {
|
|
|
14
15
|
const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
|
|
15
16
|
//
|
|
16
17
|
// Execute the circuit
|
|
17
|
-
const _witnessMap = await executeCircuitWithBlackBoxSolver(await getSolver(), decodedBytecode, input,
|
|
18
|
-
throw Error('unexpected oracle during execution');
|
|
19
|
-
});
|
|
18
|
+
const _witnessMap = await executeCircuitWithBlackBoxSolver(await getSolver(), decodedBytecode, input, foreignCallHandler);
|
|
20
19
|
return _witnessMap;
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN2bV93YXNtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXVsYXRvci9hY3ZtX3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHekUsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixnQ0FBZ0MsR0FDakMsTUFBTSxvQkFBb0IsQ0FBQztBQUs1QixJQUFJLE1BQTJDLENBQUM7QUFFaEQsTUFBTSxTQUFTLEdBQUcsR0FBd0MsRUFBRTtJQUMxRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLGFBQWE7SUFDeEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFpQixFQUFFLGVBQW9DO1FBQzNFLHNEQUFzRDtRQUN0RCxFQUFFO1FBQ0YscUZBQXFGO1FBQ3JGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxFQUFFO1FBQ0Ysc0JBQXNCO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0NBQWdDLENBQ3hELE1BQU0sU0FBUyxFQUFFLEVBQ2pCLGVBQWUsRUFDZixLQUFLLEVBQ0wsa0JBQWtCLENBQ25CLENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0NBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -37,10 +37,13 @@
|
|
|
37
37
|
]
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@aztec/circuit-types": "0.
|
|
41
|
-
"@aztec/circuits.js": "0.
|
|
42
|
-
"@aztec/foundation": "0.
|
|
43
|
-
"@aztec/types": "0.
|
|
40
|
+
"@aztec/circuit-types": "0.35.0",
|
|
41
|
+
"@aztec/circuits.js": "0.35.0",
|
|
42
|
+
"@aztec/foundation": "0.35.0",
|
|
43
|
+
"@aztec/noir-protocol-circuits-types": "0.35.0",
|
|
44
|
+
"@aztec/protocol-contracts": "0.35.0",
|
|
45
|
+
"@aztec/types": "0.35.0",
|
|
46
|
+
"@aztec/world-state": "0.35.0",
|
|
44
47
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
45
48
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
46
49
|
"levelup": "^5.1.1",
|
package/src/acvm/acvm.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
type ForeignCallInput,
|
|
8
8
|
type ForeignCallOutput,
|
|
9
9
|
type WasmBlackBoxFunctionSolver,
|
|
10
|
-
|
|
10
|
+
executeCircuitWithReturnWitness,
|
|
11
11
|
} from '@noir-lang/acvm_js';
|
|
12
12
|
|
|
13
13
|
import { traverseCauseChain } from '../common/errors.js';
|
|
@@ -27,9 +27,12 @@ type ACIRCallback = Record<
|
|
|
27
27
|
*/
|
|
28
28
|
export interface ACIRExecutionResult {
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
30
|
+
* An execution result contains two witnesses.
|
|
31
|
+
* 1. The partial witness of the execution.
|
|
32
|
+
* 2. The return witness which contains the given public return values within the full witness.
|
|
31
33
|
*/
|
|
32
34
|
partialWitness: ACVMWitness;
|
|
35
|
+
returnWitness: ACVMWitness;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
/**
|
|
@@ -89,13 +92,13 @@ export async function acvm(
|
|
|
89
92
|
): Promise<ACIRExecutionResult> {
|
|
90
93
|
const logger = createDebugLogger('aztec:simulator:acvm');
|
|
91
94
|
|
|
92
|
-
const
|
|
95
|
+
const solvedAndReturnWitness = await executeCircuitWithReturnWitness(
|
|
93
96
|
solver,
|
|
94
97
|
acir,
|
|
95
98
|
initialWitness,
|
|
96
99
|
async (name: string, args: ForeignCallInput[]) => {
|
|
97
100
|
try {
|
|
98
|
-
logger(`Oracle callback ${name}`);
|
|
101
|
+
logger.debug(`Oracle callback ${name}`);
|
|
99
102
|
const oracleFunction = callback[name as ORACLE_NAMES];
|
|
100
103
|
if (!oracleFunction) {
|
|
101
104
|
throw new Error(`Oracle callback ${name} not found`);
|
|
@@ -127,7 +130,7 @@ export async function acvm(
|
|
|
127
130
|
throw err;
|
|
128
131
|
});
|
|
129
132
|
|
|
130
|
-
return { partialWitness };
|
|
133
|
+
return { partialWitness: solvedAndReturnWitness.solvedWitness, returnWitness: solvedAndReturnWitness.returnWitness };
|
|
131
134
|
}
|
|
132
135
|
|
|
133
136
|
/**
|
package/src/acvm/deserialize.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
|
|
3
|
-
import { getReturnWitness } from '@noir-lang/acvm_js';
|
|
4
|
-
|
|
5
3
|
import { type ACVMField, type ACVMWitness } from './acvm_types.js';
|
|
6
4
|
|
|
7
5
|
/**
|
|
@@ -32,13 +30,11 @@ export function frToBoolean(fr: Fr): boolean {
|
|
|
32
30
|
}
|
|
33
31
|
|
|
34
32
|
/**
|
|
35
|
-
*
|
|
36
|
-
* @param
|
|
37
|
-
* @param partialWitness - The witness to extract from.
|
|
33
|
+
* Transforms a witness map to its field elements.
|
|
34
|
+
* @param witness - The witness to extract from.
|
|
38
35
|
* @returns The return values.
|
|
39
36
|
*/
|
|
40
|
-
export function
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
return sortedKeys.map(key => returnWitness.get(key)!).map(fromACVMField);
|
|
37
|
+
export function witnessMapToFields(witness: ACVMWitness): Fr[] {
|
|
38
|
+
const sortedKeys = [...witness.keys()].sort((a, b) => a - b);
|
|
39
|
+
return sortedKeys.map(key => witness.get(key)!).map(fromACVMField);
|
|
44
40
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
2
|
+
import { 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
|
-
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
6
5
|
import { Fr, Point } from '@aztec/foundation/fields';
|
|
7
6
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
7
|
|
|
@@ -27,6 +26,17 @@ export class Oracle {
|
|
|
27
26
|
return toACVMField(packed);
|
|
28
27
|
}
|
|
29
28
|
|
|
29
|
+
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
30
|
+
async packReturns(_length: ACVMField[], values: ACVMField[]): Promise<ACVMField> {
|
|
31
|
+
const packed = await this.typedOracle.packReturns(values.map(fromACVMField));
|
|
32
|
+
return toACVMField(packed);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async unpackReturns([returnsHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
36
|
+
const unpacked = await this.typedOracle.unpackReturns(fromACVMField(returnsHash));
|
|
37
|
+
return unpacked.map(toACVMField);
|
|
38
|
+
}
|
|
39
|
+
|
|
30
40
|
async getNullifierKeyPair([accountAddress]: ACVMField[]): Promise<ACVMField[]> {
|
|
31
41
|
const { publicKey, secretKey } = await this.typedOracle.getNullifierKeyPair(fromACVMField(accountAddress));
|
|
32
42
|
return [
|
|
@@ -304,12 +314,12 @@ export class Oracle {
|
|
|
304
314
|
}
|
|
305
315
|
|
|
306
316
|
debugLog(...args: ACVMField[][]): ACVMField {
|
|
307
|
-
this.log(oracleDebugCallToFormattedStr(args));
|
|
317
|
+
this.log.verbose(oracleDebugCallToFormattedStr(args));
|
|
308
318
|
return toACVMField(0);
|
|
309
319
|
}
|
|
310
320
|
|
|
311
321
|
debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): ACVMField {
|
|
312
|
-
this.log(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
|
|
322
|
+
this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
|
|
313
323
|
return toACVMField(0);
|
|
314
324
|
}
|
|
315
325
|
|
|
@@ -348,7 +358,7 @@ export class Oracle {
|
|
|
348
358
|
frToBoolean(fromACVMField(isStaticCall)),
|
|
349
359
|
frToBoolean(fromACVMField(isDelegateCall)),
|
|
350
360
|
);
|
|
351
|
-
return
|
|
361
|
+
return returnValues.map(toACVMField);
|
|
352
362
|
}
|
|
353
363
|
|
|
354
364
|
async enqueuePublicFunctionCall(
|