Skip to content

Commit 5b62692

Browse files
authored
chore(gas-oracle): decommission L2 gas price oracle (#1643)
1 parent 4f34e90 commit 5b62692

File tree

11 files changed

+21
-370
lines changed

11 files changed

+21
-370
lines changed

common/utils/flags.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ var (
2020
}
2121
// RollupRelayerFlags contains flags only used in rollup-relayer
2222
RollupRelayerFlags = []cli.Flag{
23-
&ImportGenesisFlag,
2423
&MinCodecVersionFlag,
2524
}
2625
// ConfigFileFlag load json type config file.
@@ -73,12 +72,6 @@ var (
7372
Category: "METRICS",
7473
Value: 6060,
7574
}
76-
// ImportGenesisFlag import genesis batch during startup
77-
ImportGenesisFlag = cli.BoolFlag{
78-
Name: "import-genesis",
79-
Usage: "Import genesis batch into L1 contract during startup",
80-
Value: false,
81-
}
8275
// ServicePortFlag is the port the service will listen on
8376
ServicePortFlag = cli.IntFlag{
8477
Name: "service.port",

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.5.2"
8+
var tag = "v4.5.3"
99

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

rollup/cmd/gas_oracle/app/app.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/prometheus/client_golang/prometheus"
1111
"github.com/scroll-tech/go-ethereum/ethclient"
1212
"github.com/scroll-tech/go-ethereum/log"
13-
"github.com/scroll-tech/go-ethereum/params"
1413
"github.com/scroll-tech/go-ethereum/rpc"
1514
"github.com/urfave/cli/v2"
1615

@@ -72,22 +71,12 @@ func action(ctx *cli.Context) error {
7271
log.Crit("failed to connect l1 geth", "config file", cfgFile, "error", err)
7372
}
7473

75-
// Init l2geth connection
76-
l2client, err := ethclient.Dial(cfg.L2Config.Endpoint)
77-
if err != nil {
78-
log.Crit("failed to connect l2 geth", "config file", cfgFile, "error", err)
79-
}
80-
8174
l1watcher := watcher.NewL1WatcherClient(ctx.Context, l1client, cfg.L1Config.StartHeight, db, registry)
8275

8376
l1relayer, err := relayer.NewLayer1Relayer(ctx.Context, db, cfg.L1Config.RelayerConfig, relayer.ServiceTypeL1GasOracle, registry)
8477
if err != nil {
8578
log.Crit("failed to create new l1 relayer", "config file", cfgFile, "error", err)
8679
}
87-
l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, &params.ChainConfig{}, false /* initGenesis */, relayer.ServiceTypeL2GasOracle, registry)
88-
if err != nil {
89-
log.Crit("failed to create new l2 relayer", "config file", cfgFile, "error", err)
90-
}
9180
// Start l1 watcher process
9281
go utils.LoopWithContext(subCtx, 10*time.Second, func(ctx context.Context) {
9382
// Fetch the latest block number to decrease the delay when fetching gas prices
@@ -106,7 +95,6 @@ func action(ctx *cli.Context) error {
10695

10796
// Start l1relayer process
10897
go utils.Loop(subCtx, 10*time.Second, l1relayer.ProcessGasPriceOracle)
109-
go utils.Loop(subCtx, 2*time.Second, l2relayer.ProcessGasPriceOracle)
11098

11199
// Finish start all message relayer functions
112100
log.Info("Start gas-oracle successfully", "version", version.Version)

rollup/cmd/rollup_relayer/app/app.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ func action(ctx *cli.Context) error {
7979
log.Crit("failed to read genesis", "genesis file", genesisPath, "error", err)
8080
}
8181

82-
initGenesis := ctx.Bool(utils.ImportGenesisFlag.Name)
83-
8482
// sanity check config
8583
if cfg.L2Config.RelayerConfig.BatchSubmission == nil {
8684
log.Crit("cfg.L2Config.RelayerConfig.BatchSubmission must not be nil")
@@ -98,7 +96,7 @@ func action(ctx *cli.Context) error {
9896
log.Crit("cfg.L2Config.ChunkProposerConfig.MaxL2GasPerChunk must be greater than 0")
9997
}
10098

101-
l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, genesis.Config, initGenesis, relayer.ServiceTypeL2RollupRelayer, registry)
99+
l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, genesis.Config, relayer.ServiceTypeL2RollupRelayer, registry)
102100
if err != nil {
103101
log.Crit("failed to create l2 relayer", "config file", cfgFile, "error", err)
104102
}

rollup/internal/controller/relayer/common.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ const (
2525
ServiceTypeL2RollupRelayer
2626
// ServiceTypeL1GasOracle indicates the service is a Layer 1 gas oracle.
2727
ServiceTypeL1GasOracle
28-
// ServiceTypeL2GasOracle indicates the service is a Layer 2 gas oracle.
29-
ServiceTypeL2GasOracle
28+
// ServiceTypeL2GasOracleDeprecated indicates the service is a Layer 2 gas oracle, which is deprecated.
29+
ServiceTypeL2GasOracleDeprecated
3030
)

rollup/internal/controller/relayer/l2_relayer.go

Lines changed: 6 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"errors"
66
"fmt"
7-
"math"
87
"math/big"
98
"sort"
109
"strings"
@@ -54,12 +53,7 @@ type Layer2Relayer struct {
5453
finalizeSender *sender.Sender
5554
l1RollupABI *abi.ABI
5655

57-
gasOracleSender *sender.Sender
58-
l2GasOracleABI *abi.ABI
59-
60-
lastGasPrice uint64
61-
minGasPrice uint64
62-
gasPriceDiff uint64
56+
l2GasOracleABI *abi.ABI
6357

6458
// Used to get batch status from chain_monitor api.
6559
chainMonitorClient *resty.Client
@@ -70,22 +64,10 @@ type Layer2Relayer struct {
7064
}
7165

7266
// NewLayer2Relayer will return a new instance of Layer2RelayerClient
73-
func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.DB, cfg *config.RelayerConfig, chainCfg *params.ChainConfig, initGenesis bool, serviceType ServiceType, reg prometheus.Registerer) (*Layer2Relayer, error) {
74-
var gasOracleSender, commitSender, finalizeSender *sender.Sender
75-
var err error
67+
func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.DB, cfg *config.RelayerConfig, chainCfg *params.ChainConfig, serviceType ServiceType, reg prometheus.Registerer) (*Layer2Relayer, error) {
68+
var commitSender, finalizeSender *sender.Sender
7669

7770
switch serviceType {
78-
case ServiceTypeL2GasOracle:
79-
gasOracleSender, err = sender.NewSender(ctx, cfg.SenderConfig, cfg.GasOracleSenderSignerConfig, "l2_relayer", "gas_oracle_sender", types.SenderTypeL2GasOracle, db, reg)
80-
if err != nil {
81-
return nil, fmt.Errorf("new gas oracle sender failed, err: %w", err)
82-
}
83-
84-
// Ensure test features aren't enabled on the ethereum mainnet.
85-
if gasOracleSender.GetChainID().Cmp(big.NewInt(1)) == 0 && cfg.EnableTestEnvBypassFeatures {
86-
return nil, errors.New("cannot enable test env features in mainnet")
87-
}
88-
8971
case ServiceTypeL2RollupRelayer:
9072
commitSenderAddr, err := addrFromSignerConfig(cfg.CommitSenderSignerConfig)
9173
if err != nil {
@@ -118,16 +100,6 @@ func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.
118100
return nil, fmt.Errorf("invalid service type for l2_relayer: %v", serviceType)
119101
}
120102

121-
var minGasPrice uint64
122-
var gasPriceDiff uint64
123-
if cfg.GasOracleConfig != nil {
124-
minGasPrice = cfg.GasOracleConfig.MinGasPrice
125-
gasPriceDiff = cfg.GasOracleConfig.GasPriceDiff
126-
} else {
127-
minGasPrice = 0
128-
gasPriceDiff = defaultGasPriceDiff
129-
}
130-
131103
layer2Relayer := &Layer2Relayer{
132104
ctx: ctx,
133105
db: db,
@@ -143,11 +115,7 @@ func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.
143115
finalizeSender: finalizeSender,
144116
l1RollupABI: bridgeAbi.ScrollChainABI,
145117

146-
gasOracleSender: gasOracleSender,
147-
l2GasOracleABI: bridgeAbi.L2GasPriceOracleABI,
148-
149-
minGasPrice: minGasPrice,
150-
gasPriceDiff: gasPriceDiff,
118+
l2GasOracleABI: bridgeAbi.L2GasPriceOracleABI,
151119

152120
cfg: cfg,
153121
chainCfg: chainCfg,
@@ -161,16 +129,12 @@ func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.
161129
}
162130

163131
// Initialize genesis before we do anything else
164-
if initGenesis {
165-
if err := layer2Relayer.initializeGenesis(); err != nil {
166-
return nil, fmt.Errorf("failed to initialize and commit genesis batch, err: %v", err)
167-
}
132+
if err := layer2Relayer.initializeGenesis(); err != nil {
133+
return nil, fmt.Errorf("failed to initialize and commit genesis batch, err: %v", err)
168134
}
169135
layer2Relayer.metrics = initL2RelayerMetrics(reg)
170136

171137
switch serviceType {
172-
case ServiceTypeL2GasOracle:
173-
go layer2Relayer.handleL2GasOracleConfirmLoop(ctx)
174138
case ServiceTypeL2RollupRelayer:
175139
go layer2Relayer.handleL2RollupRelayerConfirmLoop(ctx)
176140
default:
@@ -301,80 +265,6 @@ func (r *Layer2Relayer) commitGenesisBatch(batchHash string, batchHeader []byte,
301265
}
302266
}
303267

304-
// ProcessGasPriceOracle imports gas price to layer1
305-
func (r *Layer2Relayer) ProcessGasPriceOracle() {
306-
r.metrics.rollupL2RelayerGasPriceOraclerRunTotal.Inc()
307-
batch, err := r.batchOrm.GetLatestBatch(r.ctx)
308-
if err != nil {
309-
log.Error("Failed to GetLatestBatch", "err", err)
310-
return
311-
}
312-
313-
if types.GasOracleStatus(batch.OracleStatus) == types.GasOraclePending {
314-
suggestGasPrice, err := r.l2Client.SuggestGasPrice(r.ctx)
315-
if err != nil {
316-
log.Error("Failed to fetch SuggestGasPrice from l2geth", "err", err)
317-
return
318-
}
319-
suggestGasPriceUint64 := uint64(suggestGasPrice.Int64())
320-
321-
// include the token exchange rate in the fee data if alternative gas token enabled
322-
if r.cfg.GasOracleConfig.AlternativeGasTokenConfig != nil && r.cfg.GasOracleConfig.AlternativeGasTokenConfig.Enabled {
323-
// The exchange rate represent the number of native token on L1 required to exchange for 1 native token on L2.
324-
var exchangeRate float64
325-
switch r.cfg.GasOracleConfig.AlternativeGasTokenConfig.Mode {
326-
case "Fixed":
327-
exchangeRate = r.cfg.GasOracleConfig.AlternativeGasTokenConfig.FixedExchangeRate
328-
case "BinanceApi":
329-
exchangeRate, err = rutils.GetExchangeRateFromBinanceApi(r.cfg.GasOracleConfig.AlternativeGasTokenConfig.TokenSymbolPair, 5)
330-
if err != nil {
331-
log.Error("Failed to get gas token exchange rate from Binance api", "tokenSymbolPair", r.cfg.GasOracleConfig.AlternativeGasTokenConfig.TokenSymbolPair, "err", err)
332-
return
333-
}
334-
default:
335-
log.Error("Invalid alternative gas token mode", "mode", r.cfg.GasOracleConfig.AlternativeGasTokenConfig.Mode)
336-
return
337-
}
338-
if exchangeRate == 0 {
339-
log.Error("Invalid exchange rate", "exchangeRate", exchangeRate)
340-
return
341-
}
342-
suggestGasPriceUint64 = uint64(math.Ceil(float64(suggestGasPriceUint64) * exchangeRate))
343-
suggestGasPrice = new(big.Int).SetUint64(suggestGasPriceUint64)
344-
}
345-
346-
expectedDelta := r.lastGasPrice * r.gasPriceDiff / gasPriceDiffPrecision
347-
if r.lastGasPrice > 0 && expectedDelta == 0 {
348-
expectedDelta = 1
349-
}
350-
351-
// last is undefined or (suggestGasPriceUint64 >= minGasPrice && exceed diff)
352-
if r.lastGasPrice == 0 || (suggestGasPriceUint64 >= r.minGasPrice &&
353-
(math.Abs(float64(suggestGasPriceUint64)-float64(r.lastGasPrice)) >= float64(expectedDelta))) {
354-
data, err := r.l2GasOracleABI.Pack("setL2BaseFee", suggestGasPrice)
355-
if err != nil {
356-
log.Error("Failed to pack setL2BaseFee", "batch.Hash", batch.Hash, "GasPrice", suggestGasPrice.Uint64(), "err", err)
357-
return
358-
}
359-
360-
hash, err := r.gasOracleSender.SendTransaction(batch.Hash, &r.cfg.GasPriceOracleContractAddress, data, nil, 0)
361-
if err != nil {
362-
log.Error("Failed to send setL2BaseFee tx to layer2 ", "batch.Hash", batch.Hash, "err", err)
363-
return
364-
}
365-
366-
err = r.batchOrm.UpdateL2GasOracleStatusAndOracleTxHash(r.ctx, batch.Hash, types.GasOracleImporting, hash.String())
367-
if err != nil {
368-
log.Error("UpdateGasOracleStatusAndOracleTxHash failed", "batch.Hash", batch.Hash, "err", err)
369-
return
370-
}
371-
r.lastGasPrice = suggestGasPriceUint64
372-
r.metrics.rollupL2RelayerLastGasPrice.Set(float64(r.lastGasPrice))
373-
log.Info("Update l2 gas price", "txHash", hash.String(), "GasPrice", suggestGasPrice)
374-
}
375-
}
376-
}
377-
378268
// ProcessPendingBatches processes the pending batches by sending commitBatch transactions to layer 1.
379269
func (r *Layer2Relayer) ProcessPendingBatches() {
380270
// get pending batches from database in ascending order by their index.
@@ -1063,17 +953,6 @@ func (r *Layer2Relayer) handleConfirmation(cfm *sender.Confirmation) {
1063953
log.Info("Transaction confirmed in layer1", "confirmation", cfm)
1064954
}
1065955

1066-
func (r *Layer2Relayer) handleL2GasOracleConfirmLoop(ctx context.Context) {
1067-
for {
1068-
select {
1069-
case <-ctx.Done():
1070-
return
1071-
case cfm := <-r.gasOracleSender.ConfirmChan():
1072-
r.handleConfirmation(cfm)
1073-
}
1074-
}
1075-
}
1076-
1077956
func (r *Layer2Relayer) handleL2RollupRelayerConfirmLoop(ctx context.Context) {
1078957
for {
1079958
select {
@@ -1248,10 +1127,6 @@ func (r *Layer2Relayer) constructFinalizeBundlePayloadCodecV7(dbBatch *orm.Batch
12481127
// StopSenders stops the senders of the rollup-relayer to prevent querying the removed pending_transaction table in unit tests.
12491128
// for unit test
12501129
func (r *Layer2Relayer) StopSenders() {
1251-
if r.gasOracleSender != nil {
1252-
r.gasOracleSender.Stop()
1253-
}
1254-
12551130
if r.commitSender != nil {
12561131
r.commitSender.Stop()
12571132
}

0 commit comments

Comments
 (0)