Skip to content

Commit fcfbc53

Browse files
jonastheisThegaram
andauthored
feat(chunk proposer): add config parameter to limit chunk proposing by L2 gas (#1622)
Co-authored-by: jonastheis <[email protected]> Co-authored-by: Péter Garamvölgyi <[email protected]> Co-authored-by: Thegaram <[email protected]>
1 parent 13c8605 commit fcfbc53

File tree

9 files changed

+68
-1
lines changed

9 files changed

+68
-1
lines changed

common/version/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"runtime/debug"
66
)
77

8-
var tag = "v4.4.96"
8+
var tag = "v4.4.97"
99

1010
var commit = func() string {
1111
if info, ok := debug.ReadBuildInfo(); ok {

rollup/cmd/rollup_relayer/app/app.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ func action(ctx *cli.Context) error {
9494
if cfg.L2Config.BatchProposerConfig.MaxChunksPerBatch <= 0 {
9595
log.Crit("cfg.L2Config.BatchProposerConfig.MaxChunksPerBatch must be greater than 0")
9696
}
97+
if cfg.L2Config.ChunkProposerConfig.MaxL2GasPerChunk <= 0 {
98+
log.Crit("cfg.L2Config.ChunkProposerConfig.MaxL2GasPerChunk must be greater than 0")
99+
}
97100

98101
l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, genesis.Config, initGenesis, relayer.ServiceTypeL2RollupRelayer, registry)
99102
if err != nil {

rollup/conf/config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
"propose_interval_milliseconds": 100,
9595
"max_block_num_per_chunk": 100,
9696
"max_tx_num_per_chunk": 100,
97+
"max_l2_gas_per_chunk": 20000000,
9798
"max_l1_commit_gas_per_chunk": 11234567,
9899
"max_l1_commit_calldata_size_per_chunk": 112345,
99100
"chunk_timeout_sec": 300,

rollup/internal/config/l2.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type ChunkProposerConfig struct {
3131
ProposeIntervalMilliseconds uint64 `json:"propose_interval_milliseconds"`
3232
MaxBlockNumPerChunk uint64 `json:"max_block_num_per_chunk"`
3333
MaxTxNumPerChunk uint64 `json:"max_tx_num_per_chunk"`
34+
MaxL2GasPerChunk uint64 `json:"max_l2_gas_per_chunk"`
3435
MaxL1CommitGasPerChunk uint64 `json:"max_l1_commit_gas_per_chunk"`
3536
MaxL1CommitCalldataSizePerChunk uint64 `json:"max_l1_commit_calldata_size_per_chunk"`
3637
ChunkTimeoutSec uint64 `json:"chunk_timeout_sec"`

rollup/internal/controller/watcher/batch_proposer_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ func testBatchProposerLimitsCodecV4(t *testing.T) {
111111
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
112112
MaxBlockNumPerChunk: 1,
113113
MaxTxNumPerChunk: 10000,
114+
MaxL2GasPerChunk: 20000000,
114115
MaxL1CommitGasPerChunk: 50000000000,
115116
MaxL1CommitCalldataSizePerChunk: 1000000,
116117
MaxRowConsumptionPerChunk: 1000000,
@@ -206,6 +207,7 @@ func testBatchCommitGasAndCalldataSizeEstimationCodecV4(t *testing.T) {
206207
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
207208
MaxBlockNumPerChunk: 1,
208209
MaxTxNumPerChunk: 10000,
210+
MaxL2GasPerChunk: 20_000_000,
209211
MaxL1CommitGasPerChunk: 50000000000,
210212
MaxL1CommitCalldataSizePerChunk: 1000000,
211213
MaxRowConsumptionPerChunk: 1000000,
@@ -292,6 +294,7 @@ func testBatchProposerBlobSizeLimitCodecV4(t *testing.T) {
292294
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
293295
MaxBlockNumPerChunk: math.MaxUint64,
294296
MaxTxNumPerChunk: math.MaxUint64,
297+
MaxL2GasPerChunk: math.MaxUint64,
295298
MaxL1CommitGasPerChunk: math.MaxUint64,
296299
MaxL1CommitCalldataSizePerChunk: math.MaxUint64,
297300
MaxRowConsumptionPerChunk: math.MaxUint64,
@@ -387,6 +390,7 @@ func testBatchProposerMaxChunkNumPerBatchLimitCodecV4(t *testing.T) {
387390
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
388391
MaxBlockNumPerChunk: math.MaxUint64,
389392
MaxTxNumPerChunk: math.MaxUint64,
393+
MaxL2GasPerChunk: math.MaxUint64,
390394
MaxL1CommitGasPerChunk: math.MaxUint64,
391395
MaxL1CommitCalldataSizePerChunk: math.MaxUint64,
392396
MaxRowConsumptionPerChunk: math.MaxUint64,

rollup/internal/controller/watcher/bundle_proposer_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func testBundleProposerLimitsCodecV4(t *testing.T) {
9696
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
9797
MaxBlockNumPerChunk: 1,
9898
MaxTxNumPerChunk: math.MaxUint64,
99+
MaxL2GasPerChunk: math.MaxUint64,
99100
MaxL1CommitGasPerChunk: math.MaxUint64,
100101
MaxL1CommitCalldataSizePerChunk: math.MaxUint64,
101102
MaxRowConsumptionPerChunk: math.MaxUint64,

rollup/internal/controller/watcher/chunk_proposer.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type ChunkProposer struct {
2828

2929
maxBlockNumPerChunk uint64
3030
maxTxNumPerChunk uint64
31+
maxL2GasPerChunk uint64
3132
maxL1CommitGasPerChunk uint64
3233
maxL1CommitCalldataSizePerChunk uint64
3334
maxRowConsumptionPerChunk uint64
@@ -43,6 +44,7 @@ type ChunkProposer struct {
4344
proposeChunkUpdateInfoTotal prometheus.Counter
4445
proposeChunkUpdateInfoFailureTotal prometheus.Counter
4546
chunkTxNum prometheus.Gauge
47+
chunkL2Gas prometheus.Gauge
4648
chunkEstimateL1CommitGas prometheus.Gauge
4749
totalL1CommitCalldataSize prometheus.Gauge
4850
totalL1CommitBlobSize prometheus.Gauge
@@ -66,6 +68,7 @@ func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, minC
6668
log.Info("new chunk proposer",
6769
"maxBlockNumPerChunk", cfg.MaxBlockNumPerChunk,
6870
"maxTxNumPerChunk", cfg.MaxTxNumPerChunk,
71+
"maxL2GasPerChunk", cfg.MaxL2GasPerChunk,
6972
"maxL1CommitGasPerChunk", cfg.MaxL1CommitGasPerChunk,
7073
"maxL1CommitCalldataSizePerChunk", cfg.MaxL1CommitCalldataSizePerChunk,
7174
"maxRowConsumptionPerChunk", cfg.MaxRowConsumptionPerChunk,
@@ -81,6 +84,7 @@ func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, minC
8184
l2BlockOrm: orm.NewL2Block(db),
8285
maxBlockNumPerChunk: cfg.MaxBlockNumPerChunk,
8386
maxTxNumPerChunk: cfg.MaxTxNumPerChunk,
87+
maxL2GasPerChunk: cfg.MaxL2GasPerChunk,
8488
maxL1CommitGasPerChunk: cfg.MaxL1CommitGasPerChunk,
8589
maxL1CommitCalldataSizePerChunk: cfg.MaxL1CommitCalldataSizePerChunk,
8690
maxRowConsumptionPerChunk: cfg.MaxRowConsumptionPerChunk,
@@ -114,6 +118,10 @@ func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, minC
114118
Name: "rollup_propose_chunk_tx_num",
115119
Help: "The chunk tx num",
116120
}),
121+
chunkL2Gas: promauto.With(reg).NewGauge(prometheus.GaugeOpts{
122+
Name: "rollup_propose_chunk_l2_gas",
123+
Help: "The chunk l2 gas",
124+
}),
117125
chunkEstimateL1CommitGas: promauto.With(reg).NewGauge(prometheus.GaugeOpts{
118126
Name: "rollup_propose_chunk_estimate_l1_commit_gas",
119127
Help: "The chunk estimate l1 commit gas",
@@ -342,6 +350,7 @@ func (p *ChunkProposer) proposeChunk() error {
342350

343351
overEstimatedL1CommitGas := uint64(p.gasCostIncreaseMultiplier * float64(metrics.L1CommitGas))
344352
if metrics.TxNum > p.maxTxNumPerChunk ||
353+
metrics.L2Gas > p.maxL2GasPerChunk ||
345354
metrics.L1CommitCalldataSize > p.maxL1CommitCalldataSizePerChunk ||
346355
overEstimatedL1CommitGas > p.maxL1CommitGasPerChunk ||
347356
metrics.CrcMax > p.maxRowConsumptionPerChunk ||
@@ -356,6 +365,8 @@ func (p *ChunkProposer) proposeChunk() error {
356365
log.Debug("breaking limit condition in chunking",
357366
"txNum", metrics.TxNum,
358367
"maxTxNum", p.maxTxNumPerChunk,
368+
"l2Gas", metrics.L2Gas,
369+
"maxL2Gas", p.maxL2GasPerChunk,
359370
"l1CommitCalldataSize", metrics.L1CommitCalldataSize,
360371
"maxL1CommitCalldataSize", p.maxL1CommitCalldataSizePerChunk,
361372
"l1CommitGas", metrics.L1CommitGas,
@@ -409,6 +420,7 @@ func (p *ChunkProposer) recordAllChunkMetrics(metrics *utils.ChunkMetrics) {
409420
p.chunkTxNum.Set(float64(metrics.TxNum))
410421
p.maxTxConsumption.Set(float64(metrics.CrcMax))
411422
p.chunkBlocksNum.Set(float64(metrics.NumBlocks))
423+
p.chunkL2Gas.Set(float64(metrics.L2Gas))
412424
p.totalL1CommitCalldataSize.Set(float64(metrics.L1CommitCalldataSize))
413425
p.chunkEstimateL1CommitGas.Set(float64(metrics.L1CommitGas))
414426
p.totalL1CommitBlobSize.Set(float64(metrics.L1CommitBlobSize))

rollup/internal/controller/watcher/chunk_proposer_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
2121
name string
2222
maxBlockNum uint64
2323
maxTxNum uint64
24+
maxL2Gas uint64
2425
maxL1CommitGas uint64
2526
maxL1CommitCalldataSize uint64
2627
maxRowConsumption uint64
@@ -32,6 +33,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
3233
name: "NoLimitReached",
3334
maxBlockNum: 100,
3435
maxTxNum: 10000,
36+
maxL2Gas: 20_000_000,
3537
maxL1CommitGas: 50000000000,
3638
maxL1CommitCalldataSize: 1000000,
3739
maxRowConsumption: 1000000,
@@ -42,6 +44,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
4244
name: "Timeout",
4345
maxBlockNum: 100,
4446
maxTxNum: 10000,
47+
maxL2Gas: 20_000_000,
4548
maxL1CommitGas: 50000000000,
4649
maxL1CommitCalldataSize: 1000000,
4750
maxRowConsumption: 1000000,
@@ -53,6 +56,18 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
5356
name: "MaxTxNumPerChunkIs0",
5457
maxBlockNum: 10,
5558
maxTxNum: 0,
59+
maxL2Gas: 20_000_000,
60+
maxL1CommitGas: 50000000000,
61+
maxL1CommitCalldataSize: 1000000,
62+
maxRowConsumption: 1000000,
63+
chunkTimeoutSec: 1000000000000,
64+
expectedChunksLen: 0,
65+
},
66+
{
67+
name: "MaxL2GasPerChunkIs0",
68+
maxBlockNum: 10,
69+
maxTxNum: 10,
70+
maxL2Gas: 0,
5671
maxL1CommitGas: 50000000000,
5772
maxL1CommitCalldataSize: 1000000,
5873
maxRowConsumption: 1000000,
@@ -63,6 +78,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
6378
name: "MaxL1CommitGasPerChunkIs0",
6479
maxBlockNum: 10,
6580
maxTxNum: 10000,
81+
maxL2Gas: 20_000_000,
6682
maxL1CommitGas: 0,
6783
maxL1CommitCalldataSize: 1000000,
6884
maxRowConsumption: 1000000,
@@ -73,6 +89,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
7389
name: "MaxL1CommitCalldataSizePerChunkIs0",
7490
maxBlockNum: 10,
7591
maxTxNum: 10000,
92+
maxL2Gas: 20_000_000,
7693
maxL1CommitGas: 50000000000,
7794
maxL1CommitCalldataSize: 0,
7895
maxRowConsumption: 1000000,
@@ -83,6 +100,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
83100
name: "MaxRowConsumptionPerChunkIs0",
84101
maxBlockNum: 100,
85102
maxTxNum: 10000,
103+
maxL2Gas: 20_000_000,
86104
maxL1CommitGas: 50000000000,
87105
maxL1CommitCalldataSize: 1000000,
88106
maxRowConsumption: 0,
@@ -93,6 +111,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
93111
name: "MaxBlockNumPerChunkIs1",
94112
maxBlockNum: 1,
95113
maxTxNum: 10000,
114+
maxL2Gas: 20_000_000,
96115
maxL1CommitGas: 50000000000,
97116
maxL1CommitCalldataSize: 1000000,
98117
maxRowConsumption: 1000000,
@@ -104,17 +123,33 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
104123
name: "MaxTxNumPerChunkIsFirstBlock",
105124
maxBlockNum: 10,
106125
maxTxNum: 2,
126+
maxL2Gas: 20_000_000,
107127
maxL1CommitGas: 50000000000,
108128
maxL1CommitCalldataSize: 1000000,
109129
maxRowConsumption: 1000000,
110130
chunkTimeoutSec: 1000000000000,
111131
expectedChunksLen: 1,
112132
expectedBlocksInFirstChunk: 1,
113133
},
134+
{
135+
// In this test the second block is not included in the chunk because together
136+
// with the first block it exceeds the maxL2GasPerChunk limit.
137+
name: "MaxL2GasPerChunkIsSecondBlock",
138+
maxBlockNum: 10,
139+
maxTxNum: 10000,
140+
maxL2Gas: 1_153_000,
141+
maxL1CommitGas: 50000000000,
142+
maxL1CommitCalldataSize: 1000000,
143+
maxRowConsumption: 1,
144+
chunkTimeoutSec: 1000000000000,
145+
expectedChunksLen: 1,
146+
expectedBlocksInFirstChunk: 1,
147+
},
114148
{
115149
name: "MaxL1CommitGasPerChunkIsFirstBlock",
116150
maxBlockNum: 10,
117151
maxTxNum: 10000,
152+
maxL2Gas: 20_000_000,
118153
maxL1CommitGas: 62500,
119154
maxL1CommitCalldataSize: 1000000,
120155
maxRowConsumption: 1000000,
@@ -126,6 +161,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
126161
name: "MaxL1CommitCalldataSizePerChunkIsFirstBlock",
127162
maxBlockNum: 10,
128163
maxTxNum: 10000,
164+
maxL2Gas: 20_000_000,
129165
maxL1CommitGas: 50000000000,
130166
maxL1CommitCalldataSize: 60,
131167
maxRowConsumption: 1000000,
@@ -137,6 +173,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
137173
name: "MaxRowConsumptionPerChunkIs1",
138174
maxBlockNum: 10,
139175
maxTxNum: 10000,
176+
maxL2Gas: 20_000_000,
140177
maxL1CommitGas: 50000000000,
141178
maxL1CommitCalldataSize: 1000000,
142179
maxRowConsumption: 1,
@@ -158,6 +195,7 @@ func testChunkProposerLimitsCodecV4(t *testing.T) {
158195
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
159196
MaxBlockNumPerChunk: tt.maxBlockNum,
160197
MaxTxNumPerChunk: tt.maxTxNum,
198+
MaxL2GasPerChunk: tt.maxL2Gas,
161199
MaxL1CommitGasPerChunk: tt.maxL1CommitGas,
162200
MaxL1CommitCalldataSizePerChunk: tt.maxL1CommitCalldataSize,
163201
MaxRowConsumptionPerChunk: tt.maxRowConsumption,
@@ -208,6 +246,7 @@ func testChunkProposerBlobSizeLimitCodecV4(t *testing.T) {
208246
cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{
209247
MaxBlockNumPerChunk: 255,
210248
MaxTxNumPerChunk: math.MaxUint64,
249+
MaxL2GasPerChunk: math.MaxUint64,
211250
MaxL1CommitGasPerChunk: math.MaxUint64,
212251
MaxL1CommitCalldataSizePerChunk: math.MaxUint64,
213252
MaxRowConsumptionPerChunk: math.MaxUint64,

rollup/internal/utils/utils.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
type ChunkMetrics struct {
1313
NumBlocks uint64
1414
TxNum uint64
15+
L2Gas uint64
1516
CrcMax uint64
1617
FirstBlockTimestamp uint64
1718

@@ -35,6 +36,11 @@ func CalculateChunkMetrics(chunk *encoding.Chunk, codecVersion encoding.CodecVer
3536
FirstBlockTimestamp: chunk.Blocks[0].Header.Time,
3637
}
3738

39+
// Get total L2 gas for chunk
40+
for _, block := range chunk.Blocks {
41+
metrics.L2Gas += block.Header.GasUsed
42+
}
43+
3844
var err error
3945
metrics.CrcMax, err = chunk.CrcMax()
4046
if err != nil {

0 commit comments

Comments
 (0)