@aztec/p2p 0.66.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.d.ts +4 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +21 -9
- package/dest/client/index.d.ts +5 -4
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +18 -12
- package/dest/client/p2p_client.d.ts +13 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +32 -15
- 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/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +3 -3
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -20
- package/dest/mem_pools/interface.d.ts +4 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +4 -4
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +4 -4
- package/dest/mocks/index.d.ts +6 -6
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +9 -9
- 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 +4 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +144 -0
- package/dest/{service → services}/dummy_service.d.ts +3 -1
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/{service → services}/dummy_service.js +5 -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 +50 -11
- 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 +5 -2
- 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 +8 -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/{service → services}/reqresp/reqresp.js +69 -20
- package/dest/{service → services}/service.d.ts +2 -1
- 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/data_validator.js +3 -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 +8 -8
- package/dest/tx_validator/metadata_validator.js +3 -3
- package/dest/tx_validator/tx_proof_validator.js +3 -3
- package/package.json +12 -8
- package/src/bootstrap/bootstrap.ts +24 -10
- package/src/client/index.ts +44 -19
- package/src/client/p2p_client.ts +58 -36
- 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/attestation_pool/memory_attestation_pool.ts +2 -2
- package/src/mem_pools/instrumentation.ts +1 -21
- package/src/mem_pools/interface.ts +5 -3
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +3 -3
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +3 -3
- package/src/mocks/index.ts +14 -11
- package/src/{service → services/discv5}/discV5_service.ts +20 -15
- package/src/{service → services}/dummy_service.ts +6 -1
- package/src/{service → services}/encoding.ts +21 -3
- package/src/services/index.ts +2 -0
- package/src/{service → services/libp2p}/libp2p_service.ts +208 -96
- package/src/{service → services/peer-scoring}/peer_scoring.ts +9 -2
- package/src/{service → services}/peer_manager.ts +73 -24
- package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +1 -1
- package/src/{service → services}/reqresp/reqresp.ts +87 -21
- package/src/{service → services}/service.ts +3 -1
- package/src/tx_validator/aggregate_tx_validator.ts +5 -3
- package/src/tx_validator/data_validator.ts +2 -2
- package/src/tx_validator/double_spend_validator.ts +8 -10
- package/src/tx_validator/metadata_validator.ts +2 -2
- package/src/tx_validator/tx_proof_validator.ts +2 -2
- 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 -141
- 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 -496
- package/dest/service/peer_manager.d.ts.map +0 -1
- package/dest/service/peer_manager.js +0 -176
- package/dest/service/peer_scoring.d.ts.map +0 -1
- package/dest/service/peer_scoring.js +0 -67
- 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/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}/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/src/{service → services}/data_store.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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { BlockAttestation } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type AztecKVStore, type AztecMapWithSize, type AztecMultiMap } from '@aztec/kv-store';
|
|
5
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
6
|
+
|
|
7
|
+
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
8
|
+
import { type AttestationPool } from './attestation_pool.js';
|
|
9
|
+
|
|
10
|
+
export class KvAttestationPool implements AttestationPool {
|
|
11
|
+
private metrics: PoolInstrumentation<BlockAttestation>;
|
|
12
|
+
|
|
13
|
+
// Index of all proposal ids in a slot
|
|
14
|
+
private attestations: AztecMultiMap<string, string>;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
private store: AztecKVStore,
|
|
18
|
+
telemetry: TelemetryClient,
|
|
19
|
+
private log = createLogger('aztec:attestation_pool'),
|
|
20
|
+
) {
|
|
21
|
+
this.attestations = store.openMultiMap('attestations');
|
|
22
|
+
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private getProposalMapKey(slot: string, proposalId: string): string {
|
|
26
|
+
return `proposal-${slot}-${proposalId}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Get the proposal map for a given slot and proposalId
|
|
31
|
+
*
|
|
32
|
+
* Essentially a nested mapping of address -> attestation
|
|
33
|
+
*
|
|
34
|
+
* @param slot - The slot to get the proposal map for
|
|
35
|
+
* @param proposalId - The proposalId to get the map for
|
|
36
|
+
* @returns The proposal map
|
|
37
|
+
*/
|
|
38
|
+
private getProposalMap(slot: string, proposalId: string): AztecMapWithSize<string, Buffer> {
|
|
39
|
+
const mapKey = this.getProposalMapKey(slot, proposalId);
|
|
40
|
+
return this.store.openMapWithSize(mapKey);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public async addAttestations(attestations: BlockAttestation[]): Promise<void> {
|
|
44
|
+
for (const attestation of attestations) {
|
|
45
|
+
const slotNumber = attestation.payload.header.globalVariables.slotNumber.toString();
|
|
46
|
+
const proposalId = attestation.archive.toString();
|
|
47
|
+
const address = attestation.getSender().toString();
|
|
48
|
+
|
|
49
|
+
// Index the proposalId in the slot map
|
|
50
|
+
await this.attestations.set(slotNumber, proposalId);
|
|
51
|
+
|
|
52
|
+
// Store the actual attestation in the proposal map
|
|
53
|
+
const proposalMap = this.getProposalMap(slotNumber, proposalId);
|
|
54
|
+
await proposalMap.set(address, attestation.toBuffer());
|
|
55
|
+
|
|
56
|
+
this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.metrics.recordAddedObjects(attestations.length);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public getAttestationsForSlot(slot: bigint, proposalId: string): Promise<BlockAttestation[]> {
|
|
63
|
+
const slotNumber = new Fr(slot).toString();
|
|
64
|
+
const proposalMap = this.getProposalMap(slotNumber, proposalId);
|
|
65
|
+
const attestations = proposalMap.values();
|
|
66
|
+
const attestationsArray = Array.from(attestations).map(attestation => BlockAttestation.fromBuffer(attestation));
|
|
67
|
+
return Promise.resolve(attestationsArray);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public async deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void> {
|
|
71
|
+
const olderThan = [];
|
|
72
|
+
|
|
73
|
+
const slots = this.attestations.keys();
|
|
74
|
+
for (const slot of slots) {
|
|
75
|
+
if (BigInt(slot) < oldestSlot) {
|
|
76
|
+
olderThan.push(slot);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
await Promise.all(olderThan.map(oldSlot => this.deleteAttestationsForSlot(BigInt(oldSlot))));
|
|
81
|
+
return Promise.resolve();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public async deleteAttestationsForSlot(slot: bigint): Promise<void> {
|
|
85
|
+
const deletionPromises = [];
|
|
86
|
+
|
|
87
|
+
const slotString = new Fr(slot).toString();
|
|
88
|
+
let numberOfAttestations = 0;
|
|
89
|
+
const proposalIds = this.attestations.getValues(slotString);
|
|
90
|
+
|
|
91
|
+
if (proposalIds) {
|
|
92
|
+
for (const proposalId of proposalIds) {
|
|
93
|
+
const proposalMap = this.getProposalMap(slotString, proposalId);
|
|
94
|
+
numberOfAttestations += proposalMap.size();
|
|
95
|
+
deletionPromises.push(proposalMap.clear());
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
await Promise.all(deletionPromises);
|
|
100
|
+
|
|
101
|
+
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
102
|
+
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
103
|
+
return Promise.resolve();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public async deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void> {
|
|
107
|
+
const deletionPromises = [];
|
|
108
|
+
|
|
109
|
+
const slotString = new Fr(slot).toString();
|
|
110
|
+
const exists = this.attestations.get(slotString);
|
|
111
|
+
|
|
112
|
+
if (exists) {
|
|
113
|
+
// Remove the proposalId from the slot index
|
|
114
|
+
deletionPromises.push(this.attestations.deleteValue(slotString, proposalId));
|
|
115
|
+
|
|
116
|
+
// Delete all attestations for the proposalId
|
|
117
|
+
const proposalMap = this.getProposalMap(slotString, proposalId);
|
|
118
|
+
const numberOfAttestations = proposalMap.size();
|
|
119
|
+
deletionPromises.push(proposalMap.clear());
|
|
120
|
+
|
|
121
|
+
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
122
|
+
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
await Promise.all(deletionPromises);
|
|
126
|
+
return Promise.resolve();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public async deleteAttestations(attestations: BlockAttestation[]): Promise<void> {
|
|
130
|
+
const deletionPromises = [];
|
|
131
|
+
|
|
132
|
+
for (const attestation of attestations) {
|
|
133
|
+
const slotNumber = attestation.payload.header.globalVariables.slotNumber.toString();
|
|
134
|
+
const proposalId = attestation.archive.toString();
|
|
135
|
+
const proposalMap = this.getProposalMap(slotNumber, proposalId);
|
|
136
|
+
|
|
137
|
+
if (proposalMap) {
|
|
138
|
+
const address = attestation.getSender().toString();
|
|
139
|
+
deletionPromises.push(proposalMap.delete(address));
|
|
140
|
+
this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (proposalMap.size() === 0) {
|
|
144
|
+
deletionPromises.push(this.attestations.deleteValue(slotNumber, proposalId));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
await Promise.all(deletionPromises);
|
|
149
|
+
|
|
150
|
+
this.metrics.recordRemovedObjects(attestations.length);
|
|
151
|
+
return Promise.resolve();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type BlockAttestation } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
4
|
|
|
5
5
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
@@ -10,7 +10,7 @@ export class InMemoryAttestationPool implements AttestationPool {
|
|
|
10
10
|
|
|
11
11
|
private attestations: Map</*slot=*/ bigint, Map</*proposalId*/ string, Map</*address=*/ string, BlockAttestation>>>;
|
|
12
12
|
|
|
13
|
-
constructor(telemetry: TelemetryClient, private log =
|
|
13
|
+
constructor(telemetry: TelemetryClient, private log = createLogger('p2p:attestation_pool')) {
|
|
14
14
|
this.attestations = new Map();
|
|
15
15
|
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL);
|
|
16
16
|
}
|
|
@@ -72,32 +72,12 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
72
72
|
this.objectSize = meter.createHistogram(metricsLabels.objectSize, {
|
|
73
73
|
unit: 'By',
|
|
74
74
|
description: 'The size of transactions in the mempool',
|
|
75
|
-
advice: {
|
|
76
|
-
explicitBucketBoundaries: [
|
|
77
|
-
5_000, // 5KB
|
|
78
|
-
10_000,
|
|
79
|
-
20_000,
|
|
80
|
-
50_000,
|
|
81
|
-
75_000,
|
|
82
|
-
100_000, // 100KB
|
|
83
|
-
200_000,
|
|
84
|
-
],
|
|
85
|
-
},
|
|
86
75
|
});
|
|
87
76
|
|
|
88
77
|
this.dbMetrics = new LmdbMetrics(
|
|
89
78
|
meter,
|
|
90
79
|
{
|
|
91
|
-
|
|
92
|
-
description: 'Database map size for the Tx mempool',
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
name: Metrics.MEMPOOL_DB_USED_SIZE,
|
|
96
|
-
description: 'Database used size for the Tx mempool',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: Metrics.MEMPOOL_DB_NUM_ITEMS,
|
|
100
|
-
description: 'Num items in database for the Tx mempool',
|
|
80
|
+
[Attributes.DB_DATA_TYPE]: 'tx-pool',
|
|
101
81
|
},
|
|
102
82
|
dbStats,
|
|
103
83
|
);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type P2PClientType } from '@aztec/circuit-types';
|
|
2
|
+
|
|
1
3
|
import { type AttestationPool } from './attestation_pool/attestation_pool.js';
|
|
2
4
|
import { type EpochProofQuotePool } from './epoch_proof_quote_pool/epoch_proof_quote_pool.js';
|
|
3
5
|
import { type TxPool } from './tx_pool/tx_pool.js';
|
|
@@ -5,8 +7,8 @@ import { type TxPool } from './tx_pool/tx_pool.js';
|
|
|
5
7
|
/**
|
|
6
8
|
* A interface the combines all mempools
|
|
7
9
|
*/
|
|
8
|
-
export
|
|
10
|
+
export type MemPools<T extends P2PClientType = P2PClientType.Full> = {
|
|
9
11
|
txPool: TxPool;
|
|
10
|
-
attestationPool:
|
|
12
|
+
attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
|
|
11
13
|
epochProofQuotePool: EpochProofQuotePool;
|
|
12
|
-
}
|
|
14
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tx, TxHash } from '@aztec/circuit-types';
|
|
2
2
|
import { type TxAddedToPoolStats } from '@aztec/circuit-types/stats';
|
|
3
|
-
import { type Logger,
|
|
3
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { type AztecKVStore, type AztecMap, type AztecSet } from '@aztec/kv-store';
|
|
5
5
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
6
6
|
|
|
@@ -30,7 +30,7 @@ export class AztecKVTxPool implements TxPool {
|
|
|
30
30
|
* @param store - A KV store.
|
|
31
31
|
* @param log - A logger.
|
|
32
32
|
*/
|
|
33
|
-
constructor(store: AztecKVStore, telemetry: TelemetryClient, log =
|
|
33
|
+
constructor(store: AztecKVStore, telemetry: TelemetryClient, log = createLogger('p2p:tx_pool')) {
|
|
34
34
|
this.#txs = store.openMap('txs');
|
|
35
35
|
this.#minedTxs = store.openMap('minedTxs');
|
|
36
36
|
this.#pendingTxs = store.openSet('pendingTxs');
|
|
@@ -125,7 +125,7 @@ export class AztecKVTxPool implements TxPool {
|
|
|
125
125
|
let pendingCount = 0;
|
|
126
126
|
for (const [i, tx] of txs.entries()) {
|
|
127
127
|
const txHash = txHashes[i];
|
|
128
|
-
this.#log.
|
|
128
|
+
this.#log.verbose(`Adding tx ${txHash.toString()} to pool`, {
|
|
129
129
|
eventName: 'tx-added-to-pool',
|
|
130
130
|
...tx.getStats(),
|
|
131
131
|
} satisfies TxAddedToPoolStats);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tx, TxHash } from '@aztec/circuit-types';
|
|
2
2
|
import { type TxAddedToPoolStats } from '@aztec/circuit-types/stats';
|
|
3
|
-
import {
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
5
|
|
|
6
6
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
@@ -23,7 +23,7 @@ export class InMemoryTxPool implements TxPool {
|
|
|
23
23
|
* Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
|
|
24
24
|
* @param log - A logger.
|
|
25
25
|
*/
|
|
26
|
-
constructor(telemetry: TelemetryClient, private log =
|
|
26
|
+
constructor(telemetry: TelemetryClient, private log = createLogger('p2p:tx_pool')) {
|
|
27
27
|
this.txs = new Map<bigint, Tx>();
|
|
28
28
|
this.minedTxs = new Map();
|
|
29
29
|
this.pendingTxs = new Set();
|
|
@@ -105,7 +105,7 @@ export class InMemoryTxPool implements TxPool {
|
|
|
105
105
|
let pending = 0;
|
|
106
106
|
for (const tx of txs) {
|
|
107
107
|
const txHash = tx.getTxHash();
|
|
108
|
-
this.log.
|
|
108
|
+
this.log.verbose(`Adding tx ${txHash.toString()} to pool`, {
|
|
109
109
|
eventName: 'tx-added-to-pool',
|
|
110
110
|
...tx.getStats(),
|
|
111
111
|
} satisfies TxAddedToPoolStats);
|
package/src/mocks/index.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type ClientProtocolCircuitVerifier,
|
|
3
3
|
type L2BlockSource,
|
|
4
|
+
type P2PClientType,
|
|
4
5
|
type Tx,
|
|
5
6
|
type WorldStateSynchronizer,
|
|
6
7
|
} from '@aztec/circuit-types';
|
|
7
8
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
8
|
-
import { openTmpStore } from '@aztec/kv-store/
|
|
9
|
+
import { openTmpStore } from '@aztec/kv-store/lmdb';
|
|
9
10
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
10
11
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
11
12
|
|
|
@@ -23,11 +24,11 @@ import { type Libp2p, type Libp2pOptions, createLibp2p } from 'libp2p';
|
|
|
23
24
|
import { BootstrapNode } from '../bootstrap/bootstrap.js';
|
|
24
25
|
import { type BootnodeConfig, type P2PConfig } from '../config.js';
|
|
25
26
|
import { type MemPools } from '../mem_pools/interface.js';
|
|
26
|
-
import { DiscV5Service } from '../
|
|
27
|
-
import { LibP2PService } from '../
|
|
28
|
-
import { type PeerManager } from '../
|
|
29
|
-
import { type P2PReqRespConfig } from '../
|
|
30
|
-
import { pingHandler, statusHandler } from '../
|
|
27
|
+
import { DiscV5Service } from '../services/discv5/discV5_service.js';
|
|
28
|
+
import { LibP2PService } from '../services/libp2p/libp2p_service.js';
|
|
29
|
+
import { type PeerManager } from '../services/peer_manager.js';
|
|
30
|
+
import { type P2PReqRespConfig } from '../services/reqresp/config.js';
|
|
31
|
+
import { pingHandler, statusHandler } from '../services/reqresp/handlers.js';
|
|
31
32
|
import {
|
|
32
33
|
PING_PROTOCOL,
|
|
33
34
|
type ReqRespSubProtocolHandlers,
|
|
@@ -35,8 +36,8 @@ import {
|
|
|
35
36
|
STATUS_PROTOCOL,
|
|
36
37
|
TX_REQ_PROTOCOL,
|
|
37
38
|
noopValidator,
|
|
38
|
-
} from '../
|
|
39
|
-
import { ReqResp } from '../
|
|
39
|
+
} from '../services/reqresp/interface.js';
|
|
40
|
+
import { ReqResp } from '../services/reqresp/reqresp.js';
|
|
40
41
|
import { type PubSubLibp2p } from '../util.js';
|
|
41
42
|
|
|
42
43
|
/**
|
|
@@ -95,11 +96,12 @@ export async function createLibp2pNode(
|
|
|
95
96
|
*
|
|
96
97
|
*
|
|
97
98
|
*/
|
|
98
|
-
export async function createTestLibP2PService(
|
|
99
|
+
export async function createTestLibP2PService<T extends P2PClientType>(
|
|
100
|
+
clientType: T,
|
|
99
101
|
boostrapAddrs: string[] = [],
|
|
100
102
|
l2BlockSource: L2BlockSource,
|
|
101
103
|
worldStateSynchronizer: WorldStateSynchronizer,
|
|
102
|
-
mempools: MemPools
|
|
104
|
+
mempools: MemPools<T>,
|
|
103
105
|
telemetry: TelemetryClient,
|
|
104
106
|
port: number = 0,
|
|
105
107
|
peerId?: PeerId,
|
|
@@ -123,7 +125,8 @@ export async function createTestLibP2PService(
|
|
|
123
125
|
// No bootstrap nodes provided as the libp2p service will register them in the constructor
|
|
124
126
|
const p2pNode = await createLibp2pNode([], peerId, port, /*enable gossip */ true, /**start */ false);
|
|
125
127
|
|
|
126
|
-
return new LibP2PService(
|
|
128
|
+
return new LibP2PService<T>(
|
|
129
|
+
clientType,
|
|
127
130
|
config,
|
|
128
131
|
p2pNode as PubSubLibp2p,
|
|
129
132
|
discoveryService,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { sleep } from '@aztec/foundation/sleep';
|
|
3
3
|
import { OtelMetricsAdapter, type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
4
|
|
|
5
5
|
import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5';
|
|
6
6
|
import { ENR, SignableENR } from '@chainsafe/enr';
|
|
7
7
|
import type { PeerId } from '@libp2p/interface';
|
|
8
|
-
import { multiaddr } from '@multiformats/multiaddr';
|
|
8
|
+
import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
9
9
|
import EventEmitter from 'events';
|
|
10
10
|
|
|
11
|
-
import type { P2PConfig } from '
|
|
12
|
-
import { convertToMultiaddr } from '
|
|
13
|
-
import { type PeerDiscoveryService, PeerDiscoveryState } from '
|
|
11
|
+
import type { P2PConfig } from '../../config.js';
|
|
12
|
+
import { convertToMultiaddr } from '../../util.js';
|
|
13
|
+
import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
|
|
14
14
|
|
|
15
15
|
export const AZTEC_ENR_KEY = 'aztec_network';
|
|
16
16
|
|
|
@@ -35,6 +35,9 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
35
35
|
/** This instance's ENR */
|
|
36
36
|
private enr: SignableENR;
|
|
37
37
|
|
|
38
|
+
/** UDP listen addr */
|
|
39
|
+
private listenMultiAddrUdp: Multiaddr;
|
|
40
|
+
|
|
38
41
|
private currentState = PeerDiscoveryState.STOPPED;
|
|
39
42
|
|
|
40
43
|
private bootstrapNodes: string[];
|
|
@@ -46,7 +49,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
46
49
|
private peerId: PeerId,
|
|
47
50
|
config: P2PConfig,
|
|
48
51
|
telemetry: TelemetryClient,
|
|
49
|
-
private logger =
|
|
52
|
+
private logger = createLogger('p2p:discv5_service'),
|
|
50
53
|
) {
|
|
51
54
|
super();
|
|
52
55
|
const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
|
|
@@ -66,7 +69,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
66
69
|
`${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`,
|
|
67
70
|
);
|
|
68
71
|
|
|
69
|
-
|
|
72
|
+
this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
|
|
70
73
|
|
|
71
74
|
// set location multiaddr in ENR record
|
|
72
75
|
this.enr.setLocationMultiaddr(multiAddrUdp);
|
|
@@ -76,7 +79,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
76
79
|
this.discv5 = Discv5.create({
|
|
77
80
|
enr: this.enr,
|
|
78
81
|
peerId,
|
|
79
|
-
bindAddrs: { ip4: listenMultiAddrUdp },
|
|
82
|
+
bindAddrs: { ip4: this.listenMultiAddrUdp },
|
|
80
83
|
config: {
|
|
81
84
|
lookupTimeout: 2000,
|
|
82
85
|
requestTimeout: 2000,
|
|
@@ -85,14 +88,11 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
85
88
|
metricsRegistry,
|
|
86
89
|
});
|
|
87
90
|
|
|
88
|
-
this.logger.info(`ENR NodeId: ${this.enr.nodeId}`);
|
|
89
|
-
this.logger.info(`ENR UDP: ${multiAddrUdp.toString()}`);
|
|
90
|
-
|
|
91
91
|
(this.discv5 as Discv5EventEmitter).on('discovered', (enr: ENR) => this.onDiscovered(enr));
|
|
92
92
|
(this.discv5 as Discv5EventEmitter).on('enrAdded', async (enr: ENR) => {
|
|
93
93
|
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
94
94
|
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
95
|
-
this.logger.debug(`ENR
|
|
95
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, { multiAddrTcp, multiAddrUdp, nodeId: enr.nodeId });
|
|
96
96
|
this.onDiscovered(enr);
|
|
97
97
|
});
|
|
98
98
|
}
|
|
@@ -101,18 +101,23 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
101
101
|
if (this.currentState === PeerDiscoveryState.RUNNING) {
|
|
102
102
|
throw new Error('DiscV5Service already started');
|
|
103
103
|
}
|
|
104
|
-
this.logger.
|
|
104
|
+
this.logger.debug('Starting DiscV5');
|
|
105
105
|
await this.discv5.start();
|
|
106
106
|
this.startTime = Date.now();
|
|
107
107
|
|
|
108
|
-
this.logger.info(
|
|
108
|
+
this.logger.info(`DiscV5 service started`, {
|
|
109
|
+
nodeId: this.enr.nodeId,
|
|
110
|
+
peerId: this.peerId,
|
|
111
|
+
enrUdp: await this.enr.getFullMultiaddr('udp'),
|
|
112
|
+
enrTcp: await this.enr.getFullMultiaddr('tcp'),
|
|
113
|
+
});
|
|
109
114
|
this.currentState = PeerDiscoveryState.RUNNING;
|
|
110
115
|
|
|
111
116
|
// Add bootnode ENR if provided
|
|
112
117
|
if (this.bootstrapNodes?.length) {
|
|
113
118
|
// Do this conversion once since it involves an async function call
|
|
114
119
|
this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodes.map(enr => ENR.decodeTxt(enr).peerId()));
|
|
115
|
-
this.logger.info(`Adding bootstrap ENRs: ${this.bootstrapNodes.join(', ')}`);
|
|
120
|
+
this.logger.info(`Adding bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
|
|
116
121
|
try {
|
|
117
122
|
this.bootstrapNodes.forEach(enr => {
|
|
118
123
|
this.discv5.addEnr(enr);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BlockAttestation, BlockProposal, Gossipable, TxHash } from '@aztec/circuit-types';
|
|
1
|
+
import type { BlockAttestation, BlockProposal, Gossipable, PeerInfo, TxHash } from '@aztec/circuit-types';
|
|
2
2
|
|
|
3
3
|
import type { PeerId } from '@libp2p/interface';
|
|
4
4
|
import EventEmitter from 'events';
|
|
@@ -10,6 +10,11 @@ import { type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from '
|
|
|
10
10
|
* A dummy implementation of the P2P Service.
|
|
11
11
|
*/
|
|
12
12
|
export class DummyP2PService implements P2PService {
|
|
13
|
+
/** Returns an empty array for peers. */
|
|
14
|
+
getPeers(): PeerInfo[] {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
|
|
13
18
|
/**
|
|
14
19
|
* Starts the dummy implementation.
|
|
15
20
|
* @returns A resolved promise.
|
|
@@ -49,13 +49,31 @@ export function getMsgIdFn(message: Message) {
|
|
|
49
49
|
return sha256(Buffer.concat(vec)).subarray(0, 20);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Snappy transform for libp2p gossipsub
|
|
54
|
+
*/
|
|
52
55
|
export class SnappyTransform implements DataTransform {
|
|
56
|
+
// Topic string included to satisfy DataTransform interface
|
|
53
57
|
inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
return this.inboundTransformNoTopic(Buffer.from(data));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public inboundTransformNoTopic(data: Buffer): Buffer {
|
|
62
|
+
if (data.length === 0) {
|
|
63
|
+
return data;
|
|
64
|
+
}
|
|
65
|
+
return Buffer.from(uncompressSync(data, { asBuffer: true }));
|
|
56
66
|
}
|
|
57
67
|
|
|
68
|
+
// Topic string included to satisfy DataTransform interface
|
|
58
69
|
outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
|
|
59
|
-
return
|
|
70
|
+
return this.outboundTransformNoTopic(Buffer.from(data));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public outboundTransformNoTopic(data: Buffer): Buffer {
|
|
74
|
+
if (data.length === 0) {
|
|
75
|
+
return data;
|
|
76
|
+
}
|
|
77
|
+
return Buffer.from(compressSync(data));
|
|
60
78
|
}
|
|
61
79
|
}
|