@aztec/sequencer-client 0.76.4 → 0.77.0-testnet-ignition.21
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/index.js +0 -1
- package/dest/client/sequencer-client.d.ts +12 -9
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +55 -60
- package/dest/config.d.ts +2 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +41 -46
- package/dest/global_variable_builder/global_builder.d.ts +5 -2
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +45 -31
- package/dest/global_variable_builder/index.js +0 -1
- package/dest/index.js +0 -1
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +33 -48
- package/dest/publisher/index.js +0 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts +5 -2
- package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-metrics.js +47 -23
- package/dest/publisher/sequencer-publisher.d.ts +10 -9
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +191 -160
- package/dest/sequencer/allowed.d.ts +1 -1
- package/dest/sequencer/allowed.d.ts.map +1 -1
- package/dest/sequencer/allowed.js +6 -13
- package/dest/sequencer/config.d.ts +1 -1
- package/dest/sequencer/config.d.ts.map +1 -1
- package/dest/sequencer/config.js +1 -2
- package/dest/sequencer/index.js +0 -1
- package/dest/sequencer/metrics.js +26 -18
- package/dest/sequencer/sequencer.d.ts +18 -12
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +589 -560
- package/dest/sequencer/timetable.d.ts +1 -1
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +33 -19
- package/dest/sequencer/utils.d.ts +2 -2
- package/dest/sequencer/utils.d.ts.map +1 -1
- package/dest/sequencer/utils.js +22 -32
- package/dest/slasher/factory.d.ts +4 -8
- package/dest/slasher/factory.d.ts.map +1 -1
- package/dest/slasher/factory.js +5 -7
- package/dest/slasher/index.js +0 -1
- package/dest/slasher/slasher_client.d.ts +10 -62
- package/dest/slasher/slasher_client.d.ts.map +1 -1
- package/dest/slasher/slasher_client.js +47 -231
- package/dest/test/index.d.ts +3 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +4 -1
- package/dest/tx_validator/archive_cache.d.ts +3 -3
- package/dest/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/tx_validator/archive_cache.js +8 -8
- package/dest/tx_validator/gas_validator.d.ts +5 -3
- package/dest/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/tx_validator/gas_validator.js +70 -70
- package/dest/tx_validator/nullifier_cache.d.ts +2 -2
- package/dest/tx_validator/nullifier_cache.d.ts.map +1 -1
- package/dest/tx_validator/nullifier_cache.js +9 -9
- package/dest/tx_validator/phases_validator.d.ts +3 -2
- package/dest/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/tx_validator/phases_validator.js +29 -21
- package/dest/tx_validator/test_utils.d.ts +4 -2
- package/dest/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/tx_validator/test_utils.js +2 -3
- package/dest/tx_validator/tx_validator_factory.d.ts +7 -5
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.js +14 -13
- package/package.json +28 -29
- package/src/client/sequencer-client.ts +17 -14
- package/src/config.ts +6 -14
- package/src/global_variable_builder/global_builder.ts +18 -19
- package/src/publisher/config.ts +9 -17
- package/src/publisher/sequencer-publisher-metrics.ts +23 -2
- package/src/publisher/sequencer-publisher.ts +15 -17
- package/src/sequencer/allowed.ts +4 -4
- package/src/sequencer/config.ts +1 -1
- package/src/sequencer/sequencer.ts +40 -35
- package/src/sequencer/timetable.ts +1 -1
- package/src/sequencer/utils.ts +2 -2
- package/src/slasher/factory.ts +7 -13
- package/src/slasher/slasher_client.ts +30 -252
- package/src/test/index.ts +3 -3
- package/src/tx_validator/archive_cache.ts +4 -3
- package/src/tx_validator/gas_validator.ts +22 -31
- package/src/tx_validator/nullifier_cache.ts +3 -2
- package/src/tx_validator/phases_validator.ts +8 -8
- package/src/tx_validator/test_utils.ts +5 -3
- package/src/tx_validator/tx_validator_factory.ts +23 -17
|
@@ -1,34 +1,49 @@
|
|
|
1
1
|
import { Blob } from '@aztec/blob-lib';
|
|
2
2
|
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
3
|
-
import {
|
|
4
|
-
import { EthAddress } from '@aztec/circuits.js';
|
|
5
|
-
import { FormattedViemError, RollupContract, formatViemError, } from '@aztec/ethereum';
|
|
3
|
+
import { FormattedViemError, RollupContract, formatViemError } from '@aztec/ethereum';
|
|
6
4
|
import { toHex } from '@aztec/foundation/bigint-buffer';
|
|
5
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
7
|
import { Timer } from '@aztec/foundation/timer';
|
|
9
8
|
import { ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
9
|
+
import { ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayload } from '@aztec/stdlib/p2p';
|
|
10
10
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
11
11
|
import pick from 'lodash.pick';
|
|
12
12
|
import { encodeFunctionData } from 'viem';
|
|
13
13
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
14
|
-
export var VoteType
|
|
15
|
-
(function (VoteType) {
|
|
14
|
+
export var VoteType = /*#__PURE__*/ function(VoteType) {
|
|
16
15
|
VoteType[VoteType["GOVERNANCE"] = 0] = "GOVERNANCE";
|
|
17
16
|
VoteType[VoteType["SLASHING"] = 1] = "SLASHING";
|
|
18
|
-
|
|
17
|
+
return VoteType;
|
|
18
|
+
}({});
|
|
19
19
|
export class SequencerPublisher {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
interrupted = false;
|
|
21
|
+
metrics;
|
|
22
|
+
epochCache;
|
|
23
|
+
forwarderContract;
|
|
24
|
+
governanceLog = createLogger('sequencer:publisher:governance');
|
|
25
|
+
governanceProposerAddress;
|
|
26
|
+
governancePayload = EthAddress.ZERO;
|
|
27
|
+
slashingLog = createLogger('sequencer:publisher:slashing');
|
|
28
|
+
slashingProposerAddress;
|
|
29
|
+
getSlashPayload = undefined;
|
|
30
|
+
myLastVotes = {
|
|
31
|
+
[0]: 0n,
|
|
32
|
+
[1]: 0n
|
|
33
|
+
};
|
|
34
|
+
log = createLogger('sequencer:publisher');
|
|
35
|
+
ethereumSlotDuration;
|
|
36
|
+
blobSinkClient;
|
|
37
|
+
// @note - with blobs, the below estimate seems too large.
|
|
38
|
+
// Total used for full block from int_l1_pub e2e test: 1m (of which 86k is 1x blob)
|
|
39
|
+
// Total used for emptier block from above test: 429k (of which 84k is 1x blob)
|
|
40
|
+
static PROPOSE_GAS_GUESS = 12_000_000n;
|
|
41
|
+
l1TxUtils;
|
|
42
|
+
rollupContract;
|
|
43
|
+
govProposerContract;
|
|
44
|
+
slashingProposerContract;
|
|
45
|
+
requests = [];
|
|
46
|
+
constructor(config, deps){
|
|
32
47
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
33
48
|
this.epochCache = deps.epochCache;
|
|
34
49
|
this.blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config);
|
|
@@ -62,31 +77,32 @@ export class SequencerPublisher {
|
|
|
62
77
|
return this.epochCache.getEpochAndSlotNow().slot;
|
|
63
78
|
}
|
|
64
79
|
/**
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
80
|
+
* Sends all requests that are still valid.
|
|
81
|
+
* @returns one of:
|
|
82
|
+
* - A receipt and stats if the tx succeeded
|
|
83
|
+
* - a receipt and errorMsg if it failed on L1
|
|
84
|
+
* - undefined if no valid requests are found OR the tx failed to send.
|
|
85
|
+
*/ async sendRequests() {
|
|
86
|
+
const requestsToProcess = [
|
|
87
|
+
...this.requests
|
|
88
|
+
];
|
|
73
89
|
this.requests = [];
|
|
74
90
|
if (this.interrupted) {
|
|
75
91
|
return undefined;
|
|
76
92
|
}
|
|
77
93
|
const currentL2Slot = this.getCurrentL2Slot();
|
|
78
94
|
this.log.debug(`Current L2 slot: ${currentL2Slot}`);
|
|
79
|
-
const validRequests = requestsToProcess.filter(request
|
|
95
|
+
const validRequests = requestsToProcess.filter((request)=>request.lastValidL2Slot >= currentL2Slot);
|
|
80
96
|
if (validRequests.length !== requestsToProcess.length) {
|
|
81
97
|
this.log.warn(`Some requests were expired for slot ${currentL2Slot}`, {
|
|
82
|
-
validRequests: validRequests.map(request
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
requests: requestsToProcess.map(request
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
98
|
+
validRequests: validRequests.map((request)=>({
|
|
99
|
+
action: request.action,
|
|
100
|
+
lastValidL2Slot: request.lastValidL2Slot
|
|
101
|
+
})),
|
|
102
|
+
requests: requestsToProcess.map((request)=>({
|
|
103
|
+
action: request.action,
|
|
104
|
+
lastValidL2Slot: request.lastValidL2Slot
|
|
105
|
+
}))
|
|
90
106
|
});
|
|
91
107
|
}
|
|
92
108
|
if (validRequests.length === 0) {
|
|
@@ -96,8 +112,8 @@ export class SequencerPublisher {
|
|
|
96
112
|
// @note - we can only have one gas config and one blob config per bundle
|
|
97
113
|
// find requests with gas and blob configs
|
|
98
114
|
// See https://github.com/AztecProtocol/aztec-packages/issues/11513
|
|
99
|
-
const gasConfigs = requestsToProcess.filter(request
|
|
100
|
-
const blobConfigs = requestsToProcess.filter(request
|
|
115
|
+
const gasConfigs = requestsToProcess.filter((request)=>request.gasConfig);
|
|
116
|
+
const blobConfigs = requestsToProcess.filter((request)=>request.blobConfig);
|
|
101
117
|
if (gasConfigs.length > 1 || blobConfigs.length > 1) {
|
|
102
118
|
throw new Error('Multiple gas or blob configs found');
|
|
103
119
|
}
|
|
@@ -105,68 +121,75 @@ export class SequencerPublisher {
|
|
|
105
121
|
const blobConfig = blobConfigs[0]?.blobConfig;
|
|
106
122
|
try {
|
|
107
123
|
this.log.debug('Forwarding transactions', {
|
|
108
|
-
validRequests: validRequests.map(request
|
|
124
|
+
validRequests: validRequests.map((request)=>request.action)
|
|
109
125
|
});
|
|
110
|
-
const result = await this.forwarderContract.forward(validRequests.map(request
|
|
126
|
+
const result = await this.forwarderContract.forward(validRequests.map((request)=>request.request), this.l1TxUtils, gasConfig, blobConfig, this.log);
|
|
111
127
|
this.callbackBundledTransactions(validRequests, result);
|
|
112
128
|
return result;
|
|
113
|
-
}
|
|
114
|
-
catch (err) {
|
|
129
|
+
} catch (err) {
|
|
115
130
|
const viemError = formatViemError(err);
|
|
116
131
|
this.log.error(`Failed to publish bundled transactions`, viemError);
|
|
117
132
|
return undefined;
|
|
133
|
+
} finally{
|
|
134
|
+
try {
|
|
135
|
+
this.metrics.recordSenderBalance(await this.l1TxUtils.getSenderBalance(), this.l1TxUtils.getSenderAddress());
|
|
136
|
+
} catch (err) {
|
|
137
|
+
this.log.warn(`Failed to record balance after sending tx: ${err}`);
|
|
138
|
+
}
|
|
118
139
|
}
|
|
119
140
|
}
|
|
120
141
|
callbackBundledTransactions(requests, result) {
|
|
121
142
|
const success = result?.receipt.status === 'success';
|
|
122
143
|
const logger = success ? this.log.info : this.log.error;
|
|
123
|
-
for (const request of requests)
|
|
144
|
+
for (const request of requests){
|
|
124
145
|
logger(`Bundled [${request.action}] transaction [${success ? 'succeeded' : 'failed'}]`);
|
|
125
146
|
request.onResult?.(request.request, result);
|
|
126
147
|
}
|
|
127
148
|
}
|
|
128
149
|
/**
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
150
|
+
* @notice Will call `canProposeAtNextEthBlock` to make sure that it is possible to propose
|
|
151
|
+
* @param tipArchive - The archive to check
|
|
152
|
+
* @returns The slot and block number if it is possible to propose, undefined otherwise
|
|
153
|
+
*/ canProposeAtNextEthBlock(tipArchive) {
|
|
154
|
+
const ignoredErrors = [
|
|
155
|
+
'SlotAlreadyInChain',
|
|
156
|
+
'InvalidProposer',
|
|
157
|
+
'InvalidArchive'
|
|
158
|
+
];
|
|
159
|
+
return this.rollupContract.canProposeAtNextEthBlock(tipArchive, this.getForwarderAddress().toString(), this.ethereumSlotDuration).catch((err)=>{
|
|
160
|
+
if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
|
|
139
161
|
this.log.debug(err.message);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
162
|
+
} else {
|
|
142
163
|
this.log.error(err.name, err);
|
|
143
164
|
}
|
|
144
165
|
return undefined;
|
|
145
166
|
});
|
|
146
167
|
}
|
|
147
168
|
/**
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
async validateBlockForSubmission(header, attestationData = {
|
|
169
|
+
* @notice Will call `validateHeader` to make sure that it is possible to propose
|
|
170
|
+
*
|
|
171
|
+
* @dev Throws if unable to propose
|
|
172
|
+
*
|
|
173
|
+
* @param header - The header to propose
|
|
174
|
+
* @param digest - The digest that attestations are signing over
|
|
175
|
+
*
|
|
176
|
+
*/ async validateBlockForSubmission(header, attestationData = {
|
|
157
177
|
digest: Buffer.alloc(32),
|
|
158
|
-
signatures: []
|
|
178
|
+
signatures: []
|
|
159
179
|
}) {
|
|
160
180
|
const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
161
|
-
const formattedSignatures = attestationData.signatures.map(attest
|
|
162
|
-
const flags = {
|
|
181
|
+
const formattedSignatures = attestationData.signatures.map((attest)=>attest.toViemSignature());
|
|
182
|
+
const flags = {
|
|
183
|
+
ignoreDA: true,
|
|
184
|
+
ignoreSignatures: formattedSignatures.length == 0
|
|
185
|
+
};
|
|
163
186
|
const args = [
|
|
164
187
|
`0x${header.toBuffer().toString('hex')}`,
|
|
165
188
|
formattedSignatures,
|
|
166
189
|
`0x${attestationData.digest.toString('hex')}`,
|
|
167
190
|
ts,
|
|
168
191
|
`0x${header.contentCommitment.blobsHash.toString('hex')}`,
|
|
169
|
-
flags
|
|
192
|
+
flags
|
|
170
193
|
];
|
|
171
194
|
await this.rollupContract.validateHeader(args, this.getForwarderAddress().toString());
|
|
172
195
|
return ts;
|
|
@@ -185,7 +208,7 @@ export class SequencerPublisher {
|
|
|
185
208
|
const round = await base.computeRound(slotNumber);
|
|
186
209
|
const [proposer, roundInfo] = await Promise.all([
|
|
187
210
|
this.rollupContract.getProposerAt(timestamp),
|
|
188
|
-
base.getRoundInfo(this.rollupContract.address, round)
|
|
211
|
+
base.getRoundInfo(this.rollupContract.address, round)
|
|
189
212
|
]);
|
|
190
213
|
if (proposer.toLowerCase() !== this.getForwarderAddress().toString().toLowerCase()) {
|
|
191
214
|
return false;
|
|
@@ -196,25 +219,26 @@ export class SequencerPublisher {
|
|
|
196
219
|
const cachedLastVote = this.myLastVotes[voteType];
|
|
197
220
|
this.myLastVotes[voteType] = slotNumber;
|
|
198
221
|
this.addRequest({
|
|
199
|
-
action: voteType ===
|
|
222
|
+
action: voteType === 0 ? 'governance-vote' : 'slashing-vote',
|
|
200
223
|
request: base.createVoteRequest(payload.toString()),
|
|
201
224
|
lastValidL2Slot: slotNumber,
|
|
202
|
-
onResult: (_request, result)
|
|
225
|
+
onResult: (_request, result)=>{
|
|
203
226
|
if (!result || result.receipt.status !== 'success') {
|
|
204
227
|
this.myLastVotes[voteType] = cachedLastVote;
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
228
|
+
} else {
|
|
207
229
|
this.log.info(`Cast [${voteType}] vote for slot ${slotNumber}`);
|
|
208
230
|
}
|
|
209
|
-
}
|
|
231
|
+
}
|
|
210
232
|
});
|
|
211
233
|
return true;
|
|
212
234
|
}
|
|
213
235
|
async getVoteConfig(slotNumber, voteType) {
|
|
214
|
-
if (voteType ===
|
|
215
|
-
return {
|
|
216
|
-
|
|
217
|
-
|
|
236
|
+
if (voteType === 0) {
|
|
237
|
+
return {
|
|
238
|
+
payload: this.governancePayload,
|
|
239
|
+
base: this.govProposerContract
|
|
240
|
+
};
|
|
241
|
+
} else if (voteType === 1) {
|
|
218
242
|
if (!this.getSlashPayload) {
|
|
219
243
|
return undefined;
|
|
220
244
|
}
|
|
@@ -222,18 +246,20 @@ export class SequencerPublisher {
|
|
|
222
246
|
if (!slashPayload) {
|
|
223
247
|
return undefined;
|
|
224
248
|
}
|
|
225
|
-
return {
|
|
249
|
+
return {
|
|
250
|
+
payload: slashPayload,
|
|
251
|
+
base: this.slashingProposerContract
|
|
252
|
+
};
|
|
226
253
|
}
|
|
227
254
|
throw new Error('Unreachable: Invalid vote type');
|
|
228
255
|
}
|
|
229
256
|
/**
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
async enqueueCastVote(slotNumber, timestamp, voteType) {
|
|
257
|
+
* Enqueues a castVote transaction to cast a vote for a given slot number.
|
|
258
|
+
* @param slotNumber - The slot number to cast a vote for.
|
|
259
|
+
* @param timestamp - The timestamp of the slot to cast a vote for.
|
|
260
|
+
* @param voteType - The type of vote to cast.
|
|
261
|
+
* @returns True if the vote was successfully enqueued, false otherwise.
|
|
262
|
+
*/ async enqueueCastVote(slotNumber, timestamp, voteType) {
|
|
237
263
|
const voteConfig = await this.getVoteConfig(slotNumber, voteType);
|
|
238
264
|
if (!voteConfig) {
|
|
239
265
|
return false;
|
|
@@ -242,12 +268,11 @@ export class SequencerPublisher {
|
|
|
242
268
|
return this.enqueueCastVoteHelper(slotNumber, timestamp, voteType, payload, base);
|
|
243
269
|
}
|
|
244
270
|
/**
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
async enqueueProposeL2Block(block, attestations, txHashes, opts = {}) {
|
|
271
|
+
* Proposes a L2 block on L1.
|
|
272
|
+
*
|
|
273
|
+
* @param block - L2 block to propose.
|
|
274
|
+
* @returns True if the tx has been enqueued, throws otherwise. See #9315
|
|
275
|
+
*/ async enqueueProposeL2Block(block, attestations, txHashes, opts = {}) {
|
|
251
276
|
const consensusPayload = new ConsensusPayload(block.header, block.archive.root, txHashes ?? []);
|
|
252
277
|
const digest = await getHashedSignaturePayload(consensusPayload, SignatureDomainSeparator.blockAttestation);
|
|
253
278
|
const blobs = await Blob.getBlobs(block.body.toBlobFields());
|
|
@@ -258,7 +283,7 @@ export class SequencerPublisher {
|
|
|
258
283
|
body: block.body.toBuffer(),
|
|
259
284
|
blobs,
|
|
260
285
|
attestations,
|
|
261
|
-
txHashes: txHashes ?? []
|
|
286
|
+
txHashes: txHashes ?? []
|
|
262
287
|
};
|
|
263
288
|
// @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
|
|
264
289
|
// This means that we can avoid the simulation issues in later checks.
|
|
@@ -266,88 +291,92 @@ export class SequencerPublisher {
|
|
|
266
291
|
// make time consistency checks break.
|
|
267
292
|
const ts = await this.validateBlockForSubmission(block.header, {
|
|
268
293
|
digest: digest.toBuffer(),
|
|
269
|
-
signatures: attestations ?? []
|
|
294
|
+
signatures: attestations ?? []
|
|
270
295
|
});
|
|
271
296
|
this.log.debug(`Submitting propose transaction`);
|
|
272
297
|
await this.addProposeTx(block, proposeTxArgs, opts, ts);
|
|
273
298
|
return true;
|
|
274
299
|
}
|
|
275
300
|
/**
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
interrupt() {
|
|
301
|
+
* Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap.
|
|
302
|
+
* Be warned, the call may return false even if the tx subsequently gets successfully mined.
|
|
303
|
+
* In practice this shouldn't matter, as we'll only ever be calling `interrupt` when we know it's going to fail.
|
|
304
|
+
* A call to `restart` is required before you can continue publishing.
|
|
305
|
+
*/ interrupt() {
|
|
282
306
|
this.interrupted = true;
|
|
283
307
|
this.l1TxUtils.interrupt();
|
|
284
308
|
}
|
|
285
|
-
/** Restarts the publisher after calling `interrupt`. */
|
|
286
|
-
restart() {
|
|
309
|
+
/** Restarts the publisher after calling `interrupt`. */ restart() {
|
|
287
310
|
this.interrupted = false;
|
|
288
311
|
this.l1TxUtils.restart();
|
|
289
312
|
}
|
|
290
313
|
async prepareProposeTx(encodedData, timestamp) {
|
|
291
314
|
const kzg = Blob.getViemKzgInstance();
|
|
292
315
|
const blobInput = Blob.getEthBlobEvaluationInputs(encodedData.blobs);
|
|
293
|
-
this.log.debug('Validating blob input', {
|
|
294
|
-
|
|
295
|
-
|
|
316
|
+
this.log.debug('Validating blob input', {
|
|
317
|
+
blobInput
|
|
318
|
+
});
|
|
319
|
+
const blobEvaluationGas = await this.l1TxUtils.estimateGas(this.l1TxUtils.walletClient.account, {
|
|
296
320
|
to: this.rollupContract.address,
|
|
297
321
|
data: encodeFunctionData({
|
|
298
322
|
abi: RollupAbi,
|
|
299
323
|
functionName: 'validateBlobs',
|
|
300
|
-
args: [
|
|
301
|
-
|
|
324
|
+
args: [
|
|
325
|
+
blobInput
|
|
326
|
+
]
|
|
327
|
+
})
|
|
302
328
|
}, {}, {
|
|
303
|
-
blobs: encodedData.blobs.map(b
|
|
304
|
-
kzg
|
|
305
|
-
})
|
|
306
|
-
.catch(err => {
|
|
329
|
+
blobs: encodedData.blobs.map((b)=>b.data),
|
|
330
|
+
kzg
|
|
331
|
+
}).catch((err)=>{
|
|
307
332
|
const { message, metaMessages } = formatViemError(err);
|
|
308
|
-
this.log.error(`Failed to validate blobs`, message, {
|
|
333
|
+
this.log.error(`Failed to validate blobs`, message, {
|
|
334
|
+
metaMessages
|
|
335
|
+
});
|
|
309
336
|
throw new Error('Failed to validate blobs');
|
|
310
337
|
});
|
|
311
|
-
const attestations = encodedData.attestations
|
|
312
|
-
|
|
313
|
-
: [];
|
|
314
|
-
const txHashes = encodedData.txHashes ? encodedData.txHashes.map(txHash => txHash.toString()) : [];
|
|
338
|
+
const attestations = encodedData.attestations ? encodedData.attestations.map((attest)=>attest.toViemSignature()) : [];
|
|
339
|
+
const txHashes = encodedData.txHashes ? encodedData.txHashes.map((txHash)=>txHash.toString()) : [];
|
|
315
340
|
const args = [
|
|
316
341
|
{
|
|
317
342
|
header: `0x${encodedData.header.toString('hex')}`,
|
|
318
343
|
archive: `0x${encodedData.archive.toString('hex')}`,
|
|
319
344
|
oracleInput: {
|
|
320
345
|
// We are currently not modifying these. See #9963
|
|
321
|
-
feeAssetPriceModifier: 0n
|
|
346
|
+
feeAssetPriceModifier: 0n
|
|
322
347
|
},
|
|
323
348
|
blockHash: `0x${encodedData.blockHash.toString('hex')}`,
|
|
324
|
-
txHashes
|
|
349
|
+
txHashes
|
|
325
350
|
},
|
|
326
351
|
attestations,
|
|
327
|
-
|
|
328
|
-
`0x${encodedData.body.toString('hex')}`,
|
|
329
|
-
blobInput,
|
|
352
|
+
blobInput
|
|
330
353
|
];
|
|
331
354
|
const rollupData = encodeFunctionData({
|
|
332
355
|
abi: RollupAbi,
|
|
333
356
|
functionName: 'propose',
|
|
334
|
-
args
|
|
357
|
+
args
|
|
335
358
|
});
|
|
336
359
|
const forwarderData = encodeFunctionData({
|
|
337
360
|
abi: ForwarderAbi,
|
|
338
361
|
functionName: 'forward',
|
|
339
|
-
args: [
|
|
362
|
+
args: [
|
|
363
|
+
[
|
|
364
|
+
this.rollupContract.address
|
|
365
|
+
],
|
|
366
|
+
[
|
|
367
|
+
rollupData
|
|
368
|
+
]
|
|
369
|
+
]
|
|
340
370
|
});
|
|
341
|
-
const simulationResult = await this.l1TxUtils
|
|
342
|
-
.simulateGasUsed({
|
|
371
|
+
const simulationResult = await this.l1TxUtils.simulateGasUsed({
|
|
343
372
|
to: this.getForwarderAddress().toString(),
|
|
344
373
|
data: forwarderData,
|
|
345
|
-
gas: SequencerPublisher.PROPOSE_GAS_GUESS
|
|
374
|
+
gas: SequencerPublisher.PROPOSE_GAS_GUESS
|
|
346
375
|
}, {
|
|
347
376
|
// @note we add 1n to the timestamp because geth implementation doesn't like simulation timestamp to be equal to the current block timestamp
|
|
348
377
|
time: timestamp + 1n,
|
|
349
378
|
// @note reth should have a 30m gas limit per block but throws errors that this tx is beyond limit
|
|
350
|
-
gasLimit: SequencerPublisher.PROPOSE_GAS_GUESS * 2n
|
|
379
|
+
gasLimit: SequencerPublisher.PROPOSE_GAS_GUESS * 2n
|
|
351
380
|
}, [
|
|
352
381
|
{
|
|
353
382
|
address: this.rollupContract.address,
|
|
@@ -355,20 +384,26 @@ export class SequencerPublisher {
|
|
|
355
384
|
stateDiff: [
|
|
356
385
|
{
|
|
357
386
|
slot: toHex(RollupContract.checkBlobStorageSlot, true),
|
|
358
|
-
value: toHex(0n, true)
|
|
359
|
-
}
|
|
360
|
-
]
|
|
361
|
-
}
|
|
387
|
+
value: toHex(0n, true)
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
}
|
|
362
391
|
], {
|
|
363
392
|
// @note fallback gas estimate to use if the node doesn't support simulation API
|
|
364
|
-
fallbackGasEstimate: SequencerPublisher.PROPOSE_GAS_GUESS
|
|
365
|
-
})
|
|
366
|
-
.catch(err => {
|
|
393
|
+
fallbackGasEstimate: SequencerPublisher.PROPOSE_GAS_GUESS
|
|
394
|
+
}).catch((err)=>{
|
|
367
395
|
const { message, metaMessages } = formatViemError(err);
|
|
368
|
-
this.log.error(`Failed to simulate gas used`, message, {
|
|
396
|
+
this.log.error(`Failed to simulate gas used`, message, {
|
|
397
|
+
metaMessages
|
|
398
|
+
});
|
|
369
399
|
throw new Error('Failed to simulate gas used');
|
|
370
400
|
});
|
|
371
|
-
return {
|
|
401
|
+
return {
|
|
402
|
+
args,
|
|
403
|
+
blobEvaluationGas,
|
|
404
|
+
rollupData,
|
|
405
|
+
simulationResult
|
|
406
|
+
};
|
|
372
407
|
}
|
|
373
408
|
async addProposeTx(block, encodedData, opts = {}, timestamp) {
|
|
374
409
|
const timer = new Timer();
|
|
@@ -380,18 +415,18 @@ export class SequencerPublisher {
|
|
|
380
415
|
action: 'propose',
|
|
381
416
|
request: {
|
|
382
417
|
to: this.rollupContract.address,
|
|
383
|
-
data: rollupData
|
|
418
|
+
data: rollupData
|
|
384
419
|
},
|
|
385
420
|
lastValidL2Slot: block.header.globalVariables.slotNumber.toBigInt(),
|
|
386
421
|
gasConfig: {
|
|
387
422
|
...opts,
|
|
388
|
-
gasLimit: this.l1TxUtils.bumpGasLimit(simulationResult + blobEvaluationGas)
|
|
423
|
+
gasLimit: this.l1TxUtils.bumpGasLimit(simulationResult + blobEvaluationGas)
|
|
389
424
|
},
|
|
390
425
|
blobConfig: {
|
|
391
|
-
blobs: encodedData.blobs.map(b
|
|
392
|
-
kzg
|
|
426
|
+
blobs: encodedData.blobs.map((b)=>b.data),
|
|
427
|
+
kzg
|
|
393
428
|
},
|
|
394
|
-
onResult: (request, result)
|
|
429
|
+
onResult: (request, result)=>{
|
|
395
430
|
if (!result) {
|
|
396
431
|
return;
|
|
397
432
|
}
|
|
@@ -409,42 +444,38 @@ export class SequencerPublisher {
|
|
|
409
444
|
...block.getStats(),
|
|
410
445
|
eventName: 'rollup-published-to-l1',
|
|
411
446
|
blobCount: encodedData.blobs.length,
|
|
412
|
-
inclusionBlocks
|
|
447
|
+
inclusionBlocks
|
|
413
448
|
};
|
|
414
|
-
this.log.verbose(`Published L2 block to L1 rollup contract`, {
|
|
449
|
+
this.log.verbose(`Published L2 block to L1 rollup contract`, {
|
|
450
|
+
...stats,
|
|
451
|
+
...block.getStats()
|
|
452
|
+
});
|
|
415
453
|
this.metrics.recordProcessBlockTx(timer.ms(), publishStats);
|
|
416
454
|
// Send the blobs to the blob sink
|
|
417
|
-
this.sendBlobsToBlobSink(receipt.blockHash, encodedData.blobs).catch(_err
|
|
455
|
+
this.sendBlobsToBlobSink(receipt.blockHash, encodedData.blobs).catch((_err)=>{
|
|
418
456
|
this.log.error('Failed to send blobs to blob sink');
|
|
419
457
|
});
|
|
420
458
|
return true;
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
459
|
+
} else {
|
|
423
460
|
this.metrics.recordFailedTx('process');
|
|
424
461
|
this.log.error(`Rollup process tx reverted. ${errorMsg ?? 'No error message'}`, undefined, {
|
|
425
462
|
...block.getStats(),
|
|
426
463
|
txHash: receipt.transactionHash,
|
|
427
464
|
blockHash,
|
|
428
|
-
slotNumber: block.header.globalVariables.slotNumber.toBigInt()
|
|
465
|
+
slotNumber: block.header.globalVariables.slotNumber.toBigInt()
|
|
429
466
|
});
|
|
430
467
|
}
|
|
431
|
-
}
|
|
468
|
+
}
|
|
432
469
|
});
|
|
433
470
|
}
|
|
434
471
|
/**
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
sendBlobsToBlobSink(blockHash, blobs) {
|
|
472
|
+
* Send blobs to the blob sink
|
|
473
|
+
*
|
|
474
|
+
* If a blob sink url is configured, then we send blobs to the blob sink
|
|
475
|
+
* - for now we use the blockHash as the identifier for the blobs;
|
|
476
|
+
* In the future this will move to be the beacon block id - which takes a bit more work
|
|
477
|
+
* to calculate and will need to be mocked in e2e tests
|
|
478
|
+
*/ sendBlobsToBlobSink(blockHash, blobs) {
|
|
443
479
|
return this.blobSinkClient.sendBlobsToBlobSink(blockHash, blobs);
|
|
444
480
|
}
|
|
445
481
|
}
|
|
446
|
-
// @note - with blobs, the below estimate seems too large.
|
|
447
|
-
// Total used for full block from int_l1_pub e2e test: 1m (of which 86k is 1x blob)
|
|
448
|
-
// Total used for emptier block from above test: 429k (of which 84k is 1x blob)
|
|
449
|
-
SequencerPublisher.PROPOSE_GAS_GUESS = 12000000n;
|
|
450
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaXNoZXIvc2VxdWVuY2VyLXB1Ymxpc2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFnQyxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdGLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsd0JBQXdCLEVBRXhCLHlCQUF5QixHQUMxQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUNMLGtCQUFrQixFQVNsQixjQUFjLEVBR2QsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5GLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQTJCLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR25FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBb0I3RSxNQUFNLENBQU4sSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLG1EQUFVLENBQUE7SUFDViwrQ0FBUSxDQUFBO0FBQ1YsQ0FBQyxFQUhXLFFBQVEsS0FBUixRQUFRLFFBR25CO0FBaUJELE1BQU0sT0FBTyxrQkFBa0I7SUFtQzdC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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"allowed.d.ts","sourceRoot":"","sources":["../../src/sequencer/allowed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"allowed.d.ts","sourceRoot":"","sources":["../../src/sequencer/allowed.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAItE,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CA2BjF"}
|