@aztec/sequencer-client 0.0.1-commit.f504929 → 0.0.1-commit.f5d02921e
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 +4 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +46 -23
- package/dest/config.d.ts +25 -5
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +21 -12
- package/dest/global_variable_builder/global_builder.d.ts +15 -9
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +29 -25
- package/dest/global_variable_builder/index.d.ts +2 -2
- package/dest/global_variable_builder/index.d.ts.map +1 -1
- package/dest/publisher/config.d.ts +13 -1
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +17 -2
- package/dest/publisher/sequencer-publisher-factory.d.ts +3 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +2 -2
- package/dest/publisher/sequencer-publisher.d.ts +52 -25
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +98 -42
- package/dest/sequencer/checkpoint_proposal_job.d.ts +33 -8
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +284 -158
- 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/events.d.ts +2 -1
- package/dest/sequencer/events.d.ts.map +1 -1
- package/dest/sequencer/metrics.d.ts +5 -1
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +11 -0
- package/dest/sequencer/sequencer.d.ts +23 -10
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +123 -68
- package/dest/sequencer/timetable.d.ts +4 -3
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +6 -7
- package/dest/sequencer/types.d.ts +2 -2
- package/dest/sequencer/types.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.d.ts +7 -9
- package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.js +39 -30
- package/package.json +27 -28
- package/src/client/sequencer-client.ts +56 -21
- package/src/config.ts +28 -14
- package/src/global_variable_builder/global_builder.ts +37 -26
- package/src/global_variable_builder/index.ts +1 -1
- package/src/publisher/config.ts +32 -0
- package/src/publisher/sequencer-publisher-factory.ts +3 -3
- package/src/publisher/sequencer-publisher.ts +144 -54
- package/src/sequencer/checkpoint_proposal_job.ts +367 -175
- package/src/sequencer/checkpoint_voter.ts +1 -12
- package/src/sequencer/events.ts +1 -1
- package/src/sequencer/metrics.ts +14 -0
- package/src/sequencer/sequencer.ts +178 -79
- package/src/sequencer/timetable.ts +7 -7
- package/src/sequencer/types.ts +1 -1
- package/src/test/mock_checkpoint_builder.ts +51 -48
|
@@ -379,17 +379,20 @@ import { FormattedViemError, formatViemError, mergeAbis, tryExtractEvent } from
|
|
|
379
379
|
import { sumBigint } from '@aztec/foundation/bigint';
|
|
380
380
|
import { toHex as toPaddedHex } from '@aztec/foundation/bigint-buffer';
|
|
381
381
|
import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
382
|
+
import { trimmedBytesLength } from '@aztec/foundation/buffer';
|
|
382
383
|
import { pick } from '@aztec/foundation/collection';
|
|
383
384
|
import { TimeoutError } from '@aztec/foundation/error';
|
|
384
385
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
385
386
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
386
387
|
import { createLogger } from '@aztec/foundation/log';
|
|
387
388
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
389
|
+
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
388
390
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
389
391
|
import { Timer } from '@aztec/foundation/timer';
|
|
390
392
|
import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
391
393
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
392
394
|
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
395
|
+
import { getLastL1SlotTimestampForL2Slot, getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
393
396
|
import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
394
397
|
import { encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
|
|
395
398
|
import { createL1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
@@ -440,11 +443,14 @@ export class SequencerPublisher {
|
|
|
440
443
|
payloadProposedCache;
|
|
441
444
|
log;
|
|
442
445
|
ethereumSlotDuration;
|
|
446
|
+
aztecSlotDuration;
|
|
447
|
+
/** Date provider for wall-clock time. */ dateProvider;
|
|
443
448
|
blobClient;
|
|
444
449
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
445
450
|
/** Optional callback to obtain a replacement publisher when the current one fails to send. */ getNextPublisher;
|
|
446
451
|
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
447
452
|
/** Fee asset price oracle for computing price modifiers from Uniswap V4 */ feeAssetPriceOracle;
|
|
453
|
+
/** Interruptible sleep used by sendRequestsAt to wait until a target timestamp. */ interruptibleSleep;
|
|
448
454
|
// A CALL to a cold address is 2700 gas
|
|
449
455
|
static MULTICALL_OVERHEAD_GAS_GUESS = 5000n;
|
|
450
456
|
// Gas report for VotingWithSigTest shows a max gas of 100k, but we've seen it cost 700k+ in testnet
|
|
@@ -464,12 +470,16 @@ export class SequencerPublisher {
|
|
|
464
470
|
this.lastActions = {};
|
|
465
471
|
this.isPayloadEmptyCache = new Map();
|
|
466
472
|
this.payloadProposedCache = new Set();
|
|
473
|
+
this.interruptibleSleep = new InterruptibleSleep();
|
|
467
474
|
this.requests = [];
|
|
468
475
|
this.log = deps.log ?? createLogger('sequencer:publisher');
|
|
469
476
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
477
|
+
this.aztecSlotDuration = BigInt(config.aztecSlotDuration);
|
|
478
|
+
this.dateProvider = deps.dateProvider;
|
|
470
479
|
this.epochCache = deps.epochCache;
|
|
471
480
|
this.lastActions = deps.lastActions;
|
|
472
481
|
this.blobClient = deps.blobClient;
|
|
482
|
+
this.dateProvider = deps.dateProvider;
|
|
473
483
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
474
484
|
this.metrics = deps.metrics ?? new SequencerPublisherMetrics(telemetry, 'SequencerPublisher');
|
|
475
485
|
this.tracer = telemetry.getTracer('SequencerPublisher');
|
|
@@ -536,7 +546,7 @@ export class SequencerPublisher {
|
|
|
536
546
|
this.requests.push(request);
|
|
537
547
|
}
|
|
538
548
|
getCurrentL2Slot() {
|
|
539
|
-
return this.epochCache.
|
|
549
|
+
return this.epochCache.getSlotNow();
|
|
540
550
|
}
|
|
541
551
|
/**
|
|
542
552
|
* Clears all pending requests without sending them.
|
|
@@ -625,8 +635,8 @@ export class SequencerPublisher {
|
|
|
625
635
|
// @note - we can only have one blob config per bundle
|
|
626
636
|
// find requests with gas and blob configs
|
|
627
637
|
// See https://github.com/AztecProtocol/aztec-packages/issues/11513
|
|
628
|
-
const gasConfigs =
|
|
629
|
-
const blobConfigs =
|
|
638
|
+
const gasConfigs = validRequests.filter((request)=>request.gasConfig).map((request)=>request.gasConfig);
|
|
639
|
+
const blobConfigs = validRequests.filter((request)=>request.blobConfig).map((request)=>request.blobConfig);
|
|
630
640
|
if (blobConfigs.length > 1) {
|
|
631
641
|
throw new Error('Multiple blob configs found');
|
|
632
642
|
}
|
|
@@ -734,6 +744,23 @@ export class SequencerPublisher {
|
|
|
734
744
|
}
|
|
735
745
|
}
|
|
736
746
|
}
|
|
747
|
+
/*
|
|
748
|
+
* Schedules sending all enqueued requests at (or after) the given timestamp.
|
|
749
|
+
* Uses InterruptibleSleep so it can be cancelled via interrupt().
|
|
750
|
+
* Returns the promise for the L1 response (caller should NOT await this in the work loop).
|
|
751
|
+
*/ async sendRequestsAt(submitAfter) {
|
|
752
|
+
const ms = submitAfter.getTime() - this.dateProvider.now();
|
|
753
|
+
if (ms > 0) {
|
|
754
|
+
this.log.debug(`Sleeping ${ms}ms before sending requests`, {
|
|
755
|
+
submitAfter
|
|
756
|
+
});
|
|
757
|
+
await this.interruptibleSleep.sleep(ms);
|
|
758
|
+
}
|
|
759
|
+
if (this.interrupted) {
|
|
760
|
+
return undefined;
|
|
761
|
+
}
|
|
762
|
+
return this.sendRequests();
|
|
763
|
+
}
|
|
737
764
|
callbackBundledTransactions(requests, result, txContext) {
|
|
738
765
|
const actionsListStr = requests.map((r)=>r.action).join(', ');
|
|
739
766
|
if (result instanceof FormattedViemError) {
|
|
@@ -767,7 +794,16 @@ export class SequencerPublisher {
|
|
|
767
794
|
} else {
|
|
768
795
|
this.log.verbose(`Published bundled transactions (${actionsListStr})`, {
|
|
769
796
|
result,
|
|
770
|
-
requests
|
|
797
|
+
requests: requests.map((r)=>({
|
|
798
|
+
...r,
|
|
799
|
+
// Avoid logging large blob data
|
|
800
|
+
blobConfig: r.blobConfig ? {
|
|
801
|
+
...r.blobConfig,
|
|
802
|
+
blobs: r.blobConfig.blobs.map((b)=>({
|
|
803
|
+
size: trimmedBytesLength(b)
|
|
804
|
+
}))
|
|
805
|
+
} : undefined
|
|
806
|
+
}))
|
|
771
807
|
});
|
|
772
808
|
const successfulActions = [];
|
|
773
809
|
const failedActions = [];
|
|
@@ -816,18 +852,22 @@ export class SequencerPublisher {
|
|
|
816
852
|
}
|
|
817
853
|
}
|
|
818
854
|
/**
|
|
819
|
-
* @notice Will call `
|
|
855
|
+
* @notice Will call `canProposeAt` to make sure that it is possible to propose
|
|
820
856
|
* @param tipArchive - The archive to check
|
|
821
857
|
* @returns The slot and block number if it is possible to propose, undefined otherwise
|
|
822
|
-
*/
|
|
858
|
+
*/ canProposeAt(tipArchive, msgSender, opts = {}) {
|
|
823
859
|
// TODO: #14291 - should loop through multiple keys to check if any of them can propose
|
|
824
860
|
const ignoredErrors = [
|
|
825
861
|
'SlotAlreadyInChain',
|
|
826
862
|
'InvalidProposer',
|
|
827
863
|
'InvalidArchive'
|
|
828
864
|
];
|
|
829
|
-
|
|
830
|
-
|
|
865
|
+
const pipelined = opts.pipelined ?? this.epochCache.isProposerPipeliningEnabled();
|
|
866
|
+
const slotOffset = pipelined ? this.aztecSlotDuration : 0n;
|
|
867
|
+
const nextL1SlotTs = this.getNextL1SlotTimestamp() + slotOffset;
|
|
868
|
+
return this.rollupContract.canProposeAt(tipArchive.toBuffer(), msgSender.toString(), nextL1SlotTs, {
|
|
869
|
+
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber,
|
|
870
|
+
forceArchive: opts.forceArchive
|
|
831
871
|
}).catch((err)=>{
|
|
832
872
|
if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
|
|
833
873
|
this.log.warn(`Failed canProposeAtTime check with ${ignoredErrors.find((e)=>err.message.includes(e))}`, {
|
|
@@ -858,7 +898,7 @@ export class SequencerPublisher {
|
|
|
858
898
|
header.blobsHash.toString(),
|
|
859
899
|
flags
|
|
860
900
|
];
|
|
861
|
-
const ts =
|
|
901
|
+
const ts = this.getSimulationTimestamp(header.slotNumber);
|
|
862
902
|
const stateOverrides = await this.rollupContract.makePendingCheckpointNumberOverride(opts?.forcePendingCheckpointNumber);
|
|
863
903
|
let balance = 0n;
|
|
864
904
|
if (this.config.fishermanMode) {
|
|
@@ -881,7 +921,7 @@ export class SequencerPublisher {
|
|
|
881
921
|
}),
|
|
882
922
|
from: MULTI_CALL_3_ADDRESS
|
|
883
923
|
}, {
|
|
884
|
-
time: ts
|
|
924
|
+
time: ts
|
|
885
925
|
}, stateOverrides);
|
|
886
926
|
this.log.debug(`Simulated validateHeader`);
|
|
887
927
|
}
|
|
@@ -927,6 +967,7 @@ export class SequencerPublisher {
|
|
|
927
967
|
gasUsed,
|
|
928
968
|
checkpointNumber,
|
|
929
969
|
forcePendingCheckpointNumber: CheckpointNumber(checkpointNumber - 1),
|
|
970
|
+
lastArchive: validationResult.checkpoint.lastArchive,
|
|
930
971
|
reason
|
|
931
972
|
};
|
|
932
973
|
} catch (err) {
|
|
@@ -939,8 +980,8 @@ export class SequencerPublisher {
|
|
|
939
980
|
request,
|
|
940
981
|
error: viemError.message
|
|
941
982
|
});
|
|
942
|
-
const
|
|
943
|
-
if (
|
|
983
|
+
const latestProposedCheckpointNumber = await this.rollupContract.getCheckpointNumber();
|
|
984
|
+
if (latestProposedCheckpointNumber < checkpointNumber) {
|
|
944
985
|
this.log.verbose(`Checkpoint ${checkpointNumber} has already been invalidated`, {
|
|
945
986
|
...logData
|
|
946
987
|
});
|
|
@@ -1001,7 +1042,6 @@ export class SequencerPublisher {
|
|
|
1001
1042
|
}
|
|
1002
1043
|
}
|
|
1003
1044
|
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
1004
|
-
const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
1005
1045
|
const blobFields = checkpoint.toBlobFields();
|
|
1006
1046
|
const blobs = await getBlobsPerL1Block(blobFields);
|
|
1007
1047
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
@@ -1018,10 +1058,9 @@ export class SequencerPublisher {
|
|
|
1018
1058
|
attestationsAndSignersSignature.toViemSignature(),
|
|
1019
1059
|
blobInput
|
|
1020
1060
|
];
|
|
1021
|
-
await this.simulateProposeTx(args,
|
|
1022
|
-
return ts;
|
|
1061
|
+
await this.simulateProposeTx(args, options);
|
|
1023
1062
|
}
|
|
1024
|
-
async enqueueCastSignalHelper(slotNumber,
|
|
1063
|
+
async enqueueCastSignalHelper(slotNumber, signalType, payload, base, signerAddress, signer) {
|
|
1025
1064
|
if (this.lastActions[signalType] && this.lastActions[signalType] === slotNumber) {
|
|
1026
1065
|
this.log.debug(`Skipping duplicate vote cast signal ${signalType} for slot ${slotNumber}`);
|
|
1027
1066
|
return false;
|
|
@@ -1078,6 +1117,7 @@ export class SequencerPublisher {
|
|
|
1078
1117
|
lastValidL2Slot: slotNumber
|
|
1079
1118
|
});
|
|
1080
1119
|
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1120
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
1081
1121
|
try {
|
|
1082
1122
|
await this.l1TxUtils.simulate(request, {
|
|
1083
1123
|
time: timestamp
|
|
@@ -1090,7 +1130,10 @@ export class SequencerPublisher {
|
|
|
1090
1130
|
});
|
|
1091
1131
|
} catch (err) {
|
|
1092
1132
|
const viemError = formatViemError(err);
|
|
1093
|
-
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError
|
|
1133
|
+
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError, {
|
|
1134
|
+
simulationTimestamp: timestamp,
|
|
1135
|
+
l1BlockNumber
|
|
1136
|
+
});
|
|
1094
1137
|
this.backupFailedTx({
|
|
1095
1138
|
id: keccak256(request.data),
|
|
1096
1139
|
failureType: 'simulation',
|
|
@@ -1155,12 +1198,11 @@ export class SequencerPublisher {
|
|
|
1155
1198
|
/**
|
|
1156
1199
|
* Enqueues a governance castSignal transaction to cast a signal for a given slot number.
|
|
1157
1200
|
* @param slotNumber - The slot number to cast a signal for.
|
|
1158
|
-
* @param timestamp - The timestamp of the slot to cast a signal for.
|
|
1159
1201
|
* @returns True if the signal was successfully enqueued, false otherwise.
|
|
1160
|
-
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber,
|
|
1161
|
-
return this.enqueueCastSignalHelper(slotNumber,
|
|
1202
|
+
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber, signerAddress, signer) {
|
|
1203
|
+
return this.enqueueCastSignalHelper(slotNumber, 'governance-signal', governancePayload, this.govProposerContract, signerAddress, signer);
|
|
1162
1204
|
}
|
|
1163
|
-
/** Enqueues all slashing actions as returned by the slasher client. */ async enqueueSlashingActions(actions, slotNumber,
|
|
1205
|
+
/** Enqueues all slashing actions as returned by the slasher client. */ async enqueueSlashingActions(actions, slotNumber, signerAddress, signer) {
|
|
1164
1206
|
if (actions.length === 0) {
|
|
1165
1207
|
this.log.debug(`No slashing actions to enqueue for slot ${slotNumber}`);
|
|
1166
1208
|
return false;
|
|
@@ -1176,7 +1218,7 @@ export class SequencerPublisher {
|
|
|
1176
1218
|
this.log.debug(`Enqueuing slashing vote for payload ${action.payload} at slot ${slotNumber}`, {
|
|
1177
1219
|
signerAddress
|
|
1178
1220
|
});
|
|
1179
|
-
await this.enqueueCastSignalHelper(slotNumber,
|
|
1221
|
+
await this.enqueueCastSignalHelper(slotNumber, 'empire-slashing-signal', action.payload, this.slashingProposerContract, signerAddress, signer);
|
|
1180
1222
|
break;
|
|
1181
1223
|
}
|
|
1182
1224
|
case 'create-empire-payload':
|
|
@@ -1186,7 +1228,7 @@ export class SequencerPublisher {
|
|
|
1186
1228
|
signerAddress
|
|
1187
1229
|
});
|
|
1188
1230
|
const request = this.slashFactoryContract.buildCreatePayloadRequest(action.data);
|
|
1189
|
-
await this.simulateAndEnqueueRequest('create-empire-payload', request, (receipt)=>!!this.slashFactoryContract.tryExtractSlashPayloadCreatedEvent(receipt.logs), slotNumber
|
|
1231
|
+
await this.simulateAndEnqueueRequest('create-empire-payload', request, (receipt)=>!!this.slashFactoryContract.tryExtractSlashPayloadCreatedEvent(receipt.logs), slotNumber);
|
|
1190
1232
|
break;
|
|
1191
1233
|
}
|
|
1192
1234
|
case 'execute-empire-payload':
|
|
@@ -1201,7 +1243,7 @@ export class SequencerPublisher {
|
|
|
1201
1243
|
}
|
|
1202
1244
|
const empireSlashingProposer = this.slashingProposerContract;
|
|
1203
1245
|
const request = empireSlashingProposer.buildExecuteRoundRequest(action.round);
|
|
1204
|
-
await this.simulateAndEnqueueRequest('execute-empire-payload', request, (receipt)=>!!empireSlashingProposer.tryExtractPayloadSubmittedEvent(receipt.logs), slotNumber
|
|
1246
|
+
await this.simulateAndEnqueueRequest('execute-empire-payload', request, (receipt)=>!!empireSlashingProposer.tryExtractPayloadSubmittedEvent(receipt.logs), slotNumber);
|
|
1205
1247
|
break;
|
|
1206
1248
|
}
|
|
1207
1249
|
case 'vote-offenses':
|
|
@@ -1219,7 +1261,7 @@ export class SequencerPublisher {
|
|
|
1219
1261
|
const tallySlashingProposer = this.slashingProposerContract;
|
|
1220
1262
|
const votes = bufferToHex(encodeSlashConsensusVotes(action.votes));
|
|
1221
1263
|
const request = await tallySlashingProposer.buildVoteRequestFromSigner(votes, slotNumber, signer);
|
|
1222
|
-
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!tallySlashingProposer.tryExtractVoteCastEvent(receipt.logs), slotNumber
|
|
1264
|
+
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!tallySlashingProposer.tryExtractVoteCastEvent(receipt.logs), slotNumber);
|
|
1223
1265
|
break;
|
|
1224
1266
|
}
|
|
1225
1267
|
case 'execute-slash':
|
|
@@ -1235,7 +1277,7 @@ export class SequencerPublisher {
|
|
|
1235
1277
|
}
|
|
1236
1278
|
const tallySlashingProposer = this.slashingProposerContract;
|
|
1237
1279
|
const request = tallySlashingProposer.buildExecuteRoundRequest(action.round, action.committees);
|
|
1238
|
-
await this.simulateAndEnqueueRequest('execute-slash', request, (receipt)=>!!tallySlashingProposer.tryExtractRoundExecutedEvent(receipt.logs), slotNumber
|
|
1280
|
+
await this.simulateAndEnqueueRequest('execute-slash', request, (receipt)=>!!tallySlashingProposer.tryExtractRoundExecutedEvent(receipt.logs), slotNumber);
|
|
1239
1281
|
break;
|
|
1240
1282
|
}
|
|
1241
1283
|
default:
|
|
@@ -1259,14 +1301,13 @@ export class SequencerPublisher {
|
|
|
1259
1301
|
attestationsAndSignersSignature,
|
|
1260
1302
|
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
1261
1303
|
};
|
|
1262
|
-
let ts;
|
|
1263
1304
|
try {
|
|
1264
1305
|
// @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
|
|
1265
1306
|
// This means that we can avoid the simulation issues in later checks.
|
|
1266
1307
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
1267
1308
|
// make time consistency checks break.
|
|
1268
1309
|
// TODO(palla): Check whether we're validating twice, once here and once within addProposeTx, since we call simulateProposeTx in both places.
|
|
1269
|
-
|
|
1310
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts);
|
|
1270
1311
|
} catch (err) {
|
|
1271
1312
|
this.log.error(`Checkpoint validation failed. ${err instanceof Error ? err.message : 'No error message'}`, err, {
|
|
1272
1313
|
...checkpoint.getStats(),
|
|
@@ -1279,7 +1320,7 @@ export class SequencerPublisher {
|
|
|
1279
1320
|
...checkpoint.toCheckpointInfo(),
|
|
1280
1321
|
...opts
|
|
1281
1322
|
});
|
|
1282
|
-
await this.addProposeTx(checkpoint, proposeTxArgs, opts
|
|
1323
|
+
await this.addProposeTx(checkpoint, proposeTxArgs, opts);
|
|
1283
1324
|
}
|
|
1284
1325
|
enqueueInvalidateCheckpoint(request, opts = {}) {
|
|
1285
1326
|
if (!request) {
|
|
@@ -1320,7 +1361,8 @@ export class SequencerPublisher {
|
|
|
1320
1361
|
}
|
|
1321
1362
|
});
|
|
1322
1363
|
}
|
|
1323
|
-
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber
|
|
1364
|
+
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber) {
|
|
1365
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
1324
1366
|
const logData = {
|
|
1325
1367
|
slotNumber,
|
|
1326
1368
|
timestamp,
|
|
@@ -1342,7 +1384,7 @@ export class SequencerPublisher {
|
|
|
1342
1384
|
try {
|
|
1343
1385
|
({ gasUsed } = await this.l1TxUtils.simulate(request, {
|
|
1344
1386
|
time: timestamp
|
|
1345
|
-
}, [], simulateAbi));
|
|
1387
|
+
}, [], simulateAbi));
|
|
1346
1388
|
this.log.verbose(`Simulation for ${action} succeeded`, {
|
|
1347
1389
|
...logData,
|
|
1348
1390
|
request,
|
|
@@ -1417,13 +1459,14 @@ export class SequencerPublisher {
|
|
|
1417
1459
|
* A call to `restart` is required before you can continue publishing.
|
|
1418
1460
|
*/ interrupt() {
|
|
1419
1461
|
this.interrupted = true;
|
|
1462
|
+
this.interruptibleSleep.interrupt();
|
|
1420
1463
|
this.l1TxUtils.interrupt();
|
|
1421
1464
|
}
|
|
1422
1465
|
/** Restarts the publisher after calling `interrupt`. */ restart() {
|
|
1423
1466
|
this.interrupted = false;
|
|
1424
1467
|
this.l1TxUtils.restart();
|
|
1425
1468
|
}
|
|
1426
|
-
async prepareProposeTx(encodedData,
|
|
1469
|
+
async prepareProposeTx(encodedData, options) {
|
|
1427
1470
|
const kzg = Blob.getViemKzgInstance();
|
|
1428
1471
|
const blobInput = getPrefixedEthBlobCommitments(encodedData.blobs);
|
|
1429
1472
|
this.log.debug('Validating blob input', {
|
|
@@ -1500,7 +1543,7 @@ export class SequencerPublisher {
|
|
|
1500
1543
|
encodedData.attestationsAndSignersSignature.toViemSignature(),
|
|
1501
1544
|
blobInput
|
|
1502
1545
|
];
|
|
1503
|
-
const { rollupData, simulationResult } = await this.simulateProposeTx(args,
|
|
1546
|
+
const { rollupData, simulationResult } = await this.simulateProposeTx(args, options);
|
|
1504
1547
|
return {
|
|
1505
1548
|
args,
|
|
1506
1549
|
blobEvaluationGas,
|
|
@@ -1511,16 +1554,17 @@ export class SequencerPublisher {
|
|
|
1511
1554
|
/**
|
|
1512
1555
|
* Simulates the propose tx with eth_simulateV1
|
|
1513
1556
|
* @param args - The propose tx args
|
|
1514
|
-
* @param timestamp - The timestamp to simulate proposal at
|
|
1515
1557
|
* @returns The simulation result
|
|
1516
|
-
*/ async simulateProposeTx(args,
|
|
1558
|
+
*/ async simulateProposeTx(args, options) {
|
|
1517
1559
|
const rollupData = encodeFunctionData({
|
|
1518
1560
|
abi: RollupAbi,
|
|
1519
1561
|
functionName: 'propose',
|
|
1520
1562
|
args
|
|
1521
1563
|
});
|
|
1522
|
-
// override the
|
|
1564
|
+
// override the proposed checkpoint number if requested
|
|
1523
1565
|
const forcePendingCheckpointNumberStateDiff = (options.forcePendingCheckpointNumber !== undefined ? await this.rollupContract.makePendingCheckpointNumberOverride(options.forcePendingCheckpointNumber) : []).flatMap((override)=>override.stateDiff ?? []);
|
|
1566
|
+
// override the fee header for a specific checkpoint number if requested (used when pipelining)
|
|
1567
|
+
const forceProposedFeeHeaderStateDiff = (options.forceProposedFeeHeader !== undefined ? await this.rollupContract.makeFeeHeaderOverride(options.forceProposedFeeHeader.checkpointNumber, options.forceProposedFeeHeader.feeHeader) : []).flatMap((override)=>override.stateDiff ?? []);
|
|
1524
1568
|
const stateOverrides = [
|
|
1525
1569
|
{
|
|
1526
1570
|
address: this.rollupContract.address,
|
|
@@ -1530,7 +1574,8 @@ export class SequencerPublisher {
|
|
|
1530
1574
|
slot: toPaddedHex(RollupContract.checkBlobStorageSlot, true),
|
|
1531
1575
|
value: toPaddedHex(0n, true)
|
|
1532
1576
|
},
|
|
1533
|
-
...forcePendingCheckpointNumberStateDiff
|
|
1577
|
+
...forcePendingCheckpointNumberStateDiff,
|
|
1578
|
+
...forceProposedFeeHeaderStateDiff
|
|
1534
1579
|
]
|
|
1535
1580
|
}
|
|
1536
1581
|
];
|
|
@@ -1542,6 +1587,7 @@ export class SequencerPublisher {
|
|
|
1542
1587
|
});
|
|
1543
1588
|
}
|
|
1544
1589
|
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1590
|
+
const simTs = this.getSimulationTimestamp(SlotNumber.fromBigInt(args[0].header.slotNumber));
|
|
1545
1591
|
const simulationResult = await this.l1TxUtils.simulate({
|
|
1546
1592
|
to: this.rollupContract.address,
|
|
1547
1593
|
data: rollupData,
|
|
@@ -1550,8 +1596,7 @@ export class SequencerPublisher {
|
|
|
1550
1596
|
from: this.proposerAddressForSimulation.toString()
|
|
1551
1597
|
}
|
|
1552
1598
|
}, {
|
|
1553
|
-
|
|
1554
|
-
time: timestamp + 1n,
|
|
1599
|
+
time: simTs,
|
|
1555
1600
|
// @note reth should have a 30m gas limit per block but throws errors that this tx is beyond limit so we increase here
|
|
1556
1601
|
gasLimit: MAX_L1_TX_LIMIT * 2n
|
|
1557
1602
|
}, stateOverrides, RollupAbi, {
|
|
@@ -1568,7 +1613,9 @@ export class SequencerPublisher {
|
|
|
1568
1613
|
logs: []
|
|
1569
1614
|
};
|
|
1570
1615
|
}
|
|
1571
|
-
this.log.error(`Failed to simulate propose tx`, viemError
|
|
1616
|
+
this.log.error(`Failed to simulate propose tx`, viemError, {
|
|
1617
|
+
simulationTimestamp: simTs
|
|
1618
|
+
});
|
|
1572
1619
|
this.backupFailedTx({
|
|
1573
1620
|
id: keccak256(rollupData),
|
|
1574
1621
|
failureType: 'simulation',
|
|
@@ -1596,11 +1643,11 @@ export class SequencerPublisher {
|
|
|
1596
1643
|
simulationResult
|
|
1597
1644
|
};
|
|
1598
1645
|
}
|
|
1599
|
-
async addProposeTx(checkpoint, encodedData, opts = {}
|
|
1646
|
+
async addProposeTx(checkpoint, encodedData, opts = {}) {
|
|
1600
1647
|
const slot = checkpoint.header.slotNumber;
|
|
1601
1648
|
const timer = new Timer();
|
|
1602
1649
|
const kzg = Blob.getViemKzgInstance();
|
|
1603
|
-
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData,
|
|
1650
|
+
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, opts);
|
|
1604
1651
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
1605
1652
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
1606
1653
|
// Send the blobs to the blob client preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
@@ -1665,4 +1712,13 @@ export class SequencerPublisher {
|
|
|
1665
1712
|
}
|
|
1666
1713
|
});
|
|
1667
1714
|
}
|
|
1715
|
+
/** Returns the timestamp of the last L1 slot within a given L2 slot. Used as the simulation timestamp
|
|
1716
|
+
* for eth_simulateV1 calls, since it's guaranteed to be greater than any L1 block produced during the slot. */ getSimulationTimestamp(slot) {
|
|
1717
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
1718
|
+
return getLastL1SlotTimestampForL2Slot(slot, l1Constants);
|
|
1719
|
+
}
|
|
1720
|
+
/** Returns the timestamp of the next L1 slot boundary after now. */ getNextL1SlotTimestamp() {
|
|
1721
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
1722
|
+
return getNextL1SlotTimestamp(this.dateProvider.nowInSeconds(), l1Constants);
|
|
1723
|
+
}
|
|
1668
1724
|
}
|
|
@@ -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
|
|
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';
|
|
@@ -27,8 +28,9 @@ import { SequencerState } from './utils.js';
|
|
|
27
28
|
* the Sequencer once the check for being the proposer for the slot has succeeded.
|
|
28
29
|
*/
|
|
29
30
|
export declare class CheckpointProposalJob implements Traceable {
|
|
30
|
-
private readonly
|
|
31
|
-
private readonly
|
|
31
|
+
private readonly slotNow;
|
|
32
|
+
private readonly targetSlot;
|
|
33
|
+
private readonly targetEpoch;
|
|
32
34
|
private readonly checkpointNumber;
|
|
33
35
|
private readonly syncedToBlockNumber;
|
|
34
36
|
private readonly proposer;
|
|
@@ -53,15 +55,27 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
53
55
|
private readonly eventEmitter;
|
|
54
56
|
private readonly setStateFn;
|
|
55
57
|
readonly tracer: Tracer;
|
|
58
|
+
private readonly proposedCheckpointData?;
|
|
56
59
|
protected readonly log: Logger;
|
|
57
|
-
|
|
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>;
|
|
58
67
|
/**
|
|
59
68
|
* Executes the checkpoint proposal job.
|
|
60
|
-
*
|
|
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.
|
|
61
72
|
*/
|
|
62
73
|
execute(): Promise<Checkpoint | undefined>;
|
|
74
|
+
private enqueueCheckpointForSubmission;
|
|
63
75
|
private proposeCheckpoint;
|
|
64
76
|
private buildBlocksForCheckpoint;
|
|
77
|
+
/** Creates a block proposal for a given block via the validator client (unless in fisherman mode) */
|
|
78
|
+
private createBlockProposal;
|
|
65
79
|
private waitUntilNextSubslot;
|
|
66
80
|
/** Builds a single block. Called from the main block building loop. */
|
|
67
81
|
protected buildSingleBlock(checkpointBuilder: CheckpointBuilder, opts: {
|
|
@@ -71,11 +85,9 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
71
85
|
indexWithinCheckpoint: IndexWithinCheckpoint;
|
|
72
86
|
buildDeadline: Date | undefined;
|
|
73
87
|
txHashesAlreadyIncluded: Set<string>;
|
|
74
|
-
remainingBlobFields: number;
|
|
75
88
|
}): Promise<{
|
|
76
89
|
block: L2Block;
|
|
77
90
|
usedTxs: Tx[];
|
|
78
|
-
remainingBlobFields: number;
|
|
79
91
|
} | {
|
|
80
92
|
error: Error;
|
|
81
93
|
} | undefined>;
|
|
@@ -91,6 +103,19 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
91
103
|
* Helper to handle HA double-signing errors. Returns true if the error was handled (caller should yield).
|
|
92
104
|
*/
|
|
93
105
|
private handleHASigningError;
|
|
106
|
+
/**
|
|
107
|
+
* In times of congestion we need to simulate using the correct fee header override for the previous block
|
|
108
|
+
* We calculate the correct fee header values.
|
|
109
|
+
*
|
|
110
|
+
* If we are in block 1, or the checkpoint we are querying does not exist, we return undefined. However
|
|
111
|
+
* If we are pipelining - where this function is called, the grandparentCheckpointNumber should always exist
|
|
112
|
+
* @param parentCheckpointNumber
|
|
113
|
+
* @returns
|
|
114
|
+
*/
|
|
115
|
+
protected computeForceProposedFeeHeader(parentCheckpointNumber: CheckpointNumber): Promise<{
|
|
116
|
+
checkpointNumber: CheckpointNumber;
|
|
117
|
+
feeHeader: FeeHeader;
|
|
118
|
+
} | undefined>;
|
|
94
119
|
/** Waits until a specific time within the current slot */
|
|
95
120
|
protected waitUntilTimeInSlot(targetSecondsIntoSlot: number): Promise<void>;
|
|
96
121
|
/** Waits the polling interval for transactions. Extracted for test overriding. */
|
|
@@ -99,4 +124,4 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
99
124
|
private getSecondsIntoSlot;
|
|
100
125
|
getPublisher(): SequencerPublisher;
|
|
101
126
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
127
|
+
//# 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":"
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"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"}
|