@aztec/p2p 0.55.0 → 0.55.1
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/index.d.ts +2 -2
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +43 -38
- package/dest/config.d.ts +49 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +66 -2
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/service/libp2p_service.d.ts +10 -11
- package/dest/service/libp2p_service.d.ts.map +1 -1
- package/dest/service/libp2p_service.js +103 -18
- package/dest/service/peer_manager.d.ts +9 -13
- package/dest/service/peer_manager.d.ts.map +1 -1
- package/dest/service/peer_manager.js +15 -1
- package/dest/service/peer_scoring.d.ts +32 -0
- package/dest/service/peer_scoring.d.ts.map +1 -0
- package/dest/service/peer_scoring.js +67 -0
- package/dest/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/tx_validator/aggregate_tx_validator.js +23 -0
- package/dest/tx_validator/data_validator.d.ts +6 -0
- package/dest/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/tx_validator/data_validator.js +47 -0
- package/dest/tx_validator/double_spend_validator.d.ts +12 -0
- package/dest/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/tx_validator/double_spend_validator.js +53 -0
- package/dest/tx_validator/index.d.ts +6 -0
- package/dest/tx_validator/index.d.ts.map +1 -0
- package/dest/tx_validator/index.js +6 -0
- package/dest/tx_validator/metadata_validator.d.ts +10 -0
- package/dest/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/tx_validator/metadata_validator.js +50 -0
- package/dest/tx_validator/tx_proof_validator.d.ts +9 -0
- package/dest/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/tx_validator/tx_proof_validator.js +29 -0
- package/dest/util.d.ts +7 -0
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +1 -1
- package/package.json +6 -6
- package/src/client/index.ts +65 -47
- package/src/config.ts +127 -0
- package/src/index.ts +1 -0
- package/src/service/libp2p_service.ts +137 -24
- package/src/service/peer_manager.ts +23 -4
- package/src/service/peer_scoring.ts +81 -0
- package/src/tx_validator/aggregate_tx_validator.ts +24 -0
- package/src/tx_validator/data_validator.ts +61 -0
- package/src/tx_validator/double_spend_validator.ts +65 -0
- package/src/tx_validator/index.ts +5 -0
- package/src/tx_validator/metadata_validator.ts +61 -0
- package/src/tx_validator/tx_proof_validator.ts +28 -0
- package/src/util.ts +8 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var _DoubleSpendTxValidator_instances, _DoubleSpendTxValidator_log, _DoubleSpendTxValidator_nullifierSource, _DoubleSpendTxValidator_uniqueNullifiers;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { Fr } from '@aztec/circuits.js';
|
|
5
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
+
export class DoubleSpendTxValidator {
|
|
7
|
+
constructor(nullifierSource, isValidatingBlock = true) {
|
|
8
|
+
_DoubleSpendTxValidator_instances.add(this);
|
|
9
|
+
this.isValidatingBlock = isValidatingBlock;
|
|
10
|
+
_DoubleSpendTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_double_spend'));
|
|
11
|
+
_DoubleSpendTxValidator_nullifierSource.set(this, void 0);
|
|
12
|
+
__classPrivateFieldSet(this, _DoubleSpendTxValidator_nullifierSource, nullifierSource, "f");
|
|
13
|
+
}
|
|
14
|
+
async validateTxs(txs) {
|
|
15
|
+
const validTxs = [];
|
|
16
|
+
const invalidTxs = [];
|
|
17
|
+
const thisBlockNullifiers = new Set();
|
|
18
|
+
for (const tx of txs) {
|
|
19
|
+
if (!(await __classPrivateFieldGet(this, _DoubleSpendTxValidator_instances, "m", _DoubleSpendTxValidator_uniqueNullifiers).call(this, tx, thisBlockNullifiers))) {
|
|
20
|
+
invalidTxs.push(tx);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
validTxs.push(tx);
|
|
24
|
+
}
|
|
25
|
+
return [validTxs, invalidTxs];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
_DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSource = new WeakMap(), _DoubleSpendTxValidator_instances = new WeakSet(), _DoubleSpendTxValidator_uniqueNullifiers = async function _DoubleSpendTxValidator_uniqueNullifiers(tx, thisBlockNullifiers) {
|
|
29
|
+
const nullifiers = tx.data.getNonEmptyNullifiers().map(x => x.toBigInt());
|
|
30
|
+
// Ditch this tx if it has repeated nullifiers
|
|
31
|
+
const uniqueNullifiers = new Set(nullifiers);
|
|
32
|
+
if (uniqueNullifiers.size !== nullifiers.length) {
|
|
33
|
+
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (this.isValidatingBlock) {
|
|
37
|
+
for (const nullifier of nullifiers) {
|
|
38
|
+
if (thisBlockNullifiers.has(nullifier)) {
|
|
39
|
+
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
thisBlockNullifiers.add(nullifier);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const nullifierIndexes = await Promise.all(nullifiers.map(n => __classPrivateFieldGet(this, _DoubleSpendTxValidator_nullifierSource, "f").getNullifierIndex(new Fr(n))));
|
|
46
|
+
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
47
|
+
if (hasDuplicates) {
|
|
48
|
+
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZG91YmxlX3NwZW5kX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTTFELE1BQU0sT0FBTyxzQkFBc0I7SUFJakMsWUFBWSxlQUFnQyxFQUFtQixvQkFBNkIsSUFBSTs7UUFBakMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFnQjtRQUhoRyxzQ0FBTyxpQkFBaUIsQ0FBQyw4Q0FBOEMsQ0FBQyxFQUFDO1FBQ3pFLDBEQUFrQztRQUdoQyx1QkFBQSxJQUFJLDJDQUFvQixlQUFlLE1BQUEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFRO1FBQ3hCLE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRTlDLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLENBQUMsTUFBTSx1QkFBQSxJQUFJLG1GQUFrQixNQUF0QixJQUFJLEVBQW1CLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEIsU0FBUztZQUNYLENBQUM7WUFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FpQ0Y7b01BL0JDLEtBQUssbURBQW1CLEVBQVMsRUFBRSxtQkFBZ0M7SUFDakUsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRTFFLDhDQUE4QztJQUM5QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRCx1QkFBQSxJQUFJLG1DQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxJQUFJLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN2Qyx1QkFBQSxJQUFJLG1DQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2dCQUM3RixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsdUJBQUEsSUFBSSwrQ0FBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwSCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUUsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQix1QkFBQSxJQUFJLG1DQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tx_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './aggregate_tx_validator.js';
|
|
2
|
+
export * from './data_validator.js';
|
|
3
|
+
export * from './double_spend_validator.js';
|
|
4
|
+
export * from './metadata_validator.js';
|
|
5
|
+
export * from './tx_proof_validator.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AnyTx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type Fr } from '@aztec/circuits.js';
|
|
3
|
+
export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
4
|
+
#private;
|
|
5
|
+
private chainId;
|
|
6
|
+
private blockNumber;
|
|
7
|
+
constructor(chainId: Fr, blockNumber: Fr);
|
|
8
|
+
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=metadata_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAG7C,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAG7D,OAAO,CAAC,OAAO;IAAM,OAAO,CAAC,WAAW;gBAAhC,OAAO,EAAE,EAAE,EAAU,WAAW,EAAE,EAAE;IAExD,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CAmDjE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var _MetadataTxValidator_instances, _MetadataTxValidator_log, _MetadataTxValidator_hasCorrectChainId, _MetadataTxValidator_isValidForBlockNumber;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
export class MetadataTxValidator {
|
|
6
|
+
constructor(chainId, blockNumber) {
|
|
7
|
+
_MetadataTxValidator_instances.add(this);
|
|
8
|
+
this.chainId = chainId;
|
|
9
|
+
this.blockNumber = blockNumber;
|
|
10
|
+
_MetadataTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_metadata'));
|
|
11
|
+
}
|
|
12
|
+
validateTxs(txs) {
|
|
13
|
+
const validTxs = [];
|
|
14
|
+
const invalidTxs = [];
|
|
15
|
+
for (const tx of txs) {
|
|
16
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_hasCorrectChainId).call(this, tx)) {
|
|
17
|
+
invalidTxs.push(tx);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_isValidForBlockNumber).call(this, tx)) {
|
|
21
|
+
invalidTxs.push(tx);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
validTxs.push(tx);
|
|
25
|
+
}
|
|
26
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
_MetadataTxValidator_log = new WeakMap(), _MetadataTxValidator_instances = new WeakSet(), _MetadataTxValidator_hasCorrectChainId = function _MetadataTxValidator_hasCorrectChainId(tx) {
|
|
30
|
+
if (!tx.data.constants.txContext.chainId.equals(this.chainId)) {
|
|
31
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${this.chainId.toNumber()}`);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}, _MetadataTxValidator_isValidForBlockNumber = function _MetadataTxValidator_isValidForBlockNumber(tx) {
|
|
38
|
+
const target = tx instanceof Tx
|
|
39
|
+
? tx.data.forRollup?.rollupValidationRequests || tx.data.forPublic.validationRequests.forRollup
|
|
40
|
+
: tx.data.rollupValidationRequests;
|
|
41
|
+
const maxBlockNumber = target.maxBlockNumber;
|
|
42
|
+
if (maxBlockNumber.isSome && maxBlockNumber.value < this.blockNumber) {
|
|
43
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for low max block number. Tx max block number: ${maxBlockNumber.value}, current block number: ${this.blockNumber}.`);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGFfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9tZXRhZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxtQkFBbUI7SUFHOUIsWUFBb0IsT0FBVyxFQUFVLFdBQWU7O1FBQXBDLFlBQU8sR0FBUCxPQUFPLENBQUk7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBSTtRQUZ4RCxtQ0FBTyxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxFQUFDO0lBRVYsQ0FBQztJQUU1RCxXQUFXLENBQUMsR0FBUTtRQUNsQixNQUFNLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLHVCQUFBLElBQUksOEVBQW1CLE1BQXZCLElBQUksRUFBb0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEIsU0FBUztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsdUJBQUEsSUFBSSxrRkFBdUIsTUFBM0IsSUFBSSxFQUF3QixFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FpQ0Y7bUxBL0JvQixFQUFLO0lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5RCx1QkFBQSxJQUFJLGdDQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUN4QixFQUFFLENBQ0gsK0JBQStCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUMvRyxDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsbUdBRXNCLEVBQUs7SUFDMUIsTUFBTSxNQUFNLEdBQ1YsRUFBRSxZQUFZLEVBQUU7UUFDZCxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsd0JBQXdCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsa0JBQWtCLENBQUMsU0FBUztRQUNoRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUN2QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0lBRTdDLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRSx1QkFBQSxJQUFJLGdDQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxtREFDNUIsY0FBYyxDQUFDLEtBQ2pCLDJCQUEyQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQy9DLENBQUM7UUFDRixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ClientProtocolCircuitVerifier, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
export declare class TxProofValidator implements TxValidator<Tx> {
|
|
3
|
+
#private;
|
|
4
|
+
private verifier;
|
|
5
|
+
constructor(verifier: ClientProtocolCircuitVerifier);
|
|
6
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
|
|
7
|
+
validateTx(tx: Tx): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=tx_proof_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_proof_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_proof_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,6BAA6B,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGhG,qBAAa,gBAAiB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG1C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,6BAA6B;IAErD,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAgBzE,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAGrC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var _TxProofValidator_log;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
export class TxProofValidator {
|
|
6
|
+
constructor(verifier) {
|
|
7
|
+
this.verifier = verifier;
|
|
8
|
+
_TxProofValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:private_proof'));
|
|
9
|
+
}
|
|
10
|
+
async validateTxs(txs) {
|
|
11
|
+
const validTxs = [];
|
|
12
|
+
const invalidTxs = [];
|
|
13
|
+
for (const tx of txs) {
|
|
14
|
+
if (await this.verifier.verifyProof(tx)) {
|
|
15
|
+
validTxs.push(tx);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
__classPrivateFieldGet(this, _TxProofValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for invalid proof`);
|
|
19
|
+
invalidTxs.push(tx);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return [validTxs, invalidTxs];
|
|
23
|
+
}
|
|
24
|
+
validateTx(tx) {
|
|
25
|
+
return this.verifier.verifyProof(tx);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
_TxProofValidator_log = new WeakMap();
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcHJvb2ZfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci90eF9wcm9vZl92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQXNDLEVBQUUsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRzNCLFlBQW9CLFFBQXVDO1FBQXZDLGFBQVEsR0FBUixRQUFRLENBQStCO1FBRjNELGdDQUFPLGlCQUFpQixDQUFDLDRDQUE0QyxDQUFDLEVBQUM7SUFFVCxDQUFDO0lBRS9ELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHVCQUFBLElBQUksNkJBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ25FLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIn0=
|
package/dest/util.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
|
|
2
|
+
import type { Libp2p } from 'libp2p';
|
|
3
|
+
export interface PubSubLibp2p extends Libp2p {
|
|
4
|
+
services: {
|
|
5
|
+
pubsub: GossipSub;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
1
8
|
/**
|
|
2
9
|
* Converts an address string to a multiaddr string.
|
|
3
10
|
* Example usage:
|
package/dest/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,QAAQ,EAAE;QACR,MAAM,EAAE,SAAS,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CASnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhF"}
|
package/dest/util.js
CHANGED
|
@@ -75,4 +75,4 @@ function addressToMultiAddressType(address) {
|
|
|
75
75
|
return 'dns';
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFTdkM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFFBQXVCO0lBQ3pFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXRELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELElBQUksZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLGlCQUEwQjtJQUMxRSxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLElBQVksQ0FBQztJQUVqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QiwyQ0FBMkM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sb0NBQW9DLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFlO1FBQ2YsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVc7SUFDL0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMxRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxPQUFlO0lBQzdELE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELElBQUksZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsMkVBQTJFO0FBQzNFLFNBQVMseUJBQXlCLENBQUMsT0FBZTtJQUNoRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.55.
|
|
3
|
+
"version": "0.55.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -56,11 +56,11 @@
|
|
|
56
56
|
"testTimeout": 15000
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/circuit-types": "0.55.
|
|
60
|
-
"@aztec/circuits.js": "0.55.
|
|
61
|
-
"@aztec/foundation": "0.55.
|
|
62
|
-
"@aztec/kv-store": "0.55.
|
|
63
|
-
"@aztec/telemetry-client": "0.55.
|
|
59
|
+
"@aztec/circuit-types": "0.55.1",
|
|
60
|
+
"@aztec/circuits.js": "0.55.1",
|
|
61
|
+
"@aztec/foundation": "0.55.1",
|
|
62
|
+
"@aztec/kv-store": "0.55.1",
|
|
63
|
+
"@aztec/telemetry-client": "0.55.1",
|
|
64
64
|
"@chainsafe/discv5": "9.0.0",
|
|
65
65
|
"@chainsafe/enr": "3.0.0",
|
|
66
66
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
package/src/client/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ClientProtocolCircuitVerifier, L2BlockSource, WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
4
4
|
import { type DataStoreConfig, createStore } from '@aztec/kv-store/utils';
|
|
@@ -17,69 +17,87 @@ import { getPublicIp, resolveAddressIfNecessary, splitAddressPort } from '../uti
|
|
|
17
17
|
export * from './p2p_client.js';
|
|
18
18
|
|
|
19
19
|
export const createP2PClient = async (
|
|
20
|
-
|
|
20
|
+
_config: P2PConfig & DataStoreConfig,
|
|
21
21
|
attestationsPool: AttestationPool,
|
|
22
22
|
l2BlockSource: L2BlockSource,
|
|
23
|
+
proofVerifier: ClientProtocolCircuitVerifier,
|
|
24
|
+
worldStateSynchronizer: WorldStateSynchronizer,
|
|
23
25
|
telemetry: TelemetryClient = new NoopTelemetryClient(),
|
|
24
26
|
deps: { txPool?: TxPool; store?: AztecKVStore } = {},
|
|
25
27
|
) => {
|
|
28
|
+
let config = { ..._config };
|
|
26
29
|
const store = deps.store ?? (await createStore('p2p', config, createDebugLogger('aztec:p2p:lmdb')));
|
|
27
30
|
const txPool = deps.txPool ?? new AztecKVTxPool(store, telemetry);
|
|
28
31
|
|
|
29
32
|
let p2pService;
|
|
30
33
|
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const {
|
|
35
|
-
tcpAnnounceAddress: configTcpAnnounceAddress,
|
|
36
|
-
udpAnnounceAddress: configUdpAnnounceAddress,
|
|
37
|
-
queryForIp,
|
|
38
|
-
} = config;
|
|
39
|
-
|
|
40
|
-
config.tcpAnnounceAddress = configTcpAnnounceAddress
|
|
41
|
-
? await resolveAddressIfNecessary(configTcpAnnounceAddress)
|
|
42
|
-
: undefined;
|
|
43
|
-
config.udpAnnounceAddress = configUdpAnnounceAddress
|
|
44
|
-
? await resolveAddressIfNecessary(configUdpAnnounceAddress)
|
|
45
|
-
: undefined;
|
|
46
|
-
|
|
47
|
-
// create variable for re-use if needed
|
|
48
|
-
let publicIp;
|
|
49
|
-
|
|
50
|
-
// check if no announce IP was provided
|
|
51
|
-
const splitTcpAnnounceAddress = splitAddressPort(configTcpAnnounceAddress || '', true);
|
|
52
|
-
if (splitTcpAnnounceAddress.length == 2 && splitTcpAnnounceAddress[0] === '') {
|
|
53
|
-
if (queryForIp) {
|
|
54
|
-
publicIp = await getPublicIp();
|
|
55
|
-
const tcpAnnounceAddress = `${publicIp}:${splitTcpAnnounceAddress[1]}`;
|
|
56
|
-
config.tcpAnnounceAddress = tcpAnnounceAddress;
|
|
57
|
-
} else {
|
|
58
|
-
throw new Error(
|
|
59
|
-
`Invalid announceTcpAddress provided: ${configTcpAnnounceAddress}. Expected format: <addr>:<port>`,
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const splitUdpAnnounceAddress = splitAddressPort(configUdpAnnounceAddress || '', true);
|
|
65
|
-
if (splitUdpAnnounceAddress.length == 2 && splitUdpAnnounceAddress[0] === '') {
|
|
66
|
-
// If announceUdpAddress is not provided, use announceTcpAddress
|
|
67
|
-
if (!queryForIp && config.tcpAnnounceAddress) {
|
|
68
|
-
config.udpAnnounceAddress = config.tcpAnnounceAddress;
|
|
69
|
-
} else if (queryForIp) {
|
|
70
|
-
const udpPublicIp = publicIp || (await getPublicIp());
|
|
71
|
-
const udpAnnounceAddress = `${udpPublicIp}:${splitUdpAnnounceAddress[1]}`;
|
|
72
|
-
config.udpAnnounceAddress = udpAnnounceAddress;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
34
|
+
if (_config.p2pEnabled) {
|
|
35
|
+
config = await configureP2PClientAddresses(_config);
|
|
75
36
|
|
|
76
37
|
// Create peer discovery service
|
|
77
38
|
const peerId = await createLibP2PPeerId(config.peerIdPrivateKey);
|
|
78
39
|
const discoveryService = new DiscV5Service(peerId, config);
|
|
79
40
|
|
|
80
|
-
p2pService = await LibP2PService.new(
|
|
41
|
+
p2pService = await LibP2PService.new(
|
|
42
|
+
config,
|
|
43
|
+
discoveryService,
|
|
44
|
+
peerId,
|
|
45
|
+
txPool,
|
|
46
|
+
attestationsPool,
|
|
47
|
+
l2BlockSource,
|
|
48
|
+
proofVerifier,
|
|
49
|
+
worldStateSynchronizer,
|
|
50
|
+
store,
|
|
51
|
+
);
|
|
81
52
|
} else {
|
|
82
53
|
p2pService = new DummyP2PService();
|
|
83
54
|
}
|
|
84
55
|
return new P2PClient(store, l2BlockSource, txPool, attestationsPool, p2pService, config.keepProvenTxsInPoolFor);
|
|
85
56
|
};
|
|
57
|
+
|
|
58
|
+
async function configureP2PClientAddresses(_config: P2PConfig & DataStoreConfig): Promise<P2PConfig & DataStoreConfig> {
|
|
59
|
+
const config = { ..._config };
|
|
60
|
+
const {
|
|
61
|
+
tcpAnnounceAddress: configTcpAnnounceAddress,
|
|
62
|
+
udpAnnounceAddress: configUdpAnnounceAddress,
|
|
63
|
+
queryForIp,
|
|
64
|
+
} = config;
|
|
65
|
+
|
|
66
|
+
config.tcpAnnounceAddress = configTcpAnnounceAddress
|
|
67
|
+
? await resolveAddressIfNecessary(configTcpAnnounceAddress)
|
|
68
|
+
: undefined;
|
|
69
|
+
config.udpAnnounceAddress = configUdpAnnounceAddress
|
|
70
|
+
? await resolveAddressIfNecessary(configUdpAnnounceAddress)
|
|
71
|
+
: undefined;
|
|
72
|
+
|
|
73
|
+
// create variable for re-use if needed
|
|
74
|
+
let publicIp;
|
|
75
|
+
|
|
76
|
+
// check if no announce IP was provided
|
|
77
|
+
const splitTcpAnnounceAddress = splitAddressPort(configTcpAnnounceAddress || '', true);
|
|
78
|
+
if (splitTcpAnnounceAddress.length == 2 && splitTcpAnnounceAddress[0] === '') {
|
|
79
|
+
if (queryForIp) {
|
|
80
|
+
publicIp = await getPublicIp();
|
|
81
|
+
const tcpAnnounceAddress = `${publicIp}:${splitTcpAnnounceAddress[1]}`;
|
|
82
|
+
config.tcpAnnounceAddress = tcpAnnounceAddress;
|
|
83
|
+
} else {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Invalid announceTcpAddress provided: ${configTcpAnnounceAddress}. Expected format: <addr>:<port>`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const splitUdpAnnounceAddress = splitAddressPort(configUdpAnnounceAddress || '', true);
|
|
91
|
+
if (splitUdpAnnounceAddress.length == 2 && splitUdpAnnounceAddress[0] === '') {
|
|
92
|
+
// If announceUdpAddress is not provided, use announceTcpAddress
|
|
93
|
+
if (!queryForIp && config.tcpAnnounceAddress) {
|
|
94
|
+
config.udpAnnounceAddress = config.tcpAnnounceAddress;
|
|
95
|
+
} else if (queryForIp) {
|
|
96
|
+
const udpPublicIp = publicIp || (await getPublicIp());
|
|
97
|
+
const udpAnnounceAddress = `${udpPublicIp}:${splitUdpAnnounceAddress[1]}`;
|
|
98
|
+
config.udpAnnounceAddress = udpAnnounceAddress;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return config;
|
|
103
|
+
}
|
package/src/config.ts
CHANGED
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
type ConfigMappingsType,
|
|
3
3
|
booleanConfigHelper,
|
|
4
4
|
getConfigFromMappings,
|
|
5
|
+
getDefaultConfig,
|
|
5
6
|
numberConfigHelper,
|
|
6
7
|
pickConfigMappings,
|
|
7
8
|
} from '@aztec/foundation/config';
|
|
@@ -89,6 +90,66 @@ export interface P2PConfig extends P2PReqRespConfig {
|
|
|
89
90
|
|
|
90
91
|
/** How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven) */
|
|
91
92
|
keepProvenTxsInPoolFor: number;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The interval of the gossipsub heartbeat to perform maintenance tasks.
|
|
96
|
+
*/
|
|
97
|
+
gossipsubInterval: number;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The D parameter for the gossipsub protocol.
|
|
101
|
+
*/
|
|
102
|
+
gossipsubD: number;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The Dlo parameter for the gossipsub protocol.
|
|
106
|
+
*/
|
|
107
|
+
gossipsubDlo: number;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The Dhi parameter for the gossipsub protocol.
|
|
111
|
+
*/
|
|
112
|
+
gossipsubDhi: number;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The number of gossipsub interval message cache windows to keep.
|
|
116
|
+
*/
|
|
117
|
+
gossipsubMcacheLength: number;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* How many message cache windows to include when gossiping with other pears.
|
|
121
|
+
*/
|
|
122
|
+
gossipsubMcacheGossip: number;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The 'age' (in # of L2 blocks) of a processed tx after which we heavily penalize a peer for re-sending it.
|
|
126
|
+
*/
|
|
127
|
+
severePeerPenaltyBlockLength: number;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The weight of the tx topic for the gossipsub protocol. This determines how much the score for this specific topic contributes to the overall peer score.
|
|
131
|
+
*/
|
|
132
|
+
gossipsubTxTopicWeight: number;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* This is the weight applied to the penalty for delivering invalid messages.
|
|
136
|
+
*/
|
|
137
|
+
gossipsubTxInvalidMessageDeliveriesWeight: number;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* determines how quickly the penalty for invalid message deliveries decays over time. Between 0 and 1.
|
|
141
|
+
*/
|
|
142
|
+
gossipsubTxInvalidMessageDeliveriesDecay: number;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The values for the peer scoring system. Passed as a comma separated list of values in order: low, mid, high tolerance errors.
|
|
146
|
+
*/
|
|
147
|
+
peerPenaltyValues: number[];
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* The chain id of the L1 chain.
|
|
151
|
+
*/
|
|
152
|
+
l1ChainId: number;
|
|
92
153
|
}
|
|
93
154
|
|
|
94
155
|
export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
@@ -172,6 +233,68 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
172
233
|
'How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven)',
|
|
173
234
|
...numberConfigHelper(0),
|
|
174
235
|
},
|
|
236
|
+
gossipsubInterval: {
|
|
237
|
+
env: 'P2P_GOSSIPSUB_INTERVAL_MS',
|
|
238
|
+
description: 'The interval of the gossipsub heartbeat to perform maintenance tasks.',
|
|
239
|
+
...numberConfigHelper(1_000),
|
|
240
|
+
},
|
|
241
|
+
gossipsubD: {
|
|
242
|
+
env: 'P2P_GOSSIPSUB_D',
|
|
243
|
+
description: 'The D parameter for the gossipsub protocol.',
|
|
244
|
+
...numberConfigHelper(8),
|
|
245
|
+
},
|
|
246
|
+
gossipsubDlo: {
|
|
247
|
+
env: 'P2P_GOSSIPSUB_DLO',
|
|
248
|
+
description: 'The Dlo parameter for the gossipsub protocol.',
|
|
249
|
+
...numberConfigHelper(4),
|
|
250
|
+
},
|
|
251
|
+
gossipsubDhi: {
|
|
252
|
+
env: 'P2P_GOSSIPSUB_DHI',
|
|
253
|
+
description: 'The Dhi parameter for the gossipsub protocol.',
|
|
254
|
+
...numberConfigHelper(12),
|
|
255
|
+
},
|
|
256
|
+
gossipsubMcacheLength: {
|
|
257
|
+
env: 'P2P_GOSSIPSUB_MCACHE_LENGTH',
|
|
258
|
+
description: 'The number of gossipsub interval message cache windows to keep.',
|
|
259
|
+
...numberConfigHelper(5),
|
|
260
|
+
},
|
|
261
|
+
gossipsubMcacheGossip: {
|
|
262
|
+
env: 'P2P_GOSSIPSUB_MCACHE_GOSSIP',
|
|
263
|
+
description: 'How many message cache windows to include when gossiping with other pears.',
|
|
264
|
+
...numberConfigHelper(3),
|
|
265
|
+
},
|
|
266
|
+
gossipsubTxTopicWeight: {
|
|
267
|
+
env: 'P2P_GOSSIPSUB_TX_TOPIC_WEIGHT',
|
|
268
|
+
description: 'The weight of the tx topic for the gossipsub protocol.',
|
|
269
|
+
...numberConfigHelper(1),
|
|
270
|
+
},
|
|
271
|
+
gossipsubTxInvalidMessageDeliveriesWeight: {
|
|
272
|
+
env: 'P2P_GOSSIPSUB_TX_INVALID_MESSAGE_DELIVERIES_WEIGHT',
|
|
273
|
+
description: 'The weight of the tx invalid message deliveries for the gossipsub protocol.',
|
|
274
|
+
...numberConfigHelper(-20),
|
|
275
|
+
},
|
|
276
|
+
gossipsubTxInvalidMessageDeliveriesDecay: {
|
|
277
|
+
env: 'P2P_GOSSIPSUB_TX_INVALID_MESSAGE_DELIVERIES_DECAY',
|
|
278
|
+
description: 'Determines how quickly the penalty for invalid message deliveries decays over time. Between 0 and 1.',
|
|
279
|
+
...numberConfigHelper(0.5),
|
|
280
|
+
},
|
|
281
|
+
peerPenaltyValues: {
|
|
282
|
+
env: 'P2P_PEER_PENALTY_VALUES',
|
|
283
|
+
parseEnv: (val: string) => val.split(',').map(Number),
|
|
284
|
+
description:
|
|
285
|
+
'The values for the peer scoring system. Passed as a comma separated list of values in order: low, mid, high tolerance errors.',
|
|
286
|
+
defaultValue: [2, 10, 50],
|
|
287
|
+
},
|
|
288
|
+
severePeerPenaltyBlockLength: {
|
|
289
|
+
env: 'P2P_SEVERE_PEER_PENALTY_BLOCK_LENGTH',
|
|
290
|
+
description: 'The "age" (in L2 blocks) of a tx after which we heavily penalize a peer for sending it.',
|
|
291
|
+
...numberConfigHelper(30),
|
|
292
|
+
},
|
|
293
|
+
l1ChainId: {
|
|
294
|
+
env: 'L1_CHAIN_ID',
|
|
295
|
+
description: 'The chain id of the L1 chain.',
|
|
296
|
+
...numberConfigHelper(31337),
|
|
297
|
+
},
|
|
175
298
|
...p2pReqRespConfigMappings,
|
|
176
299
|
};
|
|
177
300
|
|
|
@@ -183,6 +306,10 @@ export function getP2PConfigEnvVars(): P2PConfig {
|
|
|
183
306
|
return getConfigFromMappings<P2PConfig>(p2pConfigMappings);
|
|
184
307
|
}
|
|
185
308
|
|
|
309
|
+
export function getP2PDefaultConfig(): P2PConfig {
|
|
310
|
+
return getDefaultConfig<P2PConfig>(p2pConfigMappings);
|
|
311
|
+
}
|
|
312
|
+
|
|
186
313
|
/**
|
|
187
314
|
* Required P2P config values for a bootstrap node.
|
|
188
315
|
*/
|
package/src/index.ts
CHANGED