@aztec/p2p 0.67.1 → 0.68.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +5 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +17 -15
- package/dest/client/factory.d.ts +19 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +40 -0
- package/dest/client/index.d.ts +1 -15
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +2 -37
- package/dest/client/p2p_client.d.ts +6 -6
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +12 -11
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +3 -3
- package/dest/errors/reqresp.error.d.ts +12 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +15 -2
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -3
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- 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 +171 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -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 +114 -0
- package/dest/mem_pools/interface.d.ts +4 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mocks/index.d.ts +7 -6
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +8 -8
- 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 +2 -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 +2 -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 +16 -0
- 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 +2 -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 +4 -0
- package/dest/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +34 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.js +1 -1
- package/dest/{tx_validator → msg_validators/tx_validator}/double_spend_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +56 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/{tx_validator → msg_validators/tx_validator}/index.js +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.js +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +29 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +188 -0
- package/dest/{service → services/discv5}/discV5_service.d.ts +3 -9
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +139 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/{service → services}/dummy_service.js +1 -1
- package/dest/{service → services}/encoding.d.ts +5 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +65 -0
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +3 -0
- package/dest/services/libp2p/libp2p_service.d.ts +222 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +697 -0
- package/dest/services/peer-scoring/peer_scoring.d.ts +25 -0
- package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-scoring/peer_scoring.js +75 -0
- package/dest/services/peer_manager.d.ts +60 -0
- package/dest/services/peer_manager.d.ts.map +1 -0
- package/dest/services/peer_manager.js +358 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/config.js +1 -1
- package/dest/services/reqresp/handlers.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/handlers.js +1 -1
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/index.js +1 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/interface.js +1 -1
- package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
- package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -5
- package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +7 -2
- package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
- package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +279 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/{service → services}/service.js +1 -1
- package/dest/services/types.d.ts +38 -0
- package/dest/services/types.d.ts.map +1 -0
- package/dest/services/types.js +43 -0
- package/package.json +14 -11
- package/src/bootstrap/bootstrap.ts +25 -20
- package/src/client/factory.ts +97 -0
- package/src/client/index.ts +1 -73
- package/src/client/p2p_client.ts +28 -15
- package/src/config.ts +2 -2
- package/src/errors/reqresp.error.ts +15 -1
- package/src/index.ts +2 -2
- package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
- package/src/mem_pools/interface.ts +5 -3
- package/src/mocks/index.ts +16 -10
- 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/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +22 -0
- package/src/msg_validators/epoch_proof_quote_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +3 -0
- package/src/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.ts +5 -3
- package/src/{tx_validator → msg_validators/tx_validator}/double_spend_validator.ts +6 -8
- package/src/{service → services/discv5}/discV5_service.ts +19 -23
- package/src/{service → services}/encoding.ts +21 -3
- package/src/services/index.ts +2 -0
- package/src/{service → services/libp2p}/libp2p_service.ts +350 -90
- package/src/{service → services/peer-scoring}/peer_scoring.ts +27 -23
- package/src/services/peer_manager.ts +422 -0
- package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +2 -1
- package/src/{service → services}/reqresp/reqresp.ts +86 -20
- package/src/services/types.ts +44 -0
- package/dest/service/data_store.d.ts.map +0 -1
- package/dest/service/data_store.js +0 -188
- package/dest/service/discV5_service.d.ts.map +0 -1
- package/dest/service/discV5_service.js +0 -144
- package/dest/service/dummy_service.d.ts.map +0 -1
- package/dest/service/encoding.d.ts.map +0 -1
- package/dest/service/encoding.js +0 -49
- package/dest/service/index.d.ts +0 -3
- package/dest/service/index.d.ts.map +0 -1
- package/dest/service/index.js +0 -3
- package/dest/service/libp2p_service.d.ts +0 -136
- package/dest/service/libp2p_service.d.ts.map +0 -1
- package/dest/service/libp2p_service.js +0 -500
- package/dest/service/peer_manager.d.ts +0 -33
- package/dest/service/peer_manager.d.ts.map +0 -1
- package/dest/service/peer_manager.js +0 -214
- package/dest/service/peer_scoring.d.ts +0 -35
- package/dest/service/peer_scoring.d.ts.map +0 -1
- package/dest/service/peer_scoring.js +0 -72
- package/dest/service/reqresp/config.d.ts.map +0 -1
- package/dest/service/reqresp/handlers.d.ts.map +0 -1
- package/dest/service/reqresp/index.d.ts.map +0 -1
- package/dest/service/reqresp/interface.d.ts.map +0 -1
- package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
- package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
- package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
- package/dest/service/reqresp/reqresp.d.ts.map +0 -1
- package/dest/service/reqresp/reqresp.js +0 -230
- package/dest/service/service.d.ts.map +0 -1
- package/dest/tx_validator/aggregate_tx_validator.d.ts.map +0 -1
- package/dest/tx_validator/aggregate_tx_validator.js +0 -32
- package/dest/tx_validator/data_validator.d.ts.map +0 -1
- package/dest/tx_validator/double_spend_validator.d.ts.map +0 -1
- package/dest/tx_validator/double_spend_validator.js +0 -56
- package/dest/tx_validator/index.d.ts.map +0 -1
- package/dest/tx_validator/metadata_validator.d.ts.map +0 -1
- package/dest/tx_validator/tx_proof_validator.d.ts.map +0 -1
- package/dest/tx_validator/tx_proof_validator.js +0 -29
- package/src/service/index.ts +0 -2
- package/src/service/peer_manager.ts +0 -266
- /package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.d.ts +0 -0
- /package/dest/{tx_validator → msg_validators/tx_validator}/index.d.ts +0 -0
- /package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.d.ts +0 -0
- /package/dest/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.d.ts +0 -0
- /package/dest/{service → services}/data_store.d.ts +0 -0
- /package/dest/{service → services}/dummy_service.d.ts +0 -0
- /package/dest/{service → services}/reqresp/config.d.ts +0 -0
- /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
- /package/dest/{service → services}/reqresp/index.d.ts +0 -0
- /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
- /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
- /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
- /package/dest/{service → services}/service.d.ts +0 -0
- /package/src/{tx_validator → msg_validators/tx_validator}/data_validator.ts +0 -0
- /package/src/{tx_validator → msg_validators/tx_validator}/index.ts +0 -0
- /package/src/{tx_validator → msg_validators/tx_validator}/metadata_validator.ts +0 -0
- /package/src/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.ts +0 -0
- /package/src/{service → services}/data_store.ts +0 -0
- /package/src/{service → services}/dummy_service.ts +0 -0
- /package/src/{service → services}/reqresp/config.ts +0 -0
- /package/src/{service → services}/reqresp/handlers.ts +0 -0
- /package/src/{service → services}/reqresp/index.ts +0 -0
- /package/src/{service → services}/reqresp/interface.ts +0 -0
- /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
- /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
- /package/src/{service → services}/service.ts +0 -0
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
var _AggregateTxValidator_validators;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
export class AggregateTxValidator {
|
|
4
|
-
constructor(...validators) {
|
|
5
|
-
_AggregateTxValidator_validators.set(this, void 0);
|
|
6
|
-
if (validators.length === 0) {
|
|
7
|
-
throw new Error('At least one validator must be provided');
|
|
8
|
-
}
|
|
9
|
-
__classPrivateFieldSet(this, _AggregateTxValidator_validators, validators, "f");
|
|
10
|
-
}
|
|
11
|
-
async validateTxs(txs) {
|
|
12
|
-
const invalidTxs = [];
|
|
13
|
-
let txPool = txs;
|
|
14
|
-
for (const validator of __classPrivateFieldGet(this, _AggregateTxValidator_validators, "f")) {
|
|
15
|
-
const [valid, invalid] = await validator.validateTxs(txPool);
|
|
16
|
-
invalidTxs.push(...invalid);
|
|
17
|
-
txPool = valid;
|
|
18
|
-
}
|
|
19
|
-
return [txPool, invalidTxs];
|
|
20
|
-
}
|
|
21
|
-
async validateTx(tx) {
|
|
22
|
-
for (const validator of __classPrivateFieldGet(this, _AggregateTxValidator_validators, "f")) {
|
|
23
|
-
const valid = await validator.validateTx(tx);
|
|
24
|
-
if (!valid) {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
_AggregateTxValidator_validators = new WeakMap();
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvYWdncmVnYXRlX3R4X3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsWUFBWSxHQUFHLFVBQTRCO1FBRDNDLG1EQUE4QjtRQUU1QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCx1QkFBQSxJQUFJLG9DQUFlLFVBQVUsTUFBQSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDeEIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNqQixLQUFLLE1BQU0sU0FBUyxJQUFJLHVCQUFBLElBQUksd0NBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztZQUM1QixNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUs7UUFDcEIsS0FBSyxNQUFNLFNBQVMsSUFBSSx1QkFBQSxJQUFJLHdDQUFZLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiJ9
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/data_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG5D,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAGrD,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAenE,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA2CrC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAGxC,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACnE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAI9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAApE,eAAe,EAAE,eAAe,EAAmB,iBAAiB,GAAE,OAAc;IAI1F,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAiBtE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAqCpC"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
var _DoubleSpendTxValidator_instances, _DoubleSpendTxValidator_log, _DoubleSpendTxValidator_nullifierSource, _DoubleSpendTxValidator_uniqueNullifiers;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import { Fr } from '@aztec/circuits.js';
|
|
5
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
6
|
-
export class DoubleSpendTxValidator {
|
|
7
|
-
constructor(nullifierSource, isValidatingBlock = true) {
|
|
8
|
-
_DoubleSpendTxValidator_instances.add(this);
|
|
9
|
-
this.isValidatingBlock = isValidatingBlock;
|
|
10
|
-
_DoubleSpendTxValidator_log.set(this, createLogger('p2p:tx_validator:tx_double_spend'));
|
|
11
|
-
_DoubleSpendTxValidator_nullifierSource.set(this, void 0);
|
|
12
|
-
__classPrivateFieldSet(this, _DoubleSpendTxValidator_nullifierSource, nullifierSource, "f");
|
|
13
|
-
}
|
|
14
|
-
async validateTxs(txs) {
|
|
15
|
-
const validTxs = [];
|
|
16
|
-
const invalidTxs = [];
|
|
17
|
-
const thisBlockNullifiers = new Set();
|
|
18
|
-
for (const tx of txs) {
|
|
19
|
-
if (!(await __classPrivateFieldGet(this, _DoubleSpendTxValidator_instances, "m", _DoubleSpendTxValidator_uniqueNullifiers).call(this, tx, thisBlockNullifiers))) {
|
|
20
|
-
invalidTxs.push(tx);
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
validTxs.push(tx);
|
|
24
|
-
}
|
|
25
|
-
return [validTxs, invalidTxs];
|
|
26
|
-
}
|
|
27
|
-
validateTx(tx) {
|
|
28
|
-
return __classPrivateFieldGet(this, _DoubleSpendTxValidator_instances, "m", _DoubleSpendTxValidator_uniqueNullifiers).call(this, tx, new Set());
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
_DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSource = new WeakMap(), _DoubleSpendTxValidator_instances = new WeakSet(), _DoubleSpendTxValidator_uniqueNullifiers = async function _DoubleSpendTxValidator_uniqueNullifiers(tx, thisBlockNullifiers) {
|
|
32
|
-
const nullifiers = (tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers).map(x => x.toBigInt());
|
|
33
|
-
// Ditch this tx if it has repeated nullifiers
|
|
34
|
-
const uniqueNullifiers = new Set(nullifiers);
|
|
35
|
-
if (uniqueNullifiers.size !== nullifiers.length) {
|
|
36
|
-
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
if (this.isValidatingBlock) {
|
|
40
|
-
for (const nullifier of nullifiers) {
|
|
41
|
-
if (thisBlockNullifiers.has(nullifier)) {
|
|
42
|
-
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
thisBlockNullifiers.add(nullifier);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const nullifierIndexes = await Promise.all(nullifiers.map(n => __classPrivateFieldGet(this, _DoubleSpendTxValidator_nullifierSource, "f").getNullifierIndex(new Fr(n))));
|
|
49
|
-
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
50
|
-
if (hasDuplicates) {
|
|
51
|
-
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
return true;
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZG91YmxlX3NwZW5kX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU1yRCxNQUFNLE9BQU8sc0JBQXNCO0lBSWpDLFlBQVksZUFBZ0MsRUFBbUIsb0JBQTZCLElBQUk7O1FBQWpDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZ0I7UUFIaEcsc0NBQU8sWUFBWSxDQUFDLGtDQUFrQyxDQUFDLEVBQUM7UUFDeEQsMERBQWtDO1FBR2hDLHVCQUFBLElBQUksMkNBQW9CLGVBQWUsTUFBQSxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDeEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFRLEVBQUUsQ0FBQztRQUMzQixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFOUMsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLHVCQUFBLElBQUksbUZBQWtCLE1BQXRCLElBQUksRUFBbUIsRUFBRSxFQUFFLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFLO1FBQ2QsT0FBTyx1QkFBQSxJQUFJLG1GQUFrQixNQUF0QixJQUFJLEVBQW1CLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQW1DRjtvTUFqQ0MsS0FBSyxtREFBbUIsRUFBUyxFQUFFLG1CQUFnQztJQUNqRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDdkcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUNiLENBQUM7SUFFRiw4Q0FBOEM7SUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxJQUFJLGdCQUFnQixDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEQsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNuRixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsOENBQThDLENBQUMsQ0FBQztnQkFDN0YsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHVCQUFBLElBQUksK0NBQWlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEgsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzFFLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUNqRyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tx_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAG7C,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAG7D,OAAO,CAAC,OAAO;IAAM,OAAO,CAAC,WAAW;gBAAhC,OAAO,EAAE,EAAE,EAAU,WAAW,EAAE,EAAE;IAExD,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAoBhE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CA+BpC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tx_proof_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_proof_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,6BAA6B,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGhG,qBAAa,gBAAiB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG1C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,6BAA6B;IAErD,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAgBzE,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAGrC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
var _TxProofValidator_log;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
-
export class TxProofValidator {
|
|
6
|
-
constructor(verifier) {
|
|
7
|
-
this.verifier = verifier;
|
|
8
|
-
_TxProofValidator_log.set(this, createLogger('p2p:tx_validator:private_proof'));
|
|
9
|
-
}
|
|
10
|
-
async validateTxs(txs) {
|
|
11
|
-
const validTxs = [];
|
|
12
|
-
const invalidTxs = [];
|
|
13
|
-
for (const tx of txs) {
|
|
14
|
-
if (await this.verifier.verifyProof(tx)) {
|
|
15
|
-
validTxs.push(tx);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
__classPrivateFieldGet(this, _TxProofValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for invalid proof`);
|
|
19
|
-
invalidTxs.push(tx);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return [validTxs, invalidTxs];
|
|
23
|
-
}
|
|
24
|
-
validateTx(tx) {
|
|
25
|
-
return this.verifier.verifyProof(tx);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
_TxProofValidator_log = new WeakMap();
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcHJvb2ZfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci90eF9wcm9vZl92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQXNDLEVBQUUsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFvQixRQUF1QztRQUF2QyxhQUFRLEdBQVIsUUFBUSxDQUErQjtRQUYzRCxnQ0FBTyxZQUFZLENBQUMsZ0NBQWdDLENBQUMsRUFBQztJQUVRLENBQUM7SUFFL0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFTO1FBQ3pCLE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLFVBQVUsR0FBUyxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sdUJBQUEsSUFBSSw2QkFBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbkUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YifQ==
|
package/src/service/index.ts
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { type PeerInfo } from '@aztec/circuit-types';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
|
|
4
|
-
import { type ENR } from '@chainsafe/enr';
|
|
5
|
-
import { type PeerId } from '@libp2p/interface';
|
|
6
|
-
import { type Multiaddr } from '@multiformats/multiaddr';
|
|
7
|
-
import { inspect } from 'util';
|
|
8
|
-
|
|
9
|
-
import { type P2PConfig } from '../config.js';
|
|
10
|
-
import { type PubSubLibp2p } from '../util.js';
|
|
11
|
-
import { type PeerErrorSeverity, PeerScoring } from './peer_scoring.js';
|
|
12
|
-
import { type PeerDiscoveryService } from './service.js';
|
|
13
|
-
|
|
14
|
-
const MAX_DIAL_ATTEMPTS = 3;
|
|
15
|
-
const MAX_CACHED_PEERS = 100;
|
|
16
|
-
|
|
17
|
-
type CachedPeer = {
|
|
18
|
-
peerId: PeerId;
|
|
19
|
-
enr: ENR;
|
|
20
|
-
multiaddrTcp: Multiaddr;
|
|
21
|
-
dialAttempts: number;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export class PeerManager {
|
|
25
|
-
private cachedPeers: Map<string, CachedPeer> = new Map();
|
|
26
|
-
private peerScoring: PeerScoring;
|
|
27
|
-
private heartbeatCounter: number = 0;
|
|
28
|
-
|
|
29
|
-
constructor(
|
|
30
|
-
private libP2PNode: PubSubLibp2p,
|
|
31
|
-
private peerDiscoveryService: PeerDiscoveryService,
|
|
32
|
-
private config: P2PConfig,
|
|
33
|
-
private logger = createLogger('p2p:peer-manager'),
|
|
34
|
-
) {
|
|
35
|
-
this.peerScoring = new PeerScoring(config);
|
|
36
|
-
// Handle new established connections
|
|
37
|
-
this.libP2PNode.addEventListener('peer:connect', evt => {
|
|
38
|
-
const peerId = evt.detail;
|
|
39
|
-
if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
|
|
40
|
-
this.logger.verbose(`Connected to bootstrap peer ${peerId.toString()}`);
|
|
41
|
-
} else {
|
|
42
|
-
this.logger.verbose(`Connected to transaction peer ${peerId.toString()}`);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// Handle lost connections
|
|
47
|
-
this.libP2PNode.addEventListener('peer:disconnect', evt => {
|
|
48
|
-
const peerId = evt.detail;
|
|
49
|
-
if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
|
|
50
|
-
this.logger.verbose(`Disconnected from bootstrap peer ${peerId.toString()}`);
|
|
51
|
-
} else {
|
|
52
|
-
this.logger.verbose(`Disconnected from transaction peer ${peerId.toString()}`);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Handle Discovered peers
|
|
57
|
-
this.peerDiscoveryService.on('peer:discovered', async (enr: ENR) => {
|
|
58
|
-
await this.handleDiscoveredPeer(enr);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
public heartbeat() {
|
|
63
|
-
this.heartbeatCounter++;
|
|
64
|
-
this.discover();
|
|
65
|
-
this.peerScoring.decayAllScores();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
|
|
69
|
-
const id = peerId.toString();
|
|
70
|
-
const penaltyValue = this.peerScoring.peerPenalties[penalty];
|
|
71
|
-
const newScore = this.peerScoring.updateScore(id, -penaltyValue);
|
|
72
|
-
this.logger.verbose(`Penalizing peer ${id} with ${penalty} (new score is ${newScore})`);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
public getPeerScore(peerId: string): number {
|
|
76
|
-
return this.peerScoring.getScore(peerId);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public getPeers(includePending = false): PeerInfo[] {
|
|
80
|
-
const connected = this.libP2PNode
|
|
81
|
-
.getPeers()
|
|
82
|
-
.map(peer => ({ id: peer.toString(), score: this.getPeerScore(peer.toString()), status: 'connected' as const }));
|
|
83
|
-
|
|
84
|
-
if (!includePending) {
|
|
85
|
-
return connected;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const dialQueue = this.libP2PNode
|
|
89
|
-
.getDialQueue()
|
|
90
|
-
.filter(peer => !!peer.peerId)
|
|
91
|
-
.map(peer => ({
|
|
92
|
-
id: peer.peerId!.toString(),
|
|
93
|
-
status: 'dialing' as const,
|
|
94
|
-
dialStatus: peer.status,
|
|
95
|
-
addresses: peer.multiaddrs.map(m => m.toString()),
|
|
96
|
-
}));
|
|
97
|
-
|
|
98
|
-
const cachedPeers = Array.from(this.cachedPeers.values())
|
|
99
|
-
.filter(peer => !dialQueue.some(dialPeer => dialPeer.id && peer.peerId.toString() === dialPeer.id.toString()))
|
|
100
|
-
.filter(peer => !connected.some(connPeer => connPeer.id.toString() === peer.peerId.toString()))
|
|
101
|
-
.map(peer => ({
|
|
102
|
-
status: 'cached' as const,
|
|
103
|
-
id: peer.peerId.toString(),
|
|
104
|
-
addresses: [peer.multiaddrTcp.toString()],
|
|
105
|
-
dialAttempts: peer.dialAttempts,
|
|
106
|
-
enr: peer.enr.encodeTxt(),
|
|
107
|
-
}));
|
|
108
|
-
|
|
109
|
-
return [...connected, ...dialQueue, ...cachedPeers];
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Discovers peers.
|
|
114
|
-
*/
|
|
115
|
-
private discover() {
|
|
116
|
-
// Get current connections
|
|
117
|
-
const connections = this.libP2PNode.getConnections();
|
|
118
|
-
|
|
119
|
-
// Calculate how many connections we're looking to make
|
|
120
|
-
const peersToConnect = this.config.maxPeerCount - connections.length;
|
|
121
|
-
|
|
122
|
-
const logLevel = this.heartbeatCounter % 60 === 0 ? 'info' : 'debug';
|
|
123
|
-
this.logger[logLevel](`Connected to ${connections.length} peers`, {
|
|
124
|
-
connections: connections.length,
|
|
125
|
-
maxPeerCount: this.config.maxPeerCount,
|
|
126
|
-
cachedPeers: this.cachedPeers.size,
|
|
127
|
-
...this.peerScoring.getStats(),
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// Exit if no peers to connect
|
|
131
|
-
if (peersToConnect <= 0) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const cachedPeersToDial: CachedPeer[] = [];
|
|
136
|
-
|
|
137
|
-
const pendingDials = new Set(
|
|
138
|
-
this.libP2PNode
|
|
139
|
-
.getDialQueue()
|
|
140
|
-
.map(pendingDial => pendingDial.peerId?.toString())
|
|
141
|
-
.filter(Boolean) as string[],
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
for (const [id, peerData] of this.cachedPeers.entries()) {
|
|
145
|
-
// if already dialling or connected to, remove from cache
|
|
146
|
-
if (pendingDials.has(id) || connections.some(conn => conn.remotePeer.equals(peerData.peerId))) {
|
|
147
|
-
this.cachedPeers.delete(id);
|
|
148
|
-
} else {
|
|
149
|
-
// cachedPeersToDial.set(id, enr);
|
|
150
|
-
cachedPeersToDial.push(peerData);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// reverse to dial older entries first
|
|
155
|
-
cachedPeersToDial.reverse();
|
|
156
|
-
|
|
157
|
-
for (const peer of cachedPeersToDial) {
|
|
158
|
-
this.cachedPeers.delete(peer.peerId.toString());
|
|
159
|
-
void this.dialPeer(peer);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// if we need more peers, start randomNodesQuery
|
|
163
|
-
if (peersToConnect > 0) {
|
|
164
|
-
this.logger.trace(`Running random nodes query to connect to ${peersToConnect} peers`);
|
|
165
|
-
void this.peerDiscoveryService.runRandomNodesQuery();
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Handles a discovered peer.
|
|
171
|
-
* @param enr - The discovered peer's ENR.
|
|
172
|
-
*/
|
|
173
|
-
private async handleDiscoveredPeer(enr: ENR) {
|
|
174
|
-
// TODO: Will be handling peer scoring here
|
|
175
|
-
|
|
176
|
-
// check if peer is already connected
|
|
177
|
-
const [peerId, multiaddrTcp] = await Promise.all([enr.peerId(), enr.getFullMultiaddr('tcp')]);
|
|
178
|
-
|
|
179
|
-
this.logger.trace(
|
|
180
|
-
`Handling discovered peer ${peerId.toString()} at ${multiaddrTcp?.toString() ?? 'undefined address'}`,
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
// throw if no tcp addr in multiaddr
|
|
184
|
-
if (!multiaddrTcp) {
|
|
185
|
-
this.logger.debug(`No TCP address in discovered node's multiaddr ${enr.encodeTxt()}`);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
const connections = this.libP2PNode.getConnections();
|
|
189
|
-
if (connections.some(conn => conn.remotePeer.equals(peerId))) {
|
|
190
|
-
this.logger.trace(`Already connected to peer ${peerId.toString()}`);
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// check if peer is already in cache
|
|
195
|
-
const id = peerId.toString();
|
|
196
|
-
if (this.cachedPeers.has(id)) {
|
|
197
|
-
this.logger.trace(`Peer already in cache ${id}`);
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// create cached peer object
|
|
202
|
-
const cachedPeer: CachedPeer = {
|
|
203
|
-
peerId,
|
|
204
|
-
enr,
|
|
205
|
-
multiaddrTcp,
|
|
206
|
-
dialAttempts: 0,
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
// Determine if we should dial immediately or not
|
|
210
|
-
if (this.shouldDialPeer()) {
|
|
211
|
-
void this.dialPeer(cachedPeer);
|
|
212
|
-
} else {
|
|
213
|
-
this.logger.trace(`Caching peer ${id}`);
|
|
214
|
-
this.cachedPeers.set(id, cachedPeer);
|
|
215
|
-
// Prune set of cached peers
|
|
216
|
-
this.pruneCachedPeers();
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
private async dialPeer(peer: CachedPeer) {
|
|
221
|
-
const id = peer.peerId.toString();
|
|
222
|
-
await this.libP2PNode.peerStore.merge(peer.peerId, { multiaddrs: [peer.multiaddrTcp] });
|
|
223
|
-
|
|
224
|
-
this.logger.trace(`Dialing peer ${id}`);
|
|
225
|
-
try {
|
|
226
|
-
await this.libP2PNode.dial(peer.multiaddrTcp);
|
|
227
|
-
} catch (error) {
|
|
228
|
-
peer.dialAttempts++;
|
|
229
|
-
if (peer.dialAttempts < MAX_DIAL_ATTEMPTS) {
|
|
230
|
-
this.logger.trace(`Failed to dial peer ${id} (attempt ${peer.dialAttempts})`, { error: inspect(error) });
|
|
231
|
-
this.cachedPeers.set(id, peer);
|
|
232
|
-
} else {
|
|
233
|
-
this.logger.debug(`Failed to dial peer ${id} (dropping)`, { error: inspect(error) });
|
|
234
|
-
this.cachedPeers.delete(id);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
private shouldDialPeer(): boolean {
|
|
240
|
-
const connections = this.libP2PNode.getConnections().length;
|
|
241
|
-
if (connections >= this.config.maxPeerCount) {
|
|
242
|
-
this.logger.trace(
|
|
243
|
-
`Not dialing peer due to max peer count of ${this.config.maxPeerCount} reached (${connections} current connections)`,
|
|
244
|
-
);
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
private pruneCachedPeers() {
|
|
251
|
-
let peersToDelete = this.cachedPeers.size - MAX_CACHED_PEERS;
|
|
252
|
-
if (peersToDelete <= 0) {
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Remove the oldest peers
|
|
257
|
-
for (const key of this.cachedPeers.keys()) {
|
|
258
|
-
this.cachedPeers.delete(key);
|
|
259
|
-
this.logger.trace(`Pruning peer ${key} from cache`);
|
|
260
|
-
peersToDelete--;
|
|
261
|
-
if (peersToDelete <= 0) {
|
|
262
|
-
break;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|