Skip to content

Commit 45af934

Browse files
Merge constrains package to l2pricing & review fixes
1 parent 57126af commit 45af934

File tree

11 files changed

+68
-122
lines changed

11 files changed

+68
-122
lines changed

arbos/constraints/single_dimensional.go renamed to arbos/l2pricing/gas_constraint.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
// Copyright 2025, Offchain Labs, Inc.
22
// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE.md
33

4-
// The constraints package tracks the multi-dimensional gas usage to apply constraint-based pricing.
5-
package constraints
4+
package l2pricing
65

76
import "github.com/offchainlabs/nitro/arbos/storage"
87

arbos/l2pricing/l2pricing.go

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2021-2022, Offchain Labs, Inc.
1+
// Copyright 2021-2025, Offchain Labs, Inc.
22
// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE.md
33

44
package l2pricing
@@ -10,7 +10,6 @@ import (
1010

1111
"github.com/ethereum/go-ethereum/arbitrum/multigas"
1212

13-
"github.com/offchainlabs/nitro/arbos/constraints"
1413
"github.com/offchainlabs/nitro/arbos/storage"
1514
"github.com/offchainlabs/nitro/util/arbmath"
1615
)
@@ -46,8 +45,8 @@ var gasConstraintsKey []byte = []byte{0}
4645
var multigasConstraintsKey []byte = []byte{1}
4746

4847
const GethBlockGasLimit = 1 << 50
49-
const gasConstraintsMaxNum = 20
50-
const multiGasConstraintsMaxNum = 10
48+
const GasConstraintsMaxNum = 20
49+
const MultiGasConstraintsMaxNum = 15
5150
const MaxPricingExponentBips = arbmath.Bips(85_000)
5251

