@aztec/p2p 0.86.0 → 0.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/client/factory.d.ts +4 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +16 -14
- package/dest/client/index.d.ts +1 -0
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +155 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +26 -164
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +185 -114
- package/dest/config.d.ts +5 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -11
- package/dest/enr/generate-enr.d.ts +9 -1
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +24 -2
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +2 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +4 -4
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +8 -2
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +1 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +5 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +4 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +50 -14
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +3 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +9 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +9 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +13 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.js +1 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +15 -14
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +0 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +2 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +14 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +62 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +8 -4
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +35 -17
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +1 -1
- package/dest/services/discv5/discV5_service.d.ts +2 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +9 -13
- package/dest/services/dummy_service.d.ts +3 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +6 -1
- package/dest/services/encoding.d.ts +1 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.d.ts +4 -2
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +94 -88
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +11 -2
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -2
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +41 -21
- package/dest/services/reqresp/interface.d.ts +1 -3
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +0 -2
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.js +1 -1
- package/dest/services/reqresp/protocols/ping.d.ts +0 -2
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +0 -2
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.d.ts +1 -3
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +13 -10
- package/dest/services/service.d.ts +4 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +2 -2
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +11 -6
- package/dest/testbench/testbench.js +1 -1
- package/dest/testbench/worker_client_manager.d.ts +0 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +2 -2
- package/dest/types/index.d.ts +1 -0
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +1 -0
- package/dest/versioning.d.ts +2 -2
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +6 -1
- package/package.json +15 -15
- package/src/bootstrap/bootstrap.ts +1 -1
- package/src/client/factory.ts +38 -33
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +186 -0
- package/src/client/p2p_client.ts +226 -287
- package/src/config.ts +11 -18
- package/src/enr/generate-enr.ts +35 -3
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +3 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +4 -4
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +11 -4
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +10 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -2
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +79 -34
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +16 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +12 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +9 -3
- package/src/msg_validators/attestation_validator/attestation_validator.ts +1 -1
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +1 -1
- package/src/msg_validators/tx_validator/block_header_validator.ts +1 -1
- package/src/msg_validators/tx_validator/data_validator.ts +24 -18
- package/src/msg_validators/tx_validator/double_spend_validator.ts +2 -2
- package/src/msg_validators/tx_validator/factory.ts +94 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +3 -3
- package/src/msg_validators/tx_validator/metadata_validator.ts +50 -14
- package/src/msg_validators/tx_validator/phases_validator.ts +6 -2
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +1 -1
- package/src/services/discv5/discV5_service.ts +14 -12
- package/src/services/dummy_service.ts +8 -2
- package/src/services/libp2p/libp2p_service.ts +102 -111
- package/src/services/peer-manager/metrics.ts +4 -1
- package/src/services/peer-manager/peer_manager.ts +18 -1
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +5 -1
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +42 -19
- package/src/services/reqresp/metrics.ts +4 -1
- package/src/services/reqresp/protocols/goodbye.ts +1 -1
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +4 -1
- package/src/services/reqresp/reqresp.ts +12 -12
- package/src/services/service.ts +7 -1
- package/src/test-helpers/make-test-p2p-clients.ts +2 -1
- package/src/test-helpers/reqresp-nodes.ts +1 -1
- package/src/testbench/p2p_client_testbench_worker.ts +10 -4
- package/src/testbench/testbench.ts +1 -1
- package/src/testbench/worker_client_manager.ts +2 -2
- package/src/types/index.ts +1 -0
- package/src/versioning.ts +8 -1
|
@@ -11,7 +11,7 @@ export class BlockHeaderTxValidator {
|
|
|
11
11
|
await tx.data.constants.historicalHeader.hash()
|
|
12
12
|
]);
|
|
13
13
|
if (index === undefined) {
|
|
14
|
-
this.#log.
|
|
14
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} for referencing an unknown block header`);
|
|
15
15
|
return {
|
|
16
16
|
result: 'invalid',
|
|
17
17
|
reason: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/data_validator.ts"],"names":[],"mappings":"AAGA,OAAO,EAQL,EAAE,EACF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG/C,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/data_validator.ts"],"names":[],"mappings":"AAGA,OAAO,EAQL,EAAE,EACF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG/C,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAyFtD"}
|
|
@@ -12,7 +12,7 @@ export class DataTxValidator {
|
|
|
12
12
|
async #hasCorrectCalldata(tx) {
|
|
13
13
|
if (tx.publicFunctionCalldata.length !== tx.numberOfPublicCalls()) {
|
|
14
14
|
const reason = TX_ERROR_CALLDATA_COUNT_MISMATCH;
|
|
15
|
-
this.#log.
|
|
15
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)}. Reason: ${reason}. Expected ${tx.numberOfPublicCalls()}. Got ${tx.publicFunctionCalldata.length}.`);
|
|
16
16
|
return {
|
|
17
17
|
result: 'invalid',
|
|
18
18
|
reason: [
|
|
@@ -22,7 +22,7 @@ export class DataTxValidator {
|
|
|
22
22
|
}
|
|
23
23
|
if (tx.getTotalPublicCalldataCount() > MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS) {
|
|
24
24
|
const reason = TX_ERROR_CALLDATA_COUNT_TOO_LARGE;
|
|
25
|
-
this.#log.
|
|
25
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)}. Reason: ${reason}. Expected no greater than ${MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS} fields. Got ${tx.getTotalPublicCalldataCount()}.`);
|
|
26
26
|
return {
|
|
27
27
|
result: 'invalid',
|
|
28
28
|
reason: [
|
|
@@ -36,7 +36,7 @@ export class DataTxValidator {
|
|
|
36
36
|
const hash = await computeCalldataHash(calldata);
|
|
37
37
|
if (!hash.equals(request.calldataHash)) {
|
|
38
38
|
const reason = TX_ERROR_INCORRECT_CALLDATA;
|
|
39
|
-
this.#log.
|
|
39
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)}. Reason: ${reason}. Call request index: ${i}.`);
|
|
40
40
|
return {
|
|
41
41
|
result: 'invalid',
|
|
42
42
|
reason: [
|
|
@@ -51,9 +51,8 @@ export class DataTxValidator {
|
|
|
51
51
|
}
|
|
52
52
|
async #hasCorrectContractClassLogs(tx) {
|
|
53
53
|
const contractClassLogsHashes = tx.data.getNonEmptyContractClassLogsHashes();
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${contractClassLogsHashes.length}. Got ${hashedContractClasslogs.length}.`);
|
|
54
|
+
if (contractClassLogsHashes.length !== tx.contractClassLogs.length) {
|
|
55
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${contractClassLogsHashes.length}. Got ${tx.contractClassLogs.length}.`);
|
|
57
56
|
return {
|
|
58
57
|
result: 'invalid',
|
|
59
58
|
reason: [
|
|
@@ -61,12 +60,13 @@ export class DataTxValidator {
|
|
|
61
60
|
]
|
|
62
61
|
};
|
|
63
62
|
}
|
|
63
|
+
const expectedHashes = await Promise.all(tx.contractClassLogs.map((l)=>l.hash()));
|
|
64
64
|
for (const [i, logHash] of contractClassLogsHashes.entries()){
|
|
65
|
-
const
|
|
66
|
-
if (!logHash.value.equals(
|
|
67
|
-
if (
|
|
68
|
-
const matchingLogIndex =
|
|
69
|
-
this.#log.
|
|
65
|
+
const hash = expectedHashes[i];
|
|
66
|
+
if (!logHash.value.equals(hash)) {
|
|
67
|
+
if (expectedHashes.some((h)=>logHash.value.equals(h))) {
|
|
68
|
+
const matchingLogIndex = expectedHashes.findIndex((l)=>logHash.value.equals(l));
|
|
69
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`);
|
|
70
70
|
return {
|
|
71
71
|
result: 'invalid',
|
|
72
72
|
reason: [
|
|
@@ -74,7 +74,7 @@ export class DataTxValidator {
|
|
|
74
74
|
]
|
|
75
75
|
};
|
|
76
76
|
} else {
|
|
77
|
-
this.#log.
|
|
77
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of mismatched contract class logs. Expected hash ${logHash.value} from the kernels. Got ${hash} in the tx.`);
|
|
78
78
|
return {
|
|
79
79
|
result: 'invalid',
|
|
80
80
|
reason: [
|
|
@@ -83,8 +83,9 @@ export class DataTxValidator {
|
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
const expectedMinLength = 1 + tx.contractClassLogs[i].fields.findLastIndex((f)=>!f.isZero());
|
|
87
|
+
if (logHash.logHash.length < expectedMinLength) {
|
|
88
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect contract class log length. Expected the length to be at least ${expectedMinLength}. Got ${logHash.logHash.length}.`);
|
|
88
89
|
return {
|
|
89
90
|
result: 'invalid',
|
|
90
91
|
reason: [
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
4
2
|
export interface NullifierSource {
|
|
5
3
|
nullifiersExist: (nullifiers: Buffer[]) => Promise<boolean[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,eAAe,EAAE,eAAe;IAItC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAiBrD"}
|
|
@@ -11,7 +11,7 @@ export class DoubleSpendTxValidator {
|
|
|
11
11
|
// Ditch this tx if it has repeated nullifiers
|
|
12
12
|
const uniqueNullifiers = new Set(nullifiers);
|
|
13
13
|
if (uniqueNullifiers.size !== nullifiers.length) {
|
|
14
|
-
this.#log.
|
|
14
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
15
15
|
return {
|
|
16
16
|
result: 'invalid',
|
|
17
17
|
reason: [
|
|
@@ -20,7 +20,7 @@ export class DoubleSpendTxValidator {
|
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
if ((await this.#nullifierSource.nullifiersExist(nullifiers.map((n)=>n.toBuffer()))).some(Boolean)) {
|
|
23
|
-
this.#log.
|
|
23
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} for repeating a nullifier`);
|
|
24
24
|
return {
|
|
25
25
|
result: 'invalid',
|
|
26
26
|
reason: [
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
3
|
+
import type { GasFees } from '@aztec/stdlib/gas';
|
|
4
|
+
import type { AllowedElement, ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
6
|
+
import type { Tx, TxValidationResult } from '@aztec/stdlib/tx';
|
|
7
|
+
export interface MessageValidator {
|
|
8
|
+
validator: {
|
|
9
|
+
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
10
|
+
};
|
|
11
|
+
severity: PeerErrorSeverity;
|
|
12
|
+
}
|
|
13
|
+
export declare function createTxMessageValidators(blockNumber: number, worldStateSynchronizer: WorldStateSynchronizer, gasFees: GasFees, l1ChainId: number, rollupVersion: number, protocolContractTreeRoot: Fr, contractDataSource: ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, allowedInSetup?: AllowedElement[]): Record<string, MessageValidator>[];
|
|
14
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAG9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EACV,cAAc,EACd,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,EAAE,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAW/D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE;QACT,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;KACjD,CAAC;IACF,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,wBAAwB,EAAE,EAAE,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,6BAA6B,EAC5C,cAAc,GAAE,cAAc,EAAO,GACpC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAqDpC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
3
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
4
|
+
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
5
|
+
import { DatabasePublicStateSource, MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
|
+
import { ArchiveCache } from './archive_cache.js';
|
|
7
|
+
import { BlockHeaderTxValidator } from './block_header_validator.js';
|
|
8
|
+
import { DataTxValidator } from './data_validator.js';
|
|
9
|
+
import { DoubleSpendTxValidator } from './double_spend_validator.js';
|
|
10
|
+
import { GasTxValidator } from './gas_validator.js';
|
|
11
|
+
import { MetadataTxValidator } from './metadata_validator.js';
|
|
12
|
+
import { PhasesTxValidator } from './phases_validator.js';
|
|
13
|
+
import { TxProofValidator } from './tx_proof_validator.js';
|
|
14
|
+
export function createTxMessageValidators(blockNumber, worldStateSynchronizer, gasFees, l1ChainId, rollupVersion, protocolContractTreeRoot, contractDataSource, proofVerifier, allowedInSetup = []) {
|
|
15
|
+
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
dataValidator: {
|
|
19
|
+
validator: new DataTxValidator(),
|
|
20
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
21
|
+
},
|
|
22
|
+
metadataValidator: {
|
|
23
|
+
validator: new MetadataTxValidator({
|
|
24
|
+
l1ChainId: new Fr(l1ChainId),
|
|
25
|
+
rollupVersion: new Fr(rollupVersion),
|
|
26
|
+
blockNumber: new Fr(blockNumber),
|
|
27
|
+
protocolContractTreeRoot,
|
|
28
|
+
vkTreeRoot: getVKTreeRoot()
|
|
29
|
+
}),
|
|
30
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
31
|
+
},
|
|
32
|
+
doubleSpendValidator: {
|
|
33
|
+
validator: new DoubleSpendTxValidator({
|
|
34
|
+
nullifiersExist: async (nullifiers)=>{
|
|
35
|
+
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
36
|
+
const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
|
|
37
|
+
return indices.map((index)=>index !== undefined);
|
|
38
|
+
}
|
|
39
|
+
}),
|
|
40
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
41
|
+
},
|
|
42
|
+
gasValidator: {
|
|
43
|
+
validator: new GasTxValidator(new DatabasePublicStateSource(merkleTree), ProtocolContractAddress.FeeJuice, gasFees),
|
|
44
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
45
|
+
},
|
|
46
|
+
phasesValidator: {
|
|
47
|
+
validator: new PhasesTxValidator(contractDataSource, allowedInSetup, blockNumber),
|
|
48
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
49
|
+
},
|
|
50
|
+
blockHeaderValidator: {
|
|
51
|
+
validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree)),
|
|
52
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
proofValidator: {
|
|
57
|
+
validator: new TxProofValidator(proofVerifier),
|
|
58
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
@@ -41,7 +41,7 @@ export class GasTxValidator {
|
|
|
41
41
|
const maxFeesPerGas = gasSettings.maxFeesPerGas;
|
|
42
42
|
const notEnoughMaxFees = maxFeesPerGas.feePerDaGas.lt(this.#gasFees.feePerDaGas) || maxFeesPerGas.feePerL2Gas.lt(this.#gasFees.feePerL2Gas);
|
|
43
43
|
if (notEnoughMaxFees) {
|
|
44
|
-
this.#log.
|
|
44
|
+
this.#log.verbose(`Skipping transaction ${await tx.getTxHash()} due to insufficient fee per gas`, {
|
|
45
45
|
txMaxFeesPerGas: maxFeesPerGas.toInspect(),
|
|
46
46
|
currentGasFees: this.#gasFees.toInspect()
|
|
47
47
|
});
|
|
@@ -54,7 +54,7 @@ export class GasTxValidator {
|
|
|
54
54
|
const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
55
55
|
const minGasLimits = new Gas(FIXED_DA_GAS, FIXED_L2_GAS);
|
|
56
56
|
if (minGasLimits.gtAny(gasLimits)) {
|
|
57
|
-
this.#log.
|
|
57
|
+
this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, {
|
|
58
58
|
gasLimits,
|
|
59
59
|
minGasLimits
|
|
60
60
|
});
|
|
@@ -84,7 +84,7 @@ export class GasTxValidator {
|
|
|
84
84
|
const claimFunctionCall = setupFns.find((fn)=>fn.request.contractAddress.equals(this.#feeJuiceAddress) && fn.request.msgSender.equals(this.#feeJuiceAddress) && fn.calldata.length > 2 && fn.functionSelector.equals(increasePublicBalanceSelector) && fn.args[0].equals(feePayer.toField()) && !fn.request.isStaticCall);
|
|
85
85
|
const balance = claimFunctionCall ? initialBalance.add(claimFunctionCall.args[1]) : initialBalance;
|
|
86
86
|
if (balance.lt(feeLimit)) {
|
|
87
|
-
this.#log.
|
|
87
|
+
this.#log.verbose(`Rejecting transaction due to not enough fee payer balance`, {
|
|
88
88
|
feePayer,
|
|
89
89
|
balance: balance.toBigInt(),
|
|
90
90
|
feeLimit: feeLimit.toBigInt()
|
|
@@ -2,10 +2,14 @@ import type { Fr } from '@aztec/foundation/fields';
|
|
|
2
2
|
import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
3
3
|
export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
4
4
|
#private;
|
|
5
|
-
private
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
private values;
|
|
6
|
+
constructor(values: {
|
|
7
|
+
l1ChainId: Fr;
|
|
8
|
+
rollupVersion: Fr;
|
|
9
|
+
blockNumber: Fr;
|
|
10
|
+
vkTreeRoot: Fr;
|
|
11
|
+
protocolContractTreeRoot: Fr;
|
|
12
|
+
});
|
|
9
13
|
validateTx(tx: T): Promise<TxValidationResult>;
|
|
10
14
|
}
|
|
11
15
|
//# sourceMappingURL=metadata_validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EACL,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EACL,KAAK,KAAK,EAOV,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAIvE,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE;QAAE,SAAS,EAAE,EAAE,CAAC;QAAC,aAAa,EAAE,EAAE,CAAC;QAAC,WAAW,EAAE,EAAE,CAAC;QAAC,UAAU,EAAE,EAAE,CAAC;QAAC,wBAAwB,EAAE,EAAE,CAAA;KAAE;IAG/G,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsFrD"}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
-
import {
|
|
2
|
+
import { TX_ERROR_INCORRECT_L1_CHAIN_ID, TX_ERROR_INCORRECT_PROTOCOL_CONTRACT_TREE_ROOT, TX_ERROR_INCORRECT_ROLLUP_VERSION, TX_ERROR_INCORRECT_VK_TREE_ROOT, TX_ERROR_INVALID_BLOCK_NUMBER, Tx } from '@aztec/stdlib/tx';
|
|
3
3
|
export class MetadataTxValidator {
|
|
4
|
-
|
|
5
|
-
rollupVersion;
|
|
6
|
-
blockNumber;
|
|
4
|
+
values;
|
|
7
5
|
#log;
|
|
8
|
-
constructor(
|
|
9
|
-
this.
|
|
10
|
-
this.rollupVersion = rollupVersion;
|
|
11
|
-
this.blockNumber = blockNumber;
|
|
6
|
+
constructor(values){
|
|
7
|
+
this.values = values;
|
|
12
8
|
this.#log = createLogger('p2p:tx_validator:tx_metadata');
|
|
13
9
|
}
|
|
14
10
|
async validateTx(tx) {
|
|
15
11
|
const errors = [];
|
|
16
|
-
if (!await this.#
|
|
17
|
-
errors.push(
|
|
12
|
+
if (!await this.#hasCorrectL1ChainId(tx)) {
|
|
13
|
+
errors.push(TX_ERROR_INCORRECT_L1_CHAIN_ID);
|
|
18
14
|
}
|
|
19
15
|
if (!await this.#hasCorrectRollupVersion(tx)) {
|
|
20
16
|
errors.push(TX_ERROR_INCORRECT_ROLLUP_VERSION);
|
|
@@ -22,6 +18,12 @@ export class MetadataTxValidator {
|
|
|
22
18
|
if (!await this.#isValidForBlockNumber(tx)) {
|
|
23
19
|
errors.push(TX_ERROR_INVALID_BLOCK_NUMBER);
|
|
24
20
|
}
|
|
21
|
+
if (!await this.#hasCorrectVkTreeRoot(tx)) {
|
|
22
|
+
errors.push(TX_ERROR_INCORRECT_VK_TREE_ROOT);
|
|
23
|
+
}
|
|
24
|
+
if (!await this.#hasCorrectProtocolContractTreeRoot(tx)) {
|
|
25
|
+
errors.push(TX_ERROR_INCORRECT_PROTOCOL_CONTRACT_TREE_ROOT);
|
|
26
|
+
}
|
|
25
27
|
return errors.length > 0 ? {
|
|
26
28
|
result: 'invalid',
|
|
27
29
|
reason: errors
|
|
@@ -29,9 +31,25 @@ export class MetadataTxValidator {
|
|
|
29
31
|
result: 'valid'
|
|
30
32
|
};
|
|
31
33
|
}
|
|
32
|
-
async #
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
async #hasCorrectVkTreeRoot(tx) {
|
|
35
|
+
// This gets implicitly tested in the proof validator, but we can get a much cheaper check here by looking early at the vk.
|
|
36
|
+
if (!tx.data.constants.vkTreeRoot.equals(this.values.vkTreeRoot)) {
|
|
37
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect vk tree root ${tx.data.constants.vkTreeRoot.toString()} != ${this.values.vkTreeRoot.toString()}`);
|
|
38
|
+
return false;
|
|
39
|
+
} else {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async #hasCorrectProtocolContractTreeRoot(tx) {
|
|
44
|
+
if (!tx.data.constants.protocolContractTreeRoot.equals(this.values.protocolContractTreeRoot)) {
|
|
45
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect protocol contract tree root ${tx.data.constants.protocolContractTreeRoot.toString()} != ${this.values.protocolContractTreeRoot.toString()}`);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
async #hasCorrectL1ChainId(tx) {
|
|
51
|
+
if (!tx.data.constants.txContext.chainId.equals(this.values.l1ChainId)) {
|
|
52
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect L1 chain ${tx.data.constants.txContext.chainId.toNumber()} != ${this.values.l1ChainId.toNumber()}`);
|
|
35
53
|
return false;
|
|
36
54
|
} else {
|
|
37
55
|
return true;
|
|
@@ -39,16 +57,16 @@ export class MetadataTxValidator {
|
|
|
39
57
|
}
|
|
40
58
|
async #isValidForBlockNumber(tx) {
|
|
41
59
|
const maxBlockNumber = tx.data.rollupValidationRequests.maxBlockNumber;
|
|
42
|
-
if (maxBlockNumber.isSome && maxBlockNumber.value < this.blockNumber) {
|
|
43
|
-
this.#log.
|
|
60
|
+
if (maxBlockNumber.isSome && maxBlockNumber.value < this.values.blockNumber) {
|
|
61
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} for low max block number. Tx max block number: ${maxBlockNumber.value}, current block number: ${this.values.blockNumber}.`);
|
|
44
62
|
return false;
|
|
45
63
|
} else {
|
|
46
64
|
return true;
|
|
47
65
|
}
|
|
48
66
|
}
|
|
49
67
|
async #hasCorrectRollupVersion(tx) {
|
|
50
|
-
if (!tx.data.constants.txContext.version.equals(this.rollupVersion)) {
|
|
51
|
-
this.#log.
|
|
68
|
+
if (!tx.data.constants.txContext.version.equals(this.values.rollupVersion)) {
|
|
69
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect rollup version ${tx.data.constants.txContext.version.toNumber()} != ${this.values.rollupVersion.toNumber()}`);
|
|
52
70
|
return false;
|
|
53
71
|
} else {
|
|
54
72
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAIL,EAAE,EAEF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;
|
|
1
|
+
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAIL,EAAE,EAEF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAMrD,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,WAAW;IALrB,OAAO,CAAC,WAAW,CAAoB;gBAGrC,SAAS,EAAE,kBAAkB,EACrB,cAAc,EAAE,cAAc,EAAE,EAChC,WAAW,EAAE,MAAM;IAKvB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAqCvC,aAAa;CAiD5B"}
|
|
@@ -27,7 +27,7 @@ export class PhasesTxValidator {
|
|
|
27
27
|
const setupFns = getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.SETUP);
|
|
28
28
|
for (const setupFn of setupFns){
|
|
29
29
|
if (!await this.isOnAllowList(setupFn, this.setupAllowList)) {
|
|
30
|
-
this.#log.
|
|
30
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.request.contractAddress}:${setupFn.functionSelector}`, {
|
|
31
31
|
allowList: this.setupAllowList
|
|
32
32
|
});
|
|
33
33
|
return {
|
|
@@ -9,7 +9,7 @@ export class TxProofValidator {
|
|
|
9
9
|
}
|
|
10
10
|
async validateTx(tx) {
|
|
11
11
|
if (!await this.verifier.verifyProof(tx)) {
|
|
12
|
-
this.#log.
|
|
12
|
+
this.#log.verbose(`Rejecting tx ${await Tx.getHash(tx)} for invalid proof`);
|
|
13
13
|
return {
|
|
14
14
|
result: 'invalid',
|
|
15
15
|
reason: [
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
1
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
2
|
import { type IDiscv5CreateOptions } from '@chainsafe/discv5';
|
|
4
3
|
import { ENR } from '@chainsafe/enr';
|
|
@@ -12,6 +11,7 @@ import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
|
|
|
12
11
|
export declare class DiscV5Service extends EventEmitter implements PeerDiscoveryService {
|
|
13
12
|
private peerId;
|
|
14
13
|
private config;
|
|
14
|
+
private readonly packageVersion;
|
|
15
15
|
private logger;
|
|
16
16
|
/** The Discv5 instance */
|
|
17
17
|
private discv5;
|
|
@@ -25,7 +25,7 @@ export declare class DiscV5Service extends EventEmitter implements PeerDiscovery
|
|
|
25
25
|
private trustedPeerEnrs;
|
|
26
26
|
private startTime;
|
|
27
27
|
private handlers;
|
|
28
|
-
constructor(peerId: PeerId, config: P2PConfig, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger, configOverrides?: Partial<IDiscv5CreateOptions>);
|
|
28
|
+
constructor(peerId: PeerId, config: P2PConfig, packageVersion: string, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger, configOverrides?: Partial<IDiscv5CreateOptions>);
|
|
29
29
|
private onMultiaddrUpdated;
|
|
30
30
|
start(): Promise<void>;
|
|
31
31
|
runRandomNodesQuery(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discV5_service.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/discV5_service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discV5_service.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/discV5_service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEvG,OAAO,EAAmC,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,GAAG,EAAe,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAI9E;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAa,YAAW,oBAAoB;IAyB3E,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,MAAM;IA5BhB,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAqB;IAEnC,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAc;IAEzB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IAErC,OAAO,CAAC,YAAY,CAA8B;IAElD,OAAO,CAAC,oBAAoB,CAAgB;IACrC,iBAAiB,EAAE,GAAG,EAAE,CAAM;IACrC,OAAO,CAAC,eAAe,CAAa;IAEpC,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,QAAQ,CAId;gBAGQ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACR,cAAc,EAAE,MAAM,EACvC,SAAS,GAAE,eAAsC,EACzC,MAAM,yCAAqC,EACnD,eAAe,GAAE,OAAO,CAAC,oBAAoB,CAAM;IA4ErD,OAAO,CAAC,kBAAkB;IAQb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuDtB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB1C,YAAY,IAAI,GAAG,EAAE;IAIrB,MAAM,IAAI,GAAG;IAIb,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,kBAAkB;IAI/B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUpB,UAAU;IAOxB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,WAAW;CA0BpB"}
|
|
@@ -3,12 +3,12 @@ import { sleep } from '@aztec/foundation/sleep';
|
|
|
3
3
|
import { checkCompressedComponentVersion } from '@aztec/stdlib/versioning';
|
|
4
4
|
import { OtelMetricsAdapter, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
5
|
import { Discv5 } from '@chainsafe/discv5';
|
|
6
|
-
import { ENR
|
|
6
|
+
import { ENR } from '@chainsafe/enr';
|
|
7
7
|
import { multiaddr } from '@multiformats/multiaddr';
|
|
8
8
|
import EventEmitter from 'events';
|
|
9
|
+
import { createNodeENR } from '../../enr/generate-enr.js';
|
|
9
10
|
import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
|
|
10
11
|
import { convertToMultiaddr } from '../../util.js';
|
|
11
|
-
import { setAztecEnrKey } from '../../versioning.js';
|
|
12
12
|
import { PeerDiscoveryState } from '../service.js';
|
|
13
13
|
const delayBeforeStart = 2000; // 2sec
|
|
14
14
|
/**
|
|
@@ -16,6 +16,7 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
16
16
|
*/ export class DiscV5Service extends EventEmitter {
|
|
17
17
|
peerId;
|
|
18
18
|
config;
|
|
19
|
+
packageVersion;
|
|
19
20
|
logger;
|
|
20
21
|
/** The Discv5 instance */ discv5;
|
|
21
22
|
/** This instance's ENR */ enr;
|
|
@@ -26,8 +27,8 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
26
27
|
trustedPeerEnrs;
|
|
27
28
|
startTime;
|
|
28
29
|
handlers;
|
|
29
|
-
constructor(peerId, config, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service'), configOverrides = {}){
|
|
30
|
-
super(), this.peerId = peerId, this.config = config, this.logger = logger, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.trustedPeerEnrs = [], this.startTime = 0, this.handlers = {
|
|
30
|
+
constructor(peerId, config, packageVersion, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service'), configOverrides = {}){
|
|
31
|
+
super(), this.peerId = peerId, this.config = config, this.packageVersion = packageVersion, this.logger = logger, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.trustedPeerEnrs = [], this.startTime = 0, this.handlers = {
|
|
31
32
|
onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this),
|
|
32
33
|
onDiscovered: this.onDiscovered.bind(this),
|
|
33
34
|
onEnrAdded: this.onEnrAdded.bind(this)
|
|
@@ -36,10 +37,6 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
36
37
|
this.bootstrapNodeEnrs = bootstrapNodes.map((x)=>ENR.decodeTxt(x));
|
|
37
38
|
const privatePeerEnrs = new Set(privatePeers);
|
|
38
39
|
this.trustedPeerEnrs = trustedPeers.filter((x)=>!privatePeerEnrs.has(x)).map((x)=>ENR.decodeTxt(x));
|
|
39
|
-
// create ENR from PeerId
|
|
40
|
-
this.enr = SignableENR.createFromPeerId(peerId);
|
|
41
|
-
// Add aztec identification to ENR
|
|
42
|
-
this.versions = setAztecEnrKey(this.enr, config);
|
|
43
40
|
// If no overridden broadcast port is provided, use the p2p port as the broadcast port
|
|
44
41
|
if (!p2pBroadcastPort) {
|
|
45
42
|
this.logger.warn('No p2pBroadcastPort provided, using p2pPort as broadcast port');
|
|
@@ -48,13 +45,12 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
48
45
|
const bindAddrs = {
|
|
49
46
|
ip4: multiaddr(convertToMultiaddr(config.listenAddress, p2pPort, 'udp'))
|
|
50
47
|
};
|
|
48
|
+
let multiAddrUdp, multiAddrTcp;
|
|
51
49
|
if (p2pIp) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// set location multiaddr in ENR record
|
|
55
|
-
this.enr.setLocationMultiaddr(multiAddrUdp);
|
|
56
|
-
this.enr.setLocationMultiaddr(multiAddrTcp);
|
|
50
|
+
multiAddrTcp = multiaddr(`${convertToMultiaddr(p2pIp, config.p2pBroadcastPort, 'tcp')}/p2p/${peerId.toString()}`);
|
|
51
|
+
multiAddrUdp = multiaddr(`${convertToMultiaddr(p2pIp, config.p2pBroadcastPort, 'udp')}/p2p/${peerId.toString()}`);
|
|
57
52
|
}
|
|
53
|
+
({ enr: this.enr, versions: this.versions } = createNodeENR(peerId, multiAddrUdp, multiAddrTcp, config, this.packageVersion));
|
|
58
54
|
const metricsRegistry = new OtelMetricsAdapter(telemetry);
|
|
59
55
|
this.discv5 = Discv5.create({
|
|
60
56
|
enr: this.enr,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
1
|
import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
3
2
|
import type { BlockAttestation, BlockProposal, Gossipable } from '@aztec/stdlib/p2p';
|
|
4
|
-
import { TxHash } from '@aztec/stdlib/tx';
|
|
3
|
+
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
4
|
import type { ENR } from '@chainsafe/enr';
|
|
6
5
|
import type { PeerId } from '@libp2p/interface';
|
|
7
6
|
import EventEmitter from 'events';
|
|
@@ -27,7 +26,7 @@ export declare class DummyP2PService implements P2PService {
|
|
|
27
26
|
* Called to have the given message propagated through the P2P network.
|
|
28
27
|
* @param _ - The message to be propagated.
|
|
29
28
|
*/
|
|
30
|
-
propagate<T extends Gossipable>(_: T): void
|
|
29
|
+
propagate<T extends Gossipable>(_: T): Promise<void>;
|
|
31
30
|
/**
|
|
32
31
|
* Called upon receipt of settled transactions.
|
|
33
32
|
* @param _ - The hashes of the settled transactions.
|
|
@@ -56,6 +55,7 @@ export declare class DummyP2PService implements P2PService {
|
|
|
56
55
|
* @returns The ENR of the peer, otherwise undefined.
|
|
57
56
|
*/
|
|
58
57
|
getEnr(): undefined;
|
|
58
|
+
validate(_txs: Tx[]): Promise<void>;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* A dummy implementation of the Peer Discovery Service.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_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,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9F;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,wCAAwC;IACxC,QAAQ,IAAI,QAAQ,EAAE;IAItB;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC;IAI3C;;;OAGG;IACI,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE;IAE7B;;OAEG;IACI,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,CAAC;IAE3F;;;;;OAKG;IACI,WAAW,CAAC,QAAQ,SAAS,kBAAkB,EACpD,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IAI1E;;;;;OAKG;IACI,gBAAgB,CAAC,QAAQ,SAAS,kBAAkB,EACzD,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAC7D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAIhE;;;OAGG;IACI,MAAM,IAAI,SAAS;IAI1B,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpC;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAa,YAAW,oBAAoB;IACzF,OAAO,CAAC,YAAY,CAA8B;IAC3C,iBAAiB,EAAE,GAAG,EAAE,CAAM;IAErC;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,YAAY;IAIZ,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAInC,SAAS,IAAI,kBAAkB;IAI/B,MAAM,IAAI,SAAS;CAG3B"}
|
|
@@ -21,7 +21,9 @@ import { PeerDiscoveryState } from './service.js';
|
|
|
21
21
|
/**
|
|
22
22
|
* Called to have the given message propagated through the P2P network.
|
|
23
23
|
* @param _ - The message to be propagated.
|
|
24
|
-
*/ propagate(_) {
|
|
24
|
+
*/ propagate(_) {
|
|
25
|
+
return Promise.resolve();
|
|
26
|
+
}
|
|
25
27
|
/**
|
|
26
28
|
* Called upon receipt of settled transactions.
|
|
27
29
|
* @param _ - The hashes of the settled transactions.
|
|
@@ -51,6 +53,9 @@ import { PeerDiscoveryState } from './service.js';
|
|
|
51
53
|
*/ getEnr() {
|
|
52
54
|
return undefined;
|
|
53
55
|
}
|
|
56
|
+
validate(_txs) {
|
|
57
|
+
return Promise.resolve();
|
|
58
|
+
}
|
|
54
59
|
}
|
|
55
60
|
/**
|
|
56
61
|
* A dummy implementation of the Peer Discovery Service.
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import type { RPC } from '@chainsafe/libp2p-gossipsub/message';
|
|
4
2
|
import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types';
|
|
5
3
|
import type { Message } from '@libp2p/interface';
|
|
@@ -18,7 +16,7 @@ export declare function msgIdToStrFn(msgId: Uint8Array): string;
|
|
|
18
16
|
* @param message - The libp2p message
|
|
19
17
|
* @returns The message identifier
|
|
20
18
|
*/
|
|
21
|
-
export declare function getMsgIdFn(message: Message): Buffer
|
|
19
|
+
export declare function getMsgIdFn(message: Message): Buffer<ArrayBuffer>;
|
|
22
20
|
/**
|
|
23
21
|
* Snappy transform for libp2p gossipsub
|
|
24
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/services/encoding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/services/encoding.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAajD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAKvD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAItD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,uBAK1C;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,aAAa;IAEnD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAI1D,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQpD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAI3D,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAMtD"}
|
|
@@ -4,6 +4,7 @@ import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
|
4
4
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
5
5
|
import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
6
6
|
import { BlockAttestation, BlockProposal, type Gossipable, P2PClientType } from '@aztec/stdlib/p2p';
|
|
7
|
+
import { Tx } from '@aztec/stdlib/tx';
|
|
7
8
|
import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
|
|
8
9
|
import type { ENR } from '@chainsafe/enr';
|
|
9
10
|
import { type Message, type PeerId } from '@libp2p/interface';
|
|
@@ -96,7 +97,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
96
97
|
/**
|
|
97
98
|
* Publishes data to a topic.
|
|
98
99
|
* @param topic - The topic to publish to.
|
|
99
|
-
* @param data - The
|
|
100
|
+
* @param data - The message to publish.
|
|
100
101
|
* @returns The number of recipients the data was sent to.
|
|
101
102
|
*/
|
|
102
103
|
private publishToTopic;
|
|
@@ -113,7 +114,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
113
114
|
result: boolean;
|
|
114
115
|
obj: T | undefined;
|
|
115
116
|
}>;
|
|
116
|
-
protected handleGossipedTx(
|
|
117
|
+
protected handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
|
|
117
118
|
/**
|
|
118
119
|
* Process Attestation From Peer
|
|
119
120
|
* When a proposal is received from a peer, we add it to the attestation pool, so it can be accessed by other services.
|
|
@@ -150,6 +151,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
150
151
|
private validateRequestedTx;
|
|
151
152
|
private validatePropagatedTx;
|
|
152
153
|
private getGasFees;
|
|
154
|
+
validate(txs: Tx[]): Promise<void>;
|
|
153
155
|
/**
|
|
154
156
|
* Create message validators for the given block number.
|
|
155
157
|
*
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"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"}
|