@aztec/simulator 0.0.1-commit.2ed92850 → 0.0.1-commit.3d8f95d

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.
Files changed (102) hide show
  1. package/dest/private/acvm/acvm.d.ts +4 -2
  2. package/dest/private/acvm/acvm.d.ts.map +1 -1
  3. package/dest/private/acvm/acvm.js +4 -3
  4. package/dest/private/acvm_native.d.ts +5 -3
  5. package/dest/private/acvm_native.d.ts.map +1 -1
  6. package/dest/private/acvm_native.js +8 -6
  7. package/dest/private/acvm_wasm.d.ts +4 -3
  8. package/dest/private/acvm_wasm.d.ts.map +1 -1
  9. package/dest/private/acvm_wasm.js +4 -4
  10. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  11. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  12. package/dest/private/circuit_recording/circuit_recorder.js +5 -3
  13. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  14. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  16. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  17. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  18. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  19. package/dest/private/factory.d.ts +3 -3
  20. package/dest/private/factory.d.ts.map +1 -1
  21. package/dest/private/factory.js +7 -4
  22. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  23. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  24. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  25. package/dest/public/avm/opcodes/accrued_substate.d.ts +3 -4
  26. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  27. package/dest/public/avm/opcodes/accrued_substate.js +8 -12
  28. package/dest/public/executor_metrics.d.ts +1 -1
  29. package/dest/public/executor_metrics.d.ts.map +1 -1
  30. package/dest/public/executor_metrics.js +7 -2
  31. package/dest/public/fixtures/opcode_spammer.d.ts +3 -4
  32. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
  33. package/dest/public/fixtures/opcode_spammer.js +10 -50
  34. package/dest/public/public_db_sources.d.ts +4 -3
  35. package/dest/public/public_db_sources.d.ts.map +1 -1
  36. package/dest/public/public_db_sources.js +4 -4
  37. package/dest/public/public_processor/public_processor.d.ts +5 -3
  38. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  39. package/dest/public/public_processor/public_processor.js +8 -5
  40. package/dest/public/public_processor/public_processor_metrics.d.ts +2 -2
  41. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  42. package/dest/public/public_processor/public_processor_metrics.js +20 -4
  43. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
  44. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  45. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +2 -2
  46. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +5 -5
  47. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  48. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +8 -8
  49. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
  50. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  51. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +5 -5
  52. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
  53. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
  54. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +6 -6
  55. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
  56. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
  57. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
  58. package/dest/public/public_tx_simulator/factories.d.ts +3 -2
  59. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  60. package/dest/public/public_tx_simulator/factories.js +3 -3
  61. package/dest/public/public_tx_simulator/public_tx_context.d.ts +4 -3
  62. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  63. package/dest/public/public_tx_simulator/public_tx_context.js +8 -8
  64. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +4 -3
  65. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  66. package/dest/public/public_tx_simulator/public_tx_simulator.js +5 -3
  67. package/dest/public/side_effect_trace.d.ts +4 -4
  68. package/dest/public/side_effect_trace.d.ts.map +1 -1
  69. package/dest/public/side_effect_trace.js +3 -3
  70. package/dest/public/state_manager/state_manager.d.ts +10 -4
  71. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  72. package/dest/public/state_manager/state_manager.js +12 -5
  73. package/dest/public/test_executor_metrics.d.ts +3 -2
  74. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  75. package/dest/public/test_executor_metrics.js +2 -2
  76. package/package.json +16 -16
  77. package/src/private/acvm/acvm.ts +4 -3
  78. package/src/private/acvm_native.ts +11 -5
  79. package/src/private/acvm_wasm.ts +7 -3
  80. package/src/private/circuit_recording/circuit_recorder.ts +5 -3
  81. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  82. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  83. package/src/private/factory.ts +7 -4
  84. package/src/public/avm/fixtures/account_proof.json +553 -0
  85. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  86. package/src/public/avm/opcodes/accrued_substate.ts +7 -15
  87. package/src/public/executor_metrics.ts +4 -1
  88. package/src/public/fixtures/opcode_spammer.ts +12 -45
  89. package/src/public/public_db_sources.ts +15 -5
  90. package/src/public/public_processor/public_processor.ts +18 -5
  91. package/src/public/public_processor/public_processor_metrics.ts +10 -4
  92. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +6 -3
  93. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +9 -6
  94. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +6 -4
  95. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +7 -5
  96. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
  97. package/src/public/public_tx_simulator/factories.ts +4 -2
  98. package/src/public/public_tx_simulator/public_tx_context.ts +13 -6
  99. package/src/public/public_tx_simulator/public_tx_simulator.ts +6 -2
  100. package/src/public/side_effect_trace.ts +5 -2
  101. package/src/public/state_manager/state_manager.ts +27 -4
  102. package/src/public/test_executor_metrics.ts +3 -3
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Fetches an account proof from the Ethereum mainnet and saves it as account_proof.json.
3
+ * This script is not using any Aztec library code, so it's easily portable.
4
+ */
5
+ import fs from 'fs';
6
+ import { dirname, join } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import { createPublicClient, fromRlp, hexToBytes, http } from 'viem';
9
+ import { mainnet } from 'viem/chains';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+
13
+ const RPC_URL = process.env.RPC_URL;
14
+ const ADDRESS = (process.env.ADDRESS || '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045') as `0x${string}`;
15
+ const BLOCK_TAG = process.env.BLOCK_NUMBER ? BigInt(process.env.BLOCK_NUMBER) : 'latest';
16
+ const MAX_ACCOUNT_PATH = 15;
17
+
18
+ function padTo(arr: number[], len: number) {
19
+ return [...arr, ...Array(len - arr.length).fill(0)].slice(0, len);
20
+ }
21
+
22
+ function toBytes(hex: `0x${string}`) {
23
+ return Array.from(hexToBytes(hex));
24
+ }
25
+
26
+ function bytesToU64s(bytes: number[]) {
27
+ const paddedBytes = padTo(bytes, 32);
28
+ return Array.from({ length: 4 }, (_, i) => {
29
+ let val = 0n;
30
+ for (let j = 0; j < 8; j++) {
31
+ val += BigInt(paddedBytes[i * 8 + j]) << BigInt(j * 8);
32
+ }
33
+ return val.toString();
34
+ });
35
+ }
36
+
37
+ function toBytesAndLen(val: bigint | number) {
38
+ if (val === 0n || val === 0) {
39
+ return { bytes: [0], length: 0 };
40
+ }
41
+ let hex = val.toString(16);
42
+ if (hex.length % 2) {
43
+ hex = '0' + hex;
44
+ }
45
+ const bytes = toBytes(`0x${hex}`);
46
+ return { bytes, length: bytes.length };
47
+ }
48
+
49
+ function parseNode(rlp: `0x${string}`) {
50
+ // Should be safe when working with branches and extensions without embedded children.
51
+ const decoded = fromRlp(rlp) as `0x${string}`[];
52
+ const node = {
53
+ rows: Array(16)
54
+ .fill(0)
55
+ .map(() => Array(32).fill(0)),
56
+ row_exist: Array(16).fill(false),
57
+ node_type: 0,
58
+ };
59
+
60
+ if (decoded.length === 17) {
61
+ for (let i = 0; i < 16; i++) {
62
+ if (decoded[i] !== '0x') {
63
+ node.row_exist[i] = true;
64
+ node.rows[i] = padTo(toBytes(decoded[i]), 32);
65
+ }
66
+ }
67
+ } else if (decoded.length === 2) {
68
+ const keyBytes = toBytes(decoded[0]);
69
+ const prefix = keyBytes[0];
70
+ if (prefix >> 4 >= 2) {
71
+ throw new Error('Unsupported: leaf node in proof path');
72
+ }
73
+ node.node_type = 1;
74
+ // Extension header format expected by the noir code: check out storage_proof types.nr.
75
+ node.rows[0][0] = prefix >> 4;
76
+ node.rows[0][8] = prefix & 0x0f;
77
+ node.rows[0][16] = keyBytes.length - 1;
78
+
79
+ for (let i = 1; i < keyBytes.length && i < 32; i++) {
80
+ node.rows[1][i - 1] = keyBytes[i];
81
+ }
82
+ node.rows[2] = padTo(toBytes(decoded[1]), 32);
83
+ node.row_exist[0] = node.row_exist[1] = node.row_exist[2] = true;
84
+ }
85
+ return node;
86
+ }
87
+
88
+ function parseProof(proof: `0x${string}`[], maxLen: number) {
89
+ const nodes = proof.slice(0, -1).slice(0, maxLen).map(parseNode);
90
+ while (nodes.length < maxLen) {
91
+ nodes.push({
92
+ rows: Array(16)
93
+ .fill(0)
94
+ .map(() => Array(32).fill(0)),
95
+ row_exist: Array(16).fill(false),
96
+ node_type: 0,
97
+ });
98
+ }
99
+ return nodes;
100
+ }
101
+
102
+ function nodeToLibFormat(node: { rows: number[][]; row_exist: boolean[]; node_type: number }) {
103
+ return {
104
+ rows: node.rows.map(bytesToU64s),
105
+ row_exist: node.row_exist,
106
+ node_type: String(node.node_type),
107
+ };
108
+ }
109
+
110
+ async function main() {
111
+ if (!RPC_URL) {
112
+ throw new Error('RPC_URL is not set');
113
+ }
114
+ console.log(`Fetching account proof for ${ADDRESS}`);
115
+
116
+ const client = createPublicClient({
117
+ chain: mainnet,
118
+ transport: http(RPC_URL),
119
+ });
120
+
121
+ const [blockNumber, proof, block] = await Promise.all([
122
+ client.getBlockNumber(),
123
+ client.getProof({
124
+ address: ADDRESS,
125
+ storageKeys: [],
126
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
127
+ }),
128
+ client.getBlock({
129
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
130
+ }),
131
+ ]);
132
+
133
+ console.log(`Block: ${blockNumber}, Account nodes: ${proof.accountProof.length}`);
134
+
135
+ // The -1 is because the last node in the proof is the leaf, which is excluded from path verification.
136
+ const accountPathLen = proof.accountProof.length - 1;
137
+ if (accountPathLen > MAX_ACCOUNT_PATH) {
138
+ throw new Error(
139
+ `Account proof path length ${accountPathLen} exceeds MAX_ACCOUNT_PATH ${MAX_ACCOUNT_PATH}. Increase the limit.`,
140
+ );
141
+ }
142
+
143
+ const nonce = toBytesAndLen(proof.nonce);
144
+ const balance = toBytesAndLen(proof.balance);
145
+
146
+ const data = {
147
+ block_number: String(blockNumber),
148
+ node_length: String(accountPathLen),
149
+ root: bytesToU64s(toBytes(block.stateRoot)),
150
+ nodes: parseProof(proof.accountProof, MAX_ACCOUNT_PATH).map(nodeToLibFormat),
151
+ account: {
152
+ address: toBytes(ADDRESS).map(String),
153
+ balance: padTo(balance.bytes, 32).map(String),
154
+ balance_length: String(balance.length),
155
+ code_hash: bytesToU64s(toBytes(proof.codeHash)),
156
+ nonce: padTo(nonce.bytes, 8).map(String),
157
+ nonce_length: String(nonce.length),
158
+ storage_hash: bytesToU64s(toBytes(proof.storageHash)),
159
+ },
160
+ };
161
+
162
+ fs.writeFileSync(join(__dirname, 'account_proof.json'), JSON.stringify(data, null, 2));
163
+ console.log('account_proof.json generated');
164
+ }
165
+
166
+ main().catch(console.error);
@@ -88,18 +88,11 @@ export class NullifierExists extends Instruction {
88
88
  static type: string = 'NULLIFIEREXISTS';
89
89
  static readonly opcode: Opcode = Opcode.NULLIFIEREXISTS;
90
90
  // Informs (de)serialization. See Instruction.deserialize.
91
- static readonly wireFormat = [
92
- OperandType.UINT8,
93
- OperandType.UINT8,
94
- OperandType.UINT16,
95
- OperandType.UINT16,
96
- OperandType.UINT16,
97
- ];
91
+ static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
98
92
 
99
93
  constructor(
100
94
  private addressingMode: number,
101
- private nullifierOffset: number,
102
- private addressOffset: number,
95
+ private siloedNullifierOffset: number,
103
96
  private existsOffset: number,
104
97
  ) {
105
98
  super();
@@ -113,13 +106,12 @@ export class NullifierExists extends Instruction {
113
106
  this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
114
107
  );
115
108
 
116
- const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
117
- const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
118
- memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset);
109
+ const operands = [this.siloedNullifierOffset, this.existsOffset];
110
+ const [siloedNullifierOffset, existsOffset] = addressing.resolve(operands, memory);
111
+ memory.checkTag(TypeTag.FIELD, siloedNullifierOffset);
119
112
 
120
- const nullifier = memory.get(nullifierOffset).toFr();
121
- const address = memory.get(addressOffset).toAztecAddress();
122
- const exists = await context.persistableState.checkNullifierExists(address, nullifier);
113
+ const siloedNullifier = memory.get(siloedNullifierOffset).toFr();
114
+ const exists = await context.persistableState.checkSiloedNullifierExists(siloedNullifier);
123
115
 
124
116
  memory.set(existsOffset, exists ? new Uint1(1) : new Uint1(0));
125
117
  }
