@aztec/p2p 0.49.2 → 0.51.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 (63) hide show
  1. package/dest/attestation_pool/attestation_pool.d.ts +39 -0
  2. package/dest/attestation_pool/attestation_pool.d.ts.map +1 -0
  3. package/dest/attestation_pool/attestation_pool.js +2 -0
  4. package/dest/attestation_pool/index.d.ts +3 -0
  5. package/dest/attestation_pool/index.d.ts.map +1 -0
  6. package/dest/attestation_pool/index.js +3 -0
  7. package/dest/attestation_pool/memory_attestation_pool.d.ts +12 -0
  8. package/dest/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
  9. package/dest/attestation_pool/memory_attestation_pool.js +56 -0
  10. package/dest/attestation_pool/mocks.d.ts +16 -0
  11. package/dest/attestation_pool/mocks.d.ts.map +1 -0
  12. package/dest/attestation_pool/mocks.js +29 -0
  13. package/dest/client/index.d.ts +2 -1
  14. package/dest/client/index.d.ts.map +1 -1
  15. package/dest/client/index.js +11 -5
  16. package/dest/client/p2p_client.d.ts +33 -2
  17. package/dest/client/p2p_client.d.ts.map +1 -1
  18. package/dest/client/p2p_client.js +20 -5
  19. package/dest/index.d.ts +1 -0
  20. package/dest/index.d.ts.map +1 -1
  21. package/dest/index.js +2 -1
  22. package/dest/service/discV5_service.d.ts.map +1 -1
  23. package/dest/service/discV5_service.js +4 -3
  24. package/dest/service/dummy_service.d.ts +10 -4
  25. package/dest/service/dummy_service.d.ts.map +1 -1
  26. package/dest/service/dummy_service.js +14 -4
  27. package/dest/service/libp2p_service.d.ts +25 -6
  28. package/dest/service/libp2p_service.d.ts.map +1 -1
  29. package/dest/service/libp2p_service.js +55 -10
  30. package/dest/service/reqresp/handlers.d.ts +3 -0
  31. package/dest/service/reqresp/handlers.d.ts.map +1 -0
  32. package/dest/service/reqresp/handlers.js +7 -0
  33. package/dest/service/reqresp/index.d.ts +6 -0
  34. package/dest/service/reqresp/index.d.ts.map +1 -0
  35. package/dest/service/reqresp/index.js +6 -0
  36. package/dest/service/reqresp/interface.d.ts +11 -0
  37. package/dest/service/reqresp/interface.d.ts.map +1 -0
  38. package/dest/service/reqresp/interface.js +10 -0
  39. package/dest/service/reqresp/reqresp.d.ts +48 -0
  40. package/dest/service/reqresp/reqresp.d.ts.map +1 -0
  41. package/dest/service/reqresp/reqresp.js +112 -0
  42. package/dest/service/service.d.ts +6 -3
  43. package/dest/service/service.d.ts.map +1 -1
  44. package/dest/util.d.ts +1 -1
  45. package/dest/util.d.ts.map +1 -1
  46. package/dest/util.js +31 -12
  47. package/package.json +8 -7
  48. package/src/attestation_pool/attestation_pool.ts +42 -0
  49. package/src/attestation_pool/index.ts +2 -0
  50. package/src/attestation_pool/memory_attestation_pool.ts +70 -0
  51. package/src/attestation_pool/mocks.ts +33 -0
  52. package/src/client/index.ts +12 -3
  53. package/src/client/p2p_client.ts +63 -3
  54. package/src/index.ts +1 -0
  55. package/src/service/discV5_service.ts +3 -2
  56. package/src/service/dummy_service.ts +17 -4
  57. package/src/service/libp2p_service.ts +74 -7
  58. package/src/service/reqresp/handlers.ts +7 -0
  59. package/src/service/reqresp/index.ts +4 -0
  60. package/src/service/reqresp/interface.ts +13 -0
  61. package/src/service/reqresp/reqresp.ts +130 -0
  62. package/src/service/service.ts +10 -3
  63. package/src/util.ts +30 -10
