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