@@ -7,6 +7,7 @@ import {
7
7
  type TelemetryClient,
8
8
  type Tracer,
9
9
  type UpDownCounter,
10
+ createUpDownCounterWithDefault,
10
11
  } from '@aztec/telemetry-client';
11
12
 
12
13
  import type { ExecutorMetricsInterface } from './executor_metrics_interface.js';
@@ -25,7 +26,9 @@ export class ExecutorMetrics implements ExecutorMetricsInterface {
25
26
  this.tracer = client.getTracer(name);
26
27
  const meter = client.getMeter(name);
27
28
 
28
- this.fnCount = meter.createUpDownCounter(Metrics.PUBLIC_EXECUTOR_SIMULATION_COUNT);
29
+ this.fnCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_EXECUTOR_SIMULATION_COUNT, {
30
+ [Attributes.OK]: [true, false],
31
+ });
29
32
 
30
33
  this.fnDuration = meter.createHistogram(Metrics.PUBLIC_EXECUTOR_SIMULATION_DURATION);
31
34
 
@@ -164,7 +164,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
164
164
  import type { Bufferable } from '@aztec/foundation/serialize';
165
165
  import { type CallStackMetadata, PublicDataWrite, type PublicTxResult } from '@aztec/stdlib/avm';
166
166
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
167
- import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
167
+ import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
168
168
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
169
169
  import { MerkleTreeId } from '@aztec/stdlib/trees';
