@aztec/sequencer-client 0.0.1-commit.86469d5 → 0.0.1-commit.88c5703d4
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 +24 -7
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +101 -16
- package/dest/config.d.ts +25 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +49 -28
- package/dest/global_variable_builder/global_builder.d.ts +2 -4
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +5 -4
- package/dest/publisher/config.d.ts +35 -17
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +106 -42
- package/dest/publisher/index.d.ts +2 -1
- package/dest/publisher/index.d.ts.map +1 -1
- package/dest/publisher/l1_tx_failed_store/factory.d.ts +11 -0
- package/dest/publisher/l1_tx_failed_store/factory.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/factory.js +22 -0
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts +59 -0
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.js +1 -0
- package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.d.ts +15 -0
- package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.js +34 -0
- package/dest/publisher/l1_tx_failed_store/index.d.ts +4 -0
- package/dest/publisher/l1_tx_failed_store/index.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/index.js +2 -0
- package/dest/publisher/sequencer-publisher-factory.d.ts +11 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +27 -2
- package/dest/publisher/sequencer-publisher.d.ts +26 -7
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +310 -31
- package/dest/sequencer/checkpoint_proposal_job.d.ts +4 -4
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +126 -74
- package/dest/sequencer/metrics.d.ts +17 -5
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +86 -15
- package/dest/sequencer/sequencer.d.ts +28 -13
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +41 -40
- package/dest/sequencer/timetable.d.ts +4 -6
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +7 -11
- package/dest/sequencer/types.d.ts +2 -2
- package/dest/sequencer/types.d.ts.map +1 -1
- package/dest/test/index.d.ts +3 -5
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.d.ts +14 -10
- package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.js +45 -34
- package/dest/test/utils.d.ts +3 -3
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +5 -4
- package/package.json +27 -28
- package/src/client/sequencer-client.ts +135 -18
- package/src/config.ts +64 -38
- package/src/global_variable_builder/global_builder.ts +4 -3
- package/src/publisher/config.ts +121 -43
- package/src/publisher/index.ts +3 -0
- package/src/publisher/l1_tx_failed_store/factory.ts +32 -0
- package/src/publisher/l1_tx_failed_store/failed_tx_store.ts +55 -0
- package/src/publisher/l1_tx_failed_store/file_store_failed_tx_store.ts +46 -0
- package/src/publisher/l1_tx_failed_store/index.ts +3 -0
- package/src/publisher/sequencer-publisher-factory.ts +38 -6
- package/src/publisher/sequencer-publisher.ts +311 -44
- package/src/sequencer/checkpoint_proposal_job.ts +173 -78
- package/src/sequencer/metrics.ts +92 -18
- package/src/sequencer/sequencer.ts +52 -46
- package/src/sequencer/timetable.ts +13 -12
- package/src/sequencer/types.ts +1 -1
- package/src/test/index.ts +2 -4
- package/src/test/mock_checkpoint_builder.ts +62 -48
- package/src/test/utils.ts +5 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,KAAK,8BAA8B,
|
|
1
|
+
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -372,24 +372,28 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
372
372
|
}
|
|
373
373
|
var _dec, _dec1, _dec2, _initProto;
|
|
374
374
|
import { Blob, getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
375
|
-
import { MULTI_CALL_3_ADDRESS, Multicall3, RollupContract } from '@aztec/ethereum/contracts';
|
|
375
|
+
import { FeeAssetPriceOracle, MULTI_CALL_3_ADDRESS, Multicall3, RollupContract } from '@aztec/ethereum/contracts';
|
|
376
376
|
import { L1FeeAnalyzer } from '@aztec/ethereum/l1-fee-analysis';
|
|
377
377
|
import { MAX_L1_TX_LIMIT, WEI_CONST } from '@aztec/ethereum/l1-tx-utils';
|
|
378
378
|
import { FormattedViemError, formatViemError, mergeAbis, tryExtractEvent } from '@aztec/ethereum/utils';
|
|
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';
|
|
384
|
+
import { TimeoutError } from '@aztec/foundation/error';
|
|
383
385
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
384
386
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
385
387
|
import { createLogger } from '@aztec/foundation/log';
|
|
388
|
+
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
386
389
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
387
390
|
import { Timer } from '@aztec/foundation/timer';
|
|
388
391
|
import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
389
392
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
390
393
|
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
391
394
|
import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
392
|
-
import { encodeFunctionData, toHex } from 'viem';
|
|
395
|
+
import { encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
|
|
396
|
+
import { createL1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
393
397
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
394
398
|
export const Actions = [
|
|
395
399
|
'invalidate-by-invalid-attestation',
|
|
@@ -429,15 +433,19 @@ export class SequencerPublisher {
|
|
|
429
433
|
interrupted;
|
|
430
434
|
metrics;
|
|
431
435
|
epochCache;
|
|
436
|
+
failedTxStore;
|
|
432
437
|
governanceLog;
|
|
433
438
|
slashingLog;
|
|
434
439
|
lastActions;
|
|
435
440
|
isPayloadEmptyCache;
|
|
441
|
+
payloadProposedCache;
|
|
436
442
|
log;
|
|
437
443
|
ethereumSlotDuration;
|
|
438
444
|
blobClient;
|
|
439
445
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
446
|
+
/** Optional callback to obtain a replacement publisher when the current one fails to send. */ getNextPublisher;
|
|
440
447
|
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
448
|
+
/** Fee asset price oracle for computing price modifiers from Uniswap V4 */ feeAssetPriceOracle;
|
|
441
449
|
// A CALL to a cold address is 2700 gas
|
|
442
450
|
static MULTICALL_OVERHEAD_GAS_GUESS = 5000n;
|
|
443
451
|
// Gas report for VotingWithSigTest shows a max gas of 100k, but we've seen it cost 700k+ in testnet
|
|
@@ -456,6 +464,7 @@ export class SequencerPublisher {
|
|
|
456
464
|
this.slashingLog = createLogger('sequencer:publisher:slashing');
|
|
457
465
|
this.lastActions = {};
|
|
458
466
|
this.isPayloadEmptyCache = new Map();
|
|
467
|
+
this.payloadProposedCache = new Set();
|
|
459
468
|
this.requests = [];
|
|
460
469
|
this.log = deps.log ?? createLogger('sequencer:publisher');
|
|
461
470
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
@@ -466,6 +475,7 @@ export class SequencerPublisher {
|
|
|
466
475
|
this.metrics = deps.metrics ?? new SequencerPublisherMetrics(telemetry, 'SequencerPublisher');
|
|
467
476
|
this.tracer = telemetry.getTracer('SequencerPublisher');
|
|
468
477
|
this.l1TxUtils = deps.l1TxUtils;
|
|
478
|
+
this.getNextPublisher = deps.getNextPublisher;
|
|
469
479
|
this.rollupContract = deps.rollupContract;
|
|
470
480
|
this.govProposerContract = deps.governanceProposerContract;
|
|
471
481
|
this.slashingProposerContract = deps.slashingProposerContract;
|
|
@@ -479,10 +489,36 @@ export class SequencerPublisher {
|
|
|
479
489
|
if (config.fishermanMode) {
|
|
480
490
|
this.l1FeeAnalyzer = new L1FeeAnalyzer(this.l1TxUtils.client, deps.dateProvider, createLogger('sequencer:publisher:fee-analyzer'));
|
|
481
491
|
}
|
|
492
|
+
// Initialize fee asset price oracle
|
|
493
|
+
this.feeAssetPriceOracle = new FeeAssetPriceOracle(this.l1TxUtils.client, this.rollupContract, createLogger('sequencer:publisher:price-oracle'));
|
|
494
|
+
// Initialize failed L1 tx store (optional, for test networks)
|
|
495
|
+
this.failedTxStore = createL1TxFailedStore(config.l1TxFailedStore, this.log);
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Backs up a failed L1 transaction to the configured store for debugging.
|
|
499
|
+
* Does nothing if no store is configured.
|
|
500
|
+
*/ backupFailedTx(failedTx) {
|
|
501
|
+
if (!this.failedTxStore) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
const tx = {
|
|
505
|
+
...failedTx,
|
|
506
|
+
timestamp: Date.now()
|
|
507
|
+
};
|
|
508
|
+
// Fire and forget - don't block on backup
|
|
509
|
+
void this.failedTxStore.then((store)=>store?.saveFailedTx(tx)).catch((err)=>{
|
|
510
|
+
this.log.warn(`Failed to backup failed L1 tx to store`, err);
|
|
511
|
+
});
|
|
482
512
|
}
|
|
483
513
|
getRollupContract() {
|
|
484
514
|
return this.rollupContract;
|
|
485
515
|
}
|
|
516
|
+
/**
|
|
517
|
+
* Gets the fee asset price modifier from the oracle.
|
|
518
|
+
* Returns 0n if the oracle query fails.
|
|
519
|
+
*/ getFeeAssetPriceModifier() {
|
|
520
|
+
return this.feeAssetPriceOracle.computePriceModifier();
|
|
521
|
+
}
|
|
486
522
|
getSenderAddress() {
|
|
487
523
|
return this.l1TxUtils.getSenderAddress();
|
|
488
524
|
}
|
|
@@ -618,12 +654,34 @@ export class SequencerPublisher {
|
|
|
618
654
|
// This ensures the committee gets precomputed correctly
|
|
619
655
|
validRequests.sort((a, b)=>compareActions(a.action, b.action));
|
|
620
656
|
try {
|
|
657
|
+
// Capture context for failed tx backup before sending
|
|
658
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
659
|
+
const multicallData = encodeFunctionData({
|
|
660
|
+
abi: multicall3Abi,
|
|
661
|
+
functionName: 'aggregate3',
|
|
662
|
+
args: [
|
|
663
|
+
validRequests.map((r)=>({
|
|
664
|
+
target: r.request.to,
|
|
665
|
+
callData: r.request.data,
|
|
666
|
+
allowFailure: true
|
|
667
|
+
}))
|
|
668
|
+
]
|
|
669
|
+
});
|
|
670
|
+
const blobDataHex = blobConfig?.blobs?.map((b)=>toHex(b));
|
|
671
|
+
const txContext = {
|
|
672
|
+
multicallData,
|
|
673
|
+
blobData: blobDataHex,
|
|
674
|
+
l1BlockNumber
|
|
675
|
+
};
|
|
621
676
|
this.log.debug('Forwarding transactions', {
|
|
622
677
|
validRequests: validRequests.map((request)=>request.action),
|
|
623
678
|
txConfig
|
|
624
679
|
});
|
|
625
|
-
const result = await
|
|
626
|
-
|
|
680
|
+
const result = await this.forwardWithPublisherRotation(validRequests, txConfig, blobConfig);
|
|
681
|
+
if (result === undefined) {
|
|
682
|
+
return undefined;
|
|
683
|
+
}
|
|
684
|
+
const { successfulActions = [], failedActions = [] } = this.callbackBundledTransactions(validRequests, result, txContext);
|
|
627
685
|
return {
|
|
628
686
|
result,
|
|
629
687
|
expiredActions,
|
|
@@ -643,17 +701,83 @@ export class SequencerPublisher {
|
|
|
643
701
|
}
|
|
644
702
|
}
|
|
645
703
|
}
|
|
646
|
-
|
|
704
|
+
/**
|
|
705
|
+
* Forwards transactions via Multicall3, rotating to the next available publisher if a send
|
|
706
|
+
* failure occurs (i.e. the tx never reached the chain).
|
|
707
|
+
* On-chain reverts and simulation errors are returned as-is without rotation.
|
|
708
|
+
*/ async forwardWithPublisherRotation(validRequests, txConfig, blobConfig) {
|
|
709
|
+
const triedAddresses = [];
|
|
710
|
+
let currentPublisher = this.l1TxUtils;
|
|
711
|
+
while(true){
|
|
712
|
+
triedAddresses.push(currentPublisher.getSenderAddress());
|
|
713
|
+
try {
|
|
714
|
+
const result = await Multicall3.forward(validRequests.map((r)=>r.request), currentPublisher, txConfig, blobConfig, this.rollupContract.address, this.log);
|
|
715
|
+
this.l1TxUtils = currentPublisher;
|
|
716
|
+
return result;
|
|
717
|
+
} catch (err) {
|
|
718
|
+
if (err instanceof TimeoutError) {
|
|
719
|
+
throw err;
|
|
720
|
+
}
|
|
721
|
+
const viemError = formatViemError(err);
|
|
722
|
+
if (!this.getNextPublisher) {
|
|
723
|
+
this.log.error('Failed to publish bundled transactions', viemError);
|
|
724
|
+
return undefined;
|
|
725
|
+
}
|
|
726
|
+
this.log.warn(`Publisher ${currentPublisher.getSenderAddress()} failed to send, rotating to next publisher`, viemError);
|
|
727
|
+
const nextPublisher = await this.getNextPublisher([
|
|
728
|
+
...triedAddresses
|
|
729
|
+
]);
|
|
730
|
+
if (!nextPublisher) {
|
|
731
|
+
this.log.error('All available publishers exhausted, failed to publish bundled transactions');
|
|
732
|
+
return undefined;
|
|
733
|
+
}
|
|
734
|
+
currentPublisher = nextPublisher;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
callbackBundledTransactions(requests, result, txContext) {
|
|
647
739
|
const actionsListStr = requests.map((r)=>r.action).join(', ');
|
|
648
740
|
if (result instanceof FormattedViemError) {
|
|
649
741
|
this.log.error(`Failed to publish bundled transactions (${actionsListStr})`, result);
|
|
742
|
+
this.backupFailedTx({
|
|
743
|
+
id: keccak256(txContext.multicallData),
|
|
744
|
+
failureType: 'send-error',
|
|
745
|
+
request: {
|
|
746
|
+
to: MULTI_CALL_3_ADDRESS,
|
|
747
|
+
data: txContext.multicallData
|
|
748
|
+
},
|
|
749
|
+
blobData: txContext.blobData,
|
|
750
|
+
l1BlockNumber: txContext.l1BlockNumber.toString(),
|
|
751
|
+
error: {
|
|
752
|
+
message: result.message,
|
|
753
|
+
name: result.name
|
|
754
|
+
},
|
|
755
|
+
context: {
|
|
756
|
+
actions: requests.map((r)=>r.action),
|
|
757
|
+
requests: requests.map((r)=>({
|
|
758
|
+
action: r.action,
|
|
759
|
+
to: r.request.to,
|
|
760
|
+
data: r.request.data
|
|
761
|
+
})),
|
|
762
|
+
sender: this.getSenderAddress().toString()
|
|
763
|
+
}
|
|
764
|
+
});
|
|
650
765
|
return {
|
|
651
766
|
failedActions: requests.map((r)=>r.action)
|
|
652
767
|
};
|
|
653
768
|
} else {
|
|
654
769
|
this.log.verbose(`Published bundled transactions (${actionsListStr})`, {
|
|
655
770
|
result,
|
|
656
|
-
requests
|
|
771
|
+
requests: requests.map((r)=>({
|
|
772
|
+
...r,
|
|
773
|
+
// Avoid logging large blob data
|
|
774
|
+
blobConfig: r.blobConfig ? {
|
|
775
|
+
...r.blobConfig,
|
|
776
|
+
blobs: r.blobConfig.blobs.map((b)=>({
|
|
777
|
+
size: trimmedBytesLength(b)
|
|
778
|
+
}))
|
|
779
|
+
} : undefined
|
|
780
|
+
}))
|
|
657
781
|
});
|
|
658
782
|
const successfulActions = [];
|
|
659
783
|
const failedActions = [];
|
|
@@ -664,6 +788,37 @@ export class SequencerPublisher {
|
|
|
664
788
|
failedActions.push(request.action);
|
|
665
789
|
}
|
|
666
790
|
}
|
|
791
|
+
// Single backup for the whole reverted tx
|
|
792
|
+
if (failedActions.length > 0 && result?.receipt?.status === 'reverted') {
|
|
793
|
+
this.backupFailedTx({
|
|
794
|
+
id: result.receipt.transactionHash,
|
|
795
|
+
failureType: 'revert',
|
|
796
|
+
request: {
|
|
797
|
+
to: MULTI_CALL_3_ADDRESS,
|
|
798
|
+
data: txContext.multicallData
|
|
799
|
+
},
|
|
800
|
+
blobData: txContext.blobData,
|
|
801
|
+
l1BlockNumber: result.receipt.blockNumber.toString(),
|
|
802
|
+
receipt: {
|
|
803
|
+
transactionHash: result.receipt.transactionHash,
|
|
804
|
+
blockNumber: result.receipt.blockNumber.toString(),
|
|
805
|
+
gasUsed: (result.receipt.gasUsed ?? 0n).toString(),
|
|
806
|
+
status: 'reverted'
|
|
807
|
+
},
|
|
808
|
+
error: {
|
|
809
|
+
message: result.errorMsg ?? 'Transaction reverted'
|
|
810
|
+
},
|
|
811
|
+
context: {
|
|
812
|
+
actions: failedActions,
|
|
813
|
+
requests: requests.filter((r)=>failedActions.includes(r.action)).map((r)=>({
|
|
814
|
+
action: r.action,
|
|
815
|
+
to: r.request.to,
|
|
816
|
+
data: r.request.data
|
|
817
|
+
})),
|
|
818
|
+
sender: this.getSenderAddress().toString()
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
}
|
|
667
822
|
return {
|
|
668
823
|
successfulActions,
|
|
669
824
|
failedActions
|
|
@@ -766,6 +921,7 @@ export class SequencerPublisher {
|
|
|
766
921
|
...logData,
|
|
767
922
|
request
|
|
768
923
|
});
|
|
924
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
769
925
|
try {
|
|
770
926
|
const { gasUsed } = await this.l1TxUtils.simulate(request, undefined, undefined, mergeAbis([
|
|
771
927
|
request.abi ?? [],
|
|
@@ -808,6 +964,27 @@ export class SequencerPublisher {
|
|
|
808
964
|
}
|
|
809
965
|
// Otherwise, throw. We cannot build the next checkpoint if we cannot invalidate the previous one.
|
|
810
966
|
this.log.error(`Simulation for invalidate checkpoint ${checkpointNumber} failed`, viemError, logData);
|
|
967
|
+
this.backupFailedTx({
|
|
968
|
+
id: keccak256(request.data),
|
|
969
|
+
failureType: 'simulation',
|
|
970
|
+
request: {
|
|
971
|
+
to: request.to,
|
|
972
|
+
data: request.data,
|
|
973
|
+
value: request.value?.toString()
|
|
974
|
+
},
|
|
975
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
976
|
+
error: {
|
|
977
|
+
message: viemError.message,
|
|
978
|
+
name: viemError.name
|
|
979
|
+
},
|
|
980
|
+
context: {
|
|
981
|
+
actions: [
|
|
982
|
+
`invalidate-${reason}`
|
|
983
|
+
],
|
|
984
|
+
checkpointNumber,
|
|
985
|
+
sender: this.getSenderAddress().toString()
|
|
986
|
+
}
|
|
987
|
+
});
|
|
811
988
|
throw new Error(`Failed to simulate invalidate checkpoint ${checkpointNumber}`, {
|
|
812
989
|
cause: viemError
|
|
813
990
|
});
|
|
@@ -835,29 +1012,15 @@ export class SequencerPublisher {
|
|
|
835
1012
|
}
|
|
836
1013
|
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
837
1014
|
const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
838
|
-
// TODO(palla/mbps): This should not be needed, there's no flow where we propose with zero attestations. Or is there?
|
|
839
|
-
// If we have no attestations, we still need to provide the empty attestations
|
|
840
|
-
// so that the committee is recalculated correctly
|
|
841
|
-
// const ignoreSignatures = attestationsAndSigners.attestations.length === 0;
|
|
842
|
-
// if (ignoreSignatures) {
|
|
843
|
-
// const { committee } = await this.epochCache.getCommittee(block.header.globalVariables.slotNumber);
|
|
844
|
-
// if (!committee) {
|
|
845
|
-
// this.log.warn(`No committee found for slot ${block.header.globalVariables.slotNumber}`);
|
|
846
|
-
// throw new Error(`No committee found for slot ${block.header.globalVariables.slotNumber}`);
|
|
847
|
-
// }
|
|
848
|
-
// attestationsAndSigners.attestations = committee.map(committeeMember =>
|
|
849
|
-
// CommitteeAttestation.fromAddress(committeeMember),
|
|
850
|
-
// );
|
|
851
|
-
// }
|
|
852
1015
|
const blobFields = checkpoint.toBlobFields();
|
|
853
|
-
const blobs = getBlobsPerL1Block(blobFields);
|
|
1016
|
+
const blobs = await getBlobsPerL1Block(blobFields);
|
|
854
1017
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
855
1018
|
const args = [
|
|
856
1019
|
{
|
|
857
1020
|
header: checkpoint.header.toViem(),
|
|
858
1021
|
archive: toHex(checkpoint.archive.root.toBuffer()),
|
|
859
1022
|
oracleInput: {
|
|
860
|
-
feeAssetPriceModifier:
|
|
1023
|
+
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
861
1024
|
}
|
|
862
1025
|
},
|
|
863
1026
|
attestationsAndSigners.getPackedAttestations(),
|
|
@@ -892,6 +1055,28 @@ export class SequencerPublisher {
|
|
|
892
1055
|
this.log.warn(`Skipping vote cast for payload with empty code`);
|
|
893
1056
|
return false;
|
|
894
1057
|
}
|
|
1058
|
+
// Check if payload was already submitted to governance
|
|
1059
|
+
const cacheKey = payload.toString();
|
|
1060
|
+
if (!this.payloadProposedCache.has(cacheKey)) {
|
|
1061
|
+
try {
|
|
1062
|
+
const l1StartBlock = await this.rollupContract.getL1StartBlock();
|
|
1063
|
+
const proposed = await retry(()=>base.hasPayloadBeenProposed(payload.toString(), l1StartBlock), 'Check if payload was proposed', makeBackoff([
|
|
1064
|
+
0,
|
|
1065
|
+
1,
|
|
1066
|
+
2
|
|
1067
|
+
]), this.log, true);
|
|
1068
|
+
if (proposed) {
|
|
1069
|
+
this.payloadProposedCache.add(cacheKey);
|
|
1070
|
+
}
|
|
1071
|
+
} catch (err) {
|
|
1072
|
+
this.log.warn(`Failed to check if payload ${payload} was proposed after retries, skipping signal`, err);
|
|
1073
|
+
return false;
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
if (this.payloadProposedCache.has(cacheKey)) {
|
|
1077
|
+
this.log.info(`Payload ${payload} was already proposed to governance, stopping signals`);
|
|
1078
|
+
return false;
|
|
1079
|
+
}
|
|
895
1080
|
const cachedLastVote = this.lastActions[signalType];
|
|
896
1081
|
this.lastActions[signalType] = slotNumber;
|
|
897
1082
|
const action = signalType;
|
|
@@ -902,6 +1087,7 @@ export class SequencerPublisher {
|
|
|
902
1087
|
signer: this.l1TxUtils.client.account?.address,
|
|
903
1088
|
lastValidL2Slot: slotNumber
|
|
904
1089
|
});
|
|
1090
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
905
1091
|
try {
|
|
906
1092
|
await this.l1TxUtils.simulate(request, {
|
|
907
1093
|
time: timestamp
|
|
@@ -913,7 +1099,29 @@ export class SequencerPublisher {
|
|
|
913
1099
|
request
|
|
914
1100
|
});
|
|
915
1101
|
} catch (err) {
|
|
916
|
-
|
|
1102
|
+
const viemError = formatViemError(err);
|
|
1103
|
+
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError);
|
|
1104
|
+
this.backupFailedTx({
|
|
1105
|
+
id: keccak256(request.data),
|
|
1106
|
+
failureType: 'simulation',
|
|
1107
|
+
request: {
|
|
1108
|
+
to: request.to,
|
|
1109
|
+
data: request.data,
|
|
1110
|
+
value: request.value?.toString()
|
|
1111
|
+
},
|
|
1112
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1113
|
+
error: {
|
|
1114
|
+
message: viemError.message,
|
|
1115
|
+
name: viemError.name
|
|
1116
|
+
},
|
|
1117
|
+
context: {
|
|
1118
|
+
actions: [
|
|
1119
|
+
action
|
|
1120
|
+
],
|
|
1121
|
+
slot: slotNumber,
|
|
1122
|
+
sender: this.getSenderAddress().toString()
|
|
1123
|
+
}
|
|
1124
|
+
});
|
|
917
1125
|
// Yes, we enqueue the request anyway, in case there was a bug with the simulation itself
|
|
918
1126
|
}
|
|
919
1127
|
// TODO(palla/slash): All votes (governance and slashing) should txTimeoutAt at the end of the slot.
|
|
@@ -1052,13 +1260,14 @@ export class SequencerPublisher {
|
|
|
1052
1260
|
/** Simulates and enqueues a proposal for a checkpoint on L1 */ async enqueueProposeCheckpoint(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts = {}) {
|
|
1053
1261
|
const checkpointHeader = checkpoint.header;
|
|
1054
1262
|
const blobFields = checkpoint.toBlobFields();
|
|
1055
|
-
const blobs = getBlobsPerL1Block(blobFields);
|
|
1263
|
+
const blobs = await getBlobsPerL1Block(blobFields);
|
|
1056
1264
|
const proposeTxArgs = {
|
|
1057
1265
|
header: checkpointHeader,
|
|
1058
1266
|
archive: checkpoint.archive.root.toBuffer(),
|
|
1059
1267
|
blobs,
|
|
1060
1268
|
attestationsAndSigners,
|
|
1061
|
-
attestationsAndSignersSignature
|
|
1269
|
+
attestationsAndSignersSignature,
|
|
1270
|
+
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
1062
1271
|
};
|
|
1063
1272
|
let ts;
|
|
1064
1273
|
try {
|
|
@@ -1134,6 +1343,7 @@ export class SequencerPublisher {
|
|
|
1134
1343
|
const cachedLastActionSlot = this.lastActions[action];
|
|
1135
1344
|
this.lastActions[action] = slotNumber;
|
|
1136
1345
|
this.log.debug(`Simulating ${action} for slot ${slotNumber}`, logData);
|
|
1346
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1137
1347
|
let gasUsed;
|
|
1138
1348
|
const simulateAbi = mergeAbis([
|
|
1139
1349
|
request.abi ?? [],
|
|
@@ -1151,6 +1361,27 @@ export class SequencerPublisher {
|
|
|
1151
1361
|
} catch (err) {
|
|
1152
1362
|
const viemError = formatViemError(err, simulateAbi);
|
|
1153
1363
|
this.log.error(`Simulation for ${action} at ${slotNumber} failed`, viemError, logData);
|
|
1364
|
+
this.backupFailedTx({
|
|
1365
|
+
id: keccak256(request.data),
|
|
1366
|
+
failureType: 'simulation',
|
|
1367
|
+
request: {
|
|
1368
|
+
to: request.to,
|
|
1369
|
+
data: request.data,
|
|
1370
|
+
value: request.value?.toString()
|
|
1371
|
+
},
|
|
1372
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1373
|
+
error: {
|
|
1374
|
+
message: viemError.message,
|
|
1375
|
+
name: viemError.name
|
|
1376
|
+
},
|
|
1377
|
+
context: {
|
|
1378
|
+
actions: [
|
|
1379
|
+
action
|
|
1380
|
+
],
|
|
1381
|
+
slot: slotNumber,
|
|
1382
|
+
sender: this.getSenderAddress().toString()
|
|
1383
|
+
}
|
|
1384
|
+
});
|
|
1154
1385
|
return false;
|
|
1155
1386
|
}
|
|
1156
1387
|
// We issued the simulation against the rollup contract, so we need to account for the overhead of the multicall3
|
|
@@ -1229,10 +1460,38 @@ export class SequencerPublisher {
|
|
|
1229
1460
|
}, {}, {
|
|
1230
1461
|
blobs: encodedData.blobs.map((b)=>b.data),
|
|
1231
1462
|
kzg
|
|
1232
|
-
}).catch((err)=>{
|
|
1233
|
-
const
|
|
1234
|
-
this.log.error(`Failed to validate blobs`, message, {
|
|
1235
|
-
metaMessages
|
|
1463
|
+
}).catch(async (err)=>{
|
|
1464
|
+
const viemError = formatViemError(err);
|
|
1465
|
+
this.log.error(`Failed to validate blobs`, viemError.message, {
|
|
1466
|
+
metaMessages: viemError.metaMessages
|
|
1467
|
+
});
|
|
1468
|
+
const validateBlobsData = encodeFunctionData({
|
|
1469
|
+
abi: RollupAbi,
|
|
1470
|
+
functionName: 'validateBlobs',
|
|
1471
|
+
args: [
|
|
1472
|
+
blobInput
|
|
1473
|
+
]
|
|
1474
|
+
});
|
|
1475
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1476
|
+
this.backupFailedTx({
|
|
1477
|
+
id: keccak256(validateBlobsData),
|
|
1478
|
+
failureType: 'simulation',
|
|
1479
|
+
request: {
|
|
1480
|
+
to: this.rollupContract.address,
|
|
1481
|
+
data: validateBlobsData
|
|
1482
|
+
},
|
|
1483
|
+
blobData: encodedData.blobs.map((b)=>toHex(b.data)),
|
|
1484
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1485
|
+
error: {
|
|
1486
|
+
message: viemError.message,
|
|
1487
|
+
name: viemError.name
|
|
1488
|
+
},
|
|
1489
|
+
context: {
|
|
1490
|
+
actions: [
|
|
1491
|
+
'validate-blobs'
|
|
1492
|
+
],
|
|
1493
|
+
sender: this.getSenderAddress().toString()
|
|
1494
|
+
}
|
|
1236
1495
|
});
|
|
1237
1496
|
throw new Error('Failed to validate blobs');
|
|
1238
1497
|
});
|
|
@@ -1243,8 +1502,7 @@ export class SequencerPublisher {
|
|
|
1243
1502
|
header: encodedData.header.toViem(),
|
|
1244
1503
|
archive: toHex(encodedData.archive),
|
|
1245
1504
|
oracleInput: {
|
|
1246
|
-
|
|
1247
|
-
feeAssetPriceModifier: 0n
|
|
1505
|
+
feeAssetPriceModifier: encodedData.feeAssetPriceModifier
|
|
1248
1506
|
}
|
|
1249
1507
|
},
|
|
1250
1508
|
encodedData.attestationsAndSigners.getPackedAttestations(),
|
|
@@ -1293,6 +1551,7 @@ export class SequencerPublisher {
|
|
|
1293
1551
|
balance: 10n * WEI_CONST * WEI_CONST
|
|
1294
1552
|
});
|
|
1295
1553
|
}
|
|
1554
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1296
1555
|
const simulationResult = await this.l1TxUtils.simulate({
|
|
1297
1556
|
to: this.rollupContract.address,
|
|
1298
1557
|
data: rollupData,
|
|
@@ -1320,6 +1579,26 @@ export class SequencerPublisher {
|
|
|
1320
1579
|
};
|
|
1321
1580
|
}
|
|
1322
1581
|
this.log.error(`Failed to simulate propose tx`, viemError);
|
|
1582
|
+
this.backupFailedTx({
|
|
1583
|
+
id: keccak256(rollupData),
|
|
1584
|
+
failureType: 'simulation',
|
|
1585
|
+
request: {
|
|
1586
|
+
to: this.rollupContract.address,
|
|
1587
|
+
data: rollupData
|
|
1588
|
+
},
|
|
1589
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1590
|
+
error: {
|
|
1591
|
+
message: viemError.message,
|
|
1592
|
+
name: viemError.name
|
|
1593
|
+
},
|
|
1594
|
+
context: {
|
|
1595
|
+
actions: [
|
|
1596
|
+
'propose'
|
|
1597
|
+
],
|
|
1598
|
+
slot: Number(args[0].header.slotNumber),
|
|
1599
|
+
sender: this.getSenderAddress().toString()
|
|
1600
|
+
}
|
|
1601
|
+
});
|
|
1323
1602
|
throw err;
|
|
1324
1603
|
});
|
|
1325
1604
|
return {
|
|
@@ -7,7 +7,7 @@ import { type TypedEventEmitter } from '@aztec/foundation/types';
|
|
|
7
7
|
import type { P2P } from '@aztec/p2p';
|
|
8
8
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
9
9
|
import { L2Block, type L2BlockSink, type L2BlockSource } from '@aztec/stdlib/block';
|
|
10
|
-
import type
|
|
10
|
+
import { type Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
11
11
|
import { type ResolvedSequencerConfig, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
12
12
|
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
13
13
|
import { Tx } from '@aztec/stdlib/tx';
|
|
@@ -71,11 +71,9 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
71
71
|
indexWithinCheckpoint: IndexWithinCheckpoint;
|
|
72
72
|
buildDeadline: Date | undefined;
|
|
73
73
|
txHashesAlreadyIncluded: Set<string>;
|
|
74
|
-
remainingBlobFields: number;
|
|
75
74
|
}): Promise<{
|
|
76
75
|
block: L2Block;
|
|
77
76
|
usedTxs: Tx[];
|
|
78
|
-
remainingBlobFields: number;
|
|
79
77
|
} | {
|
|
80
78
|
error: Error;
|
|
81
79
|
} | undefined>;
|
|
@@ -93,8 +91,10 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
93
91
|
private handleHASigningError;
|
|
94
92
|
/** Waits until a specific time within the current slot */
|
|
95
93
|
protected waitUntilTimeInSlot(targetSecondsIntoSlot: number): Promise<void>;
|
|
94
|
+
/** Waits the polling interval for transactions. Extracted for test overriding. */
|
|
95
|
+
protected waitForTxsPollingInterval(): Promise<void>;
|
|
96
96
|
private getSlotStartBuildTimestamp;
|
|
97
97
|
private getSecondsIntoSlot;
|
|
98
98
|
getPublisher(): SequencerPublisher;
|
|
99
99
|
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF9qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvY2hlY2twb2ludF9wcm9wb3NhbF9qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixVQUFVLEVBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQVF6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBQ3pGLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFHTCxPQUFPLEVBQ1AsS0FBSyxXQUFXLEVBQ2hCLEtBQUssYUFBYSxFQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBc0IsTUFBTSwwQkFBMEIsQ0FBQztBQUcvRSxPQUFPLEVBR0wsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxzQkFBc0IsRUFDNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBbUMsTUFBTSx5QkFBeUIsQ0FBQztBQUlwRyxPQUFPLEVBQWlCLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJELE9BQU8sRUFBYyxLQUFLLFNB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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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"}
|