5352
func InitializeL2PricingState(sto *storage.Storage) error {
@@ -233,7 +232,7 @@ func (ps *L2PricingState) AddGasConstraint(target uint64, adjustmentWindow uint6
233232
if err != nil {
234233
return fmt.Errorf("failed to push constraint: %w", err)
235234
}
236-
constraint := constraints.OpenGasConstraint(subStorage)
235+
constraint := OpenGasConstraint(subStorage)
237236
if err := constraint.SetTarget(target); err != nil {
238237
return fmt.Errorf("failed to set target: %w", err)
239238
}
@@ -250,8 +249,8 @@ func (ps *L2PricingState) GasConstraintsLength() (uint64, error) {
250249
return ps.gasConstraints.Length()
251250
}
252251

253-
func (ps *L2PricingState) OpenGasConstraintAt(i uint64) *constraints.GasConstraint {
254-
return constraints.OpenGasConstraint(ps.gasConstraints.At(i))
252+
func (ps *L2PricingState) OpenGasConstraintAt(i uint64) *GasConstraint {
253+
return OpenGasConstraint(ps.gasConstraints.At(i))
255254
}
256255

257256
func (ps *L2PricingState) ClearGasConstraints() error {
@@ -264,28 +263,20 @@ func (ps *L2PricingState) ClearGasConstraints() error {
264263
if err != nil {
265264
return err
266265
}
267-
constraint := constraints.OpenGasConstraint(subStorage)
266+
constraint := OpenGasConstraint(subStorage)
268267
if err := constraint.Clear(); err != nil {
269268
return err
270269
}
271270
}
272271
return nil
273272
}
274273

275-
func (ps *L2PricingState) GasConstraintsMaxNum() int {
276-
return gasConstraintsMaxNum
277-
}
278-
279-
func (ps *L2PricingState) MultiGasConstraintsMaxNum() int {
280-
return multiGasConstraintsMaxNum
281-
}
282-
283274
func (ps *L2PricingState) MultiGasConstraintsLength() (uint64, error) {
284275
return ps.multigasConstraints.Length()
285276
}
286277

287-
func (ps *L2PricingState) OpenMultiGasConstraintAt(i uint64) *constraints.MultiGasConstraint {
288-
return constraints.OpenMultiGasConstraint(ps.multigasConstraints.At(i))
278+
func (ps *L2PricingState) OpenMultiGasConstraintAt(i uint64) *MultiGasConstraint {
279+
return OpenMultiGasConstraint(ps.multigasConstraints.At(i))
289280
}
290281

291282
func (ps *L2PricingState) AddMultiGasConstraint(
@@ -299,7 +290,7 @@ func (ps *L2PricingState) AddMultiGasConstraint(
299290
return fmt.Errorf("failed to push multi-gas constraint: %w", err)
300291
}
301292

302-
constraint := constraints.OpenMultiGasConstraint(subStorage)
293+
constraint := OpenMultiGasConstraint(subStorage)
303294
if err := constraint.SetTarget(target); err != nil {
304295
return fmt.Errorf("failed to set target: %w", err)
305296
}
@@ -325,7 +316,7 @@ func (ps *L2PricingState) ClearMultiGasConstraints() error {
325316
if err != nil {
326317
return err
327318
}
328-
constraint := constraints.OpenMultiGasConstraint(subStorage)
319+
constraint := OpenMultiGasConstraint(subStorage)
329320
if err := constraint.Clear(); err != nil {
330321
return err
331322
}

arbos/l2pricing/l2pricing_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2021-2022, Offchain Labs, Inc.
1+
// Copyright 2021-2025, Offchain Labs, Inc.
22
// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE.md
33

44
package l2pricing
@@ -27,7 +27,7 @@ func PricingForTest(t *testing.T) *L2PricingState {
2727
func fakeBlockUpdate(t *testing.T, pricing *L2PricingState, gasUsed uint64, timePassed uint64) {
2828
t.Helper()
2929

30-
pricing.storage.Burner().Restrict(pricing.updateLegacyBacklog(true, gasUsed))
30+
pricing.storage.Burner().Restrict(pricing.updateLegacyBacklog(Grow, gasUsed))
3131
pricing.updatePricingModelLegacy(timePassed)
3232
}
3333

arbos/l2pricing/model.go

Lines changed: 29 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2021-2024, Offchain Labs, Inc.
1+
// Copyright 2021-2025, Offchain Labs, Inc.
22
// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE.md
33

44
package l2pricing
@@ -8,7 +8,6 @@ import (
88
"math/big"
99

1010
"github.com/ethereum/go-ethereum/arbitrum/multigas"
11-
"github.com/ethereum/go-ethereum/log"
1211
"github.com/ethereum/go-ethereum/params"
1312

1413
"github.com/offchainlabs/nitro/arbos/storage"
@@ -61,52 +60,41 @@ func (ps *L2PricingState) GasModelToUse() (GasModel, error) {
6160
return GasModelLegacy, nil
6261
}
6362

64-
// GrowBacklog increases the backlog for the active pricing model.
65-
func (ps *L2PricingState) GrowBacklog(usedGas uint64, usedMultiGas multigas.MultiGas) error {
66-
gasModel, err := ps.GasModelToUse()
67-
if err != nil {
68-
return err
69-
}
70-
switch gasModel {
71-
case GasModelLegacy:
72-
return ps.updateLegacyBacklog(true, usedGas)
73-
case GasModelSingleGasConstraints:
74-
return ps.updateSingleGasConstraintsBacklogs(true, usedGas)
75-
case GasModelMultiGasConstraints:
76-
return ps.updateMultiGasConstraintsBacklogs(true, usedGas, usedMultiGas)
77-
default:
78-
return fmt.Errorf("can not determine gas model")
79-
}
80-
}
63+
type BacklogOperation uint8
8164

82-
// ShrinkBacklog reduces the backlog for the active pricing model.
83-
func (ps *L2PricingState) ShrinkBacklog(usedGas uint64, usedMultiGas multigas.MultiGas) error {
65+
const (
66+
Shrink BacklogOperation = iota
67+
Grow
68+
)
69+
70+
// UpdateBacklog increases the backlog for the active pricing model.
71+
func (ps *L2PricingState) UpdateBacklog(op BacklogOperation, usedGas uint64, usedMultiGas multigas.MultiGas) error {
8472
gasModel, err := ps.GasModelToUse()
8573
if err != nil {
8674
return err
8775
}
8876
switch gasModel {
8977
case GasModelLegacy:
90-
return ps.updateLegacyBacklog(false, usedGas)
78+
return ps.updateLegacyBacklog(op, usedGas)
9179
case GasModelSingleGasConstraints:
92-
return ps.updateSingleGasConstraintsBacklogs(false, usedGas)
80+
return ps.updateSingleGasConstraintsBacklogs(op, usedGas)
9381
case GasModelMultiGasConstraints:
94-
return ps.updateMultiGasConstraintsBacklogs(false, usedGas, usedMultiGas)
82+
return ps.updateMultiGasConstraintsBacklogs(op, usedGas, usedMultiGas)
9583
default:
9684
return fmt.Errorf("can not determine gas model")
9785
}
9886
}
9987

100-
func (ps *L2PricingState) updateLegacyBacklog(growBacklog bool, usedGas uint64) error {
88+
func (ps *L2PricingState) updateLegacyBacklog(op BacklogOperation, usedGas uint64) error {
10189
backlog, err := ps.GasBacklog()
10290
if err != nil {
10391
return err
10492
}
105-
backlog = applyGasDelta(backlog, growBacklog, usedGas)
93+
backlog = applyGasDelta(op, backlog, usedGas)
10694
return ps.SetGasBacklog(backlog)
10795
}
10896

109-
func (ps *L2PricingState) updateSingleGasConstraintsBacklogs(growBacklog bool, usedGas uint64) error {
97+
func (ps *L2PricingState) updateSingleGasConstraintsBacklogs(op BacklogOperation, usedGas uint64) error {
11098
constraintsLength, err := ps.gasConstraints.Length()
11199
if err != nil {
112100
return err
@@ -117,46 +105,38 @@ func (ps *L2PricingState) updateSingleGasConstraintsBacklogs(growBacklog bool, u
117105
if err != nil {
118106
return err
119107
}
120-
err = constraint.SetBacklog(applyGasDelta(backlog, growBacklog, usedGas))
108+
err = constraint.SetBacklog(applyGasDelta(op, backlog, usedGas))
121109
if err != nil {
122110
return err
123111
}
124112
}
125113
return nil
126114
}
127115

128-
func (ps *L2PricingState) updateMultiGasConstraintsBacklogs(growBacklog bool, usedGas uint64, usedMultiGas multigas.MultiGas) error {
129-
if usedMultiGas.SingleGas() != usedGas {
130-
log.Warn("usedGas does not match sum of usedMultiGas", "usedGas", usedGas, "usedMultiGas", usedMultiGas.SingleGas())
131-
}
132-
116+
func (ps *L2PricingState) updateMultiGasConstraintsBacklogs(op BacklogOperation, _usedGas uint64, usedMultiGas multigas.MultiGas) error {
133117
constraintsLength, err := ps.multigasConstraints.Length()
134118
if err != nil {
135119
return err
136120
}
137121
for i := range constraintsLength {
138122
constraint := ps.OpenMultiGasConstraintAt(i)
139-
if growBacklog {
140-
err = constraint.IncrementBacklog(usedMultiGas)
141-
if err != nil {
142-
return err
143-
}
144-
} else {
145-
err = constraint.DecrementBacklog(usedMultiGas)
146-
if err != nil {
147-
return err
148-
}
123+
err = constraint.UpdateBacklog(op, usedMultiGas)
124+
if err != nil {
125+
return err
149126
}
150127
}
151128
return nil
152129
}
153130

154131
// applyGasDelta adds delta to backlog if growBacklog=true, otherwise subtracts delta (saturating at zero).
155-
func applyGasDelta(backlog uint64, growBacklog bool, delta uint64) uint64 {
156-
if growBacklog {
132+
func applyGasDelta(op BacklogOperation, backlog uint64, delta uint64) uint64 {
133+
switch op {
134+
case Grow:
157135
return arbmath.SaturatingUAdd(backlog, delta)
158-
} else {
136+
case Shrink:
159137
return arbmath.SaturatingUSub(backlog, delta)
138+
default:
139+
panic("invalid backlog operation")
160140
}
161141
}
162142

@@ -224,7 +204,7 @@ func (ps *L2PricingState) UpdatePricingModel(timePassed uint64) {
224204

225205
func (ps *L2PricingState) updatePricingModelLegacy(timePassed uint64) {
226206
speedLimit, _ := ps.SpeedLimitPerSecond()
227-
_ = ps.updateLegacyBacklog(false, arbmath.SaturatingUMul(timePassed, speedLimit))
207+
_ = ps.updateLegacyBacklog(Shrink, arbmath.SaturatingUMul(timePassed, speedLimit))
228208
inertia, _ := ps.PricingInertia()
229209
tolerance, _ := ps.BacklogTolerance()
230210
backlog, _ := ps.GasBacklog()
@@ -249,7 +229,7 @@ func (ps *L2PricingState) updatePricingModelSingleConstraints(timePassed uint64)
249229
// Pay off backlog
250230
backlog, _ := constraint.Backlog()
251231
gas := arbmath.SaturatingUMul(timePassed, target)
252-
backlog = applyGasDelta(backlog, false, gas)
232+
backlog = applyGasDelta(Shrink, backlog, gas)
253233
_ = constraint.SetBacklog(backlog)
254234

255235
// Calculate exponent with the formula backlog/divisor
@@ -276,7 +256,7 @@ func (ps *L2PricingState) updatePricingModelMultiConstraints(timePassed uint64)
276256

277257
backlog, _ := constraint.Backlog()
278258
gas := arbmath.SaturatingUMul(timePassed, target)
279-
backlog = applyGasDelta(backlog, false, gas)
259+
backlog = applyGasDelta(Shrink, backlog, gas)
280260
_ = constraint.SetBacklog(backlog)
281261
}
282262

arbos/constraints/multi_dimensional.go renamed to arbos/l2pricing/multi_gas_constraint.go

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
// Copyright 2025, Offchain Labs, Inc.
22
// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE.md
33

4-
// The constraints package tracks the multi-dimensional gas usage to apply constraint-based pricing.
5-
package constraints
4+
package l2pricing
65

76
import (
87
"github.com/ethereum/go-ethereum/arbitrum/multigas"
@@ -93,8 +92,8 @@ func (c *MultiGasConstraint) SetResourceWeights(weights map[uint8]uint64) error
9392
return c.sumWeights.Set(total)
9493
}
9594

96-
// IncrementBacklog increments the constraint backlog based on multi-dimensional gas usage
97-
func (c *MultiGasConstraint) IncrementBacklog(multiGas multigas.MultiGas) error {
95+
// UpdateBacklog increases or decreases the backlog depending on the operation specified.
96+
func (c *MultiGasConstraint) UpdateBacklog(op BacklogOperation, multiGas multigas.MultiGas) error {
9897
totalBacklog, err := c.backlog.Get()
9998
if err != nil {
10099
return err
@@ -111,34 +110,8 @@ func (c *MultiGasConstraint) IncrementBacklog(multiGas multigas.MultiGas) error
111110

112111
resourceAmount := multiGas.Get(multigas.ResourceKind(i))
113112
weightedAmount := arbmath.SaturatingUMul(resourceAmount, uint64(weight))
114-
115-
totalBacklog = arbmath.SaturatingUAdd(totalBacklog, weightedAmount)
116-
}
117-
return c.SetBacklog(totalBacklog)
118-
}
119-
120-
// DecrementBacklog decreases the constraint backlog based on multi-dimensional gas usage
121-
func (c *MultiGasConstraint) DecrementBacklog(multiGas multigas.MultiGas) error {
122-
totalBacklog, err := c.backlog.Get()
123-
if err != nil {
124-
return err
113+
totalBacklog = applyGasDelta(op, totalBacklog, weightedAmount)
125114
}
126-
127-
for i := range uint8(multigas.NumResourceKind) {
128-
weight, err := c.weightedResources[i].Get()
129-
if err != nil {
130-
return err
131-
}
132-
if weight == 0 {
133-
continue
134-
}
135-
136-
resourceAmount := multiGas.Get(multigas.ResourceKind(i))
137-
weightedAmount := arbmath.SaturatingUMul(resourceAmount, uint64(weight))
138-
139-
totalBacklog = arbmath.SaturatingUSub(totalBacklog, weightedAmount)
140-
}
141-
142115
return c.SetBacklog(totalBacklog)
143116
}
144117

0 commit comments

Comments
 (0)