@aztec/p2p 4.1.2 → 4.2.0-aztecnr-rc.2
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/README.md +129 -3
- package/dest/client/factory.d.ts +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +22 -16
- 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 +10 -6
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +3 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -2
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +7 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +11 -4
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +9 -1
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +15 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +28 -1
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/libp2p/libp2p_service.d.ts +1 -1
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +5 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +16 -8
- package/dest/services/tx_collection/file_store_tx_source.d.ts +4 -5
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +29 -39
- package/dest/services/tx_collection/tx_source.d.ts +5 -6
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +7 -9
- package/package.json +14 -14
- package/src/client/factory.ts +33 -23
- package/src/client/p2p_client.ts +13 -6
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +2 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +11 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +12 -4
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/tx_validator/README.md +5 -1
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +21 -1
- package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
- package/src/services/encoding.ts +9 -1
- package/src/services/libp2p/libp2p_service.ts +5 -0
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/reqresp.ts +18 -10
- package/src/services/tx_collection/file_store_tx_source.ts +31 -43
- package/src/services/tx_collection/tx_source.ts +7 -8
|
@@ -126,4 +126,4 @@ export declare class ReqResp implements ReqRespInterface {
|
|
|
126
126
|
private categorizeResponseError;
|
|
127
127
|
private categorizeConnectionErrors;
|
|
128
128
|
}
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvcmVxcmVzcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQWMsS0FBSyxlQUFlLEVBQWlDLE1BQU0seUJBQXlCLENBQUM7QUFFMUcsT0FBTyxLQUFLLEVBQXNCLE1BQU0sRUFBVSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQVVyQyxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBR0wsS0FBSyxnQkFBZ0IsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUFFLGlCQUFpQixFQUFpQixNQUFNLDRDQUE0QyxDQUFDO0FBQzlGLE9BQU8sRUFFTCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLGVBQWUsRUFDcEIsa0JBQWtCLEVBQ2xCLEtBQUsseUJBQXlCLEVBQzlCLEtBQUssMEJBQTBCLEVBQy9CLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssY0FBYyxFQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBU3hCOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxxQkFBYSxPQUFRLFlBQVcsZ0JBQWdCO0lBZ0I1QyxPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxXQUFXO0lBQ25CLE9BQU8sQ0FBQyxNQUFNO0lBakJoQixPQUFPLENBQUMsMEJBQTBCLENBQWlEO0lBQ25GLE9BQU8sQ0FBQyxhQUFhLENBQTJDO0lBRWhFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBMkM7SUFDdEUsT0FBTyxDQUFDLHFCQUFxQixDQUE2QztJQUUxRSxPQUFPLENBQUMsaUJBQWlCLENBQW9CO0lBQzdDLE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBRWhELE9BQU8sQ0FBQyxlQUFlLENBQWtCO0lBRXpDLE9BQU8sQ0FBQyxPQUFPLENBQWlCO0lBRWhDLFlBQ0UsTUFBTSxFQUFFLGdCQUFnQixFQUNoQixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLE1BQU0seUNBQThCLEVBQzVDLFVBQVUsR0FBRSxPQUFPLENBQUMsNEJBQTRCLENBQU0sRUFDdEQsZUFBZSxHQUFFLGVBQXNDLEVBZ0J4RDtJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQVEzRDtJQUVELElBQUksTUFBTSw2Q0FFVDtJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLHVDQUF1QyxDQUFDLENBRXZGO0lBRUQ7O09BRUc7SUFDRyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUscUJBQXFCLEVBQUUsNEJBQTRCLGlCQWdCL0c7SUFFSyxjQUFjLENBQ2xCLFdBQVcsRUFBRSxrQkFBa0IsRUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUNsQyxTQUFTLEdBQUUsNEJBQTRCLENBQUMsa0JBQWtCLENBQWdELEdBQ3pHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FXZjtJQUVEOztPQUVHO0lBQ0csSUFBSSxrQkFrQlQ7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBUUcsZ0JBQWdCLENBQUMsV0FBVyxTQUFTLGtCQUFrQixFQUMzRCxXQUFXLEVBQUUsV0FBVyxFQUN4QixRQUFRLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQ2hFLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLFNBQVEsRUFDakIsUUFBUSxTQUErQyxFQUN2RCxnQkFBZ0IsU0FBSSxHQUNuQixPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FxTGxFO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCRztJQUtVLGlCQUFpQixDQUM1QixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsRUFBRSxrQkFBa0IsRUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFDZixXQUFXLEdBQUUsTUFBMkIsR0FDdkMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQTJEMUI7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxPQUFPLENBQUMsbUJBQW1CO1lBaUJiLFdBQVc7WUE0RFgsYUFBYTtZQStEYixhQUFhO1lBd0NiLFlBQVk7SUFtQzFCLE9BQU8sQ0FBQyxrQkFBa0I7SUFPMUI7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxzQkFBc0I7SUFpQjlCOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsdUJBQXVCO0lBdUMvQixPQUFPLENBQUMsMEJBQTBCO0NBOERuQyJ9
|
|
@@ -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,EAGL,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAiB,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAGpB,MAAM,gBAAgB,CAAC;AASxB;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAgB5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IAjBhB,OAAO,CAAC,0BAA0B,CAAiD;IACnF,OAAO,CAAC,aAAa,CAA2C;IAEhE,OAAO,CAAC,mBAAmB,CAA2C;IACtE,OAAO,CAAC,qBAAqB,CAA6C;IAE1E,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,OAAO,CAAiB;IAEhC,YACE,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,EAgBxD;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQ3D;IAED,IAAI,MAAM,6CAET;IAED;;OAEG;IACH,oBAAoB,IAAI,IAAI,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAEvF;IAED;;OAEG;IACG,KAAK,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,4BAA4B,iBAgB/G;IAEK,cAAc,CAClB,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,yBAAyB,EAClC,SAAS,GAAE,4BAA4B,CAAC,kBAAkB,CAAgD,GACzG,OAAO,CAAC,IAAI,CAAC,CAWf;IAED;;OAEG;IACG,IAAI,kBAkBT;IAED;;;;;;;;;;;;;;;;;;;;;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,CAqLlE;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IAKU,iBAAiB,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAA2B,GACvC,OAAO,CAAC,eAAe,CAAC,CA2D1B;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;YAiBb,WAAW;
|
|
1
|
+
{"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":"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"}
|
|
@@ -380,7 +380,7 @@ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
|
380
380
|
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
381
381
|
import { pipeline } from 'node:stream/promises';
|
|
382
382
|
import { CollectiveReqRespTimeoutError, IndividualReqRespTimeoutError, InvalidResponseError } from '../../errors/reqresp.error.js';
|
|
383
|
-
import { SnappyTransform } from '../encoding.js';
|
|
383
|
+
import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
|
|
384
384
|
import { DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS, DEFAULT_REQRESP_DIAL_TIMEOUT_MS } from './config.js';
|
|
385
385
|
import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
|
|
386
386
|
import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
|
|
@@ -807,14 +807,10 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
807
807
|
data: message
|
|
808
808
|
};
|
|
809
809
|
} catch (e) {
|
|
810
|
+
// All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
|
|
811
|
+
// are re-thrown so the caller can penalize the peer via handleResponseError.
|
|
810
812
|
this.logger.debug(`Reading message failed: ${e.message}`);
|
|
811
|
-
|
|
812
|
-
if (e instanceof ReqRespStatusError) {
|
|
813
|
-
status = e.status;
|
|
814
|
-
}
|
|
815
|
-
return {
|
|
816
|
-
status
|
|
817
|
-
};
|
|
813
|
+
throw e;
|
|
818
814
|
}
|
|
819
815
|
}
|
|
820
816
|
/**
|
|
@@ -977,6 +973,18 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
977
973
|
this.logger.debug(`Non-punishable error in ${subProtocol}: ${e.message}`, logTags);
|
|
978
974
|
return undefined;
|
|
979
975
|
}
|
|
976
|
+
// Invalid status byte: the peer sent a status byte that doesn't match any known status code.
|
|
977
|
+
// This is a protocol violation, penalize harshly.
|
|
978
|
+
if (e instanceof ReqRespStatusError) {
|
|
979
|
+
this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
980
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
981
|
+
}
|
|
982
|
+
// Oversized snappy response: the peer is sending data that exceeds the allowed size.
|
|
983
|
+
// This is a protocol violation that wastes bandwidth, so penalize harshly.
|
|
984
|
+
if (e instanceof OversizedSnappyResponseError) {
|
|
985
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
986
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
987
|
+
}
|
|
980
988
|
return this.categorizeConnectionErrors(e, peerId, subProtocol);
|
|
981
989
|
}
|
|
982
990
|
/*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
-
import { type TxHash
|
|
2
|
+
import { type TxHash } from '@aztec/stdlib/tx';
|
|
3
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
4
|
import type { TxSource, TxSourceCollectionResult } from './tx_source.js';
|
|
5
5
|
/** TxSource implementation that downloads txs from a file store. */
|
|
@@ -7,7 +7,6 @@ export declare class FileStoreTxSource implements TxSource {
|
|
|
7
7
|
private readonly fileStore;
|
|
8
8
|
private readonly baseUrl;
|
|
9
9
|
private readonly basePath;
|
|
10
|
-
private readonly txValidator;
|
|
11
10
|
private readonly log;
|
|
12
11
|
private downloadsSuccess;
|
|
13
12
|
private downloadsFailed;
|
|
@@ -22,7 +21,7 @@ export declare class FileStoreTxSource implements TxSource {
|
|
|
22
21
|
* @param telemetry - Optional telemetry client.
|
|
23
22
|
* @returns The FileStoreTxSource instance, or undefined if creation fails.
|
|
24
23
|
*/
|
|
25
|
-
static create(url: string, basePath: string,
|
|
24
|
+
static create(url: string, basePath: string, log?: Logger, telemetry?: TelemetryClient): Promise<FileStoreTxSource | undefined>;
|
|
26
25
|
getInfo(): string;
|
|
27
26
|
getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
|
|
28
27
|
}
|
|
@@ -34,5 +33,5 @@ export declare class FileStoreTxSource implements TxSource {
|
|
|
34
33
|
* @param telemetry - Optional telemetry client.
|
|
35
34
|
* @returns Array of successfully created FileStoreTxSource instances.
|
|
36
35
|
*/
|
|
37
|
-
export declare function createFileStoreTxSources(urls: string[], basePath: string,
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
export declare function createFileStoreTxSources(urls: string[], basePath: string, log?: Logger, telemetry?: TelemetryClient): Promise<FileStoreTxSource[]>;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9zdG9yZV90eF9zb3VyY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90eF9jb2xsZWN0aW9uL2ZpbGVfc3RvcmVfdHhfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQU0sS0FBSyxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBR0wsS0FBSyxlQUFlLEVBR3JCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsb0VBQW9FO0FBQ3BFLHFCQUFhLGlCQUFrQixZQUFXLFFBQVE7SUFPOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztJQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVE7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBVHRCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFDeEMsT0FBTyxDQUFDLGVBQWUsQ0FBZ0I7SUFDdkMsT0FBTyxDQUFDLGdCQUFnQixDQUFZO0lBQ3BDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFFaEMsT0FBTyxlQVlOO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQW9CLE1BQU0sQ0FDeEIsR0FBRyxFQUFFLE1BQU0sRUFDWCxRQUFRLEVBQUUsTUFBTSxFQUNoQixHQUFHLEdBQUUsTUFBaUQsRUFDdEQsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FZeEM7SUFFTSxPQUFPLElBQUksTUFBTSxDQUV2QjtJQUVZLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBK0IvRTtDQUNGO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILHdCQUFzQix3QkFBd0IsQ0FDNUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUNkLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLEdBQUcsR0FBRSxNQUFpRCxFQUN0RCxTQUFTLEdBQUUsZUFBc0MsR0FDaEQsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FHOUIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file_store_tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/file_store_tx_source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file_store_tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/file_store_tx_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,oEAAoE;AACpE,qBAAa,iBAAkB,YAAW,QAAQ;IAO9C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,eAYN;IAED;;;;;;;OAOG;IACH,OAAoB,MAAM,CACxB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAiD,EACtD,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAYxC;IAEM,OAAO,IAAI,MAAM,CAEvB;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA+B/E;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAiD,EACtD,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAG9B"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { partitionAsync } from '@aztec/foundation/collection';
|
|
2
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
2
|
import { Timer } from '@aztec/foundation/timer';
|
|
4
3
|
import { createReadOnlyFileStore } from '@aztec/stdlib/file-store';
|
|
@@ -8,17 +7,15 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
8
7
|
fileStore;
|
|
9
8
|
baseUrl;
|
|
10
9
|
basePath;
|
|
11
|
-
txValidator;
|
|
12
10
|
log;
|
|
13
11
|
downloadsSuccess;
|
|
14
12
|
downloadsFailed;
|
|
15
13
|
downloadDuration;
|
|
16
14
|
downloadSize;
|
|
17
|
-
constructor(fileStore, baseUrl, basePath,
|
|
15
|
+
constructor(fileStore, baseUrl, basePath, log, telemetry){
|
|
18
16
|
this.fileStore = fileStore;
|
|
19
17
|
this.baseUrl = baseUrl;
|
|
20
18
|
this.basePath = basePath;
|
|
21
|
-
this.txValidator = txValidator;
|
|
22
19
|
this.log = log;
|
|
23
20
|
const meter = telemetry.getMeter('file-store-tx-source');
|
|
24
21
|
this.downloadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_SUCCESS);
|
|
@@ -33,14 +30,14 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
33
30
|
* @param log - Optional logger.
|
|
34
31
|
* @param telemetry - Optional telemetry client.
|
|
35
32
|
* @returns The FileStoreTxSource instance, or undefined if creation fails.
|
|
36
|
-
*/ static async create(url, basePath,
|
|
33
|
+
*/ static async create(url, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
|
|
37
34
|
try {
|
|
38
35
|
const fileStore = await createReadOnlyFileStore(url, log);
|
|
39
36
|
if (!fileStore) {
|
|
40
37
|
log.warn(`Failed to create file store for URL: ${url}`);
|
|
41
38
|
return undefined;
|
|
42
39
|
}
|
|
43
|
-
return new FileStoreTxSource(fileStore, url, basePath,
|
|
40
|
+
return new FileStoreTxSource(fileStore, url, basePath, log, telemetry);
|
|
44
41
|
} catch (err) {
|
|
45
42
|
log.warn(`Error creating file store for URL: ${url}`, {
|
|
46
43
|
error: err
|
|
@@ -52,38 +49,31 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
52
49
|
return `file-store:${this.baseUrl}`;
|
|
53
50
|
}
|
|
54
51
|
async getTxsByHash(txHashes) {
|
|
55
|
-
const
|
|
56
|
-
const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
|
|
57
|
-
const timer = new Timer();
|
|
58
|
-
try {
|
|
59
|
-
const buffer = await this.fileStore.read(path);
|
|
60
|
-
const tx = Tx.fromBuffer(buffer);
|
|
61
|
-
return {
|
|
62
|
-
tx,
|
|
63
|
-
downloadDuration: timer.ms(),
|
|
64
|
-
downloadSize: buffer.length
|
|
65
|
-
};
|
|
66
|
-
} catch {
|
|
67
|
-
this.downloadsFailed.add(1);
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
}));
|
|
71
|
-
const txs = results.filter((tx)=>tx !== undefined);
|
|
72
|
-
const [validTxs, invalidTxs] = await partitionAsync(txs, async ({ tx, downloadDuration, downloadSize })=>{
|
|
73
|
-
const valid = await this.txValidator.validateTx(tx);
|
|
74
|
-
if (valid.result === 'valid') {
|
|
75
|
-
this.downloadsSuccess.add(1);
|
|
76
|
-
this.downloadDuration.record(Math.ceil(downloadDuration));
|
|
77
|
-
this.downloadSize.record(downloadSize);
|
|
78
|
-
return true;
|
|
79
|
-
} else {
|
|
80
|
-
this.downloadsFailed.add(1);
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
52
|
+
const invalidTxHashes = [];
|
|
84
53
|
return {
|
|
85
|
-
validTxs:
|
|
86
|
-
|
|
54
|
+
validTxs: (await Promise.all(txHashes.map(async (txHash)=>{
|
|
55
|
+
const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
|
|
56
|
+
const timer = new Timer();
|
|
57
|
+
try {
|
|
58
|
+
const buffer = await this.fileStore.read(path);
|
|
59
|
+
const tx = Tx.fromBuffer(buffer);
|
|
60
|
+
if (await tx.validateTxHash() && txHash.equals(tx.txHash)) {
|
|
61
|
+
this.downloadsSuccess.add(1);
|
|
62
|
+
this.downloadDuration.record(Math.ceil(timer.ms()));
|
|
63
|
+
this.downloadSize.record(buffer.length);
|
|
64
|
+
return tx;
|
|
65
|
+
} else {
|
|
66
|
+
invalidTxHashes.push(tx.txHash.toString());
|
|
67
|
+
this.downloadsFailed.add(1);
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
} catch {
|
|
71
|
+
// Tx not found or error reading - return undefined
|
|
72
|
+
this.downloadsFailed.add(1);
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
}))).filter((tx)=>tx !== undefined),
|
|
76
|
+
invalidTxHashes: invalidTxHashes
|
|
87
77
|
};
|
|
88
78
|
}
|
|
89
79
|
}
|
|
@@ -94,7 +84,7 @@ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
94
84
|
* @param log - Optional logger.
|
|
95
85
|
* @param telemetry - Optional telemetry client.
|
|
96
86
|
* @returns Array of successfully created FileStoreTxSource instances.
|
|
97
|
-
*/ export async function createFileStoreTxSources(urls, basePath,
|
|
98
|
-
const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath,
|
|
87
|
+
*/ export async function createFileStoreTxSources(urls, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
|
|
88
|
+
const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath, log, telemetry)));
|
|
99
89
|
return sources.filter((s)=>s !== undefined);
|
|
100
90
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
2
2
|
import { type AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
3
|
-
import type { Tx, TxHash
|
|
3
|
+
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
4
4
|
import { type ComponentsVersions } from '@aztec/stdlib/versioning';
|
|
5
5
|
export type TxSourceCollectionResult = {
|
|
6
6
|
validTxs: Tx[];
|
|
@@ -12,13 +12,12 @@ export interface TxSource {
|
|
|
12
12
|
}
|
|
13
13
|
export declare class NodeRpcTxSource implements TxSource {
|
|
14
14
|
private readonly client;
|
|
15
|
-
private readonly txValidator;
|
|
16
15
|
private readonly info;
|
|
17
|
-
constructor(client: Pick<AztecNode, 'getTxsByHash'>,
|
|
18
|
-
static fromUrl(nodeUrl: string,
|
|
16
|
+
constructor(client: Pick<AztecNode, 'getTxsByHash'>, info: string);
|
|
17
|
+
static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource;
|
|
19
18
|
getInfo(): string;
|
|
20
19
|
getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
|
|
21
20
|
private verifyTxs;
|
|
22
21
|
}
|
|
23
|
-
export declare function createNodeRpcTxSources(urls: string[],
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
export declare function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig): NodeRpcTxSource[];
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBbUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRyxNQUFNLE1BQU0sd0JBQXdCLEdBQUc7SUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUE7Q0FBRSxDQUFDO0FBRXJGLE1BQU0sV0FBVyxRQUFRO0lBQ3ZCLE9BQU8sSUFBSSxNQUFNLENBQUM7SUFDbEIsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztDQUNyRTtBQUVELHFCQUFhLGVBQWdCLFlBQVcsUUFBUTtJQUU1QyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBRnZCLFlBQ21CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUN2QyxJQUFJLEVBQUUsTUFBTSxFQUMzQjtJQUVKLE9BQWMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixHQUFHLGVBQWUsQ0FHcEY7SUFFTSxPQUFPLFdBRWI7SUFFWSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUUvRTtZQUVhLFNBQVM7Q0FnQnhCO0FBRUQsd0JBQWdCLHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHOUUifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAAG;IAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAGpF;IAEM,OAAO,WAEb;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAE/E;YAEa,SAAS;CAgBxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,qBAG9E"}
|
|
@@ -5,20 +5,18 @@ import { getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
|
|
|
5
5
|
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
6
6
|
export class NodeRpcTxSource {
|
|
7
7
|
client;
|
|
8
|
-
txValidator;
|
|
9
8
|
info;
|
|
10
|
-
constructor(client,
|
|
9
|
+
constructor(client, info){
|
|
11
10
|
this.client = client;
|
|
12
|
-
this.txValidator = txValidator;
|
|
13
11
|
this.info = info;
|
|
14
12
|
}
|
|
15
|
-
static fromUrl(nodeUrl,
|
|
13
|
+
static fromUrl(nodeUrl, versions) {
|
|
16
14
|
const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([
|
|
17
15
|
1,
|
|
18
16
|
2,
|
|
19
17
|
3
|
|
20
18
|
], false));
|
|
21
|
-
return new NodeRpcTxSource(client,
|
|
19
|
+
return new NodeRpcTxSource(client, nodeUrl);
|
|
22
20
|
}
|
|
23
21
|
getInfo() {
|
|
24
22
|
return this.info;
|
|
@@ -31,8 +29,8 @@ export class NodeRpcTxSource {
|
|
|
31
29
|
const validTxs = [];
|
|
32
30
|
const invalidTxHashes = [];
|
|
33
31
|
await Promise.all(txs.map(async (tx)=>{
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
32
|
+
const isValid = await tx.validateTxHash();
|
|
33
|
+
if (isValid) {
|
|
36
34
|
validTxs.push(tx);
|
|
37
35
|
} else {
|
|
38
36
|
invalidTxHashes.push(tx.getTxHash().toString());
|
|
@@ -44,7 +42,7 @@ export class NodeRpcTxSource {
|
|
|
44
42
|
};
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
|
-
export function createNodeRpcTxSources(urls,
|
|
45
|
+
export function createNodeRpcTxSources(urls, chainConfig) {
|
|
48
46
|
const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
|
|
49
|
-
return urls.map((url)=>NodeRpcTxSource.fromUrl(url,
|
|
47
|
+
return urls.map((url)=>NodeRpcTxSource.fromUrl(url, versions));
|
|
50
48
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0-aztecnr-rc.2",
|
|
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": "4.
|
|
71
|
-
"@aztec/epoch-cache": "4.
|
|
72
|
-
"@aztec/ethereum": "4.
|
|
73
|
-
"@aztec/foundation": "4.
|
|
74
|
-
"@aztec/kv-store": "4.
|
|
75
|
-
"@aztec/noir-contracts.js": "4.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "4.
|
|
77
|
-
"@aztec/protocol-contracts": "4.
|
|
78
|
-
"@aztec/simulator": "4.
|
|
79
|
-
"@aztec/stdlib": "4.
|
|
80
|
-
"@aztec/telemetry-client": "4.
|
|
70
|
+
"@aztec/constants": "4.2.0-aztecnr-rc.2",
|
|
71
|
+
"@aztec/epoch-cache": "4.2.0-aztecnr-rc.2",
|
|
72
|
+
"@aztec/ethereum": "4.2.0-aztecnr-rc.2",
|
|
73
|
+
"@aztec/foundation": "4.2.0-aztecnr-rc.2",
|
|
74
|
+
"@aztec/kv-store": "4.2.0-aztecnr-rc.2",
|
|
75
|
+
"@aztec/noir-contracts.js": "4.2.0-aztecnr-rc.2",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "4.2.0-aztecnr-rc.2",
|
|
77
|
+
"@aztec/protocol-contracts": "4.2.0-aztecnr-rc.2",
|
|
78
|
+
"@aztec/simulator": "4.2.0-aztecnr-rc.2",
|
|
79
|
+
"@aztec/stdlib": "4.2.0-aztecnr-rc.2",
|
|
80
|
+
"@aztec/telemetry-client": "4.2.0-aztecnr-rc.2",
|
|
81
81
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
82
82
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
83
83
|
"@chainsafe/libp2p-yamux": "^6.0.2",
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
"xxhash-wasm": "^1.1.0"
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
|
-
"@aztec/archiver": "4.
|
|
108
|
-
"@aztec/world-state": "4.
|
|
107
|
+
"@aztec/archiver": "4.2.0-aztecnr-rc.2",
|
|
108
|
+
"@aztec/world-state": "4.2.0-aztecnr-rc.2",
|
|
109
109
|
"@jest/globals": "^30.0.0",
|
|
110
110
|
"@types/jest": "^30.0.0",
|
|
111
111
|
"@types/node": "^22.15.17",
|
package/src/client/factory.ts
CHANGED
|
@@ -18,8 +18,9 @@ import type { MemPools } from '../mem_pools/interface.js';
|
|
|
18
18
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
19
19
|
import { AztecKVTxPoolV2 } from '../mem_pools/tx_pool_v2/tx_pool_v2.js';
|
|
20
20
|
import {
|
|
21
|
-
|
|
21
|
+
createCheckAllowedSetupCalls,
|
|
22
22
|
createTxValidatorForTransactionsEnteringPendingTxPool,
|
|
23
|
+
getDefaultAllowedSetupFunctions,
|
|
23
24
|
} from '../msg_validators/index.js';
|
|
24
25
|
import { DummyP2PService } from '../services/dummy_service.js';
|
|
25
26
|
import { LibP2PService } from '../services/index.js';
|
|
@@ -78,6 +79,33 @@ export async function createP2PClient(
|
|
|
78
79
|
const rollupAddress = inputConfig.l1Contracts.rollupAddress.toString().toLowerCase().replace(/^0x/, '');
|
|
79
80
|
const txFileStoreBasePath = `aztec-${inputConfig.l1ChainId}-${inputConfig.rollupVersion}-0x${rollupAddress}`;
|
|
80
81
|
|
|
82
|
+
const allowedInSetup = [
|
|
83
|
+
...(await getDefaultAllowedSetupFunctions()),
|
|
84
|
+
...(inputConfig.txPublicSetupAllowListExtend ?? []),
|
|
85
|
+
];
|
|
86
|
+
const checkAllowedSetupCalls = createCheckAllowedSetupCalls(
|
|
87
|
+
archiver,
|
|
88
|
+
allowedInSetup,
|
|
89
|
+
() => epochCache.getEpochAndSlotInNextL1Slot().ts,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const createTxValidator = async () => {
|
|
93
|
+
// We accept transactions if they are not expired by the next slot and block number (checked based on the ExpirationTimestamp field)
|
|
94
|
+
const currentBlockNumber = await archiver.getBlockNumber();
|
|
95
|
+
const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot();
|
|
96
|
+
const l1Constants = await archiver.getL1Constants();
|
|
97
|
+
return createTxValidatorForTransactionsEnteringPendingTxPool(
|
|
98
|
+
worldStateSynchronizer,
|
|
99
|
+
nextSlotTimestamp,
|
|
100
|
+
BlockNumber(currentBlockNumber + 1),
|
|
101
|
+
{
|
|
102
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
103
|
+
maxBlockL2Gas: config.validateMaxL2BlockGas,
|
|
104
|
+
maxBlockDAGas: config.validateMaxDABlockGas,
|
|
105
|
+
},
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
|
|
81
109
|
const txPool =
|
|
82
110
|
deps.txPool ??
|
|
83
111
|
new AztecKVTxPoolV2(
|
|
@@ -86,22 +114,8 @@ export async function createP2PClient(
|
|
|
86
114
|
{
|
|
87
115
|
l2BlockSource: archiver,
|
|
88
116
|
worldStateSynchronizer,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const currentBlockNumber = await archiver.getBlockNumber();
|
|
92
|
-
const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot();
|
|
93
|
-
const l1Constants = await archiver.getL1Constants();
|
|
94
|
-
return createTxValidatorForTransactionsEnteringPendingTxPool(
|
|
95
|
-
worldStateSynchronizer,
|
|
96
|
-
nextSlotTimestamp,
|
|
97
|
-
BlockNumber(currentBlockNumber + 1),
|
|
98
|
-
{
|
|
99
|
-
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
100
|
-
maxBlockL2Gas: config.validateMaxL2BlockGas,
|
|
101
|
-
maxBlockDAGas: config.validateMaxDABlockGas,
|
|
102
|
-
},
|
|
103
|
-
);
|
|
104
|
-
},
|
|
117
|
+
checkAllowedSetupCalls,
|
|
118
|
+
createTxValidator,
|
|
105
119
|
},
|
|
106
120
|
telemetry,
|
|
107
121
|
{
|
|
@@ -133,12 +147,9 @@ export async function createP2PClient(
|
|
|
133
147
|
telemetry,
|
|
134
148
|
);
|
|
135
149
|
|
|
136
|
-
const txValidatorForTxCollection = createTxValidatorForReqResponseReceivedTxs(proofVerifier, config);
|
|
137
150
|
const nodeSources = [
|
|
138
|
-
...createNodeRpcTxSources(config.txCollectionNodeRpcUrls,
|
|
139
|
-
...(deps.rpcTxProviders ?? []).map(
|
|
140
|
-
(node, i) => new NodeRpcTxSource(node, txValidatorForTxCollection, `node-rpc-provider-${i}`),
|
|
141
|
-
),
|
|
151
|
+
...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, config),
|
|
152
|
+
...(deps.rpcTxProviders ?? []).map((node, i) => new NodeRpcTxSource(node, `node-rpc-provider-${i}`)),
|
|
142
153
|
...(deps.txCollectionNodeSources ?? []),
|
|
143
154
|
];
|
|
144
155
|
if (nodeSources.length > 0) {
|
|
@@ -150,7 +161,6 @@ export async function createP2PClient(
|
|
|
150
161
|
const fileStoreSources = await createFileStoreTxSources(
|
|
151
162
|
config.txCollectionFileStoreUrls,
|
|
152
163
|
txFileStoreBasePath,
|
|
153
|
-
txValidatorForTxCollection,
|
|
154
164
|
logger.createChild('file-store-tx-source'),
|
|
155
165
|
telemetry,
|
|
156
166
|
);
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -669,20 +669,27 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
669
669
|
}
|
|
670
670
|
|
|
671
671
|
/**
|
|
672
|
-
* Returns true if the prune
|
|
673
|
-
* If the
|
|
674
|
-
* If they differ, the prune spans across checkpoints (epoch prune).
|
|
672
|
+
* Returns true if the prune is an epoch prune (new checkpoint number is less than old).
|
|
673
|
+
* If the checkpoint number stays the same or increases, the prune is within a checkpoint.
|
|
675
674
|
*/
|
|
676
675
|
private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
|
|
677
676
|
const tips = await this.l2Tips.getL2Tips();
|
|
678
677
|
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
679
|
-
if (oldCheckpointNumber <= CheckpointNumber.
|
|
678
|
+
if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
|
|
680
679
|
return false;
|
|
681
680
|
}
|
|
682
681
|
const newCheckpointNumber = newCheckpoint.number;
|
|
683
|
-
|
|
682
|
+
// We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
|
|
683
|
+
// To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
|
|
684
|
+
// This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
|
|
685
|
+
const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
|
|
686
|
+
const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
|
|
684
687
|
if (isEpochPrune) {
|
|
685
|
-
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
688
|
+
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
689
|
+
oldCheckpointNumber,
|
|
690
|
+
newCheckpointNumber,
|
|
691
|
+
thresholdForEpochPrune,
|
|
692
|
+
});
|
|
686
693
|
}
|
|
687
694
|
return isEpochPrune;
|
|
688
695
|
}
|
|
@@ -32,10 +32,11 @@ export class FeePayerBalanceEvictionRule implements EvictionRule {
|
|
|
32
32
|
|
|
33
33
|
if (context.event === EvictionEvent.BLOCK_MINED) {
|
|
34
34
|
const blockNumber = context.block.getBlockNumber();
|
|
35
|
+
const blockHash = await context.block.hash();
|
|
35
36
|
// Ensure world state is synced to this block before accessing the snapshot.
|
|
36
37
|
// This handles the race where a block is added to the archiver
|
|
37
38
|
// but the world state hasn't synced it yet.
|
|
38
|
-
await this.worldState.syncImmediate(blockNumber);
|
|
39
|
+
await this.worldState.syncImmediate(blockNumber, blockHash);
|
|
39
40
|
return await this.evictForFeePayers(context.feePayers, this.worldState.getSnapshot(blockNumber), txPool);
|
|
40
41
|
}
|
|
41
42
|
|
|
@@ -29,7 +29,8 @@ export class FeePayerBalanceEvictionRule implements EvictionRule {
|
|
|
29
29
|
|
|
30
30
|
if (context.event === EvictionEvent.BLOCK_MINED) {
|
|
31
31
|
const blockNumber = context.block.getBlockNumber();
|
|
32
|
-
await
|
|
32
|
+
const blockHash = await context.block.hash();
|
|
33
|
+
await this.worldState.syncImmediate(blockNumber, blockHash);
|
|
33
34
|
return await this.evictForFeePayers(context.feePayers, this.worldState.getSnapshot(blockNumber), pool);
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -69,6 +69,8 @@ export type TxPoolV2Dependencies = {
|
|
|
69
69
|
worldStateSynchronizer: WorldStateSynchronizer;
|
|
70
70
|
/** Factory that creates a validator for re-validating pool transactions using metadata */
|
|
71
71
|
createTxValidator: () => Promise<TxValidator<TxMetaData>>;
|
|
72
|
+
/** Checks whether a tx's setup-phase calls are on the allow list. Precomputed at receipt time. */
|
|
73
|
+
checkAllowedSetupCalls: (tx: Tx) => Promise<boolean>;
|
|
72
74
|
};
|
|
73
75
|
|
|
74
76
|
/**
|
|
@@ -67,6 +67,9 @@ export type TxMetaData = {
|
|
|
67
67
|
/** Timestamp by which the transaction must be included (for expiration checks) */
|
|
68
68
|
readonly expirationTimestamp: bigint;
|
|
69
69
|
|
|
70
|
+
/** Whether the tx's setup-phase calls pass the allow list check. Computed at receipt time. */
|
|
71
|
+
readonly allowedSetupCalls: boolean;
|
|
72
|
+
|
|
70
73
|
/** Validator-compatible data, providing the same access patterns as Tx.data */
|
|
71
74
|
readonly data: TxMetaValidationData;
|
|
72
75
|
|
|
@@ -84,8 +87,12 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
|
|
|
84
87
|
* Builds TxMetaData from a full Tx object.
|
|
85
88
|
* Extracts all relevant fields for efficient in-memory storage and querying.
|
|
86
89
|
* Fr values are captured in closures for zero-cost re-validation.
|
|
90
|
+
*
|
|
91
|
+
* @param allowedSetupCalls - Whether the tx's setup-phase calls pass the allow list.
|
|
92
|
+
* For gossip/RPC txs this is always `true` (already validated by PhasesTxValidator).
|
|
93
|
+
* For req/resp txs this should be computed by the caller using the phases validator.
|
|
87
94
|
*/
|
|
88
|
-
export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
|
|
95
|
+
export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true): Promise<TxMetaData> {
|
|
89
96
|
const txHashObj = tx.getTxHash();
|
|
90
97
|
const txHash = txHashObj.toString();
|
|
91
98
|
const txHashBigInt = txHashObj.toBigInt();
|
|
@@ -112,6 +119,7 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
|
|
|
112
119
|
feeLimit,
|
|
113
120
|
nullifiers,
|
|
114
121
|
expirationTimestamp,
|
|
122
|
+
allowedSetupCalls,
|
|
115
123
|
receivedAt: 0,
|
|
116
124
|
estimatedSizeBytes,
|
|
117
125
|
data: {
|
|
@@ -304,6 +312,7 @@ export function stubTxMetaData(
|
|
|
304
312
|
nullifiers?: string[];
|
|
305
313
|
expirationTimestamp?: bigint;
|
|
306
314
|
anchorBlockHeaderHash?: string;
|
|
315
|
+
allowedSetupCalls?: boolean;
|
|
307
316
|
} = {},
|
|
308
317
|
): TxMetaData {
|
|
309
318
|
const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
|
|
@@ -320,6 +329,7 @@ export function stubTxMetaData(
|
|
|
320
329
|
feeLimit: overrides.feeLimit ?? 100n,
|
|
321
330
|
nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
|
|
322
331
|
expirationTimestamp,
|
|
332
|
+
allowedSetupCalls: overrides.allowedSetupCalls ?? true,
|
|
323
333
|
receivedAt: 0,
|
|
324
334
|
estimatedSizeBytes: 0,
|
|
325
335
|
data: stubTxMetaValidationData({ expirationTimestamp }),
|
|
@@ -11,7 +11,14 @@ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-clien
|
|
|
11
11
|
import EventEmitter from 'node:events';
|
|
12
12
|
|
|
13
13
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
14
|
-
import type {
|
|
14
|
+
import type {
|
|
15
|
+
AddTxsResult,
|
|
16
|
+
PoolReadAccess,
|
|
17
|
+
TxPoolV2,
|
|
18
|
+
TxPoolV2Config,
|
|
19
|
+
TxPoolV2Dependencies,
|
|
20
|
+
TxPoolV2Events,
|
|
21
|
+
} from './interfaces.js';
|
|
15
22
|
import type { TxState } from './tx_metadata.js';
|
|
16
23
|
import { TxPoolV2Impl } from './tx_pool_v2_impl.js';
|
|
17
24
|
|
|
@@ -162,6 +169,11 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
|
|
|
162
169
|
return this.#queue.put(() => Promise.resolve(this.#impl.getLowestPriorityPending(limit)));
|
|
163
170
|
}
|
|
164
171
|
|
|
172
|
+
/** Returns read-only access to the pool. Used for testing. */
|
|
173
|
+
getPoolReadAccess(): PoolReadAccess {
|
|
174
|
+
return this.#impl.getPoolReadAccess();
|
|
175
|
+
}
|
|
176
|
+
|
|
165
177
|
// === Configuration ===
|
|
166
178
|
|
|
167
179
|
updateConfig(config: Partial<TxPoolV2Config>): Promise<void> {
|