@aztec/aztec-node 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f

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 (41) hide show
  1. package/dest/aztec-node/block_response_helpers.d.ts +25 -0
  2. package/dest/aztec-node/block_response_helpers.d.ts.map +1 -0
  3. package/dest/aztec-node/block_response_helpers.js +112 -0
  4. package/dest/aztec-node/config.d.ts +14 -8
  5. package/dest/aztec-node/config.d.ts.map +1 -1
  6. package/dest/aztec-node/config.js +16 -8
  7. package/dest/aztec-node/node_metrics.d.ts +1 -1
  8. package/dest/aztec-node/node_metrics.d.ts.map +1 -1
  9. package/dest/aztec-node/node_metrics.js +9 -16
  10. package/dest/aztec-node/public_data_overrides.d.ts +13 -0
  11. package/dest/aztec-node/public_data_overrides.d.ts.map +1 -0
  12. package/dest/aztec-node/public_data_overrides.js +21 -0
  13. package/dest/aztec-node/server.d.ts +101 -187
  14. package/dest/aztec-node/server.d.ts.map +1 -1
  15. package/dest/aztec-node/server.js +1528 -513
  16. package/dest/sentinel/config.d.ts +3 -2
  17. package/dest/sentinel/config.d.ts.map +1 -1
  18. package/dest/sentinel/config.js +15 -5
  19. package/dest/sentinel/factory.d.ts +5 -3
  20. package/dest/sentinel/factory.d.ts.map +1 -1
  21. package/dest/sentinel/factory.js +5 -5
  22. package/dest/sentinel/sentinel.d.ts +137 -12
  23. package/dest/sentinel/sentinel.d.ts.map +1 -1
  24. package/dest/sentinel/sentinel.js +273 -100
  25. package/dest/sentinel/store.d.ts +8 -8
  26. package/dest/sentinel/store.d.ts.map +1 -1
  27. package/dest/sentinel/store.js +33 -21
  28. package/dest/test/index.d.ts +3 -3
  29. package/dest/test/index.d.ts.map +1 -1
  30. package/package.json +28 -26
  31. package/src/aztec-node/block_response_helpers.ts +161 -0
  32. package/src/aztec-node/config.ts +36 -16
  33. package/src/aztec-node/node_metrics.ts +6 -17
  34. package/src/aztec-node/public_data_overrides.ts +35 -0
  35. package/src/aztec-node/server.ts +1282 -663
  36. package/src/sentinel/README.md +103 -0
  37. package/src/sentinel/config.ts +18 -6
  38. package/src/sentinel/factory.ts +9 -11
  39. package/src/sentinel/sentinel.ts +336 -109
  40. package/src/sentinel/store.ts +35 -27
  41. package/src/test/index.ts +2 -2