170
170
 
@@ -295,9 +295,8 @@ export interface SpamConfigsForOpcode {
295
295
  export const WARM_NOTE_HASH = new Fr(0xdeadbeefn);
296
296
  export const WARM_L1_TO_L2_MSG = new Fr(0xcafebabedeadbeefn);
297
297
 
298
- /** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */
299
- export const WARM_NULLIFIER = new Fr(0xdeadbeef0001n);
300
- export const WARM_NULLIFIER_ADDRESS = AztecAddress.fromNumber(0xbeef);
298
+ /** Warm nullifier constant - a pre-siloed nullifier value inserted directly into the tree */
299
+ export const WARM_SILOED_NULLIFIER = new Fr(0xdeadbeef0001n);
301
300
 
302
301
  /** Warm storage constants - storage is inserted for the deployed contract's address */
303
302
  export const WARM_STORAGE_SLOT = new Fr(0xdeadbeef0002n);
@@ -331,9 +330,8 @@ export async function insertWarmTreeEntries(
331
330
  // Insert into L1 to L2 message tree
332
331
  await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [WARM_L1_TO_L2_MSG]);
333
332
 
334
- // Insert siloed nullifier into nullifier tree
335
- const siloedNullifier = await siloNullifier(WARM_NULLIFIER_ADDRESS, WARM_NULLIFIER);
336
- await merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [siloedNullifier.toBuffer()]);
333
+ // Insert siloed nullifier into nullifier tree (already siloed - used directly by NULLIFIEREXISTS)
334
+ await merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [WARM_SILOED_NULLIFIER.toBuffer()]);
337
335
 
