@aztec/simulator 0.22.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/README.md +47 -0
- package/dest/acvm/acvm.d.ts +39 -0
- package/dest/acvm/acvm.d.ts.map +1 -0
- package/dest/acvm/acvm.js +97 -0
- package/dest/acvm/acvm_types.d.ts +10 -0
- package/dest/acvm/acvm_types.d.ts.map +1 -0
- package/dest/acvm/acvm_types.js +2 -0
- package/dest/acvm/deserialize.d.ts +24 -0
- package/dest/acvm/deserialize.d.ts.map +1 -0
- package/dest/acvm/deserialize.js +31 -0
- package/dest/acvm/index.d.ts +6 -0
- package/dest/acvm/index.d.ts.map +1 -0
- package/dest/acvm/index.js +6 -0
- package/dest/acvm/oracle/debug.d.ts +19 -0
- package/dest/acvm/oracle/debug.d.ts.map +1 -0
- package/dest/acvm/oracle/debug.js +95 -0
- package/dest/acvm/oracle/index.d.ts +15 -0
- package/dest/acvm/oracle/index.d.ts.map +1 -0
- package/dest/acvm/oracle/index.js +4 -0
- package/dest/acvm/oracle/oracle.d.ts +38 -0
- package/dest/acvm/oracle/oracle.d.ts.map +1 -0
- package/dest/acvm/oracle/oracle.js +193 -0
- package/dest/acvm/oracle/typed_oracle.d.ts +88 -0
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -0
- package/dest/acvm/oracle/typed_oracle.js +103 -0
- package/dest/acvm/serialize.d.ts +30 -0
- package/dest/acvm/serialize.d.ts.map +1 -0
- package/dest/acvm/serialize.js +67 -0
- package/dest/avm/avm_context.d.ts +49 -0
- package/dest/avm/avm_context.d.ts.map +1 -0
- package/dest/avm/avm_context.js +56 -0
- package/dest/avm/avm_execution_environment.d.ts +28 -0
- package/dest/avm/avm_execution_environment.d.ts.map +1 -0
- package/dest/avm/avm_execution_environment.js +42 -0
- package/dest/avm/avm_machine_state.d.ts +62 -0
- package/dest/avm/avm_machine_state.d.ts.map +1 -0
- package/dest/avm/avm_machine_state.js +69 -0
- package/dest/avm/avm_memory_types.d.ts +113 -0
- package/dest/avm/avm_memory_types.d.ts.map +1 -0
- package/dest/avm/avm_memory_types.js +269 -0
- package/dest/avm/avm_message_call_result.d.ts +16 -0
- package/dest/avm/avm_message_call_result.d.ts.map +1 -0
- package/dest/avm/avm_message_call_result.js +21 -0
- package/dest/avm/avm_simulator.d.ts +22 -0
- package/dest/avm/avm_simulator.d.ts.map +1 -0
- package/dest/avm/avm_simulator.js +74 -0
- package/dest/avm/errors.d.ts +30 -0
- package/dest/avm/errors.d.ts.map +1 -0
- package/dest/avm/errors.js +44 -0
- package/dest/avm/fixtures/index.d.ts +28 -0
- package/dest/avm/fixtures/index.d.ts.map +1 -0
- package/dest/avm/fixtures/index.js +44 -0
- package/dest/avm/journal/host_storage.d.ts +13 -0
- package/dest/avm/journal/host_storage.d.ts.map +1 -0
- package/dest/avm/journal/host_storage.js +13 -0
- package/dest/avm/journal/index.d.ts +3 -0
- package/dest/avm/journal/index.d.ts.map +1 -0
- package/dest/avm/journal/index.js +3 -0
- package/dest/avm/journal/journal.d.ts +95 -0
- package/dest/avm/journal/journal.d.ts.map +1 -0
- package/dest/avm/journal/journal.js +217 -0
- package/dest/avm/opcodes/accrued_substate.d.ts +42 -0
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -0
- package/dest/avm/opcodes/accrued_substate.js +82 -0
- package/dest/avm/opcodes/arithmetic.d.ts +28 -0
- package/dest/avm/opcodes/arithmetic.d.ts.map +1 -0
- package/dest/avm/opcodes/arithmetic.js +59 -0
- package/dest/avm/opcodes/bitwise.d.ts +40 -0
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -0
- package/dest/avm/opcodes/bitwise.js +92 -0
- package/dest/avm/opcodes/comparators.d.ts +22 -0
- package/dest/avm/opcodes/comparators.d.ts.map +1 -0
- package/dest/avm/opcodes/comparators.js +51 -0
- package/dest/avm/opcodes/control_flow.d.ts +57 -0
- package/dest/avm/opcodes/control_flow.d.ts.map +1 -0
- package/dest/avm/opcodes/control_flow.js +118 -0
- package/dest/avm/opcodes/environment_getters.d.ts +74 -0
- package/dest/avm/opcodes/environment_getters.d.ts.map +1 -0
- package/dest/avm/opcodes/environment_getters.js +151 -0
- package/dest/avm/opcodes/external_calls.d.ts +34 -0
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -0
- package/dest/avm/opcodes/external_calls.js +103 -0
- package/dest/avm/opcodes/index.d.ts +11 -0
- package/dest/avm/opcodes/index.d.ts.map +1 -0
- package/dest/avm/opcodes/index.js +11 -0
- package/dest/avm/opcodes/instruction.d.ts +43 -0
- package/dest/avm/opcodes/instruction.d.ts.map +1 -0
- package/dest/avm/opcodes/instruction.js +44 -0
- package/dest/avm/opcodes/instruction_impl.d.ts +28 -0
- package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -0
- package/dest/avm/opcodes/instruction_impl.js +47 -0
- package/dest/avm/opcodes/memory.d.ts +55 -0
- package/dest/avm/opcodes/memory.d.ts.map +1 -0
- package/dest/avm/opcodes/memory.js +125 -0
- package/dest/avm/opcodes/storage.d.ts +31 -0
- package/dest/avm/opcodes/storage.d.ts.map +1 -0
- package/dest/avm/opcodes/storage.js +59 -0
- package/dest/avm/serialization/buffer_cursor.d.ts +25 -0
- package/dest/avm/serialization/buffer_cursor.d.ts.map +1 -0
- package/dest/avm/serialization/buffer_cursor.js +94 -0
- package/dest/avm/serialization/bytecode_serialization.d.ts +25 -0
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -0
- package/dest/avm/serialization/bytecode_serialization.js +100 -0
- package/dest/avm/serialization/instruction_serialization.d.ts +91 -0
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -0
- package/dest/avm/serialization/instruction_serialization.js +146 -0
- package/dest/client/client_execution_context.d.ts +188 -0
- package/dest/client/client_execution_context.d.ts.map +1 -0
- package/dest/client/client_execution_context.js +326 -0
- package/dest/client/db_oracle.d.ts +155 -0
- package/dest/client/db_oracle.d.ts.map +1 -0
- package/dest/client/db_oracle.js +17 -0
- package/dest/client/execution_note_cache.d.ts +54 -0
- package/dest/client/execution_note_cache.d.ts.map +1 -0
- package/dest/client/execution_note_cache.js +82 -0
- package/dest/client/execution_result.d.ts +67 -0
- package/dest/client/execution_result.d.ts.map +1 -0
- package/dest/client/execution_result.js +32 -0
- package/dest/client/index.d.ts +4 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +4 -0
- package/dest/client/pick_notes.d.ts +80 -0
- package/dest/client/pick_notes.d.ts.map +1 -0
- package/dest/client/pick_notes.js +45 -0
- package/dest/client/private_execution.d.ts +10 -0
- package/dest/client/private_execution.d.ts.map +1 -0
- package/dest/client/private_execution.js +55 -0
- package/dest/client/simulator.d.ts +100 -0
- package/dest/client/simulator.d.ts.map +1 -0
- package/dest/client/simulator.js +171 -0
- package/dest/client/unconstrained_execution.d.ts +10 -0
- package/dest/client/unconstrained_execution.d.ts.map +1 -0
- package/dest/client/unconstrained_execution.js +25 -0
- package/dest/client/view_data_oracle.d.ts +139 -0
- package/dest/client/view_data_oracle.d.ts.map +1 -0
- package/dest/client/view_data_oracle.js +196 -0
- package/dest/common/errors.d.ts +36 -0
- package/dest/common/errors.d.ts.map +1 -0
- package/dest/common/errors.js +57 -0
- package/dest/common/index.d.ts +4 -0
- package/dest/common/index.d.ts.map +1 -0
- package/dest/common/index.js +4 -0
- package/dest/common/packed_args_cache.d.ts +28 -0
- package/dest/common/packed_args_cache.d.ts.map +1 -0
- package/dest/common/packed_args_cache.js +50 -0
- package/dest/common/side_effect_counter.d.ts +9 -0
- package/dest/common/side_effect_counter.d.ts.map +1 -0
- package/dest/common/side_effect_counter.js +14 -0
- package/dest/index.d.ts +4 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +4 -0
- package/dest/public/db.d.ts +77 -0
- package/dest/public/db.d.ts.map +1 -0
- package/dest/public/db.js +2 -0
- package/dest/public/execution.d.ts +62 -0
- package/dest/public/execution.d.ts.map +1 -0
- package/dest/public/execution.js +61 -0
- package/dest/public/executor.d.ts +27 -0
- package/dest/public/executor.d.ts.map +1 -0
- package/dest/public/executor.js +83 -0
- package/dest/public/index.d.ts +4 -0
- package/dest/public/index.d.ts.map +1 -0
- package/dest/public/index.js +4 -0
- package/dest/public/public_execution_context.d.ts +103 -0
- package/dest/public/public_execution_context.d.ts.map +1 -0
- package/dest/public/public_execution_context.js +175 -0
- package/dest/public/state_actions.d.ts +39 -0
- package/dest/public/state_actions.d.ts.map +1 -0
- package/dest/public/state_actions.js +79 -0
- package/dest/test/utils.d.ts +12 -0
- package/dest/test/utils.d.ts.map +1 -0
- package/dest/test/utils.js +23 -0
- package/dest/utils.d.ts +27 -0
- package/dest/utils.d.ts.map +1 -0
- package/dest/utils.js +28 -0
- package/package.json +66 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Results of an contract call's execution in the AVM.
|
|
3
|
+
*/
|
|
4
|
+
export class AvmContractCallResults {
|
|
5
|
+
constructor(reverted, output, revertReason) {
|
|
6
|
+
this.reverted = reverted;
|
|
7
|
+
this.output = output;
|
|
8
|
+
this.revertReason = revertReason;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Generate a string representation of call results.
|
|
12
|
+
*/
|
|
13
|
+
toString() {
|
|
14
|
+
let resultsStr = `reverted: ${this.reverted}, output: ${this.output}`;
|
|
15
|
+
if (this.revertReason) {
|
|
16
|
+
resultsStr += `, revertReason: ${this.revertReason}`;
|
|
17
|
+
}
|
|
18
|
+
return resultsStr;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX21lc3NhZ2VfY2FsbF9yZXN1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXZtL2F2bV9tZXNzYWdlX2NhbGxfcmVzdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQU9qQyxZQUFZLFFBQWlCLEVBQUUsTUFBWSxFQUFFLFlBQW9CO1FBQy9ELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLFVBQVUsR0FBRyxhQUFhLElBQUksQ0FBQyxRQUFRLGFBQWEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLFVBQVUsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZELENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AvmContext } from './avm_context.js';
|
|
2
|
+
import { AvmContractCallResults } from './avm_message_call_result.js';
|
|
3
|
+
import type { Instruction } from './opcodes/index.js';
|
|
4
|
+
export declare class AvmSimulator {
|
|
5
|
+
private context;
|
|
6
|
+
private log;
|
|
7
|
+
constructor(context: AvmContext);
|
|
8
|
+
/**
|
|
9
|
+
* Fetch the bytecode and execute it in the current context.
|
|
10
|
+
*/
|
|
11
|
+
execute(): Promise<AvmContractCallResults>;
|
|
12
|
+
/**
|
|
13
|
+
* Executes the provided instructions in the current context.
|
|
14
|
+
* This method is useful for testing and debugging.
|
|
15
|
+
*/
|
|
16
|
+
executeInstructions(instructions: Instruction[]): Promise<AvmContractCallResults>;
|
|
17
|
+
/**
|
|
18
|
+
* Fetch contract bytecode from world state and decode into executable instructions.
|
|
19
|
+
*/
|
|
20
|
+
private fetchAndDecodeBytecode;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=avm_simulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avm_simulator.d.ts","sourceRoot":"","sources":["../../src/avm/avm_simulator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,qBAAa,YAAY;IAGX,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,GAAG,CAAyD;gBAEhD,OAAO,EAAE,UAAU;IAEvC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAKvD;;;OAGG;IACU,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAyC9F;;OAEG;YACW,sBAAsB;CAgBrC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { FunctionSelector } from '@aztec/circuits.js';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { strict as assert } from 'assert';
|
|
4
|
+
import { AvmContractCallResults } from './avm_message_call_result.js';
|
|
5
|
+
import { AvmExecutionError, InvalidProgramCounterError, NoBytecodeForContractError } from './errors.js';
|
|
6
|
+
import { decodeFromBytecode } from './serialization/bytecode_serialization.js';
|
|
7
|
+
export class AvmSimulator {
|
|
8
|
+
constructor(context) {
|
|
9
|
+
this.context = context;
|
|
10
|
+
this.log = createDebugLogger('aztec:avm_simulator');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fetch the bytecode and execute it in the current context.
|
|
14
|
+
*/
|
|
15
|
+
async execute() {
|
|
16
|
+
const instructions = await this.fetchAndDecodeBytecode();
|
|
17
|
+
return this.executeInstructions(instructions);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Executes the provided instructions in the current context.
|
|
21
|
+
* This method is useful for testing and debugging.
|
|
22
|
+
*/
|
|
23
|
+
async executeInstructions(instructions) {
|
|
24
|
+
assert(instructions.length > 0);
|
|
25
|
+
try {
|
|
26
|
+
// Execute instruction pointed to by the current program counter
|
|
27
|
+
// continuing until the machine state signifies a halt
|
|
28
|
+
while (!this.context.machineState.halted) {
|
|
29
|
+
const instruction = instructions[this.context.machineState.pc];
|
|
30
|
+
assert(!!instruction); // This should never happen
|
|
31
|
+
this.log(`Executing PC=${this.context.machineState.pc}: ${instruction.toString()}`);
|
|
32
|
+
// Execute the instruction.
|
|
33
|
+
// Normal returns and reverts will return normally here.
|
|
34
|
+
// "Exceptional halts" will throw.
|
|
35
|
+
await instruction.execute(this.context);
|
|
36
|
+
if (this.context.machineState.pc >= instructions.length) {
|
|
37
|
+
this.log('Passed end of program!');
|
|
38
|
+
throw new InvalidProgramCounterError(this.context.machineState.pc, /*max=*/ instructions.length);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Return results for processing by calling context
|
|
42
|
+
const results = this.context.machineState.getResults();
|
|
43
|
+
this.log(`Context execution results: ${results.toString()}`);
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
this.log('Exceptional halt');
|
|
48
|
+
if (!(e instanceof AvmExecutionError)) {
|
|
49
|
+
this.log(`Unknown error thrown by avm: ${e}`);
|
|
50
|
+
throw e;
|
|
51
|
+
}
|
|
52
|
+
// Return results for processing by calling context
|
|
53
|
+
// Note: "exceptional halts" cannot return data
|
|
54
|
+
const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [], /*revertReason=*/ e);
|
|
55
|
+
this.log(`Context execution results: ${results.toString()}`);
|
|
56
|
+
return results;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Fetch contract bytecode from world state and decode into executable instructions.
|
|
61
|
+
*/
|
|
62
|
+
async fetchAndDecodeBytecode() {
|
|
63
|
+
// NOTE: the following is mocked as getPublicBytecode does not exist yet
|
|
64
|
+
const selector = new FunctionSelector(0);
|
|
65
|
+
const bytecode = await this.context.worldState.hostStorage.contractsDb.getBytecode(this.context.environment.address, selector);
|
|
66
|
+
// This assumes that we will not be able to send messages to accounts without code
|
|
67
|
+
// Pending classes and instances impl details
|
|
68
|
+
if (!bytecode) {
|
|
69
|
+
throw new NoBytecodeForContractError(this.context.environment.address);
|
|
70
|
+
}
|
|
71
|
+
return decodeFromBytecode(bytecode);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX3NpbXVsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdm0vYXZtX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQWUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsTUFBTSxJQUFJLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUcxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFL0UsTUFBTSxPQUFPLFlBQVk7SUFHdkIsWUFBb0IsT0FBbUI7UUFBbkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUYvQixRQUFHLEdBQWdCLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFMUIsQ0FBQztJQUUzQzs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxZQUEyQjtRQUMxRCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUM7WUFDSCxnRUFBZ0U7WUFDaEUsc0RBQXNEO1lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxXQUFX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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AztecAddress } from '@aztec/circuits.js';
|
|
2
|
+
/**
|
|
3
|
+
* Avm-specific errors should derive from this
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class AvmExecutionError extends Error {
|
|
6
|
+
constructor(message: string, ...rest: any[]);
|
|
7
|
+
}
|
|
8
|
+
export declare class NoBytecodeForContractError extends AvmExecutionError {
|
|
9
|
+
constructor(contractAddress: AztecAddress);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Error is thrown when the program counter goes to an invalid location.
|
|
13
|
+
* There is no instruction at the provided pc
|
|
14
|
+
*/
|
|
15
|
+
export declare class InvalidProgramCounterError extends AvmExecutionError {
|
|
16
|
+
constructor(pc: number, max: number);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Error thrown during an instruction's execution (during its execute()).
|
|
20
|
+
*/
|
|
21
|
+
export declare class InstructionExecutionError extends AvmExecutionError {
|
|
22
|
+
constructor(message: string);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Error thrown on failed AVM memory tag check.
|
|
26
|
+
*/
|
|
27
|
+
export declare class TagCheckError extends AvmExecutionError {
|
|
28
|
+
constructor(offset: number, gotTag: string, expectedTag: string);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/avm/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,8BAAsB,iBAAkB,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAI5C;AAED,qBAAa,0BAA2B,SAAQ,iBAAiB;gBACnD,eAAe,EAAE,YAAY;CAI1C;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,iBAAiB;gBACnD,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAIpC;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;gBAClD,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,iBAAiB;gBACtC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAIhE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avm-specific errors should derive from this
|
|
3
|
+
*/
|
|
4
|
+
export class AvmExecutionError extends Error {
|
|
5
|
+
constructor(message, ...rest) {
|
|
6
|
+
super(message, ...rest);
|
|
7
|
+
this.name = 'AvmInterpreterError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class NoBytecodeForContractError extends AvmExecutionError {
|
|
11
|
+
constructor(contractAddress) {
|
|
12
|
+
super(`No bytecode found at: ${contractAddress}`);
|
|
13
|
+
this.name = 'NoBytecodeFoundInterpreterError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Error is thrown when the program counter goes to an invalid location.
|
|
18
|
+
* There is no instruction at the provided pc
|
|
19
|
+
*/
|
|
20
|
+
export class InvalidProgramCounterError extends AvmExecutionError {
|
|
21
|
+
constructor(pc, max) {
|
|
22
|
+
super(`Invalid program counter ${pc}, max is ${max}`);
|
|
23
|
+
this.name = 'InvalidProgramCounterError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Error thrown during an instruction's execution (during its execute()).
|
|
28
|
+
*/
|
|
29
|
+
export class InstructionExecutionError extends AvmExecutionError {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = 'InstructionExecutionError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Error thrown on failed AVM memory tag check.
|
|
37
|
+
*/
|
|
38
|
+
export class TagCheckError extends AvmExecutionError {
|
|
39
|
+
constructor(offset, gotTag, expectedTag) {
|
|
40
|
+
super(`Memory offset ${offset} has tag ${gotTag}, expected ${expectedTag}`);
|
|
41
|
+
this.name = 'TagCheckError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F2bS9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGlCQUFrQixTQUFRLEtBQUs7SUFDbkQsWUFBWSxPQUFlLEVBQUUsR0FBRyxJQUFXO1FBQ3pDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTywwQkFBMkIsU0FBUSxpQkFBaUI7SUFDL0QsWUFBWSxlQUE2QjtRQUN2QyxLQUFLLENBQUMseUJBQXlCLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsaUJBQWlCO0lBQy9ELFlBQVksRUFBVSxFQUFFLEdBQVc7UUFDakMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsSUFBSSxHQUFHLDRCQUE0QixDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGlCQUFpQjtJQUM5RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsaUJBQWlCO0lBQ2xELFlBQVksTUFBYyxFQUFFLE1BQWMsRUFBRSxXQUFtQjtRQUM3RCxLQUFLLENBQUMsaUJBQWlCLE1BQU0sWUFBWSxNQUFNLGNBQWMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM5QixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { GlobalVariables } from '@aztec/circuits.js';
|
|
2
|
+
import { AvmContext } from '../avm_context.js';
|
|
3
|
+
import { AvmExecutionEnvironment } from '../avm_execution_environment.js';
|
|
4
|
+
import { AvmMachineState } from '../avm_machine_state.js';
|
|
5
|
+
import { AvmWorldStateJournal } from '../journal/journal.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a new AVM context with default values.
|
|
8
|
+
*/
|
|
9
|
+
export declare function initContext(overrides?: {
|
|
10
|
+
worldState?: AvmWorldStateJournal;
|
|
11
|
+
env?: AvmExecutionEnvironment;
|
|
12
|
+
machineState?: AvmMachineState;
|
|
13
|
+
}): AvmContext;
|
|
14
|
+
/** Creates an empty world state with mocked storage. */
|
|
15
|
+
export declare function initMockWorldStateJournal(): AvmWorldStateJournal;
|
|
16
|
+
/**
|
|
17
|
+
* Create an empty instance of the Execution Environment where all values are zero, unless overridden in the overrides object
|
|
18
|
+
*/
|
|
19
|
+
export declare function initExecutionEnvironment(overrides?: Partial<AvmExecutionEnvironment>): AvmExecutionEnvironment;
|
|
20
|
+
/**
|
|
21
|
+
* Create an empty instance of the Execution Environment where all values are zero, unless overridden in the overrides object
|
|
22
|
+
*/
|
|
23
|
+
export declare function initGlobalVariables(overrides?: Partial<GlobalVariables>): GlobalVariables;
|
|
24
|
+
/**
|
|
25
|
+
* Create an empty instance of the Machine State where all values are zero, unless overridden in the overrides object
|
|
26
|
+
*/
|
|
27
|
+
export declare function initMachineState(overrides?: Partial<AvmMachineState>): AvmMachineState;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/avm/fixtures/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE;IACtC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,GAAG,CAAC,EAAE,uBAAuB,CAAC;IAC9B,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC,GAAG,UAAU,CAMb;AAED,wDAAwD;AACxD,wBAAgB,yBAAyB,IAAI,oBAAoB,CAGhE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,uBAAuB,CAgB9G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAOzF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAMtF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { GlobalVariables } from '@aztec/circuits.js';
|
|
2
|
+
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
3
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { mock } from 'jest-mock-extended';
|
|
6
|
+
import { AvmContext } from '../avm_context.js';
|
|
7
|
+
import { AvmExecutionEnvironment } from '../avm_execution_environment.js';
|
|
8
|
+
import { AvmMachineState } from '../avm_machine_state.js';
|
|
9
|
+
import { HostStorage } from '../journal/host_storage.js';
|
|
10
|
+
import { AvmWorldStateJournal } from '../journal/journal.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create a new AVM context with default values.
|
|
13
|
+
*/
|
|
14
|
+
export function initContext(overrides) {
|
|
15
|
+
return new AvmContext(overrides?.worldState || initMockWorldStateJournal(), overrides?.env || initExecutionEnvironment(), overrides?.machineState || initMachineState());
|
|
16
|
+
}
|
|
17
|
+
/** Creates an empty world state with mocked storage. */
|
|
18
|
+
export function initMockWorldStateJournal() {
|
|
19
|
+
const hostStorage = new HostStorage(mock(), mock(), mock());
|
|
20
|
+
return new AvmWorldStateJournal(hostStorage);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create an empty instance of the Execution Environment where all values are zero, unless overridden in the overrides object
|
|
24
|
+
*/
|
|
25
|
+
export function initExecutionEnvironment(overrides) {
|
|
26
|
+
return new AvmExecutionEnvironment(overrides?.address ?? AztecAddress.zero(), overrides?.storageAddress ?? AztecAddress.zero(), overrides?.origin ?? AztecAddress.zero(), overrides?.sender ?? AztecAddress.zero(), overrides?.portal ?? EthAddress.ZERO, overrides?.feePerL1Gas ?? Fr.zero(), overrides?.feePerL2Gas ?? Fr.zero(), overrides?.feePerDaGas ?? Fr.zero(), overrides?.contractCallDepth ?? Fr.zero(), overrides?.globals ?? GlobalVariables.empty(), overrides?.isStaticCall ?? false, overrides?.isDelegateCall ?? false, overrides?.calldata ?? []);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create an empty instance of the Execution Environment where all values are zero, unless overridden in the overrides object
|
|
30
|
+
*/
|
|
31
|
+
export function initGlobalVariables(overrides) {
|
|
32
|
+
return new GlobalVariables(overrides?.chainId ?? Fr.zero(), overrides?.version ?? Fr.zero(), overrides?.blockNumber ?? Fr.zero(), overrides?.timestamp ?? Fr.zero());
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create an empty instance of the Machine State where all values are zero, unless overridden in the overrides object
|
|
36
|
+
*/
|
|
37
|
+
export function initMachineState(overrides) {
|
|
38
|
+
return AvmMachineState.fromState({
|
|
39
|
+
l1GasLeft: overrides?.l1GasLeft ?? 0,
|
|
40
|
+
l2GasLeft: overrides?.l2GasLeft ?? 0,
|
|
41
|
+
daGasLeft: overrides?.daGasLeft ?? 0,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXZtL2ZpeHR1cmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0Q7O0dBRUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLFNBSTNCO0lBQ0MsT0FBTyxJQUFJLFVBQVUsQ0FDbkIsU0FBUyxFQUFFLFVBQVUsSUFBSSx5QkFBeUIsRUFBRSxFQUNwRCxTQUFTLEVBQUUsR0FBRyxJQUFJLHdCQUF3QixFQUFFLEVBQzVDLFNBQVMsRUFBRSxZQUFZLElBQUksZ0JBQWdCLEVBQUUsQ0FDOUMsQ0FBQztBQUNKLENBQUM7QUFFRCx3REFBd0Q7QUFDeEQsTUFBTSxVQUFVLHlCQUF5QjtJQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQWlCLEVBQUUsSUFBSSxFQUFxQixFQUFFLElBQUksRUFBaUIsQ0FBQyxDQUFDO0lBQzdHLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsU0FBNEM7SUFDbkYsT0FBTyxJQUFJLHVCQUF1QixDQUNoQyxTQUFTLEVBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFDekMsU0FBUyxFQUFFLGNBQWMsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQ2hELFNBQVMsRUFBRSxNQUFNLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxFQUN4QyxTQUFTLEVBQUUsTUFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFDeEMsU0FBUyxFQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxFQUNwQyxTQUFTLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFDbkMsU0FBUyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQ25DLFNBQVMsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUNuQyxTQUFTLEVBQUUsaUJBQWlCLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUN6QyxTQUFTLEVBQUUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFDN0MsU0FBUyxFQUFFLFlBQVksSUFBSSxLQUFLLEVBQ2hDLFNBQVMsRUFBRSxjQUFjLElBQUksS0FBSyxFQUNsQyxTQUFTLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxTQUFvQztJQUN0RSxPQUFPLElBQUksZUFBZSxDQUN4QixTQUFTLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFDL0IsU0FBUyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQy9CLFNBQVMsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUNuQyxTQUFTLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFvQztJQUNuRSxPQUFPLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDL0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLElBQUksQ0FBQztRQUNwQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsSUFBSSxDQUFDO1FBQ3BDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxJQUFJLENBQUM7S0FDckMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CommitmentsDB, PublicContractsDB, PublicStateDB } from '../../index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Host storage
|
|
4
|
+
*
|
|
5
|
+
* A wrapper around the node dbs
|
|
6
|
+
*/
|
|
7
|
+
export declare class HostStorage {
|
|
8
|
+
readonly publicStateDb: PublicStateDB;
|
|
9
|
+
readonly contractsDb: PublicContractsDB;
|
|
10
|
+
readonly commitmentsDb: CommitmentsDB;
|
|
11
|
+
constructor(publicStateDb: PublicStateDB, contractsDb: PublicContractsDB, commitmentsDb: CommitmentsDB);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=host_storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host_storage.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/host_storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEjF;;;;GAIG;AACH,qBAAa,WAAW;IACtB,SAAgB,aAAa,EAAE,aAAa,CAAC;IAE7C,SAAgB,WAAW,EAAE,iBAAiB,CAAC;IAE/C,SAAgB,aAAa,EAAE,aAAa,CAAC;gBAEjC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa;CAKvG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host storage
|
|
3
|
+
*
|
|
4
|
+
* A wrapper around the node dbs
|
|
5
|
+
*/
|
|
6
|
+
export class HostStorage {
|
|
7
|
+
constructor(publicStateDb, contractsDb, commitmentsDb) {
|
|
8
|
+
this.publicStateDb = publicStateDb;
|
|
9
|
+
this.contractsDb = contractsDb;
|
|
10
|
+
this.commitmentsDb = commitmentsDb;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdF9zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F2bS9qb3VybmFsL2hvc3Rfc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFPdEIsWUFBWSxhQUE0QixFQUFFLFdBQThCLEVBQUUsYUFBNEI7UUFDcEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './host_storage.js';
|
|
2
|
+
export * from './journal.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXZtL2pvdXJuYWwvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGNBQWMsQ0FBQyJ9
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { HostStorage } from './host_storage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Data held within the journal
|
|
5
|
+
*/
|
|
6
|
+
export type JournalData = {
|
|
7
|
+
newNoteHashes: Fr[];
|
|
8
|
+
newNullifiers: Fr[];
|
|
9
|
+
newL1Messages: Fr[][];
|
|
10
|
+
newLogs: Fr[][];
|
|
11
|
+
/** contract address -\> key -\> value */
|
|
12
|
+
currentStorageValue: Map<bigint, Map<bigint, Fr>>;
|
|
13
|
+
/** contract address -\> key -\> value[] (stored in order of access) */
|
|
14
|
+
storageWrites: Map<bigint, Map<bigint, Fr[]>>;
|
|
15
|
+
/** contract address -\> key -\> value[] (stored in order of access) */
|
|
16
|
+
storageReads: Map<bigint, Map<bigint, Fr[]>>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* A cache of the current state of the AVM
|
|
20
|
+
* The interpreter should make any state queries through this object
|
|
21
|
+
*
|
|
22
|
+
* When a nested context succeeds, it's journal is merge into the parent
|
|
23
|
+
* When a call fails, it's journal is discarded and the parent is used from this point forward
|
|
24
|
+
* When a call succeeds's we can merge a child into its parent
|
|
25
|
+
*/
|
|
26
|
+
export declare class AvmWorldStateJournal {
|
|
27
|
+
/** Reference to node storage */
|
|
28
|
+
readonly hostStorage: HostStorage;
|
|
29
|
+
private storageReads;
|
|
30
|
+
private storageWrites;
|
|
31
|
+
private newNoteHashes;
|
|
32
|
+
private newNullifiers;
|
|
33
|
+
private newL1Messages;
|
|
34
|
+
private newLogs;
|
|
35
|
+
private currentStorageValue;
|
|
36
|
+
private parentJournal;
|
|
37
|
+
constructor(hostStorage: HostStorage, parentJournal?: AvmWorldStateJournal);
|
|
38
|
+
/**
|
|
39
|
+
* Create a new world state journal forked from this one
|
|
40
|
+
*/
|
|
41
|
+
fork(): AvmWorldStateJournal;
|
|
42
|
+
/**
|
|
43
|
+
* Write storage into journal
|
|
44
|
+
*
|
|
45
|
+
* @param contractAddress -
|
|
46
|
+
* @param key -
|
|
47
|
+
* @param value -
|
|
48
|
+
*/
|
|
49
|
+
writeStorage(contractAddress: Fr, key: Fr, value: Fr): void;
|
|
50
|
+
/**
|
|
51
|
+
* Read storage from journal
|
|
52
|
+
* Read from host storage on cache miss
|
|
53
|
+
*
|
|
54
|
+
* @param contractAddress -
|
|
55
|
+
* @param key -
|
|
56
|
+
* @returns current value
|
|
57
|
+
*/
|
|
58
|
+
readStorage(contractAddress: Fr, key: Fr): Promise<Fr>;
|
|
59
|
+
/**
|
|
60
|
+
* We want to keep track of all performed reads in the journal
|
|
61
|
+
* This information is hinted to the avm circuit
|
|
62
|
+
|
|
63
|
+
* @param contractAddress -
|
|
64
|
+
* @param key -
|
|
65
|
+
* @param value -
|
|
66
|
+
*/
|
|
67
|
+
journalUpdate(map: Map<bigint, Map<bigint, Fr[]>>, contractAddress: Fr, key: Fr, value: Fr): void;
|
|
68
|
+
private journalRead;
|
|
69
|
+
private journalWrite;
|
|
70
|
+
writeNoteHash(noteHash: Fr): void;
|
|
71
|
+
writeL1Message(message: Fr[]): void;
|
|
72
|
+
writeNullifier(nullifier: Fr): void;
|
|
73
|
+
writeLog(log: Fr[]): void;
|
|
74
|
+
/**
|
|
75
|
+
* Accept nested world state, merging in its journal, and accepting its state modifications
|
|
76
|
+
* - Utxo objects are concatenated
|
|
77
|
+
* - Public state changes are merged, with the value in the incoming journal taking precedent
|
|
78
|
+
* - Public state journals (r/w logs), with the accessing being appended in chronological order
|
|
79
|
+
*/
|
|
80
|
+
acceptNestedWorldState(nestedJournal: AvmWorldStateJournal): void;
|
|
81
|
+
/**
|
|
82
|
+
* Reject nested world state, merging in its journal, but not accepting its state modifications
|
|
83
|
+
* - Utxo objects are concatenated
|
|
84
|
+
* - Public state changes are dropped
|
|
85
|
+
* - Public state journals (r/w logs) are maintained, with the accessing being appended in chronological order
|
|
86
|
+
*/
|
|
87
|
+
rejectNestedWorldState(nestedJournal: AvmWorldStateJournal): void;
|
|
88
|
+
/**
|
|
89
|
+
* Access the current state of the journal
|
|
90
|
+
*
|
|
91
|
+
* @returns a JournalData object
|
|
92
|
+
*/
|
|
93
|
+
flush(): JournalData;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,EAAE,EAAE,CAAC;IACpB,aAAa,EAAE,EAAE,EAAE,CAAC;IACpB,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;IACtB,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;IAEhB,yCAAyC;IACzC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAElD,uEAAuE;IACvE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,uEAAuE;IACvE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;CAC9C,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAC/B,gCAAgC;IAChC,SAAgB,WAAW,EAAE,WAAW,CAAC;IAIzC,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,aAAa,CAA6C;IAGlE,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,aAAa,CAAY;IAGjC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,OAAO,CAAc;IAG7B,OAAO,CAAC,mBAAmB,CAA2C;IAEtE,OAAO,CAAC,aAAa,CAAmC;gBAE5C,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,oBAAoB;IAK1E;;OAEG;IACI,IAAI;IAIX;;;;;;OAMG;IACI,YAAY,CAAC,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;IAY3D;;;;;;;OAOG;IACU,WAAW,CAAC,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAkBnE;;;;;;;OAOG;IACH,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI;IAgBjG,OAAO,CAAC,WAAW,CAAoD;IAEvE,OAAO,CAAC,YAAY,CAAqD;IAElE,aAAa,CAAC,QAAQ,EAAE,EAAE;IAI1B,cAAc,CAAC,OAAO,EAAE,EAAE,EAAE;IAI5B,cAAc,CAAC,SAAS,EAAE,EAAE;IAI5B,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE;IAIzB;;;;;OAKG;IACI,sBAAsB,CAAC,aAAa,EAAE,oBAAoB;IAejE;;;;;OAKG;IACI,sBAAsB,CAAC,aAAa,EAAE,oBAAoB;IAMjE;;;;OAIG;IACI,KAAK,IAAI,WAAW;CAW5B"}
|