@aztec/p2p 0.0.0-test.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.
- package/README.md +7 -0
- package/dest/bootstrap/bootstrap.d.ts +38 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +123 -0
- package/dest/client/factory.d.ts +21 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +37 -0
- package/dest/client/index.d.ts +3 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +2 -0
- package/dest/client/p2p_client.d.ts +314 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +505 -0
- package/dest/config.d.ts +180 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +193 -0
- package/dest/enr/generate-enr.d.ts +9 -0
- package/dest/enr/generate-enr.d.ts.map +1 -0
- package/dest/enr/generate-enr.js +30 -0
- package/dest/enr/index.d.ts +2 -0
- package/dest/enr/index.d.ts.map +1 -0
- package/dest/enr/index.js +1 -0
- package/dest/errors/reqresp.error.d.ts +28 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +30 -0
- package/dest/index.d.ts +8 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +7 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +57 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +195 -0
- package/dest/mem_pools/attestation_pool/index.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +2 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +22 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +112 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +129 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts +19 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +33 -0
- package/dest/mem_pools/index.d.ts +4 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +1 -0
- package/dest/mem_pools/instrumentation.d.ts +30 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +84 -0
- package/dest/mem_pools/interface.d.ts +11 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +3 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +245 -0
- package/dest/mem_pools/tx_pool/index.d.ts +4 -0
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/index.js +3 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +56 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +141 -0
- package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/priority.js +10 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +169 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +3 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +31 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +26 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +6 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +107 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +12 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +41 -0
- package/dest/msg_validators/tx_validator/index.d.ts +7 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +6 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +44 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +25 -0
- package/dest/services/data_store.d.ts +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +188 -0
- package/dest/services/discv5/discV5_service.d.ts +42 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +214 -0
- package/dest/services/dummy_service.d.ts +85 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +92 -0
- package/dest/services/encoding.d.ts +31 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +66 -0
- package/dest/services/gossipsub/scoring.d.ts +7 -0
- package/dest/services/gossipsub/scoring.d.ts.map +1 -0
- package/dest/services/gossipsub/scoring.js +10 -0
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +2 -0
- package/dest/services/libp2p/libp2p_service.d.ts +186 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +712 -0
- package/dest/services/peer-manager/metrics.d.ts +12 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +33 -0
- package/dest/services/peer-manager/peer_manager.d.ts +94 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +445 -0
- package/dest/services/peer-manager/peer_scoring.d.ts +28 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +86 -0
- package/dest/services/reqresp/config.d.ts +16 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +20 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +88 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +181 -0
- package/dest/services/reqresp/index.d.ts +6 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +4 -0
- package/dest/services/reqresp/interface.d.ts +116 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +84 -0
- package/dest/services/reqresp/metrics.d.ts +15 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +55 -0
- package/dest/services/reqresp/protocols/block.d.ts +4 -0
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block.js +8 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +87 -0
- package/dest/services/reqresp/protocols/index.d.ts +9 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +7 -0
- package/dest/services/reqresp/protocols/ping.d.ts +9 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +9 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +7 -0
- package/dest/services/reqresp/protocols/tx.d.ts +13 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +102 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +184 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +54 -0
- package/dest/services/reqresp/reqresp.d.ts +166 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +516 -0
- package/dest/services/reqresp/status.d.ts +31 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +51 -0
- package/dest/services/service.d.ts +87 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +5 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +6 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +5 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +32 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +36 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +68 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +66 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +207 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +132 -0
- package/dest/testbench/parse_log_file.d.ts +2 -0
- package/dest/testbench/parse_log_file.d.ts.map +1 -0
- package/dest/testbench/parse_log_file.js +131 -0
- package/dest/testbench/testbench.d.ts +2 -0
- package/dest/testbench/testbench.d.ts.map +1 -0
- package/dest/testbench/testbench.js +61 -0
- package/dest/testbench/worker_client_manager.d.ts +56 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -0
- package/dest/testbench/worker_client_manager.js +266 -0
- package/dest/types/index.d.ts +32 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +28 -0
- package/dest/util.d.ts +53 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +140 -0
- package/dest/versioning.d.ts +12 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +33 -0
- package/package.json +127 -0
- package/src/bootstrap/bootstrap.ts +146 -0
- package/src/client/factory.ts +89 -0
- package/src/client/index.ts +2 -0
- package/src/client/p2p_client.ts +754 -0
- package/src/config.ts +371 -0
- package/src/enr/generate-enr.ts +39 -0
- package/src/enr/index.ts +1 -0
- package/src/errors/reqresp.error.ts +35 -0
- package/src/index.ts +7 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +62 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +230 -0
- package/src/mem_pools/attestation_pool/index.ts +2 -0
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +159 -0
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +161 -0
- package/src/mem_pools/attestation_pool/mocks.ts +44 -0
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +126 -0
- package/src/mem_pools/interface.ts +12 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +309 -0
- package/src/mem_pools/tx_pool/index.ts +3 -0
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +174 -0
- package/src/mem_pools/tx_pool/priority.ts +13 -0
- package/src/mem_pools/tx_pool/tx_pool.ts +76 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +130 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
- package/src/msg_validators/block_proposal_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +3 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +32 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +25 -0
- package/src/msg_validators/tx_validator/data_validator.ts +106 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +38 -0
- package/src/msg_validators/tx_validator/index.ts +6 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +48 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +18 -0
- package/src/services/data_store.ts +235 -0
- package/src/services/discv5/discV5_service.ts +256 -0
- package/src/services/dummy_service.ts +134 -0
- package/src/services/encoding.ts +79 -0
- package/src/services/gossipsub/scoring.ts +13 -0
- package/src/services/index.ts +2 -0
- package/src/services/libp2p/libp2p_service.ts +871 -0
- package/src/services/peer-manager/metrics.ts +41 -0
- package/src/services/peer-manager/peer_manager.ts +530 -0
- package/src/services/peer-manager/peer_scoring.ts +105 -0
- package/src/services/reqresp/config.ts +35 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +217 -0
- package/src/services/reqresp/index.ts +4 -0
- package/src/services/reqresp/interface.ts +185 -0
- package/src/services/reqresp/metrics.ts +57 -0
- package/src/services/reqresp/protocols/block.ts +15 -0
- package/src/services/reqresp/protocols/goodbye.ts +101 -0
- package/src/services/reqresp/protocols/index.ts +8 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/protocols/status.ts +8 -0
- package/src/services/reqresp/protocols/tx.ts +29 -0
- package/src/services/reqresp/rate-limiter/index.ts +1 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +228 -0
- package/src/services/reqresp/rate-limiter/rate_limits.ts +55 -0
- package/src/services/reqresp/reqresp.ts +661 -0
- package/src/services/reqresp/status.ts +59 -0
- package/src/services/service.ts +112 -0
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +5 -0
- package/src/test-helpers/make-enrs.ts +44 -0
- package/src/test-helpers/make-test-p2p-clients.ts +122 -0
- package/src/test-helpers/reqresp-nodes.ts +289 -0
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +152 -0
- package/src/testbench/parse_log_file.ts +175 -0
- package/src/testbench/testbench.ts +66 -0
- package/src/testbench/worker_client_manager.ts +318 -0
- package/src/types/index.ts +36 -0
- package/src/util.ts +196 -0
- package/src/versioning.ts +50 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import type { PeerId } from '@libp2p/interface';
|
|
4
|
+
|
|
5
|
+
import type { PeerManager } from '../../peer-manager/peer_manager.js';
|
|
6
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../interface.js';
|
|
7
|
+
import type { ReqResp } from '../reqresp.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Enum defining the possible reasons for a goodbye message.
|
|
11
|
+
*/
|
|
12
|
+
export enum GoodByeReason {
|
|
13
|
+
/** The peer has shutdown, will be received whenever a peer's node is routinely stopped */
|
|
14
|
+
SHUTDOWN = 0x1,
|
|
15
|
+
/** The max peer count has been reached, will be received whenever a low scoring peer is disconnected to satisfy the max peer count */
|
|
16
|
+
MAX_PEERS = 0x2,
|
|
17
|
+
/** The peer has a low score, will be received whenever a peer's score is low */
|
|
18
|
+
LOW_SCORE = 0x3,
|
|
19
|
+
/** The peer has been banned, will be received whenever a peer is banned */
|
|
20
|
+
BANNED = 0x4,
|
|
21
|
+
/** Wrong network / fork */
|
|
22
|
+
WRONG_NETWORK = 0x5,
|
|
23
|
+
/** Unknown reason */
|
|
24
|
+
UNKNOWN = 0x6,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function encodeGoodbyeReason(reason: GoodByeReason): Buffer {
|
|
28
|
+
return Buffer.from([reason]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function decodeGoodbyeReason(buffer: Buffer): GoodByeReason {
|
|
32
|
+
try {
|
|
33
|
+
if (buffer.length !== 1) {
|
|
34
|
+
throw new Error('Invalid goodbye reason buffer length');
|
|
35
|
+
}
|
|
36
|
+
return buffer[0] as GoodByeReason;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
return GoodByeReason.UNKNOWN;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Pretty prints the goodbye reason.
|
|
44
|
+
* @param reason - The goodbye reason.
|
|
45
|
+
* @returns The pretty printed goodbye reason.
|
|
46
|
+
*/
|
|
47
|
+
export function prettyGoodbyeReason(reason: GoodByeReason): string {
|
|
48
|
+
switch (reason) {
|
|
49
|
+
case GoodByeReason.SHUTDOWN:
|
|
50
|
+
return 'shutdown';
|
|
51
|
+
case GoodByeReason.MAX_PEERS:
|
|
52
|
+
return 'max_peers';
|
|
53
|
+
case GoodByeReason.LOW_SCORE:
|
|
54
|
+
return 'low_score';
|
|
55
|
+
case GoodByeReason.BANNED:
|
|
56
|
+
return 'banned';
|
|
57
|
+
// TODO(#11328): implement
|
|
58
|
+
case GoodByeReason.WRONG_NETWORK:
|
|
59
|
+
return 'wrong_network';
|
|
60
|
+
case GoodByeReason.UNKNOWN:
|
|
61
|
+
return 'unknown';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Handles a goodbye message request
|
|
67
|
+
*/
|
|
68
|
+
export class GoodbyeProtocolHandler {
|
|
69
|
+
private logger = createLogger('p2p:goodbye-protocol');
|
|
70
|
+
|
|
71
|
+
constructor(private reqresp: ReqResp) {}
|
|
72
|
+
|
|
73
|
+
public async sendGoodbye(peerId: PeerId, reason: GoodByeReason): Promise<void> {
|
|
74
|
+
try {
|
|
75
|
+
await this.reqresp.sendRequestToPeer(peerId, ReqRespSubProtocol.GOODBYE, Buffer.from([reason]));
|
|
76
|
+
this.logger.debug(`Sent goodbye to peer ${peerId.toString()} with reason ${reason}`);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
this.logger.debug(`Failed to send goodbye to peer ${peerId.toString()}: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Handles the goodbye request. In request response, the goodbye request is handled by the peer manager.
|
|
85
|
+
*
|
|
86
|
+
* @dev Implemented as returning a function as the function is bound in the libp2p service, however
|
|
87
|
+
* its implementation is here to keep functionality together.
|
|
88
|
+
*
|
|
89
|
+
* @param peerManager - The peer manager.
|
|
90
|
+
* @returns A resolved promise with the goodbye response.
|
|
91
|
+
*/
|
|
92
|
+
export function reqGoodbyeHandler(peerManager: PeerManager): ReqRespSubProtocolHandler {
|
|
93
|
+
return (peerId: PeerId, _msg: Buffer) => {
|
|
94
|
+
const reason = decodeGoodbyeReason(_msg);
|
|
95
|
+
|
|
96
|
+
peerManager.goodbyeReceived(peerId, reason);
|
|
97
|
+
|
|
98
|
+
// Return a buffer of length 1 as an acknowledgement: this is allowed to fail
|
|
99
|
+
return Promise.resolve(Buffer.from([0x0]));
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { P2PClientType } from '@aztec/stdlib/p2p';
|
|
2
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
3
|
+
|
|
4
|
+
import type { PeerId } from '@libp2p/interface';
|
|
5
|
+
|
|
6
|
+
import type { MemPools } from '../../../mem_pools/interface.js';
|
|
7
|
+
import type { ReqRespSubProtocolHandler } from '../interface.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* We want to keep the logic of the req resp handler in this file, but we do not have a reference to the mempools here
|
|
11
|
+
* so we need to pass it in as a parameter.
|
|
12
|
+
*
|
|
13
|
+
* Handler for tx requests
|
|
14
|
+
* @param mempools - the mempools
|
|
15
|
+
* @returns the tx response message
|
|
16
|
+
*/
|
|
17
|
+
export function reqRespTxHandler<T extends P2PClientType>(mempools: MemPools<T>): ReqRespSubProtocolHandler {
|
|
18
|
+
/**
|
|
19
|
+
* Handler for tx requests
|
|
20
|
+
* @param msg - the tx request message
|
|
21
|
+
* @returns the tx response message
|
|
22
|
+
*/
|
|
23
|
+
return async (_peerId: PeerId, msg: Buffer) => {
|
|
24
|
+
const txHash = TxHash.fromBuffer(msg);
|
|
25
|
+
const foundTx = await mempools.txPool.getTxByHash(txHash);
|
|
26
|
+
const buf = foundTx ? foundTx.toBuffer() : Buffer.alloc(0);
|
|
27
|
+
return buf;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RequestResponseRateLimiter } from './rate_limiter.js';
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @attribution Rate limiter approach implemented in the lodestar ethereum 2 client.
|
|
3
|
+
* Rationale is that if it was good enough for them, then it should be good enough for us.
|
|
4
|
+
* https://github.com/ChainSafe/lodestar
|
|
5
|
+
*/
|
|
6
|
+
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
7
|
+
|
|
8
|
+
import type { PeerId } from '@libp2p/interface';
|
|
9
|
+
|
|
10
|
+
import type { PeerScoring } from '../../peer-manager/peer_scoring.js';
|
|
11
|
+
import type { ReqRespSubProtocol, ReqRespSubProtocolRateLimits } from '../interface.js';
|
|
12
|
+
import { DEFAULT_RATE_LIMITS } from './rate_limits.js';
|
|
13
|
+
|
|
14
|
+
// Check for disconnected peers every 10 minutes
|
|
15
|
+
const CHECK_DISCONNECTED_PEERS_INTERVAL_MS = 10 * 60 * 1000;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* GCRARateLimiter: A Generic Cell Rate Algorithm (GCRA) based rate limiter.
|
|
19
|
+
*
|
|
20
|
+
* How it works:
|
|
21
|
+
* 1. The rate limiter allows a certain number of operations (quotaCount) within a specified
|
|
22
|
+
* time interval (quotaTimeMs).
|
|
23
|
+
* 2. It uses a "virtual scheduling time" (VST) to determine when the next operation should be allowed.
|
|
24
|
+
* 3. When an operation is requested, the limiter checks if enough time has passed since the last
|
|
25
|
+
* allowed operation.
|
|
26
|
+
* 4. If sufficient time has passed, the operation is allowed, and the VST is updated.
|
|
27
|
+
* 5. If not enough time has passed, the operation is denied.
|
|
28
|
+
*
|
|
29
|
+
* The limiter also allows for short bursts of activity, as long as the overall rate doesn't exceed
|
|
30
|
+
* the specified quota over time.
|
|
31
|
+
*
|
|
32
|
+
* Usage example:
|
|
33
|
+
* ```
|
|
34
|
+
* const limiter = new GCRARateLimiter(100, 60000); // 100 operations per minute
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export class GCRARateLimiter {
|
|
38
|
+
// Virtual scheduling time: i.e. the time at which we should allow the next request
|
|
39
|
+
private vst: number;
|
|
40
|
+
// The interval at which we emit a new token
|
|
41
|
+
private readonly emissionInterval: number;
|
|
42
|
+
// The interval over which we limit the number of requests
|
|
43
|
+
private readonly limitInterval: number;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param quotaCount - The number of requests to allow over the limit interval
|
|
47
|
+
* @param quotaTimeMs - The time interval over which the quotaCount applies
|
|
48
|
+
*/
|
|
49
|
+
constructor(quotaCount: number, quotaTimeMs: number) {
|
|
50
|
+
this.emissionInterval = quotaTimeMs / quotaCount;
|
|
51
|
+
this.limitInterval = quotaTimeMs;
|
|
52
|
+
this.vst = Date.now();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
allow(): boolean {
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
|
|
58
|
+
const newVst = Math.max(this.vst, now) + this.emissionInterval;
|
|
59
|
+
if (newVst - now <= this.limitInterval) {
|
|
60
|
+
this.vst = newVst;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface PeerRateLimiter {
|
|
69
|
+
// The rate limiter for this peer
|
|
70
|
+
limiter: GCRARateLimiter;
|
|
71
|
+
// The last time the peer was accessed - used to determine if the peer is still connected
|
|
72
|
+
lastAccess: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export enum RateLimitStatus {
|
|
76
|
+
DeniedGlobal,
|
|
77
|
+
DeniedPeer,
|
|
78
|
+
Allowed, // Note: allowed last to prevent enum evaluating to 0 for success
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function prettyPrintRateLimitStatus(status: RateLimitStatus) {
|
|
82
|
+
switch (status) {
|
|
83
|
+
case RateLimitStatus.DeniedGlobal:
|
|
84
|
+
return 'DeniedGlobal';
|
|
85
|
+
case RateLimitStatus.DeniedPeer:
|
|
86
|
+
return 'DeniedPeer';
|
|
87
|
+
case RateLimitStatus.Allowed:
|
|
88
|
+
return 'Allowed';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* SubProtocolRateLimiter: A rate limiter for managing request rates on a per-peer and global basis for a specific subprotocol.
|
|
94
|
+
*
|
|
95
|
+
* This class provides a two-tier rate limiting system:
|
|
96
|
+
* 1. A global rate limit for all requests across all peers for this subprotocol.
|
|
97
|
+
* 2. Individual rate limits for each peer.
|
|
98
|
+
*
|
|
99
|
+
* How it works:
|
|
100
|
+
* - When a request comes in, it first checks against the global rate limit.
|
|
101
|
+
* - If the global limit allows, it then checks against the specific peer's rate limit.
|
|
102
|
+
* - The request is only allowed if both the global and peer-specific limits allow it.
|
|
103
|
+
* - It automatically creates and manages rate limiters for new peers as they make requests.
|
|
104
|
+
* - It periodically cleans up rate limiters for inactive peers to conserve memory.
|
|
105
|
+
*
|
|
106
|
+
* Note: Remember to call `start()` to begin the cleanup process and `stop()` when shutting down to clear the cleanup interval.
|
|
107
|
+
*/
|
|
108
|
+
export class SubProtocolRateLimiter {
|
|
109
|
+
private peerLimiters: Map<string, PeerRateLimiter> = new Map();
|
|
110
|
+
private globalLimiter: GCRARateLimiter;
|
|
111
|
+
private readonly peerQuotaCount: number;
|
|
112
|
+
private readonly peerQuotaTimeMs: number;
|
|
113
|
+
|
|
114
|
+
constructor(peerQuotaCount: number, peerQuotaTimeMs: number, globalQuotaCount: number, globalQuotaTimeMs: number) {
|
|
115
|
+
this.peerLimiters = new Map();
|
|
116
|
+
this.globalLimiter = new GCRARateLimiter(globalQuotaCount, globalQuotaTimeMs);
|
|
117
|
+
this.peerQuotaCount = peerQuotaCount;
|
|
118
|
+
this.peerQuotaTimeMs = peerQuotaTimeMs;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
allow(peerId: PeerId): RateLimitStatus {
|
|
122
|
+
if (!this.globalLimiter.allow()) {
|
|
123
|
+
return RateLimitStatus.DeniedGlobal;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const peerIdStr = peerId.toString();
|
|
127
|
+
let peerLimiter: PeerRateLimiter | undefined = this.peerLimiters.get(peerIdStr);
|
|
128
|
+
if (!peerLimiter) {
|
|
129
|
+
// Create a limiter for this peer
|
|
130
|
+
peerLimiter = {
|
|
131
|
+
limiter: new GCRARateLimiter(this.peerQuotaCount, this.peerQuotaTimeMs),
|
|
132
|
+
lastAccess: Date.now(),
|
|
133
|
+
};
|
|
134
|
+
this.peerLimiters.set(peerIdStr, peerLimiter);
|
|
135
|
+
} else {
|
|
136
|
+
peerLimiter.lastAccess = Date.now();
|
|
137
|
+
}
|
|
138
|
+
const peerLimitAllowed = peerLimiter.limiter.allow();
|
|
139
|
+
if (!peerLimitAllowed) {
|
|
140
|
+
return RateLimitStatus.DeniedPeer;
|
|
141
|
+
}
|
|
142
|
+
return RateLimitStatus.Allowed;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
cleanupInactivePeers() {
|
|
146
|
+
const now = Date.now();
|
|
147
|
+
this.peerLimiters.forEach((peerLimiter, peerId) => {
|
|
148
|
+
if (now - peerLimiter.lastAccess > CHECK_DISCONNECTED_PEERS_INTERVAL_MS) {
|
|
149
|
+
this.peerLimiters.delete(peerId);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* RequestResponseRateLimiter.
|
|
157
|
+
*
|
|
158
|
+
* A rate limiter that is protocol aware, then peer aware.
|
|
159
|
+
* SubProtocols can have their own global / peer level rate limits.
|
|
160
|
+
*
|
|
161
|
+
* How it works:
|
|
162
|
+
* - Initializes with a set of rate limit configurations for different subprotocols.
|
|
163
|
+
* - Creates a separate SubProtocolRateLimiter for each configured subprotocol.
|
|
164
|
+
* - When a request comes in, it routes the rate limiting decision to the appropriate subprotocol limiter.
|
|
165
|
+
* - Peers who exceed their peer rate limits will be penalised by the peer manager.
|
|
166
|
+
*
|
|
167
|
+
* Usage:
|
|
168
|
+
* ```
|
|
169
|
+
* const peerManager = new PeerManager(...);
|
|
170
|
+
* const rateLimits = {
|
|
171
|
+
* subprotocol1: { peerLimit: { quotaCount: 10, quotaTimeMs: 1000 }, globalLimit: { quotaCount: 100, quotaTimeMs: 1000 } },
|
|
172
|
+
* subprotocol2: { peerLimit: { quotaCount: 5, quotaTimeMs: 1000 }, globalLimit: { quotaCount: 50, quotaTimeMs: 1000 } }
|
|
173
|
+
* };
|
|
174
|
+
* const limiter = new RequestResponseRateLimiter(peerManager, rateLimits);
|
|
175
|
+
*
|
|
176
|
+
* Note: Ensure to call `stop()` when shutting down to properly clean up all subprotocol limiters.
|
|
177
|
+
*/
|
|
178
|
+
export class RequestResponseRateLimiter {
|
|
179
|
+
private subProtocolRateLimiters: Map<ReqRespSubProtocol, SubProtocolRateLimiter>;
|
|
180
|
+
|
|
181
|
+
private cleanupInterval: NodeJS.Timeout | undefined = undefined;
|
|
182
|
+
|
|
183
|
+
constructor(private peerScoring: PeerScoring, rateLimits: ReqRespSubProtocolRateLimits = DEFAULT_RATE_LIMITS) {
|
|
184
|
+
this.subProtocolRateLimiters = new Map();
|
|
185
|
+
|
|
186
|
+
for (const [subProtocol, protocolLimits] of Object.entries(rateLimits)) {
|
|
187
|
+
this.subProtocolRateLimiters.set(
|
|
188
|
+
subProtocol as ReqRespSubProtocol,
|
|
189
|
+
new SubProtocolRateLimiter(
|
|
190
|
+
protocolLimits.peerLimit.quotaCount,
|
|
191
|
+
protocolLimits.peerLimit.quotaTimeMs,
|
|
192
|
+
protocolLimits.globalLimit.quotaCount,
|
|
193
|
+
protocolLimits.globalLimit.quotaTimeMs,
|
|
194
|
+
),
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
start() {
|
|
200
|
+
this.cleanupInterval = setInterval(() => {
|
|
201
|
+
this.cleanupInactivePeers();
|
|
202
|
+
}, CHECK_DISCONNECTED_PEERS_INTERVAL_MS);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
allow(subProtocol: ReqRespSubProtocol, peerId: PeerId): RateLimitStatus {
|
|
206
|
+
const limiter = this.subProtocolRateLimiters.get(subProtocol);
|
|
207
|
+
if (!limiter) {
|
|
208
|
+
return RateLimitStatus.Allowed;
|
|
209
|
+
}
|
|
210
|
+
const rateLimitStatus = limiter.allow(peerId);
|
|
211
|
+
|
|
212
|
+
if (rateLimitStatus === RateLimitStatus.DeniedPeer) {
|
|
213
|
+
this.peerScoring.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
214
|
+
}
|
|
215
|
+
return rateLimitStatus;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
cleanupInactivePeers() {
|
|
219
|
+
this.subProtocolRateLimiters.forEach(limiter => limiter.cleanupInactivePeers());
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Make sure to call destroy on each of the sub protocol rate limiters when cleaning up
|
|
224
|
+
*/
|
|
225
|
+
stop() {
|
|
226
|
+
clearInterval(this.cleanupInterval);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolRateLimits } from '../interface.js';
|
|
2
|
+
|
|
3
|
+
// TODO(md): these defaults need to be tuned
|
|
4
|
+
export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
|
|
5
|
+
[ReqRespSubProtocol.PING]: {
|
|
6
|
+
peerLimit: {
|
|
7
|
+
quotaTimeMs: 1000,
|
|
8
|
+
quotaCount: 5,
|
|
9
|
+
},
|
|
10
|
+
globalLimit: {
|
|
11
|
+
quotaTimeMs: 1000,
|
|
12
|
+
quotaCount: 10,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
[ReqRespSubProtocol.STATUS]: {
|
|
16
|
+
peerLimit: {
|
|
17
|
+
quotaTimeMs: 1000,
|
|
18
|
+
quotaCount: 5,
|
|
19
|
+
},
|
|
20
|
+
globalLimit: {
|
|
21
|
+
quotaTimeMs: 1000,
|
|
22
|
+
quotaCount: 10,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
[ReqRespSubProtocol.TX]: {
|
|
26
|
+
peerLimit: {
|
|
27
|
+
quotaTimeMs: 1000,
|
|
28
|
+
quotaCount: 10,
|
|
29
|
+
},
|
|
30
|
+
globalLimit: {
|
|
31
|
+
quotaTimeMs: 1000,
|
|
32
|
+
quotaCount: 20,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
[ReqRespSubProtocol.BLOCK]: {
|
|
36
|
+
peerLimit: {
|
|
37
|
+
quotaTimeMs: 1000,
|
|
38
|
+
quotaCount: 2,
|
|
39
|
+
},
|
|
40
|
+
globalLimit: {
|
|
41
|
+
quotaTimeMs: 1000,
|
|
42
|
+
quotaCount: 5,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
[ReqRespSubProtocol.GOODBYE]: {
|
|
46
|
+
peerLimit: {
|
|
47
|
+
quotaTimeMs: 1000,
|
|
48
|
+
quotaCount: 5,
|
|
49
|
+
},
|
|
50
|
+
globalLimit: {
|
|
51
|
+
quotaTimeMs: 1000,
|
|
52
|
+
quotaCount: 10,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|