@aztec/validator-client 0.0.1-commit.1142ef1 → 0.0.1-commit.1bea0213
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 +41 -15
- package/dest/block_proposal_handler.d.ts +7 -6
- package/dest/block_proposal_handler.d.ts.map +1 -1
- package/dest/block_proposal_handler.js +23 -29
- package/dest/checkpoint_builder.d.ts +18 -21
- package/dest/checkpoint_builder.d.ts.map +1 -1
- package/dest/checkpoint_builder.js +17 -12
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -11
- 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/tx_validator/tx_validator_factory.d.ts +1 -1
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.js +2 -1
- package/dest/validator.d.ts +9 -8
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +68 -60
- package/package.json +19 -17
- package/src/block_proposal_handler.ts +34 -36
- package/src/checkpoint_builder.ts +37 -20
- package/src/config.ts +5 -10
- 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/tx_validator/tx_validator_factory.ts +2 -0
- package/src/validator.ts +85 -69
package/README.md
CHANGED
|
@@ -155,19 +155,42 @@ 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
|
-
| `validatorReexecuteDeadlineMs`
|
|
165
|
-
| `attestationPollingIntervalMs`
|
|
166
|
-
| `disabledValidators`
|
|
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
|
+
| `validatorReexecuteDeadlineMs` | Time reserved at end of slot for propagation/publishing |
|
|
165
|
+
| `attestationPollingIntervalMs` | How often to poll for attestations when collecting |
|
|
166
|
+
| `disabledValidators` | Validator addresses to exclude from duties |
|
|
167
|
+
|
|
168
|
+
### High Availability (HA) Keystore
|
|
169
|
+
|
|
170
|
+
When running multiple validator nodes with the same validator keys in a high-availability setup, enable HA signing to prevent double-signing:
|
|
171
|
+
|
|
172
|
+
| Environment Variable | Purpose |
|
|
173
|
+
| -------------------------------------- | ---------------------------------------------------------------------- |
|
|
174
|
+
| `VALIDATOR_HA_SIGNING_ENABLED` | Enable HA signing / slashing protection (default: false) |
|
|
175
|
+
| `VALIDATOR_HA_DATABASE_URL` | PostgreSQL connection string for coordination (required when enabled) |
|
|
176
|
+
| `VALIDATOR_HA_NODE_ID` | Unique identifier for this validator node (required when enabled) |
|
|
177
|
+
| `VALIDATOR_HA_POLLING_INTERVAL_MS` | How often to check duty status (default: 100) |
|
|
178
|
+
| `VALIDATOR_HA_SIGNING_TIMEOUT_MS` | Max wait for in-progress signing (default: 3000) |
|
|
179
|
+
| `VALIDATOR_HA_MAX_STUCK_DUTIES_AGE_MS` | Max age of stuck duties before cleanup (default: 2\*aztecSlotDuration) |
|
|
180
|
+
|
|
181
|
+
When `VALIDATOR_HA_SIGNING_ENABLED=true`, the validator client automatically:
|
|
182
|
+
|
|
183
|
+
- Creates an HA signer using the provided configuration
|
|
184
|
+
- Wraps the base keystore with `HAKeyStore` for HA-protected signing
|
|
185
|
+
- Coordinates signing across nodes via PostgreSQL to prevent double-signing
|
|
186
|
+
- Provides slashing protection to block conflicting signatures
|
|
187
|
+
|
|
188
|
+
See [`@aztec/validator-ha-signer`](../validator-ha-signer/README.md) for more details.
|
|
167
189
|
|
|
168
190
|
### Fisherman Mode
|
|
169
191
|
|
|
170
192
|
When `fishermanMode: true`, the validator:
|
|
193
|
+
|
|
171
194
|
- Validates all proposals (block and checkpoint)
|
|
172
195
|
- Re-executes transactions
|
|
173
196
|
- Creates attestations internally for validation
|
|
@@ -179,6 +202,7 @@ This is useful for monitoring network health without participating in consensus.
|
|
|
179
202
|
### Key Methods
|
|
180
203
|
|
|
181
204
|
**ValidatorClient** (`validator.ts`):
|
|
205
|
+
|
|
182
206
|
- `validateBlockProposal(proposal, sender)` → `boolean`: Validates block, optionally re-executes, emits slash events
|
|
183
207
|
- `attestToCheckpointProposal(proposal, sender)` → `CheckpointAttestation[]?`: Validates checkpoint and creates attestations
|
|
184
208
|
- `collectAttestations(proposal, required, deadline)` → `CheckpointAttestation[]`: Waits for attestations from other validators
|
|
@@ -186,10 +210,12 @@ This is useful for monitoring network health without participating in consensus.
|
|
|
186
210
|
- `createCheckpointProposal(...)` → `CheckpointProposal`: Creates and signs a checkpoint proposal
|
|
187
211
|
|
|
188
212
|
**BlockProposalHandler** (`block_proposal_handler.ts`):
|
|
213
|
+
|
|
189
214
|
- `handleBlockProposal(proposal, sender, shouldReexecute)` → `ValidationResult`: Full block validation pipeline
|
|
190
215
|
- `reexecuteTransactions(proposal, blockNumber, txs, messages)` → `ReexecutionResult`: Re-runs transactions and compares state
|
|
191
216
|
|
|
192
217
|
**ValidationService** (`duties/validation_service.ts`):
|
|
218
|
+
|
|
193
219
|
- `createBlockProposal(...)` → `BlockProposal`: Signs block proposal with validator key
|
|
194
220
|
- `createCheckpointProposal(...)` → `CheckpointProposal`: Signs checkpoint proposal
|
|
195
221
|
- `attestToCheckpointProposal(proposal, attestors)` → `CheckpointAttestation[]`: Creates attestations for given addresses
|
|
@@ -204,7 +230,7 @@ Tests typically mock these dependencies:
|
|
|
204
230
|
let epochCache: MockProxy<EpochCache>;
|
|
205
231
|
let blockSource: MockProxy<L2BlockSource>;
|
|
206
232
|
let txProvider: MockProxy<TxProvider>;
|
|
207
|
-
let
|
|
233
|
+
let checkpointsBuilder: MockProxy<FullNodeCheckpointsBuilder>;
|
|
208
234
|
let p2pClient: MockProxy<P2P>;
|
|
209
235
|
|
|
210
236
|
beforeEach(() => {
|
|
@@ -219,19 +245,19 @@ beforeEach(() => {
|
|
|
219
245
|
Use factory functions from `@aztec/stdlib/testing`:
|
|
220
246
|
|
|
221
247
|
```typescript
|
|
222
|
-
import { makeBlockProposal,
|
|
248
|
+
import { makeBlockHeader, makeBlockProposal, makeCheckpointHeader, makeCheckpointProposal } from '@aztec/stdlib/testing';
|
|
223
249
|
|
|
224
250
|
// These are async - always await
|
|
225
251
|
const blockProposal = await makeBlockProposal({
|
|
226
|
-
blockHeader:
|
|
252
|
+
blockHeader: makeBlockHeader(1, { blockNumber: BlockNumber(100), slotNumber: SlotNumber(100) }),
|
|
227
253
|
indexWithinCheckpoint: 0,
|
|
228
254
|
signer: Secp256k1Signer.random(),
|
|
229
255
|
});
|
|
230
256
|
|
|
231
257
|
const checkpointProposal = await makeCheckpointProposal({
|
|
232
|
-
checkpointHeader:
|
|
258
|
+
checkpointHeader: makeCheckpointHeader(1, { slotNumber: SlotNumber(100) }),
|
|
233
259
|
signer: proposer,
|
|
234
|
-
lastBlock: { blockHeader, txs },
|
|
260
|
+
lastBlock: { blockHeader: makeBlockHeader(1), txs },
|
|
235
261
|
});
|
|
236
262
|
```
|
|
237
263
|
|
|
@@ -242,7 +268,7 @@ For tests that exercise re-execution:
|
|
|
242
268
|
```typescript
|
|
243
269
|
// Mock parent block lookup
|
|
244
270
|
blockSource.getBlockHeaderByArchive.mockResolvedValue(parentBlockHeader);
|
|
245
|
-
blockSource.
|
|
271
|
+
blockSource.getL2Block.mockResolvedValue({
|
|
246
272
|
checkpointNumber: CheckpointNumber(1),
|
|
247
273
|
indexWithinCheckpoint: 0,
|
|
248
274
|
header: { globalVariables: parentGlobalVariables },
|
|
@@ -1,10 +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
6
|
import { TxProvider } from '@aztec/p2p';
|
|
6
7
|
import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
7
|
-
import type {
|
|
8
|
+
import type { L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
8
9
|
import type { ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
10
|
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
10
11
|
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
@@ -14,7 +15,7 @@ import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
|
14
15
|
import type { ValidatorMetrics } from './metrics.js';
|
|
15
16
|
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
17
|
type ReexecuteTransactionsResult = {
|
|
17
|
-
block:
|
|
18
|
+
block: L2Block;
|
|
18
19
|
failedTxs: FailedTx[];
|
|
19
20
|
reexecutionTimeMs: number;
|
|
20
21
|
totalManaUsed: number;
|
|
@@ -38,12 +39,13 @@ export declare class BlockProposalHandler {
|
|
|
38
39
|
private l1ToL2MessageSource;
|
|
39
40
|
private txProvider;
|
|
40
41
|
private blockProposalValidator;
|
|
42
|
+
private epochCache;
|
|
41
43
|
private config;
|
|
42
44
|
private metrics?;
|
|
43
45
|
private dateProvider;
|
|
44
46
|
private log;
|
|
45
47
|
readonly tracer: Tracer;
|
|
46
|
-
constructor(checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider, blockProposalValidator: BlockProposalValidator, config: ValidatorClientFullConfig, metrics?: ValidatorMetrics | undefined, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
48
|
+
constructor(checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider, blockProposalValidator: BlockProposalValidator, epochCache: EpochCache, config: ValidatorClientFullConfig, metrics?: ValidatorMetrics | undefined, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
47
49
|
registerForReexecution(p2pClient: P2P): BlockProposalHandler;
|
|
48
50
|
handleBlockProposal(proposal: BlockProposal, proposalSender: PeerId, shouldReexecute: boolean): Promise<BlockProposalValidationResult>;
|
|
49
51
|
private getParentBlock;
|
|
@@ -55,9 +57,8 @@ export declare class BlockProposalHandler {
|
|
|
55
57
|
*/
|
|
56
58
|
private validateNonFirstBlockInCheckpoint;
|
|
57
59
|
private getReexecutionDeadline;
|
|
58
|
-
private getBlocksInCheckpoint;
|
|
59
60
|
private getReexecuteFailureReason;
|
|
60
|
-
reexecuteTransactions(proposal: BlockProposal, blockNumber: BlockNumber, checkpointNumber: CheckpointNumber, txs: Tx[], l1ToL2Messages: Fr[]): Promise<ReexecuteTransactionsResult>;
|
|
61
|
+
reexecuteTransactions(proposal: BlockProposal, blockNumber: BlockNumber, checkpointNumber: CheckpointNumber, txs: Tx[], l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[]): Promise<ReexecuteTransactionsResult>;
|
|
61
62
|
}
|
|
62
63
|
export {};
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2NrX3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLGlDQUFpQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUlwRCxPQUFPLEVBQUUsWUFBWSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFL0UsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RyxPQUFPLEVBQ0wsS0FBSyxtQkFBbUIsRUFHekIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQStDLEtBQUssUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPdkcsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFFLEtBQUssTUFBTSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBRWhHLE9BQU8sS0FBSyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdC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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,
|
|
@@ -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,8 +473,9 @@ 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);
|
|
487
481
|
const fork = _ts_add_disposable_resource(env, await this.worldState.fork(parentBlockNumber), false);
|
|
@@ -495,7 +489,7 @@ export class BlockProposalHandler {
|
|
|
495
489
|
gasFees: blockHeader.globalVariables.gasFees
|
|
496
490
|
};
|
|
497
491
|
// Create checkpoint builder with prior blocks
|
|
498
|
-
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork, priorBlocks);
|
|
492
|
+
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, priorBlocks);
|
|
499
493
|
// Build the new block
|
|
500
494
|
const deadline = this.getReexecutionDeadline(slot, config);
|
|
501
495
|
const result = await checkpointBuilder.buildBlock(txs, blockNumber, blockHeader.globalVariables.timestamp, {
|
|
@@ -3,27 +3,23 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
3
3
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
4
4
|
import { LightweightCheckpointBuilder } from '@aztec/prover-client/light';
|
|
5
5
|
import { PublicProcessor } from '@aztec/simulator/server';
|
|
6
|
-
import {
|
|
6
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
7
7
|
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
8
8
|
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,
|
|
9
|
+
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
10
|
+
import { type BuildBlockInCheckpointResult, type FullNodeBlockBuilderConfig, type ICheckpointBlockBuilder, type ICheckpointsBuilder, type MerkleTreeWriteOperations, type PublicProcessorLimits, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
11
|
+
import { type CheckpointGlobalVariables, GlobalVariables, StateReference, Tx } from '@aztec/stdlib/tx';
|
|
12
12
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
publicProcessorDuration: number;
|
|
17
|
-
numTxs: number;
|
|
18
|
-
failedTxs: FailedTx[];
|
|
13
|
+
export type { BuildBlockInCheckpointResult } from '@aztec/stdlib/interfaces/server';
|
|
14
|
+
/** Result of building a block within a checkpoint. Extends the base interface with timer. */
|
|
15
|
+
export interface BuildBlockInCheckpointResultWithTimer extends BuildBlockInCheckpointResult {
|
|
19
16
|
blockBuildingTimer: Timer;
|
|
20
|
-
usedTxs: Tx[];
|
|
21
17
|
}
|
|
22
18
|
/**
|
|
23
19
|
* Builder for a single checkpoint. Handles building blocks within the checkpoint
|
|
24
20
|
* and completing it.
|
|
25
21
|
*/
|
|
26
|
-
export declare class CheckpointBuilder {
|
|
22
|
+
export declare class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
27
23
|
private checkpointBuilder;
|
|
28
24
|
private fork;
|
|
29
25
|
private config;
|
|
@@ -37,7 +33,7 @@ export declare class CheckpointBuilder {
|
|
|
37
33
|
*/
|
|
38
34
|
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts: PublicProcessorLimits & {
|
|
39
35
|
expectedEndState?: StateReference;
|
|
40
|
-
}): Promise<
|
|
36
|
+
}): Promise<BuildBlockInCheckpointResultWithTimer>;
|
|
41
37
|
/** Completes the checkpoint and returns it. */
|
|
42
38
|
completeCheckpoint(): Promise<Checkpoint>;
|
|
43
39
|
/** Gets the checkpoint currently in progress. */
|
|
@@ -47,24 +43,25 @@ export declare class CheckpointBuilder {
|
|
|
47
43
|
validator: import("@aztec/stdlib/interfaces/server").PublicProcessorValidator;
|
|
48
44
|
}>;
|
|
49
45
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
*/
|
|
53
|
-
export declare class FullNodeCheckpointsBuilder {
|
|
46
|
+
/** Factory for creating checkpoint builders. */
|
|
47
|
+
export declare class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
54
48
|
private config;
|
|
49
|
+
private worldState;
|
|
55
50
|
private contractDataSource;
|
|
56
51
|
private dateProvider;
|
|
57
52
|
private telemetryClient;
|
|
58
|
-
constructor(config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient?: TelemetryClient);
|
|
53
|
+
constructor(config: FullNodeBlockBuilderConfig & Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>, worldState: WorldStateSynchronizer, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient?: TelemetryClient);
|
|
59
54
|
getConfig(): FullNodeBlockBuilderConfig;
|
|
60
55
|
updateConfig(config: Partial<FullNodeBlockBuilderConfig>): void;
|
|
61
56
|
/**
|
|
62
57
|
* Starts a new checkpoint and returns a CheckpointBuilder to build blocks within it.
|
|
63
58
|
*/
|
|
64
|
-
startCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], fork: MerkleTreeWriteOperations): Promise<CheckpointBuilder>;
|
|
59
|
+
startCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[], fork: MerkleTreeWriteOperations): Promise<CheckpointBuilder>;
|
|
65
60
|
/**
|
|
66
61
|
* Opens a checkpoint, either starting fresh or resuming from existing blocks.
|
|
67
62
|
*/
|
|
68
|
-
openCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], fork: MerkleTreeWriteOperations, existingBlocks?:
|
|
63
|
+
openCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[], fork: MerkleTreeWriteOperations, existingBlocks?: L2Block[]): Promise<CheckpointBuilder>;
|
|
64
|
+
/** Returns a fork of the world state at the given block number. */
|
|
65
|
+
getFork(blockNumber: BlockNumber): Promise<MerkleTreeWriteOperations>;
|
|
69
66
|
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9idWlsZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBR0wsZUFBZSxFQUVoQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLE9BQU8sRUFDTCxLQUFLLDRCQUE0QixFQUNqQyxLQUFLLDBCQUEwQixFQUUvQixLQUFLLHVCQUF1QixFQUM1QixLQUFLLG1CQUFtQixFQUN4QixLQUFLLHlCQUF5QixFQUM5QixLQUFLLHFCQUFxQixFQUMxQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLHlCQUF5QixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkcsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBS25GLFlBQVksRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSXBGLDZGQUE2RjtBQUM3RixNQUFNLFdBQVcscUNBQXNDLFNBQVEsNEJBQTRCO0lBQ3pGLGtCQUFrQixFQUFFLEtBQUssQ0FBQztDQUMzQjtBQUVEOzs7R0FHRztBQUNILHFCQUFhLGlCQUFrQixZQUFXLHVCQUF1QjtJQUU3RCxPQUFPLENBQUMsaUJBQWlCO0lBQ3pCLE9BQU8sQ0FBQyxJQUFJO0lBQ1osT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsa0JBQWtCO0lBQzFCLE9BQU8sQ0FBQyxZQUFZO0lBQ3BCLE9BQU8sQ0FBQyxlQUFlO0lBTnpCLFlBQ1UsaUJBQWlCLEVBQUUsNEJBQTRCLEVBQy9DLElBQUksRUFBRSx5QkFBeUIsRUFDL0IsTUFBTSxFQUFFLDBCQUEwQixFQUNsQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFDdEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsZUFBZSxFQUFFLGVBQWUsRUFDdEM7SUFFSixlQUFlLElBQUkseUJBQXlCLENBRTNDO0lBRUQ7O09BRUc7SUFDRyxVQUFVLENBQ2QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQzVDLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLElBQUksRUFBRSxxQkFBcUIsR0FBRztRQUFFLGdCQUFnQixDQUFDLEVBQUUsY0FBYyxDQUFBO0tBQUUsR0FDbEUsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLENBZ0RoRDtJQUVELCtDQUErQztJQUN6QyxrQkFBa0IsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBVTlDO0lBRUQsaURBQWlEO0lBQ2pELGFBQWEsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBRW5DO0lBRUQsVUFBZ0Isb0JBQW9CLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUseUJBQXlCOzs7T0FrQ3JHO0NBQ0Y7QUFFRCxnREFBZ0Q7QUFDaEQscUJBQWEsMEJBQTJCLFlBQVcsbUJBQW1CO0lBRWxFLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFVBQVU7SUFDbEIsT0FBTyxDQUFDLGtCQUFrQjtJQUMxQixPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsZUFBZTtJQUx6QixZQUNVLE1BQU0sRUFBRSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxHQUFHLGNBQWMsQ0FBQyxFQUM5RixVQUFVLEVBQUUsc0JBQXNCLEVBQ2xDLGtCQUFrQixFQUFFLGtCQUFrQixFQUN0QyxZQUFZLEVBQUUsWUFBWSxFQUMxQixlQUFlLEdBQUUsZUFBc0MsRUFDN0Q7SUFFRyxTQUFTLElBQUksMEJBQTBCLENBRTdDO0lBRU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsMEJBQTBCLENBQUMsUUFFOUQ7SUFFRDs7T0FFRztJQUNHLGVBQWUsQ0FDbkIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2xDLFNBQVMsRUFBRSx5QkFBeUIsRUFDcEMsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUNwQiwyQkFBMkIsRUFBRSxFQUFFLEVBQUUsRUFDakMsSUFBSSxFQUFFLHlCQUF5QixHQUM5QixPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0E0QjVCO0lBRUQ7O09BRUc7SUFDRyxjQUFjLENBQ2xCLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxTQUFTLEVBQUUseUJBQXlCLEVBQ3BDLGNBQWMsRUFBRSxFQUFFLEVBQUUsRUFDcEIsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLEVBQ2pDLElBQUksRUFBRSx5QkFBeUIsRUFDL0IsY0FBYyxHQUFFLE9BQU8sRUFBTyxHQUM3QixPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FrQzVCO0lBRUQsbUVBQW1FO0lBQ25FLE9BQU8sQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUVwRTtDQUNGIn0=
|
|
@@ -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;AAGpD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAW,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAGL,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,
|
|
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;AAGpD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAW,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAGL,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAE/B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,yBAAyB,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAKnF,YAAY,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAIpF,6FAA6F;AAC7F,MAAM,WAAW,qCAAsC,SAAQ,4BAA4B;IACzF,kBAAkB,EAAE,KAAK,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,uBAAuB;IAE7D,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,eAAe;IANzB,YACU,iBAAiB,EAAE,4BAA4B,EAC/C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,0BAA0B,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EACtC;IAEJ,eAAe,IAAI,yBAAyB,CAE3C;IAED;;OAEG;IACG,UAAU,CACd,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,EAC5C,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,qBAAqB,GAAG;QAAE,gBAAgB,CAAC,EAAE,cAAc,CAAA;KAAE,GAClE,OAAO,CAAC,qCAAqC,CAAC,CAgDhD;IAED,+CAA+C;IACzC,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC,CAU9C;IAED,iDAAiD;IACjD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAEnC;IAED,UAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB;;;OAkCrG;CACF;AAED,gDAAgD;AAChD,qBAAa,0BAA2B,YAAW,mBAAmB;IAElE,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,eAAe;IALzB,YACU,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,cAAc,CAAC,EAC9F,UAAU,EAAE,sBAAsB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,eAAsC,EAC7D;IAEG,SAAS,IAAI,0BAA0B,CAE7C;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,QAE9D;IAED;;OAEG;IACG,eAAe,CACnB,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,yBAAyB,EACpC,cAAc,EAAE,EAAE,EAAE,EACpB,2BAA2B,EAAE,EAAE,EAAE,EACjC,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CA4B5B;IAED;;OAEG;IACG,cAAc,CAClB,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,yBAAyB,EACpC,cAAc,EAAE,EAAE,EAAE,EACpB,2BAA2B,EAAE,EAAE,EAAE,EACjC,IAAI,EAAE,yBAAyB,EAC/B,cAAc,GAAE,OAAO,EAAO,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAkC5B;IAED,mEAAmE;IACnE,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAEpE;CACF"}
|
|
@@ -41,7 +41,8 @@ const log = createLogger('checkpoint-builder');
|
|
|
41
41
|
log.verbose(`Building block ${blockNumber} for slot ${slot} within checkpoint`, {
|
|
42
42
|
slot,
|
|
43
43
|
blockNumber,
|
|
44
|
-
...opts
|
|
44
|
+
...opts,
|
|
45
|
+
currentTime: new Date(this.dateProvider.now())
|
|
45
46
|
});
|
|
46
47
|
const constants = this.checkpointBuilder.constants;
|
|
47
48
|
const globalVariables = GlobalVariables.from({
|
|
@@ -55,7 +56,7 @@ const log = createLogger('checkpoint-builder');
|
|
|
55
56
|
gasFees: constants.gasFees
|
|
56
57
|
});
|
|
57
58
|
const { processor, validator } = await this.makeBlockBuilderDeps(globalVariables, this.fork);
|
|
58
|
-
const [publicProcessorDuration, [processedTxs, failedTxs, usedTxs]] = await elapsed(()=>processor.process(pendingTxs, opts, validator));
|
|
59
|
+
const [publicProcessorDuration, [processedTxs, failedTxs, usedTxs, _, usedTxBlobFields]] = await elapsed(()=>processor.process(pendingTxs, opts, validator));
|
|
59
60
|
// Add block to checkpoint
|
|
60
61
|
const block = await this.checkpointBuilder.addBlock(globalVariables, processedTxs, {
|
|
61
62
|
expectedEndState: opts.expectedEndState
|
|
@@ -69,7 +70,8 @@ const log = createLogger('checkpoint-builder');
|
|
|
69
70
|
numTxs: processedTxs.length,
|
|
70
71
|
failedTxs,
|
|
71
72
|
blockBuildingTimer,
|
|
72
|
-
usedTxs
|
|
73
|
+
usedTxs,
|
|
74
|
+
usedTxBlobFields
|
|
73
75
|
};
|
|
74
76
|
log.debug('Built block within checkpoint', res.block.header);
|
|
75
77
|
return res;
|
|
@@ -99,15 +101,15 @@ const log = createLogger('checkpoint-builder');
|
|
|
99
101
|
};
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
|
-
/**
|
|
103
|
-
* Factory for creating checkpoint builders.
|
|
104
|
-
*/ export class FullNodeCheckpointsBuilder {
|
|
104
|
+
/** Factory for creating checkpoint builders. */ export class FullNodeCheckpointsBuilder {
|
|
105
105
|
config;
|
|
106
|
+
worldState;
|
|
106
107
|
contractDataSource;
|
|
107
108
|
dateProvider;
|
|
108
109
|
telemetryClient;
|
|
109
|
-
constructor(config, contractDataSource, dateProvider, telemetryClient = getTelemetryClient()){
|
|
110
|
+
constructor(config, worldState, contractDataSource, dateProvider, telemetryClient = getTelemetryClient()){
|
|
110
111
|
this.config = config;
|
|
112
|
+
this.worldState = worldState;
|
|
111
113
|
this.contractDataSource = contractDataSource;
|
|
112
114
|
this.dateProvider = dateProvider;
|
|
113
115
|
this.telemetryClient = telemetryClient;
|
|
@@ -120,7 +122,7 @@ const log = createLogger('checkpoint-builder');
|
|
|
120
122
|
}
|
|
121
123
|
/**
|
|
122
124
|
* Starts a new checkpoint and returns a CheckpointBuilder to build blocks within it.
|
|
123
|
-
*/ async startCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork) {
|
|
125
|
+
*/ async startCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork) {
|
|
124
126
|
const stateReference = await fork.getStateReference();
|
|
125
127
|
const archiveTree = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
126
128
|
log.verbose(`Building new checkpoint ${checkpointNumber}`, {
|
|
@@ -130,16 +132,16 @@ const log = createLogger('checkpoint-builder');
|
|
|
130
132
|
initialArchiveRoot: bufferToHex(archiveTree.root),
|
|
131
133
|
constants
|
|
132
134
|
});
|
|
133
|
-
const lightweightBuilder = await LightweightCheckpointBuilder.startNewCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork);
|
|
135
|
+
const lightweightBuilder = await LightweightCheckpointBuilder.startNewCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork);
|
|
134
136
|
return new CheckpointBuilder(lightweightBuilder, fork, this.config, this.contractDataSource, this.dateProvider, this.telemetryClient);
|
|
135
137
|
}
|
|
136
138
|
/**
|
|
137
139
|
* Opens a checkpoint, either starting fresh or resuming from existing blocks.
|
|
138
|
-
*/ async openCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork, existingBlocks = []) {
|
|
140
|
+
*/ async openCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, existingBlocks = []) {
|
|
139
141
|
const stateReference = await fork.getStateReference();
|
|
140
142
|
const archiveTree = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
141
143
|
if (existingBlocks.length === 0) {
|
|
142
|
-
return this.startCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork);
|
|
144
|
+
return this.startCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork);
|
|
143
145
|
}
|
|
144
146
|
log.verbose(`Resuming checkpoint ${checkpointNumber} with ${existingBlocks.length} existing blocks`, {
|
|
145
147
|
checkpointNumber,
|
|
@@ -149,7 +151,10 @@ const log = createLogger('checkpoint-builder');
|
|
|
149
151
|
initialArchiveRoot: bufferToHex(archiveTree.root),
|
|
150
152
|
constants
|
|
151
153
|
});
|
|
152
|
-
const lightweightBuilder = await LightweightCheckpointBuilder.resumeCheckpoint(checkpointNumber, constants, l1ToL2Messages, fork, existingBlocks);
|
|
154
|
+
const lightweightBuilder = await LightweightCheckpointBuilder.resumeCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, existingBlocks);
|
|
153
155
|
return new CheckpointBuilder(lightweightBuilder, fork, this.config, this.contractDataSource, this.dateProvider, this.telemetryClient);
|
|
154
156
|
}
|
|
157
|
+
/** Returns a fork of the world state at the given block number. */ getFork(blockNumber) {
|
|
158
|
+
return this.worldState.fork(blockNumber);
|
|
159
|
+
}
|
|
155
160
|
}
|
package/dest/config.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export declare const validatorClientConfigMappings: ConfigMappingsType<Validator
|
|
|
8
8
|
* @returns The validator configuration.
|
|
9
9
|
*/
|
|
10
10
|
export declare function getProverEnvVars(): ValidatorClientConfig;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUt4QixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sS0FBSyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHN0UsWUFBWSxFQUFFLHFCQUFxQixFQUFFLENBQUM7QUFFdEMsZUFBTyxNQUFNLDZCQUE2QixFQUFFLGtCQUFrQixDQUFDLHFCQUFxQixDQWdFbkYsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCx3QkFBZ0IsZ0JBQWdCLElBQUkscUJBQXFCLENBRXhEIn0=
|
package/dest/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAG7E,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,eAAO,MAAM,6BAA6B,EAAE,kBAAkB,CAAC,qBAAqB,CAgEnF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CAExD"}
|
package/dest/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper, secretValueConfigHelper } from '@aztec/foundation/config';
|
|
2
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { validatorHASignerConfigMappings } from '@aztec/validator-ha-signer/config';
|
|
3
4
|
export const validatorClientConfigMappings = {
|
|
4
5
|
validatorPrivateKeys: {
|
|
5
6
|
env: 'VALIDATOR_PRIVATE_KEYS',
|
|
@@ -35,15 +36,9 @@ export const validatorClientConfigMappings = {
|
|
|
35
36
|
description: 'Re-execute transactions before attesting',
|
|
36
37
|
...booleanConfigHelper(true)
|
|
37
38
|
},
|
|
38
|
-
validatorReexecuteDeadlineMs: {
|
|
39
|
-
env: 'VALIDATOR_REEXECUTE_DEADLINE_MS',
|
|
40
|
-
description: 'Will re-execute until this many milliseconds are left in the slot',
|
|
41
|
-
...numberConfigHelper(6000)
|
|
42
|
-
},
|
|
43
39
|
alwaysReexecuteBlockProposals: {
|
|
44
|
-
env: 'ALWAYS_REEXECUTE_BLOCK_PROPOSALS',
|
|
45
40
|
description: 'Whether to always reexecute block proposals, even for non-validator nodes (useful for monitoring network status).',
|
|
46
|
-
|
|
41
|
+
defaultValue: true
|
|
47
42
|
},
|
|
48
43
|
fishermanMode: {
|
|
49
44
|
env: 'FISHERMAN_MODE',
|
|
@@ -55,11 +50,11 @@ export const validatorClientConfigMappings = {
|
|
|
55
50
|
description: 'Skip checkpoint proposal validation and always attest (default: true)',
|
|
56
51
|
defaultValue: true
|
|
57
52
|
},
|
|
58
|
-
// TODO(palla/mbps): Change default to false once block sync is stable
|
|
59
53
|
skipPushProposedBlocksToArchiver: {
|
|
60
|
-
description: 'Skip pushing re-executed blocks to archiver (default:
|
|
61
|
-
defaultValue:
|
|
62
|
-
}
|
|
54
|
+
description: 'Skip pushing re-executed blocks to archiver (default: false)',
|
|
55
|
+
defaultValue: false
|
|
56
|
+
},
|
|
57
|
+
...validatorHASignerConfigMappings
|
|
63
58
|
};
|
|
64
59
|
/**
|
|
65
60
|
* Returns the prover configuration from the environment variables.
|