@@ -19,15 +19,22 @@ export class DummyP2PService {
19
19
  return Promise.resolve();
20
20
  }
21
21
  /**
22
- * Called to have the given transaction propagated through the P2P network.
23
- * @param _ - The transaction to be propagated.
22
+ * Called to have the given message propagated through the P2P network.
23
+ * @param _ - The message to be propagated.
24
24
  */
25
- propagateTx(_) { }
25
+ propagate(_) { }
26
26
  /**
27
27
  * Called upon receipt of settled transactions.
28
28
  * @param _ - The hashes of the settled transactions.
29
29
  */
30
30
  settledTxs(_) { }
31
+ /**
32
+ * Register a callback into the validator client for when a block proposal is received
33
+ */
34
+ registerBlockReceivedCallback(_) { }
35
+ getEnr() {
36
+ return undefined;
37
+ }
31
38
  }
32
39
  /**
33
40
  * A dummy implementation of the Peer Discovery Service.
@@ -69,5 +76,8 @@ export class DummyPeerDiscoveryService extends EventEmitter {
69
76
  getStatus() {
70
77
  return this.currentState;
71
78
  }
79
+ getEnr() {
80
+ return undefined;
81
+ }
72
82
  }
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL2R1bW15X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sRUFBOEMsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQjs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLENBQUssSUFBRyxDQUFDO0lBRTVCOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxDQUFXLElBQUcsQ0FBQztDQUNsQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLFlBQVk7SUFBM0Q7O1FBQ1UsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7SUFvQ3BELENBQUM7SUFuQ0M7OztPQUdHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBQy9DLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxlQUFlLENBQUMsQ0FBUztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL2R1bW15X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sRUFBOEMsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQjs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUF1QixDQUFJLElBQUcsQ0FBQztJQUUvQzs7O09BR0c7SUFDSSxVQUFVLENBQUMsQ0FBVyxJQUFHLENBQUM7SUFFakM7O09BRUc7SUFDSSw2QkFBNkIsQ0FBQyxDQUFzRCxJQUFHLENBQUM7SUFFeEYsTUFBTTtRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLFlBQVk7SUFBM0Q7O1FBQ1UsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7SUF3Q3BELENBQUM7SUF2Q0M7OztPQUdHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBQy9DLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxlQUFlLENBQUMsQ0FBUztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIn0=
@@ -1,9 +1,11 @@
1
- import { Tx } from '@aztec/circuit-types';
1
+ import { BlockAttestation, BlockProposal, type Gossipable } from '@aztec/circuit-types';
2
2
  import type { AztecKVStore } from '@aztec/kv-store';
3
+ import { type ENR } from '@chainsafe/enr';
3
4
  import { type GossipsubEvents } from '@chainsafe/libp2p-gossipsub';
4
5
  import type { PeerId, PubSub } from '@libp2p/interface';
5
6
  import '@libp2p/kad-dht';
6
7
  import { type Libp2p } from 'libp2p';
8
+ import { type AttestationPool } from '../attestation_pool/attestation_pool.js';
7
9
  import { type P2PConfig } from '../config.js';
8
10
  import { type TxPool } from '../tx_pool/index.js';
9
11
  import type { P2PService, PeerDiscoveryService } from './service.js';
@@ -26,11 +28,13 @@ export declare class LibP2PService implements P2PService {
26
28
  private node;
27
29
  private peerDiscoveryService;
28
30
  private txPool;
31
+ private attestationPool;
29
32
  private logger;
30
33
  private jobQueue;
31
34
  private peerManager;
32
35
  private discoveryRunningPromise?;
33
- constructor(config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, txPool: TxPool, logger?: import("@aztec/foundation/log").Logger);
36
+ private blockReceivedCallback;
37
+ constructor(config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, txPool: TxPool, attestationPool: AttestationPool, logger?: import("@aztec/foundation/log").Logger);
34
38
  /**
35
39
  * Starts the LibP2P service.
36
40
  * @returns An empty promise.
@@ -47,7 +51,9 @@ export declare class LibP2PService implements P2PService {
47
51
  * @param txPool - The transaction pool to be accessed by the service.
48
52
  * @returns The new service.
49
53
  */
