@aztec/p2p 0.0.1-commit.3469e52 → 0.0.1-commit.59e663cd
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/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +3 -3
- 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 +8 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +40 -9
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +11 -4
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -15
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +66 -11
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/services/libp2p/libp2p_service.d.ts +5 -5
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +24 -24
- package/dest/services/reqresp/interface.d.ts +3 -3
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +2 -2
- package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +5 -5
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +2 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +1 -0
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/testbench/p2p_client_testbench_worker.js +2 -1
- package/package.json +14 -14
- package/src/client/p2p_client.ts +5 -5
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +2 -2
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +10 -7
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
- package/src/msg_validators/attestation_validator/attestation_validator.ts +25 -13
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +6 -6
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +21 -14
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +53 -14
- package/src/msg_validators/tx_validator/block_header_validator.ts +3 -1
- package/src/services/libp2p/libp2p_service.ts +39 -29
- package/src/services/reqresp/interface.ts +2 -2
- package/src/services/tx_collection/slow_tx_collection.ts +2 -2
- package/src/services/tx_collection/tx_collection.ts +4 -4
- package/src/services/tx_provider.ts +2 -2
- package/src/test-helpers/index.ts +1 -0
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/testbench/p2p_client_testbench_worker.ts +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
+
import { isWithinClockTolerance } from '../clock_tolerance.js';
|
|
4
5
|
export class ProposalValidator {
|
|
5
6
|
epochCache;
|
|
6
7
|
logger;
|
|
@@ -16,23 +17,39 @@ export class ProposalValidator {
|
|
|
16
17
|
const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
17
18
|
const slotNumber = proposal.slotNumber;
|
|
18
19
|
if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
// Check if message is for previous slot and within clock tolerance
|
|
21
|
+
if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
|
|
22
|
+
this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, {
|
|
23
|
+
currentSlot,
|
|
24
|
+
nextSlot
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
result: 'reject',
|
|
28
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
|
|
32
|
+
return {
|
|
33
|
+
result: 'ignore'
|
|
34
|
+
};
|
|
24
35
|
}
|
|
25
36
|
// Signature validity
|
|
26
37
|
const proposer = proposal.getSender();
|
|
27
38
|
if (!proposer) {
|
|
28
|
-
this.logger.
|
|
29
|
-
return
|
|
39
|
+
this.logger.warn(`Penalizing peer for proposal with invalid signature`);
|
|
40
|
+
return {
|
|
41
|
+
result: 'reject',
|
|
42
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
43
|
+
};
|
|
30
44
|
}
|
|
31
45
|
// Transactions permitted check
|
|
32
46
|
const embeddedTxCount = proposal.txs?.length ?? 0;
|
|
33
47
|
if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
|
|
34
|
-
this.logger.
|
|
35
|
-
return
|
|
48
|
+
this.logger.warn(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`);
|
|
49
|
+
return {
|
|
50
|
+
result: 'reject',
|
|
51
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
52
|
+
};
|
|
36
53
|
}
|
|
37
54
|
// Embedded txs must be listed in txHashes
|
|
38
55
|
const hashSet = new Set(proposal.txHashes.map((h)=>h.toString()));
|
|
@@ -43,16 +60,22 @@ export class ProposalValidator {
|
|
|
43
60
|
txHashesLength: proposal.txHashes.length,
|
|
44
61
|
missingTxHashes
|
|
45
62
|
});
|
|
46
|
-
return
|
|
63
|
+
return {
|
|
64
|
+
result: 'reject',
|
|
65
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
66
|
+
};
|
|
47
67
|
}
|
|
48
68
|
// Proposer check
|
|
49
69
|
const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
|
|
50
70
|
if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
|
|
51
|
-
this.logger.
|
|
71
|
+
this.logger.warn(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
|
|
52
72
|
expectedProposer,
|
|
53
73
|
proposer: proposer.toString()
|
|
54
74
|
});
|
|
55
|
-
return
|
|
75
|
+
return {
|
|
76
|
+
result: 'reject',
|
|
77
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
78
|
+
};
|
|
56
79
|
}
|
|
57
80
|
// Validate tx hashes for all txs embedded in the proposal
|
|
58
81
|
if (!(await Promise.all(proposal.txs?.map((tx)=>tx.validateTxHash()) ?? [])).every((v)=>v)) {
|
|
@@ -60,12 +83,20 @@ export class ProposalValidator {
|
|
|
60
83
|
proposer,
|
|
61
84
|
slotNumber
|
|
62
85
|
});
|
|
63
|
-
return
|
|
86
|
+
return {
|
|
87
|
+
result: 'reject',
|
|
88
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
89
|
+
};
|
|
64
90
|
}
|
|
65
|
-
return
|
|
91
|
+
return {
|
|
92
|
+
result: 'accept'
|
|
93
|
+
};
|
|
66
94
|
} catch (e) {
|
|
67
95
|
if (e instanceof NoCommitteeError) {
|
|
68
|
-
return
|
|
96
|
+
return {
|
|
97
|
+
result: 'reject',
|
|
98
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
99
|
+
};
|
|
69
100
|
}
|
|
70
101
|
throw e;
|
|
71
102
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
3
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
-
import { type BlockProposal, type CheckpointProposal,
|
|
4
|
+
import { type BlockProposal, type CheckpointProposal, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
5
5
|
import type { TxHash } from '@aztec/stdlib/tx';
|
|
6
6
|
import type { MockProxy } from 'jest-mock-extended';
|
|
7
7
|
export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
|
|
8
8
|
validatorFactory: (epochCache: EpochCacheInterface, opts: {
|
|
9
9
|
txsPermitted: boolean;
|
|
10
10
|
}) => {
|
|
11
|
-
validate: (proposal: TProposal) => Promise<
|
|
11
|
+
validate: (proposal: TProposal) => Promise<ValidationResult>;
|
|
12
12
|
};
|
|
13
13
|
makeProposal: (options?: any) => Promise<TProposal>;
|
|
14
14
|
makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
|
|
@@ -20,4 +20,4 @@ export interface ProposalValidatorTestParams<TProposal extends BlockProposal | C
|
|
|
20
20
|
epochCacheMock: () => MockProxy<EpochCacheInterface>;
|
|
21
21
|
}
|
|
22
22
|
export declare function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(params: ProposalValidatorTestParams<TProposal>): void;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBQ2xCLEtBQUssa0JBQWtCLEVBRXZCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsTUFBTSxXQUFXLDJCQUEyQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQy9GLGdCQUFnQixFQUFFLENBQ2hCLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEtBQzVCO1FBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUFFLENBQUM7SUFDdEUsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDN0csU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0lBQ2pDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsS0FBSyxVQUFVLENBQUM7SUFDckQsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDO0lBQ3hDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDckMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDcEIsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDdEQ7QUFFRCx3QkFBZ0IsNEJBQTRCLENBQUMsU0FBUyxTQUFTLGFBQWEsR0FBRyxrQkFBa0IsRUFDL0YsTUFBTSxFQUFFLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxRQXdNL0MifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC5B;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;IACtE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAwM/C"}
|
|
@@ -4,9 +4,10 @@ export function sharedProposalValidatorTests(params) {
|
|
|
4
4
|
describe('shared proposal validation logic', ()=>{
|
|
5
5
|
let epochCache;
|
|
6
6
|
let validator;
|
|
7
|
+
const previousSlot = getSlot(99);
|
|
7
8
|
const currentSlot = getSlot(100);
|
|
8
9
|
const nextSlot = getSlot(101);
|
|
9
|
-
function mockGetProposer(currentProposer, nextProposer) {
|
|
10
|
+
function mockGetProposer(currentProposer, nextProposer, previousProposer) {
|
|
10
11
|
epochCache.getProposerAttesterAddressInSlot.mockImplementation((slot)=>{
|
|
11
12
|
if (slot === currentSlot) {
|
|
12
13
|
return Promise.resolve(currentProposer);
|
|
@@ -14,6 +15,9 @@ export function sharedProposalValidatorTests(params) {
|
|
|
14
15
|
if (slot === nextSlot) {
|
|
15
16
|
return Promise.resolve(nextProposer);
|
|
16
17
|
}
|
|
18
|
+
if (slot === previousSlot && previousProposer) {
|
|
19
|
+
return Promise.resolve(previousProposer);
|
|
20
|
+
}
|
|
17
21
|
throw new Error('Unexpected argument');
|
|
18
22
|
});
|
|
19
23
|
}
|
|
@@ -27,18 +31,49 @@ export function sharedProposalValidatorTests(params) {
|
|
|
27
31
|
nextSlot: nextSlot
|
|
28
32
|
});
|
|
29
33
|
});
|
|
30
|
-
it('returns high tolerance error if slot number is not current or next slot', async ()=>{
|
|
34
|
+
it('returns high tolerance error if slot number is not current or next slot (outside clock tolerance)', async ()=>{
|
|
31
35
|
const header = makeHeader(1, 99, 99);
|
|
32
36
|
const mockProposal = await makeProposal({
|
|
33
37
|
blockHeader: header,
|
|
34
38
|
lastBlockHeader: header
|
|
35
39
|
});
|
|
40
|
+
// Mock getEpochAndSlotNow to return time OUTSIDE clock tolerance (1000ms elapsed)
|
|
41
|
+
epochCache.getEpochAndSlotNow.mockReturnValue({
|
|
42
|
+
epoch: 1,
|
|
43
|
+
slot: currentSlot,
|
|
44
|
+
ts: 1000n,
|
|
45
|
+
nowMs: 1001000n
|
|
46
|
+
});
|
|
36
47
|
epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(getAddress());
|
|
37
48
|
const result = await validator.validate(mockProposal);
|
|
38
|
-
expect(result).
|
|
49
|
+
expect(result).toEqual({
|
|
50
|
+
result: 'reject',
|
|
51
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
52
|
+
});
|
|
39
53
|
// Should not try to resolve proposers if base validation fails
|
|
40
54
|
expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled();
|
|
41
55
|
});
|
|
56
|
+
it('returns ignore if previous slot proposal is within clock tolerance', async ()=>{
|
|
57
|
+
const previousProposer = getSigner();
|
|
58
|
+
const header = makeHeader(1, 99, 99);
|
|
59
|
+
const mockProposal = await makeProposal({
|
|
60
|
+
blockHeader: header,
|
|
61
|
+
lastBlockHeader: header,
|
|
62
|
+
signer: previousProposer
|
|
63
|
+
});
|
|
64
|
+
// Mock getEpochAndSlotNow to return time WITHIN clock tolerance (100ms elapsed)
|
|
65
|
+
epochCache.getEpochAndSlotNow.mockReturnValue({
|
|
66
|
+
epoch: 1,
|
|
67
|
+
slot: currentSlot,
|
|
68
|
+
ts: 1000n,
|
|
69
|
+
nowMs: 1000100n
|
|
70
|
+
});
|
|
71
|
+
mockGetProposer(getAddress(), getAddress(), getAddress(previousProposer));
|
|
72
|
+
const result = await validator.validate(mockProposal);
|
|
73
|
+
expect(result).toEqual({
|
|
74
|
+
result: 'ignore'
|
|
75
|
+
});
|
|
76
|
+
});
|
|
42
77
|
it('returns mid tolerance error if proposer is not current proposer for current slot', async ()=>{
|
|
43
78
|
const currentProposer = getSigner();
|
|
44
79
|
const nextProposer = getSigner();
|
|
@@ -51,7 +86,10 @@ export function sharedProposalValidatorTests(params) {
|
|
|
51
86
|
});
|
|
52
87
|
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
53
88
|
const result = await validator.validate(mockProposal);
|
|
54
|
-
expect(result).
|
|
89
|
+
expect(result).toEqual({
|
|
90
|
+
result: 'reject',
|
|
91
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
92
|
+
});
|
|
55
93
|
});
|
|
56
94
|
it('returns mid tolerance error if proposer is not next proposer for next slot', async ()=>{
|
|
57
95
|
const currentProposer = getSigner();
|
|
@@ -65,7 +103,10 @@ export function sharedProposalValidatorTests(params) {
|
|
|
65
103
|
});
|
|
66
104
|
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
67
105
|
const result = await validator.validate(mockProposal);
|
|
68
|
-
expect(result).
|
|
106
|
+
expect(result).toEqual({
|
|
107
|
+
result: 'reject',
|
|
108
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
109
|
+
});
|
|
69
110
|
});
|
|
70
111
|
it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async ()=>{
|
|
71
112
|
const currentProposer = getSigner();
|
|
@@ -78,7 +119,10 @@ export function sharedProposalValidatorTests(params) {
|
|
|
78
119
|
});
|
|
79
120
|
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
80
121
|
const result = await validator.validate(mockProposal);
|
|
81
|
-
expect(result).
|
|
122
|
+
expect(result).toEqual({
|
|
123
|
+
result: 'reject',
|
|
124
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
125
|
+
});
|
|
82
126
|
});
|
|
83
127
|
it('returns undefined if proposal is valid for current slot and proposer', async ()=>{
|
|
84
128
|
const currentProposer = getSigner();
|
|
@@ -91,7 +135,9 @@ export function sharedProposalValidatorTests(params) {
|
|
|
91
135
|
});
|
|
92
136
|
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
93
137
|
const result = await validator.validate(mockProposal);
|
|
94
|
-
expect(result).
|
|
138
|
+
expect(result).toEqual({
|
|
139
|
+
result: 'accept'
|
|
140
|
+
});
|
|
95
141
|
});
|
|
96
142
|
it('returns undefined if proposal is valid for next slot and proposer', async ()=>{
|
|
97
143
|
const currentProposer = getSigner();
|
|
@@ -104,7 +150,9 @@ export function sharedProposalValidatorTests(params) {
|
|
|
104
150
|
});
|
|
105
151
|
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
106
152
|
const result = await validator.validate(mockProposal);
|
|
107
|
-
expect(result).
|
|
153
|
+
expect(result).toEqual({
|
|
154
|
+
result: 'accept'
|
|
155
|
+
});
|
|
108
156
|
});
|
|
109
157
|
describe('transaction permission validation', ()=>{
|
|
110
158
|
it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async ()=>{
|
|
@@ -121,7 +169,10 @@ export function sharedProposalValidatorTests(params) {
|
|
|
121
169
|
});
|
|
122
170
|
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
123
171
|
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
124
|
-
expect(result).
|
|
172
|
+
expect(result).toEqual({
|
|
173
|
+
result: 'reject',
|
|
174
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
175
|
+
});
|
|
125
176
|
});
|
|
126
177
|
it('returns undefined if txs not permitted but proposal has no txHashes', async ()=>{
|
|
127
178
|
const currentProposer = getSigner();
|
|
@@ -137,7 +188,9 @@ export function sharedProposalValidatorTests(params) {
|
|
|
137
188
|
});
|
|
138
189
|
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
139
190
|
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
140
|
-
expect(result).
|
|
191
|
+
expect(result).toEqual({
|
|
192
|
+
result: 'accept'
|
|
193
|
+
});
|
|
141
194
|
});
|
|
142
195
|
it('returns undefined if txs permitted and proposal contains txHashes', async ()=>{
|
|
143
196
|
const currentProposer = getSigner();
|
|
@@ -150,7 +203,9 @@ export function sharedProposalValidatorTests(params) {
|
|
|
150
203
|
});
|
|
151
204
|
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
152
205
|
const result = await validator.validate(mockProposal);
|
|
153
|
-
expect(result).
|
|
206
|
+
expect(result).toEqual({
|
|
207
|
+
result: 'accept'
|
|
208
|
+
});
|
|
154
209
|
});
|
|
155
210
|
});
|
|
156
211
|
});
|
|
@@ -8,4 +8,4 @@ export declare class BlockHeaderTxValidator<T extends AnyTx> implements TxValida
|
|
|
8
8
|
constructor(archiveSource: ArchiveSource);
|
|
9
9
|
validateTx(tx: T): Promise<TxValidationResult>;
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfaGVhZGVyX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9ibG9ja19oZWFkZXJfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpELE9BQU8sRUFBRSxLQUFLLEtBQUssRUFBeUIsS0FBSyxrQkFBa0IsRUFBRSxLQUFLLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhILE1BQU0sV0FBVyxhQUFhO0lBQzVCLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDeEU7QUFFRCxxQkFBYSxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFFLFlBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQzs7SUFJNUUsWUFBWSxhQUFhLEVBQUUsYUFBYSxFQUV2QztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVNuRDtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_header_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/block_header_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEzD,OAAO,EAAE,KAAK,KAAK,EAAyB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CACxE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAI5E,YAAY,aAAa,EAAE,aAAa,EAEvC;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"block_header_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/block_header_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEzD,OAAO,EAAE,KAAK,KAAK,EAAyB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CACxE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAI5E,YAAY,aAAa,EAAE,aAAa,EAEvC;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CASnD;CACF"}
|
|
@@ -8,7 +8,7 @@ export class BlockHeaderTxValidator {
|
|
|
8
8
|
}
|
|
9
9
|
async validateTx(tx) {
|
|
10
10
|
const [index] = await this.#archiveSource.getArchiveIndices([
|
|
11
|
-
await tx.data.constants.anchorBlockHeader.hash()
|
|
11
|
+
(await tx.data.constants.anchorBlockHeader.hash()).toField()
|
|
12
12
|
]);
|
|
13
13
|
if (index === undefined) {
|
|
14
14
|
this.#log.verbose(`Rejecting tx ${'txHash' in tx ? tx.txHash : tx.hash} for referencing an unknown block header`);
|
|
@@ -4,7 +4,7 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
|
4
4
|
import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
|
|
5
5
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
6
6
|
import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
7
|
-
import { BlockProposal, CheckpointAttestation, CheckpointProposal, type Gossipable, P2PClientType, TopicType } from '@aztec/stdlib/p2p';
|
|
7
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal, type Gossipable, P2PClientType, type ValidationResult as P2PValidationResult, TopicType } from '@aztec/stdlib/p2p';
|
|
8
8
|
import { Tx } from '@aztec/stdlib/tx';
|
|
9
9
|
import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
|
|
10
10
|
import { type Message, type PeerId, TopicValidatorResult } from '@libp2p/interface';
|
|
@@ -168,25 +168,25 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
168
168
|
* @param attestation - The checkpoint attestation to validate.
|
|
169
169
|
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
170
170
|
*/
|
|
171
|
-
validateCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<
|
|
171
|
+
validateCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<P2PValidationResult>;
|
|
172
172
|
/**
|
|
173
173
|
* Validate a block proposal.
|
|
174
174
|
*
|
|
175
175
|
* @param block - The block proposal to validate.
|
|
176
176
|
* @returns True if the block proposal is valid, false otherwise.
|
|
177
177
|
*/
|
|
178
|
-
validateBlockProposal(peerId: PeerId, block: BlockProposal): Promise<
|
|
178
|
+
validateBlockProposal(peerId: PeerId, block: BlockProposal): Promise<P2PValidationResult>;
|
|
179
179
|
/**
|
|
180
180
|
* Validate a checkpoint proposal.
|
|
181
181
|
*
|
|
182
182
|
* @param checkpoint - The checkpoint proposal to validate.
|
|
183
183
|
* @returns True if the checkpoint proposal is valid, false otherwise.
|
|
184
184
|
*/
|
|
185
|
-
validateCheckpointProposal(peerId: PeerId, checkpoint: CheckpointProposal): Promise<
|
|
185
|
+
validateCheckpointProposal(peerId: PeerId, checkpoint: CheckpointProposal): Promise<P2PValidationResult>;
|
|
186
186
|
getPeerScore(peerId: PeerId): number;
|
|
187
187
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
188
188
|
private sendToPeers;
|
|
189
189
|
private stopLibP2P;
|
|
190
190
|
}
|
|
191
191
|
export {};
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9saWJwMnAvbGlicDJwX3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUk5RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQTZDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0YsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQVcsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRSxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixrQkFBa0IsRUFFbEIsS0FBSyxVQUFVLEVBQ2YsYUFBYSxFQUViLEtBQUssZ0JBQWdCLElBQUksbUJBQW1CLEVBRTVDLFNBQVMsRUFJVixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxFQUFFLEVBQTBELE1BQU0sa0JBQWtCLENBQUM7QUFHOUYsT0FBTyxFQUlMLEtBQUssZUFBZSxFQUNwQixVQUFVLEVBRVgsTUFBTSx5QkFBeUIsQ0FBQztBQWNqQyxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQTRCLEtBQUssTUFBTSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJOUcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3pDLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFFBQVEs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
|
|
@@ -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;AAI9D,OAAO,EAAE,KAAK,MAAM,EAA6C,MAAM,uBAAuB,CAAC;AAG/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,
|
|
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;AAI9D,OAAO,EAAE,KAAK,MAAM,EAA6C,MAAM,uBAAuB,CAAC;AAG/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACvH,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAElB,KAAK,UAAU,EACf,aAAa,EAEb,KAAK,gBAAgB,IAAI,mBAAmB,EAE5C,SAAS,EAIV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,EAAE,EAA0D,MAAM,kBAAkB,CAAC;AAG9F,OAAO,EAIL,KAAK,eAAe,EACpB,UAAU,EAEX,MAAM,yBAAyB,CAAC;AAcjC,OAAO,EAAE,KAAK,OAAO,EAA4B,KAAK,MAAM,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI9G,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAmB7D,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,eAAe,CAAC;AAMtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAEL,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,KAAK,yBAAyB,EAE9B,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,WAAW,EAGX,aAAa,EAKd,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EACV,wBAAwB,EACxB,6BAA6B,EAC7B,UAAU,EACV,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAYvB,KAAK,+BAA+B,CAAC,CAAC,IAClC;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAA;CAAE,GAC9E;IAAE,GAAG,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAA;CAAE,CAAC;AAE7D;;GAEG;AACH,qBAAa,aAAa,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CAAC,IAAI,CAAE,SAAQ,UAAW,YAAW,UAAU;IAqC7G,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,SAAS,CAAC,IAAI,EAAE,YAAY;IAC5B,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;IACnB,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAC5B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,sBAAsB;IA9ChC,OAAO,CAAC,uBAAuB,CAAC,CAAiB;IACjD,OAAO,CAAC,mBAAmB,CAA0F;IAGrH,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,2BAA2B,CAA8B;IACjE,OAAO,CAAC,8BAA8B,CAAiC;IAEvE,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,YAAY,CAA8D;IAElF,OAAO,CAAC,SAAS,CAA6D;IAE9E;;;;OAIG;IACH,OAAO,CAAC,qBAAqB,CAA2B;IAExD;;;;OAIG;IACH,OAAO,CAAC,0BAA0B,CAAgC;IAElE,OAAO,CAAC,qBAAqB,CAA6C;IAE1E,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,SAAS,CAAkB;IAEnC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,YACU,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,SAAS,EACf,IAAI,EAAE,YAAY,EACpB,oBAAoB,EAAE,oBAAoB,EAC1C,OAAO,EAAE,gBAAgB,EACzB,WAAW,EAAE,oBAAoB,EAC/B,QAAQ,EAAE,QAAQ,EACpB,QAAQ,EAAE,aAAa,GAAG,kBAAkB,EAC5C,UAAU,EAAE,mBAAmB,EAC/B,aAAa,EAAE,6BAA6B,EAC5C,sBAAsB,EAAE,sBAAsB,EACtD,SAAS,EAAE,eAAe,EAC1B,MAAM,GAAE,MAA2C,EAwDpD;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAEpD;IAED;;;;;OAKG;IACH,OAAoB,GAAG,CAAC,CAAC,SAAS,aAAa,EAC7C,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QACJ,QAAQ,EAAE,QAAQ,CAAC;QACnB,aAAa,EAAE,aAAa,GAAG,kBAAkB,CAAC;QAClD,UAAU,EAAE,mBAAmB,CAAC;QAChC,aAAa,EAAE,6BAA6B,CAAC;QAC7C,sBAAsB,EAAE,sBAAsB,CAAC;QAC/C,SAAS,EAAE,iBAAiB,CAAC;QAC7B,SAAS,EAAE,eAAe,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,MAAM,CAAC;KACxB,6BAiOF;IAED;;;OAGG;IACU,KAAK,kBA4EjB;IAED;;;OAGG;IACU,IAAI,kBAgBhB;IAED,qBAAqB,CACnB,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,yBAAyB,EAClC,SAAS,CAAC,EAAE,4BAA4B,CAAC,kBAAkB,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC,CAEf;IAEM,8BAA8B,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAEjE;IAEM,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAEpD;IAED,OAAO,CAAC,oBAAoB;IAa5B;;;;;OAKG;IACH,gBAAgB,CAAC,WAAW,SAAS,kBAAkB,EACrD,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAChE,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAElE;IAED;;;OAGG;IACI,MAAM,IAAI,GAAG,GAAG,SAAS,CAE/B;IAEM,6BAA6B,CAAC,QAAQ,EAAE,wBAAwB,QAEtE;IAEM,kCAAkC,CAAC,QAAQ,EAAE,6BAA6B,QAEhF;IAED;;;OAGG;IACH,OAAO,CAAC,gBAAgB;YAaV,cAAc;IAY5B;;;;OAIG;IACH,SAAS,CAAC,0BAA0B,CAClC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,CAgC5C;IAED;;;;;;OAMG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;;;OAIG;IACH,UAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAsFjF;IAED,UAAgB,uBAAuB,CAAC,CAAC,EACvC,cAAc,EAAE,MAAM,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,EACjE,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAoB7C;IAED,UAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAwClF;YAMa,oCAAoC;YAoEpC,oBAAoB;YAyDpB,yBAAyB;YAuCzB,gCAAgC;YA4DhC,8BAA8B;IA8C5C;;;OAGG;IACU,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,iBAMtD;YAYa,yBAAyB;YAgGzB,oBAAoB;YAkCpB,sBAAsB;IAiCpC,OAAO,CAAC,0BAA0B;YAcpB,mBAAmB;YAuBnB,oBAAoB;YA4BpB,UAAU;IAWX,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9C;YAYa,uBAAuB;YA8BvB,cAAc;YAuCd,wBAAwB;IAuBtC;;;;;OAKG;IAMU,6BAA6B,CACxC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,qBAAqB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAS9B;IAED;;;;;OAKG;IAIU,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CASrG;IAED;;;;;OAKG;IAIU,0BAA0B,CACrC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAS9B;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1C;IAEM,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAEjG;YAEa,WAAW;YAcX,UAAU;CAYzB"}
|
|
@@ -1104,7 +1104,8 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1104
1104
|
const validationFunc = async ()=>{
|
|
1105
1105
|
const attestation = CheckpointAttestation.fromBuffer(payloadData);
|
|
1106
1106
|
const pool = this.mempools.attestationPool;
|
|
1107
|
-
const
|
|
1107
|
+
const validationResult = await this.validateCheckpointAttestation(source, attestation);
|
|
1108
|
+
const isValid = validationResult.result === 'accept';
|
|
1108
1109
|
const exists = isValid && await pool.hasCheckpointAttestation(attestation);
|
|
1109
1110
|
let canAdd = true;
|
|
1110
1111
|
if (isValid && !exists) {
|
|
@@ -1120,11 +1121,11 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1120
1121
|
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber.toString(),
|
|
1121
1122
|
[Attributes.P2P_ID]: source.toString()
|
|
1122
1123
|
});
|
|
1123
|
-
if (
|
|
1124
|
+
if (validationResult.result === 'reject') {
|
|
1124
1125
|
return {
|
|
1125
1126
|
result: TopicValidatorResult.Reject
|
|
1126
1127
|
};
|
|
1127
|
-
} else if (exists) {
|
|
1128
|
+
} else if (validationResult.result === 'ignore' || exists) {
|
|
1128
1129
|
return {
|
|
1129
1130
|
result: TopicValidatorResult.Ignore,
|
|
1130
1131
|
obj: attestation
|
|
@@ -1163,7 +1164,8 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1163
1164
|
async processBlockFromPeer(payloadData, msgId, source) {
|
|
1164
1165
|
const validationFunc = async ()=>{
|
|
1165
1166
|
const block = BlockProposal.fromBuffer(payloadData);
|
|
1166
|
-
const
|
|
1167
|
+
const validationResult = await this.validateBlockProposal(source, block);
|
|
1168
|
+
const isValid = validationResult.result === 'accept';
|
|
1167
1169
|
const pool = this.mempools.attestationPool;
|
|
1168
1170
|
const exists = isValid && await pool.hasBlockProposal(block);
|
|
1169
1171
|
const canAdd = isValid && await pool.canAddProposal(block);
|
|
@@ -1174,11 +1176,11 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1174
1176
|
[Attributes.SLOT_NUMBER]: block.slotNumber.toString(),
|
|
1175
1177
|
[Attributes.P2P_ID]: source.toString()
|
|
1176
1178
|
});
|
|
1177
|
-
if (
|
|
1179
|
+
if (validationResult.result === 'reject') {
|
|
1178
1180
|
return {
|
|
1179
1181
|
result: TopicValidatorResult.Reject
|
|
1180
1182
|
};
|
|
1181
|
-
} else if (exists) {
|
|
1183
|
+
} else if (validationResult.result === 'ignore' || exists) {
|
|
1182
1184
|
return {
|
|
1183
1185
|
result: TopicValidatorResult.Ignore,
|
|
1184
1186
|
obj: block
|
|
@@ -1247,7 +1249,8 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1247
1249
|
// TODO(palla/mbps): This pattern is repeated across multiple message handlers, consider abstracting it.
|
|
1248
1250
|
const validationFunc = async ()=>{
|
|
1249
1251
|
const checkpoint = CheckpointProposal.fromBuffer(payloadData);
|
|
1250
|
-
const
|
|
1252
|
+
const validationResult = await this.validateCheckpointProposal(source, checkpoint);
|
|
1253
|
+
const isValid = validationResult.result === 'accept';
|
|
1251
1254
|
const pool = this.mempools.attestationPool;
|
|
1252
1255
|
const exists = isValid && await pool.hasCheckpointProposal(checkpoint);
|
|
1253
1256
|
const canAdd = isValid && await pool.canAddCheckpointProposal(checkpoint);
|
|
@@ -1258,11 +1261,11 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1258
1261
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1259
1262
|
[Attributes.P2P_ID]: source.toString()
|
|
1260
1263
|
});
|
|
1261
|
-
if (
|
|
1264
|
+
if (validationResult.result === 'reject') {
|
|
1262
1265
|
return {
|
|
1263
1266
|
result: TopicValidatorResult.Reject
|
|
1264
1267
|
};
|
|
1265
|
-
} else if (exists) {
|
|
1268
|
+
} else if (validationResult.result === 'ignore' || exists) {
|
|
1266
1269
|
return {
|
|
1267
1270
|
result: TopicValidatorResult.Ignore,
|
|
1268
1271
|
obj: checkpoint
|
|
@@ -1645,13 +1648,12 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1645
1648
|
* @param attestation - The checkpoint attestation to validate.
|
|
1646
1649
|
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1647
1650
|
*/ async validateCheckpointAttestation(peerId, attestation) {
|
|
1648
|
-
const
|
|
1649
|
-
if (
|
|
1651
|
+
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1652
|
+
if (result.result === 'reject') {
|
|
1650
1653
|
this.logger.debug(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1651
|
-
this.peerManager.penalizePeer(peerId, severity);
|
|
1652
|
-
return false;
|
|
1654
|
+
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1653
1655
|
}
|
|
1654
|
-
return
|
|
1656
|
+
return result;
|
|
1655
1657
|
}
|
|
1656
1658
|
/**
|
|
1657
1659
|
* Validate a block proposal.
|
|
@@ -1659,13 +1661,12 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1659
1661
|
* @param block - The block proposal to validate.
|
|
1660
1662
|
* @returns True if the block proposal is valid, false otherwise.
|
|
1661
1663
|
*/ async validateBlockProposal(peerId, block) {
|
|
1662
|
-
const
|
|
1663
|
-
if (
|
|
1664
|
+
const result = await this.blockProposalValidator.validate(block);
|
|
1665
|
+
if (result.result === 'reject') {
|
|
1664
1666
|
this.logger.debug(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1665
|
-
this.peerManager.penalizePeer(peerId, severity);
|
|
1666
|
-
return false;
|
|
1667
|
+
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1667
1668
|
}
|
|
1668
|
-
return
|
|
1669
|
+
return result;
|
|
1669
1670
|
}
|
|
1670
1671
|
/**
|
|
1671
1672
|
* Validate a checkpoint proposal.
|
|
@@ -1673,13 +1674,12 @@ _dec = trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
|
1673
1674
|
* @param checkpoint - The checkpoint proposal to validate.
|
|
1674
1675
|
* @returns True if the checkpoint proposal is valid, false otherwise.
|
|
1675
1676
|
*/ async validateCheckpointProposal(peerId, checkpoint) {
|
|
1676
|
-
const
|
|
1677
|
-
if (
|
|
1677
|
+
const result = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1678
|
+
if (result.result === 'reject') {
|
|
1678
1679
|
this.logger.debug(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1679
|
-
this.peerManager.penalizePeer(peerId, severity);
|
|
1680
|
-
return false;
|
|
1680
|
+
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1681
1681
|
}
|
|
1682
|
-
return
|
|
1682
|
+
return result;
|
|
1683
1683
|
}
|
|
1684
1684
|
getPeerScore(peerId) {
|
|
1685
1685
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import {
|
|
2
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
3
3
|
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
4
|
import type { PeerId } from '@libp2p/interface';
|
|
5
5
|
import type { P2PReqRespConfig } from './config.js';
|
|
@@ -142,7 +142,7 @@ export declare const subProtocolMap: {
|
|
|
142
142
|
};
|
|
143
143
|
"/aztec/req/block/1.0.0": {
|
|
144
144
|
request: typeof Fr;
|
|
145
|
-
response: typeof
|
|
145
|
+
response: typeof L2Block;
|
|
146
146
|
};
|
|
147
147
|
"/aztec/req/auth/1.0.0": {
|
|
148
148
|
request: typeof AuthRequest;
|
|
@@ -162,4 +162,4 @@ export interface ReqRespInterface {
|
|
|
162
162
|
updateConfig(config: Partial<P2PReqRespConfig>): void;
|
|
163
163
|
}
|
|
164
164
|
export {};
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFLakQsZUFBTyxNQUFNLGFBQWEsMEJBQTBCLENBQUM7QUFDckQsZUFBTyxNQUFNLGVBQWUsNEJBQTRCLENBQUM7QUFDekQsZUFBTyxNQUFNLGdCQUFnQiw2QkFBNkIsQ0FBQztBQUMzRCxlQUFPLE1BQU0sZUFBZSx3QkFBd0IsQ0FBQztBQUNyRCxlQUFPLE1BQU0sa0JBQWtCLDJCQUEyQixDQUFDO0FBQzNELGVBQU8sTUFBTSxhQUFhLDBCQUEwQixDQUFDO0FBQ3JELGVBQU8sTUFBTSxzQkFBc0IsK0JBQStCLENBQUM7QUFFbkUsb0JBQVksa0JBQWtCO0lBQzVCLElBQUksMEJBQWdCO0lBQ3BCLE1BQU0sNEJBQWtCO0lBQ3hCLE9BQU8sNkJBQW1CO0lBQzFCLEVBQUUsd0JBQWtCO0lBQ3BCLEtB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"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"}
|