@aztec/sequencer-client 0.0.1-commit.e0f15ab9b → 0.0.1-commit.e304674f1
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/client/sequencer-client.d.ts +1 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +0 -4
- package/dest/global_variable_builder/global_builder.d.ts +3 -3
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +7 -4
- package/dest/publisher/sequencer-publisher-factory.d.ts +1 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +0 -1
- package/dest/publisher/sequencer-publisher.d.ts +52 -31
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +106 -87
- package/dest/sequencer/checkpoint_proposal_job.d.ts +31 -10
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +179 -108
- package/dest/sequencer/checkpoint_voter.d.ts +1 -2
- package/dest/sequencer/checkpoint_voter.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_voter.js +2 -5
- package/dest/sequencer/sequencer.d.ts +14 -4
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +67 -18
- package/dest/sequencer/timetable.d.ts +4 -1
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +15 -5
- package/package.json +27 -27
- package/src/client/sequencer-client.ts +0 -7
- package/src/global_variable_builder/global_builder.ts +15 -3
- package/src/publisher/sequencer-publisher-factory.ts +0 -3
- package/src/publisher/sequencer-publisher.ts +174 -124
- package/src/sequencer/README.md +81 -12
- package/src/sequencer/checkpoint_proposal_job.ts +215 -117
- package/src/sequencer/checkpoint_voter.ts +1 -12
- package/src/sequencer/sequencer.ts +97 -20
- package/src/sequencer/timetable.ts +19 -8
|
@@ -386,12 +386,13 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
386
386
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
387
387
|
import { createLogger } from '@aztec/foundation/log';
|
|
388
388
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
389
|
+
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
389
390
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
390
391
|
import { Timer } from '@aztec/foundation/timer';
|
|
391
392
|
import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
392
393
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
393
394
|
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
394
|
-
import { getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
395
|
+
import { getLastL1SlotTimestampForL2Slot, getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
395
396
|
import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
396
397
|
import { encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
|
|
397
398
|
import { createL1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
@@ -401,9 +402,6 @@ export const Actions = [
|
|
|
401
402
|
'invalidate-by-insufficient-attestations',
|
|
402
403
|
'propose',
|
|
403
404
|
'governance-signal',
|
|
404
|
-
'empire-slashing-signal',
|
|
405
|
-
'create-empire-payload',
|
|
406
|
-
'execute-empire-payload',
|
|
407
405
|
'vote-offenses',
|
|
408
406
|
'execute-slash'
|
|
409
407
|
];
|
|
@@ -443,12 +441,13 @@ export class SequencerPublisher {
|
|
|
443
441
|
log;
|
|
444
442
|
ethereumSlotDuration;
|
|
445
443
|
aztecSlotDuration;
|
|
446
|
-
dateProvider;
|
|
444
|
+
/** Date provider for wall-clock time. */ dateProvider;
|
|
447
445
|
blobClient;
|
|
448
446
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
449
447
|
/** Optional callback to obtain a replacement publisher when the current one fails to send. */ getNextPublisher;
|
|
450
448
|
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
451
449
|
/** Fee asset price oracle for computing price modifiers from Uniswap V4 */ feeAssetPriceOracle;
|
|
450
|
+
/** Interruptible sleep used by sendRequestsAt to wait until a target timestamp. */ interruptibleSleep;
|
|
452
451
|
// A CALL to a cold address is 2700 gas
|
|
453
452
|
static MULTICALL_OVERHEAD_GAS_GUESS = 5000n;
|
|
454
453
|
// Gas report for VotingWithSigTest shows a max gas of 100k, but we've seen it cost 700k+ in testnet
|
|
@@ -457,7 +456,6 @@ export class SequencerPublisher {
|
|
|
457
456
|
rollupContract;
|
|
458
457
|
govProposerContract;
|
|
459
458
|
slashingProposerContract;
|
|
460
|
-
slashFactoryContract;
|
|
461
459
|
tracer;
|
|
462
460
|
requests;
|
|
463
461
|
constructor(config, deps){
|
|
@@ -468,6 +466,7 @@ export class SequencerPublisher {
|
|
|
468
466
|
this.lastActions = {};
|
|
469
467
|
this.isPayloadEmptyCache = new Map();
|
|
470
468
|
this.payloadProposedCache = new Set();
|
|
469
|
+
this.interruptibleSleep = new InterruptibleSleep();
|
|
471
470
|
this.requests = [];
|
|
472
471
|
this.log = deps.log ?? createLogger('sequencer:publisher');
|
|
473
472
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
@@ -476,6 +475,7 @@ export class SequencerPublisher {
|
|
|
476
475
|
this.epochCache = deps.epochCache;
|
|
477
476
|
this.lastActions = deps.lastActions;
|
|
478
477
|
this.blobClient = deps.blobClient;
|
|
478
|
+
this.dateProvider = deps.dateProvider;
|
|
479
479
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
480
480
|
this.metrics = deps.metrics ?? new SequencerPublisherMetrics(telemetry, 'SequencerPublisher');
|
|
481
481
|
this.tracer = telemetry.getTracer('SequencerPublisher');
|
|
@@ -489,7 +489,6 @@ export class SequencerPublisher {
|
|
|
489
489
|
const newSlashingProposer = await this.rollupContract.getSlashingProposer();
|
|
490
490
|
this.slashingProposerContract = newSlashingProposer;
|
|
491
491
|
});
|
|
492
|
-
this.slashFactoryContract = deps.slashFactoryContract;
|
|
493
492
|
// Initialize L1 fee analyzer for fisherman mode
|
|
494
493
|
if (config.fishermanMode) {
|
|
495
494
|
this.l1FeeAnalyzer = new L1FeeAnalyzer(this.l1TxUtils.client, deps.dateProvider, createLogger('sequencer:publisher:fee-analyzer'));
|
|
@@ -740,6 +739,41 @@ export class SequencerPublisher {
|
|
|
740
739
|
}
|
|
741
740
|
}
|
|
742
741
|
}
|
|
742
|
+
/*
|
|
743
|
+
* Schedules sending all enqueued requests at (or after) the given timestamp.
|
|
744
|
+
* Uses InterruptibleSleep so it can be cancelled via interrupt().
|
|
745
|
+
* Returns the promise for the L1 response (caller should NOT await this in the work loop).
|
|
746
|
+
*/ async sendRequestsAt(submitAfter) {
|
|
747
|
+
const ms = submitAfter.getTime() - this.dateProvider.now();
|
|
748
|
+
if (ms > 0) {
|
|
749
|
+
this.log.debug(`Sleeping ${ms}ms before sending requests`, {
|
|
750
|
+
submitAfter
|
|
751
|
+
});
|
|
752
|
+
await this.interruptibleSleep.sleep(ms);
|
|
753
|
+
}
|
|
754
|
+
if (this.interrupted) {
|
|
755
|
+
return undefined;
|
|
756
|
+
}
|
|
757
|
+
// Re-validate enqueued requests after the sleep (state may have changed, e.g. prune or L1 reorg)
|
|
758
|
+
const validRequests = [];
|
|
759
|
+
for (const request of this.requests){
|
|
760
|
+
if (!request.preCheck) {
|
|
761
|
+
validRequests.push(request);
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
try {
|
|
765
|
+
await request.preCheck();
|
|
766
|
+
validRequests.push(request);
|
|
767
|
+
} catch (err) {
|
|
768
|
+
this.log.warn(`Pre-send validation failed for ${request.action}, discarding request`, err);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
this.requests = validRequests;
|
|
772
|
+
if (this.requests.length === 0) {
|
|
773
|
+
return undefined;
|
|
774
|
+
}
|
|
775
|
+
return this.sendRequests();
|
|
776
|
+
}
|
|
743
777
|
callbackBundledTransactions(requests, result, txContext) {
|
|
744
778
|
const actionsListStr = requests.map((r)=>r.action).join(', ');
|
|
745
779
|
if (result instanceof FormattedViemError) {
|
|
@@ -845,7 +879,8 @@ export class SequencerPublisher {
|
|
|
845
879
|
const slotOffset = pipelined ? this.aztecSlotDuration : 0n;
|
|
846
880
|
const nextL1SlotTs = this.getNextL1SlotTimestamp() + slotOffset;
|
|
847
881
|
return this.rollupContract.canProposeAt(tipArchive.toBuffer(), msgSender.toString(), nextL1SlotTs, {
|
|
848
|
-
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber
|
|
882
|
+
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber,
|
|
883
|
+
forceArchive: opts.forceArchive
|
|
849
884
|
}).catch((err)=>{
|
|
850
885
|
if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
|
|
851
886
|
this.log.warn(`Failed canProposeAtTime check with ${ignoredErrors.find((e)=>err.message.includes(e))}`, {
|
|
@@ -876,7 +911,7 @@ export class SequencerPublisher {
|
|
|
876
911
|
header.blobsHash.toString(),
|
|
877
912
|
flags
|
|
878
913
|
];
|
|
879
|
-
const ts = this.
|
|
914
|
+
const ts = this.getSimulationTimestamp(header.slotNumber);
|
|
880
915
|
const stateOverrides = await this.rollupContract.makePendingCheckpointNumberOverride(opts?.forcePendingCheckpointNumber);
|
|
881
916
|
let balance = 0n;
|
|
882
917
|
if (this.config.fishermanMode) {
|
|
@@ -899,7 +934,7 @@ export class SequencerPublisher {
|
|
|
899
934
|
}),
|
|
900
935
|
from: MULTI_CALL_3_ADDRESS
|
|
901
936
|
}, {
|
|
902
|
-
time: ts
|
|
937
|
+
time: ts
|
|
903
938
|
}, stateOverrides);
|
|
904
939
|
this.log.debug(`Simulated validateHeader`);
|
|
905
940
|
}
|
|
@@ -945,6 +980,7 @@ export class SequencerPublisher {
|
|
|
945
980
|
gasUsed,
|
|
946
981
|
checkpointNumber,
|
|
947
982
|
forcePendingCheckpointNumber: CheckpointNumber(checkpointNumber - 1),
|
|
983
|
+
lastArchive: validationResult.checkpoint.lastArchive,
|
|
948
984
|
reason
|
|
949
985
|
};
|
|
950
986
|
} catch (err) {
|
|
@@ -957,8 +993,8 @@ export class SequencerPublisher {
|
|
|
957
993
|
request,
|
|
958
994
|
error: viemError.message
|
|
959
995
|
});
|
|
960
|
-
const
|
|
961
|
-
if (
|
|
996
|
+
const latestProposedCheckpointNumber = await this.rollupContract.getCheckpointNumber();
|
|
997
|
+
if (latestProposedCheckpointNumber < checkpointNumber) {
|
|
962
998
|
this.log.verbose(`Checkpoint ${checkpointNumber} has already been invalidated`, {
|
|
963
999
|
...logData
|
|
964
1000
|
});
|
|
@@ -1019,9 +1055,6 @@ export class SequencerPublisher {
|
|
|
1019
1055
|
}
|
|
1020
1056
|
}
|
|
1021
1057
|
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
1022
|
-
// Anchor the simulation timestamp to the checkpoint's own slot start time
|
|
1023
|
-
// rather than the current L1 block timestamp, which may overshoot into the next slot if the build ran late.
|
|
1024
|
-
const ts = checkpoint.header.timestamp;
|
|
1025
1058
|
const blobFields = checkpoint.toBlobFields();
|
|
1026
1059
|
const blobs = await getBlobsPerL1Block(blobFields);
|
|
1027
1060
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
@@ -1038,10 +1071,9 @@ export class SequencerPublisher {
|
|
|
1038
1071
|
attestationsAndSignersSignature.toViemSignature(),
|
|
1039
1072
|
blobInput
|
|
1040
1073
|
];
|
|
1041
|
-
await this.simulateProposeTx(args,
|
|
1042
|
-
return ts;
|
|
1074
|
+
await this.simulateProposeTx(args, options);
|
|
1043
1075
|
}
|
|
1044
|
-
async enqueueCastSignalHelper(slotNumber,
|
|
1076
|
+
async enqueueCastSignalHelper(slotNumber, signalType, payload, base, signerAddress, signer) {
|
|
1045
1077
|
if (this.lastActions[signalType] && this.lastActions[signalType] === slotNumber) {
|
|
1046
1078
|
this.log.debug(`Skipping duplicate vote cast signal ${signalType} for slot ${slotNumber}`);
|
|
1047
1079
|
return false;
|
|
@@ -1098,6 +1130,7 @@ export class SequencerPublisher {
|
|
|
1098
1130
|
lastValidL2Slot: slotNumber
|
|
1099
1131
|
});
|
|
1100
1132
|
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1133
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
1101
1134
|
try {
|
|
1102
1135
|
await this.l1TxUtils.simulate(request, {
|
|
1103
1136
|
time: timestamp
|
|
@@ -1110,7 +1143,10 @@ export class SequencerPublisher {
|
|
|
1110
1143
|
});
|
|
1111
1144
|
} catch (err) {
|
|
1112
1145
|
const viemError = formatViemError(err);
|
|
1113
|
-
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError
|
|
1146
|
+
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError, {
|
|
1147
|
+
simulationTimestamp: timestamp,
|
|
1148
|
+
l1BlockNumber
|
|
1149
|
+
});
|
|
1114
1150
|
this.backupFailedTx({
|
|
1115
1151
|
id: keccak256(request.data),
|
|
1116
1152
|
failureType: 'simulation',
|
|
@@ -1175,55 +1211,17 @@ export class SequencerPublisher {
|
|
|
1175
1211
|
/**
|
|
1176
1212
|
* Enqueues a governance castSignal transaction to cast a signal for a given slot number.
|
|
1177
1213
|
* @param slotNumber - The slot number to cast a signal for.
|
|
1178
|
-
* @param timestamp - The timestamp of the slot to cast a signal for.
|
|
1179
1214
|
* @returns True if the signal was successfully enqueued, false otherwise.
|
|
1180
|
-
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber,
|
|
1181
|
-
return this.enqueueCastSignalHelper(slotNumber,
|
|
1215
|
+
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber, signerAddress, signer) {
|
|
1216
|
+
return this.enqueueCastSignalHelper(slotNumber, 'governance-signal', governancePayload, this.govProposerContract, signerAddress, signer);
|
|
1182
1217
|
}
|
|
1183
|
-
/** Enqueues all slashing actions as returned by the slasher client. */ async enqueueSlashingActions(actions, slotNumber,
|
|
1218
|
+
/** Enqueues all slashing actions as returned by the slasher client. */ async enqueueSlashingActions(actions, slotNumber, signerAddress, signer) {
|
|
1184
1219
|
if (actions.length === 0) {
|
|
1185
1220
|
this.log.debug(`No slashing actions to enqueue for slot ${slotNumber}`);
|
|
1186
1221
|
return false;
|
|
1187
1222
|
}
|
|
1188
1223
|
for (const action of actions){
|
|
1189
1224
|
switch(action.type){
|
|
1190
|
-
case 'vote-empire-payload':
|
|
1191
|
-
{
|
|
1192
|
-
if (this.slashingProposerContract?.type !== 'empire') {
|
|
1193
|
-
this.log.error('Cannot vote for empire payload on non-empire slashing contract');
|
|
1194
|
-
break;
|
|
1195
|
-
}
|
|
1196
|
-
this.log.debug(`Enqueuing slashing vote for payload ${action.payload} at slot ${slotNumber}`, {
|
|
1197
|
-
signerAddress
|
|
1198
|
-
});
|
|
1199
|
-
await this.enqueueCastSignalHelper(slotNumber, timestamp, 'empire-slashing-signal', action.payload, this.slashingProposerContract, signerAddress, signer);
|
|
1200
|
-
break;
|
|
1201
|
-
}
|
|
1202
|
-
case 'create-empire-payload':
|
|
1203
|
-
{
|
|
1204
|
-
this.log.debug(`Enqueuing slashing create payload at slot ${slotNumber}`, {
|
|
1205
|
-
slotNumber,
|
|
1206
|
-
signerAddress
|
|
1207
|
-
});
|
|
1208
|
-
const request = this.slashFactoryContract.buildCreatePayloadRequest(action.data);
|
|
1209
|
-
await this.simulateAndEnqueueRequest('create-empire-payload', request, (receipt)=>!!this.slashFactoryContract.tryExtractSlashPayloadCreatedEvent(receipt.logs), slotNumber, timestamp);
|
|
1210
|
-
break;
|
|
1211
|
-
}
|
|
1212
|
-
case 'execute-empire-payload':
|
|
1213
|
-
{
|
|
1214
|
-
this.log.debug(`Enqueuing slashing execute payload at slot ${slotNumber}`, {
|
|
1215
|
-
slotNumber,
|
|
1216
|
-
signerAddress
|
|
1217
|
-
});
|
|
1218
|
-
if (this.slashingProposerContract?.type !== 'empire') {
|
|
1219
|
-
this.log.error('Cannot execute slashing payload on non-empire slashing contract');
|
|
1220
|
-
return false;
|
|
1221
|
-
}
|
|
1222
|
-
const empireSlashingProposer = this.slashingProposerContract;
|
|
1223
|
-
const request = empireSlashingProposer.buildExecuteRoundRequest(action.round);
|
|
1224
|
-
await this.simulateAndEnqueueRequest('execute-empire-payload', request, (receipt)=>!!empireSlashingProposer.tryExtractPayloadSubmittedEvent(receipt.logs), slotNumber, timestamp);
|
|
1225
|
-
break;
|
|
1226
|
-
}
|
|
1227
1225
|
case 'vote-offenses':
|
|
1228
1226
|
{
|
|
1229
1227
|
this.log.debug(`Enqueuing slashing vote for ${action.votes.length} votes at slot ${slotNumber}`, {
|
|
@@ -1232,14 +1230,13 @@ export class SequencerPublisher {
|
|
|
1232
1230
|
votesCount: action.votes.length,
|
|
1233
1231
|
signerAddress
|
|
1234
1232
|
});
|
|
1235
|
-
if (this.slashingProposerContract
|
|
1236
|
-
this.log.error('
|
|
1233
|
+
if (!this.slashingProposerContract) {
|
|
1234
|
+
this.log.error('No slashing proposer contract available');
|
|
1237
1235
|
return false;
|
|
1238
1236
|
}
|
|
1239
|
-
const tallySlashingProposer = this.slashingProposerContract;
|
|
1240
1237
|
const votes = bufferToHex(encodeSlashConsensusVotes(action.votes));
|
|
1241
|
-
const request = await
|
|
1242
|
-
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!
|
|
1238
|
+
const request = await this.slashingProposerContract.buildVoteRequestFromSigner(votes, slotNumber, signer);
|
|
1239
|
+
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!this.slashingProposerContract.tryExtractVoteCastEvent(receipt.logs), slotNumber);
|
|
1243
1240
|
break;
|
|
1244
1241
|
}
|
|
1245
1242
|
case 'execute-slash':
|
|
@@ -1249,13 +1246,12 @@ export class SequencerPublisher {
|
|
|
1249
1246
|
round: action.round,
|
|
1250
1247
|
signerAddress
|
|
1251
1248
|
});
|
|
1252
|
-
if (this.slashingProposerContract
|
|
1253
|
-
this.log.error('
|
|
1249
|
+
if (!this.slashingProposerContract) {
|
|
1250
|
+
this.log.error('No slashing proposer contract available');
|
|
1254
1251
|
return false;
|
|
1255
1252
|
}
|
|
1256
|
-
const
|
|
1257
|
-
|
|
1258
|
-
await this.simulateAndEnqueueRequest('execute-slash', request, (receipt)=>!!tallySlashingProposer.tryExtractRoundExecutedEvent(receipt.logs), slotNumber, timestamp);
|
|
1253
|
+
const executeRequest = this.slashingProposerContract.buildExecuteRoundRequest(action.round, action.committees);
|
|
1254
|
+
await this.simulateAndEnqueueRequest('execute-slash', executeRequest, (receipt)=>!!this.slashingProposerContract.tryExtractRoundExecutedEvent(receipt.logs), slotNumber);
|
|
1259
1255
|
break;
|
|
1260
1256
|
}
|
|
1261
1257
|
default:
|
|
@@ -1279,14 +1275,13 @@ export class SequencerPublisher {
|
|
|
1279
1275
|
attestationsAndSignersSignature,
|
|
1280
1276
|
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
1281
1277
|
};
|
|
1282
|
-
let ts;
|
|
1283
1278
|
try {
|
|
1284
1279
|
// @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
|
|
1285
1280
|
// This means that we can avoid the simulation issues in later checks.
|
|
1286
1281
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
1287
1282
|
// make time consistency checks break.
|
|
1288
1283
|
// TODO(palla): Check whether we're validating twice, once here and once within addProposeTx, since we call simulateProposeTx in both places.
|
|
1289
|
-
|
|
1284
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts);
|
|
1290
1285
|
} catch (err) {
|
|
1291
1286
|
this.log.error(`Checkpoint validation failed. ${err instanceof Error ? err.message : 'No error message'}`, err, {
|
|
1292
1287
|
...checkpoint.getStats(),
|
|
@@ -1295,11 +1290,23 @@ export class SequencerPublisher {
|
|
|
1295
1290
|
});
|
|
1296
1291
|
throw err;
|
|
1297
1292
|
}
|
|
1293
|
+
// Build a pre-check callback that re-validates the checkpoint before L1 submission.
|
|
1294
|
+
// During pipelining this catches stale proposals due to prunes or L1 reorgs that occur during the pipeline sleep.
|
|
1295
|
+
let preCheck = undefined;
|
|
1296
|
+
if (this.epochCache.isProposerPipeliningEnabled()) {
|
|
1297
|
+
preCheck = async ()=>{
|
|
1298
|
+
this.log.debug(`Re-validating checkpoint ${checkpoint.number} before L1 submission`);
|
|
1299
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, {
|
|
1300
|
+
// Forcing pending checkpoint number is included its required if an invalidation request is included
|
|
1301
|
+
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber
|
|
1302
|
+
});
|
|
1303
|
+
};
|
|
1304
|
+
}
|
|
1298
1305
|
this.log.verbose(`Enqueuing checkpoint propose transaction`, {
|
|
1299
1306
|
...checkpoint.toCheckpointInfo(),
|
|
1300
1307
|
...opts
|
|
1301
1308
|
});
|
|
1302
|
-
await this.addProposeTx(checkpoint, proposeTxArgs, opts,
|
|
1309
|
+
await this.addProposeTx(checkpoint, proposeTxArgs, opts, preCheck);
|
|
1303
1310
|
}
|
|
1304
1311
|
enqueueInvalidateCheckpoint(request, opts = {}) {
|
|
1305
1312
|
if (!request) {
|
|
@@ -1340,7 +1347,8 @@ export class SequencerPublisher {
|
|
|
1340
1347
|
}
|
|
1341
1348
|
});
|
|
1342
1349
|
}
|
|
1343
|
-
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber
|
|
1350
|
+
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber) {
|
|
1351
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
1344
1352
|
const logData = {
|
|
1345
1353
|
slotNumber,
|
|
1346
1354
|
timestamp,
|
|
@@ -1362,7 +1370,7 @@ export class SequencerPublisher {
|
|
|
1362
1370
|
try {
|
|
1363
1371
|
({ gasUsed } = await this.l1TxUtils.simulate(request, {
|
|
1364
1372
|
time: timestamp
|
|
1365
|
-
}, [], simulateAbi));
|
|
1373
|
+
}, [], simulateAbi));
|
|
1366
1374
|
this.log.verbose(`Simulation for ${action} succeeded`, {
|
|
1367
1375
|
...logData,
|
|
1368
1376
|
request,
|
|
@@ -1437,13 +1445,14 @@ export class SequencerPublisher {
|
|
|
1437
1445
|
* A call to `restart` is required before you can continue publishing.
|
|
1438
1446
|
*/ interrupt() {
|
|
1439
1447
|
this.interrupted = true;
|
|
1448
|
+
this.interruptibleSleep.interrupt();
|
|
1440
1449
|
this.l1TxUtils.interrupt();
|
|
1441
1450
|
}
|
|
1442
1451
|
/** Restarts the publisher after calling `interrupt`. */ restart() {
|
|
1443
1452
|
this.interrupted = false;
|
|
1444
1453
|
this.l1TxUtils.restart();
|
|
1445
1454
|
}
|
|
1446
|
-
async prepareProposeTx(encodedData,
|
|
1455
|
+
async prepareProposeTx(encodedData, options) {
|
|
1447
1456
|
const kzg = Blob.getViemKzgInstance();
|
|
1448
1457
|
const blobInput = getPrefixedEthBlobCommitments(encodedData.blobs);
|
|
1449
1458
|
this.log.debug('Validating blob input', {
|
|
@@ -1520,7 +1529,7 @@ export class SequencerPublisher {
|
|
|
1520
1529
|
encodedData.attestationsAndSignersSignature.toViemSignature(),
|
|
1521
1530
|
blobInput
|
|
1522
1531
|
];
|
|
1523
|
-
const { rollupData, simulationResult } = await this.simulateProposeTx(args,
|
|
1532
|
+
const { rollupData, simulationResult } = await this.simulateProposeTx(args, options);
|
|
1524
1533
|
return {
|
|
1525
1534
|
args,
|
|
1526
1535
|
blobEvaluationGas,
|
|
@@ -1531,16 +1540,17 @@ export class SequencerPublisher {
|
|
|
1531
1540
|
/**
|
|
1532
1541
|
* Simulates the propose tx with eth_simulateV1
|
|
1533
1542
|
* @param args - The propose tx args
|
|
1534
|
-
* @param timestamp - The timestamp to simulate proposal at
|
|
1535
1543
|
* @returns The simulation result
|
|
1536
|
-
*/ async simulateProposeTx(args,
|
|
1544
|
+
*/ async simulateProposeTx(args, options) {
|
|
1537
1545
|
const rollupData = encodeFunctionData({
|
|
1538
1546
|
abi: RollupAbi,
|
|
1539
1547
|
functionName: 'propose',
|
|
1540
1548
|
args
|
|
1541
1549
|
});
|
|
1542
|
-
// override the
|
|
1550
|
+
// override the proposed checkpoint number if requested
|
|
1543
1551
|
const forcePendingCheckpointNumberStateDiff = (options.forcePendingCheckpointNumber !== undefined ? await this.rollupContract.makePendingCheckpointNumberOverride(options.forcePendingCheckpointNumber) : []).flatMap((override)=>override.stateDiff ?? []);
|
|
1552
|
+
// override the fee header for a specific checkpoint number if requested (used when pipelining)
|
|
1553
|
+
const forceProposedFeeHeaderStateDiff = (options.forceProposedFeeHeader !== undefined ? await this.rollupContract.makeFeeHeaderOverride(options.forceProposedFeeHeader.checkpointNumber, options.forceProposedFeeHeader.feeHeader) : []).flatMap((override)=>override.stateDiff ?? []);
|
|
1544
1554
|
const stateOverrides = [
|
|
1545
1555
|
{
|
|
1546
1556
|
address: this.rollupContract.address,
|
|
@@ -1550,7 +1560,8 @@ export class SequencerPublisher {
|
|
|
1550
1560
|
slot: toPaddedHex(RollupContract.checkBlobStorageSlot, true),
|
|
1551
1561
|
value: toPaddedHex(0n, true)
|
|
1552
1562
|
},
|
|
1553
|
-
...forcePendingCheckpointNumberStateDiff
|
|
1563
|
+
...forcePendingCheckpointNumberStateDiff,
|
|
1564
|
+
...forceProposedFeeHeaderStateDiff
|
|
1554
1565
|
]
|
|
1555
1566
|
}
|
|
1556
1567
|
];
|
|
@@ -1562,6 +1573,7 @@ export class SequencerPublisher {
|
|
|
1562
1573
|
});
|
|
1563
1574
|
}
|
|
1564
1575
|
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1576
|
+
const simTs = this.getSimulationTimestamp(SlotNumber.fromBigInt(args[0].header.slotNumber));
|
|
1565
1577
|
const simulationResult = await this.l1TxUtils.simulate({
|
|
1566
1578
|
to: this.rollupContract.address,
|
|
1567
1579
|
data: rollupData,
|
|
@@ -1570,8 +1582,7 @@ export class SequencerPublisher {
|
|
|
1570
1582
|
from: this.proposerAddressForSimulation.toString()
|
|
1571
1583
|
}
|
|
1572
1584
|
}, {
|
|
1573
|
-
|
|
1574
|
-
time: timestamp + 1n,
|
|
1585
|
+
time: simTs,
|
|
1575
1586
|
// @note reth should have a 30m gas limit per block but throws errors that this tx is beyond limit so we increase here
|
|
1576
1587
|
gasLimit: MAX_L1_TX_LIMIT * 2n
|
|
1577
1588
|
}, stateOverrides, RollupAbi, {
|
|
@@ -1588,7 +1599,9 @@ export class SequencerPublisher {
|
|
|
1588
1599
|
logs: []
|
|
1589
1600
|
};
|
|
1590
1601
|
}
|
|
1591
|
-
this.log.error(`Failed to simulate propose tx`, viemError
|
|
1602
|
+
this.log.error(`Failed to simulate propose tx`, viemError, {
|
|
1603
|
+
simulationTimestamp: simTs
|
|
1604
|
+
});
|
|
1592
1605
|
this.backupFailedTx({
|
|
1593
1606
|
id: keccak256(rollupData),
|
|
1594
1607
|
failureType: 'simulation',
|
|
@@ -1616,11 +1629,11 @@ export class SequencerPublisher {
|
|
|
1616
1629
|
simulationResult
|
|
1617
1630
|
};
|
|
1618
1631
|
}
|
|
1619
|
-
async addProposeTx(checkpoint, encodedData, opts = {},
|
|
1632
|
+
async addProposeTx(checkpoint, encodedData, opts = {}, preCheck) {
|
|
1620
1633
|
const slot = checkpoint.header.slotNumber;
|
|
1621
1634
|
const timer = new Timer();
|
|
1622
1635
|
const kzg = Blob.getViemKzgInstance();
|
|
1623
|
-
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData,
|
|
1636
|
+
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, opts);
|
|
1624
1637
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
1625
1638
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
1626
1639
|
// Send the blobs to the blob client preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
@@ -1639,6 +1652,7 @@ export class SequencerPublisher {
|
|
|
1639
1652
|
...opts,
|
|
1640
1653
|
gasLimit
|
|
1641
1654
|
},
|
|
1655
|
+
preCheck,
|
|
1642
1656
|
blobConfig: {
|
|
1643
1657
|
blobs: encodedData.blobs.map((b)=>b.data),
|
|
1644
1658
|
kzg
|
|
@@ -1685,7 +1699,12 @@ export class SequencerPublisher {
|
|
|
1685
1699
|
}
|
|
1686
1700
|
});
|
|
1687
1701
|
}
|
|
1688
|
-
/** Returns the timestamp
|
|
1702
|
+
/** Returns the timestamp of the last L1 slot within a given L2 slot. Used as the simulation timestamp
|
|
1703
|
+
* for eth_simulateV1 calls, since it's guaranteed to be greater than any L1 block produced during the slot. */ getSimulationTimestamp(slot) {
|
|
1704
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
1705
|
+
return getLastL1SlotTimestampForL2Slot(slot, l1Constants);
|
|
1706
|
+
}
|
|
1707
|
+
/** Returns the timestamp of the next L1 slot boundary after now. */ getNextL1SlotTimestamp() {
|
|
1689
1708
|
const l1Constants = this.epochCache.getL1Constants();
|
|
1690
1709
|
return getNextL1SlotTimestamp(this.dateProvider.nowInSeconds(), l1Constants);
|
|
1691
1710
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
|
+
import { type FeeHeader } from '@aztec/ethereum/contracts';
|
|
2
3
|
import { BlockNumber, CheckpointNumber, EpochNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
5
|
import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
|
|
@@ -7,7 +8,7 @@ import { type TypedEventEmitter } from '@aztec/foundation/types';
|
|
|
7
8
|
import type { P2P } from '@aztec/p2p';
|
|
8
9
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
9
10
|
import { L2Block, type L2BlockSink, type L2BlockSource } from '@aztec/stdlib/block';
|
|
10
|
-
import { type Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
11
|
+
import { type Checkpoint, type ProposedCheckpointData } from '@aztec/stdlib/checkpoint';
|
|
11
12
|
import { type ResolvedSequencerConfig, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
12
13
|
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
13
14
|
import { Tx } from '@aztec/stdlib/tx';
|
|
@@ -29,7 +30,6 @@ import { SequencerState } from './utils.js';
|
|
|
29
30
|
export declare class CheckpointProposalJob implements Traceable {
|
|
30
31
|
private readonly slotNow;
|
|
31
32
|
private readonly targetSlot;
|
|
32
|
-
private readonly epochNow;
|
|
33
33
|
private readonly targetEpoch;
|
|
34
34
|
private readonly checkpointNumber;
|
|
35
35
|
private readonly syncedToBlockNumber;
|
|
@@ -55,17 +55,23 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
55
55
|
private readonly eventEmitter;
|
|
56
56
|
private readonly setStateFn;
|
|
57
57
|
readonly tracer: Tracer;
|
|
58
|
+
private readonly proposedCheckpointData?;
|
|
58
59
|
protected readonly log: Logger;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
/** Tracks the fire-and-forget L1 submission promise so it can be awaited during shutdown. */
|
|
61
|
+
private pendingL1Submission;
|
|
62
|
+
/** Fee header override computed during proposeCheckpoint, reused in enqueueCheckpointForSubmission. */
|
|
63
|
+
private computedForceProposedFeeHeader?;
|
|
64
|
+
constructor(slotNow: SlotNumber, targetSlot: SlotNumber, targetEpoch: EpochNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress, invalidateCheckpoint: InvalidateCheckpointRequest | undefined, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, l2BlockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, blockSink: L2BlockSink, l1Constants: SequencerRollupConstants, config: ResolvedSequencerConfig, timetable: SequencerTimetable, slasherClient: SlasherClientInterface | undefined, epochCache: EpochCache, dateProvider: DateProvider, metrics: SequencerMetrics, eventEmitter: TypedEventEmitter<SequencerEvents>, setStateFn: (state: SequencerState, slot?: SlotNumber) => void, tracer: Tracer, bindings?: LoggerBindings, proposedCheckpointData?: ProposedCheckpointData | undefined);
|
|
65
|
+
/** Awaits the pending L1 submission if one is in progress. Call during shutdown. */
|
|
66
|
+
awaitPendingSubmission(): Promise<void>;
|
|
64
67
|
/**
|
|
65
68
|
* Executes the checkpoint proposal job.
|
|
66
|
-
*
|
|
69
|
+
* Builds blocks, collects attestations, enqueues requests, and schedules L1 submission as a
|
|
70
|
+
* background task so the work loop can return to IDLE immediately.
|
|
71
|
+
* Returns the built checkpoint if successful, undefined otherwise.
|
|
67
72
|
*/
|
|
68
73
|
execute(): Promise<Checkpoint | undefined>;
|
|
74
|
+
private enqueueCheckpointForSubmission;
|
|
69
75
|
private proposeCheckpoint;
|
|
70
76
|
private buildBlocksForCheckpoint;
|
|
71
77
|
/** Creates a block proposal for a given block via the validator client (unless in fisherman mode) */
|
|
@@ -82,9 +88,11 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
82
88
|
}): Promise<{
|
|
83
89
|
block: L2Block;
|
|
84
90
|
usedTxs: Tx[];
|
|
91
|
+
} | {
|
|
92
|
+
failure: 'insufficient-txs' | 'insufficient-valid-txs';
|
|
85
93
|
} | {
|
|
86
94
|
error: Error;
|
|
87
|
-
}
|
|
95
|
+
}>;
|
|
88
96
|
private buildSingleBlockWithCheckpointBuilder;
|
|
89
97
|
private waitForMinTxs;
|
|
90
98
|
private waitForAttestations;
|
|
@@ -97,6 +105,19 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
97
105
|
* Helper to handle HA double-signing errors. Returns true if the error was handled (caller should yield).
|
|
98
106
|
*/
|
|
99
107
|
private handleHASigningError;
|
|
108
|
+
/**
|
|
109
|
+
* In times of congestion we need to simulate using the correct fee header override for the previous block
|
|
110
|
+
* We calculate the correct fee header values.
|
|
111
|
+
*
|
|
112
|
+
* If we are in block 1, or the checkpoint we are querying does not exist, we return undefined. However
|
|
113
|
+
* If we are pipelining - where this function is called, the grandparentCheckpointNumber should always exist
|
|
114
|
+
* @param parentCheckpointNumber
|
|
115
|
+
* @returns
|
|
116
|
+
*/
|
|
117
|
+
protected computeForceProposedFeeHeader(parentCheckpointNumber: CheckpointNumber): Promise<{
|
|
118
|
+
checkpointNumber: CheckpointNumber;
|
|
119
|
+
feeHeader: FeeHeader;
|
|
120
|
+
} | undefined>;
|
|
100
121
|
/** Waits until a specific time within the current slot */
|
|
101
122
|
protected waitUntilTimeInSlot(targetSecondsIntoSlot: number): Promise<void>;
|
|
102
123
|
/** Waits the polling interval for transactions. Extracted for test overriding. */
|
|
@@ -105,4 +126,4 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
105
126
|
private getSecondsIntoSlot;
|
|
106
127
|
getPublisher(): SequencerPublisher;
|
|
107
128
|
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF9qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvY2hlY2twb2ludF9wcm9wb3NhbF9qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFrQixNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsVUFBVSxFQUNYLE1BQU0saUNBQWlDLENBQUM7QUFRekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzNELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBRSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RixPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBMEIsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RixPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBR0wsT0FBTyxFQUNQLEtBQUssV0FBVyxFQUNoQixLQUFLLGFBQWEsRUFFbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsS0FBSyxzQkFBc0IsRUFBc0IsTUFBTSwwQkFBMEIsQ0FBQztBQUc1RyxPQUFPLEVBR0wsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxzQkFBc0IsRUFDNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBbUMsTUFBTSx5QkFBeUIsQ0FBQztB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,UAAU,EACX,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,yBAAyB,CAAC;AACzF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAGL,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"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"}
|