50
- static new(config: P2PConfig, peerDiscoveryService: PeerDiscoveryService, peerId: PeerId, txPool: TxPool, store: AztecKVStore): Promise<LibP2PService>;
54
+ static new(config: P2PConfig, peerDiscoveryService: PeerDiscoveryService, peerId: PeerId, txPool: TxPool, attestationPool: AttestationPool, store: AztecKVStore): Promise<LibP2PService>;
55
+ getEnr(): ENR | undefined;
56
+ registerBlockReceivedCallback(callback: (block: BlockProposal) => Promise<BlockAttestation | undefined>): void;
51
57
  /**
52
58
  * Subscribes to a topic.
53
59
  * @param topic - The topic to subscribe to.
@@ -66,11 +72,24 @@ export declare class LibP2PService implements P2PService {
66
72
  * @param data - The message data
67
73
  */
68
74
  private handleNewGossipMessage;
75
+ /**Process Attestation From Peer
76
+ * When a proposal is received from a peer, we add it to the attestation pool, so it can be accessed by other services.
77
+ *
78
+ * @param attestation - The attestation to process.
79
+ */
80
+ private processAttestationFromPeer;
81
+ /**Process block from peer
82
+ *
83
+ * Pass the received block to the validator client
84
+ *
85
+ * @param block - The block to process.
86
+ */
87
+ private processBlockFromPeer;
69
88
  /**
70
- * Propagates the provided transaction to peers.
71
- * @param tx - The transaction to propagate.
89
+ * Propagates provided message to peers.
90
+ * @param message - The message to propagate.
72
91
  */
73
- propagateTx(tx: Tx): void;
92
+ propagate<T extends Gossipable>(message: T): void;
74
93
  private processTxFromPeer;
75
94
  private sendToPeers;
76
95
  private stopLibP2P;
@@ -1 +1 @@
1
- {"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../src/service/libp2p_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAI3G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,6BAA6B,CAAC;AAI9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,iBAAiB,CAAC;AAIzB,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;KACjC,CAAC;CACH;AACD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS7E;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,UAAU;IAK5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,uBAAuB,CAAC,CAAiB;gBAEvC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,YAAY,EAClB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,MAAM,EACd,MAAM,yCAA4C;IAK5D;;;OAGG;IACU,KAAK;IAyClB;;;OAGG;IACU,IAAI;IAYjB;;;;;OAKG;WACiB,GAAG,CACrB,MAAM,EAAE,SAAS,EACjB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;IAuDrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;YACW,cAAc;IAS5B;;;;OAIG;YACW,sBAAsB;IASpC;;;OAGG;IACI,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;YAIlB,iBAAiB;YAOjB,WAAW;YAWX,UAAU;CAYzB"}
1
+ {"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../src/service/libp2p_service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,UAAU,EAKhB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,6BAA6B,CAAC;AAI9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,iBAAiB,CAAC;AAIzB,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;KACjC,CAAC;CACH;AACD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS7E;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,UAAU;IAQ5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,MAAM;IAZhB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,uBAAuB,CAAC,CAAiB;IAEjD,OAAO,CAAC,qBAAqB,CAAkE;gBAGrF,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,YAAY,EAClB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,MAAM,yCAA4C;IAY5D;;;OAGG;IACU,KAAK;IAyClB;;;OAGG;IACU,IAAI;IAYjB;;;;;OAKG;WACiB,GAAG,CACrB,MAAM,EAAE,SAAS,EACjB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,YAAY;IAuDd,MAAM,IAAI,GAAG,GAAG,SAAS;IAIzB,6BAA6B,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAK9G;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;YACW,cAAc;IAS5B;;;;OAIG;YACW,sBAAsB;IAiBpC;;;;OAIG;YACW,0BAA0B;IAKxC;;;;;OAKG;YAEW,oBAAoB;IAWlC;;;OAGG;IACI,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;YAI1C,iBAAiB;YAOjB,WAAW;YAWX,UAAU;CAYzB"}
@@ -1,4 +1,4 @@
1
- import { TopicType, TopicTypeMap, Tx } from '@aztec/circuit-types';
1
+ import { BlockAttestation, BlockProposal, TopicType, TopicTypeMap, Tx, } from '@aztec/circuit-types';
2
2
  import { createDebugLogger } from '@aztec/foundation/log';
