@aztec/p2p 0.86.0-starknet.1 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  2. package/dest/client/factory.d.ts +1 -1
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +11 -13
  5. package/dest/client/interface.d.ts +10 -1
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +18 -6
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +103 -53
  10. package/dest/config.d.ts +5 -6
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +6 -11
  13. package/dest/enr/generate-enr.d.ts +7 -0
  14. package/dest/enr/generate-enr.d.ts.map +1 -1
  15. package/dest/enr/generate-enr.js +23 -2
  16. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  17. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  18. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -0
  19. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  20. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +44 -14
  21. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +2 -0
  22. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/tx_pool/memory_tx_pool.js +6 -0
  24. package/dest/mem_pools/tx_pool/tx_pool.d.ts +7 -0
  25. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  27. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +13 -5
  28. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  29. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  30. package/dest/msg_validators/tx_validator/data_validator.js +15 -14
  31. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +0 -2
  32. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  33. package/dest/msg_validators/tx_validator/double_spend_validator.js +2 -2
  34. package/dest/msg_validators/tx_validator/factory.d.ts +14 -0
  35. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  36. package/dest/msg_validators/tx_validator/factory.js +62 -0
  37. package/dest/msg_validators/tx_validator/gas_validator.js +3 -3
  38. package/dest/msg_validators/tx_validator/metadata_validator.js +5 -5
  39. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  40. package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
  41. package/dest/msg_validators/tx_validator/tx_proof_validator.js +1 -1
  42. package/dest/services/discv5/discV5_service.d.ts +2 -2
  43. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  44. package/dest/services/discv5/discV5_service.js +9 -13
  45. package/dest/services/dummy_service.d.ts +3 -3
  46. package/dest/services/dummy_service.d.ts.map +1 -1
  47. package/dest/services/dummy_service.js +6 -1
  48. package/dest/services/encoding.d.ts +1 -3
  49. package/dest/services/encoding.d.ts.map +1 -1
  50. package/dest/services/libp2p/libp2p_service.d.ts +4 -2
  51. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  52. package/dest/services/libp2p/libp2p_service.js +87 -88
  53. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  54. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  55. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  56. package/dest/services/peer-manager/peer_manager.js +11 -2
  57. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  58. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -2
  59. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  60. package/dest/services/reqresp/connection-sampler/connection_sampler.js +41 -21
  61. package/dest/services/reqresp/interface.d.ts +1 -3
  62. package/dest/services/reqresp/interface.d.ts.map +1 -1
  63. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  64. package/dest/services/reqresp/protocols/goodbye.d.ts +0 -2
  65. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  66. package/dest/services/reqresp/protocols/goodbye.js +1 -1
  67. package/dest/services/reqresp/protocols/ping.d.ts +0 -2
  68. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  69. package/dest/services/reqresp/protocols/status.d.ts +0 -2
  70. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  71. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  72. package/dest/services/reqresp/reqresp.d.ts +1 -3
  73. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  74. package/dest/services/reqresp/reqresp.js +2 -2
  75. package/dest/services/service.d.ts +3 -2
  76. package/dest/services/service.d.ts.map +1 -1
  77. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  78. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  79. package/dest/test-helpers/make-test-p2p-clients.js +2 -2
  80. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  81. package/dest/test-helpers/reqresp-nodes.js +1 -1
  82. package/dest/testbench/p2p_client_testbench_worker.js +9 -6
  83. package/dest/testbench/testbench.js +1 -1
  84. package/dest/testbench/worker_client_manager.d.ts +0 -1
  85. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  86. package/dest/testbench/worker_client_manager.js +2 -2
  87. package/dest/types/index.d.ts +1 -0
  88. package/dest/types/index.d.ts.map +1 -1
  89. package/dest/types/index.js +1 -0
  90. package/dest/versioning.d.ts +2 -2
  91. package/dest/versioning.d.ts.map +1 -1
  92. package/dest/versioning.js +6 -1
  93. package/package.json +15 -15
  94. package/src/bootstrap/bootstrap.ts +1 -1
  95. package/src/client/factory.ts +33 -32
  96. package/src/client/interface.ts +13 -1
  97. package/src/client/p2p_client.ts +129 -55
  98. package/src/config.ts +11 -18
  99. package/src/enr/generate-enr.ts +33 -3
  100. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +2 -2
  101. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +4 -1
  102. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +72 -34
  103. package/src/mem_pools/tx_pool/memory_tx_pool.ts +12 -1
  104. package/src/mem_pools/tx_pool/tx_pool.ts +9 -0
  105. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +9 -3
  106. package/src/msg_validators/tx_validator/block_header_validator.ts +1 -1
  107. package/src/msg_validators/tx_validator/data_validator.ts +24 -18
  108. package/src/msg_validators/tx_validator/double_spend_validator.ts +2 -2
  109. package/src/msg_validators/tx_validator/factory.ts +94 -0
  110. package/src/msg_validators/tx_validator/gas_validator.ts +3 -3
  111. package/src/msg_validators/tx_validator/metadata_validator.ts +5 -5
  112. package/src/msg_validators/tx_validator/phases_validator.ts +6 -2
  113. package/src/msg_validators/tx_validator/tx_proof_validator.ts +1 -1
  114. package/src/services/discv5/discV5_service.ts +14 -12
  115. package/src/services/dummy_service.ts +8 -2
  116. package/src/services/libp2p/libp2p_service.ts +95 -107
  117. package/src/services/peer-manager/metrics.ts +4 -1
  118. package/src/services/peer-manager/peer_manager.ts +18 -1
  119. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +5 -1
  120. package/src/services/reqresp/connection-sampler/connection_sampler.ts +42 -19
  121. package/src/services/reqresp/metrics.ts +4 -1
  122. package/src/services/reqresp/protocols/goodbye.ts +1 -1
  123. package/src/services/reqresp/rate-limiter/rate_limiter.ts +4 -1
  124. package/src/services/reqresp/reqresp.ts +2 -1
  125. package/src/services/service.ts +4 -1
  126. package/src/test-helpers/make-test-p2p-clients.ts +2 -1
  127. package/src/test-helpers/reqresp-nodes.ts +1 -1
  128. package/src/testbench/p2p_client_testbench_worker.ts +8 -4
  129. package/src/testbench/testbench.ts +1 -1
  130. package/src/testbench/worker_client_manager.ts +2 -2
  131. package/src/types/index.ts +1 -0
  132. package/src/versioning.ts +8 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD;;GAEG;AACH,qBAAa,aAAc,YAAW,eAAe;IAKjD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,IAAI,CAAC,CAA0C;IACvD,OAAO,CAAC,MAAM,CAAC,CAAS;gBAGd,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,eAAe,EAC1B,MAAM,yCAAgC;IAGhD;;;;OAIG;IACU,KAAK,CAAC,MAAM,EAAE,cAAc;IAwEzC;;;OAGG;IACU,IAAI;IAOjB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,YAAY;IAMpB;;;OAGG;IACI,SAAS;IAKT,MAAM;IAKN,aAAa;IAKb,eAAe;CAIvB"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD;;GAEG;AACH,qBAAa,aAAc,YAAW,eAAe;IAKjD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,IAAI,CAAC,CAAiC;IAC9C,OAAO,CAAC,MAAM,CAAC,CAAS;gBAGd,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,eAAe,EAC1B,MAAM,yCAAgC;IAGhD;;;;OAIG;IACU,KAAK,CAAC,MAAM,EAAE,cAAc;IAwEzC;;;OAGG;IACU,IAAI;IAOjB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,YAAY;IAMpB;;;OAGG;IACI,SAAS;IAKT,MAAM;IAKN,aAAa;IAKb,eAAe;CAIvB"}