338
336
  // Insert storage value into public data tree
339
337
  const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, WARM_STORAGE_SLOT);
@@ -1060,56 +1058,25 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
1060
1058
  [Opcode.NULLIFIEREXISTS]: [
1061
1059
  {
1062
1060
  label: 'Non-existent nullifier',
1061
+ // NULLIFIEREXISTS now takes a siloed nullifier directly (no address parameter)
1063
1062
  setup: [
1064
- { offset: 0, value: new Field(Fr.random()) }, // random nullifier
1065
- { offset: 1, value: new Field(Fr.random()) }, // random address
1063
+ { offset: 0, value: new Field(Fr.random()) }, // random siloed nullifier (won't exist)
1066
1064
  ],
1067
1065
  targetInstructions: () => [
1068
- new NullifierExists(/*addressing_mode=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 1, /*existsOffset=*/ 2),
1066
+ new NullifierExists(/*addressing_mode=*/ 0, /*siloedNullifierOffset=*/ 0, /*existsOffset=*/ 1),
1069
1067
  ],
1070
1068
  },
1071
1069
  {
1072
1070
  label: 'Existing nullifier (warm - from tree)',
1073
- // Uses pre-inserted nullifier from insertWarmTreeEntries()
1071
+ // Uses pre-inserted siloed nullifier from insertWarmTreeEntries()
1072
+ // NULLIFIEREXISTS now takes a siloed nullifier directly
1074
1073
  setup: [
1075
- { offset: 0, value: new Field(WARM_NULLIFIER) }, // pre-inserted nullifier
1076
- { offset: 1, value: new Field(WARM_NULLIFIER_ADDRESS.toField()) }, // address it was siloed with
1074
+ { offset: 0, value: new Field(WARM_SILOED_NULLIFIER) }, // pre-inserted siloed nullifier
1077
1075
  ],
1078
1076
  targetInstructions: () => [
1079
- new NullifierExists(/*addressing_mode=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 1, /*existsOffset=*/ 2),
1077
+ new NullifierExists(/*addressing_mode=*/ 0, /*siloedNullifierOffset=*/ 0, /*existsOffset=*/ 1),
1080
1078
  ],
1081
1079
  },
1082
- {
1083
- label: 'Existing nullifier (warm - EMITNULLIFIER first)',
1084
- // Memory layout: nullifier (incremented), constant 1, current address (from GETENVVAR), revertSize, exists result
1085
- setup: [
1086
- { offset: 0, value: new Field(Fr.random()) }, // nullifier (will be incremented)
1087
- { offset: 1, value: new Field(1n) }, // constant 1 for ADD
1088
- () => [
1089
- // Get current contract address into offset 2
1090
- new GetEnvVar(/*addressing_mode=*/ 0, /*dstOffset=*/ 2, /*varEnum=*/ 0).as(
1091
- Opcode.GETENVVAR_16,
1092
- GetEnvVar.wireFormat16,
1093
- ),
1094
- ],
1095
- { offset: 3, value: new Uint32(0n) }, // revertSize
1096
- ],
1097
- targetInstructions: () => [
1098
- new EmitNullifier(/*addressing_mode=*/ 0, /*nullifierOffset=*/ 0),
1099
- new NullifierExists(/*addressing_mode=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 2, /*existsOffset=*/ 4),
1100
- new Add(/*addressing_mode=*/ 0, /*aOffset=*/ 0, /*bOffset=*/ 1, /*dstOffset=*/ 0).as(
1101
- Opcode.ADD_8,
1102
- Add.wireFormat8,
1103
- ), // nullifier++
1104
- ],
1105
- cleanupInstructions: () => [
1106
- new Revert(/*addressing_mode=*/ 0, /*retSizeOffset=*/ 3, /*returnOffset=*/ 0).as(
1107
- Opcode.REVERT_8,
1108
- Revert.wireFormat8,
1109
- ),
1110
- ],
1111
- limit: MAX_NULLIFIERS_PER_TX - 1,
1112
- },
1113
1080
  ],