3
3
  import { SerialQueue } from '@aztec/foundation/queue';
4
4
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -33,14 +33,19 @@ export async function createLibP2PPeerId(privateKey) {
33
33
  * Lib P2P implementation of the P2PService interface.
34
34
  */
35
35
  export class LibP2PService {
36
- constructor(config, node, peerDiscoveryService, txPool, logger = createDebugLogger('aztec:libp2p_service')) {
36
+ constructor(config, node, peerDiscoveryService, txPool, attestationPool, logger = createDebugLogger('aztec:libp2p_service')) {
37
37
  this.config = config;
38
38
  this.node = node;
39
39
  this.peerDiscoveryService = peerDiscoveryService;
40
40
  this.txPool = txPool;
41
+ this.attestationPool = attestationPool;
41
42
  this.logger = logger;
42
43
  this.jobQueue = new SerialQueue();
43
44
  this.peerManager = new PeerManager(node, peerDiscoveryService, config, logger);
45
+ this.blockReceivedCallback = (block) => {
46
+ this.logger.verbose(`[WARNING] handler not yet registered: Block received callback not set. Received block ${block.p2pMessageIdentifier()} from peer.`);
47
+ return Promise.resolve(undefined);
48
+ };
44
49
  }
45
50
  /**
46
51
  * Starts the LibP2P service.
@@ -101,7 +106,7 @@ export class LibP2PService {
101
106
  * @param txPool - The transaction pool to be accessed by the service.
102
107
  * @returns The new service.
103
108
  */
104
- static async new(config, peerDiscoveryService, peerId, txPool, store) {
109
+ static async new(config, peerDiscoveryService, peerId, txPool, attestationPool, store) {
105
110
  const { tcpListenAddress, tcpAnnounceAddress, minPeerCount, maxPeerCount } = config;
106
111
  const bindAddrTcp = convertToMultiaddr(tcpListenAddress, 'tcp');
107
112
  // We know tcpAnnounceAddress cannot be null here because we set it or throw when setting up the service.
@@ -149,7 +154,14 @@ export class LibP2PService {
149
154
  }),
150
155
  },
151
156
  });
152
- return new LibP2PService(config, node, peerDiscoveryService, txPool);
157
+ return new LibP2PService(config, node, peerDiscoveryService, txPool, attestationPool);
158
+ }
159
+ getEnr() {
160
+ return this.peerDiscoveryService.getEnr();
161
+ }
162
+ registerBlockReceivedCallback(callback) {
163
+ this.blockReceivedCallback = callback;
164
+ this.logger.verbose('Block received callback registered');
153
165
  }