@@ -4,28 +4,28 @@ import { BufferReader, numToUInt8, numToUInt32BE, serializeToBuffer } from '@azt
4
4
  export class SentinelStore {
5
5
  store;
6
6
  config;
7
- static SCHEMA_VERSION = 2;
7
+ static SCHEMA_VERSION = 4;
8
8
  // a map from validator address to their ValidatorStatusHistory
9
9
  historyMap;
10
- // a map from validator address to their historical proven epoch performance
10
+ // a map from validator address to their historical epoch performance, evaluated at end-of-epoch.
11
11
  // e.g. { validator: [{ epoch: 1, missed: 1, total: 10 }, { epoch: 2, missed: 3, total: 7 }, ...] }
12
- provenMap;
12
+ epochMap;
13
13
  constructor(store, config){
14
14
  this.store = store;
15
15
  this.config = config;
16
16
  this.historyMap = store.openMap('sentinel-validator-status');
17
- this.provenMap = store.openMap('sentinel-validator-proven');
17
+ this.epochMap = store.openMap('sentinel-validator-epoch');
18
18
  }
19
19
  getHistoryLength() {
20
20
  return this.config.historyLength;
21
21
  }
22
- getHistoricProvenPerformanceLength() {
23
- return this.config.historicProvenPerformanceLength;
22
+ getHistoricEpochPerformanceLength() {
23
+ return this.config.historicEpochPerformanceLength;
24
24
  }
25
- async updateProvenPerformance(epoch, performance) {
25
+ async updateEpochPerformance(epoch, performance) {
26
26
  await this.store.transactionAsync(async ()=>{
27
27
  for (const [who, { missed, total }] of Object.entries(performance)){
28
- await this.pushValidatorProvenPerformanceForEpoch({
28
+ await this.pushValidatorEpochPerformance({
29
29
  who: EthAddress.fromString(who),
30
30
  missed,
31
31
  total,
@@ -34,12 +34,12 @@ export class SentinelStore {
34
34
  }
35
35
  });
36
36
  }
37
- async getProvenPerformance(who) {
38
- const currentPerformanceBuffer = await this.provenMap.getAsync(who.toString());
37
+ async getEpochPerformance(who) {
38
+ const currentPerformanceBuffer = await this.epochMap.getAsync(who.toString());
39
39
  return currentPerformanceBuffer ? this.deserializePerformance(currentPerformanceBuffer) : [];
40
40
  }
41
- async pushValidatorProvenPerformanceForEpoch({ who, missed, total, epoch }) {
42
- const currentPerformance = await this.getProvenPerformance(who);
41
+ async pushValidatorEpochPerformance({ who, missed, total, epoch }) {
42
+ const currentPerformance = await this.getEpochPerformance(who);
43
43
  const existingIndex = currentPerformance.findIndex((p)=>p.epoch === epoch);
44
44
  if (existingIndex !== -1) {
45
45
  currentPerformance[existingIndex] = {
@@ -57,9 +57,9 @@ export class SentinelStore {
57
57
  // This should be sorted by epoch, but just in case.
58
58
  // Since we keep the size small, this is not a big deal.
59
59
  currentPerformance.sort((a, b)=>Number(a.epoch - b.epoch));
60
- // keep the most recent `historicProvenPerformanceLength` entries.
61
- const performanceToKeep = currentPerformance.slice(-this.config.historicProvenPerformanceLength);
62
- await this.provenMap.set(who.toString(), this.serializePerformance(performanceToKeep));
60
+ // keep the most recent `historicEpochPerformanceLength` entries.
61
+ const performanceToKeep = currentPerformance.slice(-this.config.historicEpochPerformanceLength);
62
+ await this.epochMap.set(who.toString(), this.serializePerformance(performanceToKeep));
63
63
  }
64
64
  async updateValidators(slot, statuses) {
65
65
  await this.store.transactionAsync(async ()=>{
@@ -134,16 +134,22 @@ export class SentinelStore {
134
134
  }
135
135
  statusToNumber(status) {
136
136
  switch(status){
137
- case 'block-mined':
137
+ case 'checkpoint-mined':
138
138
  return 1;
139
- case 'block-proposed':
139
+ case 'checkpoint-valid':
140
140
  return 2;
141
- case 'block-missed':
141
+ case 'checkpoint-missed':
142
142
  return 3;
143
143
  case 'attestation-sent':
144
144
  return 4;
145
145
  case 'attestation-missed':
146
146
  return 5;
147
+ case 'blocks-missed':
148
+ return 6;
149
+ case 'checkpoint-invalid':
150
+ return 7;
151
+ case 'checkpoint-unvalidated':
152
+ return 8;
147
153
  default:
148
154
  {
149
155
  const _exhaustive = status;
@@ -154,15 +160,21 @@ export class SentinelStore {
154
160
  statusFromNumber(status) {
155
161
  switch(status){
156
162
  case 1:
157
- return 'block-mined';
163
+ return 'checkpoint-mined';
158
164
  case 2:
159
- return 'block-proposed';
165
+ return 'checkpoint-valid';
160
166
  case 3:
161
- return 'block-missed';
167
+ return 'checkpoint-missed';
162
168
  case 4:
163
169
  return 'attestation-sent';
164
170
  case 5:
165
171
  return 'attestation-missed';
172
+ case 6:
173
+ return 'blocks-missed';
174
+ case 7:
175
+ return 'checkpoint-invalid';
176
+ case 8:
177
+ return 'checkpoint-unvalidated';
166
178
  default:
167
179
  throw new Error(`Unknown status: ${status}`);
168
180
  }
@@ -1,7 +1,7 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import type { P2P } from '@aztec/p2p';
3
3
  import { SequencerClient } from '@aztec/sequencer-client';
4
- import { EpochPruneWatcher, type SlasherClientInterface } from '@aztec/slasher';
4
+ import { DataWithholdingWatcher, type SlasherClientInterface } from '@aztec/slasher';
5
5
  import type { L2BlockSource } from '@aztec/stdlib/block';
6
6
  import type { ContractDataSource } from '@aztec/stdlib/contract';
7
7
  import type { L2LogsSource, Service, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
@@ -21,11 +21,11 @@ export declare class TestAztecNodeService extends AztecNodeService {
21
21
  sequencer: SequencerClient | undefined;
22
22
  slasherClient: SlasherClientInterface | undefined;
23
23
  validatorsSentinel: Sentinel | undefined;
24
- epochPruneWatcher: EpochPruneWatcher | undefined;
24
+ dataWithholdingWatcher: DataWithholdingWatcher | undefined;
25
25
  l1ChainId: number;
26
26
  version: number;
27
27
  globalVariableBuilder: GlobalVariableBuilderInterface;
28
28
  epochCache: EpochCacheInterface;
29
29
  packageVersion: string;
30
30
  }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JHLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUscUJBQXFCLElBQUksOEJBQThCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQkFBcUIsU0FBUSxnQkFBZ0I7SUFDakQsTUFBTSxFQUFFLGVBQWUsQ0FBQztJQUN4QixTQUFTLEVBQUUsR0FBRyxDQUFDO0lBQ2YsV0FBVyxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsVUFBVSxFQUFFLFlBQVksQ0FBQztJQUN6QixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztJQUN2QyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQztJQUN6QyxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQztJQUMvQyxTQUFTLEVBQUUsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUN2QyxhQUFhLEVBQUUsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQ2xELGtCQUFrQixFQUFFLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDekMsaUJBQWlCLEVBQUUsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO0lBQ2pELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixxQkFBcUIsRUFBRSw4QkFBOEIsQ0FBQztJQUN0RCxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsY0FBYyxFQUFFLE1BQU0sQ0FBQztDQUN2QyJ9
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JHLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUscUJBQXFCLElBQUksOEJBQThCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQkFBcUIsU0FBUSxnQkFBZ0I7SUFDakQsTUFBTSxFQUFFLGVBQWUsQ0FBQztJQUN4QixTQUFTLEVBQUUsR0FBRyxDQUFDO0lBQ2YsV0FBVyxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsVUFBVSxFQUFFLFlBQVksQ0FBQztJQUN6QixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztJQUN2QyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQztJQUN6QyxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQztJQUMvQyxTQUFTLEVBQUUsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUN2QyxhQUFhLEVBQUUsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQ2xELGtCQUFrQixFQUFFLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDekMsc0JBQXNCLEVBQUUsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQzNELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixxQkFBcUIsRUFBRSw4QkFBOEIsQ0FBQztJQUN0RCxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsY0FBYyxFQUFFLE1BQU0sQ0FBQztDQUN2QyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,IAAI,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,gBAAgB;IACjD,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC;IACf,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,UAAU,EAAE,YAAY,CAAC;IACzB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC;IACvC,aAAa,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAClD,kBAAkB,EAAE,QAAQ,GAAG,SAAS,CAAC;IACzC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,8BAA8B,CAAC;IACtD,UAAU,EAAE,mBAAmB,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;CACvC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,IAAI,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,gBAAgB;IACjD,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC;IACf,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,UAAU,EAAE,YAAY,CAAC;IACzB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC;IACvC,aAAa,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAClD,kBAAkB,EAAE,QAAQ,GAAG,SAAS,CAAC;IACzC,sBAAsB,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,8BAA8B,CAAC;IACtD,UAAU,EAAE,mBAAmB,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;CACvC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/aztec-node",
3
- "version": "0.0.1-commit.03f7ef2",
3
+ "version": "0.0.1-commit.04d373f",
4
4
  "main": "dest/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -9,7 +9,6 @@
9
9
  "./sentinel": "./dest/aztec-node/sentinel.js",
10
10
  "./test": "./dest/test/index.js"
11
11
  },
12
- "bin": "./dest/bin/index.js",
13
12
  "typedocOptions": {
14
13
  "entryPoints": [
15
14
  "./src/index.ts"
@@ -66,29 +65,32 @@
66
65
  ]
67
66
  },
68
67
  "dependencies": {
69
- "@aztec/archiver": "0.0.1-commit.03f7ef2",
70
- "@aztec/bb-prover": "0.0.1-commit.03f7ef2",
71
- "@aztec/blob-client": "0.0.1-commit.03f7ef2",
72
- "@aztec/constants": "0.0.1-commit.03f7ef2",
73
- "@aztec/epoch-cache": "0.0.1-commit.03f7ef2",
74
- "@aztec/ethereum": "0.0.1-commit.03f7ef2",
75
- "@aztec/foundation": "0.0.1-commit.03f7ef2",
76
- "@aztec/kv-store": "0.0.1-commit.03f7ef2",
77
- "@aztec/l1-artifacts": "0.0.1-commit.03f7ef2",
78
- "@aztec/merkle-tree": "0.0.1-commit.03f7ef2",
79
- "@aztec/node-keystore": "0.0.1-commit.03f7ef2",
80
- "@aztec/node-lib": "0.0.1-commit.03f7ef2",
81
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.03f7ef2",
82
- "@aztec/p2p": "0.0.1-commit.03f7ef2",
83
- "@aztec/protocol-contracts": "0.0.1-commit.03f7ef2",
84
- "@aztec/prover-client": "0.0.1-commit.03f7ef2",
85
- "@aztec/sequencer-client": "0.0.1-commit.03f7ef2",
86
- "@aztec/simulator": "0.0.1-commit.03f7ef2",
87
- "@aztec/slasher": "0.0.1-commit.03f7ef2",
88
- "@aztec/stdlib": "0.0.1-commit.03f7ef2",
89
- "@aztec/telemetry-client": "0.0.1-commit.03f7ef2",
90
- "@aztec/validator-client": "0.0.1-commit.03f7ef2",
91
- "@aztec/world-state": "0.0.1-commit.03f7ef2",
68
+ "@aztec/archiver": "0.0.1-commit.04d373f",
69
+ "@aztec/bb-prover": "0.0.1-commit.04d373f",
70
+ "@aztec/blob-client": "0.0.1-commit.04d373f",
71
+ "@aztec/blob-lib": "0.0.1-commit.04d373f",
72
+ "@aztec/constants": "0.0.1-commit.04d373f",
73
+ "@aztec/epoch-cache": "0.0.1-commit.04d373f",
74
+ "@aztec/ethereum": "0.0.1-commit.04d373f",
75
+ "@aztec/foundation": "0.0.1-commit.04d373f",
76
+ "@aztec/kv-store": "0.0.1-commit.04d373f",
77
+ "@aztec/l1-artifacts": "0.0.1-commit.04d373f",
78
+ "@aztec/node-keystore": "0.0.1-commit.04d373f",
79
+ "@aztec/node-lib": "0.0.1-commit.04d373f",
80
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.04d373f",
81
+ "@aztec/p2p": "0.0.1-commit.04d373f",
82
+ "@aztec/protocol-contracts": "0.0.1-commit.04d373f",
83
+ "@aztec/prover-client": "0.0.1-commit.04d373f",
84
+ "@aztec/prover-node": "0.0.1-commit.04d373f",
85
+ "@aztec/sequencer-client": "0.0.1-commit.04d373f",
86
+ "@aztec/simulator": "0.0.1-commit.04d373f",
87
+ "@aztec/slasher": "0.0.1-commit.04d373f",
88
+ "@aztec/standard-contracts": "0.0.1-commit.04d373f",
89
+ "@aztec/stdlib": "0.0.1-commit.04d373f",
90
+ "@aztec/telemetry-client": "0.0.1-commit.04d373f",
91
+ "@aztec/validator-client": "0.0.1-commit.04d373f",
92
+ "@aztec/validator-ha-signer": "0.0.1-commit.04d373f",
93
+ "@aztec/world-state": "0.0.1-commit.04d373f",
92
94
  "koa": "^2.16.1",
93
95
  "koa-router": "^13.1.1",
94
96
  "tslib": "^2.4.0",
@@ -98,7 +100,7 @@
98
100
  "@jest/globals": "^30.0.0",
99
101
  "@types/jest": "^30.0.0",
100
102
  "@types/node": "^22.15.17",
101
- "@typescript/native-preview": "7.0.0-dev.20251126.1",
103
+ "@typescript/native-preview": "7.0.0-dev.20260113.1",
102
104
  "jest": "^30.0.0",
103
105
  "jest-mock-extended": "^4.0.0",
104
106
  "ts-node": "^10.9.1",
@@ -0,0 +1,161 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { type BlockData, type CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
3
+ import type {
4
+ CheckpointData,
5
+ L1PublishedData,
6
+ ProposedCheckpointData,
7
+ PublishedCheckpoint,
8
+ } from '@aztec/stdlib/checkpoint';
9
+ import {
10
+ type BlockIncludeOptions,
11
+ type BlockResponse,
12
+ type CheckpointIncludeOptions,
13
+ type CheckpointResponse,
14
+ l1PublishInfoFromL1PublishedData,
15
+ } from '@aztec/stdlib/interfaces/client';
16
+
17
+ /** Projects a full {@link L2Block} into a {@link BlockResponse}, attaching L1 / attestation context when provided. */
18
+ export async function blockResponseFromL2Block(
19
+ block: L2Block,
20
+ options: BlockIncludeOptions,
21
+ context?: { l1?: L1PublishedData; attestations?: CommitteeAttestation[] },
22
+ ): Promise<BlockResponse> {
23
+ const response: BlockResponse = {
24
+ header: block.header,
25
+ archive: block.archive,
26
+ hash: await block.hash(),
27
+ checkpointNumber: block.checkpointNumber,
28
+ indexWithinCheckpoint: block.indexWithinCheckpoint,
29
+ number: block.number,
30
+ };
31
+ if (options.includeTransactions) {
32
+ (response as BlockResponse).body = block.body;
33
+ }
34
+ if (options.includeL1PublishInfo) {
35
+ (response as BlockResponse).l1 = l1PublishInfoFromL1PublishedData(context?.l1);
36
+ }
37
+ if (options.includeAttestations) {
38
+ (response as BlockResponse).attestations = context?.attestations ?? [];
39
+ }
40
+ return response;
41
+ }
42
+
43
+ /** Projects metadata-only {@link BlockData} into a {@link BlockResponse}. */
44
+ export function blockResponseFromBlockData(
45
+ data: BlockData,
46
+ options: BlockIncludeOptions,
47
+ context?: { l1?: L1PublishedData; attestations?: CommitteeAttestation[] },
48
+ ): BlockResponse {
49
+ const response: BlockResponse = {
50
+ header: data.header,
51
+ archive: data.archive,
52
+ hash: data.blockHash,
53
+ checkpointNumber: data.checkpointNumber,
54
+ indexWithinCheckpoint: data.indexWithinCheckpoint,
55
+ number: data.header.getBlockNumber(),
56
+ };
57
+ if (options.includeL1PublishInfo) {
58
+ (response as BlockResponse).l1 = l1PublishInfoFromL1PublishedData(context?.l1);
59
+ }
60
+ if (options.includeAttestations) {
61
+ (response as BlockResponse).attestations = context?.attestations ?? [];
62
+ }
63
+ return response;
64
+ }
65
+
66
+ /** Projects a {@link PublishedCheckpoint} into a {@link CheckpointResponse}. */
67
+ export async function checkpointResponseFromPublishedCheckpoint(
68
+ pc: PublishedCheckpoint,
69
+ options: CheckpointIncludeOptions,
70
+ ): Promise<CheckpointResponse> {
71
+ const response: CheckpointResponse = {
72
+ number: pc.checkpoint.number,
73
+ header: pc.checkpoint.header,
74
+ archive: pc.checkpoint.archive,
75
+ checkpointOutHash: pc.checkpoint.getCheckpointOutHash(),
76
+ startBlock: pc.checkpoint.blocks[0]?.number ?? BlockNumber.ZERO,
77
+ blockCount: pc.checkpoint.blocks.length,
78
+ feeAssetPriceModifier: pc.checkpoint.feeAssetPriceModifier,
79
+ };
80
+ if (options.includeBlocks) {
81
+ (response as CheckpointResponse).blocks = await Promise.all(
82
+ pc.checkpoint.blocks.map(block =>
83
+ blockResponseFromL2Block(block, {
84
+ includeTransactions: options.includeTransactions,
85
+ includeL1PublishInfo: false,
86
+ includeAttestations: false,
87
+ }),
88
+ ),
89
+ );
90
+ }
91
+ if (options.includeL1PublishInfo) {
92
+ (response as CheckpointResponse).l1 = l1PublishInfoFromL1PublishedData(pc.l1);
93
+ }
94
+ if (options.includeAttestations) {
95
+ (response as CheckpointResponse).attestations = pc.attestations;
96
+ }
97
+ return response;
98
+ }
99
+
100
+ /** Projects metadata-only {@link CheckpointData} into a {@link CheckpointResponse}. `includeBlocks` is ignored (no blocks loaded). */
101
+ export function checkpointResponseFromCheckpointData(
102
+ cd: CheckpointData,
103
+ options: CheckpointIncludeOptions,
104
+ ): CheckpointResponse {
105
+ const response: CheckpointResponse = {
106
+ number: cd.checkpointNumber,
107
+ header: cd.header,
108
+ archive: cd.archive,
109
+ checkpointOutHash: cd.checkpointOutHash,
110
+ startBlock: cd.startBlock,
111
+ blockCount: cd.blockCount,
112
+ feeAssetPriceModifier: cd.feeAssetPriceModifier,
113
+ };
114
+ if (options.includeL1PublishInfo) {
115
+ (response as CheckpointResponse).l1 = l1PublishInfoFromL1PublishedData(cd.l1);
116
+ }
117
+ if (options.includeAttestations) {
118
+ (response as CheckpointResponse).attestations = cd.attestations;
119
+ }
120
+ return response;
121
+ }
122
+
123
+ /**
124
+ * Projects a {@link ProposedCheckpointData} into a {@link CheckpointResponse}.
125
+ * Pure projection — caller pre-fetches `blocks` via `blockSource.getBlocks(...)` when
126
+ * `options.includeBlocks` is true. Throws if `includeL1PublishInfo` or `includeAttestations`
127
+ * is requested (proposed checkpoints have no L1 publish info or attestations).
128
+ */
129
+ export async function projectProposedToCheckpointResponse(
130
+ proposed: ProposedCheckpointData,
131
+ options: CheckpointIncludeOptions,
132
+ blocks?: L2Block[],
133
+ ): Promise<CheckpointResponse> {
134
+ if (options.includeL1PublishInfo || options.includeAttestations) {
135
+ throw new Error('Proposed checkpoints have no L1 publish info or attestations');
136
+ }
137
+ const response: CheckpointResponse = {
138
+ number: proposed.checkpointNumber,
139
+ header: proposed.header,
140
+ archive: proposed.archive,
141
+ checkpointOutHash: proposed.checkpointOutHash,
142
+ startBlock: proposed.startBlock,
143
+ blockCount: proposed.blockCount,
144
+ feeAssetPriceModifier: proposed.feeAssetPriceModifier,
145
+ };
146
+ if (options.includeBlocks) {
147
+ if (!blocks) {
148
+ throw new Error('Blocks must be supplied when includeBlocks is true');
149
+ }
150
+ (response as CheckpointResponse).blocks = await Promise.all(
151
+ blocks.map(block =>
152
+ blockResponseFromL2Block(block, {
153
+ includeTransactions: options.includeTransactions,
154
+ includeL1PublishInfo: false,
155
+ includeAttestations: false,
156
+ }),
157
+ ),
158
+ );
159
+ }
160
+ return response;
161
+ }
@@ -1,9 +1,7 @@
1
1
  import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver/config';
2
2
  import { type GenesisStateConfig, genesisStateConfigMappings } from '@aztec/ethereum/config';
3
- import { type L1ContractAddresses, l1ContractAddressesMapping } from '@aztec/ethereum/l1-contract-addresses';
4
3
  import { type ConfigMappingsType, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
5
4
  import { EthAddress } from '@aztec/foundation/eth-address';
6
- import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
7
5
  import {
8
6
  type KeyStore,
9
7
  type ValidatorKeyStore,
@@ -13,15 +11,21 @@ import {
13
11
  import { type SharedNodeConfig, sharedNodeConfigMappings } from '@aztec/node-lib/config';
14
12
  import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p/config';
15
13
  import { type ProverClientUserConfig, proverClientConfigMappings } from '@aztec/prover-client/config';
14
+ import {
15
+ type ProverNodeConfig,
16
+ proverNodeConfigMappings,
17
+ specificProverNodeConfigMappings,
18
+ } from '@aztec/prover-node/config';
16
19
  import {
17
20
  type SequencerClientConfig,
18
- type TxSenderConfig,
21
+ type SequencerTxSenderConfig,
19
22
  sequencerClientConfigMappings,
20
23
  } from '@aztec/sequencer-client/config';
21
24
  import { slasherConfigMappings } from '@aztec/slasher';
22
25
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
23
26
  import { type NodeRPCConfig, nodeRpcConfigMappings } from '@aztec/stdlib/config';
24
27
  import type { SlasherConfig } from '@aztec/stdlib/interfaces/server';
28
+ import { type DataStoreConfig, dataConfigMappings } from '@aztec/stdlib/kv-store';
25
29
  import { type ValidatorClientConfig, validatorClientConfigMappings } from '@aztec/validator-client/config';
26
30
  import { type WorldStateConfig, worldStateConfigMappings } from '@aztec/world-state/config';
27
31
 
@@ -46,16 +50,22 @@ export type AztecNodeConfig = ArchiverConfig &
46
50
  SharedNodeConfig &
47
51
  GenesisStateConfig &
48
52
  NodeRPCConfig &
49
- SlasherConfig & {
50
- /** L1 contracts addresses */
51
- l1Contracts: L1ContractAddresses;
53
+ SlasherConfig &
54
+ ProverNodeConfig & {
52
55
  /** Whether the validator is disabled for this node */
53
56
  disableValidator: boolean;
54
57
  /** Whether to skip waiting for the archiver to be fully synced before starting other services */
55
58
  skipArchiverInitialSync: boolean;
56
-
57
59
  /** A flag to force verification of tx Chonk proofs. Only used for testnet */
58
60
  debugForceTxProofVerification: boolean;
61
+ /** Whether to enable the prover node as a subsystem. */
62
+ enableProverNode: boolean;
63
+ /**
64
+ * Test-only: use the deterministic AutomineSequencer instead of the production Sequencer.
65
+ * Requires `aztecTargetCommitteeSize === 0` on the deployed rollup and anvil-backed L1.
66
+ * See `AUTOMINE_E2E_OPTS` in `end-to-end/src/fixtures/fixtures.ts`.
67
+ */
68
+ useAutomineSequencer?: boolean;
59
69
  };
60
70
 
61
71
  export const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig> = {
@@ -63,6 +73,7 @@ export const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig> = {
63
73
  ...keyStoreConfigMappings,
64
74
  ...archiverConfigMappings,
65
75
  ...sequencerClientConfigMappings,
76
+ ...proverNodeConfigMappings,
66
77
  ...validatorClientConfigMappings,
67
78
  ...proverClientConfigMappings,
68
79
  ...worldStateConfigMappings,
@@ -72,10 +83,7 @@ export const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig> = {
72
83
  ...genesisStateConfigMappings,
73
84
  ...nodeRpcConfigMappings,
74
85
  ...slasherConfigMappings,
75
- l1Contracts: {
76
- description: 'The deployed L1 contract addresses',
77
- nested: l1ContractAddressesMapping,
78
- },
86
+ ...specificProverNodeConfigMappings,
79
87
  disableValidator: {
80
88
  env: 'VALIDATOR_DISABLED',
81
89
  description: 'Whether the validator is disabled for this node.',
@@ -91,6 +99,16 @@ export const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig> = {
91
99
  description: 'Whether to skip waiting for the archiver to be fully synced before starting other services.',
92
100
  ...booleanConfigHelper(false),
93
101
  },
102
+ enableProverNode: {
103
+ env: 'ENABLE_PROVER_NODE',
104
+ description: 'Whether to enable the prover node as a subsystem.',
105
+ ...booleanConfigHelper(false),
106
+ },
107
+ useAutomineSequencer: {
108
+ env: 'USE_AUTOMINE_SEQUENCER',
109
+ description: 'Test-only: use AutomineSequencer instead of the production Sequencer.',
110
+ ...booleanConfigHelper(false),
111
+ },
94
112
  };
95
113
 
96
114
  /**
@@ -101,7 +119,7 @@ export function getConfigEnvVars(): AztecNodeConfig {
101
119
  return getConfigFromMappings<AztecNodeConfig>(aztecNodeConfigMappings);
102
120
  }
103
121
 
104
- type ConfigRequiredToBuildKeyStore = TxSenderConfig & SequencerClientConfig & SharedNodeConfig & ValidatorClientConfig;
122
+ type ConfigRequiredToBuildKeyStore = SequencerClientConfig & SharedNodeConfig & ValidatorClientConfig;
105
123
 
106
124
  function createKeyStoreFromWeb3Signer(config: ConfigRequiredToBuildKeyStore): KeyStore | undefined {
107
125
  const validatorKeyStores: ValidatorKeyStore[] = [];
@@ -120,7 +138,7 @@ function createKeyStoreFromWeb3Signer(config: ConfigRequiredToBuildKeyStore): Ke
120
138
  feeRecipient: config.feeRecipient ?? AztecAddress.ZERO,
121
139
  coinbase: config.coinbase ?? config.validatorAddresses[0],
122
140
  remoteSigner: config.web3SignerUrl,
123
- publisher: config.publisherAddresses ?? [],
141
+ publisher: config.sequencerPublisherAddresses ?? [],
124
142
  });
125
143
 
126
144
  const keyStore: KeyStore = {
@@ -145,8 +163,10 @@ function createKeyStoreFromPrivateKeys(config: ConfigRequiredToBuildKeyStore): K
145
163
  const coinbase = config.coinbase ?? EthAddress.fromString(privateKeyToAddress(ethPrivateKeys[0]));
146
164
  const feeRecipient = config.feeRecipient ?? AztecAddress.ZERO;
147
165
 
148
- const publisherKeys = config.publisherPrivateKeys
149
- ? config.publisherPrivateKeys.map((k: { getValue: () => string }) => ethPrivateKeySchema.parse(k.getValue()))
166
+ const publisherKeys = config.sequencerPublisherPrivateKeys
167
+ ? config.sequencerPublisherPrivateKeys.map((k: { getValue: () => string }) =>
168
+ ethPrivateKeySchema.parse(k.getValue()),
169
+ )
150
170
  : [];
151
171
 
152
172
  validatorKeyStores.push({
@@ -168,7 +188,7 @@ function createKeyStoreFromPrivateKeys(config: ConfigRequiredToBuildKeyStore): K
168
188
  }
169
189
 
170
190
  export function createKeyStoreForValidator(
171
- config: TxSenderConfig & SequencerClientConfig & SharedNodeConfig,
191
+ config: SequencerTxSenderConfig & SequencerClientConfig & SharedNodeConfig,
172
192
  ): KeyStore | undefined {
173
193
  if (config.web3SignerUrl !== undefined && config.web3SignerUrl.length > 0) {
174
194
  return createKeyStoreFromWeb3Signer(config);
@@ -4,7 +4,7 @@ import {
4
4
  Metrics,
5
5
  type TelemetryClient,
6
6
  type UpDownCounter,
7
- ValueType,
7
+ createUpDownCounterWithDefault,
8
8
  } from '@aztec/telemetry-client';
9
9
 
10
10
  export class NodeMetrics {
@@ -16,25 +16,14 @@ export class NodeMetrics {
16
16
 
17
17
  constructor(client: TelemetryClient, name = 'AztecNode') {
18
18
  const meter = client.getMeter(name);
19
- this.receiveTxCount = meter.createUpDownCounter(Metrics.NODE_RECEIVE_TX_COUNT, {});
20
- this.receiveTxDuration = meter.createHistogram(Metrics.NODE_RECEIVE_TX_DURATION, {
21
- description: 'The duration of the receiveTx method',
22
- unit: 'ms',
23
- valueType: ValueType.INT,
19
+ this.receiveTxCount = createUpDownCounterWithDefault(meter, Metrics.NODE_RECEIVE_TX_COUNT, {
20
+ [Attributes.OK]: [true, false],
24
21
  });
22
+ this.receiveTxDuration = meter.createHistogram(Metrics.NODE_RECEIVE_TX_DURATION);
25
23
 
26
- this.snapshotDuration = meter.createHistogram(Metrics.NODE_SNAPSHOT_DURATION, {
27
- description: 'How long taking a snapshot takes',
28
- unit: 'ms',
29
- valueType: ValueType.INT,
30
- });
31
-
32
- this.snapshotErrorCount = meter.createUpDownCounter(Metrics.NODE_SNAPSHOT_ERROR_COUNT, {
33
- description: 'How many snapshot errors have happened',
34
- valueType: ValueType.INT,
35
- });
24
+ this.snapshotDuration = meter.createHistogram(Metrics.NODE_SNAPSHOT_DURATION);
36
25
 
37
- this.snapshotErrorCount.add(0);
26
+ this.snapshotErrorCount = createUpDownCounterWithDefault(meter, Metrics.NODE_SNAPSHOT_ERROR_COUNT);
38
27
  }
39
28
 
40
29
  receivedTx(durationMs: number, isAccepted: boolean) {
@@ -0,0 +1,35 @@
1
+ import { PublicDataWrite } from '@aztec/stdlib/avm';
2
+ import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
3
+ import type { PublicStorageOverride } from '@aztec/stdlib/interfaces/client';
4
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
5
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
6
+
7
+ /**
8
+ * Injects public-state overrides into an (ephemeral) world-state fork before simulation.
9
+ *
10
+ * Each override is written via the same `sequentialInsert` path the public processor
11
+ * uses during real transaction execution, so low-leaf updates and root coherence are
12
+ * handled identically for both simulation and proof generation.
13
+ *
14
+ * Writes never reach committed world state — the fork is thrown away after simulation.
15
+ */
16
+ export async function applyPublicDataOverrides(
17
+ fork: MerkleTreeWriteOperations,
18
+ publicStorage: PublicStorageOverride[] | undefined,
19
+ ): Promise<void> {
20
+ if (!publicStorage?.length) {
21
+ return;
22
+ }
23
+
24
+ const writes = await Promise.all(
25
+ publicStorage.map(async o => {
26
+ const leafSlot = await computePublicDataTreeLeafSlot(o.contract, o.slot);
27
+ return new PublicDataWrite(leafSlot, o.value);
28
+ }),
29
+ );
30
+
31
+ await fork.sequentialInsert(
32
+ MerkleTreeId.PUBLIC_DATA_TREE,
33
+ writes.map(w => w.toBuffer()),
34
+ );
35
+ }