@@ -20,6 +20,6 @@ type P2PClientDeps<T extends P2PClientType> = {
20
20
  export declare const P2P_STORE_NAME = "p2p";
21
21
  export declare const P2P_ARCHIVE_STORE_NAME = "p2p-archive";
22
22
  export declare const P2P_PEER_STORE_NAME = "p2p-peers";
23
- export declare const createP2PClient: <T extends P2PClientType>(clientType: T, _config: P2PConfig & DataStoreConfig, archiver: L2BlockSource & ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, epochCache: EpochCacheInterface, telemetry?: TelemetryClient, deps?: P2PClientDeps<T>) => Promise<P2PClient<T>>;
23
+ export declare const createP2PClient: <T extends P2PClientType>(clientType: T, _config: P2PConfig & DataStoreConfig, archiver: L2BlockSource & ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, epochCache: EpochCacheInterface, packageVersion: string, telemetry?: TelemetryClient, deps?: P2PClientDeps<T>) => Promise<P2PClient<T>>;
24
24
  export {};
25
25
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/client/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAGzF,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAM3E,KAAK,aAAa,CAAC,CAAC,SAAS,aAAa,IAAI;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,SAAS,aAAa,CAAC,IAAI,GAAG,eAAe,GAAG,SAAS,CAAC;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,eAAe,wCACd,CAAC,WACJ,SAAS,GAAG,eAAe,YAC1B,aAAa,GAAG,kBAAkB,iBAC7B,6BAA6B,0BACpB,sBAAsB,cAClC,mBAAmB,cACpB,eAAe,SACpB,cAAc,CAAC,CAAC,0BA0DvB,CAAC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/client/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAGzF,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAM3E,KAAK,aAAa,CAAC,CAAC,SAAS,aAAa,IAAI;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,SAAS,aAAa,CAAC,IAAI,GAAG,eAAe,GAAG,SAAS,CAAC;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,eAAe,GAAU,CAAC,SAAS,aAAa,EAC3D,YAAY,CAAC,EACb,SAAS,SAAS,GAAG,eAAe,EACpC,UAAU,aAAa,GAAG,kBAAkB,EAC5C,eAAe,6BAA6B,EAC5C,wBAAwB,sBAAsB,EAC9C,YAAY,mBAAmB,EAC/B,gBAAgB,MAAM,EACtB,YAAW,eAAsC,EACjD,OAAM,aAAa,CAAC,CAAC,CAAM,0BA0D5B,CAAC"}
@@ -12,13 +12,13 @@ import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerI
12
12
  export const P2P_STORE_NAME = 'p2p';
13
13
  export const P2P_ARCHIVE_STORE_NAME = 'p2p-archive';
14
14
  export const P2P_PEER_STORE_NAME = 'p2p-peers';
15
- export const createP2PClient = async (clientType, _config, archiver, proofVerifier, worldStateSynchronizer, epochCache, telemetry = getTelemetryClient(), deps = {})=>{
15
+ export const createP2PClient = async (clientType, _config, archiver, proofVerifier, worldStateSynchronizer, epochCache, packageVersion, telemetry = getTelemetryClient(), deps = {})=>{
16
16
  let config = {
17
17
  ..._config,
18
18
  dataStoreMapSizeKB: _config.p2pStoreMapSizeKb ?? _config.dataStoreMapSizeKB
19
19
  };
20
20
  const logger = deps.logger ?? createLogger('p2p');
21
- const store = deps.store ?? await createStore(P2P_STORE_NAME, 1, config, createLogger('p2p:lmdb-v2'));
21
+ const store = deps.store ?? await createStore(P2P_STORE_NAME, 2, config, createLogger('p2p:lmdb-v2'));
22
22
  const archive = await createStore(P2P_ARCHIVE_STORE_NAME, 1, config, createLogger('p2p-archive:lmdb-v2'));
23
23
  const peerStore = await createStore(P2P_PEER_STORE_NAME, 1, config, createLogger('p2p-peer:lmdb-v2'));
24
24
  const mempools = {
@@ -28,18 +28,16 @@ export const createP2PClient = async (clientType, _config, archiver, proofVerifi
28
28
  }),
29
29
  attestationPool: clientType === P2PClientType.Full ? deps.attestationPool ?? new InMemoryAttestationPool(telemetry) : undefined
30
30
  };
31
- let p2pService;
32
- if (_config.p2pEnabled) {
33
- logger.verbose('P2P is enabled. Using LibP2P service.');
34
- config = await configureP2PClientAddresses(_config);
35
- // Create peer discovery service
36
- const peerIdPrivateKey = await getPeerIdPrivateKey(config, store, logger);
37
- const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
38
- const discoveryService = new DiscV5Service(peerId, config, telemetry, createLogger(`${logger.module}:discv5_service`));
39
- p2pService = await LibP2PService.new(clientType, config, discoveryService, peerId, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, peerStore, telemetry, createLogger(`${logger.module}:libp2p_service`));
40
- } else {
31
+ if (!_config.p2pEnabled) {
41
32
  logger.verbose('P2P is disabled. Using dummy P2P service');
42
- p2pService = new DummyP2PService();
33
+ return new P2PClient(clientType, store, archiver, mempools, new DummyP2PService(), config, telemetry);
43
34
  }
35
+ logger.verbose('P2P is enabled. Using LibP2P service.');
36
+ config = await configureP2PClientAddresses(_config);
37
+ // Create peer discovery service
38
+ const peerIdPrivateKey = await getPeerIdPrivateKey(config, store, logger);
39
+ const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
40
+ const discoveryService = new DiscV5Service(peerId, config, packageVersion, telemetry, createLogger(`${logger.module}:discv5_service`));
41
+ const p2pService = await LibP2PService.new(clientType, config, discoveryService, peerId, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, peerStore, telemetry, createLogger(`${logger.module}:libp2p_service`));
44
42
  return new P2PClient(clientType, store, archiver, mempools, p2pService, config, telemetry);
45
43
  };
@@ -35,7 +35,7 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApi<T> & {
35
35
  *
36
36
  * @param proposal - the block proposal
37
37
  */
38
- broadcastProposal(proposal: BlockProposal): void;
38
+ broadcastProposal(proposal: BlockProposal): Promise<void>;
39
39
  /**
40
40
  * Registers a callback from the validator client that determines how to behave when
41
41
  * foreign block proposals are received
@@ -116,6 +116,11 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApi<T> & {
116
116
  iteratePendingTxs(): AsyncIterableIterator<Tx>;
117
117
  /** Returns the number of pending txs in the mempool. */
118
118
  getPendingTxCount(): Promise<number>;
119
+ /**
120
+ * Marks transactions as non-evictable in the pool.
121
+ * @param txHashes - Hashes of the transactions to mark as non-evictable.
122
+ */
123
+ markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void>;
119
124
  /**
120
125
  * Starts the p2p client.
121
126
  * @returns A promise signalling the completion of the block sync.
@@ -142,5 +147,9 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApi<T> & {
142
147
  /** Identifies a p2p client. */
143
148
  isP2PClient(): true;
144
149
  updateP2PConfig(config: Partial<P2PConfig>): Promise<void>;
150
+ /** Validates a set of txs. */
151
+ validate(txs: Tx[]): Promise<void>;
152
+ /** Clears the db. */
153
+ clear(): Promise<void>;
145
154
  };
146
155
  //# sourceMappingURL=interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/client/interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/client/interface.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ import { type P2P, type P2PSyncState } from './interface.js';
15
15
  */
16
16
  export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> extends WithTracer implements P2P, P2P<P2PClientType.Prover> {
17
17
  #private;
18
+ private store;
18
19
  private l2BlockSource;
19
20
  private p2pService;
20
21
  private telemetry;
@@ -26,9 +27,11 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
26
27
  private syncResolve?;
27
28
  private latestBlockNumberAtStart;
28
29
  private provenBlockNumberAtStart;
30
+ private finalizedBlockNumberAtStart;
29
31
  private synchedBlockHashes;
30
32
  private synchedLatestBlockNumber;
31
33
  private synchedProvenBlockNumber;
34
+ private synchedFinalizedBlockNumber;
32
35
  private synchedLatestSlot;
33
36
  private txPool;
34
37
  private attestationPool;
@@ -43,12 +46,14 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
43
46
  * @param log - A logger.
44
47
  */
45
48
  constructor(_clientType: T, store: AztecAsyncKVStore, l2BlockSource: L2BlockSource & ContractDataSource, mempools: MemPools<T>, p2pService: P2PService, config?: Partial<P2PConfig>, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
49
+ clear(): Promise<void>;
46
50
  isP2PClient(): true;
47
51
  getPeers(includePending?: boolean): Promise<PeerInfo[]>;
48
52
  getL2BlockHash(number: number): Promise<string | undefined>;
49
53
  updateP2PConfig(config: Partial<P2PConfig>): Promise<void>;
50
54
  getL2Tips(): Promise<L2Tips>;
51
55
  handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
56
+ private setBlockHash;
52
57
  /**
53
58
  * Starts the P2P client.
54
59
  * @returns An empty promise signalling the synching process.
@@ -62,7 +67,7 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
62
67
  stop(): Promise<void>;
63
68
  /** Triggers a sync to the archiver. Used for testing. */
64
69
  sync(): Promise<void>;
65
- broadcastProposal(proposal: BlockProposal): void;
70
+ broadcastProposal(proposal: BlockProposal): Promise<void>;
66
71
  getAttestationsForSlot(slot: bigint, proposalId?: string): Promise<BlockAttestation[]>;
67
72
  addAttestation(attestation: BlockAttestation): Promise<void>;
68
73
  registerBlockProposalHandler(handler: (block: BlockProposal) => Promise<BlockAttestation | undefined>): void;
@@ -112,9 +117,9 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
112
117
  * Returns transactions in the transaction pool by hash.
113
118
  * If a transaction is not in the pool, it will be requested from the network.
114
119
  * @param txHashes - Hashes of the transactions to look for.
115
- * @returns The txs found, not necessarily on the same order as the hashes.
120
+ * @returns The txs found, or undefined if not found in the order requested.
116
121
  */
117
- getTxsByHash(txHashes: TxHash[]): Promise<Tx[]>;
122
+ getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
118
123
  /**
119
124
  * Returns an archived transaction in the transaction pool by its hash.
120
125
  * @param txHash - Hash of the archived transaction to look for.
@@ -162,6 +167,7 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
162
167
  * @returns Block number of latest proven L2 Block we've synced with.
163
168
  */
164
169
  getSyncedProvenBlockNum(): Promise<number>;
170
+ getSyncedFinalizedBlockNum(): Promise<number>;
165
171
  /** Returns latest L2 slot for which we have seen an L2 block. */
166
172
  getSyncedLatestSlot(): Promise<bigint>;
167
173
  /**
@@ -190,11 +196,11 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
190
196
  /** Request txs for unproven blocks so the prover node has more chances to get them. */
191
197
  private requestMissingTxsFromUnprovenBlocks;
192
198
  /**
193
- * Handles new proven blocks by deleting the txs in them, or by deleting the txs in blocks `keepProvenTxsFor` ago.
194
- * @param blocks - A list of proven L2 blocks.
199
+ * Handles new finalized blocks by deleting the txs and attestations in them.
200
+ * @param blocks - A list of finalized L2 blocks.
195
201
  * @returns Empty promise.
196
202
  */
197
- private handleProvenL2Blocks;
203
+ private handleFinalizedL2Blocks;
198
204
  /**
199
205
  * Updates the tx pool after a chain prune.
200
206
  * @param latestBlock - The block number the chain was pruned to.
@@ -206,5 +212,11 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
206
212
  * @param newState - New state value.
207
213
  */
208
214
  private setCurrentState;
215
+ validate(txs: Tx[]): Promise<void>;
216
+ /**
217
+ * Marks transactions as non-evictable in the pool.
218
+ * @param txHashes - Hashes of the transactions to mark as non-evictable.
219
+ */
220
+ markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void>;
209
221
  }
210
222
  //# sourceMappingURL=p2p_client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"p2p_client.d.ts","sourceRoot":"","sources":["../../src/client/p2p_client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"p2p_client.d.ts","sourceRoot":"","sources":["../../src/client/p2p_client.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import { P2PClientState } from './interface.js';
13
13
  /**
14
14
  * The P2P client implementation.
15
15
  */ export class P2PClient extends WithTracer {
16
+ store;
16
17
  l2BlockSource;
17
18
  p2pService;
18
19
  telemetry;
@@ -23,9 +24,11 @@ import { P2PClientState } from './interface.js';
23
24
  syncResolve;
24
25
  latestBlockNumberAtStart;
25
26
  provenBlockNumberAtStart;
27
+ finalizedBlockNumberAtStart;
26
28
  synchedBlockHashes;
27
29
  synchedLatestBlockNumber;
28
30
  synchedProvenBlockNumber;
31
+ synchedFinalizedBlockNumber;
29
32
  synchedLatestSlot;
30
33
  txPool;
31
34
  attestationPool;
@@ -39,7 +42,7 @@ import { P2PClientState } from './interface.js';
39
42
  * @param p2pService - The concrete instance of p2p networking to use.
40
43
  * @param log - A logger.
41
44
  */ constructor(_clientType, store, l2BlockSource, mempools, p2pService, config = {}, telemetry = getTelemetryClient(), log = createLogger('p2p')){
42
- super(telemetry, 'P2PClient'), this.l2BlockSource = l2BlockSource, this.p2pService = p2pService, this.telemetry = telemetry, this.log = log, this.currentState = P2PClientState.IDLE, this.syncPromise = Promise.resolve(), this.syncResolve = undefined, this.latestBlockNumberAtStart = -1, this.provenBlockNumberAtStart = -1;
45
+ super(telemetry, 'P2PClient'), this.store = store, this.l2BlockSource = l2BlockSource, this.p2pService = p2pService, this.telemetry = telemetry, this.log = log, this.currentState = P2PClientState.IDLE, this.syncPromise = Promise.resolve(), this.syncResolve = undefined, this.latestBlockNumberAtStart = -1, this.provenBlockNumberAtStart = -1, this.finalizedBlockNumberAtStart = -1;
43
46
  this.config = {
44
47
  ...getP2PDefaultConfig(),
45
48
  ...config
@@ -50,8 +53,12 @@ import { P2PClientState } from './interface.js';
50
53
  this.synchedBlockHashes = store.openMap('p2p_pool_block_hashes');
51
54
  this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
52
55
  this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
56
+ this.synchedFinalizedBlockNumber = store.openSingleton('p2p_pool_last_finalized_l2_block');
53
57
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
54
58
  }
59
+ clear() {
60
+ return this.store.clear();
61
+ }
55
62
  isP2PClient() {
56
63
  return true;
57
64
  }
@@ -72,21 +79,27 @@ import { P2PClientState } from './interface.js';
72
79
  let latestBlockHash;
73
80
  const provenBlockNumber = await this.getSyncedProvenBlockNum();
74
81
  let provenBlockHash;
82
+ const finalizedBlockNumber = await this.getSyncedFinalizedBlockNum();
83
+ let finalizedBlockHash;
75
84
  if (latestBlockNumber > 0) {
76
85
  latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
77
86
  if (typeof latestBlockHash === 'undefined') {
78
- this.log.warn(`Block hash for latest block ${latestBlockNumber} not found`);
79
- throw new Error();
87
+ throw new Error(`Block hash for latest block ${latestBlockNumber} not found in p2p client`);
80
88
  }
81
89
  }
82
90
  if (provenBlockNumber > 0) {
83
91
  provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
84
92
  if (typeof provenBlockHash === 'undefined') {
85
- this.log.warn(`Block hash for proven block ${provenBlockNumber} not found`);
86
- throw new Error();
93
+ throw new Error(`Block hash for proven block ${provenBlockNumber} not found in p2p client`);
94
+ }
95
+ }
96
+ if (finalizedBlockNumber > 0) {
97
+ finalizedBlockHash = await this.synchedBlockHashes.getAsync(finalizedBlockNumber);
98
+ if (typeof finalizedBlockHash === 'undefined') {
99
+ throw new Error(`Block hash for finalized block ${finalizedBlockNumber} not found in p2p client`);
87
100
  }
88
101
  }
89
- return Promise.resolve({
102
+ return {
90
103
  latest: {
91
104
  hash: latestBlockHash,
92
105
  number: latestBlockNumber
@@ -96,10 +109,10 @@ import { P2PClientState } from './interface.js';
96
109
  number: provenBlockNumber
97
110
  },
98
111
  finalized: {
99
- hash: provenBlockHash,
100
- number: provenBlockNumber
112
+ hash: finalizedBlockHash,
113
+ number: finalizedBlockNumber
101
114
  }
102
- });
115
+ };
103
116
  }
104
117
  async handleBlockStreamEvent(event) {
105
118
  this.log.debug(`Handling block stream event ${event.type}`);
@@ -108,17 +121,24 @@ import { P2PClientState } from './interface.js';
108
121
  await this.handleLatestL2Blocks(event.blocks);
109
122
  break;
110
123
  case 'chain-finalized':
111
- break;
112
- case 'chain-proven':
113
124
  {
114
- const from = await this.getSyncedProvenBlockNum() + 1;
125
+ // TODO (alexg): I think we can prune the block hashes map here
126
+ await this.setBlockHash(event.block);
127
+ const from = await this.getSyncedFinalizedBlockNum() + 1;
115
128
  const limit = event.block.number - from + 1;
116
129
  if (limit > 0) {
117
- await this.handleProvenL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
130
+ await this.handleFinalizedL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
118
131
  }
119
132
  break;
120
133
  }
134
+ case 'chain-proven':
135
+ {
136
+ await this.setBlockHash(event.block);
137
+ await this.synchedProvenBlockNumber.set(event.block.number);
138
+ break;
139
+ }
121
140
  case 'chain-pruned':
141
+ await this.setBlockHash(event.block);
122
142
  await this.handlePruneL2Blocks(event.block.number);
123
143
  break;
124
144
  default:
@@ -128,6 +148,11 @@ import { P2PClientState } from './interface.js';
128
148
  }
129
149
  }
130
150
  }
151
+ async setBlockHash(block) {
152
+ if (block.hash !== undefined) {
153
+ await this.synchedBlockHashes.set(block.number, block.hash.toString());
154
+ }
155
+ }
131
156
  #assertIsReady() {
132
157
  // this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
133
158
  if (!this.isReady()) {
@@ -145,10 +170,13 @@ import { P2PClientState } from './interface.js';
145
170
  return this.syncPromise;
146
171
  }
147
172
  // get the current latest block numbers
148
- this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
149
- this.provenBlockNumberAtStart = await this.l2BlockSource.getProvenBlockNumber();
173
+ const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
174
+ this.latestBlockNumberAtStart = latestBlockNumbers.latest.number;
175
+ this.provenBlockNumberAtStart = latestBlockNumbers.proven.number;
176
+ this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.number;
150
177
  const syncedLatestBlock = await this.getSyncedLatestBlockNum() + 1;
151
178
  const syncedProvenBlock = await this.getSyncedProvenBlockNum() + 1;
179
+ const syncedFinalizedBlock = await this.getSyncedFinalizedBlockNum() + 1;
152
180
  if (await this.txPool.isEmpty() && (this.attestationPool === undefined || await this.attestationPool?.isEmpty())) {
153
181
  // if mempools are empty, we don't care about syncing prior blocks
154
182
  this.initBlockStream(this.latestBlockNumberAtStart);
@@ -156,7 +184,7 @@ import { P2PClientState } from './interface.js';
156
184
  this.syncPromise = Promise.resolve();
157
185
  await this.p2pService.start();
158
186
  this.log.info(`Starting p2p client from block ${this.latestBlockNumberAtStart} with empty mempools`);
159
- } else if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart) {
187
+ } else if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart || syncedFinalizedBlock <= this.finalizedBlockNumberAtStart) {
160
188
  // if there are blocks to be retrieved, go to a synching state
161
189
  // this gets resolved on `startServiceIfSynched`
162
190
  this.initBlockStream();
@@ -164,9 +192,10 @@ import { P2PClientState } from './interface.js';
164
192
  this.syncPromise = new Promise((resolve)=>{
165
193
  this.syncResolve = resolve;
166
194
  });
167
- this.log.verbose(`Initiating p2p sync from ${syncedLatestBlock}`, {
195
+ this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
168
196
  syncedLatestBlock,
169
- syncedProvenBlock
197
+ syncedProvenBlock,
198
+ syncedFinalizedBlock
170
199
  });
171
200
  } else {
172
201
  // if no blocks to be retrieved, go straight to running
@@ -176,7 +205,8 @@ import { P2PClientState } from './interface.js';
176
205
  await this.p2pService.start();
177
206
  this.log.info(`Starting P2P client synced to ${syncedLatestBlock}`, {
178
207
  syncedLatestBlock,
179
- syncedProvenBlock
208
+ syncedProvenBlock,
209
+ syncedFinalizedBlock
180
210
  });
181
211
  }
