@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
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// @attribution: lodestar impl for inspiration
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { executeTimeoutWithCustomError } from '@aztec/foundation/timer';
|
|
4
|
+
import { pipe } from 'it-pipe';
|
|
5
|
+
import { CollectiveReqRespTimeoutError, IndividualReqRespTimeoutError, InvalidResponseError, } from '../../errors/reqresp.error.js';
|
|
6
|
+
import { SnappyTransform } from '../encoding.js';
|
|
7
|
+
import { PeerErrorSeverity } from '../peer-scoring/peer_scoring.js';
|
|
8
|
+
import { DEFAULT_SUB_PROTOCOL_HANDLERS, DEFAULT_SUB_PROTOCOL_VALIDATORS, subProtocolMap, } from './interface.js';
|
|
9
|
+
import { RequestResponseRateLimiter } from './rate_limiter/rate_limiter.js';
|
|
10
|
+
/**
|
|
11
|
+
* The Request Response Service
|
|
12
|
+
*
|
|
13
|
+
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
14
|
+
* information that was missed during a syncronisation or a gossip event.
|
|
15
|
+
*
|
|
16
|
+
* This service implements the request response sub protocol, it is heavily inspired from
|
|
17
|
+
* ethereum implementations of the same name.
|
|
18
|
+
*
|
|
19
|
+
* Note, responses get compressed in streamHandler
|
|
20
|
+
* so they get decompressed in readMessage
|
|
21
|
+
*
|
|
22
|
+
* see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
|
|
23
|
+
*/
|
|
24
|
+
export class ReqResp {
|
|
25
|
+
constructor(config, libp2p, peerManager) {
|
|
26
|
+
this.libp2p = libp2p;
|
|
27
|
+
this.peerManager = peerManager;
|
|
28
|
+
// Warning, if the `start` function is not called as the parent class constructor, then the default sub protocol handlers will be used ( not good )
|
|
29
|
+
this.subProtocolHandlers = DEFAULT_SUB_PROTOCOL_HANDLERS;
|
|
30
|
+
this.subProtocolValidators = DEFAULT_SUB_PROTOCOL_VALIDATORS;
|
|
31
|
+
this.logger = createLogger('p2p:reqresp');
|
|
32
|
+
this.overallRequestTimeoutMs = config.overallRequestTimeoutMs;
|
|
33
|
+
this.individualRequestTimeoutMs = config.individualRequestTimeoutMs;
|
|
34
|
+
this.rateLimiter = new RequestResponseRateLimiter(peerManager);
|
|
35
|
+
this.snappyTransform = new SnappyTransform();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Start the reqresp service
|
|
39
|
+
*/
|
|
40
|
+
async start(subProtocolHandlers, subProtocolValidators) {
|
|
41
|
+
this.subProtocolHandlers = subProtocolHandlers;
|
|
42
|
+
this.subProtocolValidators = subProtocolValidators;
|
|
43
|
+
// Register all protocol handlers
|
|
44
|
+
for (const subProtocol of Object.keys(this.subProtocolHandlers)) {
|
|
45
|
+
await this.libp2p.handle(subProtocol, this.streamHandler.bind(this, subProtocol));
|
|
46
|
+
}
|
|
47
|
+
this.rateLimiter.start();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Stop the reqresp service
|
|
51
|
+
*/
|
|
52
|
+
async stop() {
|
|
53
|
+
// Unregister all handlers
|
|
54
|
+
for (const protocol of Object.keys(this.subProtocolHandlers)) {
|
|
55
|
+
await this.libp2p.unhandle(protocol);
|
|
56
|
+
}
|
|
57
|
+
// Close all active connections
|
|
58
|
+
const closeStreamPromises = this.libp2p.getConnections().map(connection => connection.close());
|
|
59
|
+
await Promise.all(closeStreamPromises);
|
|
60
|
+
this.logger.debug('ReqResp: All active streams closed');
|
|
61
|
+
this.rateLimiter.stop();
|
|
62
|
+
this.logger.debug('ReqResp: Rate limiter stopped');
|
|
63
|
+
// NOTE: We assume libp2p instance is managed by the caller
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Send a request to peers, returns the first response
|
|
67
|
+
*
|
|
68
|
+
* @param subProtocol - The protocol being requested
|
|
69
|
+
* @param request - The request to send
|
|
70
|
+
* @returns - The response from the peer, otherwise undefined
|
|
71
|
+
*
|
|
72
|
+
* @description
|
|
73
|
+
* This method attempts to send a request to all active peers using the specified sub-protocol.
|
|
74
|
+
* It opens a stream with each peer, sends the request, and awaits a response.
|
|
75
|
+
* If a valid response is received, it returns the response; otherwise, it continues to the next peer.
|
|
76
|
+
* If no response is received from any peer, it returns undefined.
|
|
77
|
+
*
|
|
78
|
+
* The method performs the following steps:
|
|
79
|
+
* - Iterates over all active peers.
|
|
80
|
+
* - Opens a stream with each peer using the specified sub-protocol.
|
|
81
|
+
*
|
|
82
|
+
* When a response is received, it is validated using the given sub protocols response validator.
|
|
83
|
+
* To see the interface for the response validator - see `interface.ts`
|
|
84
|
+
*
|
|
85
|
+
* Failing a response validation requests in a severe peer penalty, and will
|
|
86
|
+
* prompt the node to continue to search to the next peer.
|
|
87
|
+
* For example, a transaction request validator will check that the payload returned does in fact
|
|
88
|
+
* match the txHash that was requested. A peer that fails this check an only be an extremely naughty peer.
|
|
89
|
+
*
|
|
90
|
+
* This entire operation is wrapped in an overall timeout, that is independent of the
|
|
91
|
+
* peer it is requesting data from.
|
|
92
|
+
*
|
|
93
|
+
*/
|
|
94
|
+
async sendRequest(subProtocol, request) {
|
|
95
|
+
const requestFunction = async () => {
|
|
96
|
+
const responseValidator = this.subProtocolValidators[subProtocol];
|
|
97
|
+
const requestBuffer = request.toBuffer();
|
|
98
|
+
// Get active peers
|
|
99
|
+
const peers = this.libp2p.getPeers();
|
|
100
|
+
// Attempt to ask all of our peers
|
|
101
|
+
for (const peer of peers) {
|
|
102
|
+
const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffer);
|
|
103
|
+
// If we get a response, return it, otherwise we iterate onto the next peer
|
|
104
|
+
// We do not consider it a success if we have an empty buffer
|
|
105
|
+
if (response && response.length > 0) {
|
|
106
|
+
const object = subProtocolMap[subProtocol].response.fromBuffer(response);
|
|
107
|
+
// The response validator handles peer punishment within
|
|
108
|
+
const isValid = await responseValidator(request, object, peer);
|
|
109
|
+
if (!isValid) {
|
|
110
|
+
throw new InvalidResponseError();
|
|
111
|
+
}
|
|
112
|
+
return object;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
};
|
|
117
|
+
try {
|
|
118
|
+
return await executeTimeoutWithCustomError(requestFunction, this.overallRequestTimeoutMs, () => new CollectiveReqRespTimeoutError());
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Sends a request to a specific peer
|
|
127
|
+
*
|
|
128
|
+
* We first dial a particular protocol for the peer, this ensures that the peer knows
|
|
129
|
+
* what to respond with
|
|
130
|
+
*
|
|
131
|
+
*
|
|
132
|
+
* @param peerId - The peer to send the request to
|
|
133
|
+
* @param subProtocol - The protocol to use to request
|
|
134
|
+
* @param payload - The payload to send
|
|
135
|
+
* @returns If the request is successful, the response is returned, otherwise undefined
|
|
136
|
+
*
|
|
137
|
+
* @description
|
|
138
|
+
* This method attempts to open a stream with the specified peer, send the payload,
|
|
139
|
+
* and await a response.
|
|
140
|
+
* If an error occurs, it penalizes the peer and returns undefined.
|
|
141
|
+
*
|
|
142
|
+
* The method performs the following steps:
|
|
143
|
+
* - Opens a stream with the peer using the specified sub-protocol.
|
|
144
|
+
* - Sends the payload and awaits a response with a timeout.
|
|
145
|
+
*
|
|
146
|
+
* If the stream is not closed by the dialled peer, and a timeout occurs, then
|
|
147
|
+
* the stream is closed on the requester's end and sender (us) updates its peer score
|
|
148
|
+
*/
|
|
149
|
+
async sendRequestToPeer(peerId, subProtocol, payload) {
|
|
150
|
+
let stream;
|
|
151
|
+
try {
|
|
152
|
+
stream = await this.libp2p.dialProtocol(peerId, subProtocol);
|
|
153
|
+
this.logger.trace(`Stream opened with ${peerId.toString()} for ${subProtocol}`);
|
|
154
|
+
// Open the stream with a timeout
|
|
155
|
+
const result = await executeTimeoutWithCustomError(() => pipe([payload], stream, this.readMessage.bind(this)), this.individualRequestTimeoutMs, () => new IndividualReqRespTimeoutError());
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
this.handleResponseError(e, peerId, subProtocol);
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
if (stream) {
|
|
163
|
+
try {
|
|
164
|
+
await stream.close();
|
|
165
|
+
this.logger.trace(`Stream closed with ${peerId.toString()} for ${subProtocol}`);
|
|
166
|
+
}
|
|
167
|
+
catch (closeError) {
|
|
168
|
+
this.logger.error(`Error closing stream: ${closeError instanceof Error ? closeError.message : 'Unknown error'}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Handle a response error
|
|
175
|
+
*
|
|
176
|
+
* ReqResp errors are punished differently depending on the severity of the offense
|
|
177
|
+
*
|
|
178
|
+
* @param e - The error
|
|
179
|
+
* @param peerId - The peer id
|
|
180
|
+
* @param subProtocol - The sub protocol
|
|
181
|
+
* @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized
|
|
182
|
+
*/
|
|
183
|
+
handleResponseError(e, peerId, subProtocol) {
|
|
184
|
+
const severity = this.categorizeError(e, peerId, subProtocol);
|
|
185
|
+
if (severity) {
|
|
186
|
+
this.peerManager.penalizePeer(peerId, severity);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Categorize the error and log it.
|
|
191
|
+
*/
|
|
192
|
+
categorizeError(e, peerId, subProtocol) {
|
|
193
|
+
// Non pubishable errors
|
|
194
|
+
// We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
|
|
195
|
+
const logTags = {
|
|
196
|
+
peerId: peerId.toString(),
|
|
197
|
+
subProtocol,
|
|
198
|
+
};
|
|
199
|
+
if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
|
|
200
|
+
this.logger.debug(`Non-punishable error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`, logTags);
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
// Pubishable errors
|
|
204
|
+
// Connection reset errors in the networking stack are punished with high severity
|
|
205
|
+
// it just signals an unreliable peer
|
|
206
|
+
// We assume that the requesting node has a functioning networking stack.
|
|
207
|
+
if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') {
|
|
208
|
+
this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags);
|
|
209
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
210
|
+
}
|
|
211
|
+
if (e?.code === 'ECONNREFUSED') {
|
|
212
|
+
this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags);
|
|
213
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
214
|
+
}
|
|
215
|
+
// Timeout errors are punished with high tolerance, they can be due to a geogrpahically far away peer or an
|
|
216
|
+
// overloaded peer
|
|
217
|
+
if (e instanceof IndividualReqRespTimeoutError) {
|
|
218
|
+
this.logger.debug(`Timeout error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`, logTags);
|
|
219
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
220
|
+
}
|
|
221
|
+
// Catch all error
|
|
222
|
+
this.logger.error(`Unexpected error sending request to peer`, e, logTags);
|
|
223
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Read a message returned from a stream into a single buffer
|
|
227
|
+
*/
|
|
228
|
+
async readMessage(source) {
|
|
229
|
+
const chunks = [];
|
|
230
|
+
for await (const chunk of source) {
|
|
231
|
+
chunks.push(chunk.subarray());
|
|
232
|
+
}
|
|
233
|
+
const messageData = Buffer.concat(chunks);
|
|
234
|
+
return this.snappyTransform.inboundTransformNoTopic(messageData);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Stream Handler
|
|
238
|
+
* Reads the incoming stream, determines the protocol, then triggers the appropriate handler
|
|
239
|
+
*
|
|
240
|
+
* @param param0 - The incoming stream data
|
|
241
|
+
*
|
|
242
|
+
* @description
|
|
243
|
+
* An individual stream handler will be bound to each sub protocol, and handles returning data back
|
|
244
|
+
* to the requesting peer.
|
|
245
|
+
*
|
|
246
|
+
* The sub protocol handler interface is defined within `interface.ts` and will be assigned to the
|
|
247
|
+
* req resp service on start up.
|
|
248
|
+
*
|
|
249
|
+
* We check rate limits for each peer, note the peer will be penalised within the rate limiter implementation
|
|
250
|
+
* if they exceed their peer specific limits.
|
|
251
|
+
*/
|
|
252
|
+
async streamHandler(protocol, { stream, connection }) {
|
|
253
|
+
// Store a reference to from this for the async generator
|
|
254
|
+
if (!this.rateLimiter.allow(protocol, connection.remotePeer)) {
|
|
255
|
+
this.logger.warn(`Rate limit exceeded for ${protocol} from ${connection.remotePeer}`);
|
|
256
|
+
// TODO(#8483): handle changing peer scoring for failed rate limit, maybe differentiate between global and peer limits here when punishing
|
|
257
|
+
await stream.close();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const handler = this.subProtocolHandlers[protocol];
|
|
261
|
+
const transform = this.snappyTransform;
|
|
262
|
+
try {
|
|
263
|
+
await pipe(stream, async function* (source) {
|
|
264
|
+
for await (const chunkList of source) {
|
|
265
|
+
const msg = Buffer.from(chunkList.subarray());
|
|
266
|
+
const response = await handler(msg);
|
|
267
|
+
yield new Uint8Array(transform.outboundTransformNoTopic(response));
|
|
268
|
+
}
|
|
269
|
+
}, stream);
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
this.logger.warn(e);
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
await stream.close();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL3JlcXJlc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOENBQThDO0FBQzlDLE9BQU8sRUFBZSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSS9CLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsNkJBQTZCLEVBQzdCLG9CQUFvQixHQUNyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdwRSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLCtCQUErQixFQUsvQixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU1RTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFjbEIsWUFBWSxNQUF3QixFQUFxQixNQUFjLEVBQVUsV0FBd0I7UUFBaEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBUnpHLG1KQUFtSjtRQUMzSSx3QkFBbUIsR0FBK0IsNkJBQTZCLENBQUM7UUFDaEYsMEJBQXFCLEdBQWlDLCtCQUErQixDQUFDO1FBTzVGLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUM7UUFDOUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAElG,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEtF,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAElD;;;;;;OAMG;IACH,WAAW,CAAC,QAAQ,SAAS,kBAAkB,EAC7C,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GACzD,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAG3E,6BAA6B,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IAE/G,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;IAE1B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD,SAAS,IAAI,kBAAkB,CAAC;IAEhC,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;CAC3B"}
|
|
@@ -3,4 +3,4 @@ export var PeerDiscoveryState;
|
|
|
3
3
|
PeerDiscoveryState["RUNNING"] = "running";
|
|
4
4
|
PeerDiscoveryState["STOPPED"] = "stopped";
|
|
5
5
|
})(PeerDiscoveryState || (PeerDiscoveryState = {}));
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE1BQU0sQ0FBTixJQUFZLGtCQUdYO0FBSEQsV0FBWSxrQkFBa0I7SUFDNUIseUNBQW1CLENBQUE7SUFDbkIseUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUhXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFHN0IifQ==
|
|
@@ -2,7 +2,7 @@ import { type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-type
|
|
|
2
2
|
export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
|
|
3
3
|
#private;
|
|
4
4
|
constructor(...validators: TxValidator<T>[]);
|
|
5
|
-
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
5
|
+
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[], skippedTxs: T[]]>;
|
|
6
6
|
validateTx(tx: T): Promise<boolean>;
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=aggregate_tx_validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAcjF,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAS1C"}
|
|
@@ -10,13 +10,15 @@ export class AggregateTxValidator {
|
|
|
10
10
|
}
|
|
11
11
|
async validateTxs(txs) {
|
|
12
12
|
const invalidTxs = [];
|
|
13
|
+
const skippedTxs = [];
|
|
13
14
|
let txPool = txs;
|
|
14
15
|
for (const validator of __classPrivateFieldGet(this, _AggregateTxValidator_validators, "f")) {
|
|
15
|
-
const [valid, invalid] = await validator.validateTxs(txPool);
|
|
16
|
+
const [valid, invalid, skipped] = await validator.validateTxs(txPool);
|
|
16
17
|
invalidTxs.push(...invalid);
|
|
18
|
+
skippedTxs.push(...(skipped ?? []));
|
|
17
19
|
txPool = valid;
|
|
18
20
|
}
|
|
19
|
-
return [txPool, invalidTxs];
|
|
21
|
+
return [txPool, invalidTxs, skippedTxs];
|
|
20
22
|
}
|
|
21
23
|
async validateTx(tx) {
|
|
22
24
|
for (const validator of __classPrivateFieldGet(this, _AggregateTxValidator_validators, "f")) {
|
|
@@ -29,4 +31,4 @@ export class AggregateTxValidator {
|
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
_AggregateTxValidator_validators = new WeakMap();
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvYWdncmVnYXRlX3R4X3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsWUFBWSxHQUFHLFVBQTRCO1FBRDNDLG1EQUE4QjtRQUU1QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCx1QkFBQSxJQUFJLG9DQUFlLFVBQVUsTUFBQSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDeEIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sVUFBVSxHQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakIsS0FBSyxNQUFNLFNBQVMsSUFBSSx1QkFBQSxJQUFJLHdDQUFZLEVBQUUsQ0FBQztZQUN6QyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUs7UUFDcEIsS0FBSyxNQUFNLFNBQVMsSUFBSSx1QkFBQSxJQUFJLHdDQUFZLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiJ9
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
1
3
|
import { type AnyTx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
-
import { Fr } from '@aztec/circuits.js';
|
|
3
4
|
export interface NullifierSource {
|
|
4
|
-
|
|
5
|
+
getNullifierIndices: (nullifiers: Buffer[]) => Promise<(bigint | undefined)[]>;
|
|
5
6
|
}
|
|
6
7
|
export declare class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
7
8
|
#private;
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAGxE,MAAM,WAAW,eAAe;IAC9B,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CAChF;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;CAoCpC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
var _DoubleSpendTxValidator_instances, _DoubleSpendTxValidator_log, _DoubleSpendTxValidator_nullifierSource, _DoubleSpendTxValidator_uniqueNullifiers;
|
|
2
2
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
3
|
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import { Fr } from '@aztec/circuits.js';
|
|
5
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
5
|
export class DoubleSpendTxValidator {
|
|
7
6
|
constructor(nullifierSource, isValidatingBlock = true) {
|
|
@@ -29,7 +28,7 @@ export class DoubleSpendTxValidator {
|
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
_DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSource = new WeakMap(), _DoubleSpendTxValidator_instances = new WeakSet(), _DoubleSpendTxValidator_uniqueNullifiers = async function _DoubleSpendTxValidator_uniqueNullifiers(tx, thisBlockNullifiers) {
|
|
32
|
-
const nullifiers =
|
|
31
|
+
const nullifiers = tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers;
|
|
33
32
|
// Ditch this tx if it has repeated nullifiers
|
|
34
33
|
const uniqueNullifiers = new Set(nullifiers);
|
|
35
34
|
if (uniqueNullifiers.size !== nullifiers.length) {
|
|
@@ -38,14 +37,15 @@ _DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSo
|
|
|
38
37
|
}
|
|
39
38
|
if (this.isValidatingBlock) {
|
|
40
39
|
for (const nullifier of nullifiers) {
|
|
41
|
-
|
|
40
|
+
const nullifierBigInt = nullifier.toBigInt();
|
|
41
|
+
if (thisBlockNullifiers.has(nullifierBigInt)) {
|
|
42
42
|
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
|
-
thisBlockNullifiers.add(
|
|
45
|
+
thisBlockNullifiers.add(nullifierBigInt);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
const nullifierIndexes = await
|
|
48
|
+
const nullifierIndexes = await __classPrivateFieldGet(this, _DoubleSpendTxValidator_nullifierSource, "f").getNullifierIndices(nullifiers.map(n => n.toBuffer()));
|
|
49
49
|
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
50
50
|
if (hasDuplicates) {
|
|
51
51
|
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
@@ -53,4 +53,4 @@ _DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSo
|
|
|
53
53
|
}
|
|
54
54
|
return true;
|
|
55
55
|
};
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZG91YmxlX3NwZW5kX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTXJELE1BQU0sT0FBTyxzQkFBc0I7SUFJakMsWUFBWSxlQUFnQyxFQUFtQixvQkFBNkIsSUFBSTs7UUFBakMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFnQjtRQUhoRyxzQ0FBTyxZQUFZLENBQUMsa0NBQWtDLENBQUMsRUFBQztRQUN4RCwwREFBa0M7UUFHaEMsdUJBQUEsSUFBSSwyQ0FBb0IsZUFBZSxNQUFBLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUTtRQUN4QixNQUFNLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUU5QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxDQUFDLE1BQU0sdUJBQUEsSUFBSSxtRkFBa0IsTUFBdEIsSUFBSSxFQUFtQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQUs7UUFDZCxPQUFPLHVCQUFBLElBQUksbUZBQWtCLE1BQXRCLElBQUksRUFBbUIsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFVLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBa0NGO29NQWhDQyxLQUFLLG1EQUFtQixFQUFTLEVBQUUsbUJBQWdDO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFFL0YsOENBQThDO0lBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hELHVCQUFBLElBQUksbUNBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDbkYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxJQUFJLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUM3Qyx1QkFBQSxJQUFJLG1DQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2dCQUM3RixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sdUJBQUEsSUFBSSwrQ0FBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1RyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUUsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQix1QkFBQSxJQUFJLG1DQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.67.
|
|
3
|
+
"version": "0.67.1-devnet",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
7
|
"./mocks": "./dest/mocks/index.js",
|
|
8
|
-
"./bootstrap": "./dest/bootstrap/bootstrap.js"
|
|
8
|
+
"./bootstrap": "./dest/bootstrap/bootstrap.js",
|
|
9
|
+
"./config": "./dest/config.js"
|
|
9
10
|
},
|
|
10
11
|
"typedocOptions": {
|
|
11
12
|
"entryPoints": [
|
|
@@ -66,11 +67,11 @@
|
|
|
66
67
|
]
|
|
67
68
|
},
|
|
68
69
|
"dependencies": {
|
|
69
|
-
"@aztec/circuit-types": "0.67.
|
|
70
|
-
"@aztec/circuits.js": "0.67.
|
|
71
|
-
"@aztec/foundation": "0.67.
|
|
72
|
-
"@aztec/kv-store": "0.67.
|
|
73
|
-
"@aztec/telemetry-client": "0.67.
|
|
70
|
+
"@aztec/circuit-types": "0.67.1-devnet",
|
|
71
|
+
"@aztec/circuits.js": "0.67.1-devnet",
|
|
72
|
+
"@aztec/foundation": "0.67.1-devnet",
|
|
73
|
+
"@aztec/kv-store": "0.67.1-devnet",
|
|
74
|
+
"@aztec/telemetry-client": "0.67.1-devnet",
|
|
74
75
|
"@chainsafe/discv5": "9.0.0",
|
|
75
76
|
"@chainsafe/enr": "3.0.0",
|
|
76
77
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
@@ -9,7 +9,7 @@ import type { PeerId } from '@libp2p/interface';
|
|
|
9
9
|
import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
10
10
|
|
|
11
11
|
import type { BootnodeConfig } from '../config.js';
|
|
12
|
-
import { AZTEC_ENR_KEY, AZTEC_NET } from '../
|
|
12
|
+
import { AZTEC_ENR_KEY, AZTEC_NET } from '../services/discv5/discV5_service.js';
|
|
13
13
|
import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
|
|
14
14
|
|
|
15
15
|
/**
|
package/src/client/index.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
type ClientProtocolCircuitVerifier,
|
|
3
|
+
type L2BlockSource,
|
|
4
|
+
P2PClientType,
|
|
5
|
+
type WorldStateSynchronizer,
|
|
6
|
+
} from '@aztec/circuit-types';
|
|
2
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
8
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
4
9
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
@@ -9,39 +14,47 @@ import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
|
9
14
|
import { P2PClient } from '../client/p2p_client.js';
|
|
10
15
|
import { type P2PConfig } from '../config.js';
|
|
11
16
|
import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
12
|
-
import {
|
|
17
|
+
import { KvAttestationPool } from '../mem_pools/attestation_pool/kv_attestation_pool.js';
|
|
13
18
|
import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
|
|
14
19
|
import { MemoryEpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js';
|
|
15
20
|
import { type MemPools } from '../mem_pools/interface.js';
|
|
16
21
|
import { AztecKVTxPool, type TxPool } from '../mem_pools/tx_pool/index.js';
|
|
17
|
-
import { DiscV5Service } from '../
|
|
18
|
-
import { DummyP2PService } from '../
|
|
19
|
-
import { LibP2PService } from '../
|
|
22
|
+
import { DiscV5Service } from '../services/discv5/discV5_service.js';
|
|
23
|
+
import { DummyP2PService } from '../services/dummy_service.js';
|
|
24
|
+
import { LibP2PService } from '../services/index.js';
|
|
20
25
|
import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
|
|
21
26
|
|
|
22
27
|
export * from './p2p_client.js';
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
type P2PClientDeps<T extends P2PClientType> = {
|
|
30
|
+
txPool?: TxPool;
|
|
31
|
+
store?: AztecKVStore;
|
|
32
|
+
attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
|
|
33
|
+
epochProofQuotePool?: EpochProofQuotePool;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const createP2PClient = async <T extends P2PClientType>(
|
|
37
|
+
clientType: T,
|
|
25
38
|
_config: P2PConfig & DataStoreConfig,
|
|
26
39
|
l2BlockSource: L2BlockSource,
|
|
27
40
|
proofVerifier: ClientProtocolCircuitVerifier,
|
|
28
41
|
worldStateSynchronizer: WorldStateSynchronizer,
|
|
29
42
|
telemetry: TelemetryClient = new NoopTelemetryClient(),
|
|
30
|
-
deps: {
|
|
31
|
-
txPool?: TxPool;
|
|
32
|
-
store?: AztecKVStore;
|
|
33
|
-
attestationPool?: AttestationPool;
|
|
34
|
-
epochProofQuotePool?: EpochProofQuotePool;
|
|
35
|
-
} = {},
|
|
43
|
+
deps: P2PClientDeps<T> = {},
|
|
36
44
|
) => {
|
|
37
45
|
let config = { ..._config };
|
|
38
46
|
const logger = createLogger('p2p');
|
|
39
47
|
const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb')));
|
|
40
48
|
|
|
41
|
-
const mempools: MemPools = {
|
|
49
|
+
const mempools: MemPools<T> = {
|
|
42
50
|
txPool: deps.txPool ?? new AztecKVTxPool(store, telemetry),
|
|
43
|
-
attestationPool: deps.attestationPool ?? new InMemoryAttestationPool(telemetry),
|
|
44
51
|
epochProofQuotePool: deps.epochProofQuotePool ?? new MemoryEpochProofQuotePool(telemetry),
|
|
52
|
+
attestationPool:
|
|
53
|
+
clientType === P2PClientType.Full
|
|
54
|
+
? ((deps.attestationPool ?? new KvAttestationPool(store, telemetry)) as T extends P2PClientType.Full
|
|
55
|
+
? AttestationPool
|
|
56
|
+
: undefined)
|
|
57
|
+
: undefined,
|
|
45
58
|
};
|
|
46
59
|
|
|
47
60
|
let p2pService;
|
|
@@ -55,7 +68,8 @@ export const createP2PClient = async (
|
|
|
55
68
|
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
|
|
56
69
|
const discoveryService = new DiscV5Service(peerId, config, telemetry);
|
|
57
70
|
|
|
58
|
-
p2pService = await LibP2PService.new(
|
|
71
|
+
p2pService = await LibP2PService.new<T>(
|
|
72
|
+
clientType,
|
|
59
73
|
config,
|
|
60
74
|
discoveryService,
|
|
61
75
|
peerId,
|
|
@@ -70,5 +84,13 @@ export const createP2PClient = async (
|
|
|
70
84
|
logger.verbose('P2P is disabled. Using dummy P2P service');
|
|
71
85
|
p2pService = new DummyP2PService();
|
|
72
86
|
}
|
|
73
|
-
return new P2PClient(
|
|
87
|
+
return new P2PClient(
|
|
88
|
+
clientType,
|
|
89
|
+
store,
|
|
90
|
+
l2BlockSource,
|
|
91
|
+
mempools,
|
|
92
|
+
p2pService,
|
|
93
|
+
config.keepProvenTxsInPoolFor,
|
|
94
|
+
telemetry,
|
|
95
|
+
);
|
|
74
96
|
};
|