@aztec/validator-client 0.0.1-commit.7d4e6cd → 0.0.1-commit.87a0206
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 +51 -24
- package/dest/block_proposal_handler.d.ts +8 -8
- package/dest/block_proposal_handler.d.ts.map +1 -1
- package/dest/block_proposal_handler.js +27 -32
- package/dest/checkpoint_builder.d.ts +21 -25
- package/dest/checkpoint_builder.d.ts.map +1 -1
- package/dest/checkpoint_builder.js +50 -32
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +8 -14
- package/dest/duties/validation_service.d.ts +19 -6
- package/dest/duties/validation_service.d.ts.map +1 -1
- package/dest/duties/validation_service.js +72 -19
- package/dest/factory.d.ts +2 -2
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +1 -1
- package/dest/key_store/ha_key_store.d.ts +99 -0
- package/dest/key_store/ha_key_store.d.ts.map +1 -0
- package/dest/key_store/ha_key_store.js +208 -0
- package/dest/key_store/index.d.ts +2 -1
- package/dest/key_store/index.d.ts.map +1 -1
- package/dest/key_store/index.js +1 -0
- package/dest/key_store/interface.d.ts +36 -6
- package/dest/key_store/interface.d.ts.map +1 -1
- package/dest/key_store/local_key_store.d.ts +10 -5
- package/dest/key_store/local_key_store.d.ts.map +1 -1
- package/dest/key_store/local_key_store.js +8 -4
- package/dest/key_store/node_keystore_adapter.d.ts +18 -5
- package/dest/key_store/node_keystore_adapter.d.ts.map +1 -1
- package/dest/key_store/node_keystore_adapter.js +18 -4
- package/dest/key_store/web3signer_key_store.d.ts +10 -5
- package/dest/key_store/web3signer_key_store.d.ts.map +1 -1
- package/dest/key_store/web3signer_key_store.js +8 -4
- 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 +18 -13
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +107 -81
- package/package.json +21 -17
- package/src/block_proposal_handler.ts +41 -42
- package/src/checkpoint_builder.ts +85 -38
- package/src/config.ts +7 -13
- package/src/duties/validation_service.ts +91 -23
- package/src/factory.ts +1 -0
- package/src/key_store/ha_key_store.ts +269 -0
- package/src/key_store/index.ts +1 -0
- package/src/key_store/interface.ts +44 -5
- package/src/key_store/local_key_store.ts +13 -4
- package/src/key_store/node_keystore_adapter.ts +27 -4
- package/src/key_store/web3signer_key_store.ts +17 -4
- package/src/metrics.ts +45 -6
- package/src/tx_validator/tx_validator_factory.ts +52 -31
- package/src/validator.ts +128 -94
package/README.md
CHANGED
|
@@ -77,6 +77,7 @@ These rules must always hold:
|
|
|
77
77
|
2. **Global variables match within checkpoint**: All blocks within the same checkpoint must have identical global variables (except `blockNumber`), which includes the slot number
|
|
78
78
|
3. **inHash is constant**: All blocks in a checkpoint share the same L1-to-L2 messages hash
|
|
79
79
|
4. **Sequential indexWithinCheckpoint**: Block N must have `indexWithinCheckpoint = parent.indexWithinCheckpoint + 1`
|
|
80
|
+
5. **One proposer per slot**: Each slot has exactly one designated proposer. Sending multiple proposals for the same position (slot, indexWithinCheckpoint) with different content is equivocation and slashable
|
|
80
81
|
|
|
81
82
|
## Validation Flow
|
|
82
83
|
|
|
@@ -87,15 +88,14 @@ When a `BlockProposal` is received via P2P, the `BlockProposalHandler` performs:
|
|
|
87
88
|
```
|
|
88
89
|
1. Verify proposer signature
|
|
89
90
|
2. Check proposal is from current/next slot proposer (via BlockProposalValidator)
|
|
90
|
-
3.
|
|
91
|
-
4.
|
|
92
|
-
5.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
9. Compare re-execution result with proposal
|
|
91
|
+
3. Detect duplicate proposals (same slot + indexWithinCheckpoint, different archive) slashing proposer on equivocation
|
|
92
|
+
4. Find parent block by archive root (wait/retry if not synced)
|
|
93
|
+
5. Compute checkpoint number from parent
|
|
94
|
+
6. If indexWithinCheckpoint > 0, then validate global variables match parent (chainId, version, slotNumber, timestamp, coinbase, feeRecipient, gasFees)
|
|
95
|
+
7. Verify inHash matches computed from L1-to-L2 messages
|
|
96
|
+
8. Collect transactions from pool/network/proposal
|
|
97
|
+
9. Re-execute transactions (if enabled)
|
|
98
|
+
10. Compare re-execution result with proposal
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
### Checkpoint Proposal Validation
|
|
@@ -155,19 +155,43 @@ Time | Proposer | Validator
|
|
|
155
155
|
|
|
156
156
|
## Configuration
|
|
157
157
|
|
|
158
|
-
| Flag
|
|
159
|
-
|
|
160
|
-
| `validatorReexecute`
|
|
161
|
-
| `fishermanMode`
|
|
162
|
-
| `alwaysReexecuteBlockProposals`
|
|
163
|
-
| `slashBroadcastedInvalidBlockPenalty` | Penalty amount for invalid proposals (0 = disabled)
|
|
164
|
-
| `
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
158
|
+
| Flag | Purpose |
|
|
159
|
+
| ------------------------------------- | --------------------------------------------------------------------- |
|
|
160
|
+
| `validatorReexecute` | Re-execute transactions to verify proposals |
|
|
161
|
+
| `fishermanMode` | Validate proposals but don't broadcast attestations (monitoring only) |
|
|
162
|
+
| `alwaysReexecuteBlockProposals` | Force re-execution even when not in committee |
|
|
163
|
+
| `slashBroadcastedInvalidBlockPenalty` | Penalty amount for invalid proposals (0 = disabled) |
|
|
164
|
+
| `slashDuplicateProposalPenalty` | Penalty amount for duplicate proposals (0 = disabled) |
|
|
165
|
+
| `validatorReexecuteDeadlineMs` | Time reserved at end of slot for propagation/publishing |
|
|
166
|
+
| `attestationPollingIntervalMs` | How often to poll for attestations when collecting |
|
|
167
|
+
| `disabledValidators` | Validator addresses to exclude from duties |
|
|
168
|
+
|
|
169
|
+
### High Availability (HA) Keystore
|
|
170
|
+
|
|
171
|
+
When running multiple validator nodes with the same validator keys in a high-availability setup, enable HA signing to prevent double-signing:
|
|
172
|
+
|
|
173
|
+
| Environment Variable | Purpose |
|
|
174
|
+
| -------------------------------------- | ---------------------------------------------------------------------- |
|
|
175
|
+
| `VALIDATOR_HA_SIGNING_ENABLED` | Enable HA signing / slashing protection (default: false) |
|
|
176
|
+
| `VALIDATOR_HA_DATABASE_URL` | PostgreSQL connection string for coordination (required when enabled) |
|
|
177
|
+
| `VALIDATOR_HA_NODE_ID` | Unique identifier for this validator node (required when enabled) |
|
|
178
|
+
| `VALIDATOR_HA_POLLING_INTERVAL_MS` | How often to check duty status (default: 100) |
|
|
179
|
+
| `VALIDATOR_HA_SIGNING_TIMEOUT_MS` | Max wait for in-progress signing (default: 3000) |
|
|
180
|
+
| `VALIDATOR_HA_MAX_STUCK_DUTIES_AGE_MS` | Max age of stuck duties before cleanup (default: 2\*aztecSlotDuration) |
|
|
181
|
+
|
|
182
|
+
When `VALIDATOR_HA_SIGNING_ENABLED=true`, the validator client automatically:
|
|
183
|
+
|
|
184
|
+
- Creates an HA signer using the provided configuration
|
|
185
|
+
- Wraps the base keystore with `HAKeyStore` for HA-protected signing
|
|
186
|
+
- Coordinates signing across nodes via PostgreSQL to prevent double-signing
|
|
187
|
+
- Provides slashing protection to block conflicting signatures
|
|
188
|
+
|
|
189
|
+
See [`@aztec/validator-ha-signer`](../validator-ha-signer/README.md) for more details.
|
|
167
190
|
|
|
168
191
|
### Fisherman Mode
|
|
169
192
|
|
|
170
193
|
When `fishermanMode: true`, the validator:
|
|
194
|
+
|
|
171
195
|
- Validates all proposals (block and checkpoint)
|
|
172
196
|
- Re-executes transactions
|
|
173
197
|
- Creates attestations internally for validation
|
|
@@ -179,6 +203,7 @@ This is useful for monitoring network health without participating in consensus.
|
|
|
179
203
|
### Key Methods
|
|
180
204
|
|
|
181
205
|
**ValidatorClient** (`validator.ts`):
|
|
206
|
+
|
|
182
207
|
- `validateBlockProposal(proposal, sender)` → `boolean`: Validates block, optionally re-executes, emits slash events
|
|
183
208
|
- `attestToCheckpointProposal(proposal, sender)` → `CheckpointAttestation[]?`: Validates checkpoint and creates attestations
|
|
184
209
|
- `collectAttestations(proposal, required, deadline)` → `CheckpointAttestation[]`: Waits for attestations from other validators
|
|
@@ -186,10 +211,12 @@ This is useful for monitoring network health without participating in consensus.
|
|
|
186
211
|
- `createCheckpointProposal(...)` → `CheckpointProposal`: Creates and signs a checkpoint proposal
|
|
187
212
|
|
|
188
213
|
**BlockProposalHandler** (`block_proposal_handler.ts`):
|
|
214
|
+
|
|
189
215
|
- `handleBlockProposal(proposal, sender, shouldReexecute)` → `ValidationResult`: Full block validation pipeline
|
|
190
216
|
- `reexecuteTransactions(proposal, blockNumber, txs, messages)` → `ReexecutionResult`: Re-runs transactions and compares state
|
|
191
217
|
|
|
192
218
|
**ValidationService** (`duties/validation_service.ts`):
|
|
219
|
+
|
|
193
220
|
- `createBlockProposal(...)` → `BlockProposal`: Signs block proposal with validator key
|
|
194
221
|
- `createCheckpointProposal(...)` → `CheckpointProposal`: Signs checkpoint proposal
|
|
195
222
|
- `attestToCheckpointProposal(proposal, attestors)` → `CheckpointAttestation[]`: Creates attestations for given addresses
|
|
@@ -204,7 +231,7 @@ Tests typically mock these dependencies:
|
|
|
204
231
|
let epochCache: MockProxy<EpochCache>;
|
|
205
232
|
let blockSource: MockProxy<L2BlockSource>;
|
|
206
233
|
let txProvider: MockProxy<TxProvider>;
|
|
207
|
-
let
|
|
234
|
+
let checkpointsBuilder: MockProxy<FullNodeCheckpointsBuilder>;
|
|
208
235
|
let p2pClient: MockProxy<P2P>;
|
|
209
236
|
|
|
210
237
|
beforeEach(() => {
|
|
@@ -219,19 +246,19 @@ beforeEach(() => {
|
|
|
219
246
|
Use factory functions from `@aztec/stdlib/testing`:
|
|
220
247
|
|
|
221
248
|
```typescript
|
|
222
|
-
import { makeBlockProposal,
|
|
249
|
+
import { makeBlockHeader, makeBlockProposal, makeCheckpointHeader, makeCheckpointProposal } from '@aztec/stdlib/testing';
|
|
223
250
|
|
|
224
251
|
// These are async - always await
|
|
225
252
|
const blockProposal = await makeBlockProposal({
|
|
226
|
-
blockHeader:
|
|
253
|
+
blockHeader: makeBlockHeader(1, { blockNumber: BlockNumber(100), slotNumber: SlotNumber(100) }),
|
|
227
254
|
indexWithinCheckpoint: 0,
|
|
228
255
|
signer: Secp256k1Signer.random(),
|
|
229
256
|
});
|
|
230
257
|
|
|
231
258
|
const checkpointProposal = await makeCheckpointProposal({
|
|
232
|
-
checkpointHeader:
|
|
259
|
+
checkpointHeader: makeCheckpointHeader(1, { slotNumber: SlotNumber(100) }),
|
|
233
260
|
signer: proposer,
|
|
234
|
-
lastBlock: { blockHeader, txs },
|
|
261
|
+
lastBlock: { blockHeader: makeBlockHeader(1), txs },
|
|
235
262
|
});
|
|
236
263
|
```
|
|
237
264
|
|
|
@@ -242,7 +269,7 @@ For tests that exercise re-execution:
|
|
|
242
269
|
```typescript
|
|
243
270
|
// Mock parent block lookup
|
|
244
271
|
blockSource.getBlockHeaderByArchive.mockResolvedValue(parentBlockHeader);
|
|
245
|
-
blockSource.
|
|
272
|
+
blockSource.getL2Block.mockResolvedValue({
|
|
246
273
|
checkpointNumber: CheckpointNumber(1),
|
|
247
274
|
indexWithinCheckpoint: 0,
|
|
248
275
|
header: { globalVariables: parentGlobalVariables },
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import type { EpochCache } from '@aztec/epoch-cache';
|
|
1
2
|
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
5
|
import type { P2P, PeerId } from '@aztec/p2p';
|
|
5
|
-
import { TxProvider } from '@aztec/p2p';
|
|
6
6
|
import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
7
|
-
import type {
|
|
8
|
-
import type { ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import type { L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
8
|
+
import type { ITxProvider, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
9
|
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
10
10
|
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
11
11
|
import { type FailedTx, type Tx } from '@aztec/stdlib/tx';
|
|
@@ -14,7 +14,7 @@ import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
|
14
14
|
import type { ValidatorMetrics } from './metrics.js';
|
|
15
15
|
export type BlockProposalValidationFailureReason = 'invalid_proposal' | 'parent_block_not_found' | 'parent_block_wrong_slot' | 'in_hash_mismatch' | 'global_variables_mismatch' | 'block_number_already_exists' | 'txs_not_available' | 'state_mismatch' | 'failed_txs' | 'timeout' | 'unknown_error';
|
|
16
16
|
type ReexecuteTransactionsResult = {
|
|
17
|
-
block:
|
|
17
|
+
block: L2Block;
|
|
18
18
|
failedTxs: FailedTx[];
|
|
19
19
|
reexecutionTimeMs: number;
|
|
20
20
|
totalManaUsed: number;
|
|
@@ -38,12 +38,13 @@ export declare class BlockProposalHandler {
|
|
|
38
38
|
private l1ToL2MessageSource;
|
|
39
39
|
private txProvider;
|
|
40
40
|
private blockProposalValidator;
|
|
41
|
+
private epochCache;
|
|
41
42
|
private config;
|
|
42
43
|
private metrics?;
|
|
43
44
|
private dateProvider;
|
|
44
45
|
private log;
|
|
45
46
|
readonly tracer: Tracer;
|
|
46
|
-
constructor(checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider:
|
|
47
|
+
constructor(checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: ITxProvider, blockProposalValidator: BlockProposalValidator, epochCache: EpochCache, config: ValidatorClientFullConfig, metrics?: ValidatorMetrics | undefined, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
47
48
|
registerForReexecution(p2pClient: P2P): BlockProposalHandler;
|
|
48
49
|
handleBlockProposal(proposal: BlockProposal, proposalSender: PeerId, shouldReexecute: boolean): Promise<BlockProposalValidationResult>;
|
|
49
50
|
private getParentBlock;
|
|
@@ -55,9 +56,8 @@ export declare class BlockProposalHandler {
|
|
|
55
56
|
*/
|
|
56
57
|
private validateNonFirstBlockInCheckpoint;
|
|
57
58
|
private getReexecutionDeadline;
|
|
58
|
-
private getBlocksInCheckpoint;
|
|
59
59
|
private getReexecuteFailureReason;
|
|
60
|
-
reexecuteTransactions(proposal: BlockProposal, blockNumber: BlockNumber, checkpointNumber: CheckpointNumber, txs: Tx[], l1ToL2Messages: Fr[]): Promise<ReexecuteTransactionsResult>;
|
|
60
|
+
reexecuteTransactions(proposal: BlockProposal, blockNumber: BlockNumber, checkpointNumber: CheckpointNumber, txs: Tx[], l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[]): Promise<ReexecuteTransactionsResult>;
|
|
61
61
|
}
|
|
62
62
|
export {};
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2NrX3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLGlDQUFpQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUlwRCxPQUFPLEVBQUUsWUFBWSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RILE9BQU8sRUFDTCxLQUFLLG1CQUFtQixFQUd6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBK0MsS0FBSyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU92RyxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQUUsS0FBSyxNQUFNLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFFaEcsT0FBTyxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxNQUFN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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_proposal_handler.d.ts","sourceRoot":"","sources":["../src/block_proposal_handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAc,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"block_proposal_handler.d.ts","sourceRoot":"","sources":["../src/block_proposal_handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,13 +65,14 @@ function _ts_dispose_resources(env) {
|
|
|
65
65
|
}
|
|
66
66
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
67
67
|
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
68
|
+
import { chunkBy } from '@aztec/foundation/collection';
|
|
68
69
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
69
70
|
import { TimeoutError } from '@aztec/foundation/error';
|
|
70
71
|
import { createLogger } from '@aztec/foundation/log';
|
|
71
72
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
72
73
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
73
|
-
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
74
|
-
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
74
|
+
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
75
|
+
import { computeCheckpointOutHash, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
75
76
|
import { ReExFailedTxsError, ReExStateMismatchError, ReExTimeoutError, TransactionsNotAvailableError } from '@aztec/stdlib/validators';
|
|
76
77
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
77
78
|
export class BlockProposalHandler {
|
|
@@ -81,18 +82,20 @@ export class BlockProposalHandler {
|
|
|
81
82
|
l1ToL2MessageSource;
|
|
82
83
|
txProvider;
|
|
83
84
|
blockProposalValidator;
|
|
85
|
+
epochCache;
|
|
84
86
|
config;
|
|
85
87
|
metrics;
|
|
86
88
|
dateProvider;
|
|
87
89
|
log;
|
|
88
90
|
tracer;
|
|
89
|
-
constructor(checkpointsBuilder, worldState, blockSource, l1ToL2MessageSource, txProvider, blockProposalValidator, config, metrics, dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('validator:block-proposal-handler')){
|
|
91
|
+
constructor(checkpointsBuilder, worldState, blockSource, l1ToL2MessageSource, txProvider, blockProposalValidator, epochCache, config, metrics, dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('validator:block-proposal-handler')){
|
|
90
92
|
this.checkpointsBuilder = checkpointsBuilder;
|
|
91
93
|
this.worldState = worldState;
|
|
92
94
|
this.blockSource = blockSource;
|
|
93
95
|
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
94
96
|
this.txProvider = txProvider;
|
|
95
97
|
this.blockProposalValidator = blockProposalValidator;
|
|
98
|
+
this.epochCache = epochCache;
|
|
96
99
|
this.config = config;
|
|
97
100
|
this.metrics = metrics;
|
|
98
101
|
this.dateProvider = dateProvider;
|
|
@@ -153,8 +156,8 @@ export class BlockProposalHandler {
|
|
|
153
156
|
});
|
|
154
157
|
// Check that the proposal is from the current proposer, or the next proposer
|
|
155
158
|
// This should have been handled by the p2p layer, but we double check here out of caution
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
159
|
+
const validationResult = await this.blockProposalValidator.validate(proposal);
|
|
160
|
+
if (validationResult.result !== 'accept') {
|
|
158
161
|
this.log.warn(`Proposal is not valid, skipping processing`, proposalInfo);
|
|
159
162
|
return {
|
|
160
163
|
isValid: false,
|
|
@@ -170,9 +173,9 @@ export class BlockProposalHandler {
|
|
|
170
173
|
reason: 'parent_block_not_found'
|
|
171
174
|
};
|
|
172
175
|
}
|
|
173
|
-
// Check that the parent block's slot is
|
|
174
|
-
if (parentBlockHeader !== 'genesis' && parentBlockHeader.getSlot()
|
|
175
|
-
this.log.warn(`Parent block slot is greater than
|
|
176
|
+
// Check that the parent block's slot is not greater than the proposal's slot.
|
|
177
|
+
if (parentBlockHeader !== 'genesis' && parentBlockHeader.getSlot() > slotNumber) {
|
|
178
|
+
this.log.warn(`Parent block slot is greater than proposal slot, skipping processing`, {
|
|
176
179
|
parentBlockSlot: parentBlockHeader.getSlot().toString(),
|
|
177
180
|
proposalSlot: slotNumber.toString(),
|
|
178
181
|
...proposalInfo
|
|
@@ -241,9 +244,16 @@ export class BlockProposalHandler {
|
|
|
241
244
|
// Try re-executing the transactions in the proposal if needed
|
|
242
245
|
let reexecutionResult;
|
|
243
246
|
if (shouldReexecute) {
|
|
247
|
+
// Compute the previous checkpoint out hashes for the epoch.
|
|
248
|
+
// TODO(leila/mbps): There can be a more efficient way to get the previous checkpoint out
|
|
249
|
+
// hashes without having to fetch all the blocks.
|
|
250
|
+
const epoch = getEpochAtSlot(slotNumber, this.epochCache.getL1Constants());
|
|
251
|
+
const checkpointedBlocks = (await this.blockSource.getCheckpointedBlocksForEpoch(epoch)).filter((b)=>b.block.number < blockNumber).sort((a, b)=>a.block.number - b.block.number);
|
|
252
|
+
const blocksByCheckpoint = chunkBy(checkpointedBlocks, (b)=>b.checkpointNumber);
|
|
253
|
+
const previousCheckpointOutHashes = blocksByCheckpoint.map((checkpointBlocks)=>computeCheckpointOutHash(checkpointBlocks.map((b)=>b.block.body.txEffects.map((tx)=>tx.l2ToL1Msgs))));
|
|
244
254
|
try {
|
|
245
255
|
this.log.verbose(`Re-executing transactions in the proposal`, proposalInfo);
|
|
246
|
-
reexecutionResult = await this.reexecuteTransactions(proposal, blockNumber, checkpointNumber, txs, l1ToL2Messages);
|
|
256
|
+
reexecutionResult = await this.reexecuteTransactions(proposal, blockNumber, checkpointNumber, txs, l1ToL2Messages, previousCheckpointOutHashes);
|
|
247
257
|
} catch (error) {
|
|
248
258
|
this.log.error(`Error reexecuting txs while processing block proposal`, error, proposalInfo);
|
|
249
259
|
const reason = this.getReexecuteFailureReason(error);
|
|
@@ -256,7 +266,6 @@ export class BlockProposalHandler {
|
|
|
256
266
|
}
|
|
257
267
|
}
|
|
258
268
|
// If we succeeded, push this block into the archiver (unless disabled)
|
|
259
|
-
// TODO(palla/mbps): Change default to false once block sync is stable.
|
|
260
269
|
if (reexecutionResult?.block && this.config.skipPushProposedBlocksToArchiver === false) {
|
|
261
270
|
await this.blockSource.addBlock(reexecutionResult?.block);
|
|
262
271
|
}
|
|
@@ -310,7 +319,7 @@ export class BlockProposalHandler {
|
|
|
310
319
|
// TODO(palla/mbps): The block header should include the checkpoint number to avoid this lookup,
|
|
311
320
|
// or at least the L2BlockSource should return a different struct that includes it.
|
|
312
321
|
const parentBlockNumber = parentBlockHeader.getBlockNumber();
|
|
313
|
-
const parentBlock = await this.blockSource.
|
|
322
|
+
const parentBlock = await this.blockSource.getL2Block(parentBlockNumber);
|
|
314
323
|
if (!parentBlock) {
|
|
315
324
|
this.log.warn(`Parent block ${parentBlockNumber} not found in archiver`, proposalInfo);
|
|
316
325
|
return {
|
|
@@ -434,23 +443,7 @@ export class BlockProposalHandler {
|
|
|
434
443
|
}
|
|
435
444
|
getReexecutionDeadline(slot, config) {
|
|
436
445
|
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(slot + 1), config));
|
|
437
|
-
|
|
438
|
-
return new Date(nextSlotTimestampSeconds * 1000 - msNeededForPropagationAndPublishing);
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Gets all prior blocks in the same checkpoint (same slot and checkpoint number) up to but not including upToBlockNumber.
|
|
442
|
-
*/ async getBlocksInCheckpoint(slot, upToBlockNumber, checkpointNumber) {
|
|
443
|
-
const blocks = [];
|
|
444
|
-
let currentBlockNumber = BlockNumber(upToBlockNumber - 1);
|
|
445
|
-
while(currentBlockNumber >= INITIAL_L2_BLOCK_NUM){
|
|
446
|
-
const block = await this.blockSource.getL2BlockNew(currentBlockNumber);
|
|
447
|
-
if (!block || block.header.getSlot() !== slot || block.checkpointNumber !== checkpointNumber) {
|
|
448
|
-
break;
|
|
449
|
-
}
|
|
450
|
-
blocks.unshift(block);
|
|
451
|
-
currentBlockNumber = BlockNumber(currentBlockNumber - 1);
|
|
452
|
-
}
|
|
453
|
-
return blocks;
|
|
446
|
+
return new Date(nextSlotTimestampSeconds * 1000);
|
|
454
447
|
}
|
|
455
448
|
getReexecuteFailureReason(err) {
|
|
456
449
|
if (err instanceof ReExStateMismatchError) {
|
|
@@ -463,7 +456,7 @@ export class BlockProposalHandler {
|
|
|
463
456
|
return 'unknown_error';
|
|
464
457
|
}
|
|
465
458
|
}
|
|
466
|
-
async reexecuteTransactions(proposal, blockNumber, checkpointNumber, txs, l1ToL2Messages) {
|
|
459
|
+
async reexecuteTransactions(proposal, blockNumber, checkpointNumber, txs, l1ToL2Messages, previousCheckpointOutHashes) {
|
|
467
460
|
const env = {
|
|
468
461
|
stack: [],
|
|
469
462
|
error: void 0,
|
|
@@ -480,10 +473,12 @@ export class BlockProposalHandler {
|
|
|
480
473
|
const timer = new Timer();
|
|
481
474
|
const slot = proposal.slotNumber;
|
|
482
475
|
const config = this.checkpointsBuilder.getConfig();
|
|
483
|
-
// Get prior blocks in this checkpoint (same slot
|
|
484
|
-
const
|
|
476
|
+
// Get prior blocks in this checkpoint (same slot before current block)
|
|
477
|
+
const allBlocksInSlot = await this.blockSource.getBlocksForSlot(slot);
|
|
478
|
+
const priorBlocks = allBlocksInSlot.filter((b)=>b.number < blockNumber && b.header.getSlot() === slot);
|
|
485
479
|
// Fork before the block to be built
|
|
486
480
|
const parentBlockNumber = BlockNumber(blockNumber - 1);
|
|
481
|
+
await this.worldState.syncImmediate(parentBlockNumber);
|
|
487
482
|
const fork = _ts_add_disposable_resource(env, await this.worldState.fork(parentBlockNumber), false);
|
|
488
483
|
// Build checkpoint constants from proposal (excludes blockNumber and timestamp which are per-block)
|
|
489
484
|
const constants = {
|
|
@@ -495,7 +490,7 @@ export class BlockProposalHandler {
|
|
|
495
490
|
gasFees: blockHeader.globalVariables.gasFees
|
|
496
491
|
};
|
|
497
492
|
// Create checkpoint builder with prior blocks
|
|
498
|
-
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork, priorBlocks);
|
|
493
|
+
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, priorBlocks, this.log.getBindings());
|
|
499
494
|
// Build the new block
|
|
500
495
|
const deadline = this.getReexecutionDeadline(slot, config);
|
|
501
496
|
const result = await checkpointBuilder.buildBlock(txs, blockNumber, blockHeader.globalVariables.timestamp, {
|
|
@@ -1,41 +1,35 @@
|
|
|
1
1
|
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import {
|
|
3
|
+
import { type LoggerBindings } from '@aztec/foundation/log';
|
|
4
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
5
|
import { LightweightCheckpointBuilder } from '@aztec/prover-client/light';
|
|
5
6
|
import { PublicProcessor } from '@aztec/simulator/server';
|
|
6
|
-
import {
|
|
7
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
7
8
|
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
8
9
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
9
|
-
import {
|
|
10
|
-
import { type FullNodeBlockBuilderConfig, type MerkleTreeWriteOperations, type PublicProcessorLimits } from '@aztec/stdlib/interfaces/server';
|
|
11
|
-
import { type CheckpointGlobalVariables,
|
|
10
|
+
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
+
import { type BuildBlockInCheckpointResult, type FullNodeBlockBuilderConfig, type ICheckpointBlockBuilder, type ICheckpointsBuilder, type MerkleTreeWriteOperations, type PublicProcessorLimits, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
12
|
+
import { type CheckpointGlobalVariables, GlobalVariables, StateReference, Tx } from '@aztec/stdlib/tx';
|
|
12
13
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
13
|
-
export
|
|
14
|
-
block: L2BlockNew;
|
|
15
|
-
publicGas: Gas;
|
|
16
|
-
publicProcessorDuration: number;
|
|
17
|
-
numTxs: number;
|
|
18
|
-
failedTxs: FailedTx[];
|
|
19
|
-
blockBuildingTimer: Timer;
|
|
20
|
-
usedTxs: Tx[];
|
|
21
|
-
}
|
|
14
|
+
export type { BuildBlockInCheckpointResult } from '@aztec/stdlib/interfaces/server';
|
|
22
15
|
/**
|
|
23
16
|
* Builder for a single checkpoint. Handles building blocks within the checkpoint
|
|
24
17
|
* and completing it.
|
|
25
18
|
*/
|
|
26
|
-
export declare class CheckpointBuilder {
|
|
19
|
+
export declare class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
27
20
|
private checkpointBuilder;
|
|
28
21
|
private fork;
|
|
29
22
|
private config;
|
|
30
23
|
private contractDataSource;
|
|
31
24
|
private dateProvider;
|
|
32
25
|
private telemetryClient;
|
|
33
|
-
|
|
26
|
+
private log;
|
|
27
|
+
constructor(checkpointBuilder: LightweightCheckpointBuilder, fork: MerkleTreeWriteOperations, config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient: TelemetryClient, bindings?: LoggerBindings);
|
|
34
28
|
getConstantData(): CheckpointGlobalVariables;
|
|
35
29
|
/**
|
|
36
30
|
* Builds a single block within this checkpoint.
|
|
37
31
|
*/
|
|
38
|
-
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts
|
|
32
|
+
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts?: PublicProcessorLimits & {
|
|
39
33
|
expectedEndState?: StateReference;
|
|
40
34
|
}): Promise<BuildBlockInCheckpointResult>;
|
|
41
35
|
/** Completes the checkpoint and returns it. */
|
|
@@ -47,24 +41,26 @@ export declare class CheckpointBuilder {
|
|
|
47
41
|
validator: import("@aztec/stdlib/interfaces/server").PublicProcessorValidator;
|
|
48
42
|
}>;
|
|
49
43
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
*/
|
|
53
|
-
export declare class FullNodeCheckpointsBuilder {
|
|
44
|
+
/** Factory for creating checkpoint builders. */
|
|
45
|
+
export declare class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
54
46
|
private config;
|
|
47
|
+
private worldState;
|
|
55
48
|
private contractDataSource;
|
|
56
49
|
private dateProvider;
|
|
57
50
|
private telemetryClient;
|
|
58
|
-
|
|
51
|
+
private log;
|
|
52
|
+
constructor(config: FullNodeBlockBuilderConfig & Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>, worldState: WorldStateSynchronizer, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient?: TelemetryClient);
|
|
59
53
|
getConfig(): FullNodeBlockBuilderConfig;
|
|
60
54
|
updateConfig(config: Partial<FullNodeBlockBuilderConfig>): void;
|
|
61
55
|
/**
|
|
62
56
|
* Starts a new checkpoint and returns a CheckpointBuilder to build blocks within it.
|
|
63
57
|
*/
|
|
64
|
-
startCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], fork: MerkleTreeWriteOperations): Promise<CheckpointBuilder>;
|
|
58
|
+
startCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[], fork: MerkleTreeWriteOperations, bindings?: LoggerBindings): Promise<CheckpointBuilder>;
|
|
65
59
|
/**
|
|
66
60
|
* Opens a checkpoint, either starting fresh or resuming from existing blocks.
|
|
67
61
|
*/
|
|
68
|
-
openCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], fork: MerkleTreeWriteOperations, existingBlocks?:
|
|
62
|
+
openCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[], fork: MerkleTreeWriteOperations, existingBlocks?: L2Block[], bindings?: LoggerBindings): Promise<CheckpointBuilder>;
|
|
63
|
+
/** Returns a fork of the world state at the given block number. */
|
|
64
|
+
getFork(blockNumber: BlockNumber): Promise<MerkleTreeWriteOperations>;
|
|
69
65
|
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9idWlsZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxZQUFZLEVBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBR0wsZUFBZSxFQUVoQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLE9BQU8sRUFDTCxLQUFLLDRCQUE0QixFQUNqQyxLQUFLLDBCQUEwQixFQUUvQixLQUFLLHVCQUF1QixFQUM1QixLQUFLLG1CQUFtQixFQUN4QixLQUFLLHlCQUF5QixFQUU5QixLQUFLLHFCQUFxQixFQUMxQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLHlCQUF5QixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkcsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBS25GLFlBQVksRUFBRSw0QkFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_builder.d.ts","sourceRoot":"","sources":["../src/checkpoint_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint_builder.d.ts","sourceRoot":"","sources":["../src/checkpoint_builder.ts"],"names":[],"mappings":"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"}
|