154
166
  /**
155
167
  * Subscribes to a topic.
@@ -184,14 +196,47 @@ export class LibP2PService {
184
196
  const tx = Tx.fromBuffer(Buffer.from(message.data));
185
197
  await this.processTxFromPeer(tx);
186
198
  }
199
+ if (message.topic === BlockAttestation.p2pTopic) {
200
+ const attestation = BlockAttestation.fromBuffer(Buffer.from(message.data));
201
+ await this.processAttestationFromPeer(attestation);
202
+ }
203
+ if (message.topic == BlockProposal.p2pTopic) {
204
+ const block = BlockProposal.fromBuffer(Buffer.from(message.data));
205
+ await this.processBlockFromPeer(block);
206
+ }
187
207
  return;
188
208
  }
209
+ /**Process Attestation From Peer
210
+ * When a proposal is received from a peer, we add it to the attestation pool, so it can be accessed by other services.
211
+ *
212
+ * @param attestation - The attestation to process.
213
+ */
214
+ async processAttestationFromPeer(attestation) {
215
+ this.logger.verbose(`Received attestation ${attestation.p2pMessageIdentifier()} from external peer.`);
216
+ await this.attestationPool.addAttestations([attestation]);
217
+ }
218
+ /**Process block from peer
219
+ *
220
+ * Pass the received block to the validator client
221
+ *
222
+ * @param block - The block to process.
223
+ */
224
+ // REVIEW: callback pattern https://github.com/AztecProtocol/aztec-packages/issues/7963
225
+ async processBlockFromPeer(block) {
226
+ this.logger.verbose(`Received block ${block.p2pMessageIdentifier()} from external peer.`);
227
+ const attestation = await this.blockReceivedCallback(block);
228
+ // TODO: fix up this pattern - the abstraction is not nice
229
+ // The attestation can be undefined if no handler is registered / the validator deems the block invalid
230
+ if (attestation != undefined) {
231
+ this.propagate(attestation);
232
+ }
233
+ }
189
234
  /**
190
- * Propagates the provided transaction to peers.
191
- * @param tx - The transaction to propagate.
235
+ * Propagates provided message to peers.
236
+ * @param message - The message to propagate.
192
237
  */
