@aztec/p2p 0.67.0 → 0.67.1-devnet

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 (144) hide show
  1. package/dest/bootstrap/bootstrap.js +2 -2
  2. package/dest/client/index.d.ts +5 -4
  3. package/dest/client/index.d.ts.map +1 -1
  4. package/dest/client/index.js +12 -9
  5. package/dest/client/p2p_client.d.ts +6 -6
  6. package/dest/client/p2p_client.d.ts.map +1 -1
  7. package/dest/client/p2p_client.js +12 -11
  8. package/dest/config.d.ts +1 -1
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +2 -2
  11. package/dest/errors/reqresp.error.d.ts +12 -1
  12. package/dest/errors/reqresp.error.d.ts.map +1 -1
  13. package/dest/errors/reqresp.error.js +15 -2
  14. package/dest/index.d.ts +1 -1
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +2 -2
  17. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
  18. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  19. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  20. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  21. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
  22. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
  23. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  24. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
  25. package/dest/mem_pools/interface.d.ts +4 -3
  26. package/dest/mem_pools/interface.d.ts.map +1 -1
  27. package/dest/mocks/index.d.ts +6 -6
  28. package/dest/mocks/index.d.ts.map +1 -1
  29. package/dest/mocks/index.js +8 -8
  30. package/dest/services/data_store.d.ts.map +1 -0
  31. package/dest/services/data_store.js +188 -0
  32. package/dest/{service → services/discv5}/discV5_service.d.ts +2 -2
  33. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  34. package/dest/services/discv5/discV5_service.js +144 -0
  35. package/dest/services/dummy_service.d.ts.map +1 -0
  36. package/dest/{service → services}/dummy_service.js +1 -1
  37. package/dest/{service → services}/encoding.d.ts +5 -0
  38. package/dest/services/encoding.d.ts.map +1 -0
  39. package/dest/services/encoding.js +65 -0
  40. package/dest/services/index.d.ts +3 -0
  41. package/dest/services/index.d.ts.map +1 -0
  42. package/dest/services/index.js +3 -0
  43. package/dest/{service → services/libp2p}/libp2p_service.d.ts +48 -10
  44. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  45. package/dest/services/libp2p/libp2p_service.js +573 -0
  46. package/dest/{service → services/peer-scoring}/peer_scoring.d.ts +1 -1
  47. package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
  48. package/dest/services/peer-scoring/peer_scoring.js +72 -0
  49. package/dest/{service → services}/peer_manager.d.ts +5 -3
  50. package/dest/services/peer_manager.d.ts.map +1 -0
  51. package/dest/services/peer_manager.js +230 -0
  52. package/dest/services/reqresp/config.d.ts.map +1 -0
  53. package/dest/{service → services}/reqresp/config.js +1 -1
  54. package/dest/services/reqresp/handlers.d.ts.map +1 -0
  55. package/dest/{service → services}/reqresp/handlers.js +1 -1
  56. package/dest/services/reqresp/index.d.ts.map +1 -0
  57. package/dest/{service → services}/reqresp/index.js +1 -1
  58. package/dest/services/reqresp/interface.d.ts.map +1 -0
  59. package/dest/{service → services}/reqresp/interface.js +1 -1
  60. package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
  61. package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
  62. package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
  63. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +2 -2
  64. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
  65. package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
  66. package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
  67. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  68. package/dest/services/reqresp/reqresp.js +279 -0
  69. package/dest/services/service.d.ts.map +1 -0
  70. package/dest/{service → services}/service.js +1 -1
  71. package/dest/tx_validator/aggregate_tx_validator.d.ts +1 -1
  72. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  73. package/dest/tx_validator/aggregate_tx_validator.js +5 -3
  74. package/dest/tx_validator/double_spend_validator.d.ts +3 -2
  75. package/dest/tx_validator/double_spend_validator.d.ts.map +1 -1
  76. package/dest/tx_validator/double_spend_validator.js +6 -6
  77. package/package.json +8 -7
  78. package/src/bootstrap/bootstrap.ts +1 -1
  79. package/src/client/index.ts +38 -16
  80. package/src/client/p2p_client.ts +28 -15
  81. package/src/config.ts +1 -1
  82. package/src/errors/reqresp.error.ts +15 -1
  83. package/src/index.ts +1 -1
  84. package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
  85. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
  86. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
  87. package/src/mem_pools/interface.ts +5 -3
  88. package/src/mocks/index.ts +13 -10
  89. package/src/{service → services/discv5}/discV5_service.ts +3 -3
  90. package/src/{service → services}/encoding.ts +21 -3
  91. package/src/services/index.ts +2 -0
  92. package/src/{service → services/libp2p}/libp2p_service.ts +192 -86
  93. package/src/{service → services/peer-scoring}/peer_scoring.ts +1 -1
  94. package/src/{service → services}/peer_manager.ts +5 -2
  95. package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +1 -1
  96. package/src/{service → services}/reqresp/reqresp.ts +83 -17
  97. package/src/tx_validator/aggregate_tx_validator.ts +5 -3
  98. package/src/tx_validator/double_spend_validator.ts +6 -8
  99. package/dest/service/data_store.d.ts.map +0 -1
  100. package/dest/service/data_store.js +0 -188
  101. package/dest/service/discV5_service.d.ts.map +0 -1
  102. package/dest/service/discV5_service.js +0 -144
  103. package/dest/service/dummy_service.d.ts.map +0 -1
  104. package/dest/service/encoding.d.ts.map +0 -1
  105. package/dest/service/encoding.js +0 -49
  106. package/dest/service/index.d.ts +0 -3
  107. package/dest/service/index.d.ts.map +0 -1
  108. package/dest/service/index.js +0 -3
  109. package/dest/service/libp2p_service.d.ts.map +0 -1
  110. package/dest/service/libp2p_service.js +0 -500
  111. package/dest/service/peer_manager.d.ts.map +0 -1
  112. package/dest/service/peer_manager.js +0 -214
  113. package/dest/service/peer_scoring.d.ts.map +0 -1
  114. package/dest/service/peer_scoring.js +0 -72
  115. package/dest/service/reqresp/config.d.ts.map +0 -1
  116. package/dest/service/reqresp/handlers.d.ts.map +0 -1
  117. package/dest/service/reqresp/index.d.ts.map +0 -1
  118. package/dest/service/reqresp/interface.d.ts.map +0 -1
  119. package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
  120. package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
  121. package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  122. package/dest/service/reqresp/reqresp.d.ts.map +0 -1
  123. package/dest/service/reqresp/reqresp.js +0 -230
  124. package/dest/service/service.d.ts.map +0 -1
  125. package/src/service/index.ts +0 -2
  126. /package/dest/{service → services}/data_store.d.ts +0 -0
  127. /package/dest/{service → services}/dummy_service.d.ts +0 -0
  128. /package/dest/{service → services}/reqresp/config.d.ts +0 -0
  129. /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
  130. /package/dest/{service → services}/reqresp/index.d.ts +0 -0
  131. /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
  132. /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
  133. /package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -0
  134. /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
  135. /package/dest/{service → services}/service.d.ts +0 -0
  136. /package/src/{service → services}/data_store.ts +0 -0
  137. /package/src/{service → services}/dummy_service.ts +0 -0
  138. /package/src/{service → services}/reqresp/config.ts +0 -0
  139. /package/src/{service → services}/reqresp/handlers.ts +0 -0
  140. /package/src/{service → services}/reqresp/index.ts +0 -0
  141. /package/src/{service → services}/reqresp/interface.ts +0 -0
  142. /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
  143. /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
  144. /package/src/{service → services}/service.ts +0 -0
