Skip to content

Commit 1ddc554

Browse files
Review fixes: corect arbos version, simplify redeem gas accounting
1 parent b4b131f commit 1ddc554

File tree

8 files changed

+30
-45
lines changed

8 files changed

+30
-45
lines changed

arbos/l2pricing/model.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ import (
1414
"github.com/offchainlabs/nitro/util/arbmath"
1515
)
1616

17-
const ArbosSingleGasConstraintsVersion = params.ArbosVersion_50
18-
const ArbosMultiGasConstraintsVersion = params.ArbosVersion_60
19-
2017
const InitialSpeedLimitPerSecondV0 = 1000000
2118
const InitialPerBlockGasLimitV0 uint64 = 20 * 1000000
2219
const InitialSpeedLimitPerSecondV6 = 7000000
@@ -27,7 +24,7 @@ const InitialPricingInertia = 102
2724
const InitialBacklogTolerance = 10
2825
const InitialPerTxGasLimitV50 uint64 = 32 * 1000000
2926

30-
const ArbOS60StaticBacklogUpdateCost = 15000
27+
const MultiConstraintStaticBacklogUpdateCost = 15000
3128

3229
type GasModel int
3330

@@ -41,7 +38,7 @@ const (
4138
// GasModelToUse returns the active gas-pricing model based on ArbOS version
4239
// and whether the corresponding constraints are currently configured.
4340
func (ps *L2PricingState) GasModelToUse() (GasModel, error) {
44-
if ps.ArbosVersion >= ArbosMultiGasConstraintsVersion {
41+
if ps.ArbosVersion >= params.ArbosVersion_MultiGasConstraintsVersion {
4542
constraintsLength, err := ps.MultiGasConstraintsLength()
4643
if err != nil {
4744
return GasModelUnknown, err
@@ -50,7 +47,7 @@ func (ps *L2PricingState) GasModelToUse() (GasModel, error) {
5047
return GasModelMultiGasConstraints, nil
5148
}
5249
}
53-
if ps.ArbosVersion >= ArbosSingleGasConstraintsVersion {
50+
if ps.ArbosVersion >= params.ArbosVersion_SingleGasConstraintsVersion {
5451
constraintsLength, err := ps.GasConstraintsLength()
5552
if err != nil {
5653
return GasModelUnknown, err
@@ -152,19 +149,22 @@ func applyGasDelta(op BacklogOperation, backlog uint64, delta uint64) uint64 {
152149
}
153150

154151
// BacklogUpdateCost returns the gas cost for updating the backlog in the active pricing model.
155-
// This function won't be called starting from ArbOS 60, where the cost is static (ArbOS60StaticBacklogUpdateCost)
156152
func (ps *L2PricingState) BacklogUpdateCost() uint64 {
157-
result := uint64(0)
153+
// Charge static price for any pricer starting from ArbosVersion_MultiGasConstraintsVersion
154+
if ps.ArbosVersion >= params.ArbosVersion_MultiGasConstraintsVersion {
155+
return MultiConstraintStaticBacklogUpdateCost
156+
}
158157

158+
result := uint64(0)
159159
// Single-dimensional constraint pricer costs
160160
// This overhead applies even when no constraints are configured.
161-
if ps.ArbosVersion >= ArbosSingleGasConstraintsVersion {
161+
if ps.ArbosVersion >= params.ArbosVersion_SingleGasConstraintsVersion {
162162
// Read gas constraints length for "GasModelToUse()"
163163
result += storage.StorageReadCost
164164
}
165165

166166
if ps.ArbosVersion >= params.ArbosVersion_MultiConstraintFix {
167-
// updateSingleGasConstraintsBacklogs costs (ArbOS 51 and later)
167+
// updateSingleGasConstraintsBacklogs costs (ArbosVersion_MultiConstraintFix and later)
168168
constraintsLength, _ := ps.gasConstraints.Length()
169169
if constraintsLength > 0 {
170170
result += storage.StorageReadCost // read length to traverse

arbos/tx_processor.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121

2222
"github.com/offchainlabs/nitro/arbos/arbosState"
2323
"github.com/offchainlabs/nitro/arbos/l1pricing"
24-
"github.com/offchainlabs/nitro/arbos/l2pricing"
2524
"github.com/offchainlabs/nitro/arbos/retryables"
2625
"github.com/offchainlabs/nitro/arbos/util"
2726
"github.com/offchainlabs/nitro/util/arbmath"
@@ -537,7 +536,7 @@ func (p *TxProcessor) EndTxHook(gasLeft uint64, usedMultiGas multigas.MultiGas,
537536

538537
var multiDimensionalCost *big.Int
539538
var err error
540-
if p.state.L2PricingState().ArbosVersion >= l2pricing.ArbosMultiGasConstraintsVersion {
539+
if p.state.L2PricingState().ArbosVersion >= params.ArbosVersion_MultiGasConstraintsVersion {
541540
multiDimensionalCost, err = p.state.L2PricingState().MultiDimensionalPriceForRefund(usedMultiGas)
542541
p.state.Restrict(err)
543542
}

go-ethereum

precompiles/ArbRetryableTx.go

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/ethereum/go-ethereum/core/types"
1313
"github.com/ethereum/go-ethereum/params"
1414

15-
"github.com/offchainlabs/nitro/arbos/l2pricing"
1615
"github.com/offchainlabs/nitro/arbos/retryables"
1716
"github.com/offchainlabs/nitro/arbos/util"
1817
"github.com/offchainlabs/nitro/util/arbmath"
@@ -102,13 +101,7 @@ func (con ArbRetryableTx) Redeem(c ctx, evm mech, ticketId bytes32) (bytes32, er
102101
// `redeem` must prepay the gas needed by the trailing call to
103102
// L2PricingState().ShrinkBacklog(). BacklogUpdateCost() returns
104103
// that amount based on the storage read/write mix used by ShrinkBacklog().
105-
backlogUpdateCost := uint64(0)
106-
if c.State.L2PricingState().ArbosVersion >= params.ArbosVersion_60 {
107-
// Charge static price for any pricer starting from ArbOS 60
108-
backlogUpdateCost = l2pricing.ArbOS60StaticBacklogUpdateCost
109-
} else {
110-
backlogUpdateCost = c.State.L2PricingState().BacklogUpdateCost()
111-
}
104+
backlogUpdateCost := c.State.L2PricingState().BacklogUpdateCost()
112105

113106
futureGasCosts := eventCost + gasCostToReturnResult + backlogUpdateCost
114107
if c.GasLeft() < futureGasCosts {
@@ -139,16 +132,13 @@ func (con ArbRetryableTx) Redeem(c ctx, evm mech, ticketId bytes32) (bytes32, er
139132

140133
// Add the gasToDonate back to the gas pool: the retryable attempt will then consume it.
141134
// This ensures that the gas pool has enough gas to run the retryable attempt.
142-
// Starting from ArbOS 60, we don't charge gas for the ShrinkBacklog call here
143-
if c.State.L2PricingState().ArbosVersion >= params.ArbosVersion_60 {
144-
err = c.WithUnmeteredGasAccounting(func() error {
145-
return c.State.L2PricingState().ShrinkBacklog(gasToDonate, multigas.ComputationGas(gasToDonate))
146-
})
147-
} else {
148-
err = c.State.L2PricingState().ShrinkBacklog(gasToDonate, multigas.ComputationGas(gasToDonate))
135+
// Starting from ArbosVersion_MultiGasConstraintsVersion, don't charge gas for the ShrinkBacklog call.
136+
stopChargingGas := c.State.L2PricingState().ArbosVersion >= params.ArbosVersion_MultiGasConstraintsVersion
137+
if stopChargingGas {
138+
c.SetUnmeteredGasAccounting(true)
139+
defer c.SetUnmeteredGasAccounting(false)
149140
}
150-
151-
return retryTxHash, err
141+
return retryTxHash, c.State.L2PricingState().ShrinkBacklog(gasToDonate, multigas.ComputationGas(gasToDonate))
152142
}
153143

154144
// GetLifetime gets the default lifetime period a retryable has at creation

precompiles/ArbRetryableTx_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func TestRetryableRedeemLegacy(t *testing.T) {
127127

128128
func TestRetryableRedeemLegacyArbOS60(t *testing.T) {
129129
evm := newMockEVMForTesting()
130-
err := overrideStateArbOSVersion(evm, params.ArbosVersion_60)
130+
err := overrideStateArbOSVersion(evm, params.ArbosVersion_MultiGasConstraintsVersion)
131131
Require(t, err)
132132

133133
precompileCtx := testContext(common.Address{}, evm)
@@ -167,7 +167,7 @@ func TestRetryableRedeemWithGasConstraints(t *testing.T) {
167167

168168
func TestRetryableRedeemWithGasConstraintsArbOS60(t *testing.T) {
169169
evm := newMockEVMForTesting()
170-
err := overrideStateArbOSVersion(evm, params.ArbosVersion_60)
170+
err := overrideStateArbOSVersion(evm, params.ArbosVersion_MultiGasConstraintsVersion)
171171
Require(t, err)
172172

173173
precompileCtx := testContext(common.Address{}, evm)
@@ -193,7 +193,7 @@ func TestRetryableRedeemWithGasConstraintsArbOS60(t *testing.T) {
193193

194194
func TestRetryableRedeemWithMultiGasConstraints(t *testing.T) {
195195
evm := newMockEVMForTesting()
196-
err := overrideStateArbOSVersion(evm, l2pricing.ArbosMultiGasConstraintsVersion)
196+
err := overrideStateArbOSVersion(evm, params.ArbosVersion_MultiGasConstraintsVersion)
197197
Require(t, err)
198198

199199
precompileCtx := testContext(common.Address{}, evm)

precompiles/constraints_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/ethereum/go-ethereum/core/types"
1414
"github.com/ethereum/go-ethereum/core/vm"
1515
"github.com/ethereum/go-ethereum/crypto"
16+
"github.com/ethereum/go-ethereum/params"
1617

1718
"github.com/offchainlabs/nitro/arbos/arbosState"
1819
"github.com/offchainlabs/nitro/arbos/burn"
@@ -38,7 +39,7 @@ func setupResourceConstraintHandles(
3839
state, err := arbosState.OpenArbosState(evm.StateDB, burn.NewSystemBurner(tracer, false))
3940
require.NoError(t, err)
4041

41-
state.L2PricingState().ArbosVersion = l2pricing.ArbosMultiGasConstraintsVersion
42+
state.L2PricingState().ArbosVersion = params.ArbosVersion_MultiGasConstraintsVersion
4243

4344
arbGasInfo := &ArbGasInfo{}
4445
arbOwner := &ArbOwner{}

precompiles/context.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,12 @@ func (c *Context) ReadOnly() bool {
7474
return c.readOnly
7575
}
7676

77-
func (c *Context) Free() bool {
77+
func (c *Context) UnmeteredGasAccounting() bool {
7878
return c.free
7979
}
8080

81-
func (c *Context) WithUnmeteredGasAccounting(fn func() error) error {
82-
prev := c.free
83-
c.free = true
84-
defer func() {
85-
c.free = prev
86-
}()
87-
return fn()
81+
func (c *Context) SetUnmeteredGasAccounting(enabled bool) {
82+
c.free = enabled
8883
}
8984

9085
func (c *Context) TracingInfo() *util.TracingInfo {

system_tests/multi_constraint_pricer_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func TestSetAndGetMultiGasPricingConstraints(t *testing.T) {
6767

6868
builder := NewNodeBuilder(ctx).
6969
DefaultConfig(t, false).
70-
WithArbOSVersion(l2pricing.ArbosMultiGasConstraintsVersion)
70+
WithArbOSVersion(params.ArbosVersion_MultiGasConstraintsVersion)
7171

7272
cleanup := builder.Build(t)
7373
defer cleanup()
@@ -150,7 +150,7 @@ func TestMultiGasRefundForNormalTx(t *testing.T) {
150150

151151
builder := NewNodeBuilder(ctx).
152152
DefaultConfig(t, false).
153-
WithArbOSVersion(l2pricing.ArbosMultiGasConstraintsVersion)
153+
WithArbOSVersion(params.ArbosVersion_MultiGasConstraintsVersion)
154154

155155
cleanup := builder.Build(t)
156156
defer cleanup()
@@ -226,7 +226,7 @@ func TestMultiGasRefundForNormalTx(t *testing.T) {
226226

227227
func TestMultiGasRefundForRetryableTx(t *testing.T) {
228228
builder, delayedInbox, lookupL2Tx, ctx, teardown := retryableSetup(t, func(b *NodeBuilder) {
229-
b.WithArbOSVersion(l2pricing.ArbosMultiGasConstraintsVersion)
229+
b.WithArbOSVersion(params.ArbosVersion_MultiGasConstraintsVersion)
230230
})
231231
defer teardown()
232232

0 commit comments

Comments
 (0)