182
212
  this.blockStream.start();
@@ -259,16 +289,15 @@ import { P2PClientState } from './interface.js';
259
289
  await this.txPool.addTxs(filteredTxs);
260
290
  }
261
291
  const txHashesStr = txHashes.map((tx)=>tx.toString()).join(', ');
262
- this.log.debug(`Received batched txs ${txHashesStr} (${txs.length} / ${txHashes.length}}) from peers`);
292
+ this.log.debug(`Requested txs ${txHashesStr} (${filteredTxs.length} / ${txHashes.length}}) from peers`);
263
293
  // We return all transactions, even the not found ones to the caller, such they can handle missing items themselves.
264
294
  return txs;
265
295
  }
266
296
  getPendingTxs() {
267
- return Promise.resolve(this.getTxs('pending'));
297
+ return this.getTxs('pending');
268
298
  }
269
- async getPendingTxCount() {
270
- const pendingTxs = await this.txPool.getPendingTxHashes();
271
- return pendingTxs.length;
299
+ getPendingTxCount() {
300
+ return this.txPool.getPendingTxCount();
272
301
  }
273
302
  async *iteratePendingTxs() {
274
303
  for (const txHash of (await this.txPool.getPendingTxHashes())){
@@ -330,7 +359,7 @@ import { P2PClientState } from './interface.js';
330
359
  * Returns transactions in the transaction pool by hash.
331
360
  * If a transaction is not in the pool, it will be requested from the network.
332
361
  * @param txHashes - Hashes of the transactions to look for.
333
- * @returns The txs found, not necessarily on the same order as the hashes.
362
+ * @returns The txs found, or undefined if not found in the order requested.
334
363
  */ async getTxsByHash(txHashes) {
335
364
  const txs = await Promise.all(txHashes.map((txHash)=>this.txPool.getTxByHash(txHash)));
336
365
  const missingTxHashes = txs.map((tx, index)=>[
@@ -342,7 +371,25 @@ import { P2PClientState } from './interface.js';
342
371
  }
343
372
  const missingTxs = await this.requestTxsByHash(missingTxHashes);
344
373
  const fetchedMissingTxs = missingTxs.filter((tx)=>!!tx);
345
- return txs.filter((tx)=>!!tx).concat(fetchedMissingTxs);
374
+ // TODO: optimize
375
+ // Merge the found txs in order
376
+ const mergingTxsPromises = txHashes.map(async (txHash)=>{
377
+ // Is it in the txs list from the mempool?
378
+ for (const tx of txs){
379
+ if (tx !== undefined && (await tx.getTxHash()).equals(txHash)) {
380
+ return tx;
381
+ }
382
+ }
383
+ // Is it in the fetched missing txs?
384
+ for (const tx of fetchedMissingTxs){
385
+ if (tx !== undefined && (await tx.getTxHash()).equals(txHash)) {
386
+ return tx;
387
+ }
388
+ }
389
+ // Otherwise return undefined
390
+ return undefined;
391
+ });
392
+ return await Promise.all(mergingTxsPromises);
346
393
  }
347
394
  /**
348
395
  * Returns an archived transaction in the transaction pool by its hash.
@@ -359,7 +406,7 @@ import { P2PClientState } from './interface.js';
359
406
  await this.addTxs([
360
407
  tx
361
408
  ]);
362
- this.p2pService.propagate(tx);
409
+ await this.p2pService.propagate(tx);
363
410
  }
364
411
  /**
365
412
  * Adds transactions to the pool. Does not send to peers or validate the txs.
@@ -408,6 +455,9 @@ import { P2PClientState } from './interface.js';
408
455
  */ async getSyncedProvenBlockNum() {
409
456
  return await this.synchedProvenBlockNumber.getAsync() ?? INITIAL_L2_BLOCK_NUM - 1;
410
457
  }
458
+ async getSyncedFinalizedBlockNum() {
459
+ return await this.synchedFinalizedBlockNumber.getAsync() ?? INITIAL_L2_BLOCK_NUM - 1;
460
+ }
411
461
  /** Returns latest L2 slot for which we have seen an L2 block. */ async getSyncedLatestSlot() {
412
462
  return await this.synchedLatestSlot.getAsync() ?? BigInt(0);
413
463
  }
@@ -457,7 +507,10 @@ import { P2PClientState } from './interface.js';
457
507
  await this.markTxsAsMinedFromBlocks(blocks.map((b)=>b.block));
458
508
  void this.requestMissingTxsFromUnprovenBlocks(blocks.map((b)=>b.block));
459
509
  const lastBlock = blocks.at(-1).block;
460
- await Promise.all(blocks.map(async (block)=>this.synchedBlockHashes.set(block.block.number, (await block.block.hash()).toString())));
510
+ await Promise.all(blocks.map(async (block)=>this.setBlockHash({
511
+ number: block.block.number,
512
+ hash: await block.block.hash().then((h)=>h.toString())
513
+ })));
461
514
  await this.synchedLatestBlockNumber.set(lastBlock.number);
462
515
  await this.synchedLatestSlot.set(lastBlock.header.getSlot());
463
516
  this.log.verbose(`Synched to latest block ${lastBlock.number}`);
@@ -483,34 +536,20 @@ import { P2PClientState } from './interface.js';
483
536
  }
484
537
  }
485
538
  /**
486
- * Handles new proven blocks by deleting the txs in them, or by deleting the txs in blocks `keepProvenTxsFor` ago.
487
- * @param blocks - A list of proven L2 blocks.
539
+ * Handles new finalized blocks by deleting the txs and attestations in them.
540
+ * @param blocks - A list of finalized L2 blocks.
488
541
  * @returns Empty promise.
489
- */ async handleProvenL2Blocks(blocks) {
542
+ */ async handleFinalizedL2Blocks(blocks) {
543
+ this.log.trace(`Handling finalized blocks ${blocks.length} up to ${blocks.at(-1)?.number}`);
490
544
  if (!blocks.length) {
491
545
  return Promise.resolve();
492
546
  }
493
- const { keepAttestationsInPoolFor, keepProvenTxsInPoolFor: keepProvenTxsFor } = this.config;
494
- const firstBlockNum = blocks[0].number;
495
547
  const lastBlockNum = blocks[blocks.length - 1].number;
496
- const lastBlockSlot = blocks[blocks.length - 1].header.globalVariables.slotNumber.toBigInt();
497
- // If keepProvenTxsFor is 0, we delete all txs from all proven blocks.
498
- if (keepProvenTxsFor === 0) {
499
- await this.deleteTxsFromBlocks(blocks);
500
- } else if (lastBlockNum - keepProvenTxsFor >= INITIAL_L2_BLOCK_NUM) {
501
- const fromBlock = Math.max(INITIAL_L2_BLOCK_NUM, firstBlockNum - keepProvenTxsFor);
502
- const toBlock = lastBlockNum - keepProvenTxsFor;
503
- const limit = toBlock - fromBlock + 1;
504
- const blocksToDeleteTxsFrom = await this.l2BlockSource.getBlocks(fromBlock, limit, true);
505
- await this.deleteTxsFromBlocks(blocksToDeleteTxsFrom);
506
- }
507
- // We delete attestations older than the last block slot minus the number of slots we want to keep in the pool.
508
- const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(keepAttestationsInPoolFor);
509
- if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) {
510
- await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
511
- }
512
- await this.synchedProvenBlockNumber.set(lastBlockNum);
513
- this.log.debug(`Synched to proven block ${lastBlockNum}`);
548
+ const lastBlockSlot = blocks[blocks.length - 1].header.getSlot();
549
+ await this.deleteTxsFromBlocks(blocks);
550
+ await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlot);
551
+ await this.synchedFinalizedBlockNumber.set(lastBlockNum);
552
+ this.log.debug(`Synched to finalized block ${lastBlockNum}`);
514
553
  await this.startServiceIfSynched();
515
554
  }
516
555
  /**
@@ -558,12 +597,14 @@ import { P2PClientState } from './interface.js';
558
597
  if (this.currentState !== P2PClientState.SYNCHING) {
559
598
  return;
560
599
  }
600
+ const syncedFinalizedBlock = await this.getSyncedFinalizedBlockNum();
561
601
  const syncedProvenBlock = await this.getSyncedProvenBlockNum();
562
602
  const syncedLatestBlock = await this.getSyncedLatestBlockNum();
563
- if (syncedLatestBlock >= this.latestBlockNumberAtStart && syncedProvenBlock >= this.provenBlockNumberAtStart) {
603
+ if (syncedLatestBlock >= this.latestBlockNumberAtStart && syncedProvenBlock >= this.provenBlockNumberAtStart && syncedFinalizedBlock >= this.finalizedBlockNumberAtStart) {
564
604
  this.log.info(`Completed P2P client sync to block ${syncedLatestBlock}. Starting service.`, {
565
605
  syncedLatestBlock,
566
- syncedProvenBlock
606
+ syncedProvenBlock,
607
+ syncedFinalizedBlock
567
608
  });
568
609
  this.setCurrentState(P2PClientState.RUNNING);
569
610
  if (this.syncResolve !== undefined) {
@@ -580,6 +621,15 @@ import { P2PClientState } from './interface.js';
580
621
  this.currentState = newState;
581
622
  this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
582
623
  }
624
+ validate(txs) {
625
+ return this.p2pService.validate(txs);
626
+ }
627
+ /**
628
+ * Marks transactions as non-evictable in the pool.
629
+ * @param txHashes - Hashes of the transactions to mark as non-evictable.
630
+ */ markTxsAsNonEvictable(txHashes) {
631
+ return this.txPool.markTxsAsNonEvictable(txHashes);
632
+ }
583
633
  }