@@ -1,49 +0,0 @@
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
- export class SnappyTransform {
41
- inboundTransform(_topicStr, data) {
42
- const uncompressed = Buffer.from(uncompressSync(Buffer.from(data), { asBuffer: true }));
43
- return new Uint8Array(uncompressed);
44
- }
45
- outboundTransform(_topicStr, data) {
46
- return new Uint8Array(compressSync(Buffer.from(data)));
47
- }
48
- }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9lbmNvZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBS2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RELE9BQU8sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxZQUFZO0FBQ1osTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLEVBQUUsQ0FBQztBQUVyQyw0REFBNEQ7QUFDNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFeEQsMkNBQTJDO0FBQzNDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFtQjtJQUM3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBaUI7SUFDNUMsMERBQTBEO0lBQzFELGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsT0FBTyxLQUFLLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWdCO0lBQ3pDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFMUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxPQUFPLGVBQWU7SUFDMUIsZ0JBQWdCLENBQUMsU0FBaUIsRUFBRSxJQUFnQjtRQUNsRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RixPQUFPLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLElBQWdCO1FBQ25ELE9BQU8sSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRiJ9
@@ -1,3 +0,0 @@
1
- export * from './service.js';
2
- export * from './libp2p_service.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from './service.js';
2
- export * from './libp2p_service.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHFCQUFxQixDQUFDIn0=
@@ -1 +0,0 @@
1
- {"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../src/service/libp2p_service.ts"],"names":[],"mappings":"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"}
@@ -1,500 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { BlockAttestation, BlockProposal, EpochProofQuote, MerkleTreeId, TopicType, TopicTypeMap, Tx, TxHash, metricsTopicStrToLabels, } from '@aztec/circuit-types';
3
- import { Fr } from '@aztec/circuits.js';
4
- import { createLogger } from '@aztec/foundation/log';
5
- import { SerialQueue } from '@aztec/foundation/queue';
6
- import { RunningPromise } from '@aztec/foundation/running-promise';
7
- import { Attributes, OtelMetricsAdapter, WithTracer, trackSpan } from '@aztec/telemetry-client';
8
- import { gossipsub } from '@chainsafe/libp2p-gossipsub';
9
- import { createPeerScoreParams, createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
10
- import { noise } from '@chainsafe/libp2p-noise';
11
- import { yamux } from '@chainsafe/libp2p-yamux';
12
- import { identify } from '@libp2p/identify';
13
- import '@libp2p/kad-dht';
14
- import { mplex } from '@libp2p/mplex';
15
- import { tcp } from '@libp2p/tcp';
16
- import { createLibp2p } from 'libp2p';
17
- import { DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator, } from '../tx_validator/index.js';
18
- import { convertToMultiaddr } from '../util.js';
19
- import { AztecDatastore } from './data_store.js';
20
- import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from './encoding.js';
21
- import { PeerManager } from './peer_manager.js';
22
- import { PeerErrorSeverity } from './peer_scoring.js';
23
- import { pingHandler, statusHandler } from './reqresp/handlers.js';
24
- import { DEFAULT_SUB_PROTOCOL_HANDLERS, DEFAULT_SUB_PROTOCOL_VALIDATORS, PING_PROTOCOL, STATUS_PROTOCOL, TX_REQ_PROTOCOL, } from './reqresp/interface.js';
25
- import { ReqResp } from './reqresp/reqresp.js';
26
- /**
27
- * Lib P2P implementation of the P2PService interface.
28
- */
29
- let LibP2PService = (() => {
30
- var _a;
31
- let _classSuper = WithTracer;
32
- let _instanceExtraInitializers = [];
33
- let _processAttestationFromPeer_decorators;
34
- let _processBlockFromPeer_decorators;
35
- let _broadcastAttestation_decorators;
36
- return _a = class LibP2PService extends _classSuper {
37
- constructor(config, node, peerDiscoveryService, mempools, l2BlockSource, proofVerifier, worldStateSynchronizer, telemetry, requestResponseHandlers = DEFAULT_SUB_PROTOCOL_HANDLERS, logger = createLogger('p2p:libp2p_service')) {
38
- super(telemetry, 'LibP2PService');
39
- this.config = (__runInitializers(this, _instanceExtraInitializers), config);
40
- this.node = node;
41
- this.peerDiscoveryService = peerDiscoveryService;
42
- this.mempools = mempools;
43
- this.l2BlockSource = l2BlockSource;
44
- this.proofVerifier = proofVerifier;
45
- this.worldStateSynchronizer = worldStateSynchronizer;
46
- this.telemetry = telemetry;
47
- this.requestResponseHandlers = requestResponseHandlers;
48
- this.logger = logger;
49
- this.jobQueue = new SerialQueue();
50
- this.peerManager = new PeerManager(node, peerDiscoveryService, config, logger);
51
- this.node.services.pubsub.score.params.appSpecificScore = (peerId) => {
52
- return this.peerManager.getPeerScore(peerId);
53
- };
54
- this.node.services.pubsub.score.params.appSpecificWeight = 10;
55
- this.reqresp = new ReqResp(config, node, this.peerManager);
56
- this.blockReceivedCallback = (block) => {
57
- this.logger.verbose(`[WARNING] handler not yet registered: Block received callback not set. Received block ${block.p2pMessageIdentifier()} from peer.`);
58
- return Promise.resolve(undefined);
59
- };
60
- }
61
- /**
62
- * Starts the LibP2P service.
63
- * @returns An empty promise.
64
- */
65
- async start() {
66
- // Check if service is already started
67
- if (this.node.status === 'started') {
68
- throw new Error('P2P service already started');
69
- }
70
- // Get listen & announce addresses for logging
71
- const { tcpListenAddress, tcpAnnounceAddress } = this.config;
72
- if (!tcpAnnounceAddress) {
73
- throw new Error('Announce address not provided.');
74
- }
75
- const announceTcpMultiaddr = convertToMultiaddr(tcpAnnounceAddress, 'tcp');
76
- // Start job queue, peer discovery service and libp2p node
77
- this.jobQueue.start();
78
- await this.peerDiscoveryService.start();
79
- await this.node.start();
80
- // Subscribe to standard GossipSub topics by default
81
- for (const topic in TopicType) {
82
- this.subscribeToTopic(TopicTypeMap[topic].p2pTopic);
83
- }
84
- // add GossipSub listener
85
- this.node.services.pubsub.addEventListener('gossipsub:message', async (e) => {
86
- const { msg, propagationSource: peerId } = e.detail;
87
- this.logger.trace(`Received PUBSUB message.`);
88
- await this.jobQueue.put(() => this.handleNewGossipMessage(msg, peerId));
89
- });
90
- // Start running promise for peer discovery
91
- this.discoveryRunningPromise = new RunningPromise(() => {
92
- this.peerManager.heartbeat();
93
- }, this.config.peerCheckIntervalMS);
94
- this.discoveryRunningPromise.start();
95
- // Define the sub protocol validators - This is done within this start() method to gain a callback to the existing validateTx function
96
- const reqrespSubProtocolValidators = {
97
- ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
98
- [TX_REQ_PROTOCOL]: this.validateRequestedTx.bind(this),
99
- };
100
- await this.reqresp.start(this.requestResponseHandlers, reqrespSubProtocolValidators);
101
- this.logger.info(`Started P2P service`, {
102
- listen: tcpListenAddress,
103
- announce: announceTcpMultiaddr,
104
- peerId: this.node.peerId.toString(),
105
- });
106
- }
107
- /**
108
- * Stops the LibP2P service.
109
- * @returns An empty promise.
110
- */
111
- async stop() {
112
- this.logger.debug('Stopping job queue...');
113
- await this.jobQueue.end();
114
- this.logger.debug('Stopping running promise...');
115
- await this.discoveryRunningPromise?.stop();
116
- this.logger.debug('Stopping peer discovery service...');
117
- await this.peerDiscoveryService.stop();
118
- this.logger.debug('Request response service stopped...');
119
- await this.reqresp.stop();
120
- this.logger.debug('Stopping LibP2P...');
121
- await this.stopLibP2P();
122
- this.logger.info('LibP2P service stopped');
123
- }
124
- /**
125
- * Creates an instance of the LibP2P service.
126
- * @param config - The configuration to use when creating the service.
127
- * @param txPool - The transaction pool to be accessed by the service.
128
- * @returns The new service.
129
- */
130
- static async new(config, peerDiscoveryService, peerId, mempools, l2BlockSource, proofVerifier, worldStateSynchronizer, store, telemetry) {
131
- const { tcpListenAddress, tcpAnnounceAddress, minPeerCount, maxPeerCount } = config;
132
- const bindAddrTcp = convertToMultiaddr(tcpListenAddress, 'tcp');
133
- // We know tcpAnnounceAddress cannot be null here because we set it or throw when setting up the service.
134
- const announceAddrTcp = convertToMultiaddr(tcpAnnounceAddress, 'tcp');
135
- const datastore = new AztecDatastore(store);
136
- const otelMetricsAdapter = new OtelMetricsAdapter(telemetry);
137
- const node = await createLibp2p({
138
- start: false,
139
- peerId,
140
- addresses: {
141
- listen: [bindAddrTcp],
142
- announce: [announceAddrTcp],
143
- },
144
- transports: [
145
- tcp({
146
- maxConnections: config.maxPeerCount,
147
- // socket option: the maximum length of the queue of pending connections
148
- // https://nodejs.org/dist/latest-v18.x/docs/api/net.html#serverlisten
149
- // it's not safe if we increase this number
150
- backlog: 5,
151
- closeServerOnMaxConnections: {
152
- closeAbove: maxPeerCount ?? Infinity,
153
- listenBelow: maxPeerCount ?? Infinity,
154
- },
155
- }),
156
- ],
157
- datastore,
158
- streamMuxers: [yamux(), mplex()],
159
- connectionEncryption: [noise()],
160
- connectionManager: {
161
- minConnections: minPeerCount,
162
- maxConnections: maxPeerCount,
163
- },
164
- services: {
165
- identify: identify({
166
- protocolPrefix: 'aztec',
167
- }),
168
- pubsub: gossipsub({
169
- allowPublishToZeroTopicPeers: true,
170
- D: config.gossipsubD,
171
- Dlo: config.gossipsubDlo,
172
- Dhi: config.gossipsubDhi,
173
- heartbeatInterval: config.gossipsubInterval,
174
- mcacheLength: config.gossipsubMcacheLength,
175
- mcacheGossip: config.gossipsubMcacheGossip,
176
- msgIdFn: getMsgIdFn,
177
- msgIdToStrFn: msgIdToStrFn,
178
- fastMsgIdFn: fastMsgIdFn,
179
- dataTransform: new SnappyTransform(),
180
- metricsRegister: otelMetricsAdapter,
181
- metricsTopicStrToLabel: metricsTopicStrToLabels(),
182
- scoreParams: createPeerScoreParams({
183
- topics: {
184
- [Tx.p2pTopic]: createTopicScoreParams({
185
- topicWeight: 1,
186
- invalidMessageDeliveriesWeight: -20,
187
- invalidMessageDeliveriesDecay: 0.5,
188
- }),
189
- [BlockAttestation.p2pTopic]: createTopicScoreParams({
190
- topicWeight: 1,
191
- invalidMessageDeliveriesWeight: -20,
192
- invalidMessageDeliveriesDecay: 0.5,
193
- }),
194
- [BlockAttestation.p2pTopic]: createTopicScoreParams({
195
- topicWeight: 1,
196
- invalidMessageDeliveriesWeight: -20,
197
- invalidMessageDeliveriesDecay: 0.5,
198
- }),
199
- [EpochProofQuote.p2pTopic]: createTopicScoreParams({
200
- topicWeight: 1,
201
- invalidMessageDeliveriesWeight: -20,
202
- invalidMessageDeliveriesDecay: 0.5,
203
- }),
204
- },
205
- }),
206
- }),
207
- },
208
- });
209
- // Create request response protocol handlers
210
- /**
211
- * Handler for tx requests
212
- * @param msg - the tx request message
213
- * @returns the tx response message
214
- */
215
- const txHandler = (msg) => {
216
- const txHash = TxHash.fromBuffer(msg);
217
- const foundTx = mempools.txPool.getTxByHash(txHash);
218
- const buf = foundTx ? foundTx.toBuffer() : Buffer.alloc(0);
219
- return Promise.resolve(buf);
220
- };
221
- const requestResponseHandlers = {
222
- [PING_PROTOCOL]: pingHandler,
223
- [STATUS_PROTOCOL]: statusHandler,
224
- [TX_REQ_PROTOCOL]: txHandler,
225
- };
226
- return new _a(config, node, peerDiscoveryService, mempools, l2BlockSource, proofVerifier, worldStateSynchronizer, telemetry, requestResponseHandlers);
227
- }
228
- getPeers(includePending) {
229
- return this.peerManager.getPeers(includePending);
230
- }
231
- /**
232
- * Send Request via the ReqResp service
233
- * The subprotocol defined will determine the request and response types
234
- *
235
- * See the subProtocolMap for the mapping of subprotocols to request/response types in `interface.ts`
236
- *
237
- * @param protocol The request response protocol to use
238
- * @param request The request type to send
239
- * @returns
240
- */
241
- sendRequest(protocol, request) {
242
- return this.reqresp.sendRequest(protocol, request);
243
- }
244
- /**
245
- * Get the ENR of the node
246
- * @returns The ENR of the node
247
- */
248
- getEnr() {
249
- return this.peerDiscoveryService.getEnr();
250
- }
251
- registerBlockReceivedCallback(callback) {
252
- this.blockReceivedCallback = callback;
253
- this.logger.verbose('Block received callback registered');
254
- }
255
- /**
256
- * Subscribes to a topic.
257
- * @param topic - The topic to subscribe to.
258
- */
259
- subscribeToTopic(topic) {
260
- if (!this.node.services.pubsub) {
261
- throw new Error('Pubsub service not available.');
262
- }
263
- void this.node.services.pubsub.subscribe(topic);
264
- }
265
- /**
266
- * Publishes data to a topic.
267
- * @param topic - The topic to publish to.
268
- * @param data - The data to publish.
269
- * @returns The number of recipients the data was sent to.
270
- */
271
- async publishToTopic(topic, data) {
272
- if (!this.node.services.pubsub) {
273
- throw new Error('Pubsub service not available.');
274
- }
275
- const result = await this.node.services.pubsub.publish(topic, data);
276
- return result.recipients.length;
277
- }
278
- /**
279
- * Handles a new gossip message that was received by the client.
280
- * @param topic - The message's topic.
281
- * @param data - The message data
282
- */
283
- async handleNewGossipMessage(message, peerId) {
284
- if (message.topic === Tx.p2pTopic) {
285
- const tx = Tx.fromBuffer(Buffer.from(message.data));
286
- await this.processTxFromPeer(tx, peerId);
287
- }
288
- if (message.topic === BlockAttestation.p2pTopic) {
289
- const attestation = BlockAttestation.fromBuffer(Buffer.from(message.data));
290
- await this.processAttestationFromPeer(attestation);
291
- }
292
- if (message.topic == BlockProposal.p2pTopic) {
293
- const block = BlockProposal.fromBuffer(Buffer.from(message.data));
294
- await this.processBlockFromPeer(block);
295
- }
296
- if (message.topic == EpochProofQuote.p2pTopic) {
297
- const epochProofQuote = EpochProofQuote.fromBuffer(Buffer.from(message.data));
298
- this.processEpochProofQuoteFromPeer(epochProofQuote);
299
- }
300
- return;
301
- }
302
- /**Process Attestation From Peer
303
- * When a proposal is received from a peer, we add it to the attestation pool, so it can be accessed by other services.
304
- *
305
- * @param attestation - The attestation to process.
306
- */
307
- async processAttestationFromPeer(attestation) {
308
- this.logger.debug(`Received attestation ${attestation.p2pMessageIdentifier()} from external peer.`);
309
- await this.mempools.attestationPool.addAttestations([attestation]);
310
- }
311
- /**Process block from peer
312
- *
313
- * Pass the received block to the validator client
314
- *
315
- * @param block - The block to process.
316
- */
317
- // REVIEW: callback pattern https://github.com/AztecProtocol/aztec-packages/issues/7963
318
- async processBlockFromPeer(block) {
319
- this.logger.verbose(`Received block ${block.p2pMessageIdentifier()} from external peer.`);
320
- const attestation = await this.blockReceivedCallback(block);
321
- // TODO: fix up this pattern - the abstraction is not nice
322
- // The attestation can be undefined if no handler is registered / the validator deems the block invalid
323
- if (attestation != undefined) {
324
- this.logger.verbose(`Broadcasting attestation ${attestation.p2pMessageIdentifier()}`);
325
- this.broadcastAttestation(attestation);
326
- }
327
- }
328
- /**
329
- * Broadcast an attestation to all peers.
330
- * @param attestation - The attestation to broadcast.
331
- */
332
- broadcastAttestation(attestation) {
333
- this.propagate(attestation);
334
- }
335
- processEpochProofQuoteFromPeer(epochProofQuote) {
336
- this.logger.verbose(`Received epoch proof quote ${epochProofQuote.p2pMessageIdentifier()} from external peer.`);
337
- this.mempools.epochProofQuotePool.addQuote(epochProofQuote);
338
- }
339
- /**
340
- * Propagates provided message to peers.
341
- * @param message - The message to propagate.
342
- */
343
- propagate(message) {
344
- this.logger.trace(`[${message.p2pMessageIdentifier()}] queued`);
345
- void this.jobQueue.put(async () => {
346
- await this.sendToPeers(message);
347
- });
348
- }
349
- async processTxFromPeer(tx, peerId) {
350
- const txHash = tx.getTxHash();
351
- const txHashString = txHash.toString();
352
- this.logger.verbose(`Received tx ${txHashString} from external peer.`);
353
- const isValidTx = await this.validatePropagatedTx(tx, peerId);
354
- if (isValidTx) {
355
- await this.mempools.txPool.addTxs([tx]);
356
- }
357
- }
358
- /**
359
- * Validate a tx that has been requested from a peer.
360
- *
361
- * The core component of this validator is that the tx hash MUST match the requested tx hash,
362
- * In order to perform this check, the tx proof must be verified.
363
- *
364
- * Note: This function is called from within `ReqResp.sendRequest` as part of the
365
- * TX_REQ_PROTOCOL subprotocol validation.
366
- *
367
- * @param requestedTxHash - The hash of the tx that was requested.
368
- * @param responseTx - The tx that was received as a response to the request.
369
- * @param peerId - The peer ID of the peer that sent the tx.
370
- * @returns True if the tx is valid, false otherwise.
371
- */
372
- async validateRequestedTx(requestedTxHash, responseTx, peerId) {
373
- const proofValidator = new TxProofValidator(this.proofVerifier);
374
- const validProof = await proofValidator.validateTx(responseTx);
375
- // If the node returns the wrong data, we penalize it
376
- if (!requestedTxHash.equals(responseTx.getTxHash())) {
377
- // Returning the wrong data is a low tolerance error
378
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
379
- return false;
380
- }
381
- if (!validProof) {
382
- // If the proof is invalid, but the txHash is correct, then this is an active attack and we severly punish
383
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
384
- return false;
385
- }
386
- return true;
387
- }
388
- async validatePropagatedTx(tx, peerId) {
389
- const blockNumber = (await this.l2BlockSource.getBlockNumber()) + 1;
390
- // basic data validation
391
- const dataValidator = new DataTxValidator();
392
- const validData = await dataValidator.validateTx(tx);
393
- if (!validData) {
394
- // penalize
395
- this.node.services.pubsub.score.markInvalidMessageDelivery(peerId.toString(), Tx.p2pTopic);
396
- return false;
397
- }
398
- // metadata validation
399
- const metadataValidator = new MetadataTxValidator(new Fr(this.config.l1ChainId), new Fr(blockNumber));
400
- const validMetadata = await metadataValidator.validateTx(tx);
401
- if (!validMetadata) {
402
- // penalize
403
- this.node.services.pubsub.score.markInvalidMessageDelivery(peerId.toString(), Tx.p2pTopic);
404
- return false;
405
- }
406
- // double spend validation
407
- const doubleSpendValidator = new DoubleSpendTxValidator({
408
- getNullifierIndex: async (nullifier) => {
409
- const merkleTree = this.worldStateSynchronizer.getCommitted();
410
- const index = await merkleTree.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
411
- return index;
412
- },
413
- });
414
- const validDoubleSpend = await doubleSpendValidator.validateTx(tx);
415
- if (!validDoubleSpend) {
416
- // check if nullifier is older than 20 blocks
417
- if (blockNumber - this.config.severePeerPenaltyBlockLength > 0) {
418
- const snapshotValidator = new DoubleSpendTxValidator({
419
- getNullifierIndex: async (nullifier) => {
420
- const merkleTree = this.worldStateSynchronizer.getSnapshot(blockNumber - this.config.severePeerPenaltyBlockLength);
421
- const index = await merkleTree.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
422
- return index;
423
- },
424
- });
425
- const validSnapshot = await snapshotValidator.validateTx(tx);
426
- // High penalty if nullifier is older than 20 blocks
427
- if (!validSnapshot) {
428
- // penalize
429
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
430
- return false;
431
- }
432
- }
433
- // penalize
434
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
435
- return false;
436
- }
437
- // proof validation
438
- const proofValidator = new TxProofValidator(this.proofVerifier);
439
- const validProof = await proofValidator.validateTx(tx);
440
- if (!validProof) {
441
- // penalize
442
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
443
- return false;
444
- }
445
- return true;
446
- }
447
- getPeerScore(peerId) {
448
- return this.node.services.pubsub.score.score(peerId.toString());
449
- }
450
- async sendToPeers(message) {
451
- const parent = message.constructor;
452
- const identifier = message.p2pMessageIdentifier().toString();
453
- this.logger.trace(`Sending message ${identifier}`);
454
- const recipientsNum = await this.publishToTopic(parent.p2pTopic, message.toBuffer());
455
- this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`);
456
- }
457
- // Libp2p seems to hang sometimes if new peers are initiating connections.
458
- async stopLibP2P() {
459
- const TIMEOUT_MS = 5000; // 5 seconds timeout
460
- const timeout = new Promise((resolve, reject) => {
461
- setTimeout(() => reject(new Error('Timeout during libp2p.stop()')), TIMEOUT_MS);
462
- });
463
- try {
464
- await Promise.race([this.node.stop(), timeout]);
465
- this.logger.debug('LibP2P stopped');
466
- }
467
- catch (error) {
468
- this.logger.error('Error during stop or timeout:', error);
469
- }
470
- }
471
- },
472
- (() => {
473
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
474
- _processAttestationFromPeer_decorators = [trackSpan('Libp2pService.processAttestationFromPeer', attestation => ({
475
- [Attributes.BLOCK_NUMBER]: attestation.payload.header.globalVariables.blockNumber.toNumber(),
476
- [Attributes.SLOT_NUMBER]: attestation.payload.header.globalVariables.slotNumber.toNumber(),
477
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
478
- [Attributes.P2P_ID]: attestation.p2pMessageIdentifier().toString(),
479
- }))];
480
- _processBlockFromPeer_decorators = [trackSpan('Libp2pService.processBlockFromPeer', block => ({
481
- [Attributes.BLOCK_NUMBER]: block.payload.header.globalVariables.blockNumber.toNumber(),
482
- [Attributes.SLOT_NUMBER]: block.payload.header.globalVariables.slotNumber.toNumber(),
483
- [Attributes.BLOCK_ARCHIVE]: block.archive.toString(),
484
- [Attributes.P2P_ID]: block.p2pMessageIdentifier().toString(),
485
- }))];
486
- _broadcastAttestation_decorators = [trackSpan('Libp2pService.broadcastAttestation', attestation => ({
487
- [Attributes.BLOCK_NUMBER]: attestation.payload.header.globalVariables.blockNumber.toNumber(),
488
- [Attributes.SLOT_NUMBER]: attestation.payload.header.globalVariables.slotNumber.toNumber(),
489
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
490
- [Attributes.P2P_ID]: attestation.p2pMessageIdentifier().toString(),
491
- }))];
492
- __esDecorate(_a, null, _processAttestationFromPeer_decorators, { kind: "method", name: "processAttestationFromPeer", static: false, private: false, access: { has: obj => "processAttestationFromPeer" in obj, get: obj => obj.processAttestationFromPeer }, metadata: _metadata }, null, _instanceExtraInitializers);
493
- __esDecorate(_a, null, _processBlockFromPeer_decorators, { kind: "method", name: "processBlockFromPeer", static: false, private: false, access: { has: obj => "processBlockFromPeer" in obj, get: obj => obj.processBlockFromPeer }, metadata: _metadata }, null, _instanceExtraInitializers);
494
- __esDecorate(_a, null, _broadcastAttestation_decorators, { kind: "method", name: "broadcastAttestation", static: false, private: false, access: { has: obj => "broadcastAttestation" in obj, get: obj => obj.broadcastAttestation }, metadata: _metadata }, null, _instanceExtraInitializers);
495
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
496
- })(),
497
- _a;
498
- })();
499
- export { LibP2PService };
500
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS9saWJwMnBfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsZUFBZSxFQUdmLFlBQVksRUFHWixTQUFTLEVBQ1QsWUFBWSxFQUNaLEVBQUUsRUFDRixNQUFNLEVBRU4sdUJBQXVCLEdBQ3hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQXdCLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd0SCxPQUFPLEVBQTRDLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJdEMsT0FBTyxFQUNMLGVB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
@@ -1 +0,0 @@
1
- {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../src/service/peer_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,iBAAiB,EAAe,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAYzD,qBAAa,WAAW;IAMpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAa;gBAG3B,UAAU,EAAE,YAAY,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACjB,MAAM,yCAAmC;IA6B5C,SAAS;IAMT,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAOvD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC,QAAQ,CAAC,cAAc,UAAQ,GAAG,QAAQ,EAAE;IAiCnD;;OAEG;IACH,OAAO,CAAC,QAAQ;IAsDhB;;;OAGG;YACW,oBAAoB;YA+CpB,QAAQ;IAmBtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;CAgBzB"}