@aztec/validator-client 0.0.1-commit.f295ac2 → 0.0.1-commit.f2ce05ee
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -10
- package/dest/block_proposal_handler.d.ts +5 -7
- package/dest/block_proposal_handler.d.ts.map +1 -1
- package/dest/block_proposal_handler.js +17 -32
- package/dest/checkpoint_builder.d.ts +11 -12
- package/dest/checkpoint_builder.d.ts.map +1 -1
- package/dest/checkpoint_builder.js +38 -25
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +4 -6
- package/dest/key_store/ha_key_store.d.ts +1 -1
- package/dest/key_store/ha_key_store.d.ts.map +1 -1
- package/dest/key_store/ha_key_store.js +2 -2
- package/dest/metrics.d.ts +4 -3
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +34 -5
- package/dest/tx_validator/tx_validator_factory.d.ts +4 -3
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.js +17 -16
- package/dest/validator.d.ts +12 -8
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +46 -28
- package/package.json +19 -17
- package/src/block_proposal_handler.ts +25 -46
- package/src/checkpoint_builder.ts +57 -27
- package/src/config.ts +4 -6
- package/src/key_store/ha_key_store.ts +2 -2
- package/src/metrics.ts +45 -6
- package/src/tx_validator/tx_validator_factory.ts +52 -31
- package/src/validator.ts +52 -34
package/dest/metrics.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Attributes, Metrics } from '@aztec/telemetry-client';
|
|
1
|
+
import { Attributes, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
|
|
2
2
|
export class ValidatorMetrics {
|
|
3
3
|
failedReexecutionCounter;
|
|
4
4
|
successfulAttestationsCount;
|
|
@@ -9,10 +9,39 @@ export class ValidatorMetrics {
|
|
|
9
9
|
reexDuration;
|
|
10
10
|
constructor(telemetryClient){
|
|
11
11
|
const meter = telemetryClient.getMeter('Validator');
|
|
12
|
-
this.failedReexecutionCounter = meter
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
this.failedReexecutionCounter = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_FAILED_REEXECUTION_COUNT, {
|
|
13
|
+
[Attributes.STATUS]: [
|
|
14
|
+
'failed'
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
this.successfulAttestationsCount = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_ATTESTATION_SUCCESS_COUNT);
|
|
18
|
+
this.failedAttestationsBadProposalCount = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_ATTESTATION_FAILED_BAD_PROPOSAL_COUNT, {
|
|
19
|
+
[Attributes.ERROR_TYPE]: [
|
|
20
|
+
'invalid_proposal',
|
|
21
|
+
'state_mismatch',
|
|
22
|
+
'failed_txs',
|
|
23
|
+
'in_hash_mismatch',
|
|
24
|
+
'parent_block_wrong_slot'
|
|
25
|
+
],
|
|
26
|
+
[Attributes.IS_COMMITTEE_MEMBER]: [
|
|
27
|
+
true,
|
|
28
|
+
false
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
this.failedAttestationsNodeIssueCount = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_ATTESTATION_FAILED_NODE_ISSUE_COUNT, {
|
|
32
|
+
[Attributes.ERROR_TYPE]: [
|
|
33
|
+
'parent_block_not_found',
|
|
34
|
+
'global_variables_mismatch',
|
|
35
|
+
'block_number_already_exists',
|
|
36
|
+
'txs_not_available',
|
|
37
|
+
'timeout',
|
|
38
|
+
'unknown_error'
|
|
39
|
+
],
|
|
40
|
+
[Attributes.IS_COMMITTEE_MEMBER]: [
|
|
41
|
+
true,
|
|
42
|
+
false
|
|
43
|
+
]
|
|
44
|
+
});
|
|
16
45
|
this.reexMana = meter.createHistogram(Metrics.VALIDATOR_RE_EXECUTION_MANA);
|
|
17
46
|
this.reexTx = meter.createHistogram(Metrics.VALIDATOR_RE_EXECUTION_TX_COUNT);
|
|
18
47
|
this.reexDuration = meter.createGauge(Metrics.VALIDATOR_RE_EXECUTION_TIME);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { LoggerBindings } from '@aztec/foundation/log';
|
|
2
3
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
3
4
|
import type { GasFees } from '@aztec/stdlib/gas';
|
|
4
5
|
import type { AllowedElement, ClientProtocolCircuitVerifier, MerkleTreeReadOperations, PublicProcessorValidator } from '@aztec/stdlib/interfaces/server';
|
|
@@ -13,6 +14,6 @@ export declare function createValidatorForAcceptingTxs(db: MerkleTreeReadOperati
|
|
|
13
14
|
timestamp: UInt64;
|
|
14
15
|
blockNumber: BlockNumber;
|
|
15
16
|
txsPermitted: boolean;
|
|
16
|
-
}): TxValidator<Tx>;
|
|
17
|
-
export declare function createValidatorForBlockBuilding(db: MerkleTreeReadOperations, contractDataSource: ContractDataSource, globalVariables: GlobalVariables, setupAllowList: AllowedElement[]): PublicProcessorValidator;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
}, bindings?: LoggerBindings): TxValidator<Tx>;
|
|
18
|
+
export declare function createValidatorForBlockBuilding(db: MerkleTreeReadOperations, contractDataSource: ContractDataSource, globalVariables: GlobalVariables, setupAllowList: AllowedElement[], bindings?: LoggerBindings): PublicProcessorValidator;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdHhfdmFsaWRhdG9yX2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBaUI1RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxFQUNWLGNBQWMsRUFDZCw2QkFBNkIsRUFDN0Isd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN6QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUlsRCx3QkFBZ0IsOEJBQThCLENBQzVDLEVBQUUsRUFBRSx3QkFBd0IsRUFDNUIsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQ3RDLFFBQVEsRUFBRSw2QkFBNkIsR0FBRyxTQUFTLEVBQ25ELEVBQ0UsU0FBUyxFQUNULGFBQWEsRUFDYixjQUFjLEVBQ2QsT0FBTyxFQUNQLGtCQUFrQixFQUNsQixTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFDYixFQUFFO0lBQ0QsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLGNBQWMsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUNqQyxPQUFPLEVBQUUsT0FBTyxDQUFDO0lBQ2pCLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsV0FBVyxFQUFFLFdBQVcsQ0FBQztJQUN6QixZQUFZLEVBQUUsT0FBTyxDQUFDO0NBQ3ZCLEVBQ0QsUUFBUSxDQUFDLEVBQUUsY0FBYyxHQUN4QixXQUFXLENBQUMsRUFBRSxDQUFDLENBcUNqQjtBQUVELHdCQUFnQiwrQkFBK0IsQ0FDN0MsRUFBRSxFQUFFLHdCQUF3QixFQUM1QixrQkFBa0IsRUFBRSxrQkFBa0IsRUFDdEMsZUFBZSxFQUFFLGVBQWUsRUFDaEMsY0FBYyxFQUFFLGNBQWMsRUFBRSxFQUNoQyxRQUFRLENBQUMsRUFBRSxjQUFjLEdBQ3hCLHdCQUF3QixDQWlCMUIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiB5D,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,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,wBAAwB,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,6BAA6B,GAAG,SAAS,EACnD,EACE,SAAS,EACT,aAAa,EACb,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,YAAY,EACb,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;CACvB,EACD,QAAQ,CAAC,EAAE,cAAc,GACxB,WAAW,CAAC,EAAE,CAAC,CAqCjB;AAED,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,wBAAwB,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,cAAc,EAAE,EAChC,QAAQ,CAAC,EAAE,cAAc,GACxB,wBAAwB,CAiB1B"}
|
|
@@ -1,53 +1,54 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
3
|
-
import { AggregateTxValidator, ArchiveCache, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, GasTxValidator, MetadataTxValidator, PhasesTxValidator, TimestampTxValidator, TxPermittedValidator, TxProofValidator } from '@aztec/p2p';
|
|
3
|
+
import { AggregateTxValidator, ArchiveCache, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, GasTxValidator, MetadataTxValidator, PhasesTxValidator, SizeTxValidator, TimestampTxValidator, TxPermittedValidator, TxProofValidator } from '@aztec/p2p';
|
|
4
4
|
import { ProtocolContractAddress, protocolContractsHash } from '@aztec/protocol-contracts';
|
|
5
5
|
import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
|
|
6
6
|
import { NullifierCache } from './nullifier_cache.js';
|
|
7
|
-
export function createValidatorForAcceptingTxs(db, contractDataSource, verifier, { l1ChainId, rollupVersion, setupAllowList, gasFees, skipFeeEnforcement, timestamp, blockNumber, txsPermitted }) {
|
|
7
|
+
export function createValidatorForAcceptingTxs(db, contractDataSource, verifier, { l1ChainId, rollupVersion, setupAllowList, gasFees, skipFeeEnforcement, timestamp, blockNumber, txsPermitted }, bindings) {
|
|
8
8
|
const validators = [
|
|
9
|
-
new TxPermittedValidator(txsPermitted),
|
|
10
|
-
new
|
|
9
|
+
new TxPermittedValidator(txsPermitted, bindings),
|
|
10
|
+
new SizeTxValidator(bindings),
|
|
11
|
+
new DataTxValidator(bindings),
|
|
11
12
|
new MetadataTxValidator({
|
|
12
13
|
l1ChainId: new Fr(l1ChainId),
|
|
13
14
|
rollupVersion: new Fr(rollupVersion),
|
|
14
15
|
protocolContractsHash,
|
|
15
16
|
vkTreeRoot: getVKTreeRoot()
|
|
16
|
-
}),
|
|
17
|
+
}, bindings),
|
|
17
18
|
new TimestampTxValidator({
|
|
18
19
|
timestamp,
|
|
19
20
|
blockNumber
|
|
20
|
-
}),
|
|
21
|
-
new DoubleSpendTxValidator(new NullifierCache(db)),
|
|
22
|
-
new PhasesTxValidator(contractDataSource, setupAllowList, timestamp),
|
|
23
|
-
new BlockHeaderTxValidator(new ArchiveCache(db))
|
|
21
|
+
}, bindings),
|
|
22
|
+
new DoubleSpendTxValidator(new NullifierCache(db), bindings),
|
|
23
|
+
new PhasesTxValidator(contractDataSource, setupAllowList, timestamp, bindings),
|
|
24
|
+
new BlockHeaderTxValidator(new ArchiveCache(db), bindings)
|
|
24
25
|
];
|
|
25
26
|
if (!skipFeeEnforcement) {
|
|
26
|
-
validators.push(new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees));
|
|
27
|
+
validators.push(new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings));
|
|
27
28
|
}
|
|
28
29
|
if (verifier) {
|
|
29
|
-
validators.push(new TxProofValidator(verifier));
|
|
30
|
+
validators.push(new TxProofValidator(verifier, bindings));
|
|
30
31
|
}
|
|
31
32
|
return new AggregateTxValidator(...validators);
|
|
32
33
|
}
|
|
33
|
-
export function createValidatorForBlockBuilding(db, contractDataSource, globalVariables, setupAllowList) {
|
|
34
|
+
export function createValidatorForBlockBuilding(db, contractDataSource, globalVariables, setupAllowList, bindings) {
|
|
34
35
|
const nullifierCache = new NullifierCache(db);
|
|
35
36
|
const archiveCache = new ArchiveCache(db);
|
|
36
37
|
const publicStateSource = new DatabasePublicStateSource(db);
|
|
37
38
|
return {
|
|
38
|
-
preprocessValidator: preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, globalVariables, setupAllowList),
|
|
39
|
+
preprocessValidator: preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, globalVariables, setupAllowList, bindings),
|
|
39
40
|
nullifierCache
|
|
40
41
|
};
|
|
41
42
|
}
|
|
42
|
-
function preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, globalVariables, setupAllowList) {
|
|
43
|
+
function preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, globalVariables, setupAllowList, bindings) {
|
|
43
44
|
// We don't include the TxProofValidator nor the DataTxValidator here because they are already checked by the time we get to block building.
|
|
44
45
|
return new AggregateTxValidator(new MetadataTxValidator({
|
|
45
46
|
l1ChainId: globalVariables.chainId,
|
|
46
47
|
rollupVersion: globalVariables.version,
|
|
47
48
|
protocolContractsHash,
|
|
48
49
|
vkTreeRoot: getVKTreeRoot()
|
|
49
|
-
}), new TimestampTxValidator({
|
|
50
|
+
}, bindings), new TimestampTxValidator({
|
|
50
51
|
timestamp: globalVariables.timestamp,
|
|
51
52
|
blockNumber: globalVariables.blockNumber
|
|
52
|
-
}), new DoubleSpendTxValidator(nullifierCache), new PhasesTxValidator(contractDataSource, setupAllowList, globalVariables.timestamp), new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, globalVariables.gasFees), new BlockHeaderTxValidator(archiveCache));
|
|
53
|
+
}, bindings), new DoubleSpendTxValidator(nullifierCache, bindings), new PhasesTxValidator(contractDataSource, setupAllowList, globalVariables.timestamp, bindings), new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, globalVariables.gasFees, bindings), new BlockHeaderTxValidator(archiveCache, bindings));
|
|
53
54
|
}
|
package/dest/validator.d.ts
CHANGED
|
@@ -7,12 +7,12 @@ import type { Signature } from '@aztec/foundation/eth-signature';
|
|
|
7
7
|
import { type Logger } from '@aztec/foundation/log';
|
|
8
8
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
9
9
|
import type { KeystoreManager } from '@aztec/node-keystore';
|
|
10
|
-
import type { P2P, PeerId
|
|
10
|
+
import type { P2P, PeerId } from '@aztec/p2p';
|
|
11
11
|
import { type Watcher, type WatcherEmitter } from '@aztec/slasher';
|
|
12
12
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
13
13
|
import type { CommitteeAttestationsAndSigners, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
14
|
-
import type { CreateCheckpointProposalLastBlockData, Validator, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
15
|
-
import type
|
|
14
|
+
import type { CreateCheckpointProposalLastBlockData, ITxProvider, Validator, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
15
|
+
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
16
16
|
import type { BlockProposal, BlockProposalOptions, CheckpointAttestation, CheckpointProposalCore, CheckpointProposalOptions } from '@aztec/stdlib/p2p';
|
|
17
17
|
import { CheckpointProposal } from '@aztec/stdlib/p2p';
|
|
18
18
|
import type { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
@@ -48,11 +48,10 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
48
48
|
private lastEpochForCommitteeUpdateLoop;
|
|
49
49
|
private epochCacheUpdateLoop;
|
|
50
50
|
private proposersOfInvalidBlocks;
|
|
51
|
-
private validatedBlockSlots;
|
|
52
51
|
protected constructor(keyStore: ExtendedValidatorKeyStore, epochCache: EpochCache, p2pClient: P2P, blockProposalHandler: BlockProposalHandler, blockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, config: ValidatorClientFullConfig, blobClient: BlobClientInterface, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: Logger);
|
|
53
52
|
static validateKeyStoreConfiguration(keyStoreManager: KeystoreManager, logger?: Logger): void;
|
|
54
53
|
private handleEpochCommitteeUpdate;
|
|
55
|
-
static new(config: ValidatorClientFullConfig, checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, epochCache: EpochCache, p2pClient: P2P, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider:
|
|
54
|
+
static new(config: ValidatorClientFullConfig, checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, epochCache: EpochCache, p2pClient: P2P, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: ITxProvider, keyStoreManager: KeystoreManager, blobClient: BlobClientInterface, dateProvider?: DateProvider, telemetry?: TelemetryClient): Promise<ValidatorClient>;
|
|
56
55
|
getValidatorAddresses(): EthAddress[];
|
|
57
56
|
getBlockProposalHandler(): BlockProposalHandler;
|
|
58
57
|
signWithAddress(addr: EthAddress, msg: TypedDataDefinition, context: SigningContext): Promise<Signature>;
|
|
@@ -85,8 +84,13 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
85
84
|
private extractCheckpointConstants;
|
|
86
85
|
private uploadBlobsForCheckpoint;
|
|
87
86
|
private slashInvalidBlock;
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Handle detection of a duplicate proposal (equivocation).
|
|
89
|
+
* Emits a slash event when a proposer sends multiple proposals for the same position.
|
|
90
|
+
*/
|
|
91
|
+
private handleDuplicateProposal;
|
|
92
|
+
createBlockProposal(blockHeader: BlockHeader, indexWithinCheckpoint: IndexWithinCheckpoint, inHash: Fr, archive: Fr, txs: Tx[], proposerAddress: EthAddress | undefined, options?: BlockProposalOptions): Promise<BlockProposal>;
|
|
93
|
+
createCheckpointProposal(checkpointHeader: CheckpointHeader, archive: Fr, lastBlockInfo: CreateCheckpointProposalLastBlockData | undefined, proposerAddress: EthAddress | undefined, options?: CheckpointProposalOptions): Promise<CheckpointProposal>;
|
|
90
94
|
broadcastBlockProposal(proposal: BlockProposal): Promise<void>;
|
|
91
95
|
signAttestationsAndSigners(attestationsAndSigners: CommitteeAttestationsAndSigners, proposer: EthAddress, slot: SlotNumber, blockNumber: BlockNumber | CheckpointNumber): Promise<Signature>;
|
|
92
96
|
collectOwnAttestations(proposal: CheckpointProposal): Promise<CheckpointAttestation[]>;
|
|
@@ -94,4 +98,4 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
94
98
|
private handleAuthRequest;
|
|
95
99
|
}
|
|
96
100
|
export {};
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFFaEIscUJBQXFCLEVBQ3JCLFVBQVUsRUFDWCxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQWdCLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBSWhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBeUIsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyRSxPQUFPLEVBQW9DLEtBQUssT0FBTyxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsK0JBQStCLEVBQVcsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhILE9BQU8sS0FBSyxFQUNWLHFDQUFxQyxFQUNyQyxXQUFXLEVBQ1gsU0FBUyxFQUNULHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdkIsTUFBTSxpQ0FBaUMsQ0FB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
|
package/dest/validator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,WAAW,EACX,gBAAgB,EAEhB,qBAAqB,EACrB,UAAU,EACX,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAgB,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIhF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
package/dest/validator.js
CHANGED
|
@@ -9,6 +9,7 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
9
9
|
import { AuthRequest, AuthResponse, BlockProposalValidator, ReqRespSubProtocol } from '@aztec/p2p';
|
|
10
10
|
import { OffenseType, WANT_TO_SLASH_EVENT } from '@aztec/slasher';
|
|
11
11
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
12
|
+
import { accumulateCheckpointOutHashes } from '@aztec/stdlib/messaging';
|
|
12
13
|
import { AttestationTimeoutError } from '@aztec/stdlib/validators';
|
|
13
14
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
14
15
|
import { createHASigner } from '@aztec/validator-ha-signer/factory';
|
|
@@ -52,12 +53,8 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
52
53
|
lastEpochForCommitteeUpdateLoop;
|
|
53
54
|
epochCacheUpdateLoop;
|
|
54
55
|
proposersOfInvalidBlocks;
|
|
55
|
-
// TODO(palla/mbps): Remove this once checkpoint validation is stable and we can validate all blocks properly.
|
|
56
|
-
// Tracks slots for which we have successfully validated a block proposal, so we can attest to checkpoint proposals for those slots.
|
|
57
|
-
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
58
|
-
validatedBlockSlots;
|
|
59
56
|
constructor(keyStore, epochCache, p2pClient, blockProposalHandler, blockSource, checkpointsBuilder, worldState, l1ToL2MessageSource, config, blobClient, dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('validator')){
|
|
60
|
-
super(), this.keyStore = keyStore, this.epochCache = epochCache, this.p2pClient = p2pClient, this.blockProposalHandler = blockProposalHandler, this.blockSource = blockSource, this.checkpointsBuilder = checkpointsBuilder, this.worldState = worldState, this.l1ToL2MessageSource = l1ToL2MessageSource, this.config = config, this.blobClient = blobClient, this.dateProvider = dateProvider, this.hasRegisteredHandlers = false, this.proposersOfInvalidBlocks = new Set()
|
|
57
|
+
super(), this.keyStore = keyStore, this.epochCache = epochCache, this.p2pClient = p2pClient, this.blockProposalHandler = blockProposalHandler, this.blockSource = blockSource, this.checkpointsBuilder = checkpointsBuilder, this.worldState = worldState, this.l1ToL2MessageSource = l1ToL2MessageSource, this.config = config, this.blobClient = blobClient, this.dateProvider = dateProvider, this.hasRegisteredHandlers = false, this.proposersOfInvalidBlocks = new Set();
|
|
61
58
|
// Create child logger with fisherman prefix if in fisherman mode
|
|
62
59
|
this.log = config.fishermanMode ? log.createChild('[FISHERMAN]') : log;
|
|
63
60
|
this.tracer = telemetry.getTracer('Validator');
|
|
@@ -186,6 +183,10 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
186
183
|
// and processed separately via the block handler above.
|
|
187
184
|
const checkpointHandler = (checkpoint, proposalSender)=>this.attestToCheckpointProposal(checkpoint, proposalSender);
|
|
188
185
|
this.p2pClient.registerCheckpointProposalHandler(checkpointHandler);
|
|
186
|
+
// Duplicate proposal handler - triggers slashing for equivocation
|
|
187
|
+
this.p2pClient.registerDuplicateProposalCallback((info)=>{
|
|
188
|
+
this.handleDuplicateProposal(info);
|
|
189
|
+
});
|
|
189
190
|
const myAddresses = this.getValidatorAddresses();
|
|
190
191
|
this.p2pClient.registerThisValidatorAddresses(myAddresses);
|
|
191
192
|
await this.p2pClient.addReqRespSubProtocol(ReqRespSubProtocol.AUTH, this.handleAuthRequest.bind(this));
|
|
@@ -257,9 +258,6 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
257
258
|
this.log.warn(`Escape hatch open for slot ${slotNumber}, rejecting block proposal`, proposalInfo);
|
|
258
259
|
return false;
|
|
259
260
|
}
|
|
260
|
-
// TODO(palla/mbps): Remove this once checkpoint validation is stable.
|
|
261
|
-
// Track that we successfully validated a block for this slot, so we can attest to checkpoint proposals for it.
|
|
262
|
-
this.validatedBlockSlots.add(slotNumber);
|
|
263
261
|
return true;
|
|
264
262
|
}
|
|
265
263
|
/**
|
|
@@ -294,16 +292,9 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
294
292
|
txHashes: proposal.txHashes.map((t)=>t.toString()),
|
|
295
293
|
fishermanMode: this.config.fishermanMode || false
|
|
296
294
|
});
|
|
297
|
-
// TODO(palla/mbps): Remove this once checkpoint validation is stable.
|
|
298
|
-
// Check that we have successfully validated a block for this slot before attesting to the checkpoint.
|
|
299
|
-
if (!this.validatedBlockSlots.has(slotNumber)) {
|
|
300
|
-
this.log.warn(`No validated block found for slot ${slotNumber}, refusing to attest to checkpoint`, proposalInfo);
|
|
301
|
-
return undefined;
|
|
302
|
-
}
|
|
303
295
|
// Validate the checkpoint proposal before attesting (unless skipCheckpointProposalValidation is set)
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
this.log.verbose(`Skipping checkpoint proposal validation for slot ${slotNumber}`, proposalInfo);
|
|
296
|
+
if (this.config.skipCheckpointProposalValidation) {
|
|
297
|
+
this.log.warn(`Skipping checkpoint proposal validation for slot ${slotNumber}`, proposalInfo);
|
|
307
298
|
} else {
|
|
308
299
|
const validationResult = await this.validateCheckpointProposal(proposal, proposalInfo);
|
|
309
300
|
if (!validationResult.isValid) {
|
|
@@ -354,7 +345,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
354
345
|
}
|
|
355
346
|
async createCheckpointAttestationsFromProposal(proposal, attestors = []) {
|
|
356
347
|
const attestations = await this.validationService.attestToCheckpointProposal(proposal, attestors);
|
|
357
|
-
await this.p2pClient.
|
|
348
|
+
await this.p2pClient.addOwnCheckpointAttestations(attestations);
|
|
358
349
|
return attestations;
|
|
359
350
|
}
|
|
360
351
|
/**
|
|
@@ -362,7 +353,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
362
353
|
* @returns Validation result with isValid flag and reason if invalid.
|
|
363
354
|
*/ async validateCheckpointProposal(proposal, proposalInfo) {
|
|
364
355
|
const slot = proposal.slotNumber;
|
|
365
|
-
const timeoutSeconds = 10;
|
|
356
|
+
const timeoutSeconds = 10; // TODO(palla/mbps): This should map to the timetable settings
|
|
366
357
|
// Wait for last block to sync by archive
|
|
367
358
|
let lastBlockHeader;
|
|
368
359
|
try {
|
|
@@ -421,7 +412,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
421
412
|
const fork = await this.worldState.fork(parentBlockNumber);
|
|
422
413
|
try {
|
|
423
414
|
// Create checkpoint builder with all existing blocks
|
|
424
|
-
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, blocks);
|
|
415
|
+
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, blocks, this.log.getBindings());
|
|
425
416
|
// Complete the checkpoint to get computed values
|
|
426
417
|
const computedCheckpoint = await checkpointBuilder.completeCheckpoint();
|
|
427
418
|
// Compare checkpoint header with proposal
|
|
@@ -448,13 +439,20 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
448
439
|
reason: 'archive_mismatch'
|
|
449
440
|
};
|
|
450
441
|
}
|
|
451
|
-
// Check that the accumulated out hash matches the value in the proposal.
|
|
452
|
-
|
|
453
|
-
const
|
|
454
|
-
|
|
442
|
+
// Check that the accumulated epoch out hash matches the value in the proposal.
|
|
443
|
+
// The epoch out hash is the accumulated hash of all checkpoint out hashes in the epoch.
|
|
444
|
+
const checkpointOutHash = computedCheckpoint.getCheckpointOutHash();
|
|
445
|
+
const computedEpochOutHash = accumulateCheckpointOutHashes([
|
|
446
|
+
...previousCheckpointOutHashes,
|
|
447
|
+
checkpointOutHash
|
|
448
|
+
]);
|
|
449
|
+
const proposalEpochOutHash = proposal.checkpointHeader.epochOutHash;
|
|
450
|
+
if (!computedEpochOutHash.equals(proposalEpochOutHash)) {
|
|
455
451
|
this.log.warn(`Epoch out hash mismatch`, {
|
|
456
|
-
|
|
457
|
-
|
|
452
|
+
proposalEpochOutHash: proposalEpochOutHash.toString(),
|
|
453
|
+
computedEpochOutHash: computedEpochOutHash.toString(),
|
|
454
|
+
checkpointOutHash: checkpointOutHash.toString(),
|
|
455
|
+
previousCheckpointOutHashes: previousCheckpointOutHashes.map((h)=>h.toString()),
|
|
458
456
|
...proposalInfo
|
|
459
457
|
});
|
|
460
458
|
return {
|
|
@@ -530,7 +528,27 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
530
528
|
}
|
|
531
529
|
]);
|
|
532
530
|
}
|
|
533
|
-
|
|
531
|
+
/**
|
|
532
|
+
* Handle detection of a duplicate proposal (equivocation).
|
|
533
|
+
* Emits a slash event when a proposer sends multiple proposals for the same position.
|
|
534
|
+
*/ handleDuplicateProposal(info) {
|
|
535
|
+
const { slot, proposer, type } = info;
|
|
536
|
+
this.log.warn(`Triggering slash event for duplicate ${type} proposal from ${proposer.toString()} at slot ${slot}`, {
|
|
537
|
+
proposer: proposer.toString(),
|
|
538
|
+
slot,
|
|
539
|
+
type
|
|
540
|
+
});
|
|
541
|
+
// Emit slash event
|
|
542
|
+
this.emit(WANT_TO_SLASH_EVENT, [
|
|
543
|
+
{
|
|
544
|
+
validator: proposer,
|
|
545
|
+
amount: this.config.slashDuplicateProposalPenalty,
|
|
546
|
+
offenseType: OffenseType.DUPLICATE_PROPOSAL,
|
|
547
|
+
epochOrSlot: BigInt(slot)
|
|
548
|
+
}
|
|
549
|
+
]);
|
|
550
|
+
}
|
|
551
|
+
async createBlockProposal(blockHeader, indexWithinCheckpoint, inHash, archive, txs, proposerAddress, options = {}) {
|
|
534
552
|
// TODO(palla/mbps): Prevent double proposals properly
|
|
535
553
|
// if (this.previousProposal?.slotNumber === blockHeader.globalVariables.slotNumber) {
|
|
536
554
|
// this.log.verbose(`Already made a proposal for the same slot, skipping proposal`);
|
|
@@ -544,7 +562,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
544
562
|
this.previousProposal = newProposal;
|
|
545
563
|
return newProposal;
|
|
546
564
|
}
|
|
547
|
-
async createCheckpointProposal(checkpointHeader, archive, lastBlockInfo, proposerAddress, options) {
|
|
565
|
+
async createCheckpointProposal(checkpointHeader, archive, lastBlockInfo, proposerAddress, options = {}) {
|
|
548
566
|
this.log.info(`Assembling checkpoint proposal for slot ${checkpointHeader.slotNumber}`);
|
|
549
567
|
return await this.validationService.createCheckpointProposal(checkpointHeader, archive, lastBlockInfo, proposerAddress, options);
|
|
550
568
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/validator-client",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.f2ce05ee",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -64,28 +64,30 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/blob-client": "0.0.1-commit.
|
|
68
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
69
|
-
"@aztec/constants": "0.0.1-commit.
|
|
70
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
71
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
72
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
73
|
-
"@aztec/node-keystore": "0.0.1-commit.
|
|
74
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
75
|
-
"@aztec/p2p": "0.0.1-commit.
|
|
76
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
77
|
-
"@aztec/prover-client": "0.0.1-commit.
|
|
78
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
79
|
-
"@aztec/slasher": "0.0.1-commit.
|
|
80
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
81
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
82
|
-
"@aztec/validator-ha-signer": "0.0.1-commit.
|
|
67
|
+
"@aztec/blob-client": "0.0.1-commit.f2ce05ee",
|
|
68
|
+
"@aztec/blob-lib": "0.0.1-commit.f2ce05ee",
|
|
69
|
+
"@aztec/constants": "0.0.1-commit.f2ce05ee",
|
|
70
|
+
"@aztec/epoch-cache": "0.0.1-commit.f2ce05ee",
|
|
71
|
+
"@aztec/ethereum": "0.0.1-commit.f2ce05ee",
|
|
72
|
+
"@aztec/foundation": "0.0.1-commit.f2ce05ee",
|
|
73
|
+
"@aztec/node-keystore": "0.0.1-commit.f2ce05ee",
|
|
74
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.f2ce05ee",
|
|
75
|
+
"@aztec/p2p": "0.0.1-commit.f2ce05ee",
|
|
76
|
+
"@aztec/protocol-contracts": "0.0.1-commit.f2ce05ee",
|
|
77
|
+
"@aztec/prover-client": "0.0.1-commit.f2ce05ee",
|
|
78
|
+
"@aztec/simulator": "0.0.1-commit.f2ce05ee",
|
|
79
|
+
"@aztec/slasher": "0.0.1-commit.f2ce05ee",
|
|
80
|
+
"@aztec/stdlib": "0.0.1-commit.f2ce05ee",
|
|
81
|
+
"@aztec/telemetry-client": "0.0.1-commit.f2ce05ee",
|
|
82
|
+
"@aztec/validator-ha-signer": "0.0.1-commit.f2ce05ee",
|
|
83
83
|
"koa": "^2.16.1",
|
|
84
84
|
"koa-router": "^13.1.1",
|
|
85
85
|
"tslib": "^2.4.0",
|
|
86
86
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
|
+
"@aztec/archiver": "0.0.1-commit.f2ce05ee",
|
|
90
|
+
"@aztec/world-state": "0.0.1-commit.f2ce05ee",
|
|
89
91
|
"@electric-sql/pglite": "^0.3.14",
|
|
90
92
|
"@jest/globals": "^30.0.0",
|
|
91
93
|
"@types/jest": "^30.0.0",
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
2
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
3
3
|
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { chunkBy } from '@aztec/foundation/collection';
|
|
4
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
6
|
import { TimeoutError } from '@aztec/foundation/error';
|
|
6
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
7
8
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
8
9
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
9
10
|
import type { P2P, PeerId } from '@aztec/p2p';
|
|
10
|
-
import { TxProvider } from '@aztec/p2p';
|
|
11
11
|
import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
12
|
-
import type {
|
|
12
|
+
import type { L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
13
13
|
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
14
|
-
import type { ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
14
|
+
import type { ITxProvider, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
15
15
|
import {
|
|
16
16
|
type L1ToL2MessageSource,
|
|
17
17
|
computeCheckpointOutHash,
|
|
@@ -44,7 +44,7 @@ export type BlockProposalValidationFailureReason =
|
|
|
44
44
|
| 'unknown_error';
|
|
45
45
|
|
|
46
46
|
type ReexecuteTransactionsResult = {
|
|
47
|
-
block:
|
|
47
|
+
block: L2Block;
|
|
48
48
|
failedTxs: FailedTx[];
|
|
49
49
|
reexecutionTimeMs: number;
|
|
50
50
|
totalManaUsed: number;
|
|
@@ -77,7 +77,7 @@ export class BlockProposalHandler {
|
|
|
77
77
|
private worldState: WorldStateSynchronizer,
|
|
78
78
|
private blockSource: L2BlockSource & L2BlockSink,
|
|
79
79
|
private l1ToL2MessageSource: L1ToL2MessageSource,
|
|
80
|
-
private txProvider:
|
|
80
|
+
private txProvider: ITxProvider,
|
|
81
81
|
private blockProposalValidator: BlockProposalValidator,
|
|
82
82
|
private epochCache: EpochCache,
|
|
83
83
|
private config: ValidatorClientFullConfig,
|
|
@@ -146,8 +146,8 @@ export class BlockProposalHandler {
|
|
|
146
146
|
|
|
147
147
|
// Check that the proposal is from the current proposer, or the next proposer
|
|
148
148
|
// This should have been handled by the p2p layer, but we double check here out of caution
|
|
149
|
-
const
|
|
150
|
-
if (
|
|
149
|
+
const validationResult = await this.blockProposalValidator.validate(proposal);
|
|
150
|
+
if (validationResult.result !== 'accept') {
|
|
151
151
|
this.log.warn(`Proposal is not valid, skipping processing`, proposalInfo);
|
|
152
152
|
return { isValid: false, reason: 'invalid_proposal' };
|
|
153
153
|
}
|
|
@@ -159,9 +159,9 @@ export class BlockProposalHandler {
|
|
|
159
159
|
return { isValid: false, reason: 'parent_block_not_found' };
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
// Check that the parent block's slot is
|
|
163
|
-
if (parentBlockHeader !== 'genesis' && parentBlockHeader.getSlot()
|
|
164
|
-
this.log.warn(`Parent block slot is greater than
|
|
162
|
+
// Check that the parent block's slot is not greater than the proposal's slot.
|
|
163
|
+
if (parentBlockHeader !== 'genesis' && parentBlockHeader.getSlot() > slotNumber) {
|
|
164
|
+
this.log.warn(`Parent block slot is greater than proposal slot, skipping processing`, {
|
|
165
165
|
parentBlockSlot: parentBlockHeader.getSlot().toString(),
|
|
166
166
|
proposalSlot: slotNumber.toString(),
|
|
167
167
|
...proposalInfo,
|
|
@@ -219,15 +219,15 @@ export class BlockProposalHandler {
|
|
|
219
219
|
let reexecutionResult;
|
|
220
220
|
if (shouldReexecute) {
|
|
221
221
|
// Compute the previous checkpoint out hashes for the epoch.
|
|
222
|
-
// TODO(mbps):
|
|
223
|
-
//
|
|
224
|
-
// the blocks.
|
|
222
|
+
// TODO(leila/mbps): There can be a more efficient way to get the previous checkpoint out
|
|
223
|
+
// hashes without having to fetch all the blocks.
|
|
225
224
|
const epoch = getEpochAtSlot(slotNumber, this.epochCache.getL1Constants());
|
|
226
|
-
const
|
|
227
|
-
.filter(b => b.number < blockNumber)
|
|
228
|
-
.sort((a, b) => a.number - b.number);
|
|
229
|
-
const
|
|
230
|
-
|
|
225
|
+
const checkpointedBlocks = (await this.blockSource.getCheckpointedBlocksForEpoch(epoch))
|
|
226
|
+
.filter(b => b.block.number < blockNumber)
|
|
227
|
+
.sort((a, b) => a.block.number - b.block.number);
|
|
228
|
+
const blocksByCheckpoint = chunkBy(checkpointedBlocks, b => b.checkpointNumber);
|
|
229
|
+
const previousCheckpointOutHashes = blocksByCheckpoint.map(checkpointBlocks =>
|
|
230
|
+
computeCheckpointOutHash(checkpointBlocks.map(b => b.block.body.txEffects.map(tx => tx.l2ToL1Msgs))),
|
|
231
231
|
);
|
|
232
232
|
|
|
233
233
|
try {
|
|
@@ -248,7 +248,6 @@ export class BlockProposalHandler {
|
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
// If we succeeded, push this block into the archiver (unless disabled)
|
|
251
|
-
// TODO(palla/mbps): Change default to false once block sync is stable.
|
|
252
251
|
if (reexecutionResult?.block && this.config.skipPushProposedBlocksToArchiver === false) {
|
|
253
252
|
await this.blockSource.addBlock(reexecutionResult?.block);
|
|
254
253
|
}
|
|
@@ -316,7 +315,7 @@ export class BlockProposalHandler {
|
|
|
316
315
|
// TODO(palla/mbps): The block header should include the checkpoint number to avoid this lookup,
|
|
317
316
|
// or at least the L2BlockSource should return a different struct that includes it.
|
|
318
317
|
const parentBlockNumber = parentBlockHeader.getBlockNumber();
|
|
319
|
-
const parentBlock = await this.blockSource.
|
|
318
|
+
const parentBlock = await this.blockSource.getL2Block(parentBlockNumber);
|
|
320
319
|
if (!parentBlock) {
|
|
321
320
|
this.log.warn(`Parent block ${parentBlockNumber} not found in archiver`, proposalInfo);
|
|
322
321
|
return { reason: 'invalid_proposal' };
|
|
@@ -357,7 +356,7 @@ export class BlockProposalHandler {
|
|
|
357
356
|
*/
|
|
358
357
|
private validateNonFirstBlockInCheckpoint(
|
|
359
358
|
proposal: BlockProposal,
|
|
360
|
-
parentBlock:
|
|
359
|
+
parentBlock: L2Block,
|
|
361
360
|
proposalInfo: object,
|
|
362
361
|
): CheckpointComputationResult | undefined {
|
|
363
362
|
const proposalGlobals = proposal.blockHeader.globalVariables;
|
|
@@ -436,29 +435,6 @@ export class BlockProposalHandler {
|
|
|
436
435
|
return new Date(nextSlotTimestampSeconds * 1000);
|
|
437
436
|
}
|
|
438
437
|
|
|
439
|
-
/**
|
|
440
|
-
* Gets all prior blocks in the same checkpoint (same slot and checkpoint number) up to but not including upToBlockNumber.
|
|
441
|
-
*/
|
|
442
|
-
private async getBlocksInCheckpoint(
|
|
443
|
-
slot: SlotNumber,
|
|
444
|
-
upToBlockNumber: BlockNumber,
|
|
445
|
-
checkpointNumber: CheckpointNumber,
|
|
446
|
-
): Promise<L2BlockNew[]> {
|
|
447
|
-
const blocks: L2BlockNew[] = [];
|
|
448
|
-
let currentBlockNumber = BlockNumber(upToBlockNumber - 1);
|
|
449
|
-
|
|
450
|
-
while (currentBlockNumber >= INITIAL_L2_BLOCK_NUM) {
|
|
451
|
-
const block = await this.blockSource.getL2BlockNew(currentBlockNumber);
|
|
452
|
-
if (!block || block.header.getSlot() !== slot || block.checkpointNumber !== checkpointNumber) {
|
|
453
|
-
break;
|
|
454
|
-
}
|
|
455
|
-
blocks.unshift(block);
|
|
456
|
-
currentBlockNumber = BlockNumber(currentBlockNumber - 1);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
return blocks;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
438
|
private getReexecuteFailureReason(err: any) {
|
|
463
439
|
if (err instanceof ReExStateMismatchError) {
|
|
464
440
|
return 'state_mismatch';
|
|
@@ -492,11 +468,13 @@ export class BlockProposalHandler {
|
|
|
492
468
|
const slot = proposal.slotNumber;
|
|
493
469
|
const config = this.checkpointsBuilder.getConfig();
|
|
494
470
|
|
|
495
|
-
// Get prior blocks in this checkpoint (same slot
|
|
496
|
-
const
|
|
471
|
+
// Get prior blocks in this checkpoint (same slot before current block)
|
|
472
|
+
const allBlocksInSlot = await this.blockSource.getBlocksForSlot(slot);
|
|
473
|
+
const priorBlocks = allBlocksInSlot.filter(b => b.number < blockNumber && b.header.getSlot() === slot);
|
|
497
474
|
|
|
498
475
|
// Fork before the block to be built
|
|
499
476
|
const parentBlockNumber = BlockNumber(blockNumber - 1);
|
|
477
|
+
await this.worldState.syncImmediate(parentBlockNumber);
|
|
500
478
|
using fork = await this.worldState.fork(parentBlockNumber);
|
|
501
479
|
|
|
502
480
|
// Build checkpoint constants from proposal (excludes blockNumber and timestamp which are per-block)
|
|
@@ -517,6 +495,7 @@ export class BlockProposalHandler {
|
|
|
517
495
|
previousCheckpointOutHashes,
|
|
518
496
|
fork,
|
|
519
497
|
priorBlocks,
|
|
498
|
+
this.log.getBindings(),
|
|
520
499
|
);
|
|
521
500
|
|
|
522
501
|
// Build the new block
|