193
- propagateTx(tx) {
194
- void this.jobQueue.put(() => Promise.resolve(this.sendToPeers(tx)));
238
+ propagate(message) {
239
+ void this.jobQueue.put(() => Promise.resolve(this.sendToPeers(message)));
195
240
  }
196
241
  async processTxFromPeer(tx) {
197
242
  const txHash = tx.getTxHash();
@@ -202,7 +247,7 @@ export class LibP2PService {
202
247
  async sendToPeers(message) {
203
248
  const parent = message.constructor;
204
249
  const identifier = message.p2pMessageIdentifier().toString();
205
- this.logger.verbose(`Sending tx ${identifier} to peers`);
250
+ this.logger.verbose(`Sending message ${identifier} to peers`);
206
251
  const recipientsNum = await this.publishToTopic(parent.p2pTopic, message.toBuffer());
207
252
  this.logger.verbose(`Sent tx ${identifier} to ${recipientsNum} peers`);
208
253
  }
@@ -221,4 +266,4 @@ export class LibP2PService {
221
266
  }
222
267
  }
223
268
  }
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTBDLFNBQVMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUduRSxPQUFPLEVBQXdCLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBUWhEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLFVBQW1CO0lBQzFELElBQUksQ0FBQyxV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
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFHYixTQUFTLEVBQ1QsWUFBWSxFQUNaLEVBQUUsR0FDSCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJbkUsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUtuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVFoRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxV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
@@ -0,0 +1,3 @@
1
+ export declare function pingHandler(_msg: any): Uint8Array;
2
+ export declare function statusHandler(_msg: any): Uint8Array;
3
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/service/reqresp/handlers.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,cAEpC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,cAEtC"}
@@ -0,0 +1,7 @@
1
+ export function pingHandler(_msg) {
2
+ return Uint8Array.from(Buffer.from('pong'));
3
+ }
4
+ export function statusHandler(_msg) {
5
+ return Uint8Array.from(Buffer.from('ok'));
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZS9yZXFyZXNwL2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBUztJQUNuQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDIn0=
@@ -0,0 +1,6 @@
1
+ export {};
2
+ /**
3
+ * Request Response protocol allows nodes to ask their peers for data
4
+ * that they missed via the traditional gossip protocol.
5
+ */
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/service/reqresp/index.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,6 @@
1
+ export {};
2
+ /**
3
+ * Request Response protocol allows nodes to ask their peers for data
4
+ * that they missed via the traditional gossip protocol.
5
+ */
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZS9yZXFyZXNwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0cifQ==
@@ -0,0 +1,11 @@
1
+ export declare enum ReqRespType {
2
+ Status = "status",
3
+ Ping = "ping",
4
+ /** Ask peers for specific transactions */
5
+ TxsByHash = "txs_by_hash"
6
+ }
7
+ export declare const PING_PROTOCOL = "/aztec/ping/0.1.0";
8
+ export declare const STATUS_PROTOCOL = "/aztec/status/0.1.0";
9
+ export type SubProtocol = typeof PING_PROTOCOL | typeof STATUS_PROTOCOL;
10
+ export type SubProtocolHandler = (msg: string) => Uint8Array;
11
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/service/reqresp/interface.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,0CAA0C;IAC1C,SAAS,gBAAgB;CAC1B;AAED,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,GAAG,OAAO,eAAe,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ export var ReqRespType;
2
+ (function (ReqRespType) {
3
+ ReqRespType["Status"] = "status";
4
+ ReqRespType["Ping"] = "ping";
5
+ /** Ask peers for specific transactions */
6
+ ReqRespType["TxsByHash"] = "txs_by_hash";
7
+ })(ReqRespType || (ReqRespType = {}));
8
+ export const PING_PROTOCOL = '/aztec/ping/0.1.0';
9
+ export const STATUS_PROTOCOL = '/aztec/status/0.1.0';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2UvcmVxcmVzcC9pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksV0FLWDtBQUxELFdBQVksV0FBVztJQUNyQixnQ0FBaUIsQ0FBQTtJQUNqQiw0QkFBYSxDQUFBO0lBQ2IsMENBQTBDO0lBQzFDLHdDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMVyxXQUFXLEtBQVgsV0FBVyxRQUt0QjtBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztBQUNqRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMifQ==
@@ -0,0 +1,48 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { type Logger } from '@aztec/foundation/log';
3
+ import { type PeerId } from '@libp2p/interface';
4
+ import { type Libp2p } from 'libp2p';
5
+ import { type SubProtocol } from './interface.js';
6
+ export declare class ReqResp {
7
+ protected readonly libp2p: Libp2p;
8
+ protected readonly logger: Logger;
9
+ private abortController;
10
+ constructor(libp2p: Libp2p);
11
+ /**
12
+ * Start the reqresp service
13
+ */
14
+ start(): Promise<void>;
15
+ /**
16
+ * Stop the reqresp service
17
+ */
18
+ stop(): Promise<void>;
19
+ /**
20
+ * Send a request to peers, returns the first response
21
+ *
22
+ * @param subProtocol - The protocol being requested
23
+ * @param payload - The payload to send
24
+ * @returns - The response from the peer, otherwise undefined
25
+ */
26
+ sendRequest(subProtocol: SubProtocol, payload: Buffer): Promise<Buffer | undefined>;
27
+ /**
28
+ * Sends a request to a specific peer
29
+ *
30
+ * @param peerId - The peer to send the request to
31
+ * @param subProtocol - The protocol to use to request
32
+ * @param payload - The payload to send
33
+ * @returns If the request is successful, the response is returned, otherwise undefined
34
+ */
35
+ sendRequestToPeer(peerId: PeerId, subProtocol: SubProtocol, payload: Buffer): Promise<Buffer | undefined>;
36
+ /**
37
+ * Read a message returned from a stream into a single buffer
38
+ */
39
+ private readMessage;
40
+ /**
41
+ * Stream Handler
42
+ * Reads the incoming stream, determines the protocol, then triggers the appropriate handler
43
+ *
44
+ * @param param0 - The incoming stream data
45
+ */
46
+ private streamHandler;
47
+ }
48
+ //# sourceMappingURL=reqresp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/service/reqresp/reqresp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,OAAO,EAAkC,KAAK,WAAW,EAA2B,MAAM,gBAAgB,CAAC;AAU3G,qBAAa,OAAO;IAKN,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJ7C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,eAAe,CAA0C;gBAElC,MAAM,EAAE,MAAM;IAI7C;;OAEG;IACG,KAAK;IAOX;;OAEG;IACG,IAAI;IASV;;;;;;OAMG;IACG,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAgBzF;;;;;;;OAOG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAY/G;;OAEG;YACW,WAAW;IASzB;;;;;OAKG;YACW,aAAa;CAkB5B"}
@@ -0,0 +1,112 @@
1
+ // @attribution: lodestar impl for inspiration
2
+ import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { pipe } from 'it-pipe';
4
+ import { pingHandler, statusHandler } from './handlers.js';
5
+ import { PING_PROTOCOL, STATUS_PROTOCOL } from './interface.js';
6
+ /**
7
+ * A mapping from a protocol to a handler function
8
+ */
9
+ const SUB_PROTOCOL_HANDLERS = {
10
+ [PING_PROTOCOL]: pingHandler,
11
+ [STATUS_PROTOCOL]: statusHandler,
12
+ };
13
+ export class ReqResp {
14
+ constructor(libp2p) {
15
+ this.libp2p = libp2p;
16
+ this.abortController = new AbortController();
17
+ this.logger = createDebugLogger('aztec:p2p:reqresp');
18
+ }
19
+ /**
20
+ * Start the reqresp service
21
+ */
22
+ async start() {
23
+ // Register all protocol handlers
24
+ for (const subProtocol of Object.keys(SUB_PROTOCOL_HANDLERS)) {
25
+ await this.libp2p.handle(subProtocol, this.streamHandler.bind(this, subProtocol));
26
+ }
27
+ }
28
+ /**
29
+ * Stop the reqresp service
30
+ */
31
+ async stop() {
32
+ // Unregister all handlers
33
+ for (const protocol of Object.keys(SUB_PROTOCOL_HANDLERS)) {
34
+ await this.libp2p.unhandle(protocol);
35
+ }
36
+ await this.libp2p.stop();
37
+ this.abortController.abort();
38
+ }
39
+ /**
40
+ * Send a request to peers, returns the first response
41
+ *
42
+ * @param subProtocol - The protocol being requested
43
+ * @param payload - The payload to send
44
+ * @returns - The response from the peer, otherwise undefined
45
+ */
46
+ async sendRequest(subProtocol, payload) {
47
+ // Get active peers
48
+ const peers = this.libp2p.getPeers();
49
+ // Attempt to ask all of our peers
50
+ for (const peer of peers) {
51
+ const response = await this.sendRequestToPeer(peer, subProtocol, payload);
52
+ // If we get a response, return it, otherwise we iterate onto the next peer
53
+ if (response) {
54
+ return response;
55
+ }
56
+ }
57
+ return undefined;
58
+ }
59
+ /**
60
+ * Sends a request to a specific peer
61
+ *
62
+ * @param peerId - The peer to send the request to
63
+ * @param subProtocol - The protocol to use to request
64
+ * @param payload - The payload to send
65
+ * @returns If the request is successful, the response is returned, otherwise undefined
66
+ */
67
+ async sendRequestToPeer(peerId, subProtocol, payload) {
68
+ try {
69
+ const stream = await this.libp2p.dialProtocol(peerId, subProtocol);
70
+ const result = await pipe([payload], stream, this.readMessage);
71
+ return result;
72
+ }
73
+ catch (e) {
74
+ this.logger.warn(`Failed to send request to peer ${peerId.publicKey}`);
75
+ return undefined;
76
+ }
77
+ }
78
+ /**
79
+ * Read a message returned from a stream into a single buffer
80
+ */
81
+ async readMessage(source) {
82
+ const chunks = [];
83
+ for await (const chunk of source) {
84
+ chunks.push(chunk.subarray());
85
+ }
86
+ const messageData = chunks.concat();
87
+ return Buffer.concat(messageData);
88
+ }
89
+ /**
90
+ * Stream Handler
91
+ * Reads the incoming stream, determines the protocol, then triggers the appropriate handler
92
+ *
93
+ * @param param0 - The incoming stream data
94
+ */
95
+ async streamHandler(protocol, { stream }) {
96
+ try {
97
+ await pipe(stream, async function* (source) {
98
+ for await (const chunkList of source) {
99
+ const msg = Buffer.from(chunkList.subarray()).toString();
100
+ yield SUB_PROTOCOL_HANDLERS[protocol](msg);
101
+ }
102
+ }, stream);
103
+ }
104
+ catch (e) {
105
+ this.logger.warn(e);
106
+ }
107
+ finally {
108
+ await stream.close();
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlL3JlcXJlc3AvcmVxcmVzcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUkvQixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBNkMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRzs7R0FFRztBQUNILE1BQU0scUJBQXFCLEdBQTRDO0lBQ3JFLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVztJQUM1QixDQUFDLGVBQWUsQ0FBQyxFQUFFLGFBQWE7Q0FDakMsQ0FBQztBQUVGLE1BQU0sT0FBTyxPQUFPO0lBS2xCLFlBQStCLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRnJDLG9CQUFlLEdBQW9CLElBQUksZUFBZSxFQUFFLENBQUM7UUFHL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsaUNBQWlDO1FBQ2pDLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQTBCLENBQUMsQ0FBQyxDQUFDO1FBQ25HLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLDBCQUEwQjtRQUMxQixLQUFL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
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import type { Tx } from '@aztec/circuit-types';
2
+ import type { BlockAttestation, BlockProposal, Gossipable } from '@aztec/circuit-types';
3
3
  import type { ENR } from '@chainsafe/enr';
4
4
  import type { PeerId } from '@libp2p/interface';
5
5
  import type EventEmitter from 'events';
@@ -23,9 +23,11 @@ export interface P2PService {
23
23
  stop(): Promise<void>;
24
24
  /**
25
25
  * Called to have the given transaction propagated through the P2P network.
26
- * @param tx - The transaction to be propagated.
26
+ * @param message - The message to be propagated.
27
27
  */
28
- propagateTx(tx: Tx): void;
28
+ propagate<T extends Gossipable>(message: T): void;
29
+ registerBlockReceivedCallback(callback: (block: BlockProposal) => Promise<BlockAttestation>): void;
30
+ getEnr(): ENR | undefined;
29
31
  }
30
32
  /**
31
33
  * The interface for a peer discovery service implementation.
@@ -60,5 +62,6 @@ export interface PeerDiscoveryService extends EventEmitter {
60
62
  on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
61
63
  emit(event: 'peer:discovered', enr: ENR): boolean;
62
64
  getStatus(): PeerDiscoveryState;
65
+ getEnr(): ENR | undefined;
63
66
  }
64
67
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD,SAAS,IAAI,kBAAkB,CAAC;CACjC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAGlD,6BAA6B,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAEnG,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD,SAAS,IAAI,kBAAkB,CAAC;IAEhC,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;CAC3B"}
package/dest/util.d.ts CHANGED
@@ -3,7 +3,6 @@
3
3
  * Example usage:
4
4
  * const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
5
5
  * const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
6
- * const dnsAddr = 'example.com:443' -> /dns4/example.com/tcp/443
7
6
  * @param address - The address string to convert. Has to be in the format <addr>:<port>.
8
7
  * @param protocol - The protocol to use in the multiaddr string.
9
8
  * @returns A multiaddr compliant string.
@@ -18,4 +17,5 @@ export declare function splitAddressPort(address: string, allowEmptyAddress: boo
18
17
  * Queries the public IP address of the machine.
19
18
  */
20
19
  export declare function getPublicIp(): Promise<string>;
20
+ export declare function resolveAddressIfNecessary(address: string): Promise<string>;
21
21
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAgBnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CASnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhF"}