@aztec-labs/validator-client 6.0.0-rc.1 → 6.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/proposal_handler.d.ts +24 -6
- package/dest/proposal_handler.d.ts.map +1 -1
- package/dest/proposal_handler.js +182 -38
- package/dest/streaming_inbox_checks.d.ts +1 -1
- package/dest/streaming_inbox_checks.d.ts.map +1 -1
- package/dest/streaming_inbox_checks.js +13 -7
- package/dest/validator.d.ts +5 -1
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +59 -25
- package/package.json +19 -19
- package/src/proposal_handler.ts +236 -42
- package/src/streaming_inbox_checks.ts +15 -6
- package/src/validator.ts +68 -28
|
@@ -19,7 +19,7 @@ import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
|
19
19
|
import { type InboxEndpointReader } from './checkpoint_endpoint_check.js';
|
|
20
20
|
import type { ValidatorMetrics } from './metrics.js';
|
|
21
21
|
import { type StreamingBlockCheckReason } from './streaming_inbox_checks.js';
|
|
22
|
-
export type BlockProposalValidationFailureReason = 'invalid_signature' | 'invalid_proposal' | 'parent_block_not_found' | 'parent_block_wrong_slot' | StreamingBlockCheckReason | 'global_variables_mismatch' | 'block_number_already_exists' | 'txs_not_available' | 'duplicate_txs' | 'invalid_embedded_txs' | 'state_mismatch' | 'failed_txs' | 'initial_state_mismatch' | 'timeout' | 'block_proposal_beyond_checkpoint' | 'checkpoint_proposal_equivocation' | 'unknown_error';
|
|
22
|
+
export type BlockProposalValidationFailureReason = 'invalid_signature' | 'invalid_proposal' | 'parent_block_not_found' | 'parent_block_pruned_during_validation' | 'parent_block_wrong_slot' | StreamingBlockCheckReason | 'global_variables_mismatch' | 'block_number_already_exists' | 'txs_not_available' | 'duplicate_txs' | 'invalid_embedded_txs' | 'state_mismatch' | 'failed_txs' | 'initial_state_mismatch' | 'timeout' | 'block_proposal_beyond_checkpoint' | 'checkpoint_proposal_equivocation' | 'unknown_error';
|
|
23
23
|
type ReexecuteTransactionsResult = {
|
|
24
24
|
block: L2Block;
|
|
25
25
|
failedTxs: FailedTx[];
|
|
@@ -38,7 +38,7 @@ export type BlockProposalValidationFailureResult = {
|
|
|
38
38
|
reexecutionResult?: ReexecuteTransactionsResult;
|
|
39
39
|
};
|
|
40
40
|
export type BlockProposalValidationResult = BlockProposalValidationSuccessResult | BlockProposalValidationFailureResult;
|
|
41
|
-
export type CheckpointProposalValidationFailureReason = 'invalid_signature' | 'invalid_fee_asset_price_modifier' | 'last_block_not_found' | 'block_fetch_error' | 'world_state_not_synced' | 'checkpoint_already_published' | 'last_block_archive_mismatch' | 'too_many_blocks_in_checkpoint' | 'initial_archive_mismatch' | 'checkpoint_header_mismatch' | 'archive_mismatch' | 'out_hash_mismatch' | 'inbox_prefix_unavailable' | 'inbox_prefix_mismatch' | 'inbox_endpoint_unavailable' | 'inbox_endpoint_mismatch' | 'checkpoint_validation_failed';
|
|
41
|
+
export type CheckpointProposalValidationFailureReason = 'invalid_signature' | 'invalid_fee_asset_price_modifier' | 'last_block_not_found' | 'last_block_pruned_during_validation' | 'block_fetch_error' | 'world_state_not_synced' | 'checkpoint_already_published' | 'last_block_archive_mismatch' | 'too_many_blocks_in_checkpoint' | 'initial_archive_mismatch' | 'last_archive_root_mismatch' | 'checkpoint_header_mismatch' | 'archive_mismatch' | 'out_hash_mismatch' | 'inbox_prefix_unavailable' | 'inbox_prefix_mismatch' | 'inbox_endpoint_unavailable' | 'inbox_endpoint_mismatch' | 'checkpoint_validation_failed';
|
|
42
42
|
export type CheckpointProposalValidationSuccessResult = {
|
|
43
43
|
isValid: true;
|
|
44
44
|
checkpointNumber: CheckpointNumber;
|
|
@@ -91,8 +91,13 @@ export type BlockProposalObservers = {
|
|
|
91
91
|
escapeHatchOpen: boolean;
|
|
92
92
|
}) => void;
|
|
93
93
|
};
|
|
94
|
-
/**
|
|
95
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Block-proposal validation failures classified by whether they constitute a slashable invalid-block offense.
|
|
96
|
+
* A `Record` over the whole reason union, not a plain array, so a newly added reason - in particular one that reaches
|
|
97
|
+
* `BlockProposalValidationFailureReason` through `StreamingBlockCheckReason` - fails to compile until it is classified
|
|
98
|
+
* here, the way {@link SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT} already does for checkpoints.
|
|
99
|
+
*/
|
|
100
|
+
export declare const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT: Record<BlockProposalValidationFailureReason, boolean>;
|
|
96
101
|
/** Checkpoint-proposal validation failures that constitute a slashable invalid-checkpoint offense. */
|
|
97
102
|
export declare const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT: Record<CheckpointProposalValidationFailureReason, boolean>;
|
|
98
103
|
/**
|
|
@@ -210,6 +215,8 @@ export declare class ProposalHandler {
|
|
|
210
215
|
* are validated before processing.
|
|
211
216
|
*/
|
|
212
217
|
handleBlockProposal(proposal: ValidatedBlockProposal, proposalSender: PeerId, shouldReexecute: boolean): Promise<BlockProposalValidationResult>;
|
|
218
|
+
private checkParentStillLocal;
|
|
219
|
+
private validateBlockProposalOnParent;
|
|
213
220
|
private collectProposalTxs;
|
|
214
221
|
private validateNewBlockInSlot;
|
|
215
222
|
private awaitLocalSync;
|
|
@@ -260,8 +267,19 @@ export declare class ProposalHandler {
|
|
|
260
267
|
*/
|
|
261
268
|
handleCheckpointProposal(proposal: ValidatedCheckpointProposalCore, proposalInfo: LogData): Promise<CheckpointProposalValidationResult>;
|
|
262
269
|
private confirmInboxEndpoint;
|
|
263
|
-
|
|
270
|
+
private checkLastBlockStillLocal;
|
|
271
|
+
/**
|
|
272
|
+
* The endpoint gate's own ceiling, narrowed by a slot whose attestation window is nearly spent.
|
|
273
|
+
*
|
|
274
|
+
* The floor survives past the attestation deadline on purpose, and is bounded at
|
|
275
|
+
* {@link INBOX_ENDPOINT_CHECK_MIN_WINDOW_MS} for it: a late node still wants the content verdict for telemetry,
|
|
276
|
+
* and reaching one costs one bounded local L1 read. What the floor must not buy is a signature, which is why
|
|
277
|
+
* {@link getAttestationDeadline} is re-read at the signing boundary rather than here — a window is not a
|
|
278
|
+
* permission to attest.
|
|
279
|
+
*/
|
|
264
280
|
private getInboxEndpointWindowMs;
|
|
281
|
+
/** The consensus attestation deadline for a slot: the last moment an attestation for it may be signed. */
|
|
282
|
+
getAttestationDeadline(slot: SlotNumber): Date;
|
|
265
283
|
/**
|
|
266
284
|
* Validates a checkpoint proposal by building the full checkpoint and comparing it with the proposal.
|
|
267
285
|
* @returns Validation result with isValid flag and reason if invalid.
|
|
@@ -276,4 +294,4 @@ export declare class ProposalHandler {
|
|
|
276
294
|
private setProposedCheckpoint;
|
|
277
295
|
}
|
|
278
296
|
export {};
|
|
279
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVExRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixLQUFLLHNCQUFzQixFQUMzQixVQUFVLEVBQ1gsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzFELE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFFbkYsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFhLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFHLE9BQU8sS0FBSyxFQUFFLDRCQUE0QixFQUFzQixNQUFNLCtCQUErQixDQUFDO0FBUXRHLE9BQU8sS0FBSyxFQUNWLFdBQVcsRUFFWCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQWlDLE1BQU0sOEJBQThCLENBQUM7QUFDdkcsT0FBTyxLQUFLLEVBQ1YsYUFBYSxFQUViLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,UAAU,EACX,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAyB,MAAM,8BAA8B,CAAC;AAEnF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAa,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,KAAK,EAAE,4BAA4B,EAAsB,MAAM,+BAA+B,CAAC;AAQtG,OAAO,KAAK,EACV,WAAW,EAEX,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAiC,MAAM,8BAA8B,CAAC;AACvG,OAAO,KAAK,EACV,aAAa,EAEb,sBAAsB,EACtB,sBAAsB,EACtB,+BAA+B,EAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAA0C,QAAQ,EAAE,EAAE,EAAU,MAAM,uBAAuB,CAAC;AAS1G,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAsB,MAAM,8BAA8B,CAAC;AAErG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,KAAK,yBAAyB,EAM/B,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,oCAAoC,GAC5C,mBAAmB,GACnB,kBAAkB,GAClB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"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"}
|
package/dest/proposal_handler.js
CHANGED
|
@@ -91,8 +91,8 @@ import { checkStreamingBlockProposalMetadata, isRetryableStreamingBlockCheckReas
|
|
|
91
91
|
*
|
|
92
92
|
* Matched on the error name rather than with `instanceof`, because the archiver package is only a dev dependency
|
|
93
93
|
* here: the validator talks to its archiver through the `L2BlockSink` interface and must not take a runtime
|
|
94
|
-
* dependency on the implementation to classify its errors.
|
|
95
|
-
*
|
|
94
|
+
* dependency on the implementation to classify its errors. Every reason returned here is a local-view disagreement,
|
|
95
|
+
* so none is in {@link SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT}.
|
|
96
96
|
*/ function getInboxPrefixInsertFailureReason(err) {
|
|
97
97
|
if (!(err instanceof Error)) {
|
|
98
98
|
return undefined;
|
|
@@ -103,8 +103,11 @@ import { checkStreamingBlockProposalMetadata, isRetryableStreamingBlockCheckReas
|
|
|
103
103
|
case 'InboxPrefixNotSyncedError':
|
|
104
104
|
case 'ProposedBlockParentNotFoundError':
|
|
105
105
|
return 'inbox_prefix_unavailable';
|
|
106
|
+
// An insert-time consumption rewind means an L1 reorg landed between the deterministic metadata check (which
|
|
107
|
+
// already passed) and the insert, so it is a local-view disagreement, not proposer misconduct. Report it as the
|
|
108
|
+
// non-slashable prefix mismatch; the deterministic metadata check remains the only slashing evidence for a rewind.
|
|
106
109
|
case 'InboxConsumptionRewindsError':
|
|
107
|
-
return '
|
|
110
|
+
return 'inbox_prefix_mismatch';
|
|
108
111
|
default:
|
|
109
112
|
return undefined;
|
|
110
113
|
}
|
|
@@ -118,9 +121,11 @@ import { checkStreamingBlockProposalMetadata, isRetryableStreamingBlockCheckReas
|
|
|
118
121
|
invalid_fee_asset_price_modifier: 'invalid',
|
|
119
122
|
checkpoint_already_published: undefined,
|
|
120
123
|
last_block_not_found: 'unvalidated',
|
|
124
|
+
last_block_pruned_during_validation: 'unvalidated',
|
|
121
125
|
block_fetch_error: 'unvalidated',
|
|
122
126
|
world_state_not_synced: 'unvalidated',
|
|
123
127
|
initial_archive_mismatch: 'unvalidated',
|
|
128
|
+
last_archive_root_mismatch: 'invalid',
|
|
124
129
|
last_block_archive_mismatch: 'invalid',
|
|
125
130
|
too_many_blocks_in_checkpoint: 'invalid',
|
|
126
131
|
checkpoint_header_mismatch: 'invalid',
|
|
@@ -177,19 +182,49 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
177
182
|
}
|
|
178
183
|
};
|
|
179
184
|
}
|
|
180
|
-
/**
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
'
|
|
187
|
-
'
|
|
188
|
-
]
|
|
185
|
+
/**
|
|
186
|
+
* Block-proposal validation failures classified by whether they constitute a slashable invalid-block offense.
|
|
187
|
+
* A `Record` over the whole reason union, not a plain array, so a newly added reason - in particular one that reaches
|
|
188
|
+
* `BlockProposalValidationFailureReason` through `StreamingBlockCheckReason` - fails to compile until it is classified
|
|
189
|
+
* here, the way {@link SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT} already does for checkpoints.
|
|
190
|
+
*/ export const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = {
|
|
191
|
+
// enabled: deterministic offenses computed from the block's own content, so every honest node rejects them.
|
|
192
|
+
['invalid_proposal']: true,
|
|
193
|
+
['state_mismatch']: true,
|
|
194
|
+
['failed_txs']: true,
|
|
195
|
+
['global_variables_mismatch']: true,
|
|
196
|
+
['parent_block_wrong_slot']: true,
|
|
197
|
+
['duplicate_txs']: true,
|
|
198
|
+
['invalid_embedded_txs']: true,
|
|
199
|
+
// Deterministic streaming-Inbox violations: computed from the block's own content by the metadata check, so a
|
|
200
|
+
// reject is the proposer's fault.
|
|
201
|
+
['consumption_moves_backwards']: true,
|
|
202
|
+
['bundle_over_block_cap']: true,
|
|
203
|
+
['checkpoint_over_msg_cap']: true,
|
|
204
|
+
// disabled: local-view disagreements, timeouts, and this node's own inability to check - never proposer misconduct.
|
|
205
|
+
['invalid_signature']: false,
|
|
206
|
+
['parent_block_not_found']: false,
|
|
207
|
+
// A parent found once but pruned mid-validation; the verdict may describe another chain, not proposer misconduct.
|
|
208
|
+
['parent_block_pruned_during_validation']: false,
|
|
209
|
+
// The local-view streaming reasons: a trailing archiver or an unfollowed reorg, including an insert-time
|
|
210
|
+
// consumption rewind reported as inbox_prefix_mismatch.
|
|
211
|
+
['inbox_prefix_unavailable']: false,
|
|
212
|
+
['inbox_prefix_mismatch']: false,
|
|
213
|
+
['block_number_already_exists']: false,
|
|
214
|
+
['txs_not_available']: false,
|
|
215
|
+
['initial_state_mismatch']: false,
|
|
216
|
+
['timeout']: false,
|
|
217
|
+
['block_proposal_beyond_checkpoint']: false,
|
|
218
|
+
// Equivocation has its own offense path (markProposalEquivocation), so it is not a slashable invalid-block reason.
|
|
219
|
+
['checkpoint_proposal_equivocation']: false,
|
|
220
|
+
['unknown_error']: false
|
|
221
|
+
};
|
|
189
222
|
/** Checkpoint-proposal validation failures that constitute a slashable invalid-checkpoint offense. */ export const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT = {
|
|
190
223
|
// enabled
|
|
191
224
|
['invalid_fee_asset_price_modifier']: true,
|
|
192
225
|
['checkpoint_header_mismatch']: true,
|
|
226
|
+
// An unprovable header: the checkpoint circuit derives lastArchiveRoot from the first block's lastArchive.
|
|
227
|
+
['last_archive_root_mismatch']: true,
|
|
193
228
|
// These late mismatches should normally be caught by earlier checks, but if reached after validating the local
|
|
194
229
|
// checkpoint inputs, the proposer-signed payload disagrees with deterministic recomputation.
|
|
195
230
|
['archive_mismatch']: true,
|
|
@@ -210,12 +245,21 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
210
245
|
['inbox_endpoint_mismatch']: false,
|
|
211
246
|
['invalid_signature']: false,
|
|
212
247
|
['last_block_not_found']: false,
|
|
248
|
+
// The local chain was pruned under the validation, so a slashable verdict may describe blocks of another chain.
|
|
249
|
+
['last_block_pruned_during_validation']: false,
|
|
213
250
|
['block_fetch_error']: false,
|
|
214
251
|
['world_state_not_synced']: false,
|
|
215
|
-
//
|
|
252
|
+
// World state forked off the chain of the local archiver blocks being rebuilt (e.g. a reorg racing the fork), not
|
|
253
|
+
// a proposer offense (mirrors the block path's initial_state_mismatch).
|
|
216
254
|
['initial_archive_mismatch']: false,
|
|
217
255
|
['checkpoint_already_published']: false
|
|
218
256
|
};
|
|
257
|
+
/** Whether a block-proposal validation result is a rejection for a slashable reason. */ function isSlashableBlockProposalResult(result) {
|
|
258
|
+
return !result.isValid && SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT[result.reason];
|
|
259
|
+
}
|
|
260
|
+
/** Whether a checkpoint-proposal validation result is a rejection for a slashable reason. */ function isSlashableCheckpointProposalResult(result) {
|
|
261
|
+
return !result.isValid && SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT[result.reason];
|
|
262
|
+
}
|
|
219
263
|
/**
|
|
220
264
|
* Handles block and checkpoint proposals for both validator and non-validator nodes. Also tracks which slots
|
|
221
265
|
* had a slashable invalid proposal or a proposal equivocation, exposing them via the
|
|
@@ -326,7 +370,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
326
370
|
...await this.observedProposal(proposal),
|
|
327
371
|
accepted: result.isValid && !escapeHatchOpen,
|
|
328
372
|
reason: result.isValid ? undefined : result.reason,
|
|
329
|
-
slashable:
|
|
373
|
+
slashable: isSlashableBlockProposalResult(result),
|
|
330
374
|
escapeHatchOpen
|
|
331
375
|
});
|
|
332
376
|
}
|
|
@@ -411,7 +455,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
411
455
|
// which intentionally disables invalid-block slashing then.
|
|
412
456
|
if (result.reason === 'checkpoint_proposal_equivocation') {
|
|
413
457
|
this.markProposalEquivocation(slotNumber);
|
|
414
|
-
} else if (
|
|
458
|
+
} else if (isSlashableBlockProposalResult(result) && !await this.epochCache.isEscapeHatchOpenAtSlot(slotNumber)) {
|
|
415
459
|
this.markInvalidProposalSlot(slotNumber);
|
|
416
460
|
}
|
|
417
461
|
this.log.warn(`Non-validator block proposal ${blockNumber} at slot ${slotNumber} failed processing with ${result.reason}`, {
|
|
@@ -482,7 +526,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
482
526
|
// Track invalid checkpoint proposals so offense observers (the attested-invalid-proposal watcher)
|
|
483
527
|
// work on non-validator nodes too. This handler runs for all nodes; validators also mark via the
|
|
484
528
|
// failure callback below (idempotent).
|
|
485
|
-
if (
|
|
529
|
+
if (isSlashableCheckpointProposalResult(result)) {
|
|
486
530
|
this.markInvalidProposalSlot(proposal.slotNumber);
|
|
487
531
|
this.markInvalidCheckpointProposal(proposal.slotNumber, proposal.getPayloadHash());
|
|
488
532
|
}
|
|
@@ -576,6 +620,34 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
576
620
|
reason: 'parent_block_not_found'
|
|
577
621
|
};
|
|
578
622
|
}
|
|
623
|
+
const result = await this.validateBlockProposalOnParent(proposal, parentBlock, proposalSender, shouldReexecute, proposalInfo);
|
|
624
|
+
// A genesis parent cannot be pruned.
|
|
625
|
+
return parentBlock !== 'genesis' && isSlashableBlockProposalResult(result) ? await this.checkParentStillLocal(proposal, result, proposalInfo) : result;
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Demotes a block-proposal rejection when the proposal's parent is no longer found by archive. The parent is
|
|
629
|
+
* fetched once, but later checks read the local chain by number, and the archiver can prune the parent and insert
|
|
630
|
+
* other blocks at the same numbers while they run: under pipelining, when a checkpoint lands on L1 differing from the
|
|
631
|
+
* version this node gossiped. A prune removes the pruned blocks' archive entries, and an archive root commits to the
|
|
632
|
+
* block's whole history, so a parent still found by archive means the chain below it is still its own ancestry. A
|
|
633
|
+
* parent that is gone means the verdict may rest on another chain, which says nothing about the proposer.
|
|
634
|
+
*/ async checkParentStillLocal(proposal, result, proposalInfo) {
|
|
635
|
+
if (await this.getParentBlock(proposal, {
|
|
636
|
+
awaitSync: false
|
|
637
|
+
}) !== undefined) {
|
|
638
|
+
return result;
|
|
639
|
+
}
|
|
640
|
+
this.log.warn(`Parent block was pruned while validating the proposal, not attributing the rejection to its proposer`, {
|
|
641
|
+
...proposalInfo,
|
|
642
|
+
originalReason: result.reason
|
|
643
|
+
});
|
|
644
|
+
return {
|
|
645
|
+
...result,
|
|
646
|
+
reason: 'parent_block_pruned_during_validation'
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
/** Validates a block proposal against the parent block it builds on, as fetched by the parent archive. */ async validateBlockProposalOnParent(proposal, parentBlock, proposalSender, shouldReexecute, proposalInfo) {
|
|
650
|
+
const slotNumber = proposal.slotNumber;
|
|
579
651
|
// Check that the parent block's slot is not greater than the proposal's slot.
|
|
580
652
|
if (parentBlock !== 'genesis' && parentBlock.header.getSlot() > slotNumber) {
|
|
581
653
|
this.log.warn(`Parent block slot is greater than proposal slot, skipping processing`, {
|
|
@@ -837,7 +909,10 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
837
909
|
throw err;
|
|
838
910
|
}
|
|
839
911
|
}
|
|
840
|
-
|
|
912
|
+
/**
|
|
913
|
+
* Looks up the block a proposal builds on by its parent archive. Unless `awaitSync` is false, a parent that is not
|
|
914
|
+
* local yet is waited for through forced archiver syncs until the slot's attestation deadline.
|
|
915
|
+
*/ async getParentBlock(proposal, { awaitSync = true } = {}) {
|
|
841
916
|
const parentArchive = proposal.blockHeader.lastArchive.root;
|
|
842
917
|
const { genesisArchiveRoot } = await this.blockSource.getGenesisValues();
|
|
843
918
|
if (parentArchive.equals(genesisArchiveRoot)) {
|
|
@@ -850,7 +925,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
850
925
|
if (parentBlock !== undefined) {
|
|
851
926
|
return parentBlock;
|
|
852
927
|
}
|
|
853
|
-
if (this.getReexecutionDeadline(proposal.slotNumber).getTime() - this.dateProvider.now() <= 0) {
|
|
928
|
+
if (!awaitSync || this.getReexecutionDeadline(proposal.slotNumber).getTime() - this.dateProvider.now() <= 0) {
|
|
854
929
|
return undefined;
|
|
855
930
|
}
|
|
856
931
|
const synced = await this.awaitLocalSync(proposal.slotNumber, 'force archiver sync', ()=>this.blockSource.getBlockData({
|
|
@@ -1106,10 +1181,19 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1106
1181
|
* never saw. The retry re-runs the whole read (metadata plus range) on each attempt rather than reusing a range
|
|
1107
1182
|
* from an earlier view, because the parent and checkpoint-start counts it derives can move while a reorg is being
|
|
1108
1183
|
* followed.
|
|
1184
|
+
*
|
|
1185
|
+
* Every attempt's unexpected error is kept, not only the first one's. A read that starts as ordinary sync lag and
|
|
1186
|
+
* later hits a store fault or a broken provider is the case worth reporting, and reporting only the first attempt
|
|
1187
|
+
* discards exactly that: the diagnosis a node whose retries ran out has to offer is its latest failure.
|
|
1109
1188
|
*/ async awaitStreamingBlockBundle(proposal, blockNumber, parentBlock, proposalInfo) {
|
|
1189
|
+
let latestUnexpectedError;
|
|
1110
1190
|
const readBundle = async ()=>{
|
|
1111
1191
|
const metadata = await this.checkStreamingBlockMetadata(proposal, blockNumber, parentBlock);
|
|
1112
|
-
|
|
1192
|
+
const result = metadata.accepted ? await readStreamingBlockBundle(this.l1ToL2MessageSource, metadata) : metadata;
|
|
1193
|
+
if (!result.accepted && result.error !== undefined) {
|
|
1194
|
+
latestUnexpectedError = result.error;
|
|
1195
|
+
}
|
|
1196
|
+
return result;
|
|
1113
1197
|
};
|
|
1114
1198
|
const first = await readBundle();
|
|
1115
1199
|
if (first.accepted || !isRetryableStreamingBlockCheckReason(first.reason)) {
|
|
@@ -1130,12 +1214,17 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1130
1214
|
reason: 'inbox_prefix_sync_timeout',
|
|
1131
1215
|
firstReason: first.reason,
|
|
1132
1216
|
// Set only when the message source failed for a reason the checks did not anticipate, rather than sync lag.
|
|
1133
|
-
|
|
1217
|
+
// The latest such failure, since a later store fault says more about why this node gave up than the first
|
|
1218
|
+
// attempt's lag does.
|
|
1219
|
+
error: latestUnexpectedError,
|
|
1134
1220
|
slot: slotNumber,
|
|
1135
1221
|
waitedMs: timer.ms(),
|
|
1136
1222
|
...proposalInfo
|
|
1137
1223
|
});
|
|
1138
|
-
return
|
|
1224
|
+
return {
|
|
1225
|
+
...first,
|
|
1226
|
+
error: latestUnexpectedError
|
|
1227
|
+
};
|
|
1139
1228
|
}
|
|
1140
1229
|
return resolved;
|
|
1141
1230
|
}
|
|
@@ -1293,15 +1382,18 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1293
1382
|
}
|
|
1294
1383
|
/**
|
|
1295
1384
|
* Reads the blocks of a slot as one snapshot for checkpoint validation, locating the checkpoint's last block by the
|
|
1296
|
-
* signed archive. Undefined when the archive is not among the slot's blocks
|
|
1297
|
-
* other,
|
|
1385
|
+
* signed archive. Undefined when the archive is not among the slot's blocks, the blocks do not chain onto each
|
|
1386
|
+
* other, or they are not one checkpoint's blocks from its first one on. All of these are local state in motion:
|
|
1387
|
+
* the archiver replacing or pruning blocks while they were read, or skipping a block whose body it cannot load.
|
|
1388
|
+
* Checkpoint validation relies on `blocks[0]` being the checkpoint's first block to attribute a wrong
|
|
1389
|
+
* lastArchiveRoot to the proposer.
|
|
1298
1390
|
*/ async readCheckpointBlocksSnapshot(slot, archive) {
|
|
1299
1391
|
const blocks = await this.blockSource.getBlocksForSlot(slot);
|
|
1300
1392
|
const lastBlockIndex = blocks.findIndex((block)=>block.archive.root.equals(archive));
|
|
1301
1393
|
if (lastBlockIndex === -1) {
|
|
1302
1394
|
return undefined;
|
|
1303
1395
|
}
|
|
1304
|
-
const contiguous = blocks.every((block, i)=>i === 0 || block.number === blocks[i - 1].number + 1 && block.header.lastArchive.root.equals(blocks[i - 1].archive.root));
|
|
1396
|
+
const contiguous = blocks.every((block, i)=>block.checkpointNumber === blocks[0].checkpointNumber && block.indexWithinCheckpoint === i && (i === 0 || block.number === blocks[i - 1].number + 1 && block.header.lastArchive.root.equals(blocks[i - 1].archive.root)));
|
|
1305
1397
|
return contiguous ? {
|
|
1306
1398
|
blocks,
|
|
1307
1399
|
lastBlockIndex
|
|
@@ -1492,7 +1584,8 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1492
1584
|
reason: 'invalid_fee_asset_price_modifier'
|
|
1493
1585
|
};
|
|
1494
1586
|
} else {
|
|
1495
|
-
|
|
1587
|
+
const validation = await this.validateCheckpointProposal(proposal, proposalInfo);
|
|
1588
|
+
result = isSlashableCheckpointProposalResult(validation) ? await this.checkLastBlockStillLocal(proposal, validation, proposalInfo) : validation;
|
|
1496
1589
|
}
|
|
1497
1590
|
this.lastCheckpointValidationResult = {
|
|
1498
1591
|
payloadHash,
|
|
@@ -1531,8 +1624,13 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1531
1624
|
// slot is a different question, and still records. A recorded `invalid` is protected for the slot outright:
|
|
1532
1625
|
// the tracker keys its slot entry by slot alone, so an equivocating proposer whose second proposal this node
|
|
1533
1626
|
// could not check would otherwise erase the first one's determination.
|
|
1627
|
+
//
|
|
1628
|
+
// The protected `valid` is matched by slot and archive as well as by checkpoint number, because the second look
|
|
1629
|
+
// can fail before the blocks are loaded and then carries no checkpoint number at all: pruning the block the
|
|
1630
|
+
// cached verdict rested on makes revalidation report `last_block_not_found`, which by checkpoint number alone
|
|
1631
|
+
// is indistinguishable from a first evaluation and would overwrite the verdict this node reached.
|
|
1534
1632
|
const outcome = result.isValid ? 'valid' : CHECKPOINT_VALIDATION_REASON_TO_OUTCOME[result.reason];
|
|
1535
|
-
const wouldForgetVerdict = outcome === 'unvalidated' && (this.reexecutionTracker.getOutcomeForSlot(slot) === 'invalid' || result.checkpointNumber !== undefined && this.reexecutionTracker.hasReexecuted(result.checkpointNumber, proposal.archive));
|
|
1633
|
+
const wouldForgetVerdict = outcome === 'unvalidated' && (this.reexecutionTracker.getOutcomeForSlot(slot) === 'invalid' || this.reexecutionTracker.hasValidOutcomeForSlot(slot, proposal.archive) || result.checkpointNumber !== undefined && this.reexecutionTracker.hasReexecuted(result.checkpointNumber, proposal.archive));
|
|
1536
1634
|
if (outcome !== undefined && !wouldForgetVerdict) {
|
|
1537
1635
|
this.reexecutionTracker.recordOutcome(slot, proposal.archive, outcome, result.checkpointNumber);
|
|
1538
1636
|
}
|
|
@@ -1630,10 +1728,42 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1630
1728
|
};
|
|
1631
1729
|
}
|
|
1632
1730
|
}
|
|
1633
|
-
/**
|
|
1731
|
+
/**
|
|
1732
|
+
* Demotes a checkpoint rejection when the checkpoint's last block is no longer found by the signed archive.
|
|
1733
|
+
* Validation reads the slot's blocks once, but reads the block before the checkpoint and the parent checkpoint by
|
|
1734
|
+
* number afterwards, and the archiver can prune those and insert other blocks at the same numbers while the
|
|
1735
|
+
* checkpoint is rebuilt. A prune removes the pruned blocks' archive entries, and the last block's archive commits to
|
|
1736
|
+
* its whole history, so a last block still found by archive means the chain below it is still its own ancestry.
|
|
1737
|
+
*/ async checkLastBlockStillLocal(proposal, result, proposalInfo) {
|
|
1738
|
+
if (await this.blockSource.getBlockData({
|
|
1739
|
+
archive: proposal.archive
|
|
1740
|
+
}) !== undefined) {
|
|
1741
|
+
return result;
|
|
1742
|
+
}
|
|
1743
|
+
this.log.warn(`Checkpoint's last block was pruned while validating the proposal, not attributing the rejection`, {
|
|
1744
|
+
...proposalInfo,
|
|
1745
|
+
originalReason: result.reason
|
|
1746
|
+
});
|
|
1747
|
+
return {
|
|
1748
|
+
...result,
|
|
1749
|
+
reason: 'last_block_pruned_during_validation'
|
|
1750
|
+
};
|
|
1751
|
+
}
|
|
1752
|
+
/**
|
|
1753
|
+
* The endpoint gate's own ceiling, narrowed by a slot whose attestation window is nearly spent.
|
|
1754
|
+
*
|
|
1755
|
+
* The floor survives past the attestation deadline on purpose, and is bounded at
|
|
1756
|
+
* {@link INBOX_ENDPOINT_CHECK_MIN_WINDOW_MS} for it: a late node still wants the content verdict for telemetry,
|
|
1757
|
+
* and reaching one costs one bounded local L1 read. What the floor must not buy is a signature, which is why
|
|
1758
|
+
* {@link getAttestationDeadline} is re-read at the signing boundary rather than here — a window is not a
|
|
1759
|
+
* permission to attest.
|
|
1760
|
+
*/ getInboxEndpointWindowMs(slot) {
|
|
1634
1761
|
const remainingMs = this.getReexecutionDeadline(slot).getTime() - this.dateProvider.now();
|
|
1635
1762
|
return Math.min(INBOX_ENDPOINT_CHECK_WINDOW_MS, Math.max(INBOX_ENDPOINT_CHECK_MIN_WINDOW_MS, remainingMs));
|
|
1636
1763
|
}
|
|
1764
|
+
/** The consensus attestation deadline for a slot: the last moment an attestation for it may be signed. */ getAttestationDeadline(slot) {
|
|
1765
|
+
return this.getReexecutionDeadline(slot);
|
|
1766
|
+
}
|
|
1637
1767
|
/**
|
|
1638
1768
|
* Validates a checkpoint proposal by building the full checkpoint and comparing it with the proposal.
|
|
1639
1769
|
* @returns Validation result with isValid flag and reason if invalid.
|
|
@@ -1654,9 +1784,10 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1654
1784
|
// runs on: the block carrying the signed archive is the checkpoint's last block, and the slot's blocks before it
|
|
1655
1785
|
// are the checkpoint's. Reading the last block by archive and the slot's blocks separately would let a local prune
|
|
1656
1786
|
// between the two reads look like a proposer offense; a slot read without the signed archive, or one that is not
|
|
1657
|
-
// a contiguous chain, is local state in motion and is retried.
|
|
1658
|
-
// absolute date so the remaining budget is derived from the date
|
|
1659
|
-
// out after a single attempt instead of looping (the
|
|
1787
|
+
// a contiguous chain of one checkpoint's blocks starting at its first, is local state in motion and is retried.
|
|
1788
|
+
// The deadline is passed to retryUntil as an absolute date so the remaining budget is derived from the date
|
|
1789
|
+
// provider; a deadline already in the past times out after a single attempt instead of looping (the
|
|
1790
|
+
// immediate-timeout semantics of the deadline overload).
|
|
1660
1791
|
let snapshot;
|
|
1661
1792
|
try {
|
|
1662
1793
|
snapshot = await retryUntil(async ()=>{
|
|
@@ -1743,6 +1874,21 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1743
1874
|
const firstBlock = blocks[0];
|
|
1744
1875
|
const constants = this.extractCheckpointConstants(firstBlock);
|
|
1745
1876
|
const checkpointNumber = firstBlock.checkpointNumber;
|
|
1877
|
+
// The rebuild derives the header's lastArchiveRoot from the first block's lastArchive (as does the checkpoint
|
|
1878
|
+
// circuit), so any other claimed value is an unprovable header; reject it before paying for the rebuild.
|
|
1879
|
+
const expectedLastArchiveRoot = firstBlock.header.lastArchive.root;
|
|
1880
|
+
if (!proposal.checkpointHeader.lastArchiveRoot.equals(expectedLastArchiveRoot)) {
|
|
1881
|
+
this.log.warn(`Checkpoint proposal's last archive root does not match its first block`, {
|
|
1882
|
+
...proposalInfo,
|
|
1883
|
+
expectedLastArchiveRoot: expectedLastArchiveRoot.toString(),
|
|
1884
|
+
proposalLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString()
|
|
1885
|
+
});
|
|
1886
|
+
return {
|
|
1887
|
+
isValid: false,
|
|
1888
|
+
reason: 'last_archive_root_mismatch',
|
|
1889
|
+
checkpointNumber
|
|
1890
|
+
};
|
|
1891
|
+
}
|
|
1746
1892
|
// The checkpoint's Inbox consumption starts at the leaf count of the block before its first block. Without that
|
|
1747
1893
|
// block the consumed bundle cannot be derived; an empty bundle would make a valid proposal fail its rolling-hash
|
|
1748
1894
|
// recomputation and be classified as a proposer offense, so a missing parent is a local fetch failure instead.
|
|
@@ -1819,17 +1965,15 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
|
|
|
1819
1965
|
};
|
|
1820
1966
|
}
|
|
1821
1967
|
const fork = _ts_add_disposable_resource(env, forkResult, true);
|
|
1822
|
-
//
|
|
1823
|
-
//
|
|
1824
|
-
//
|
|
1825
|
-
// the block-proposal re-execution check and fails fast with a clean, non-slashable result instead of a
|
|
1826
|
-
// confusing downstream mismatch.
|
|
1968
|
+
// World state must be on the same chain as the archiver blocks being rebuilt; otherwise the rebuild would disagree
|
|
1969
|
+
// with an honest proposal. This is a local race (e.g. a reorg between the hash-pinned sync and the fork), never a
|
|
1970
|
+
// proposer offense. It mirrors the block-proposal re-execution check.
|
|
1827
1971
|
const forkArchiveRoot = new Fr((await fork.getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
1828
|
-
if (!forkArchiveRoot.equals(
|
|
1829
|
-
this.log.warn(`Fork archive root does not match checkpoint
|
|
1972
|
+
if (!forkArchiveRoot.equals(expectedLastArchiveRoot)) {
|
|
1973
|
+
this.log.warn(`Fork archive root does not match the checkpoint's first block last archive`, {
|
|
1830
1974
|
...proposalInfo,
|
|
1831
1975
|
forkArchiveRoot: forkArchiveRoot.toString(),
|
|
1832
|
-
expectedLastArchiveRoot:
|
|
1976
|
+
expectedLastArchiveRoot: expectedLastArchiveRoot.toString()
|
|
1833
1977
|
});
|
|
1834
1978
|
return {
|
|
1835
1979
|
isValid: false,
|
|
@@ -128,4 +128,4 @@ export declare function readStreamingBlockBundle(messageSource: Pick<StreamingIn
|
|
|
128
128
|
* {@link readStreamingBlockBundle} for callers that have no use for running the two phases separately.
|
|
129
129
|
*/
|
|
130
130
|
export declare function checkStreamingBlockProposal(input: StreamingBlockCheckInput): Promise<StreamingBlockCheckResult>;
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nX2luYm94X2NoZWNrcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbWluZ19pbmJveF9jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxNQUFNLHlCQUF5QixHQUNqQywwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDZCQUE2QixHQUM3Qix1QkFBdUIsR0FDdkIseUJBQXlCLENBQUM7QUFFOUIsOEdBQThHO0FBQzlHLGVBQU8sTUFBTSx1Q0FBdUMsRUFBRSxTQUFTLHlCQUF5QixFQUd2RixDQUFDO0FBRUYseUdBQXlHO0FBQ3pHLHdCQUFnQixvQ0FBb0MsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLEdBQUcsT0FBTyxDQUUvRjtBQUVELHNGQUFzRjtBQUN0RixNQUFNLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDLENBQUM7QUFFcEgsK0RBQStEO0FBQy9ELE1BQU0sTUFBTSxnQ0FBZ0MsR0FBRztJQUM3QyxpRkFBaUY7SUFDakYsYUFBYSxFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZFOzs7T0FHRztJQUNILGNBQWMsRUFBRSxxQkFBcUIsQ0FBQztJQUN0QyxnSEFBZ0g7SUFDaEgsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLHFIQUFxSDtJQUNySCxtQkFBbUIsRUFBRSxNQUFNLENBQUM7SUFDNUIsMEdBQTBHO0lBQzFHLDRCQUE0QixFQUFFLE1BQU0sQ0FBQztJQUNyQyx5RkFBeUY7SUFDekYsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQiwyR0FBMkc7SUFDM0csZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0NBQzFCLENBQUM7QUFFRix1R0FBdUc7QUFDdkcsTUFBTSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxlQUFlLENBQUMsR0FBRztJQUMvRixhQUFhLEVBQUUsMkJBQTJCLENBQUM7Q0FDNUMsQ0FBQztBQUVGLGlHQUFpRztBQUNqRyxNQUFNLE1BQU0sd0JBQXdCLEdBQUc7SUFDckMsOEVBQThFO0lBQzlFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQztJQUM1QixvSEFBb0g7SUFDcEgsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLDZIQUE2SDtJQUM3SCxjQUFjLEVBQUUscUJBQXFCLENBQUM7Q0FDdkMsQ0FBQztBQUVGLCtEQUErRDtBQUMvRCxNQUFNLE1BQU0saUNBQWlDLEdBQ3pDLENBQUM7SUFDQyxvR0FBb0c7SUFDcEcsUUFBUSxFQUFFLElBQUksQ0FBQztDQUNoQixHQUFHLHdCQUF3QixDQUFDLEdBQzdCO0lBQ0UsNEZBQTRGO0lBQzVGLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDaEIsTUFBTSxFQUFFLHlCQUF5QixDQUFDO0NBQ25DLENBQUM7QUFFTixpRUFBaUU7QUFDakUsTUFBTSxNQUFNLHlCQUF5QixHQUNqQztJQUNFLG9HQUFvRztJQUNwRyxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ2YsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2QsR0FDRDtJQUNFLDRGQUE0RjtJQUM1RixRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQ2hCLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQztJQUNsQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEIsQ0FBQztBQUVOOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsd0JBQXNCLG1DQUFtQyxDQUN2RCxLQUFLLEVBQUUsZ0NBQWdDLEdBQ3RDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQXNDNUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsd0JBQXNCLHdCQUF3QixDQUM1QyxhQUFhLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDLEVBQ3pFLEtBQUssRUFBRSx3QkFBd0IsR0FDOUIsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBbUJwQztBQThCRDs7OztHQUlHO0FBQ0gsd0JBQXNCLDJCQUEyQixDQUFDLEtBQUssRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FNckgifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming_inbox_checks.d.ts","sourceRoot":"","sources":["../src/streaming_inbox_checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,uBAAuB,GACvB,6BAA6B,GAC7B,uBAAuB,GACvB,yBAAyB,CAAC;AAE9B,8GAA8G;AAC9G,eAAO,MAAM,uCAAuC,EAAE,SAAS,yBAAyB,EAGvF,CAAC;AAEF,yGAAyG;AACzG,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAE/F;AAED,sFAAsF;AACtF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;AAEpH,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,iFAAiF;IACjF,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IACvE;;;OAGG;IACH,cAAc,EAAE,qBAAqB,CAAC;IACtC,gHAAgH;IAChH,gBAAgB,EAAE,MAAM,CAAC;IACzB,qHAAqH;IACrH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0GAA0G;IAC1G,4BAA4B,EAAE,MAAM,CAAC;IACrC,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,2GAA2G;IAC3G,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,GAAG;IAC/F,aAAa,EAAE,2BAA2B,CAAC;CAC5C,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,wBAAwB,GAAG;IACrC,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oHAAoH;IACpH,gBAAgB,EAAE,MAAM,CAAC;IACzB,6HAA6H;IAC7H,cAAc,EAAE,qBAAqB,CAAC;CACvC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,iCAAiC,GACzC,CAAC;IACC,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,wBAAwB,CAAC,GAC7B;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;CACnC,CAAC;AAEN,iEAAiE;AACjE,MAAM,MAAM,yBAAyB,GACjC;IACE,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,EAAE,EAAE,CAAC;CACd,GACD;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAsC5C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,EACzE,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAmBpC;
|
|
1
|
+
{"version":3,"file":"streaming_inbox_checks.d.ts","sourceRoot":"","sources":["../src/streaming_inbox_checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,uBAAuB,GACvB,6BAA6B,GAC7B,uBAAuB,GACvB,yBAAyB,CAAC;AAE9B,8GAA8G;AAC9G,eAAO,MAAM,uCAAuC,EAAE,SAAS,yBAAyB,EAGvF,CAAC;AAEF,yGAAyG;AACzG,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAE/F;AAED,sFAAsF;AACtF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;AAEpH,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,iFAAiF;IACjF,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IACvE;;;OAGG;IACH,cAAc,EAAE,qBAAqB,CAAC;IACtC,gHAAgH;IAChH,gBAAgB,EAAE,MAAM,CAAC;IACzB,qHAAqH;IACrH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0GAA0G;IAC1G,4BAA4B,EAAE,MAAM,CAAC;IACrC,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,2GAA2G;IAC3G,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,GAAG;IAC/F,aAAa,EAAE,2BAA2B,CAAC;CAC5C,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,wBAAwB,GAAG;IACrC,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oHAAoH;IACpH,gBAAgB,EAAE,MAAM,CAAC;IACzB,6HAA6H;IAC7H,cAAc,EAAE,qBAAqB,CAAC;CACvC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,iCAAiC,GACzC,CAAC;IACC,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,wBAAwB,CAAC,GAC7B;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;CACnC,CAAC;AAEN,iEAAiE;AACjE,MAAM,MAAM,yBAAyB,GACjC;IACE,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,EAAE,EAAE,CAAC;CACd,GACD;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAsC5C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,EACzE,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAmBpC;AA8BD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAMrH"}
|
|
@@ -122,18 +122,24 @@
|
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
/**
|
|
125
|
-
*
|
|
126
|
-
* past what this node has synced, or its bounds are not a valid range at all. Matched on the message text rather
|
|
127
|
-
* on the error's class, since a JSON-RPC hop between the validator and its message source leaves the class
|
|
128
|
-
* while preserving the message.
|
|
125
|
+
* The complete message forms of an ordinary local-view shortfall from the archiver's range read: the range reaches
|
|
126
|
+
* past what this node has synced, or its bounds are not a valid range at all. Matched on the message text rather
|
|
127
|
+
* than on the error's class, since a JSON-RPC hop between the validator and its message source leaves the class
|
|
128
|
+
* behind while preserving the message.
|
|
129
|
+
*
|
|
130
|
+
* Anchored to the whole message on purpose. A substring test also swallows anything that quotes one of these — a
|
|
131
|
+
* store or provider fault reported as `database unavailable: Inbox message range [3, 7) is not fully synced` is a
|
|
132
|
+
* failure the checks did not anticipate, and reporting it as ordinary sync lag loses the only diagnosis a validator
|
|
133
|
+
* that runs out of retries can offer. Matching is about which failures are *reported*, not which are accepted:
|
|
134
|
+
* every range-read failure stays non-punitive either way.
|
|
129
135
|
*/ const EXPECTED_RANGE_READ_FAILURES = [
|
|
130
|
-
|
|
131
|
-
|
|
136
|
+
/^Inbox message range \[-?\d+, -?\d+\) is not fully synced(: [\s\S]*)?$/,
|
|
137
|
+
/^Invalid Inbox leaf count range \[-?\d+, -?\d+\)$/
|
|
132
138
|
];
|
|
133
139
|
/** Upper bound on the error text carried onto a result, so a verbose provider error cannot blow up a log record. */ const MAX_REPORTED_ERROR_LENGTH = 200;
|
|
134
140
|
/** Bounded text of a range-read failure the checks did not anticipate, or undefined for ordinary sync lag. */ function unexpectedRangeReadError(err) {
|
|
135
141
|
const message = err instanceof Error ? err.message : String(err);
|
|
136
|
-
return EXPECTED_RANGE_READ_FAILURES.some((
|
|
142
|
+
return EXPECTED_RANGE_READ_FAILURES.some((form)=>form.test(message)) ? undefined : message.slice(0, MAX_REPORTED_ERROR_LENGTH);
|
|
137
143
|
}
|
|
138
144
|
/**
|
|
139
145
|
* Runs the per-block acceptance checks a validator applies to a streaming block proposal, and derives the
|