1114
1081
 
1115
1082
  [Opcode.L1TOL2MSGEXISTS]: [
@@ -5,7 +5,7 @@ import {
5
5
  PUBLIC_DATA_SUBTREE_HEIGHT,
6
6
  } from '@aztec/constants';
7
7
  import { Fr } from '@aztec/foundation/curves/bn254';
8
- import { createLogger } from '@aztec/foundation/log';
8
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
9
9
  import { Timer } from '@aztec/foundation/timer';
10
10
  import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
11
11
  import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
@@ -46,9 +46,14 @@ import { L1ToL2MessageIndexOutOfRangeError, NoteHashIndexOutOfRangeError } from
46
46
  export class PublicContractsDB implements PublicContractsDBInterface {
47
47
  private contractStateStack: ContractsDbCheckpoint[] = [new ContractsDbCheckpoint()];
48
48
 
49
- private log = createLogger('simulator:contracts-data-source');
49
+ private log: Logger;
50
50
 
51
- constructor(private dataSource: ContractDataSource) {}
51
+ constructor(
52
+ private dataSource: ContractDataSource,
53
+ bindings?: LoggerBindings,
54
+ ) {
55
+ this.log = createLogger('simulator:contracts-data-source', bindings);
56
+ }
52
57
 
53
58
  public async addContracts(contractDeploymentData: ContractDeploymentData): Promise<void> {
54
59
  const currentState = this.getCurrentState();
@@ -208,9 +213,14 @@ export class PublicContractsDB implements PublicContractsDBInterface {
208
213
  * to decide whether to use hints or not (same with tracing, etc).
209
214
  */
210
215
  export class PublicTreesDB implements PublicStateDBInterface {
211
- private logger = createLogger('simulator:public-trees-db');
216
+ private logger: Logger;
212
217
 
213
- constructor(private readonly db: MerkleTreeWriteOperations) {}
218
+ constructor(
219
+ private readonly db: MerkleTreeWriteOperations,
220
+ bindings?: LoggerBindings,
221
+ ) {
222
+ this.logger = createLogger('simulator:public-trees-db', bindings);
223
+ }
214
224
 
215
225
  public async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
216
226
  const timer = new Timer();
@@ -1,7 +1,7 @@
1
1
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
5
  import { sleep } from '@aztec/foundation/sleep';
6
6
  import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
7
7
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
@@ -62,11 +62,15 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
62
62
  * Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
63
63
  */
64
64
  export class PublicProcessorFactory {
65
+ private log: Logger;
65
66
  constructor(
66
67
  private contractDataSource: ContractDataSource,
67
68
  private dateProvider: DateProvider = new DateProvider(),
68
69
  protected telemetryClient: TelemetryClient = getTelemetryClient(),
69
- ) {}
70
+ bindings?: LoggerBindings,
71
+ ) {
72
+ this.log = createLogger('simulator:public-processor-factory', bindings);
73
+ }
70
74
 
71
75
  /**
72
76
  * Creates a new instance of a PublicProcessor.
@@ -79,7 +83,8 @@ export class PublicProcessorFactory {
79
83
  globalVariables: GlobalVariables,
80
84
  config: PublicSimulatorConfig,
81
85
  ): PublicProcessor {
82
- const contractsDB = new PublicContractsDB(this.contractDataSource);
86
+ const bindings = this.log.getBindings();
87
+ const contractsDB = new PublicContractsDB(this.contractDataSource, bindings);
83
88
 
84
89
  const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
85
90
  const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
@@ -91,6 +96,7 @@ export class PublicProcessorFactory {
91
96
  publicTxSimulator,
92
97
  this.dateProvider,
93
98
  this.telemetryClient,
99
+ createLogger('simulator:public-processor', bindings),
94
100
  );
95
101
  }
96
102
 
@@ -100,7 +106,14 @@ export class PublicProcessorFactory {
100
106
  globalVariables: GlobalVariables,
101
107
  config?: Partial<PublicTxSimulatorConfig>,
102
108
  ): PublicTxSimulatorInterface {
103
- return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
109
+ return new TelemetryCppPublicTxSimulator(
110
+ merkleTree,
111
+ contractsDB,
112
+ globalVariables,
113
+ this.telemetryClient,
114
+ config,
115
+ this.log.getBindings(),
116
+ );
104
117
  }
105
118
  }
106
119
 
@@ -125,7 +138,7 @@ export class PublicProcessor implements Traceable {
125
138
  protected publicTxSimulator: PublicTxSimulatorInterface,
126
139
  private dateProvider: DateProvider,
127
140
  telemetryClient: TelemetryClient = getTelemetryClient(),
128
- private log = createLogger('simulator:public-processor'),
141
+ private log: Logger,
129
142
  private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
130
143
  ) {
131
144
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
@@ -1,6 +1,6 @@
1
1
  import type { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
2
2
  import type { Gas } from '@aztec/stdlib/gas';
3
- import type { TxExecutionPhase } from '@aztec/stdlib/tx';
3
+ import { TxExecutionPhase } from '@aztec/stdlib/tx';
4
4
  import {
5
5
  Attributes,
6
6
  type Gauge,
@@ -9,6 +9,7 @@ import {
9
9
  type TelemetryClient,
10
10
  type Tracer,
11
11
  type UpDownCounter,
12
+ createUpDownCounterWithDefault,
12
13
  } from '@aztec/telemetry-client';
13
14
 
14
15
  export class PublicProcessorMetrics {
@@ -35,13 +36,18 @@ export class PublicProcessorMetrics {
35
36
 
36
37
  this.txDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_DURATION);
37
38
 
38
- this.txCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_TX_COUNT);
39
+ this.txCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_COUNT, {
40
+ [Attributes.OK]: [true, false],
41
+ });
39
42
 
40
- this.txPhaseCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT);
43
+ this.txPhaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT);
41
44
 
42
45
  this.phaseDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_PHASE_DURATION);
43
46
 
44
- this.phaseCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_PHASE_COUNT);
47
+ this.phaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_PHASE_COUNT, {
48
+ [Attributes.TX_PHASE_NAME]: [TxExecutionPhase.SETUP, TxExecutionPhase.APP_LOGIC, TxExecutionPhase.TEARDOWN],
49
+ [Attributes.OK]: [true, false],
50
+ });
45
51
 
46
52
  this.bytecodeDeployed = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_DEPLOY_BYTECODE_SIZE);
47
53
 
@@ -1,5 +1,5 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { type Logger, createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
  import type { ContractProvider } from '@aztec/native';
4
4
  import { FunctionSelector } from '@aztec/stdlib/abi';
5
5
  import { deserializeFromMessagePack, serializeWithMessagePack } from '@aztec/stdlib/avm';
@@ -10,12 +10,15 @@ import type { GlobalVariables } from '@aztec/stdlib/tx';
10
10
  import type { PublicContractsDB } from '../public_db_sources.js';
11
11
 
12
12
  export class ContractProviderForCpp implements ContractProvider {
13
- private log: Logger = createLogger('simulator:contract_provider_for_cpp');
13
+ private log: Logger;
14
14
 
15
15
  constructor(
16
16
  private contractsDB: PublicContractsDB,
17
17
  private globalVariables: GlobalVariables,
18
- ) {}
18
+ bindings?: LoggerBindings,
19
+ ) {
20
+ this.log = createLogger('simulator:contract_provider_for_cpp', bindings);
21
+ }
19
22
 
20
23
  public getContractInstance = async (address: string): Promise<Buffer | undefined> => {
21
24
  this.log.trace(`Contract provider callback: getContractInstance(${address})`);
@@ -1,4 +1,4 @@
1
- import { type Logger, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
2
2
  import { sleep } from '@aztec/foundation/sleep';
3
3
  import { type CancellationToken, avmSimulate, cancelSimulation, createCancellationToken } from '@aztec/native';
4
4
  import { ProtocolContractsList } from '@aztec/protocol-contracts';
@@ -44,9 +44,10 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS
44
44
  contractsDB: PublicContractsDB,
45
45
  globalVariables: GlobalVariables,
46
46
  config?: Partial<PublicSimulatorConfig>,
47
+ bindings?: LoggerBindings,
47
48
  ) {
48
- super(merkleTree, contractsDB, globalVariables, config);
49
- this.log = createLogger(`simulator:cpp_public_tx_simulator`);
49
+ super(merkleTree, contractsDB, globalVariables, config, undefined, bindings);
50
+ this.log = createLogger(`simulator:cpp_public_tx_simulator`, bindings);
50
51
  }
51
52
 
52
53
  /**
@@ -84,7 +85,7 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS
84
85
  );
85
86
 
86
87
  // Create contract provider for callbacks to TypeScript PublicContractsDB from C++
87
- const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables);
88
+ const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables, this.bindings);
88
89
 
89
90
  // Serialize to msgpack and call the C++ simulator
90
91
  this.log.trace(`Serializing fast simulation inputs to msgpack...`);
@@ -171,8 +172,9 @@ export class MeasuredCppPublicTxSimulator extends CppPublicTxSimulator implement
171
172
  globalVariables: GlobalVariables,
172
173
  protected readonly metrics: ExecutorMetricsInterface,
173
174
  config?: Partial<PublicSimulatorConfig>,
175
+ bindings?: LoggerBindings,
174
176
  ) {
175
- super(merkleTree, contractsDB, globalVariables, config);
177
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
176
178
  }
177
179
 
178
180
  public override async simulate(tx: Tx, txLabel: string = 'unlabeledTx'): Promise<PublicTxResult> {
@@ -200,9 +202,10 @@ export class TelemetryCppPublicTxSimulator extends MeasuredCppPublicTxSimulator
200
202
  globalVariables: GlobalVariables,
201
203
  telemetryClient: TelemetryClient = getTelemetryClient(),
202
204
  config?: Partial<PublicSimulatorConfig>,
205
+ bindings?: LoggerBindings,
203
206
  ) {
204
207
  const metrics = new ExecutorMetrics(telemetryClient, 'CppPublicTxSimulator');
205
- super(merkleTree, contractsDB, globalVariables, metrics, config);
208
+ super(merkleTree, contractsDB, globalVariables, metrics, config, bindings);
206
209
  this.tracer = metrics.tracer;
207
210
  }
208
211
  }
@@ -1,4 +1,4 @@
1
- import { type Logger, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
2
2
  import { avmSimulateWithHintedDbs } from '@aztec/native';
3
3
  import {
4
4
  AvmCircuitInputs,
@@ -34,9 +34,10 @@ export class CppPublicTxSimulatorHintedDbs extends PublicTxSimulator implements
34
34
  contractsDB: PublicContractsDB,
35
35
  globalVariables: GlobalVariables,
36
36
  config?: Partial<PublicSimulatorConfig>,
37
+ bindings?: LoggerBindings,
37
38
  ) {
38
- super(merkleTree, contractsDB, globalVariables, config);
39
- this.log = createLogger(`simulator:cpp_public_tx_simulator_hinted_dbs`);
39
+ super(merkleTree, contractsDB, globalVariables, config, undefined, bindings);
40
+ this.log = createLogger(`simulator:cpp_public_tx_simulator_hinted_dbs`, bindings);
40
41
  }
41
42
 
42
43
  /**
@@ -115,8 +116,9 @@ export class MeasuredCppPublicTxSimulatorHintedDbs
115
116
  globalVariables: GlobalVariables,
116
117
  protected readonly metrics: ExecutorMetricsInterface,
117
118
  config?: Partial<PublicSimulatorConfig>,
119
+ bindings?: LoggerBindings,
118
120
  ) {
119
- super(merkleTree, contractsDB, globalVariables, config);
121
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
120
122
  }
121
123
 
122
124
  public override async simulate(tx: Tx, txLabel: string = 'unlabeledTx'): Promise<PublicTxResult> {
@@ -1,4 +1,4 @@
1
- import { type Logger, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
2
2
  import { avmSimulate } from '@aztec/native';
3
3
  import { ProtocolContractsList } from '@aztec/protocol-contracts';
4
4
  import {
@@ -37,9 +37,10 @@ export class CppVsTsPublicTxSimulator extends PublicTxSimulator implements Publi
37
37
  contractsDB: PublicContractsDB,
38
38
  globalVariables: GlobalVariables,
39
39
  config?: Partial<PublicSimulatorConfig>,
40
+ bindings?: LoggerBindings,
40
41
  ) {
41
- super(merkleTree, contractsDB, globalVariables, config);
42
- this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`);
42
+ super(merkleTree, contractsDB, globalVariables, config, undefined, bindings);
43
+ this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`, bindings);
43
44
  }
44
45
 
45
46
  /**
@@ -103,7 +104,7 @@ export class CppVsTsPublicTxSimulator extends PublicTxSimulator implements Publi
103
104
  );
104
105
 
105
106
  // Create contract provider for callbacks to TypeScript PublicContractsDB from C++
106
- const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables);
107
+ const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables, this.bindings);
107
108
 
108
109
  // Serialize to msgpack and call the C++ simulator
109
110
  this.log.debug(`Serializing fast simulation inputs to msgpack...`);
@@ -220,8 +221,9 @@ export class MeasuredCppVsTsPublicTxSimulator
220
221
  globalVariables: GlobalVariables,
221
222
  protected readonly metrics: ExecutorMetricsInterface,
222
223
  config?: Partial<PublicSimulatorConfig>,
224
+ bindings?: LoggerBindings,
223
225
  ) {
224
- super(merkleTree, contractsDB, globalVariables, config);
226
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
225
227
  }
226
228
 
227
229
  public override async simulate(tx: Tx, txLabel: string = 'unlabeledTx'): Promise<PublicTxResult> {
@@ -1,3 +1,4 @@
1
+ import type { LoggerBindings } from '@aztec/foundation/log';
1
2
  import {
2
3
  AvmCircuitInputs,
3
4
  AvmCircuitPublicInputs,
@@ -29,8 +30,9 @@ export class DumpingCppPublicTxSimulator extends CppPublicTxSimulator {
29
30
  globalVariables: GlobalVariables,
30
31
  config: Partial<PublicSimulatorConfig>,
31
32
  outputDir: string,
33
+ bindings?: LoggerBindings,
32
34
  ) {
33
- super(merkleTree, contractsDB, globalVariables, config);
35
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
34
36
  assert(config.collectHints === true, 'collectHints must be enabled to dump AVM circuit inputs');
35
37
  assert(config.collectPublicInputs === true, 'collectPublicInputs must be enabled to dump AVM circuit inputs');
36
38
  this.outputDir = outputDir;
@@ -1,3 +1,4 @@
1
+ import type { LoggerBindings } from '@aztec/foundation/log';
1
2
  import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
2
3
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
3
4
  import type { GlobalVariables } from '@aztec/stdlib/tx';
@@ -17,6 +18,7 @@ export function createPublicTxSimulatorForBlockBuilding(
17
18
  contractsDB: PublicContractsDB,
18
19
  globalVariables: GlobalVariables,
19
20
  telemetryClient: TelemetryClient,
21
+ bindings?: LoggerBindings,
20
22
  ) {
21
23
  const config = PublicSimulatorConfig.from({
22
24
  skipFeeEnforcement: false,
@@ -35,7 +37,7 @@ export function createPublicTxSimulatorForBlockBuilding(
35
37
  collectHints: true,
36
38
  collectPublicInputs: true,
37
39
  };
38
- return new DumpingCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, dumpingConfig, dumpDir);
40
+ return new DumpingCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, dumpingConfig, dumpDir, bindings);
39
41
  }
40
- return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, telemetryClient, config);
42
+ return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, telemetryClient, config, bindings);
41
43
  }