584
634
  _ts_decorate([
585
635
  trackSpan('p2pClient.broadcastProposal', async (proposal)=>({
package/dest/config.d.ts CHANGED
@@ -70,10 +70,6 @@ export interface P2PConfig extends P2PReqRespConfig, ChainConfig {
70
70
  * If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false.
71
71
  */
72
72
  queryForIp: boolean;
73
- /** How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven) */
74
- keepProvenTxsInPoolFor: number;
75
- /** How many slots to keep attestations for. */
76
- keepAttestationsInPoolFor: number;
77
73
  /**
78
74
  * The interval of the gossipsub heartbeat to perform maintenance tasks.
79
75
  */
@@ -106,6 +102,10 @@ export interface P2PConfig extends P2PReqRespConfig, ChainConfig {
106
102
  * How many message cache windows to include when gossiping with other pears.
107
103
  */
108
104
  gossipsubMcacheGossip: number;
105
+ /**
106
+ * How long to keep message IDs in the seen cache (ms).
107
+ */
108
+ gossipsubSeenTTL: number;
109
109
  /**
110
110
  * The 'age' (in # of L2 blocks) of a processed tx after which we heavily penalize a peer for re-sending it.
111
111
  */
@@ -186,8 +186,6 @@ export declare const bootnodeConfigMappings: ConfigMappingsType<Pick<{
186
186
  bootstrapNodesAsFullPeers: unknown;
187
187
  maxPeerCount: unknown;
188
188
  queryForIp: unknown;
189
- keepProvenTxsInPoolFor: unknown;
190
- keepAttestationsInPoolFor: unknown;
191
189
  gossipsubInterval: unknown;
192
190
  gossipsubD: unknown;
193
191
  gossipsubDlo: unknown;
@@ -196,6 +194,7 @@ export declare const bootnodeConfigMappings: ConfigMappingsType<Pick<{
196
194
  gossipsubFloodPublish: unknown;
197
195
  gossipsubMcacheLength: unknown;
198
196
  gossipsubMcacheGossip: unknown;
197
+ gossipsubSeenTTL: unknown;
199
198
  doubleSpendSeverePeerPenaltyWindow: unknown;
200
199
  gossipsubTxTopicWeight: unknown;
201
200
  gossipsubTxInvalidMessageDeliveriesWeight: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}