@aztec/p2p 0.67.1 → 0.68.1

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 (211) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +5 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +17 -15
  4. package/dest/client/factory.d.ts +19 -0
  5. package/dest/client/factory.d.ts.map +1 -0
  6. package/dest/client/factory.js +40 -0
  7. package/dest/client/index.d.ts +1 -15
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +2 -37
  10. package/dest/client/p2p_client.d.ts +6 -6
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +12 -11
  13. package/dest/config.d.ts +1 -1
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +3 -3
  16. package/dest/errors/reqresp.error.d.ts +12 -1
  17. package/dest/errors/reqresp.error.d.ts.map +1 -1
  18. package/dest/errors/reqresp.error.js +15 -2
  19. package/dest/index.d.ts +2 -2
  20. package/dest/index.d.ts.map +1 -1
  21. package/dest/index.js +3 -3
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  29. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
  30. package/dest/mem_pools/interface.d.ts +4 -3
  31. package/dest/mem_pools/interface.d.ts.map +1 -1
  32. package/dest/mocks/index.d.ts +7 -6
  33. package/dest/mocks/index.d.ts.map +1 -1
  34. package/dest/mocks/index.js +8 -8
  35. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
  36. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
  37. package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
  38. package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
  39. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
  40. package/dest/msg_validators/attestation_validator/index.js +2 -0
  41. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
  42. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
  43. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
  44. package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
  45. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
  46. package/dest/msg_validators/block_proposal_validator/index.js +2 -0
  47. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
  48. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
  49. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +16 -0
  50. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
  51. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
  52. package/dest/msg_validators/epoch_proof_quote_validator/index.js +2 -0
  53. package/dest/msg_validators/index.d.ts +4 -0
  54. package/dest/msg_validators/index.d.ts.map +1 -0
  55. package/dest/msg_validators/index.js +4 -0
  56. package/dest/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.d.ts +1 -1
  57. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  58. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +34 -0
  59. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
  60. package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.js +1 -1
  61. package/dest/{tx_validator → msg_validators/tx_validator}/double_spend_validator.d.ts +3 -2
  62. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
  63. package/dest/msg_validators/tx_validator/double_spend_validator.js +56 -0
  64. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
  65. package/dest/{tx_validator → msg_validators/tx_validator}/index.js +1 -1
  66. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
  67. package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.js +1 -1
  68. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
  69. package/dest/msg_validators/tx_validator/tx_proof_validator.js +29 -0
  70. package/dest/services/data_store.d.ts.map +1 -0
  71. package/dest/services/data_store.js +188 -0
  72. package/dest/{service → services/discv5}/discV5_service.d.ts +3 -9
  73. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  74. package/dest/services/discv5/discV5_service.js +139 -0
  75. package/dest/services/dummy_service.d.ts.map +1 -0
  76. package/dest/{service → services}/dummy_service.js +1 -1
  77. package/dest/{service → services}/encoding.d.ts +5 -0
  78. package/dest/services/encoding.d.ts.map +1 -0
  79. package/dest/services/encoding.js +65 -0
  80. package/dest/services/index.d.ts +3 -0
  81. package/dest/services/index.d.ts.map +1 -0
  82. package/dest/services/index.js +3 -0
  83. package/dest/services/libp2p/libp2p_service.d.ts +222 -0
  84. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  85. package/dest/services/libp2p/libp2p_service.js +697 -0
  86. package/dest/services/peer-scoring/peer_scoring.d.ts +25 -0
  87. package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
  88. package/dest/services/peer-scoring/peer_scoring.js +75 -0
  89. package/dest/services/peer_manager.d.ts +60 -0
  90. package/dest/services/peer_manager.d.ts.map +1 -0
  91. package/dest/services/peer_manager.js +358 -0
  92. package/dest/services/reqresp/config.d.ts.map +1 -0
  93. package/dest/{service → services}/reqresp/config.js +1 -1
  94. package/dest/services/reqresp/handlers.d.ts.map +1 -0
  95. package/dest/{service → services}/reqresp/handlers.js +1 -1
  96. package/dest/services/reqresp/index.d.ts.map +1 -0
  97. package/dest/{service → services}/reqresp/index.js +1 -1
  98. package/dest/services/reqresp/interface.d.ts.map +1 -0
  99. package/dest/{service → services}/reqresp/interface.js +1 -1
  100. package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
  101. package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
  102. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -5
  103. package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
  104. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +7 -2
  105. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
  106. package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
  107. package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
  108. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  109. package/dest/services/reqresp/reqresp.js +279 -0
  110. package/dest/services/service.d.ts.map +1 -0
  111. package/dest/{service → services}/service.js +1 -1
  112. package/dest/services/types.d.ts +38 -0
  113. package/dest/services/types.d.ts.map +1 -0
  114. package/dest/services/types.js +43 -0
  115. package/package.json +14 -11
  116. package/src/bootstrap/bootstrap.ts +25 -20
  117. package/src/client/factory.ts +97 -0
  118. package/src/client/index.ts +1 -73
  119. package/src/client/p2p_client.ts +28 -15
  120. package/src/config.ts +2 -2
  121. package/src/errors/reqresp.error.ts +15 -1
  122. package/src/index.ts +2 -2
  123. package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
  124. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
  125. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
  126. package/src/mem_pools/interface.ts +5 -3
  127. package/src/mocks/index.ts +16 -10
  128. package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
  129. package/src/msg_validators/attestation_validator/index.ts +1 -0
  130. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
  131. package/src/msg_validators/block_proposal_validator/index.ts +1 -0
  132. package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +22 -0
  133. package/src/msg_validators/epoch_proof_quote_validator/index.ts +1 -0
  134. package/src/msg_validators/index.ts +3 -0
  135. package/src/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.ts +5 -3
  136. package/src/{tx_validator → msg_validators/tx_validator}/double_spend_validator.ts +6 -8
  137. package/src/{service → services/discv5}/discV5_service.ts +19 -23
  138. package/src/{service → services}/encoding.ts +21 -3
  139. package/src/services/index.ts +2 -0
  140. package/src/{service → services/libp2p}/libp2p_service.ts +350 -90
  141. package/src/{service → services/peer-scoring}/peer_scoring.ts +27 -23
  142. package/src/services/peer_manager.ts +422 -0
  143. package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +2 -1
  144. package/src/{service → services}/reqresp/reqresp.ts +86 -20
  145. package/src/services/types.ts +44 -0
  146. package/dest/service/data_store.d.ts.map +0 -1
  147. package/dest/service/data_store.js +0 -188
  148. package/dest/service/discV5_service.d.ts.map +0 -1
  149. package/dest/service/discV5_service.js +0 -144
  150. package/dest/service/dummy_service.d.ts.map +0 -1
  151. package/dest/service/encoding.d.ts.map +0 -1
  152. package/dest/service/encoding.js +0 -49
  153. package/dest/service/index.d.ts +0 -3
  154. package/dest/service/index.d.ts.map +0 -1
  155. package/dest/service/index.js +0 -3
  156. package/dest/service/libp2p_service.d.ts +0 -136
  157. package/dest/service/libp2p_service.d.ts.map +0 -1
  158. package/dest/service/libp2p_service.js +0 -500
  159. package/dest/service/peer_manager.d.ts +0 -33
  160. package/dest/service/peer_manager.d.ts.map +0 -1
  161. package/dest/service/peer_manager.js +0 -214
  162. package/dest/service/peer_scoring.d.ts +0 -35
  163. package/dest/service/peer_scoring.d.ts.map +0 -1
  164. package/dest/service/peer_scoring.js +0 -72
  165. package/dest/service/reqresp/config.d.ts.map +0 -1
  166. package/dest/service/reqresp/handlers.d.ts.map +0 -1
  167. package/dest/service/reqresp/index.d.ts.map +0 -1
  168. package/dest/service/reqresp/interface.d.ts.map +0 -1
  169. package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
  170. package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
  171. package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  172. package/dest/service/reqresp/reqresp.d.ts.map +0 -1
  173. package/dest/service/reqresp/reqresp.js +0 -230
  174. package/dest/service/service.d.ts.map +0 -1
  175. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +0 -1
  176. package/dest/tx_validator/aggregate_tx_validator.js +0 -32
  177. package/dest/tx_validator/data_validator.d.ts.map +0 -1
  178. package/dest/tx_validator/double_spend_validator.d.ts.map +0 -1
  179. package/dest/tx_validator/double_spend_validator.js +0 -56
  180. package/dest/tx_validator/index.d.ts.map +0 -1
  181. package/dest/tx_validator/metadata_validator.d.ts.map +0 -1
  182. package/dest/tx_validator/tx_proof_validator.d.ts.map +0 -1
  183. package/dest/tx_validator/tx_proof_validator.js +0 -29
  184. package/src/service/index.ts +0 -2
  185. package/src/service/peer_manager.ts +0 -266
  186. /package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.d.ts +0 -0
  187. /package/dest/{tx_validator → msg_validators/tx_validator}/index.d.ts +0 -0
  188. /package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.d.ts +0 -0
  189. /package/dest/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.d.ts +0 -0
  190. /package/dest/{service → services}/data_store.d.ts +0 -0
  191. /package/dest/{service → services}/dummy_service.d.ts +0 -0
  192. /package/dest/{service → services}/reqresp/config.d.ts +0 -0
  193. /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
  194. /package/dest/{service → services}/reqresp/index.d.ts +0 -0
  195. /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
  196. /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
  197. /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
  198. /package/dest/{service → services}/service.d.ts +0 -0
  199. /package/src/{tx_validator → msg_validators/tx_validator}/data_validator.ts +0 -0
  200. /package/src/{tx_validator → msg_validators/tx_validator}/index.ts +0 -0
  201. /package/src/{tx_validator → msg_validators/tx_validator}/metadata_validator.ts +0 -0
  202. /package/src/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.ts +0 -0
  203. /package/src/{service → services}/data_store.ts +0 -0
  204. /package/src/{service → services}/dummy_service.ts +0 -0
  205. /package/src/{service → services}/reqresp/config.ts +0 -0
  206. /package/src/{service → services}/reqresp/handlers.ts +0 -0
  207. /package/src/{service → services}/reqresp/index.ts +0 -0
  208. /package/src/{service → services}/reqresp/interface.ts +0 -0
  209. /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
  210. /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
  211. /package/src/{service → services}/service.ts +0 -0
