@aztec/p2p 1.0.0-nightly.20250708 → 1.0.0-nightly.20250709
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/client/interface.d.ts +1 -1
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +1 -1
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +11 -10
- package/dest/services/dummy_service.d.ts +1 -1
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +2 -2
- package/dest/services/libp2p/libp2p_service.d.ts +6 -6
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +29 -18
- package/dest/services/reqresp/interface.d.ts +7 -4
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +9 -3
- package/dest/services/reqresp/protocols/tx.d.ts +11 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +19 -6
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/service.d.ts +1 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +5 -1
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +5 -1
- package/package.json +14 -14
- package/src/client/interface.ts +1 -1
- package/src/client/p2p_client.ts +14 -13
- package/src/services/dummy_service.ts +3 -3
- package/src/services/libp2p/libp2p_service.ts +36 -19
- package/src/services/reqresp/interface.ts +12 -4
- package/src/services/reqresp/protocols/tx.ts +23 -6
- package/src/services/reqresp/reqresp.ts +3 -3
- package/src/services/service.ts +1 -1
- package/src/services/tx_collection/fast_tx_collection.ts +8 -5
- package/src/services/tx_collection/slow_tx_collection.ts +8 -5
|
@@ -51,7 +51,7 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApiFull<T> &
|
|
|
51
51
|
* @param pinnedPeerId - An optional peer id that will be used to request the tx from (in addition to other random peers).
|
|
52
52
|
* @returns A list of transactions or undefined if the transactions are not found.
|
|
53
53
|
*/
|
|
54
|
-
requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId): Promise<
|
|
54
|
+
requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId): Promise<Tx[]>;
|
|
55
55
|
/**
|
|
56
56
|
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
57
57
|
* @param tx - The transaction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/client/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE;;GAEG;AACH,oBAAY,cAAc;IACxB,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,OAAO,IAAA;IACP,OAAO,IAAA;CACR;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB;;OAEG;IACH,eAAe,EAAE,SAAS,CAAC;CAC5B;AAED;;IAEI;AACJ,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG;IAC9E;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D;;;;;OAKG;IAGH,4BAA4B,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAEvE;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/client/interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,7 +82,7 @@ export declare class P2PClient<T extends P2PClientType = P2PClientType.Full> ext
|
|
|
82
82
|
/**
|
|
83
83
|
* Uses the batched Request Response protocol to request a set of transactions from the network.
|
|
84
84
|
*/
|
|
85
|
-
requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<
|
|
85
|
+
requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]>;
|
|
86
86
|
getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]>;
|
|
87
87
|
getPendingTxCount(): Promise<number>;
|
|
88
88
|
iteratePendingTxs(): AsyncIterableIterator<Tx>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p2p_client.d.ts","sourceRoot":"","sources":["../../src/client/p2p_client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,iBAAiB,CAAC;AAC7F,OAAO,KAAK,EAGV,aAAa,EAEb,kBAAkB,EAClB,MAAM,EAEP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAEL,KAAK,eAAe,EAEpB,UAAU,EAGX,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAEnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"p2p_client.d.ts","sourceRoot":"","sources":["../../src/client/p2p_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
|
12
12
|
import { Attributes, TraceableL2BlockStream, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
13
13
|
import { getP2PDefaultConfig } from '../config.js';
|
|
14
14
|
import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
15
|
+
import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
|
|
15
16
|
import { TxProvider } from '../services/tx_provider.js';
|
|
16
17
|
import { P2PClientState } from './interface.js';
|
|
17
18
|
/**
|
|
@@ -288,16 +289,16 @@ import { P2PClientState } from './interface.js';
|
|
|
288
289
|
* Uses the batched Request Response protocol to request a set of transactions from the network.
|
|
289
290
|
*/ async requestTxsByHash(txHashes, pinnedPeerId) {
|
|
290
291
|
const timeoutMs = 8000; // Longer timeout for now
|
|
291
|
-
const maxPeers = Math.min(Math.ceil(txHashes.length / 3), 10);
|
|
292
292
|
const maxRetryAttempts = 10; // Keep retrying within the timeout
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
|
|
293
|
+
const requests = chunkTxHashesRequest(txHashes);
|
|
294
|
+
const maxPeers = Math.min(Math.ceil(requests.length / 3), 10);
|
|
295
|
+
const txBatches = await this.p2pService.sendBatchRequest(ReqRespSubProtocol.TX, requests, pinnedPeerId, timeoutMs, maxPeers, maxRetryAttempts);
|
|
296
|
+
const txs = txBatches.flat();
|
|
297
|
+
if (txs.length > 0) {
|
|
298
|
+
await this.txPool.addTxs(txs);
|
|
298
299
|
}
|
|
299
300
|
const txHashesStr = txHashes.map((tx)=>tx.toString()).join(', ');
|
|
300
|
-
this.log.debug(`Requested txs ${txHashesStr} (${
|
|
301
|
+
this.log.debug(`Requested txs ${txHashesStr} (${txs.length} / ${txHashes.length}) from peers`);
|
|
301
302
|
// We return all transactions, even the not found ones to the caller, such they can handle missing items themselves.
|
|
302
303
|
return txs;
|
|
303
304
|
}
|
|
@@ -394,7 +395,6 @@ import { P2PClientState } from './interface.js';
|
|
|
394
395
|
return txs;
|
|
395
396
|
}
|
|
396
397
|
const missingTxs = await this.requestTxsByHash(missingTxHashes, pinnedPeerId);
|
|
397
|
-
const fetchedMissingTxs = missingTxs.filter((tx)=>!!tx);
|
|
398
398
|
// TODO: optimize
|
|
399
399
|
// Merge the found txs in order
|
|
400
400
|
const mergingTxsPromises = txHashes.map(async (txHash)=>{
|
|
@@ -405,8 +405,9 @@ import { P2PClientState } from './interface.js';
|
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
407
|
// Is it in the fetched missing txs?
|
|
408
|
-
|
|
409
|
-
|
|
408
|
+
// Note: this is an O(n^2) operation, but we expect the number of missing txs to be small.
|
|
409
|
+
for (const tx of missingTxs){
|
|
410
|
+
if ((await tx.getTxHash()).equals(txHash)) {
|
|
410
411
|
return tx;
|
|
411
412
|
}
|
|
412
413
|
}
|
|
@@ -105,7 +105,7 @@ export declare class DummyReqResp implements ReqRespInterface {
|
|
|
105
105
|
start(_subProtocolHandlers: ReqRespSubProtocolHandlers, _subProtocolValidators: ReqRespSubProtocolValidators): Promise<void>;
|
|
106
106
|
stop(): Promise<void>;
|
|
107
107
|
sendRequest<SubProtocol extends ReqRespSubProtocol>(_subProtocol: SubProtocol, _request: InstanceType<SubProtocolMap[SubProtocol]['request']>): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined>;
|
|
108
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(_subProtocol: SubProtocol,
|
|
108
|
+
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(_subProtocol: SubProtocol, _requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], _pinnedPeer: PeerId | undefined, _timeoutMs?: number, _maxPeers?: number, _maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
109
109
|
sendRequestToPeer(_peerId: PeerId, _subProtocol: ReqRespSubProtocol, _payload: Buffer, _dialTimeout?: number): Promise<ReqRespResponse>;
|
|
110
110
|
}
|
|
111
111
|
//# sourceMappingURL=dummy_service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -138,8 +138,8 @@ export class DummyReqResp {
|
|
|
138
138
|
sendRequest(_subProtocol, _request) {
|
|
139
139
|
return Promise.resolve(undefined);
|
|
140
140
|
}
|
|
141
|
-
sendBatchRequest(_subProtocol,
|
|
142
|
-
return Promise.resolve(
|
|
141
|
+
sendBatchRequest(_subProtocol, _requests, _pinnedPeer, _timeoutMs, _maxPeers, _maxRetryAttempts) {
|
|
142
|
+
return Promise.resolve([]);
|
|
143
143
|
}
|
|
144
144
|
sendRequestToPeer(_peerId, _subProtocol, _payload, _dialTimeout) {
|
|
145
145
|
return Promise.resolve({
|
|
@@ -84,7 +84,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
84
84
|
* @param requests - The requests to send to the peers
|
|
85
85
|
* @returns The responses to the requests
|
|
86
86
|
*/
|
|
87
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(protocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeerId: PeerId | undefined): Promise<
|
|
87
|
+
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(protocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeerId: PeerId | undefined): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
88
88
|
/**
|
|
89
89
|
* Get the ENR of the node
|
|
90
90
|
* @returns The ENR of the node
|
|
@@ -141,18 +141,18 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
141
141
|
*/
|
|
142
142
|
propagate<T extends Gossipable>(message: T): Promise<void>;
|
|
143
143
|
/**
|
|
144
|
-
* Validate a
|
|
144
|
+
* Validate a collection of txs that has been requested from a peer.
|
|
145
145
|
*
|
|
146
|
-
* The core component of this validator is that
|
|
146
|
+
* The core component of this validator is that each tx hash MUST match the requested tx hash,
|
|
147
147
|
* In order to perform this check, the tx proof must be verified.
|
|
148
148
|
*
|
|
149
149
|
* Note: This function is called from within `ReqResp.sendRequest` as part of the
|
|
150
150
|
* ReqRespSubProtocol.TX subprotocol validation.
|
|
151
151
|
*
|
|
152
|
-
* @param requestedTxHash - The
|
|
153
|
-
* @param responseTx - The
|
|
152
|
+
* @param requestedTxHash - The collection of the txs that was requested.
|
|
153
|
+
* @param responseTx - The collectin of txs that was received as a response to the request.
|
|
154
154
|
* @param peerId - The peer ID of the peer that sent the tx.
|
|
155
|
-
* @returns True if the
|
|
155
|
+
* @returns True if the whole collection of txs is valid, false otherwise.
|
|
156
156
|
*/
|
|
157
157
|
private validateRequestedTx;
|
|
158
158
|
private validatePropagatedTx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,MAAM,EAA6C,MAAM,uBAAuB,CAAC;AAI/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACvH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,UAAU,EACf,aAAa,EAGb,SAAS,EAIV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,EAAE,EAAwC,MAAM,kBAAkB,CAAC;AAG5E,OAAO,EAAkC,KAAK,eAAe,EAAE,UAAU,EAAa,MAAM,yBAAyB,CAAC;AAEtH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAa1C,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAwB,MAAM,mBAAmB,CAAC;AAEpF,OAAO,iBAAiB,CAAC;AAKzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAO7D,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,eAAe,CAAC;AAMtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,OAAO,EAEL,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,7 +41,7 @@ import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from '../encod
|
|
|
41
41
|
import { gossipScoreThresholds } from '../gossipsub/scoring.js';
|
|
42
42
|
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
43
43
|
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
44
|
-
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
44
|
+
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError } from '../reqresp/interface.js';
|
|
45
45
|
import { reqGoodbyeHandler } from '../reqresp/protocols/goodbye.js';
|
|
46
46
|
import { pingHandler, reqRespBlockHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/protocols/index.js';
|
|
47
47
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
@@ -569,33 +569,44 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
569
569
|
});
|
|
570
570
|
}
|
|
571
571
|
/**
|
|
572
|
-
* Validate a
|
|
572
|
+
* Validate a collection of txs that has been requested from a peer.
|
|
573
573
|
*
|
|
574
|
-
* The core component of this validator is that
|
|
574
|
+
* The core component of this validator is that each tx hash MUST match the requested tx hash,
|
|
575
575
|
* In order to perform this check, the tx proof must be verified.
|
|
576
576
|
*
|
|
577
577
|
* Note: This function is called from within `ReqResp.sendRequest` as part of the
|
|
578
578
|
* ReqRespSubProtocol.TX subprotocol validation.
|
|
579
579
|
*
|
|
580
|
-
* @param requestedTxHash - The
|
|
581
|
-
* @param responseTx - The
|
|
580
|
+
* @param requestedTxHash - The collection of the txs that was requested.
|
|
581
|
+
* @param responseTx - The collectin of txs that was received as a response to the request.
|
|
582
582
|
* @param peerId - The peer ID of the peer that sent the tx.
|
|
583
|
-
* @returns True if the
|
|
584
|
-
*/
|
|
583
|
+
* @returns True if the whole collection of txs is valid, false otherwise.
|
|
584
|
+
*/ //TODO: (mralj) - this is somewhat naive implementation, if single tx is invlid we consider the whole response invalid.
|
|
585
|
+
// I think we should still extract the valid txs and return them, so that we can still use the response.
|
|
586
|
+
async validateRequestedTx(requestedTxHash, responseTx, peerId) {
|
|
587
|
+
const requested = new Set(requestedTxHash.map((h)=>h.toString()));
|
|
585
588
|
const proofValidator = new TxProofValidator(this.proofVerifier);
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
589
|
+
try {
|
|
590
|
+
await Promise.all(responseTx.map(async (tx)=>{
|
|
591
|
+
if (!requested.has((await tx.getTxHash()).toString())) {
|
|
592
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
593
|
+
throw new ValidationError(`Received tx with hash ${(await tx.getTxHash()).toString()} that was not requested.`);
|
|
594
|
+
}
|
|
595
|
+
const { result } = await proofValidator.validateTx(tx);
|
|
596
|
+
if (result === 'invalid') {
|
|
597
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
598
|
+
throw new ValidationError(`Received tx with hash ${(await tx.getTxHash()).toString()} that is invalid.`);
|
|
599
|
+
}
|
|
600
|
+
}));
|
|
601
|
+
return true;
|
|
602
|
+
} catch (e) {
|
|
603
|
+
if (e instanceof ValidationError) {
|
|
604
|
+
this.logger.debug(`Failed to validate requested txs from peer ${peerId.toString()}, reason ${e.message}`);
|
|
605
|
+
} else {
|
|
606
|
+
this.logger.warn(`Error during validation of requested txs`, e);
|
|
607
|
+
}
|
|
596
608
|
return false;
|
|
597
609
|
}
|
|
598
|
-
return true;
|
|
599
610
|
}
|
|
600
611
|
async validatePropagatedTx(tx, peerId) {
|
|
601
612
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
-
import {
|
|
3
|
+
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
4
|
import type { PeerId } from '@libp2p/interface';
|
|
5
5
|
import { StatusMessage } from './protocols/status.js';
|
|
6
6
|
import type { ReqRespStatus } from './status.js';
|
|
@@ -69,6 +69,9 @@ export type ReqRespSubProtocolValidators = {
|
|
|
69
69
|
[S in ReqRespSubProtocol]: ResponseValidator<any, any>;
|
|
70
70
|
};
|
|
71
71
|
export declare const DEFAULT_SUB_PROTOCOL_VALIDATORS: ReqRespSubProtocolValidators;
|
|
72
|
+
export declare class ValidationError extends Error {
|
|
73
|
+
constructor(message: string);
|
|
74
|
+
}
|
|
72
75
|
/**
|
|
73
76
|
* Sub protocol map determines the request and response types for each
|
|
74
77
|
* Req Resp protocol
|
|
@@ -127,8 +130,8 @@ export declare const subProtocolMap: {
|
|
|
127
130
|
response: typeof StatusMessage;
|
|
128
131
|
};
|
|
129
132
|
"/aztec/req/tx/0.1.0": {
|
|
130
|
-
request: typeof
|
|
131
|
-
response: typeof
|
|
133
|
+
request: typeof TxHashArray;
|
|
134
|
+
response: typeof TxArray;
|
|
132
135
|
};
|
|
133
136
|
"/aztec/req/goodbye/0.1.0": {
|
|
134
137
|
request: typeof RequestableBuffer;
|
|
@@ -142,7 +145,7 @@ export declare const subProtocolMap: {
|
|
|
142
145
|
export interface ReqRespInterface {
|
|
143
146
|
start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators): Promise<void>;
|
|
144
147
|
stop(): Promise<void>;
|
|
145
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeer: PeerId | undefined, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<
|
|
148
|
+
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeer: PeerId | undefined, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
146
149
|
sendRequestToPeer(peerId: PeerId, subProtocol: ReqRespSubProtocol, payload: Buffer, dialTimeout?: number): Promise<ReqRespResponse>;
|
|
147
150
|
}
|
|
148
151
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
-
import {
|
|
3
|
+
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
4
|
import { StatusMessage } from './protocols/status.js';
|
|
5
5
|
/*
|
|
6
6
|
* Request Response Sub Protocols
|
|
@@ -25,6 +25,12 @@ export const DEFAULT_SUB_PROTOCOL_VALIDATORS = {
|
|
|
25
25
|
[ReqRespSubProtocol.GOODBYE]: noopValidator,
|
|
26
26
|
[ReqRespSubProtocol.BLOCK]: noopValidator
|
|
27
27
|
};
|
|
28
|
+
/*
|
|
29
|
+
* Helper class to sub-protocol validation error*/ export class ValidationError extends Error {
|
|
30
|
+
constructor(message){
|
|
31
|
+
super(message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
28
34
|
/**
|
|
29
35
|
* Default handler for unimplemented sub protocols, this SHOULD be overwritten
|
|
30
36
|
* by the service, but is provided as a fallback
|
|
@@ -82,8 +88,8 @@ export const DEFAULT_SUB_PROTOCOL_VALIDATORS = {
|
|
|
82
88
|
response: StatusMessage
|
|
83
89
|
},
|
|
84
90
|
[ReqRespSubProtocol.TX]: {
|
|
85
|
-
request:
|
|
86
|
-
response:
|
|
91
|
+
request: TxHashArray,
|
|
92
|
+
response: TxArray
|
|
87
93
|
},
|
|
88
94
|
[ReqRespSubProtocol.GOODBYE]: {
|
|
89
95
|
request: RequestableBuffer,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { P2PClientType } from '@aztec/stdlib/p2p';
|
|
2
|
+
import { TxHash, TxHashArray } from '@aztec/stdlib/tx';
|
|
2
3
|
import type { MemPools } from '../../../mem_pools/interface.js';
|
|
3
4
|
import type { ReqRespSubProtocolHandler } from '../interface.js';
|
|
4
5
|
/**
|
|
@@ -10,4 +11,14 @@ import type { ReqRespSubProtocolHandler } from '../interface.js';
|
|
|
10
11
|
* @returns the Tx request handler
|
|
11
12
|
*/
|
|
12
13
|
export declare function reqRespTxHandler<T extends P2PClientType>(mempools: MemPools<T>): ReqRespSubProtocolHandler;
|
|
14
|
+
/**
|
|
15
|
+
* Helper function to chunk an array of transaction hashes into chunks of a specified size.
|
|
16
|
+
* This is mainly used in ReqResp in order not to request too many transactions at once from the single peer.
|
|
17
|
+
*
|
|
18
|
+
* @param hashes - The array of transaction hashes to chunk.
|
|
19
|
+
* @param chunkSize - The size of each chunk. Default is 8. Reasoning:
|
|
20
|
+
* Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
|
|
21
|
+
* we define Q as max number of transactions per batch, the comment explains why we use 8.
|
|
22
|
+
*/
|
|
23
|
+
export declare function chunkTxHashesRequest(hashes: TxHash[], chunkSize?: number): Array<TxHashArray>;
|
|
13
24
|
//# sourceMappingURL=tx.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/tx.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/tx.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAW,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGjE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,yBAAyB,CAwB1G;AAED;;;;;;;;GAQG;AAGH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,SAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAExF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { chunk } from '@aztec/foundation/collection';
|
|
2
|
+
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
2
3
|
import { ReqRespStatus, ReqRespStatusError } from '../status.js';
|
|
3
4
|
/**
|
|
4
5
|
* We want to keep the logic of the req resp handler in this file, but we do not have a reference to the mempools here
|
|
@@ -14,18 +15,17 @@ import { ReqRespStatus, ReqRespStatusError } from '../status.js';
|
|
|
14
15
|
* @returns the tx response message
|
|
15
16
|
* @throws if msg is not a valid tx hash
|
|
16
17
|
*/ return async (_peerId, msg)=>{
|
|
17
|
-
let
|
|
18
|
+
let txHashes;
|
|
18
19
|
try {
|
|
19
|
-
|
|
20
|
+
txHashes = TxHashArray.fromBuffer(msg);
|
|
20
21
|
} catch (err) {
|
|
21
22
|
throw new ReqRespStatusError(ReqRespStatus.BADLY_FORMED_REQUEST, {
|
|
22
23
|
cause: err
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
try {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
return buf;
|
|
27
|
+
const txs = new TxArray(...(await Promise.all(txHashes.map((txHash)=>mempools.txPool.getTxByHash(txHash)))).filter((t)=>!!t));
|
|
28
|
+
return txs.toBuffer();
|
|
29
29
|
} catch (err) {
|
|
30
30
|
throw new ReqRespStatusError(ReqRespStatus.INTERNAL_ERROR, {
|
|
31
31
|
cause: err
|
|
@@ -33,3 +33,16 @@ import { ReqRespStatus, ReqRespStatusError } from '../status.js';
|
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Helper function to chunk an array of transaction hashes into chunks of a specified size.
|
|
38
|
+
* This is mainly used in ReqResp in order not to request too many transactions at once from the single peer.
|
|
39
|
+
*
|
|
40
|
+
* @param hashes - The array of transaction hashes to chunk.
|
|
41
|
+
* @param chunkSize - The size of each chunk. Default is 8. Reasoning:
|
|
42
|
+
* Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
|
|
43
|
+
* we define Q as max number of transactions per batch, the comment explains why we use 8.
|
|
44
|
+
*/ //TODO: (mralj) chunk size should by default be 8, this is just temporary until the protocol is implemented correctly
|
|
45
|
+
//more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
|
|
46
|
+
export function chunkTxHashesRequest(hashes, chunkSize = 1) {
|
|
47
|
+
return chunk(hashes, chunkSize).map((chunk)=>new TxHashArray(...chunk));
|
|
48
|
+
}
|
|
@@ -62,7 +62,7 @@ export declare class ReqResp implements ReqRespInterface {
|
|
|
62
62
|
*
|
|
63
63
|
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
64
64
|
*/
|
|
65
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeer: PeerId | undefined, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<
|
|
65
|
+
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeer: PeerId | undefined, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
66
66
|
/**
|
|
67
67
|
* Sends a request to a specific peer
|
|
68
68
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,eAAe,EAAiC,MAAM,yBAAyB,CAAC;AAE1G,OAAO,KAAK,EAAsB,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AASxB;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAiB5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IAlBhB,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,0BAA0B,CAAS;IAG3C,OAAO,CAAC,mBAAmB,CAA6D;IACxF,OAAO,CAAC,qBAAqB,CAAiE;IAE9F,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,OAAO,CAAiB;gBAG9B,MAAM,EAAE,gBAAgB,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,MAAM,yCAA8B,EAC5C,UAAU,GAAE,OAAO,CAAC,4BAA4B,CAAM,EACtD,eAAe,GAAE,eAAsC;IAmBzD,IAAI,MAAM,6CAET;IAED;;OAEG;IACG,KAAK,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,4BAA4B;IAiBhH;;OAEG;IACG,IAAI;IAoBV;;;;;;;;;;;;;;;;;;;;;OAqBG;IAQG,gBAAgB,CAAC,WAAW,SAAS,kBAAkB,EAC3D,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAChE,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,SAAQ,EACjB,QAAQ,SAA+C,EACvD,gBAAgB,SAAI,GACnB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,eAAe,EAAiC,MAAM,yBAAyB,CAAC;AAE1G,OAAO,KAAK,EAAsB,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AASxB;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAiB5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IAlBhB,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,0BAA0B,CAAS;IAG3C,OAAO,CAAC,mBAAmB,CAA6D;IACxF,OAAO,CAAC,qBAAqB,CAAiE;IAE9F,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,OAAO,CAAiB;gBAG9B,MAAM,EAAE,gBAAgB,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,MAAM,yCAA8B,EAC5C,UAAU,GAAE,OAAO,CAAC,4BAA4B,CAAM,EACtD,eAAe,GAAE,eAAsC;IAmBzD,IAAI,MAAM,6CAET;IAED;;OAEG;IACG,KAAK,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,4BAA4B;IAiBhH;;OAEG;IACG,IAAI;IAoBV;;;;;;;;;;;;;;;;;;;;;OAqBG;IAQG,gBAAgB,CAAC,WAAW,SAAS,kBAAkB,EAC3D,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAChE,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,SAAQ,EACjB,QAAQ,SAA+C,EACvD,gBAAgB,SAAI,GACnB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAgJnE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IAKU,iBAAiB,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAY,GACxB,OAAO,CAAC,eAAe,CAAC;IAsD3B;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiEvB;;;;;;OAMG;YACW,WAAW;IA6CzB;;;;;;;;;;;;;;;;OAgBG;YAKW,aAAa;IA+C3B;;;;;;;SAOK;YACS,aAAa;IA4B3B;;;;;;;OAOG;YACW,YAAY;CA4B3B"}
|
|
@@ -36,7 +36,7 @@ export interface P2PService {
|
|
|
36
36
|
* @param requests - The requests to send to the peers
|
|
37
37
|
* @returns The responses to the requests
|
|
38
38
|
*/
|
|
39
|
-
sendBatchRequest<Protocol extends ReqRespSubProtocol>(protocol: Protocol, requests: InstanceType<SubProtocolMap[Protocol]['request']>[], pinnedPeerId?: PeerId, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<
|
|
39
|
+
sendBatchRequest<Protocol extends ReqRespSubProtocol>(protocol: Protocol, requests: InstanceType<SubProtocolMap[Protocol]['request']>[], pinnedPeerId?: PeerId, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
|
|
40
40
|
registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
|
|
41
41
|
getEnr(): ENR | undefined;
|
|
42
42
|
getPeers(includePending?: boolean): PeerInfo[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAE3C,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,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEjF,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,gBAAgB,EAAE,GAAG,SAAS,CAAC,CAAC;AAE7C;;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,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,SAAS,kBAAkB,EAClD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAC7D,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAE3C,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,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEjF,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,gBAAgB,EAAE,GAAG,SAAS,CAAC,CAAC;AAE7C;;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,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,SAAS,kBAAkB,EAClD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAC7D,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAGjE,6BAA6B,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAExE,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;IAE1B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;IAE/C,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;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,YAAY,IAAI,GAAG,EAAE,CAAC;IAEtB;;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;IAE1B,iBAAiB,EAAE,GAAG,EAAE,CAAC;CAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/fast_tx_collection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"fast_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/fast_tx_collection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IATb,+BAA+B;IAC/B,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAa;gBAGjD,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EACnD,KAAK,EAAE,QAAQ,EAAE,EACjB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,kBAAkB,EAC1B,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAkD;IAGpD,IAAI;IAKV,yBAAyB;IAInB,cAAc,CACzB,KAAK,EAAE,0BAA0B,EACjC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAC7B,IAAI,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;cA0C/B,WAAW,CACzB,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAiDzE;;;;;OAKG;YACW,oBAAoB;YAYpB,mBAAmB;YAiFnB,qBAAqB;IA6CnC;;;OAGG;IACI,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE;IA0BjC;;;OAGG;IACI,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAS7D;;;OAGG;IACI,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAQ/D"}
|
|
@@ -7,6 +7,7 @@ import { sleep } from '@aztec/foundation/sleep';
|
|
|
7
7
|
import { DateProvider, elapsed } from '@aztec/foundation/timer';
|
|
8
8
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
9
9
|
import { ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
10
|
+
import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
|
|
10
11
|
export class FastTxCollection {
|
|
11
12
|
reqResp;
|
|
12
13
|
nodes;
|
|
@@ -222,7 +223,10 @@ export class FastTxCollection {
|
|
|
222
223
|
pinnedPeer
|
|
223
224
|
});
|
|
224
225
|
try {
|
|
225
|
-
await this.txCollectionSink.collect((txHashes)=>
|
|
226
|
+
await this.txCollectionSink.collect(async (txHashes)=>{
|
|
227
|
+
const txs = await this.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(txHashes), pinnedPeer, timeoutMs, maxPeers, maxRetryAttempts);
|
|
228
|
+
return txs.flat();
|
|
229
|
+
}, Array.from(request.missingTxHashes).map((txHash)=>TxHash.fromString(txHash)), {
|
|
226
230
|
description: `reqresp for slot ${slotNumber}`,
|
|
227
231
|
method: 'fast-req-resp',
|
|
228
232
|
...opts,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slow_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/slow_tx_collection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,iBAAiB,EAA6C,MAAM,6BAA6B,CAAC;AAChH,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"slow_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/slow_tx_collection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,iBAAiB,EAA6C,MAAM,6BAA6B,CAAC;AAChH,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBAAa,gBAAgB;IAWzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAjBb,mEAAmE;IACnE,OAAO,CAAC,UAAU,CAAyC;IAE3D,+DAA+D;IAC/D,OAAO,CAAC,wBAAwB,CAAmB;IAEnD,qEAAqE;IACrE,OAAO,CAAC,yBAAyB,CAAiB;gBAGxC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EACnD,KAAK,EAAE,QAAQ,EAAE,EACjB,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,EACnE,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,kBAAkB,EAC1B,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAkD;IAkB1D,kBAAkB;IAIlB,KAAK;IAKC,IAAI;IAOJ,OAAO;IAOpB,mFAAmF;IAC5E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;IAsBzD,mDAAmD;YACrC,yBAAyB;IAgCvC,sDAAsD;YACxC,2BAA2B;IAsCzC,+HAA+H;IAC/H,OAAO,CAAC,8BAA8B;IAqBtC,8GAA8G;IACvG,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,IAAI;IAMxC;;;OAGG;IACI,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQ7D;;;OAGG;IACI,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQ9D,oIAAoI;IACpI,OAAO,CAAC,kBAAkB;CAM3B"}
|
|
@@ -6,6 +6,7 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
6
6
|
import { getEpochAtSlot, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
7
7
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
8
8
|
import { ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
9
|
+
import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
|
|
9
10
|
export class SlowTxCollection {
|
|
10
11
|
reqResp;
|
|
11
12
|
nodes;
|
|
@@ -118,7 +119,10 @@ export class SlowTxCollection {
|
|
|
118
119
|
const maxPeers = boundInclusive(Math.ceil(missingTxs.length / 3), 4, 16);
|
|
119
120
|
const maxRetryAttempts = 3;
|
|
120
121
|
// Send a batch request via reqresp for the missing txs
|
|
121
|
-
await this.txCollectionSink.collect((txHashes)=>
|
|
122
|
+
await this.txCollectionSink.collect(async (txHashes)=>{
|
|
123
|
+
const txs = await this.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(txHashes), pinnedPeer, timeoutMs, maxPeers, maxRetryAttempts);
|
|
124
|
+
return txs.flat();
|
|
125
|
+
}, missingTxs.map(([txHash])=>TxHash.fromString(txHash)), {
|
|
122
126
|
description: 'slow reqresp',
|
|
123
127
|
timeoutMs,
|
|
124
128
|
method: 'slow-req-resp'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "1.0.0-nightly.
|
|
3
|
+
"version": "1.0.0-nightly.20250709",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -67,17 +67,17 @@
|
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@aztec/constants": "1.0.0-nightly.
|
|
71
|
-
"@aztec/epoch-cache": "1.0.0-nightly.
|
|
72
|
-
"@aztec/ethereum": "1.0.0-nightly.
|
|
73
|
-
"@aztec/foundation": "1.0.0-nightly.
|
|
74
|
-
"@aztec/kv-store": "1.0.0-nightly.
|
|
75
|
-
"@aztec/noir-contracts.js": "1.0.0-nightly.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "1.0.0-nightly.
|
|
77
|
-
"@aztec/protocol-contracts": "1.0.0-nightly.
|
|
78
|
-
"@aztec/simulator": "1.0.0-nightly.
|
|
79
|
-
"@aztec/stdlib": "1.0.0-nightly.
|
|
80
|
-
"@aztec/telemetry-client": "1.0.0-nightly.
|
|
70
|
+
"@aztec/constants": "1.0.0-nightly.20250709",
|
|
71
|
+
"@aztec/epoch-cache": "1.0.0-nightly.20250709",
|
|
72
|
+
"@aztec/ethereum": "1.0.0-nightly.20250709",
|
|
73
|
+
"@aztec/foundation": "1.0.0-nightly.20250709",
|
|
74
|
+
"@aztec/kv-store": "1.0.0-nightly.20250709",
|
|
75
|
+
"@aztec/noir-contracts.js": "1.0.0-nightly.20250709",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "1.0.0-nightly.20250709",
|
|
77
|
+
"@aztec/protocol-contracts": "1.0.0-nightly.20250709",
|
|
78
|
+
"@aztec/simulator": "1.0.0-nightly.20250709",
|
|
79
|
+
"@aztec/stdlib": "1.0.0-nightly.20250709",
|
|
80
|
+
"@aztec/telemetry-client": "1.0.0-nightly.20250709",
|
|
81
81
|
"@chainsafe/discv5": "9.0.0",
|
|
82
82
|
"@chainsafe/enr": "3.0.0",
|
|
83
83
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
@@ -105,8 +105,8 @@
|
|
|
105
105
|
"xxhash-wasm": "^1.1.0"
|
|
106
106
|
},
|
|
107
107
|
"devDependencies": {
|
|
108
|
-
"@aztec/archiver": "1.0.0-nightly.
|
|
109
|
-
"@aztec/world-state": "1.0.0-nightly.
|
|
108
|
+
"@aztec/archiver": "1.0.0-nightly.20250709",
|
|
109
|
+
"@aztec/world-state": "1.0.0-nightly.20250709",
|
|
110
110
|
"@jest/globals": "^30.0.0",
|
|
111
111
|
"@types/jest": "^30.0.0",
|
|
112
112
|
"@types/node": "^22.15.17",
|
package/src/client/interface.ts
CHANGED
|
@@ -60,7 +60,7 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApiFull<T> &
|
|
|
60
60
|
* @param pinnedPeerId - An optional peer id that will be used to request the tx from (in addition to other random peers).
|
|
61
61
|
* @returns A list of transactions or undefined if the transactions are not found.
|
|
62
62
|
*/
|
|
63
|
-
requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId): Promise<
|
|
63
|
+
requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId): Promise<Tx[]>;
|
|
64
64
|
|
|
65
65
|
/**
|
|
66
66
|
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -33,6 +33,7 @@ import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_
|
|
|
33
33
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
34
34
|
import type { TxPool } from '../mem_pools/tx_pool/index.js';
|
|
35
35
|
import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
36
|
+
import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
|
|
36
37
|
import type { P2PBlockReceivedCallback, P2PService } from '../services/service.js';
|
|
37
38
|
import { TxCollection } from '../services/tx_collection/tx_collection.js';
|
|
38
39
|
import { TxProvider } from '../services/tx_provider.js';
|
|
@@ -373,27 +374,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
373
374
|
/**
|
|
374
375
|
* Uses the batched Request Response protocol to request a set of transactions from the network.
|
|
375
376
|
*/
|
|
376
|
-
public async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<
|
|
377
|
+
public async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
|
|
377
378
|
const timeoutMs = 8000; // Longer timeout for now
|
|
378
|
-
const maxPeers = Math.min(Math.ceil(txHashes.length / 3), 10);
|
|
379
379
|
const maxRetryAttempts = 10; // Keep retrying within the timeout
|
|
380
|
+
const requests = chunkTxHashesRequest(txHashes);
|
|
381
|
+
const maxPeers = Math.min(Math.ceil(requests.length / 3), 10);
|
|
380
382
|
|
|
381
|
-
const
|
|
383
|
+
const txBatches = await this.p2pService.sendBatchRequest(
|
|
382
384
|
ReqRespSubProtocol.TX,
|
|
383
|
-
|
|
385
|
+
requests,
|
|
384
386
|
pinnedPeerId,
|
|
385
387
|
timeoutMs,
|
|
386
388
|
maxPeers,
|
|
387
389
|
maxRetryAttempts,
|
|
388
390
|
);
|
|
389
391
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
await this.txPool.addTxs(filteredTxs);
|
|
392
|
+
const txs = txBatches.flat();
|
|
393
|
+
if (txs.length > 0) {
|
|
394
|
+
await this.txPool.addTxs(txs);
|
|
394
395
|
}
|
|
396
|
+
|
|
395
397
|
const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
|
|
396
|
-
this.log.debug(`Requested txs ${txHashesStr} (${
|
|
398
|
+
this.log.debug(`Requested txs ${txHashesStr} (${txs.length} / ${txHashes.length}) from peers`);
|
|
397
399
|
|
|
398
400
|
// We return all transactions, even the not found ones to the caller, such they can handle missing items themselves.
|
|
399
401
|
return txs;
|
|
@@ -514,8 +516,6 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
514
516
|
}
|
|
515
517
|
|
|
516
518
|
const missingTxs = await this.requestTxsByHash(missingTxHashes, pinnedPeerId);
|
|
517
|
-
const fetchedMissingTxs = missingTxs.filter((tx): tx is Tx => !!tx);
|
|
518
|
-
|
|
519
519
|
// TODO: optimize
|
|
520
520
|
// Merge the found txs in order
|
|
521
521
|
const mergingTxsPromises = txHashes.map(async txHash => {
|
|
@@ -527,8 +527,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
527
527
|
}
|
|
528
528
|
|
|
529
529
|
// Is it in the fetched missing txs?
|
|
530
|
-
|
|
531
|
-
|
|
530
|
+
// Note: this is an O(n^2) operation, but we expect the number of missing txs to be small.
|
|
531
|
+
for (const tx of missingTxs) {
|
|
532
|
+
if ((await tx.getTxHash()).equals(txHash)) {
|
|
532
533
|
return tx;
|
|
533
534
|
}
|
|
534
535
|
}
|
|
@@ -209,13 +209,13 @@ export class DummyReqResp implements ReqRespInterface {
|
|
|
209
209
|
}
|
|
210
210
|
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
211
211
|
_subProtocol: SubProtocol,
|
|
212
|
-
|
|
212
|
+
_requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
213
213
|
_pinnedPeer: PeerId | undefined,
|
|
214
214
|
_timeoutMs?: number,
|
|
215
215
|
_maxPeers?: number,
|
|
216
216
|
_maxRetryAttempts?: number,
|
|
217
|
-
): Promise<
|
|
218
|
-
return Promise.resolve(
|
|
217
|
+
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
218
|
+
return Promise.resolve([]);
|
|
219
219
|
}
|
|
220
220
|
public sendRequestToPeer(
|
|
221
221
|
_peerId: PeerId,
|
|
@@ -69,6 +69,7 @@ import {
|
|
|
69
69
|
type ReqRespInterface,
|
|
70
70
|
ReqRespSubProtocol,
|
|
71
71
|
type SubProtocolMap,
|
|
72
|
+
ValidationError,
|
|
72
73
|
} from '../reqresp/interface.js';
|
|
73
74
|
import { reqGoodbyeHandler } from '../reqresp/protocols/goodbye.js';
|
|
74
75
|
import {
|
|
@@ -473,7 +474,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
473
474
|
protocol: SubProtocol,
|
|
474
475
|
requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
475
476
|
pinnedPeerId: PeerId | undefined,
|
|
476
|
-
): Promise<
|
|
477
|
+
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
477
478
|
return this.reqresp.sendBatchRequest(protocol, requests, pinnedPeerId);
|
|
478
479
|
}
|
|
479
480
|
|
|
@@ -782,40 +783,56 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
782
783
|
}
|
|
783
784
|
|
|
784
785
|
/**
|
|
785
|
-
* Validate a
|
|
786
|
+
* Validate a collection of txs that has been requested from a peer.
|
|
786
787
|
*
|
|
787
|
-
* The core component of this validator is that
|
|
788
|
+
* The core component of this validator is that each tx hash MUST match the requested tx hash,
|
|
788
789
|
* In order to perform this check, the tx proof must be verified.
|
|
789
790
|
*
|
|
790
791
|
* Note: This function is called from within `ReqResp.sendRequest` as part of the
|
|
791
792
|
* ReqRespSubProtocol.TX subprotocol validation.
|
|
792
793
|
*
|
|
793
|
-
* @param requestedTxHash - The
|
|
794
|
-
* @param responseTx - The
|
|
794
|
+
* @param requestedTxHash - The collection of the txs that was requested.
|
|
795
|
+
* @param responseTx - The collectin of txs that was received as a response to the request.
|
|
795
796
|
* @param peerId - The peer ID of the peer that sent the tx.
|
|
796
|
-
* @returns True if the
|
|
797
|
+
* @returns True if the whole collection of txs is valid, false otherwise.
|
|
797
798
|
*/
|
|
799
|
+
//TODO: (mralj) - this is somewhat naive implementation, if single tx is invlid we consider the whole response invalid.
|
|
800
|
+
// I think we should still extract the valid txs and return them, so that we can still use the response.
|
|
798
801
|
@trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx) => ({
|
|
799
802
|
[Attributes.TX_HASH]: requestedTxHash.toString(),
|
|
800
803
|
}))
|
|
801
|
-
private async validateRequestedTx(requestedTxHash: TxHash, responseTx: Tx, peerId: PeerId): Promise<boolean> {
|
|
804
|
+
private async validateRequestedTx(requestedTxHash: TxHash[], responseTx: Tx[], peerId: PeerId): Promise<boolean> {
|
|
805
|
+
const requested = new Set(requestedTxHash.map(h => h.toString()));
|
|
806
|
+
|
|
802
807
|
const proofValidator = new TxProofValidator(this.proofVerifier);
|
|
803
|
-
const validProof = await proofValidator.validateTx(responseTx);
|
|
804
808
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
809
|
+
try {
|
|
810
|
+
await Promise.all(
|
|
811
|
+
responseTx.map(async tx => {
|
|
812
|
+
if (!requested.has((await tx.getTxHash()).toString())) {
|
|
813
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
814
|
+
throw new ValidationError(
|
|
815
|
+
`Received tx with hash ${(await tx.getTxHash()).toString()} that was not requested.`,
|
|
816
|
+
);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
const { result } = await proofValidator.validateTx(tx);
|
|
820
|
+
if (result === 'invalid') {
|
|
821
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
822
|
+
throw new ValidationError(`Received tx with hash ${(await tx.getTxHash()).toString()} that is invalid.`);
|
|
823
|
+
}
|
|
824
|
+
}),
|
|
825
|
+
);
|
|
826
|
+
return true;
|
|
827
|
+
} catch (e: any) {
|
|
828
|
+
if (e instanceof ValidationError) {
|
|
829
|
+
this.logger.debug(`Failed to validate requested txs from peer ${peerId.toString()}, reason ${e.message}`);
|
|
830
|
+
} else {
|
|
831
|
+
this.logger.warn(`Error during validation of requested txs`, e);
|
|
832
|
+
}
|
|
811
833
|
|
|
812
|
-
if (validProof.result === 'invalid') {
|
|
813
|
-
// If the proof is invalid, but the txHash is correct, then this is an active attack and we severly punish
|
|
814
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
815
834
|
return false;
|
|
816
835
|
}
|
|
817
|
-
|
|
818
|
-
return true;
|
|
819
836
|
}
|
|
820
837
|
|
|
821
838
|
@trackSpan('Libp2pService.validatePropagatedTx', async tx => ({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
-
import {
|
|
3
|
+
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
4
|
|
|
5
5
|
import type { PeerId } from '@libp2p/interface';
|
|
6
6
|
|
|
@@ -94,6 +94,14 @@ export const DEFAULT_SUB_PROTOCOL_VALIDATORS: ReqRespSubProtocolValidators = {
|
|
|
94
94
|
[ReqRespSubProtocol.BLOCK]: noopValidator,
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
+
/*
|
|
98
|
+
* Helper class to sub-protocol validation error*/
|
|
99
|
+
export class ValidationError extends Error {
|
|
100
|
+
constructor(message: string) {
|
|
101
|
+
super(message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
97
105
|
/**
|
|
98
106
|
* Sub protocol map determines the request and response types for each
|
|
99
107
|
* Req Resp protocol
|
|
@@ -191,8 +199,8 @@ export const subProtocolMap = {
|
|
|
191
199
|
response: StatusMessage,
|
|
192
200
|
},
|
|
193
201
|
[ReqRespSubProtocol.TX]: {
|
|
194
|
-
request:
|
|
195
|
-
response:
|
|
202
|
+
request: TxHashArray,
|
|
203
|
+
response: TxArray,
|
|
196
204
|
},
|
|
197
205
|
[ReqRespSubProtocol.GOODBYE]: {
|
|
198
206
|
request: RequestableBuffer,
|
|
@@ -217,7 +225,7 @@ export interface ReqRespInterface {
|
|
|
217
225
|
timeoutMs?: number,
|
|
218
226
|
maxPeers?: number,
|
|
219
227
|
maxRetryAttempts?: number,
|
|
220
|
-
): Promise<
|
|
228
|
+
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
221
229
|
sendRequestToPeer(
|
|
222
230
|
peerId: PeerId,
|
|
223
231
|
subProtocol: ReqRespSubProtocol,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { chunk } from '@aztec/foundation/collection';
|
|
1
2
|
import type { P2PClientType } from '@aztec/stdlib/p2p';
|
|
2
|
-
import { TxHash } from '@aztec/stdlib/tx';
|
|
3
|
+
import { TxArray, TxHash, TxHashArray } from '@aztec/stdlib/tx';
|
|
3
4
|
|
|
4
5
|
import type { PeerId } from '@libp2p/interface';
|
|
5
6
|
|
|
@@ -23,19 +24,35 @@ export function reqRespTxHandler<T extends P2PClientType>(mempools: MemPools<T>)
|
|
|
23
24
|
* @throws if msg is not a valid tx hash
|
|
24
25
|
*/
|
|
25
26
|
return async (_peerId: PeerId, msg: Buffer) => {
|
|
26
|
-
let
|
|
27
|
+
let txHashes: TxHashArray;
|
|
27
28
|
try {
|
|
28
|
-
|
|
29
|
+
txHashes = TxHashArray.fromBuffer(msg);
|
|
29
30
|
} catch (err: any) {
|
|
30
31
|
throw new ReqRespStatusError(ReqRespStatus.BADLY_FORMED_REQUEST, { cause: err });
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
try {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
const txs = new TxArray(
|
|
36
|
+
...(await Promise.all(txHashes.map(txHash => mempools.txPool.getTxByHash(txHash)))).filter(t => !!t),
|
|
37
|
+
);
|
|
38
|
+
return txs.toBuffer();
|
|
37
39
|
} catch (err: any) {
|
|
38
40
|
throw new ReqRespStatusError(ReqRespStatus.INTERNAL_ERROR, { cause: err });
|
|
39
41
|
}
|
|
40
42
|
};
|
|
41
43
|
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Helper function to chunk an array of transaction hashes into chunks of a specified size.
|
|
47
|
+
* This is mainly used in ReqResp in order not to request too many transactions at once from the single peer.
|
|
48
|
+
*
|
|
49
|
+
* @param hashes - The array of transaction hashes to chunk.
|
|
50
|
+
* @param chunkSize - The size of each chunk. Default is 8. Reasoning:
|
|
51
|
+
* Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
|
|
52
|
+
* we define Q as max number of transactions per batch, the comment explains why we use 8.
|
|
53
|
+
*/
|
|
54
|
+
//TODO: (mralj) chunk size should by default be 8, this is just temporary until the protocol is implemented correctly
|
|
55
|
+
//more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
|
|
56
|
+
export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
|
|
57
|
+
return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
|
|
58
|
+
}
|
|
@@ -178,9 +178,9 @@ export class ReqResp implements ReqRespInterface {
|
|
|
178
178
|
timeoutMs = 10000,
|
|
179
179
|
maxPeers = Math.max(10, Math.ceil(requests.length / 3)),
|
|
180
180
|
maxRetryAttempts = 3,
|
|
181
|
-
): Promise<
|
|
181
|
+
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
182
182
|
const responseValidator = this.subProtocolValidators[subProtocol];
|
|
183
|
-
const responses:
|
|
183
|
+
const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
|
|
184
184
|
const requestBuffers = requests.map(req => req.toBuffer());
|
|
185
185
|
|
|
186
186
|
const requestFunction = async (signal: AbortSignal) => {
|
|
@@ -311,7 +311,7 @@ export class ReqResp implements ReqRespInterface {
|
|
|
311
311
|
};
|
|
312
312
|
|
|
313
313
|
try {
|
|
314
|
-
return await executeTimeout<
|
|
314
|
+
return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>(
|
|
315
315
|
requestFunction,
|
|
316
316
|
timeoutMs,
|
|
317
317
|
() => new CollectiveReqRespTimeoutError(),
|
package/src/services/service.ts
CHANGED
|
@@ -54,7 +54,7 @@ export interface P2PService {
|
|
|
54
54
|
timeoutMs?: number,
|
|
55
55
|
maxPeers?: number,
|
|
56
56
|
maxRetryAttempts?: number,
|
|
57
|
-
): Promise<
|
|
57
|
+
): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
|
|
58
58
|
|
|
59
59
|
// Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
60
60
|
registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
|
|
@@ -12,6 +12,7 @@ import { TxHash, type TxWithHash } from '@aztec/stdlib/tx';
|
|
|
12
12
|
import type { PeerId } from '@libp2p/interface';
|
|
13
13
|
|
|
14
14
|
import { type ReqRespInterface, ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
15
|
+
import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
|
|
15
16
|
import type { TxCollectionConfig } from './config.js';
|
|
16
17
|
import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
|
|
17
18
|
import type { TxCollectionSink } from './tx_collection_sink.js';
|
|
@@ -241,7 +242,6 @@ export class FastTxCollection {
|
|
|
241
242
|
const maxRetryAttempts = 5;
|
|
242
243
|
const blockInfo = request.blockInfo;
|
|
243
244
|
const slotNumber = blockInfo.slotNumber;
|
|
244
|
-
|
|
245
245
|
if (timeoutMs < 100) {
|
|
246
246
|
this.log.warn(
|
|
247
247
|
`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`,
|
|
@@ -257,15 +257,18 @@ export class FastTxCollection {
|
|
|
257
257
|
|
|
258
258
|
try {
|
|
259
259
|
await this.txCollectionSink.collect(
|
|
260
|
-
txHashes =>
|
|
261
|
-
this.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
|
|
260
|
+
async txHashes => {
|
|
261
|
+
const txs = await this.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
|
|
262
262
|
ReqRespSubProtocol.TX,
|
|
263
|
-
txHashes,
|
|
263
|
+
chunkTxHashesRequest(txHashes),
|
|
264
264
|
pinnedPeer,
|
|
265
265
|
timeoutMs,
|
|
266
266
|
maxPeers,
|
|
267
267
|
maxRetryAttempts,
|
|
268
|
-
)
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
return txs.flat();
|
|
271
|
+
},
|
|
269
272
|
Array.from(request.missingTxHashes).map(txHash => TxHash.fromString(txHash)),
|
|
270
273
|
{ description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
|
|
271
274
|
);
|
|
@@ -8,6 +8,7 @@ import { type L1RollupConstants, getEpochAtSlot, getTimestampRangeForEpoch } fro
|
|
|
8
8
|
import { TxHash, type TxWithHash } from '@aztec/stdlib/tx';
|
|
9
9
|
|
|
10
10
|
import { type ReqRespInterface, ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
11
|
+
import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
|
|
11
12
|
import type { TxCollectionConfig } from './config.js';
|
|
12
13
|
import type { FastTxCollection } from './fast_tx_collection.js';
|
|
13
14
|
import type { MissingTxInfo } from './tx_collection.js';
|
|
@@ -149,18 +150,20 @@ export class SlowTxCollection {
|
|
|
149
150
|
const timeoutMs = this.config.txCollectionSlowReqRespTimeoutMs;
|
|
150
151
|
const maxPeers = boundInclusive(Math.ceil(missingTxs.length / 3), 4, 16);
|
|
151
152
|
const maxRetryAttempts = 3;
|
|
152
|
-
|
|
153
153
|
// Send a batch request via reqresp for the missing txs
|
|
154
154
|
await this.txCollectionSink.collect(
|
|
155
|
-
txHashes =>
|
|
156
|
-
this.reqResp.sendBatchRequest(
|
|
155
|
+
async txHashes => {
|
|
156
|
+
const txs = await this.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
|
|
157
157
|
ReqRespSubProtocol.TX,
|
|
158
|
-
txHashes,
|
|
158
|
+
chunkTxHashesRequest(txHashes),
|
|
159
159
|
pinnedPeer,
|
|
160
160
|
timeoutMs,
|
|
161
161
|
maxPeers,
|
|
162
162
|
maxRetryAttempts,
|
|
163
|
-
)
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
return txs.flat();
|
|
166
|
+
},
|
|
164
167
|
missingTxs.map(([txHash]) => TxHash.fromString(txHash)),
|
|
165
168
|
{ description: 'slow reqresp', timeoutMs, method: 'slow-req-resp' },
|
|
166
169
|
);
|