@aztec/aztec-node 0.0.1-commit.c80b6263 → 0.0.1-commit.cf93bcc56

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.
@@ -374,12 +374,13 @@ var _dec, _initProto;
374
374
  import { createArchiver } from '@aztec/archiver';
375
375
  import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
376
376
  import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
377
+ import { Blob } from '@aztec/blob-lib';
377
378
  import { EpochCache } from '@aztec/epoch-cache';
378
379
  import { createEthereumChain } from '@aztec/ethereum/chain';
379
380
  import { getPublicClient } from '@aztec/ethereum/client';
380
381
  import { RegistryContract, RollupContract } from '@aztec/ethereum/contracts';
381
382
  import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
382
- import { compactArray, pick } from '@aztec/foundation/collection';
383
+ import { compactArray, pick, unique } from '@aztec/foundation/collection';
383
384
  import { Fr } from '@aztec/foundation/curves/bn254';
384
385
  import { EthAddress } from '@aztec/foundation/eth-address';
385
386
  import { BadRequestError } from '@aztec/foundation/json-rpc';
@@ -389,9 +390,11 @@ import { DateProvider, Timer } from '@aztec/foundation/timer';
389
390
  import { MembershipWitness } from '@aztec/foundation/trees';
390
391
  import { KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
391
392
  import { trySnapshotSync, uploadSnapshot } from '@aztec/node-lib/actions';
392
- import { createForwarderL1TxUtilsFromEthSigner, createL1TxUtilsWithBlobsFromEthSigner } from '@aztec/node-lib/factories';
393
+ import { createForwarderL1TxUtilsFromSigners, createL1TxUtilsFromSigners } from '@aztec/node-lib/factories';
393
394
  import { createP2PClient, getDefaultAllowedSetupFunctions } from '@aztec/p2p';
394
395
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
396
+ import { createProverNode } from '@aztec/prover-node';
397
+ import { createKeyStoreForProver } from '@aztec/prover-node/config';
395
398
  import { GlobalVariableBuilder, SequencerClient } from '@aztec/sequencer-client';
396
399
  import { PublicProcessorFactory } from '@aztec/simulator/server';
397
400
  import { AttestationsBlockWatcher, EpochPruneWatcher, createSlasher } from '@aztec/slasher';
@@ -428,6 +431,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
428
431
  l1ToL2MessageSource;
429
432
  worldStateSynchronizer;
430
433
  sequencer;
434
+ proverNode;
431
435
  slasherClient;
432
436
  validatorsSentinel;
433
437
  epochPruneWatcher;
@@ -440,6 +444,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
440
444
  telemetry;
441
445
  log;
442
446
  blobClient;
447
+ validatorClient;
448
+ keyStoreManager;
443
449
  static{
444
450
  ({ e: [_initProto] } = _apply_decs_2203_r(this, [
445
451
  [
@@ -454,7 +460,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
454
460
  // Prevent two snapshot operations to happen simultaneously
455
461
  isUploadingSnapshot;
456
462
  tracer;
457
- constructor(config, p2pClient, blockSource, logsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchronizer, sequencer, slasherClient, validatorsSentinel, epochPruneWatcher, l1ChainId, version, globalVariableBuilder, epochCache, packageVersion, proofVerifier, telemetry = getTelemetryClient(), log = createLogger('node'), blobClient){
463
+ constructor(config, p2pClient, blockSource, logsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchronizer, sequencer, proverNode, slasherClient, validatorsSentinel, epochPruneWatcher, l1ChainId, version, globalVariableBuilder, epochCache, packageVersion, proofVerifier, telemetry = getTelemetryClient(), log = createLogger('node'), blobClient, validatorClient, keyStoreManager){
458
464
  this.config = config;
459
465
  this.p2pClient = p2pClient;
460
466
  this.blockSource = blockSource;
@@ -463,6 +469,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
463
469
  this.l1ToL2MessageSource = l1ToL2MessageSource;
464
470
  this.worldStateSynchronizer = worldStateSynchronizer;
465
471
  this.sequencer = sequencer;
472
+ this.proverNode = proverNode;
466
473
  this.slasherClient = slasherClient;
467
474
  this.validatorsSentinel = validatorsSentinel;
468
475
  this.epochPruneWatcher = epochPruneWatcher;
@@ -475,6 +482,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
475
482
  this.telemetry = telemetry;
476
483
  this.log = log;
477
484
  this.blobClient = blobClient;
485
+ this.validatorClient = validatorClient;
486
+ this.keyStoreManager = keyStoreManager;
478
487
  this.initialHeaderHashPromise = (_initProto(this), undefined);
479
488
  this.isUploadingSnapshot = false;
480
489
  this.metrics = new NodeMetrics(telemetry, 'AztecNodeService');
@@ -502,16 +511,27 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
502
511
  const telemetry = deps.telemetry ?? getTelemetryClient();
503
512
  const dateProvider = deps.dateProvider ?? new DateProvider();
504
513
  const ethereumChain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
505
- // Build a key store from file if given or from environment otherwise
514
+ // Build a key store from file if given or from environment otherwise.
515
+ // We keep the raw KeyStore available so we can merge with prover keys if enableProverNode is set.
506
516
  let keyStoreManager;
507
517
  const keyStoreProvided = config.keyStoreDirectory !== undefined && config.keyStoreDirectory.length > 0;
508
518
  if (keyStoreProvided) {
509
519
  const keyStores = loadKeystores(config.keyStoreDirectory);
510
520
  keyStoreManager = new KeystoreManager(mergeKeystores(keyStores));
511
521
  } else {
512
- const keyStore = createKeyStoreForValidator(config);
513
- if (keyStore) {
514
- keyStoreManager = new KeystoreManager(keyStore);
522
+ const rawKeyStores = [];
523
+ const validatorKeyStore = createKeyStoreForValidator(config);
524
+ if (validatorKeyStore) {
525
+ rawKeyStores.push(validatorKeyStore);
526
+ }
527
+ if (config.enableProverNode) {
528
+ const proverKeyStore = createKeyStoreForProver(config);
529
+ if (proverKeyStore) {
530
+ rawKeyStores.push(proverKeyStore);
531
+ }
532
+ }
533
+ if (rawKeyStores.length > 0) {
534
+ keyStoreManager = new KeystoreManager(rawKeyStores.length === 1 ? rawKeyStores[0] : mergeKeystores(rawKeyStores));
515
535
  }
516
536
  }
517
537
  await keyStoreManager?.validateSigners();
@@ -520,8 +540,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
520
540
  if (keyStoreManager === undefined) {
521
541
  throw new Error('Failed to create key store, a requirement for running a validator');
522
542
  }
523
- if (!keyStoreProvided) {
524
- log.warn('KEY STORE CREATED FROM ENVIRONMENT, IT IS RECOMMENDED TO USE A FILE-BASED KEY STORE IN PRODUCTION ENVIRONMENTS');
543
+ if (!keyStoreProvided && process.env.NODE_ENV !== 'test') {
544
+ log.warn("Keystore created from env: it's recommended to use a file-based key store for production");
525
545
  }
526
546
  ValidatorClient.validateKeyStoreConfiguration(keyStoreManager, log);
527
547
  }
@@ -552,7 +572,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
552
572
  if (config.rollupVersion !== Number(rollupVersionFromRollup)) {
553
573
  log.warn(`Registry looked up and returned a rollup with version (${config.rollupVersion}), but this does not match with version detected from the rollup directly: (${rollupVersionFromRollup}).`);
554
574
  }
555
- const blobClient = await createBlobClientWithFileStores(config, createLogger('node:blob-client:client'));
575
+ const blobClient = await createBlobClientWithFileStores(config, log.createChild('blob-client'));
556
576
  // attempt snapshot sync if possible
557
577
  await trySnapshotSync(config, log);
558
578
  const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config, {
@@ -658,20 +678,22 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
658
678
  const validatorAddresses = keyStoreManager ? NodeKeystoreAdapter.fromKeyStoreManager(keyStoreManager).getAddresses() : [];
659
679
  slasherClient = await createSlasher(config, config.l1Contracts, getPublicClient(config), watchers, dateProvider, epochCache, validatorAddresses, undefined);
660
680
  await slasherClient.start();
661
- const l1TxUtils = config.publisherForwarderAddress ? await createForwarderL1TxUtilsFromEthSigner(publicClient, keyStoreManager.createAllValidatorPublisherSigners(), config.publisherForwarderAddress, {
681
+ const l1TxUtils = config.sequencerPublisherForwarderAddress ? await createForwarderL1TxUtilsFromSigners(publicClient, keyStoreManager.createAllValidatorPublisherSigners(), config.sequencerPublisherForwarderAddress, {
662
682
  ...config,
663
683
  scope: 'sequencer'
664
684
  }, {
665
685
  telemetry,
666
686
  logger: log.createChild('l1-tx-utils'),
667
- dateProvider
668
- }) : await createL1TxUtilsWithBlobsFromEthSigner(publicClient, keyStoreManager.createAllValidatorPublisherSigners(), {
687
+ dateProvider,
688
+ kzg: Blob.getViemKzgInstance()
689
+ }) : await createL1TxUtilsFromSigners(publicClient, keyStoreManager.createAllValidatorPublisherSigners(), {
669
690
  ...config,
670
691
  scope: 'sequencer'
671
692
  }, {
672
693
  telemetry,
673
694
  logger: log.createChild('l1-tx-utils'),
674
- dateProvider
695
+ dateProvider,
696
+ kzg: Blob.getViemKzgInstance()
675
697
  });
676
698
  // Create and start the sequencer client
677
699
  const checkpointsBuilder = new CheckpointsBuilder({
@@ -702,13 +724,35 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
702
724
  } else if (sequencer) {
703
725
  log.warn(`Sequencer created but not started`);
704
726
  }
727
+ // Create prover node subsystem if enabled
728
+ let proverNode;
729
+ if (config.enableProverNode) {
730
+ proverNode = await createProverNode(config, {
731
+ ...deps.proverNodeDeps,
732
+ telemetry,
733
+ dateProvider,
734
+ archiver,
735
+ worldStateSynchronizer,
736
+ p2pClient,
737
+ epochCache,
738
+ blobClient,
739
+ keyStoreManager
740
+ });
741
+ if (!options.dontStartProverNode) {
742
+ await proverNode.start();
743
+ log.info(`Prover node subsystem started`);
744
+ } else {
745
+ log.info(`Prover node subsystem created but not started`);
746
+ }
747
+ }
705
748
  const globalVariableBuilder = new GlobalVariableBuilder({
706
749
  ...config,
707
750
  rollupVersion: BigInt(config.rollupVersion),
708
751
  l1GenesisTime,
709
752
  slotDuration: Number(slotDuration)
710
753
  });
711
- return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, slasherClient, validatorsSentinel, epochPruneWatcher, ethereumChain.chainInfo.id, config.rollupVersion, globalVariableBuilder, epochCache, packageVersion, proofVerifier, telemetry, log, blobClient);
754
+ const node = new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, proverNode, slasherClient, validatorsSentinel, epochPruneWatcher, ethereumChain.chainInfo.id, config.rollupVersion, globalVariableBuilder, epochCache, packageVersion, proofVerifier, telemetry, log, blobClient, validatorClient, keyStoreManager);
755
+ return node;
712
756
  }
713
757
  /**
714
758
  * Returns the sequencer client instance.
@@ -716,6 +760,9 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
716
760
  */ getSequencer() {
717
761
  return this.sequencer;
718
762
  }
763
+ /** Returns the prover node subsystem, if enabled. */ getProverNode() {
764
+ return this.proverNode;
765
+ }
719
766
  getBlockSource() {
720
767
  return this.blockSource;
721
768
  }
@@ -758,7 +805,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
758
805
  rollupVersion,
759
806
  enr,
760
807
  l1ContractAddresses: contractAddresses,
761
- protocolContractAddresses: protocolContractAddresses
808
+ protocolContractAddresses: protocolContractAddresses,
809
+ realProofs: !!this.config.realProofs
762
810
  };
763
811
  return nodeInfo;
764
812
  }
@@ -767,8 +815,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
767
815
  * @param block - The block parameter (block number, block hash, or 'latest').
768
816
  * @returns The requested block.
769
817
  */ async getBlock(block) {
770
- if (BlockHash.isL2BlockHash(block)) {
771
- return this.getBlockByHash(Fr.fromBuffer(block.toBuffer()));
818
+ if (BlockHash.isBlockHash(block)) {
819
+ return this.getBlockByHash(block);
772
820
  }
773
821
  const blockNumber = block === 'latest' ? await this.getBlockNumber() : block;
774
822
  if (blockNumber === BlockNumber.ZERO) {
@@ -782,7 +830,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
782
830
  * @returns The requested block.
783
831
  */ async getBlockByHash(blockHash) {
784
832
  const initialBlockHash = await this.#getInitialHeaderHash();
785
- if (blockHash.equals(Fr.fromBuffer(initialBlockHash.toBuffer()))) {
833
+ if (blockHash.equals(initialBlockHash)) {
786
834
  return this.buildInitialBlock();
787
835
  }
788
836
  return await this.blockSource.getL2BlockByHash(blockHash);
@@ -867,8 +915,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
867
915
  if (referenceBlock) {
868
916
  const initialBlockHash = await this.#getInitialHeaderHash();
869
917
  if (!referenceBlock.equals(initialBlockHash)) {
870
- const blockHashFr = Fr.fromBuffer(referenceBlock.toBuffer());
871
- const header = await this.blockSource.getBlockHeaderByHash(blockHashFr);
918
+ const header = await this.blockSource.getBlockHeaderByHash(referenceBlock);
872
919
  if (!header) {
873
920
  throw new Error(`Block ${referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`);
874
921
  }
@@ -880,8 +927,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
880
927
  if (referenceBlock) {
881
928
  const initialBlockHash = await this.#getInitialHeaderHash();
882
929
  if (!referenceBlock.equals(initialBlockHash)) {
883
- const blockHashFr = Fr.fromBuffer(referenceBlock.toBuffer());
884
- const header = await this.blockSource.getBlockHeaderByHash(blockHashFr);
930
+ const header = await this.blockSource.getBlockHeaderByHash(referenceBlock);
885
931
  if (!header) {
886
932
  throw new Error(`Block ${referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`);
887
933
  }
@@ -959,6 +1005,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
959
1005
  await tryStop(this.slasherClient);
960
1006
  await tryStop(this.proofVerifier);
961
1007
  await tryStop(this.sequencer);
1008
+ await tryStop(this.proverNode);
962
1009
  await tryStop(this.p2pClient);
963
1010
  await tryStop(this.worldStateSynchronizer);
964
1011
  await tryStop(this.blockSource);
@@ -997,8 +1044,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
997
1044
  */ async getTxsByHash(txHashes) {
998
1045
  return compactArray(await Promise.all(txHashes.map((txHash)=>this.getTxByHash(txHash))));
999
1046
  }
1000
- async findLeavesIndexes(block, treeId, leafValues) {
1001
- const committedDb = await this.#getWorldState(block);
1047
+ async findLeavesIndexes(referenceBlock, treeId, leafValues) {
1048
+ const committedDb = await this.#getWorldState(referenceBlock);
1002
1049
  const maybeIndices = await committedDb.findLeafIndices(treeId, leafValues.map((x)=>x.toBuffer()));
1003
1050
  // We filter out undefined values
1004
1051
  const indices = maybeIndices.filter((x)=>x !== undefined);
@@ -1041,35 +1088,27 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1041
1088
  }
1042
1089
  return {
1043
1090
  l2BlockNumber: BlockNumber(Number(blockNumber)),
1044
- l2BlockHash: BlockHash.fromField(blockHash),
1091
+ l2BlockHash: new BlockHash(blockHash),
1045
1092
  data: index
1046
1093
  };
1047
1094
  });
1048
1095
  }
1049
- async getNullifierSiblingPath(block, leafIndex) {
1050
- const committedDb = await this.#getWorldState(block);
1051
- return committedDb.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, leafIndex);
1052
- }
1053
- async getNoteHashSiblingPath(block, leafIndex) {
1054
- const committedDb = await this.#getWorldState(block);
1055
- return committedDb.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
1056
- }
1057
- async getArchiveMembershipWitness(block, archive) {
1058
- const committedDb = await this.#getWorldState(block);
1096
+ async getBlockHashMembershipWitness(referenceBlock, blockHash) {
1097
+ const committedDb = await this.#getWorldState(referenceBlock);
1059
1098
  const [pathAndIndex] = await committedDb.findSiblingPaths(MerkleTreeId.ARCHIVE, [
1060
- archive
1099
+ blockHash
1061
1100
  ]);
1062
1101
  return pathAndIndex === undefined ? undefined : MembershipWitness.fromSiblingPath(pathAndIndex.index, pathAndIndex.path);
1063
1102
  }
1064
- async getNoteHashMembershipWitness(block, noteHash) {
1065
- const committedDb = await this.#getWorldState(block);
1103
+ async getNoteHashMembershipWitness(referenceBlock, noteHash) {
1104
+ const committedDb = await this.#getWorldState(referenceBlock);
1066
1105
  const [pathAndIndex] = await committedDb.findSiblingPaths(MerkleTreeId.NOTE_HASH_TREE, [
1067
1106
  noteHash
1068
1107
  ]);
1069
1108
  return pathAndIndex === undefined ? undefined : MembershipWitness.fromSiblingPath(pathAndIndex.index, pathAndIndex.path);
1070
1109
  }
1071
- async getL1ToL2MessageMembershipWitness(block, l1ToL2Message) {
1072
- const db = await this.#getWorldState(block);
1110
+ async getL1ToL2MessageMembershipWitness(referenceBlock, l1ToL2Message) {
1111
+ const db = await this.#getWorldState(referenceBlock);
1073
1112
  const [witness] = await db.findSiblingPaths(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [
1074
1113
  l1ToL2Message
1075
1114
  ]);
@@ -1116,16 +1155,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1116
1155
  }
1117
1156
  return blocksInCheckpoints.map((blocks)=>blocks.map((block)=>block.body.txEffects.map((txEffect)=>txEffect.l2ToL1Msgs)));
1118
1157
  }
1119
- async getArchiveSiblingPath(block, leafIndex) {
1120
- const committedDb = await this.#getWorldState(block);
1121
- return committedDb.getSiblingPath(MerkleTreeId.ARCHIVE, leafIndex);
1122
- }
1123
- async getPublicDataSiblingPath(block, leafIndex) {
1124
- const committedDb = await this.#getWorldState(block);
1125
- return committedDb.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
1126
- }
1127
- async getNullifierMembershipWitness(block, nullifier) {
1128
- const db = await this.#getWorldState(block);
1158
+ async getNullifierMembershipWitness(referenceBlock, nullifier) {
1159
+ const db = await this.#getWorldState(referenceBlock);
1129
1160
  const [witness] = await db.findSiblingPaths(MerkleTreeId.NULLIFIER_TREE, [
1130
1161
  nullifier.toBuffer()
1131
1162
  ]);
@@ -1141,7 +1172,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1141
1172
  }
1142
1173
  /**
1143
1174
  * Returns a low nullifier membership witness for a given nullifier at a given block.
1144
- * @param block - The block parameter (block number, block hash, or 'latest') at which to get the data.
1175
+ * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data
1176
+ * (which contains the root of the nullifier tree in which we are searching for the nullifier).
1145
1177
  * @param nullifier - Nullifier we try to find the low nullifier witness for.
1146
1178
  * @returns The low nullifier membership witness (if found).
1147
1179
  * @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
@@ -1152,8 +1184,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1152
1184
  * the nullifier already exists in the tree. This is because the `getPreviousValueIndex` function returns the
1153
1185
  * index of the nullifier itself when it already exists in the tree.
1154
1186
  * TODO: This is a confusing behavior and we should eventually address that.
1155
- */ async getLowNullifierMembershipWitness(block, nullifier) {
1156
- const committedDb = await this.#getWorldState(block);
1187
+ */ async getLowNullifierMembershipWitness(referenceBlock, nullifier) {
1188
+ const committedDb = await this.#getWorldState(referenceBlock);
1157
1189
  const findResult = await committedDb.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBigInt());
1158
1190
  if (!findResult) {
1159
1191
  return undefined;
@@ -1166,8 +1198,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1166
1198
  const siblingPath = await committedDb.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, BigInt(index));
1167
1199
  return new NullifierMembershipWitness(BigInt(index), preimageData, siblingPath);
1168
1200
  }
1169
- async getPublicDataWitness(block, leafSlot) {
1170
- const committedDb = await this.#getWorldState(block);
1201
+ async getPublicDataWitness(referenceBlock, leafSlot) {
1202
+ const committedDb = await this.#getWorldState(referenceBlock);
1171
1203
  const lowLeafResult = await committedDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
1172
1204
  if (!lowLeafResult) {
1173
1205
  return undefined;
@@ -1177,8 +1209,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1177
1209
  return new PublicDataWitness(lowLeafResult.index, preimage, path);
1178
1210
  }
1179
1211
  }
1180
- async getPublicStorageAt(block, contract, slot) {
1181
- const committedDb = await this.#getWorldState(block);
1212
+ async getPublicStorageAt(referenceBlock, contract, slot) {
1213
+ const committedDb = await this.#getWorldState(referenceBlock);
1182
1214
  const leafSlot = await computePublicDataTreeLeafSlot(contract, slot);
1183
1215
  const lowLeafResult = await committedDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
1184
1216
  if (!lowLeafResult || !lowLeafResult.alreadyPresent) {
@@ -1188,14 +1220,13 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1188
1220
  return preimage.leaf.value;
1189
1221
  }
1190
1222
  async getBlockHeader(block = 'latest') {
1191
- if (BlockHash.isL2BlockHash(block)) {
1223
+ if (BlockHash.isBlockHash(block)) {
1192
1224
  const initialBlockHash = await this.#getInitialHeaderHash();
1193
1225
  if (block.equals(initialBlockHash)) {
1194
1226
  // Block source doesn't handle initial header so we need to handle the case separately.
1195
1227
  return this.worldStateSynchronizer.getCommitted().getInitialHeader();
1196
1228
  }
1197
- const blockHashFr = Fr.fromBuffer(block.toBuffer());
1198
- return this.blockSource.getBlockHeaderByHash(blockHashFr);
1229
+ return this.blockSource.getBlockHeaderByHash(block);
1199
1230
  } else {
1200
1231
  // Block source doesn't handle initial header so we need to handle the case separately.
1201
1232
  const blockNumber = block === 'latest' ? await this.getBlockNumber() : block;
@@ -1212,6 +1243,12 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1212
1243
  */ async getBlockHeaderByArchive(archive) {
1213
1244
  return await this.blockSource.getBlockHeaderByArchive(archive);
1214
1245
  }
1246
+ getBlockData(number) {
1247
+ return this.blockSource.getBlockData(number);
1248
+ }
1249
+ getBlockDataByArchive(archive) {
1250
+ return this.blockSource.getBlockDataByArchive(archive);
1251
+ }
1215
1252
  /**
1216
1253
  * Simulates the public part of a transaction with the current state.
1217
1254
  * @param tx - The transaction to simulate.
@@ -1224,7 +1261,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1224
1261
  throw new BadRequestError(`Transaction total gas limit ${txGasLimit + teardownGasLimit} (${txGasLimit} + ${teardownGasLimit}) exceeds maximum gas limit ${this.config.rpcSimulatePublicMaxGasLimit} for simulation`);
1225
1262
  }
1226
1263
  const txHash = tx.getTxHash();
1227
- const blockNumber = BlockNumber(await this.blockSource.getBlockNumber() + 1);
1264
+ const latestBlockNumber = await this.blockSource.getBlockNumber();
1265
+ const blockNumber = BlockNumber.add(latestBlockNumber, 1);
1228
1266
  // If sequencer is not initialized, we just set these values to zero for simulation.
1229
1267
  const coinbase = EthAddress.ZERO;
1230
1268
  const feeRecipient = AztecAddress.ZERO;
@@ -1235,6 +1273,8 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1235
1273
  txHash,
1236
1274
  blockNumber
1237
1275
  });
1276
+ // Ensure world-state has caught up with the latest block we loaded from the archiver
1277
+ await this.worldStateSynchronizer.syncImmediate(latestBlockNumber);
1238
1278
  const merkleTreeFork = await this.worldStateSynchronizer.fork();
1239
1279
  try {
1240
1280
  const config = PublicSimulatorConfig.from({
@@ -1268,7 +1308,7 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1268
1308
  async isValidTx(tx, { isSimulation, skipFeeEnforcement } = {}) {
1269
1309
  const db = this.worldStateSynchronizer.getCommitted();
1270
1310
  const verifier = isSimulation ? undefined : this.proofVerifier;
1271
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1311
+ // We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field)
1272
1312
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1273
1313
  const blockNumber = BlockNumber(await this.blockSource.getBlockNumber() + 1);
1274
1314
  const validator = createValidatorForAcceptingTxs(db, this.contractDataSource, verifier, {
@@ -1422,6 +1462,73 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1422
1462
  return this.slasherClient.gatherOffensesForRound(round === 'current' ? undefined : BigInt(round));
1423
1463
  }
1424
1464
  }
1465
+ async reloadKeystore() {
1466
+ if (!this.config.keyStoreDirectory?.length) {
1467
+ throw new BadRequestError('Cannot reload keystore: node is not using a file-based keystore. ' + 'Set KEY_STORE_DIRECTORY to use file-based keystores.');
1468
+ }
1469
+ if (!this.validatorClient) {
1470
+ throw new BadRequestError('Cannot reload keystore: validator is not enabled.');
1471
+ }
1472
+ this.log.info('Reloading keystore from disk');
1473
+ // Re-read and validate keystore files
1474
+ const keyStores = loadKeystores(this.config.keyStoreDirectory);
1475
+ const newManager = new KeystoreManager(mergeKeystores(keyStores));
1476
+ await newManager.validateSigners();
1477
+ ValidatorClient.validateKeyStoreConfiguration(newManager, this.log);
1478
+ // Validate that every validator's publisher keys overlap with the L1 signers
1479
+ // that were initialized at startup. Publishers cannot be hot-reloaded, so a
1480
+ // validator with a publisher key that doesn't match any existing L1 signer
1481
+ // would silently fail on every proposer slot.
1482
+ if (this.keyStoreManager && this.sequencer) {
1483
+ const oldAdapter = NodeKeystoreAdapter.fromKeyStoreManager(this.keyStoreManager);
1484
+ const availablePublishers = new Set(oldAdapter.getAttesterAddresses().flatMap((a)=>oldAdapter.getPublisherAddresses(a).map((p)=>p.toString().toLowerCase())));
1485
+ const newAdapter = NodeKeystoreAdapter.fromKeyStoreManager(newManager);
1486
+ for (const attester of newAdapter.getAttesterAddresses()){
1487
+ const pubs = newAdapter.getPublisherAddresses(attester);
1488
+ if (pubs.length > 0 && !pubs.some((p)=>availablePublishers.has(p.toString().toLowerCase()))) {
1489
+ throw new BadRequestError(`Cannot reload keystore: validator ${attester} has publisher keys ` + `[${pubs.map((p)=>p.toString()).join(', ')}] but none match the L1 signers initialized at startup ` + `[${[
1490
+ ...availablePublishers
1491
+ ].join(', ')}]. Publishers cannot be hot-reloaded — ` + `use an existing publisher key or restart the node.`);
1492
+ }
1493
+ }
1494
+ }
1495
+ // Build adapters for old and new keystores to compute diff
1496
+ const newAdapter = NodeKeystoreAdapter.fromKeyStoreManager(newManager);
1497
+ const newAddresses = newAdapter.getAttesterAddresses();
1498
+ const oldAddresses = this.keyStoreManager ? NodeKeystoreAdapter.fromKeyStoreManager(this.keyStoreManager).getAttesterAddresses() : [];
1499
+ const oldSet = new Set(oldAddresses.map((a)=>a.toString()));
1500
+ const newSet = new Set(newAddresses.map((a)=>a.toString()));
1501
+ const added = newAddresses.filter((a)=>!oldSet.has(a.toString()));
1502
+ const removed = oldAddresses.filter((a)=>!newSet.has(a.toString()));
1503
+ if (added.length > 0) {
1504
+ this.log.info(`Keystore reload: adding attester keys: ${added.map((a)=>a.toString()).join(', ')}`);
1505
+ }
1506
+ if (removed.length > 0) {
1507
+ this.log.info(`Keystore reload: removing attester keys: ${removed.map((a)=>a.toString()).join(', ')}`);
1508
+ }
1509
+ if (added.length === 0 && removed.length === 0) {
1510
+ this.log.info('Keystore reload: attester keys unchanged');
1511
+ }
1512
+ // Update the validator client (coinbase, feeRecipient, attester keys)
1513
+ this.validatorClient.reloadKeystore(newManager);
1514
+ // Update the publisher factory's keystore so newly-added validators
1515
+ // can be matched to existing publisher keys when proposing blocks.
1516
+ if (this.sequencer) {
1517
+ this.sequencer.updatePublisherNodeKeyStore(newAdapter);
1518
+ }
1519
+ // Update slasher's "don't-slash-self" list with new validator addresses
1520
+ if (this.slasherClient && !this.config.slashSelfAllowed) {
1521
+ const slashValidatorsNever = unique([
1522
+ ...this.config.slashValidatorsNever ?? [],
1523
+ ...newAddresses
1524
+ ].map((a)=>a.toString())).map(EthAddress.fromString);
1525
+ this.slasherClient.updateConfig({
1526
+ slashValidatorsNever
1527
+ });
1528
+ }
1529
+ this.keyStoreManager = newManager;
1530
+ this.log.info('Keystore reloaded: coinbase, feeRecipient, and attester keys updated');
1531
+ }
1425
1532
  #getInitialHeaderHash() {
1426
1533
  if (!this.initialHeaderHashPromise) {
1427
1534
  this.initialHeaderHashPromise = this.worldStateSynchronizer.getCommitted().getInitialHeader().hash();
@@ -1444,14 +1551,13 @@ _dec = trackSpan('AztecNodeService.simulatePublicCalls', (tx)=>({
1444
1551
  this.log.debug(`Using committed db for block 'latest', world state synced upto ${blockSyncedTo}`);
1445
1552
  return this.worldStateSynchronizer.getCommitted();
1446
1553
  }
1447
- if (BlockHash.isL2BlockHash(block)) {
1554
+ if (BlockHash.isBlockHash(block)) {
1448
1555
  const initialBlockHash = await this.#getInitialHeaderHash();
1449
1556
  if (block.equals(initialBlockHash)) {
1450
1557
  // Block source doesn't handle initial header so we need to handle the case separately.
1451
1558
  return this.worldStateSynchronizer.getSnapshot(BlockNumber.ZERO);
1452
1559
  }
1453
- const blockHashFr = Fr.fromBuffer(block.toBuffer());
1454
- const header = await this.blockSource.getBlockHeaderByHash(blockHashFr);
1560
+ const header = await this.blockSource.getBlockHeaderByHash(block);
1455
1561
  if (!header) {
1456
1562
  throw new Error(`Block hash ${block.toString()} not found when querying world state. If the node API has been queried with anchor block hash possibly a reorg has occurred.`);
1457
1563
  }
@@ -77,7 +77,7 @@ export declare class Sentinel extends Sentinel_base implements L2BlockStreamEven
77
77
  /** Computes stats for a single validator. */
78
78
  getValidatorStats(validatorAddress: EthAddress, fromSlot?: SlotNumber, toSlot?: SlotNumber): Promise<SingleValidatorStats | undefined>;
79
79
  protected computeStatsForValidator(address: `0x${string}`, allHistory: ValidatorStatusHistory, fromSlot?: SlotNumber, toSlot?: SlotNumber): ValidatorStats;
80
- protected computeMissed(history: ValidatorStatusHistory, computeOverPrefix: ValidatorStatusType | undefined, filter: ValidatorStatusInSlot[]): {
80
+ protected computeMissed(history: ValidatorStatusHistory, computeOverCategory: ValidatorStatusType | undefined, filter: ValidatorStatusInSlot[]): {
81
81
  currentStreak: number;
82
82
  rate: number | undefined;
83
83
  count: number;
@@ -90,4 +90,4 @@ export declare class Sentinel extends Sentinel_base implements L2BlockStreamEven
90
90
  } | undefined;
91
91
  }
92
92
  export {};
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudGluZWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZW50aW5lbC9zZW50aW5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFxQixLQUFLLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBSUwsS0FBSyxPQUFPLEVBQ1osS0FBSyxjQUFjLEVBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUNMLEtBQUssYUFBYSxFQUNsQixhQUFhLEVBQ2IsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFFL0IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEtBQUssRUFDVixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixlQUFlLEVBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFJbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFM0MscUJBQWEsUUFBUyxTQUFRLGFBQTJDLFlBQVcseUJBQXlCLEVBQUUsT0FBTztJQWNsSCxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDaEMsU0FBUyxDQUFDLFFBQVEsRUFBRSxhQUFhO0lB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
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudGluZWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZW50aW5lbC9zZW50aW5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFxQixLQUFLLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBSUwsS0FBSyxPQUFPLEVBQ1osS0FBSyxjQUFjLEVBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUNMLEtBQUssYUFBYSxFQUNsQixhQUFhLEVBQ2IsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFFL0IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEtBQUssRUFDVixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixlQUFlLEVBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFJbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFhM0MscUJBQWEsUUFBUyxTQUFRLGFBQTJDLFlBQVcseUJBQXlCLEVBQUUsT0FBTztJQWNsSCxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDaEMsU0FBUyxDQUFDLFFBQVEsRUFBRSxhQUFhO0lB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
@@ -1 +1 @@
1
- {"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../src/sentinel/sentinel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../src/sentinel/sentinel.ts"],"names":[],"mappings":"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"}