@aztec/p2p 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.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/dest/bootstrap/bootstrap.d.ts +38 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +31 -38
- package/dest/client/factory.d.ts +21 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +13 -11
- package/dest/client/index.d.ts +3 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +1 -0
- package/dest/client/p2p_client.d.ts +332 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +535 -513
- package/dest/config.d.ts +187 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +64 -53
- 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 +10 -6
- package/dest/index.d.ts +9 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -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 +2 -6
- 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 +32 -64
- 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 +1 -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 +19 -22
- 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 +26 -22
- package/dest/mem_pools/attestation_pool/mocks.d.ts +18 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +6 -10
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts +7 -0
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js +2 -1
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts +4 -0
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/index.js +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts +12 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js +4 -5
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts +8 -0
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.js +3 -2
- package/dest/mem_pools/index.d.ts +5 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +2 -1
- package/dest/mem_pools/instrumentation.d.ts +31 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +42 -37
- package/dest/mem_pools/interface.d.ts +13 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +2 -3
- 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 +134 -127
- 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 +1 -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 +43 -45
- 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 +3 -1
- 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 +2 -3
- 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 +37 -107
- 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 +3 -3
- 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 +2 -2
- 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/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +2 -2
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/epoch_proof_quote_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 +1 -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 +11 -9
- 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 +12 -17
- 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 +32 -41
- 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 +14 -22
- 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 +1 -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 +26 -29
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +8 -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 +12 -17
- 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 +57 -57
- package/dest/services/discv5/discV5_service.d.ts +40 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +82 -43
- package/dest/services/dummy_service.d.ts +83 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +59 -40
- package/dest/services/encoding.d.ts +31 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +9 -10
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/libp2p_logger.d.ts +7 -0
- package/dest/services/libp2p/libp2p_logger.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_logger.js +67 -0
- package/dest/services/libp2p/libp2p_service.d.ts +225 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +727 -709
- 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 +7 -14
- package/dest/services/peer-manager/peer_manager.d.ts +76 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +342 -340
- 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 +18 -20
- 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 +5 -4
- 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 +28 -35
- 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 +59 -60
- 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 +3 -1
- 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 +30 -25
- 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 +10 -23
- 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 +2 -1
- 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 +41 -36
- 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 +3 -1
- 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 +3 -1
- 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 +3 -1
- 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 +8 -5
- 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 +35 -39
- 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 +17 -16
- 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 +463 -460
- 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 +17 -16
- package/dest/services/service.d.ts +86 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +4 -3
- package/dest/services/types.d.ts +32 -0
- package/dest/services/types.d.ts.map +1 -0
- package/dest/services/types.js +19 -20
- 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 +15 -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 +6 -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 +35 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +37 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +71 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +55 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +183 -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 +125 -0
- package/dest/util.d.ts +53 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +34 -23
- package/dest/versioning.d.ts +12 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +38 -0
- package/package.json +11 -9
- package/src/bootstrap/bootstrap.ts +9 -3
- package/src/client/factory.ts +12 -5
- package/src/config.ts +56 -29
- package/src/mem_pools/index.ts +3 -3
- package/src/mem_pools/instrumentation.ts +2 -3
- package/src/msg_validators/attestation_validator/attestation_validator.ts +3 -3
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +3 -3
- package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +3 -3
- package/src/services/discv5/discV5_service.ts +67 -18
- package/src/services/dummy_service.ts +2 -0
- package/src/services/libp2p/libp2p_logger.ts +78 -0
- package/src/services/libp2p/libp2p_service.ts +47 -10
- package/src/services/reqresp/protocols/goodbye.ts +1 -1
- package/src/services/reqresp/reqresp.ts +9 -1
- package/src/services/service.ts +2 -0
- package/src/services/types.ts +2 -10
- 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 +124 -0
- package/src/{mocks/index.ts → test-helpers/reqresp-nodes.ts} +10 -5
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +156 -0
- package/src/testbench/scripts/run_testbench.sh +7 -0
- package/src/versioning.ts +50 -0
- package/dest/mocks/index.js +0 -190
|
@@ -6,15 +6,18 @@ import { TxHash } from '@aztec/circuit-types/tx_hash';
|
|
|
6
6
|
* Handler for tx requests
|
|
7
7
|
* @param mempools - the mempools
|
|
8
8
|
* @returns the tx response message
|
|
9
|
-
*/
|
|
9
|
+
*/
|
|
10
|
+
export function reqRespTxHandler(mempools) {
|
|
10
11
|
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
* Handler for tx requests
|
|
13
|
+
* @param msg - the tx request message
|
|
14
|
+
* @returns the tx response message
|
|
15
|
+
*/
|
|
16
|
+
return async (_peerId, msg) => {
|
|
15
17
|
const txHash = TxHash.fromBuffer(msg);
|
|
16
18
|
const foundTx = await mempools.txPool.getTxByHash(txHash);
|
|
17
19
|
const buf = foundTx ? foundTx.toBuffer() : Buffer.alloc(0);
|
|
18
20
|
return buf;
|
|
19
21
|
};
|
|
20
22
|
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9wcm90b2NvbHMvdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBT3REOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQTBCLFFBQXFCO0lBQzdFOzs7O09BSUc7SUFDSCxPQUFPLEtBQUssRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1,2 @@
|
|
|
1
1
|
export { RequestResponseRateLimiter } from './rate_limiter.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9yYXRlLWxpbWl0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUMifQ==
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { type PeerId } from '@libp2p/interface';
|
|
2
|
+
import { type PeerScoring } from '../../peer-manager/peer_scoring.js';
|
|
3
|
+
import { type ReqRespSubProtocol, type ReqRespSubProtocolRateLimits } from '../interface.js';
|
|
4
|
+
/**
|
|
5
|
+
* GCRARateLimiter: A Generic Cell Rate Algorithm (GCRA) based rate limiter.
|
|
6
|
+
*
|
|
7
|
+
* How it works:
|
|
8
|
+
* 1. The rate limiter allows a certain number of operations (quotaCount) within a specified
|
|
9
|
+
* time interval (quotaTimeMs).
|
|
10
|
+
* 2. It uses a "virtual scheduling time" (VST) to determine when the next operation should be allowed.
|
|
11
|
+
* 3. When an operation is requested, the limiter checks if enough time has passed since the last
|
|
12
|
+
* allowed operation.
|
|
13
|
+
* 4. If sufficient time has passed, the operation is allowed, and the VST is updated.
|
|
14
|
+
* 5. If not enough time has passed, the operation is denied.
|
|
15
|
+
*
|
|
16
|
+
* The limiter also allows for short bursts of activity, as long as the overall rate doesn't exceed
|
|
17
|
+
* the specified quota over time.
|
|
18
|
+
*
|
|
19
|
+
* Usage example:
|
|
20
|
+
* ```
|
|
21
|
+
* const limiter = new GCRARateLimiter(100, 60000); // 100 operations per minute
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class GCRARateLimiter {
|
|
25
|
+
private vst;
|
|
26
|
+
private readonly emissionInterval;
|
|
27
|
+
private readonly limitInterval;
|
|
28
|
+
/**
|
|
29
|
+
* @param quotaCount - The number of requests to allow over the limit interval
|
|
30
|
+
* @param quotaTimeMs - The time interval over which the quotaCount applies
|
|
31
|
+
*/
|
|
32
|
+
constructor(quotaCount: number, quotaTimeMs: number);
|
|
33
|
+
allow(): boolean;
|
|
34
|
+
}
|
|
35
|
+
declare enum RateLimitStatus {
|
|
36
|
+
Allowed = 0,
|
|
37
|
+
DeniedGlobal = 1,
|
|
38
|
+
DeniedPeer = 2
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* SubProtocolRateLimiter: A rate limiter for managing request rates on a per-peer and global basis for a specific subprotocol.
|
|
42
|
+
*
|
|
43
|
+
* This class provides a two-tier rate limiting system:
|
|
44
|
+
* 1. A global rate limit for all requests across all peers for this subprotocol.
|
|
45
|
+
* 2. Individual rate limits for each peer.
|
|
46
|
+
*
|
|
47
|
+
* How it works:
|
|
48
|
+
* - When a request comes in, it first checks against the global rate limit.
|
|
49
|
+
* - If the global limit allows, it then checks against the specific peer's rate limit.
|
|
50
|
+
* - The request is only allowed if both the global and peer-specific limits allow it.
|
|
51
|
+
* - It automatically creates and manages rate limiters for new peers as they make requests.
|
|
52
|
+
* - It periodically cleans up rate limiters for inactive peers to conserve memory.
|
|
53
|
+
*
|
|
54
|
+
* Note: Remember to call `start()` to begin the cleanup process and `stop()` when shutting down to clear the cleanup interval.
|
|
55
|
+
*/
|
|
56
|
+
export declare class SubProtocolRateLimiter {
|
|
57
|
+
private peerLimiters;
|
|
58
|
+
private globalLimiter;
|
|
59
|
+
private readonly peerQuotaCount;
|
|
60
|
+
private readonly peerQuotaTimeMs;
|
|
61
|
+
constructor(peerQuotaCount: number, peerQuotaTimeMs: number, globalQuotaCount: number, globalQuotaTimeMs: number);
|
|
62
|
+
allow(peerId: PeerId): RateLimitStatus;
|
|
63
|
+
cleanupInactivePeers(): void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* RequestResponseRateLimiter.
|
|
67
|
+
*
|
|
68
|
+
* A rate limiter that is protocol aware, then peer aware.
|
|
69
|
+
* SubProtocols can have their own global / peer level rate limits.
|
|
70
|
+
*
|
|
71
|
+
* How it works:
|
|
72
|
+
* - Initializes with a set of rate limit configurations for different subprotocols.
|
|
73
|
+
* - Creates a separate SubProtocolRateLimiter for each configured subprotocol.
|
|
74
|
+
* - When a request comes in, it routes the rate limiting decision to the appropriate subprotocol limiter.
|
|
75
|
+
* - Peers who exceed their peer rate limits will be penalised by the peer manager.
|
|
76
|
+
*
|
|
77
|
+
* Usage:
|
|
78
|
+
* ```
|
|
79
|
+
* const peerManager = new PeerManager(...);
|
|
80
|
+
* const rateLimits = {
|
|
81
|
+
* subprotocol1: { peerLimit: { quotaCount: 10, quotaTimeMs: 1000 }, globalLimit: { quotaCount: 100, quotaTimeMs: 1000 } },
|
|
82
|
+
* subprotocol2: { peerLimit: { quotaCount: 5, quotaTimeMs: 1000 }, globalLimit: { quotaCount: 50, quotaTimeMs: 1000 } }
|
|
83
|
+
* };
|
|
84
|
+
* const limiter = new RequestResponseRateLimiter(peerManager, rateLimits);
|
|
85
|
+
*
|
|
86
|
+
* Note: Ensure to call `stop()` when shutting down to properly clean up all subprotocol limiters.
|
|
87
|
+
*/
|
|
88
|
+
export declare class RequestResponseRateLimiter {
|
|
89
|
+
private peerScoring;
|
|
90
|
+
private subProtocolRateLimiters;
|
|
91
|
+
private cleanupInterval;
|
|
92
|
+
constructor(peerScoring: PeerScoring, rateLimits?: ReqRespSubProtocolRateLimits);
|
|
93
|
+
start(): void;
|
|
94
|
+
allow(subProtocol: ReqRespSubProtocol, peerId: PeerId): boolean;
|
|
95
|
+
cleanupInactivePeers(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Make sure to call destroy on each of the sub protocol rate limiters when cleaning up
|
|
98
|
+
*/
|
|
99
|
+
stop(): void;
|
|
100
|
+
}
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=rate_limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate_limiter.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/rate_limiter.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAM7F;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;;OAGG;gBACS,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAMnD,KAAK,IAAI,OAAO;CAWjB;AASD,aAAK,eAAe;IAClB,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,UAAU,IAAA;CACX;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAOhH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAwBtC,oBAAoB;CAQrB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA0B;IAKzB,OAAO,CAAC,WAAW;IAJ/B,OAAO,CAAC,uBAAuB,CAAkD;IAEjF,OAAO,CAAC,eAAe,CAAyC;gBAE5C,WAAW,EAAE,WAAW,EAAE,UAAU,GAAE,4BAAkD;IAgB5G,KAAK;IAML,KAAK,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAoB/D,oBAAoB;IAIpB;;OAEG;IACH,IAAI;CAGL"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* @attribution Rate limiter approach implemented in the lodestar ethereum 2 client.
|
|
3
3
|
* Rationale is that if it was good enough for them, then it should be good enough for us.
|
|
4
4
|
* https://github.com/ChainSafe/lodestar
|
|
5
|
-
*/
|
|
5
|
+
*/
|
|
6
|
+
import { PeerErrorSeverity } from '@aztec/circuit-types';
|
|
6
7
|
import { DEFAULT_RATE_LIMITS } from './rate_limits.js';
|
|
7
8
|
// Check for disconnected peers every 10 minutes
|
|
8
9
|
const CHECK_DISCONNECTED_PEERS_INTERVAL_MS = 10 * 60 * 1000;
|
|
@@ -25,17 +26,13 @@ const CHECK_DISCONNECTED_PEERS_INTERVAL_MS = 10 * 60 * 1000;
|
|
|
25
26
|
* ```
|
|
26
27
|
* const limiter = new GCRARateLimiter(100, 60000); // 100 operations per minute
|
|
27
28
|
* ```
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
vst;
|
|
31
|
-
// The interval at which we emit a new token
|
|
32
|
-
emissionInterval;
|
|
33
|
-
// The interval over which we limit the number of requests
|
|
34
|
-
limitInterval;
|
|
29
|
+
*/
|
|
30
|
+
export class GCRARateLimiter {
|
|
35
31
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
* @param quotaCount - The number of requests to allow over the limit interval
|
|
33
|
+
* @param quotaTimeMs - The time interval over which the quotaCount applies
|
|
34
|
+
*/
|
|
35
|
+
constructor(quotaCount, quotaTimeMs) {
|
|
39
36
|
this.emissionInterval = quotaTimeMs / quotaCount;
|
|
40
37
|
this.limitInterval = quotaTimeMs;
|
|
41
38
|
this.vst = Date.now();
|
|
@@ -50,12 +47,12 @@ const CHECK_DISCONNECTED_PEERS_INTERVAL_MS = 10 * 60 * 1000;
|
|
|
50
47
|
return false;
|
|
51
48
|
}
|
|
52
49
|
}
|
|
53
|
-
var RateLimitStatus
|
|
50
|
+
var RateLimitStatus;
|
|
51
|
+
(function (RateLimitStatus) {
|
|
54
52
|
RateLimitStatus[RateLimitStatus["Allowed"] = 0] = "Allowed";
|
|
55
53
|
RateLimitStatus[RateLimitStatus["DeniedGlobal"] = 1] = "DeniedGlobal";
|
|
56
54
|
RateLimitStatus[RateLimitStatus["DeniedPeer"] = 2] = "DeniedPeer";
|
|
57
|
-
|
|
58
|
-
}(RateLimitStatus || {});
|
|
55
|
+
})(RateLimitStatus || (RateLimitStatus = {}));
|
|
59
56
|
/**
|
|
60
57
|
* SubProtocolRateLimiter: A rate limiter for managing request rates on a per-peer and global basis for a specific subprotocol.
|
|
61
58
|
*
|
|
@@ -71,12 +68,10 @@ var RateLimitStatus = /*#__PURE__*/ function(RateLimitStatus) {
|
|
|
71
68
|
* - It periodically cleans up rate limiters for inactive peers to conserve memory.
|
|
72
69
|
*
|
|
73
70
|
* Note: Remember to call `start()` to begin the cleanup process and `stop()` when shutting down to clear the cleanup interval.
|
|
74
|
-
*/
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
peerQuotaTimeMs;
|
|
79
|
-
constructor(peerQuotaCount, peerQuotaTimeMs, globalQuotaCount, globalQuotaTimeMs){
|
|
71
|
+
*/
|
|
72
|
+
export class SubProtocolRateLimiter {
|
|
73
|
+
constructor(peerQuotaCount, peerQuotaTimeMs, globalQuotaCount, globalQuotaTimeMs) {
|
|
74
|
+
this.peerLimiters = new Map();
|
|
80
75
|
this.peerLimiters = new Map();
|
|
81
76
|
this.globalLimiter = new GCRARateLimiter(globalQuotaCount, globalQuotaTimeMs);
|
|
82
77
|
this.peerQuotaCount = peerQuotaCount;
|
|
@@ -84,7 +79,7 @@ var RateLimitStatus = /*#__PURE__*/ function(RateLimitStatus) {
|
|
|
84
79
|
}
|
|
85
80
|
allow(peerId) {
|
|
86
81
|
if (!this.globalLimiter.allow()) {
|
|
87
|
-
return
|
|
82
|
+
return RateLimitStatus.DeniedGlobal;
|
|
88
83
|
}
|
|
89
84
|
const peerIdStr = peerId.toString();
|
|
90
85
|
let peerLimiter = this.peerLimiters.get(peerIdStr);
|
|
@@ -92,21 +87,22 @@ var RateLimitStatus = /*#__PURE__*/ function(RateLimitStatus) {
|
|
|
92
87
|
// Create a limiter for this peer
|
|
93
88
|
peerLimiter = {
|
|
94
89
|
limiter: new GCRARateLimiter(this.peerQuotaCount, this.peerQuotaTimeMs),
|
|
95
|
-
lastAccess: Date.now()
|
|
90
|
+
lastAccess: Date.now(),
|
|
96
91
|
};
|
|
97
92
|
this.peerLimiters.set(peerIdStr, peerLimiter);
|
|
98
|
-
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
99
95
|
peerLimiter.lastAccess = Date.now();
|
|
100
96
|
}
|
|
101
97
|
const peerLimitAllowed = peerLimiter.limiter.allow();
|
|
102
98
|
if (!peerLimitAllowed) {
|
|
103
|
-
return
|
|
99
|
+
return RateLimitStatus.DeniedPeer;
|
|
104
100
|
}
|
|
105
|
-
return
|
|
101
|
+
return RateLimitStatus.Allowed;
|
|
106
102
|
}
|
|
107
103
|
cleanupInactivePeers() {
|
|
108
104
|
const now = Date.now();
|
|
109
|
-
this.peerLimiters.forEach((peerLimiter, peerId)=>{
|
|
105
|
+
this.peerLimiters.forEach((peerLimiter, peerId) => {
|
|
110
106
|
if (now - peerLimiter.lastAccess > CHECK_DISCONNECTED_PEERS_INTERVAL_MS) {
|
|
111
107
|
this.peerLimiters.delete(peerId);
|
|
112
108
|
}
|
|
@@ -135,20 +131,18 @@ var RateLimitStatus = /*#__PURE__*/ function(RateLimitStatus) {
|
|
|
135
131
|
* const limiter = new RequestResponseRateLimiter(peerManager, rateLimits);
|
|
136
132
|
*
|
|
137
133
|
* Note: Ensure to call `stop()` when shutting down to properly clean up all subprotocol limiters.
|
|
138
|
-
*/
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
cleanupInterval;
|
|
142
|
-
constructor(peerScoring, rateLimits = DEFAULT_RATE_LIMITS){
|
|
134
|
+
*/
|
|
135
|
+
export class RequestResponseRateLimiter {
|
|
136
|
+
constructor(peerScoring, rateLimits = DEFAULT_RATE_LIMITS) {
|
|
143
137
|
this.peerScoring = peerScoring;
|
|
144
138
|
this.cleanupInterval = undefined;
|
|
145
139
|
this.subProtocolRateLimiters = new Map();
|
|
146
|
-
for (const [subProtocol, protocolLimits] of Object.entries(rateLimits)){
|
|
140
|
+
for (const [subProtocol, protocolLimits] of Object.entries(rateLimits)) {
|
|
147
141
|
this.subProtocolRateLimiters.set(subProtocol, new SubProtocolRateLimiter(protocolLimits.peerLimit.quotaCount, protocolLimits.peerLimit.quotaTimeMs, protocolLimits.globalLimit.quotaCount, protocolLimits.globalLimit.quotaTimeMs));
|
|
148
142
|
}
|
|
149
143
|
}
|
|
150
144
|
start() {
|
|
151
|
-
this.cleanupInterval = setInterval(()=>{
|
|
145
|
+
this.cleanupInterval = setInterval(() => {
|
|
152
146
|
this.cleanupInactivePeers();
|
|
153
147
|
}, CHECK_DISCONNECTED_PEERS_INTERVAL_MS);
|
|
154
148
|
}
|
|
@@ -158,12 +152,12 @@ var RateLimitStatus = /*#__PURE__*/ function(RateLimitStatus) {
|
|
|
158
152
|
return true;
|
|
159
153
|
}
|
|
160
154
|
const rateLimitStatus = limiter.allow(peerId);
|
|
161
|
-
switch(rateLimitStatus){
|
|
162
|
-
case
|
|
155
|
+
switch (rateLimitStatus) {
|
|
156
|
+
case RateLimitStatus.DeniedPeer:
|
|
163
157
|
// Hitting a peer specific limit, we should lightly penalise the peer
|
|
164
158
|
this.peerScoring.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
165
159
|
return false;
|
|
166
|
-
case
|
|
160
|
+
case RateLimitStatus.DeniedGlobal:
|
|
167
161
|
// Hitting a global limit, we should not penalise the peer
|
|
168
162
|
return false;
|
|
169
163
|
default:
|
|
@@ -171,11 +165,13 @@ var RateLimitStatus = /*#__PURE__*/ function(RateLimitStatus) {
|
|
|
171
165
|
}
|
|
172
166
|
}
|
|
173
167
|
cleanupInactivePeers() {
|
|
174
|
-
this.subProtocolRateLimiters.forEach(
|
|
168
|
+
this.subProtocolRateLimiters.forEach(limiter => limiter.cleanupInactivePeers());
|
|
175
169
|
}
|
|
176
170
|
/**
|
|
177
|
-
|
|
178
|
-
|
|
171
|
+
* Make sure to call destroy on each of the sub protocol rate limiters when cleaning up
|
|
172
|
+
*/
|
|
173
|
+
stop() {
|
|
179
174
|
clearInterval(this.cleanupInterval);
|
|
180
175
|
}
|
|
181
176
|
}
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZV9saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvcmF0ZS1saW1pdGVyL3JhdGVfbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFNekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsZ0RBQWdEO0FBQ2hELE1BQU0sb0NBQW9DLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQVExQjs7O09BR0c7SUFDSCxZQUFZLFVBQWtCLEVBQUUsV0FBbUI7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELEtBQUs7UUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRCxJQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBU0QsSUFBSyxlQUlKO0FBSkQsV0FBSyxlQUFlO0lB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate_limits.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/rate_limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAGxF,eAAO,MAAM,mBAAmB,EAAE,4BAmDjC,CAAC"}
|
|
@@ -4,51 +4,52 @@ export const DEFAULT_RATE_LIMITS = {
|
|
|
4
4
|
[ReqRespSubProtocol.PING]: {
|
|
5
5
|
peerLimit: {
|
|
6
6
|
quotaTimeMs: 1000,
|
|
7
|
-
quotaCount: 5
|
|
7
|
+
quotaCount: 5,
|
|
8
8
|
},
|
|
9
9
|
globalLimit: {
|
|
10
10
|
quotaTimeMs: 1000,
|
|
11
|
-
quotaCount: 10
|
|
12
|
-
}
|
|
11
|
+
quotaCount: 10,
|
|
12
|
+
},
|
|
13
13
|
},
|
|
14
14
|
[ReqRespSubProtocol.STATUS]: {
|
|
15
15
|
peerLimit: {
|
|
16
16
|
quotaTimeMs: 1000,
|
|
17
|
-
quotaCount: 5
|
|
17
|
+
quotaCount: 5,
|
|
18
18
|
},
|
|
19
19
|
globalLimit: {
|
|
20
20
|
quotaTimeMs: 1000,
|
|
21
|
-
quotaCount: 10
|
|
22
|
-
}
|
|
21
|
+
quotaCount: 10,
|
|
22
|
+
},
|
|
23
23
|
},
|
|
24
24
|
[ReqRespSubProtocol.TX]: {
|
|
25
25
|
peerLimit: {
|
|
26
26
|
quotaTimeMs: 1000,
|
|
27
|
-
quotaCount: 10
|
|
27
|
+
quotaCount: 10,
|
|
28
28
|
},
|
|
29
29
|
globalLimit: {
|
|
30
30
|
quotaTimeMs: 1000,
|
|
31
|
-
quotaCount: 20
|
|
32
|
-
}
|
|
31
|
+
quotaCount: 20,
|
|
32
|
+
},
|
|
33
33
|
},
|
|
34
34
|
[ReqRespSubProtocol.BLOCK]: {
|
|
35
35
|
peerLimit: {
|
|
36
36
|
quotaTimeMs: 1000,
|
|
37
|
-
quotaCount: 2
|
|
37
|
+
quotaCount: 2,
|
|
38
38
|
},
|
|
39
39
|
globalLimit: {
|
|
40
40
|
quotaTimeMs: 1000,
|
|
41
|
-
quotaCount: 5
|
|
42
|
-
}
|
|
41
|
+
quotaCount: 5,
|
|
42
|
+
},
|
|
43
43
|
},
|
|
44
44
|
[ReqRespSubProtocol.GOODBYE]: {
|
|
45
45
|
peerLimit: {
|
|
46
46
|
quotaTimeMs: 1000,
|
|
47
|
-
quotaCount: 5
|
|
47
|
+
quotaCount: 5,
|
|
48
48
|
},
|
|
49
49
|
globalLimit: {
|
|
50
50
|
quotaTimeMs: 1000,
|
|
51
|
-
quotaCount: 10
|
|
52
|
-
}
|
|
53
|
-
}
|
|
51
|
+
quotaCount: 10,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
54
|
};
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZV9saW1pdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9yYXRlLWxpbWl0ZXIvcmF0ZV9saW1pdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFxQyxNQUFNLGlCQUFpQixDQUFDO0FBRXhGLDRDQUE0QztBQUM1QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUM7SUFDL0QsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QixTQUFTLEVBQUU7WUFDVCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsQ0FBQztTQUNkO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMzQixTQUFTLEVBQUU7WUFDVCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsQ0FBQztTQUNkO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN2QixTQUFTLEVBQUU7WUFDVCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsRUFBRTtTQUNmO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMxQixTQUFTLEVBQUU7WUFDVCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsQ0FBQztTQUNkO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLENBQUM7U0FDZDtLQUNGO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM1QixTQUFTLEVBQUU7WUFDVCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsQ0FBQztTQUNkO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0NBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
4
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
+
import { type PeerId } from '@libp2p/interface';
|
|
6
|
+
import { type Libp2p } from 'libp2p';
|
|
7
|
+
import { type PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
8
|
+
import { type P2PReqRespConfig } from './config.js';
|
|
9
|
+
import { type ReqRespResponse, ReqRespSubProtocol, type ReqRespSubProtocolHandlers, type ReqRespSubProtocolValidators, type SubProtocolMap } from './interface.js';
|
|
10
|
+
/**
|
|
11
|
+
* The Request Response Service
|
|
12
|
+
*
|
|
13
|
+
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
14
|
+
* information that was missed during a syncronisation or a gossip event.
|
|
15
|
+
*
|
|
16
|
+
* This service implements the request response sub protocol, it is heavily inspired from
|
|
17
|
+
* ethereum implementations of the same name.
|
|
18
|
+
*
|
|
19
|
+
* Note, responses get compressed in streamHandler
|
|
20
|
+
* so they get decompressed in readMessage
|
|
21
|
+
*
|
|
22
|
+
* see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
|
|
23
|
+
*/
|
|
24
|
+
export declare class ReqResp {
|
|
25
|
+
private libp2p;
|
|
26
|
+
private peerScoring;
|
|
27
|
+
protected readonly logger: Logger;
|
|
28
|
+
private overallRequestTimeoutMs;
|
|
29
|
+
private individualRequestTimeoutMs;
|
|
30
|
+
private subProtocolHandlers;
|
|
31
|
+
private subProtocolValidators;
|
|
32
|
+
private connectionSampler;
|
|
33
|
+
private rateLimiter;
|
|
34
|
+
private snappyTransform;
|
|
35
|
+
private metrics;
|
|
36
|
+
constructor(config: P2PReqRespConfig, libp2p: Libp2p, peerScoring: PeerScoring, telemetryClient?: TelemetryClient);
|
|
37
|
+
get tracer(): import("@aztec/telemetry-client").Tracer;
|
|
38
|
+
/**
|
|
39
|
+
* Start the reqresp service
|
|
40
|
+
*/
|
|
41
|
+
start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Stop the reqresp service
|
|
44
|
+
*/
|
|
45
|
+
stop(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Send a request to peers, returns the first response
|
|
48
|
+
*
|
|
49
|
+
* @param subProtocol - The protocol being requested
|
|
50
|
+
* @param request - The request to send
|
|
51
|
+
* @returns - The response from the peer, otherwise undefined
|
|
52
|
+
*
|
|
53
|
+
* @description
|
|
54
|
+
* This method attempts to send a request to all active peers using the specified sub-protocol.
|
|
55
|
+
* It opens a stream with each peer, sends the request, and awaits a response.
|
|
56
|
+
* If a valid response is received, it returns the response; otherwise, it continues to the next peer.
|
|
57
|
+
* If no response is received from any peer, it returns undefined.
|
|
58
|
+
*
|
|
59
|
+
* The method performs the following steps:
|
|
60
|
+
* - Sample a peer to send the request to.
|
|
61
|
+
* - Opens a stream with the peer using the specified sub-protocol.
|
|
62
|
+
*
|
|
63
|
+
* When a response is received, it is validated using the given sub protocols response validator.
|
|
64
|
+
* To see the interface for the response validator - see `interface.ts`
|
|
65
|
+
*
|
|
66
|
+
* Failing a response validation requests in a severe peer penalty, and will
|
|
67
|
+
* prompt the node to continue to search to the next peer.
|
|
68
|
+
* For example, a transaction request validator will check that the payload returned does in fact
|
|
69
|
+
* match the txHash that was requested. A peer that fails this check an only be an extremely naughty peer.
|
|
70
|
+
*
|
|
71
|
+
* This entire operation is wrapped in an overall timeout, that is independent of the
|
|
72
|
+
* peer it is requesting data from.
|
|
73
|
+
*
|
|
74
|
+
*/
|
|
75
|
+
sendRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, request: InstanceType<SubProtocolMap[SubProtocol]['request']>): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined>;
|
|
76
|
+
/**
|
|
77
|
+
* Request multiple messages over the same sub protocol, balancing the requests across peers.
|
|
78
|
+
*
|
|
79
|
+
* @devnote
|
|
80
|
+
* - The function prioritizes sending requests to free peers using a batch sampling strategy.
|
|
81
|
+
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
82
|
+
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
83
|
+
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
84
|
+
*
|
|
85
|
+
* Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
|
|
86
|
+
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
87
|
+
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
88
|
+
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
89
|
+
*
|
|
90
|
+
* @param subProtocol
|
|
91
|
+
* @param requests
|
|
92
|
+
* @param timeoutMs
|
|
93
|
+
* @param maxPeers
|
|
94
|
+
* @returns
|
|
95
|
+
*
|
|
96
|
+
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
97
|
+
*/
|
|
98
|
+
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Sends a request to a specific peer
|
|
101
|
+
*
|
|
102
|
+
* We first dial a particular protocol for the peer, this ensures that the peer knows
|
|
103
|
+
* what to respond with
|
|
104
|
+
*
|
|
105
|
+
*
|
|
106
|
+
* @param peerId - The peer to send the request to
|
|
107
|
+
* @param subProtocol - The protocol to use to request
|
|
108
|
+
* @param payload - The payload to send
|
|
109
|
+
* @returns If the request is successful, the response is returned, otherwise undefined
|
|
110
|
+
*
|
|
111
|
+
* @description
|
|
112
|
+
* This method attempts to open a stream with the specified peer, send the payload,
|
|
113
|
+
* and await a response.
|
|
114
|
+
* If an error occurs, it penalizes the peer and returns undefined.
|
|
115
|
+
*
|
|
116
|
+
* The method performs the following steps:
|
|
117
|
+
* - Opens a stream with the peer using the specified sub-protocol.
|
|
118
|
+
* - Sends the payload and awaits a response with a timeout.
|
|
119
|
+
*
|
|
120
|
+
* If the stream is not closed by the dialled peer, and a timeout occurs, then
|
|
121
|
+
* the stream is closed on the requester's end and sender (us) updates its peer score
|
|
122
|
+
*/
|
|
123
|
+
sendRequestToPeer(peerId: PeerId, subProtocol: ReqRespSubProtocol, payload: Buffer): Promise<ReqRespResponse | undefined>;
|
|
124
|
+
/**
|
|
125
|
+
* Handle a response error
|
|
126
|
+
*
|
|
127
|
+
* ReqResp errors are punished differently depending on the severity of the offense
|
|
128
|
+
*
|
|
129
|
+
* @param e - The error
|
|
130
|
+
* @param peerId - The peer id
|
|
131
|
+
* @param subProtocol - The sub protocol
|
|
132
|
+
* @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized
|
|
133
|
+
*/
|
|
134
|
+
private handleResponseError;
|
|
135
|
+
/**
|
|
136
|
+
* Categorize the error and log it.
|
|
137
|
+
*/
|
|
138
|
+
private categorizeError;
|
|
139
|
+
/**
|
|
140
|
+
* Read a message returned from a stream into a single buffer
|
|
141
|
+
*
|
|
142
|
+
* The message is split into two components
|
|
143
|
+
* - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
|
|
144
|
+
* - The second chunk should contain the response data
|
|
145
|
+
*/
|
|
146
|
+
private readMessage;
|
|
147
|
+
/**
|
|
148
|
+
* Stream Handler
|
|
149
|
+
* Reads the incoming stream, determines the protocol, then triggers the appropriate handler
|
|
150
|
+
*
|
|
151
|
+
* @param param0 - The incoming stream data
|
|
152
|
+
*
|
|
153
|
+
* @description
|
|
154
|
+
* An individual stream handler will be bound to each sub protocol, and handles returning data back
|
|
155
|
+
* to the requesting peer.
|
|
156
|
+
*
|
|
157
|
+
* The sub protocol handler interface is defined within `interface.ts` and will be assigned to the
|
|
158
|
+
* req resp service on start up.
|
|
159
|
+
*
|
|
160
|
+
* We check rate limits for each peer, note the peer will be penalised within the rate limiter implementation
|
|
161
|
+
* if they exceed their peer specific limits.
|
|
162
|
+
*/
|
|
163
|
+
private streamHandler;
|
|
164
|
+
private sendErrorChunk;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=reqresp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAc,KAAK,eAAe,EAAiC,MAAM,yBAAyB,CAAC;AAE1G,OAAO,EAA2B,KAAK,MAAM,EAAe,MAAM,mBAAmB,CAAC;AAEtF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AASrC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAGL,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AAKxB;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAO;IAmBhB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IAnBrB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,0BAA0B,CAAS;IAG3C,OAAO,CAAC,mBAAmB,CAA6D;IACxF,OAAO,CAAC,qBAAqB,CAAiE;IAE9F,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,OAAO,CAAiB;gBAG9B,MAAM,EAAE,gBAAgB,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EAChC,eAAe,GAAE,eAAsC;IAgBzD,IAAI,MAAM,6CAET;IAED;;OAEG;IACG,KAAK,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,4BAA4B;IAiBhH;;OAEG;IACG,IAAI;IAoBV;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,WAAW,CAAC,WAAW,SAAS,kBAAkB,EACtD,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,GAC5D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IA8D7E;;;;;;;;;;;;;;;;;;;;;OAqBG;IAQG,gBAAgB,CAAC,WAAW,SAAS,kBAAkB,EAC3D,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAChE,SAAS,SAAQ,EACjB,QAAQ,SAAgC,EACxC,gBAAgB,SAAI,GACnB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IA6HnE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IAKU,iBAAiB,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAgCvC;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoDvB;;;;;;OAMG;YACW,WAAW;IAoCzB;;;;;;;;;;;;;;;OAeG;YAKW,aAAa;YA+DZ,cAAc;CAI9B"}
|