@@ -0,0 +1,139 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { sleep } from '@aztec/foundation/sleep';
3
+ import { OtelMetricsAdapter } from '@aztec/telemetry-client';
4
+ import { Discv5 } from '@chainsafe/discv5';
5
+ import { ENR, SignableENR } from '@chainsafe/enr';
6
+ import { multiaddr } from '@multiformats/multiaddr';
7
+ import EventEmitter from 'events';
8
+ import { convertToMultiaddr } from '../../util.js';
9
+ import { PeerDiscoveryState } from '../service.js';
10
+ import { AZTEC_ENR_KEY, AZTEC_NET, Discv5Event, PeerEvent } from '../types.js';
11
+ const delayBeforeStart = 2000; // 2sec
12
+ /**
13
+ * Peer discovery service using Discv5.
14
+ */
15
+ export class DiscV5Service extends EventEmitter {
16
+ constructor(peerId, config, telemetry, logger = createLogger('p2p:discv5_service')) {
17
+ super();
18
+ this.peerId = peerId;
19
+ this.logger = logger;
20
+ this.currentState = PeerDiscoveryState.STOPPED;
21
+ this.bootstrapNodePeerIds = [];
22
+ this.startTime = 0;
23
+ const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
24
+ this.bootstrapNodes = bootstrapNodes;
25
+ // create ENR from PeerId
26
+ this.enr = SignableENR.createFromPeerId(peerId);
27
+ // Add aztec identification to ENR
28
+ this.enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
29
+ if (!tcpAnnounceAddress) {
30
+ throw new Error('You need to provide at least a TCP announce address.');
31
+ }
32
+ const multiAddrTcp = multiaddr(`${convertToMultiaddr(tcpAnnounceAddress, 'tcp')}/p2p/${peerId.toString()}`);
33
+ // if no udp announce address is provided, use the tcp announce address
34
+ const multiAddrUdp = multiaddr(`${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`);
35
+ this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
36
+ // set location multiaddr in ENR record
37
+ this.enr.setLocationMultiaddr(multiAddrUdp);
38
+ this.enr.setLocationMultiaddr(multiAddrTcp);
39
+ const metricsRegistry = new OtelMetricsAdapter(telemetry);
40
+ this.discv5 = Discv5.create({
41
+ enr: this.enr,
42
+ peerId,
43
+ bindAddrs: { ip4: this.listenMultiAddrUdp },
44
+ config: {
45
+ lookupTimeout: 2000,
46
+ requestTimeout: 2000,
47
+ allowUnverifiedSessions: true,
48
+ },
49
+ metricsRegistry,
50
+ });
51
+ this.discv5.on(Discv5Event.DISCOVERED, this.onDiscovered.bind(this));
52
+ this.discv5.on(Discv5Event.ENR_ADDED, this.onEnrAdded.bind(this));
53
+ }
54
+ async start() {
55
+ if (this.currentState === PeerDiscoveryState.RUNNING) {
56
+ throw new Error('DiscV5Service already started');
57
+ }
58
+ this.logger.debug('Starting DiscV5');
59
+ await this.discv5.start();
60
+ this.startTime = Date.now();
61
+ this.logger.info(`DiscV5 service started`, {
62
+ nodeId: this.enr.nodeId,
63
+ peerId: this.peerId,
64
+ enrUdp: await this.enr.getFullMultiaddr('udp'),
65
+ enrTcp: await this.enr.getFullMultiaddr('tcp'),
66
+ });
67
+ this.currentState = PeerDiscoveryState.RUNNING;
68
+ // Add bootnode ENR if provided
69
+ if (this.bootstrapNodes?.length) {
70
+ // Do this conversion once since it involves an async function call
71
+ this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodes.map(enr => ENR.decodeTxt(enr).peerId()));
72
+ this.logger.info(`Adding bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
73
+ try {
74
+ this.bootstrapNodes.forEach(enr => {
75
+ this.discv5.addEnr(enr);
76
+ });
77
+ }
78
+ catch (e) {
79
+ this.logger.error(`Error adding bootnode ENRs: ${e}`);
80
+ }
81
+ }
82
+ }
83
+ async runRandomNodesQuery() {
84
+ if (this.currentState !== PeerDiscoveryState.RUNNING) {
85
+ throw new Error('DiscV5Service not running');
86
+ }
87
+ // First, wait some time before starting the peer discovery
88
+ // reference: https://github.com/ChainSafe/lodestar/issues/3423
89
+ const msSinceStart = Date.now() - this.startTime;
90
+ if (Date.now() - this.startTime <= delayBeforeStart) {
91
+ await sleep(delayBeforeStart - msSinceStart);
92
+ }
93
+ try {
94
+ await this.discv5.findRandomNode();
95
+ }
96
+ catch (err) {
97
+ this.logger.error(`Error running discV5 random node query: ${err}`);
98
+ }
99
+ }
100
+ getAllPeers() {
101
+ return this.discv5.kadValues();
102
+ }
103
+ getEnr() {
104
+ return this.enr.toENR();
105
+ }
106
+ getPeerId() {
107
+ return this.peerId;
108
+ }
109
+ getStatus() {
110
+ return this.currentState;
111
+ }
112
+ isBootstrapPeer(peerId) {
113
+ return this.bootstrapNodePeerIds.some(node => node.equals(peerId));
114
+ }
115
+ async stop() {
116
+ await this.discv5.off(Discv5Event.DISCOVERED, this.onDiscovered);
117
+ await this.discv5.off(Discv5Event.ENR_ADDED, this.onEnrAdded);
118
+ await this.discv5.stop();
119
+ this.currentState = PeerDiscoveryState.STOPPED;
120
+ }
121
+ async onEnrAdded(enr) {
122
+ const multiAddrTcp = await enr.getFullMultiaddr('tcp');
123
+ const multiAddrUdp = await enr.getFullMultiaddr('udp');
124
+ this.logger.debug(`Added ENR ${enr.encodeTxt()}`, { multiAddrTcp, multiAddrUdp, nodeId: enr.nodeId });
125
+ this.onDiscovered(enr);
126
+ }
127
+ onDiscovered(enr) {
128
+ // check the peer is an aztec peer
129
+ const value = enr.kvs.get(AZTEC_ENR_KEY);
130
+ if (value) {
131
+ const network = value[0];
132
+ // check if the peer is on the same network
133
+ if (network === AZTEC_NET) {
134
+ this.emit(PeerEvent.DISCOVERED, enr);
135
+ }
136
+ }
137
+ }
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY1Y1X3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZGlzY3Y1L2Rpc2NWNV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHlCQUF5QixDQUFDO0FBRW5GLE9BQU8sRUFBRSxNQUFNLEVBQTJCLE1BQU0sbUJBQW1CLENBQUM7QUFDcEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRCxPQUFPLEVBQWtCLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUdsQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUE2QixrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRS9FLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTztBQUV0Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsWUFBWTtJQWlCN0MsWUFDVSxNQUFjLEVBQ3RCLE1BQWlCLEVBQ2pCLFNBQTBCLEVBQ2xCLFNBQVMsWUFBWSxDQUFDLG9CQUFvQixDQUFDO1FBRW5ELEtBQUssRUFBRSxDQUFDO1FBTEEsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUdkLFdBQU0sR0FBTixNQUFNLENBQXFDO1FBWDdDLGlCQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBRzFDLHlCQUFvQixHQUFhLEVBQUUsQ0FBQztR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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE1G,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9F;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,wCAAwC;IACxC,QAAQ,IAAI,QAAQ,EAAE;IAItB;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC;IAE3C;;;OAGG;IACI,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE;IAE7B;;OAEG;IACI,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,CAAC;IAE3F;;;;;OAKG;IACI,WAAW,CAAC,QAAQ,SAAS,kBAAkB,EACpD,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IAI1E;;;OAGG;IACI,MAAM,IAAI,SAAS;CAG3B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAa,YAAW,oBAAoB;IACzF,OAAO,CAAC,YAAY,CAA8B;IAClD;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,WAAW;IAIX,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAInC,SAAS,IAAI,kBAAkB;IAI/B,MAAM,IAAI,SAAS;CAG3B"}
@@ -97,4 +97,4 @@ export class DummyPeerDiscoveryService extends EventEmitter {
97
97
  return undefined;
98
98
  }
99
99
  }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL2R1bW15X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBR2xDLE9BQU8sRUFBOEMsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQix3Q0FBd0M7SUFDeEMsUUFBUTtRQUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUs7UUFDVixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSTtRQUNULE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQXVCLENBQUksSUFBRyxDQUFDO0lBRS9DOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxDQUFXLElBQUcsQ0FBQztJQUVqQzs7T0FFRztJQUNJLDZCQUE2QixDQUFDLENBQXNELElBQUcsQ0FBQztJQUUvRjs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FDaEIsU0FBbUIsRUFDbkIsUUFBMkQ7UUFFM0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsWUFBWTtJQUEzRDs7UUFDVSxpQkFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztJQXdDcEQsQ0FBQztJQXZDQzs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztRQUMvQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNoQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLGVBQWUsQ0FBQyxDQUFTO1FBQzlCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0YifQ==
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9kdW1teV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUdsQyxPQUFPLEVBQThDLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsd0NBQXdDO0lBQ3hDLFFBQVE7UUFDTixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUF1QixDQUFJLElBQUcsQ0FBQztJQUUvQzs7O09BR0c7SUFDSSxVQUFVLENBQUMsQ0FBVyxJQUFHLENBQUM7SUFFakM7O09BRUc7SUFDSSw2QkFBNkIsQ0FBQyxDQUFzRCxJQUFHLENBQUM7SUFFL0Y7Ozs7O09BS0c7SUFDSSxXQUFXLENBQ2hCLFNBQW1CLEVBQ25CLFFBQTJEO1FBRTNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTTtRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLFlBQVk7SUFBM0Q7O1FBQ1UsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7SUF3Q3BELENBQUM7SUF2Q0M7OztPQUdHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBQy9DLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxlQUFlLENBQUMsQ0FBUztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIn0=
@@ -19,8 +19,13 @@ export declare function msgIdToStrFn(msgId: Uint8Array): string;
19
19
  * @returns The message identifier
20
20
  */
21
21
  export declare function getMsgIdFn(message: Message): Buffer;
22
+ /**
23
+ * Snappy transform for libp2p gossipsub
24
+ */
22
25
  export declare class SnappyTransform implements DataTransform {
23
26
  inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array;
27
+ inboundTransformNoTopic(data: Buffer): Buffer;
24
28
  outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array;
29
+ outboundTransformNoTopic(data: Buffer): Buffer;
25
30
  }
26
31
  //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/services/encoding.ts"],"names":[],"mappings":";;AAGA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAajD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAKvD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAItD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,UAK1C;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,aAAa;IAEnD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAI1D,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQpD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAI3D,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAMtD"}
@@ -0,0 +1,65 @@
1
+ // Taken from lodestar: https://github.com/ChainSafe/lodestar
2
+ import { sha256 } from '@aztec/foundation/crypto';
3
+ import { compressSync, uncompressSync } from 'snappy';
4
+ import xxhashFactory from 'xxhash-wasm';
5
+ // Load WASM
6
+ const xxhash = await xxhashFactory();
7
+ // Use salt to prevent msgId from being mined for collisions
8
+ const h64Seed = BigInt(Math.floor(Math.random() * 1e9));
9
+ // Shared buffer to convert msgId to string
10
+ const sharedMsgIdBuf = Buffer.alloc(20);
11
+ /**
12
+ * The function used to generate a gossipsub message id
13
+ * We use the first 8 bytes of SHA256(data) for content addressing
14
+ */
15
+ export function fastMsgIdFn(rpcMsg) {
16
+ if (rpcMsg.data) {
17
+ return xxhash.h64Raw(rpcMsg.data, h64Seed).toString(16);
18
+ }
19
+ return '0000000000000000';
20
+ }
21
+ export function msgIdToStrFn(msgId) {
22
+ // This happens serially, no need to reallocate the buffer
23
+ sharedMsgIdBuf.set(msgId);
24
+ return `0x${sharedMsgIdBuf.toString('hex')}`;
25
+ }
26
+ /**
27
+ * Get the message identifier from a libp2p message
28
+ *
29
+ * Follows similarly to:
30
+ * https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
31
+ *
32
+ * @param message - The libp2p message
33
+ * @returns The message identifier
34
+ */
35
+ export function getMsgIdFn(message) {
36
+ const { topic } = message;
37
+ const vec = [Buffer.from(topic), message.data];
38
+ return sha256(Buffer.concat(vec)).subarray(0, 20);
39
+ }
40
+ /**
41
+ * Snappy transform for libp2p gossipsub
42
+ */
43
+ export class SnappyTransform {
44
+ // Topic string included to satisfy DataTransform interface
45
+ inboundTransform(_topicStr, data) {
46
+ return this.inboundTransformNoTopic(Buffer.from(data));
47
+ }
48
+ inboundTransformNoTopic(data) {
49
+ if (data.length === 0) {
50
+ return data;
51
+ }
52
+ return Buffer.from(uncompressSync(data, { asBuffer: true }));
53
+ }
54
+ // Topic string included to satisfy DataTransform interface
55
+ outboundTransform(_topicStr, data) {
56
+ return this.outboundTransformNoTopic(Buffer.from(data));
57
+ }
58
+ outboundTransformNoTopic(data) {
59
+ if (data.length === 0) {
60
+ return data;
61
+ }
62
+ return Buffer.from(compressSync(data));
63
+ }
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUtsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0RCxPQUFPLGFBQWEsTUFBTSxhQUFhLENBQUM7QUFFeEMsWUFBWTtBQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7QUFFckMsNERBQTREO0FBQzVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXhELDJDQUEyQztBQUMzQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBbUI7SUFDN0MsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWlCO0lBQzVDLDBEQUEwRDtJQUMxRCxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLE9BQU8sS0FBSyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxPQUFnQjtJQUN6QyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTFCLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsMkRBQTJEO0lBQzNELGdCQUFnQixDQUFDLFNBQWlCLEVBQUUsSUFBZ0I7UUFDbEQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxJQUFZO1FBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLElBQWdCO1FBQ25ELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sd0JBQXdCLENBQUMsSUFBWTtRQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
@@ -0,0 +1,3 @@
1
+ export * from './service.js';
2
+ export * from './libp2p/libp2p_service.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './service.js';
2
+ export * from './libp2p/libp2p_service.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyw0QkFBNEIsQ0FBQyJ9
@@ -0,0 +1,222 @@
1
+ import { BlockAttestation, BlockProposal, type ClientProtocolCircuitVerifier, EpochProofQuote, type Gossipable, type L2BlockSource, type PeerInfo, type WorldStateSynchronizer } from '@aztec/circuit-types';
2
+ import { P2PClientType } from '@aztec/circuit-types';
3
+ import { type EpochCache } from '@aztec/epoch-cache';
4
+ import type { AztecKVStore } from '@aztec/kv-store';
5
+ import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
6
+ import { type ENR } from '@chainsafe/enr';
7
+ import { type PeerId } from '@libp2p/interface';
8
+ import '@libp2p/kad-dht';
9
+ import { type P2PConfig } from '../../config.js';
10
+ import { type MemPools } from '../../mem_pools/interface.js';
11
+ import { type PubSubLibp2p } from '../../util.js';
12
+ import { type ReqRespSubProtocol, type ReqRespSubProtocolHandlers, type SubProtocolMap } from '../reqresp/interface.js';
13
+ import { ReqResp } from '../reqresp/reqresp.js';
14
+ import type { P2PService, PeerDiscoveryService } from '../service.js';
15
+ /**
16
+ * Lib P2P implementation of the P2PService interface.
17
+ */
18
+ export declare class LibP2PService<T extends P2PClientType> extends WithTracer implements P2PService {
19
+ private clientType;
20
+ private config;
21
+ private node;
22
+ private peerDiscoveryService;
23
+ private mempools;
24
+ private l2BlockSource;
25
+ private epochCache;
26
+ private proofVerifier;
27
+ private worldStateSynchronizer;
28
+ private telemetry;
29
+ private requestResponseHandlers;
30
+ private logger;
31
+ private jobQueue;
32
+ private peerManager;
33
+ private discoveryRunningPromise?;
34
+ private attestationValidator;
35
+ private blockProposalValidator;
36
+ private epochProofQuoteValidator;
37
+ reqresp: ReqResp;
38
+ /**
39
+ * Callback for when a block is received from a peer.
40
+ * @param block - The block received from the peer.
41
+ * @returns The attestation for the block, if any.
42
+ */
43
+ private blockReceivedCallback;
44
+ constructor(clientType: T, config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, mempools: MemPools<T>, l2BlockSource: L2BlockSource, epochCache: EpochCache, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient, requestResponseHandlers?: ReqRespSubProtocolHandlers, logger?: import("@aztec/foundation/log").Logger);
45
+ /**
46
+ * Starts the LibP2P service.
47
+ * @returns An empty promise.
48
+ */
49
+ start(): Promise<void>;
50
+ /**
51
+ * Stops the LibP2P service.
52
+ * @returns An empty promise.
53
+ */
54
+ stop(): Promise<void>;
55
+ /**
56
+ * Creates an instance of the LibP2P service.
57
+ * @param config - The configuration to use when creating the service.
58
+ * @param txPool - The transaction pool to be accessed by the service.
59
+ * @returns The new service.
60
+ */
61
+ static new<T extends P2PClientType>(clientType: T, config: P2PConfig, peerDiscoveryService: PeerDiscoveryService, peerId: PeerId, mempools: MemPools<T>, l2BlockSource: L2BlockSource, epochCache: EpochCache, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, store: AztecKVStore, telemetry: TelemetryClient): Promise<LibP2PService<T>>;
62
+ getPeers(includePending?: boolean): PeerInfo[];
63
+ private handleGossipSubEvent;
64
+ /**
65
+ * Send Request via the ReqResp service
66
+ * The subprotocol defined will determine the request and response types
67
+ *
68
+ * See the subProtocolMap for the mapping of subprotocols to request/response types in `interface.ts`
69
+ *
70
+ * @param protocol The request response protocol to use
71
+ * @param request The request type to send
72
+ * @returns
73
+ */
74
+ sendRequest<SubProtocol extends ReqRespSubProtocol>(protocol: SubProtocol, request: InstanceType<SubProtocolMap[SubProtocol]['request']>): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined>;
75
+ /**
76
+ * Get the ENR of the node
77
+ * @returns The ENR of the node
78
+ */
79
+ getEnr(): ENR | undefined;
80
+ registerBlockReceivedCallback(callback: (block: BlockProposal) => Promise<BlockAttestation | undefined>): void;
81
+ /**
82
+ * Subscribes to a topic.
83
+ * @param topic - The topic to subscribe to.
84
+ */
85
+ private subscribeToTopic;
86
+ /**
87
+ * Publishes data to a topic.
88
+ * @param topic - The topic to publish to.
89
+ * @param data - The data to publish.
90
+ * @returns The number of recipients the data was sent to.
91
+ */
92
+ private publishToTopic;
93
+ /**
94
+ * Handles a new gossip message that was received by the client.
95
+ * @param topic - The message's topic.
96
+ * @param data - The message data
97
+ */
98
+ private handleNewGossipMessage;
99
+ /**Process Attestation From Peer
100
+ * When a proposal is received from a peer, we add it to the attestation pool, so it can be accessed by other services.
101
+ *
102
+ * @param attestation - The attestation to process.
103
+ */
104
+ private processAttestationFromPeer;
105
+ /**Process block from peer
106
+ *
107
+ * Pass the received block to the validator client
108
+ *
109
+ * @param block - The block to process.
110
+ */
111
+ private processBlockFromPeer;
112
+ /**
113
+ * Broadcast an attestation to all peers.
114
+ * @param attestation - The attestation to broadcast.
115
+ */
116
+ private broadcastAttestation;
117
+ private processEpochProofQuoteFromPeer;
118
+ /**
119
+ * Propagates provided message to peers.
120
+ * @param message - The message to propagate.
121
+ */
122
+ propagate<T extends Gossipable>(message: T): void;
123
+ private processTxFromPeer;
124
+ /**
125
+ * Validate a tx that has been requested from a peer.
126
+ *
127
+ * The core component of this validator is that the tx hash MUST match the requested tx hash,
128
+ * In order to perform this check, the tx proof must be verified.
129
+ *
130
+ * Note: This function is called from within `ReqResp.sendRequest` as part of the
131
+ * TX_REQ_PROTOCOL subprotocol validation.
132
+ *
133
+ * @param requestedTxHash - The hash of the tx that was requested.
134
+ * @param responseTx - The tx that was received as a response to the request.
135
+ * @param peerId - The peer ID of the peer that sent the tx.
136
+ * @returns True if the tx is valid, false otherwise.
137
+ */
138
+ private validateRequestedTx;
139
+ /**
140
+ * Validate a tx from a peer.
141
+ * @param propagationSource - The peer ID of the peer that sent the tx.
142
+ * @param msg - The tx message.
143
+ * @returns True if the tx is valid, false otherwise.
144
+ */
145
+ private validatePropagatedTxFromMessage;
146
+ /**
147
+ * Validate an attestation from a peer.
148
+ * @param propagationSource - The peer ID of the peer that sent the attestation.
149
+ * @param msg - The attestation message.
150
+ * @returns True if the attestation is valid, false otherwise.
151
+ */
152
+ private validatePropagatedAttestationFromMessage;
153
+ /**
154
+ * Validate a block proposal from a peer.
155
+ * @param propagationSource - The peer ID of the peer that sent the block.
156
+ * @param msg - The block proposal message.
157
+ * @returns True if the block proposal is valid, false otherwise.
158
+ */
159
+ private validatePropagatedBlockFromMessage;
160
+ /**
161
+ * Validate an epoch proof quote from a peer.
162
+ * @param propagationSource - The peer ID of the peer that sent the epoch proof quote.
163
+ * @param msg - The epoch proof quote message.
164
+ * @returns True if the epoch proof quote is valid, false otherwise.
165
+ */
166
+ private validatePropagatedEpochProofQuoteFromMessage;
167
+ private validatePropagatedTx;
168
+ /**
169
+ * Create message validators for the given block number.
170
+ *
171
+ * Each validator is a pair of a validator and a severity.
172
+ * If a validator fails, the peer is penalized with the severity of the validator.
173
+ *
174
+ * @param blockNumber - The block number to create validators for.
175
+ * @returns The message validators.
176
+ */
177
+ private createMessageValidators;
178
+ /**
179
+ * Run validations on a tx.
180
+ * @param tx - The tx to validate.
181
+ * @param messageValidators - The message validators to run.
182
+ * @returns The validation outcome.
183
+ */
184
+ private runValidations;
185
+ /**
186
+ * Handle a double spend failure.
187
+ *
188
+ * Double spend failures are managed on their own because they are a special case.
189
+ * We must check if the double spend is recent or old, if it is past a threshold, then we heavily penalize the peer.
190
+ *
191
+ * @param tx - The tx that failed the double spend validator.
192
+ * @param blockNumber - The block number of the tx.
193
+ * @param peerId - The peer ID of the peer that sent the tx.
194
+ * @returns True if the tx is valid, false otherwise.
195
+ */
196
+ private handleDoubleSpendFailure;
197
+ /**
198
+ * Validate an attestation.
199
+ *
200
+ * @param attestation - The attestation to validate.
201
+ * @returns True if the attestation is valid, false otherwise.
202
+ */
203
+ validateAttestation(peerId: PeerId, attestation: BlockAttestation): Promise<boolean>;
204
+ /**
205
+ * Validate a block proposal.
206
+ *
207
+ * @param block - The block proposal to validate.
208
+ * @returns True if the block proposal is valid, false otherwise.
209
+ */
210
+ validateBlockProposal(peerId: PeerId, block: BlockProposal): Promise<boolean>;
211
+ /**
212
+ * Validate an epoch proof quote.
213
+ *
214
+ * @param epochProofQuote - The epoch proof quote to validate.
215
+ * @returns True if the epoch proof quote is valid, false otherwise.
216
+ */
217
+ validateEpochProofQuote(peerId: PeerId, epochProofQuote: EpochProofQuote): Promise<boolean>;
218
+ getPeerScore(peerId: PeerId): number;
219
+ private sendToPeers;
220
+ private stopLibP2P;
221
+ }
222
+ //# sourceMappingURL=libp2p_service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"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"}