mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 02:07:52 +00:00 
			
		
		
		
	Merge pull request #110 from Solovyov1796/dev2
update suggestion gas price
This commit is contained in:
		
						commit
						351c2cb132
					
				@ -2,10 +2,7 @@ package app
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"sort"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/chaincfg"
 | 
			
		||||
	"github.com/cockroachdb/errors"
 | 
			
		||||
	abci "github.com/cometbft/cometbft/abci/types"
 | 
			
		||||
	gethtypes "github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
@ -16,8 +13,6 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/auth/signing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const gasPriceSuggestionBlockNum int64 = 5
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// GasTx defines the contract that a transaction with a gas limit must implement.
 | 
			
		||||
	GasTx interface {
 | 
			
		||||
@ -35,29 +30,17 @@ type (
 | 
			
		||||
	// DefaultProposalHandler defines the default ABCI PrepareProposal and
 | 
			
		||||
	// ProcessProposal handlers.
 | 
			
		||||
	DefaultProposalHandler struct {
 | 
			
		||||
		mempool         mempool.Mempool
 | 
			
		||||
		txVerifier      ProposalTxVerifier
 | 
			
		||||
		txSelector      TxSelector
 | 
			
		||||
		feemarketKeeper FeeMarketKeeper
 | 
			
		||||
	}
 | 
			
		||||
	FeeMarketKeeper interface {
 | 
			
		||||
		SetSuggestionGasPrice(ctx sdk.Context, gas *big.Int)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	txnInfo struct {
 | 
			
		||||
		gasPrice *big.Int
 | 
			
		||||
		gasLimit uint64
 | 
			
		||||
		nonce    uint64
 | 
			
		||||
		sender   string
 | 
			
		||||
		mempool    mempool.Mempool
 | 
			
		||||
		txVerifier ProposalTxVerifier
 | 
			
		||||
		txSelector TxSelector
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier, feemarketKeeper FeeMarketKeeper) *DefaultProposalHandler {
 | 
			
		||||
func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier) *DefaultProposalHandler {
 | 
			
		||||
	return &DefaultProposalHandler{
 | 
			
		||||
		mempool:         mp,
 | 
			
		||||
		txVerifier:      txVerifier,
 | 
			
		||||
		txSelector:      NewDefaultTxSelector(),
 | 
			
		||||
		feemarketKeeper: feemarketKeeper,
 | 
			
		||||
		mempool:    mp,
 | 
			
		||||
		txVerifier: txVerifier,
 | 
			
		||||
		txSelector: NewDefaultTxSelector(),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -114,14 +97,11 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 | 
			
		||||
			return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		txnInfoMap := make(map[string][]*txnInfo, h.mempool.CountTx())
 | 
			
		||||
 | 
			
		||||
		iterator := h.mempool.Select(ctx, req.Txs)
 | 
			
		||||
		selectedTxsSignersSeqs := make(map[string]uint64)
 | 
			
		||||
		var selectedTxsNums int
 | 
			
		||||
		for iterator != nil {
 | 
			
		||||
			memTx := iterator.Tx()
 | 
			
		||||
 | 
			
		||||
			sigs, err := memTx.(signing.SigVerifiableTx).GetSignaturesV2()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				panic(fmt.Errorf("failed to get signatures: %w", err))
 | 
			
		||||
@ -154,42 +134,10 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 | 
			
		||||
									txSignersSeqs[signer] = nonce
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							if _, exists := txnInfoMap[signer]; !exists {
 | 
			
		||||
								txnInfoMap[signer] = make([]*txnInfo, 0, 128)
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							txnInfoMap[signer] = append(txnInfoMap[signer], &txnInfo{
 | 
			
		||||
								gasPrice: ethTx.GasPrice(),
 | 
			
		||||
								gasLimit: ethTx.Gas(),
 | 
			
		||||
								nonce:    nonce,
 | 
			
		||||
								sender:   signer,
 | 
			
		||||
							})
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				// ignore multisig case now
 | 
			
		||||
				fee := memTx.(sdk.Fee)
 | 
			
		||||
				if len(sigs) == 1 {
 | 
			
		||||
					signer := sdk.AccAddress(sigs[0].PubKey.Address()).String()
 | 
			
		||||
 | 
			
		||||
					if _, exists := txnInfoMap[signer]; !exists {
 | 
			
		||||
						txnInfoMap[signer] = make([]*txnInfo, 0, 16)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					evmGasPrice, err := utilCosmosDemonGasPriceToEvmDemonGasPrice(fee.GetAmount())
 | 
			
		||||
 | 
			
		||||
					if err == nil {
 | 
			
		||||
						txnInfoMap[signer] = append(txnInfoMap[signer], &txnInfo{
 | 
			
		||||
							gasPrice: evmGasPrice,
 | 
			
		||||
							gasLimit: utilCosmosDemonGasLimitToEvmDemonGasLimit(fee.GetGas()),
 | 
			
		||||
							nonce:    sigs[0].Sequence,
 | 
			
		||||
							sender:   signer,
 | 
			
		||||
						})
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				for _, sig := range sigs {
 | 
			
		||||
					signer := sdk.AccAddress(sig.PubKey.Address()).String()
 | 
			
		||||
					seq, ok := selectedTxsSignersSeqs[signer]
 | 
			
		||||
@ -250,65 +198,6 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan
 | 
			
		||||
 | 
			
		||||
			iterator = iterator.Next()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if len(txnInfoMap) == 0 {
 | 
			
		||||
			h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0))
 | 
			
		||||
		} else {
 | 
			
		||||
			senderCnt := 0
 | 
			
		||||
			txnCnt := 0
 | 
			
		||||
			for sender := range txnInfoMap {
 | 
			
		||||
				sort.Slice(txnInfoMap[sender], func(i, j int) bool {
 | 
			
		||||
					return txnInfoMap[sender][i].nonce < txnInfoMap[sender][j].nonce
 | 
			
		||||
				})
 | 
			
		||||
				txnCnt += len(txnInfoMap[sender])
 | 
			
		||||
				senderCnt++
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			remaing := gasPriceSuggestionBlockNum * int64(maxBlockGas)
 | 
			
		||||
			var lastProcessedTx *txnInfo
 | 
			
		||||
 | 
			
		||||
			for remaing > 0 && len(txnInfoMap) > 0 {
 | 
			
		||||
				// Find the highest gas price among the first transaction of each account
 | 
			
		||||
				var highestGasPrice *big.Int
 | 
			
		||||
				var selectedSender string
 | 
			
		||||
 | 
			
		||||
				// Compare first transaction (lowest nonce) from each account
 | 
			
		||||
				for sender, txns := range txnInfoMap {
 | 
			
		||||
					if len(txns) == 0 {
 | 
			
		||||
						delete(txnInfoMap, sender)
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					// First tx has lowest nonce due to earlier sorting
 | 
			
		||||
					if highestGasPrice == nil || txns[0].gasPrice.Cmp(highestGasPrice) > 0 {
 | 
			
		||||
						highestGasPrice = txns[0].gasPrice
 | 
			
		||||
						selectedSender = sender
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if selectedSender == "" {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// Process the selected transaction
 | 
			
		||||
				selectedTx := txnInfoMap[selectedSender][0]
 | 
			
		||||
				remaing -= int64(selectedTx.gasLimit)
 | 
			
		||||
				lastProcessedTx = selectedTx
 | 
			
		||||
 | 
			
		||||
				// Remove processed transaction
 | 
			
		||||
				txnInfoMap[selectedSender] = txnInfoMap[selectedSender][1:]
 | 
			
		||||
				if len(txnInfoMap[selectedSender]) == 0 {
 | 
			
		||||
					delete(txnInfoMap, selectedSender)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if lastProcessedTx != nil && remaing <= 0 {
 | 
			
		||||
				h.feemarketKeeper.SetSuggestionGasPrice(ctx, lastProcessedTx.gasPrice)
 | 
			
		||||
			} else {
 | 
			
		||||
				h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -447,22 +336,3 @@ func (ts *defaultTxSelector) SelectTxForProposal(maxTxBytes, maxBlockGas uint64,
 | 
			
		||||
	// check if we've reached capacity; if so, we cannot select any more transactions
 | 
			
		||||
	return ts.totalTxBytes >= maxTxBytes || (maxBlockGas > 0 && (ts.totalTxGas >= maxBlockGas))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func utilCosmosDemonGasPriceToEvmDemonGasPrice(gasGroup sdk.Coins) (*big.Int, error) {
 | 
			
		||||
	gasPrice := big.NewInt(0)
 | 
			
		||||
	for _, coin := range gasGroup {
 | 
			
		||||
		if coin.Denom == chaincfg.GasDenom {
 | 
			
		||||
			thisGasPrice := big.NewInt(0).SetUint64(coin.Amount.Uint64())
 | 
			
		||||
			thisGasPrice = thisGasPrice.Mul(thisGasPrice, big.NewInt(0).SetInt64(chaincfg.GasDenomConversionMultiplier))
 | 
			
		||||
			gasPrice = gasPrice.Add(gasPrice, thisGasPrice)
 | 
			
		||||
		} else {
 | 
			
		||||
			return big.NewInt(0), fmt.Errorf("invalid denom: %s", coin.Denom)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return gasPrice, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func utilCosmosDemonGasLimitToEvmDemonGasLimit(gasLimit uint64) uint64 {
 | 
			
		||||
	return gasLimit * chaincfg.GasDenomConversionMultiplier
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -62,7 +62,6 @@ func TestAppAnteHandler_AuthorizedMempool(t *testing.T) {
 | 
			
		||||
				encodingConfig,
 | 
			
		||||
				baseapp.SetChainID(app.TestChainId),
 | 
			
		||||
			),
 | 
			
		||||
			nil,
 | 
			
		||||
		),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -313,7 +313,6 @@ func NewApp(
 | 
			
		||||
	encodingConfig chainparams.EncodingConfig,
 | 
			
		||||
	options Options,
 | 
			
		||||
	bApp *baseapp.BaseApp,
 | 
			
		||||
	setAbciProposalHandler func(feemarketKeeper FeeMarketKeeper) sdk.PrepareProposalHandler,
 | 
			
		||||
) *App {
 | 
			
		||||
	appCodec := encodingConfig.Marshaler
 | 
			
		||||
	legacyAmino := encodingConfig.Amino
 | 
			
		||||
@ -490,6 +489,7 @@ func NewApp(
 | 
			
		||||
		keys[feemarkettypes.StoreKey],
 | 
			
		||||
		tkeys[feemarkettypes.TransientKey],
 | 
			
		||||
		feemarketSubspace,
 | 
			
		||||
		bApp.Mempool(),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	app.evmutilKeeper = evmutilkeeper.NewKeeper(
 | 
			
		||||
@ -902,10 +902,6 @@ func NewApp(
 | 
			
		||||
	app.SetBeginBlocker(app.BeginBlocker)
 | 
			
		||||
	app.SetEndBlocker(app.EndBlocker)
 | 
			
		||||
 | 
			
		||||
	if setAbciProposalHandler != nil {
 | 
			
		||||
		abciProposalHandler := setAbciProposalHandler(app.feeMarketKeeper)
 | 
			
		||||
		bApp.SetPrepareProposal(abciProposalHandler)
 | 
			
		||||
	}
 | 
			
		||||
	// load store
 | 
			
		||||
	if !options.SkipLoadLatest {
 | 
			
		||||
		if err := app.LoadLatestVersion(); err != nil {
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,6 @@ func TestNewApp(t *testing.T) {
 | 
			
		||||
			MakeEncodingConfig(),
 | 
			
		||||
			baseapp.SetChainID(TestChainId),
 | 
			
		||||
		),
 | 
			
		||||
		nil,
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -56,7 +55,6 @@ func TestExport(t *testing.T) {
 | 
			
		||||
			MakeEncodingConfig(),
 | 
			
		||||
			baseapp.SetChainID(TestChainId),
 | 
			
		||||
		),
 | 
			
		||||
		nil,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	genesisState := GenesisStateWithSingleValidator(&TestApp{App: *app}, NewDefaultGenesisState())
 | 
			
		||||
 | 
			
		||||
@ -96,7 +96,7 @@ func NewTestAppFromSealed() TestApp {
 | 
			
		||||
	bApp := NewBaseApp(log.NewNopLogger(), db, encCfg, baseapp.SetChainID(TestChainId))
 | 
			
		||||
	app := NewApp(
 | 
			
		||||
		chaincfg.DefaultNodeHome, nil,
 | 
			
		||||
		encCfg, DefaultOptions, bApp, nil,
 | 
			
		||||
		encCfg, DefaultOptions, bApp,
 | 
			
		||||
	)
 | 
			
		||||
	return TestApp{App: *app}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -126,6 +126,8 @@ func (ac appCreator) newApp(
 | 
			
		||||
		baseapp.SetMempool(mempool),
 | 
			
		||||
	)
 | 
			
		||||
	bApp.SetTxEncoder(ac.encodingConfig.TxConfig.TxEncoder())
 | 
			
		||||
	abciProposalHandler := app.NewDefaultProposalHandler(mempool, bApp)
 | 
			
		||||
	bApp.SetPrepareProposal(abciProposalHandler.PrepareProposalHandler())
 | 
			
		||||
 | 
			
		||||
	newApp := app.NewApp(
 | 
			
		||||
		homeDir, traceStore, ac.encodingConfig,
 | 
			
		||||
@ -140,10 +142,6 @@ func (ac appCreator) newApp(
 | 
			
		||||
			EVMMaxGasWanted:       cast.ToUint64(appOpts.Get(ethermintflags.EVMMaxTxGasWanted)),
 | 
			
		||||
		},
 | 
			
		||||
		bApp,
 | 
			
		||||
		func(k app.FeeMarketKeeper) sdk.PrepareProposalHandler {
 | 
			
		||||
			abciProposalHandler := app.NewDefaultProposalHandler(mempool, bApp, k)
 | 
			
		||||
			return abciProposalHandler.PrepareProposalHandler()
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	return newApp
 | 
			
		||||
@ -172,14 +170,14 @@ func (ac appCreator) appExport(
 | 
			
		||||
	var tempApp *app.App
 | 
			
		||||
	if height != -1 {
 | 
			
		||||
		bApp := app.NewBaseApp(logger, db, ac.encodingConfig)
 | 
			
		||||
		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp, nil)
 | 
			
		||||
		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp)
 | 
			
		||||
 | 
			
		||||
		if err := tempApp.LoadHeight(height); err != nil {
 | 
			
		||||
			return servertypes.ExportedApp{}, err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		bApp := app.NewBaseApp(logger, db, ac.encodingConfig)
 | 
			
		||||
		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp, nil)
 | 
			
		||||
		tempApp = app.NewApp(homePath, traceStore, ac.encodingConfig, options, bApp)
 | 
			
		||||
	}
 | 
			
		||||
	return tempApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@ -250,7 +250,7 @@ replace (
 | 
			
		||||
	// TODO: Tag before release
 | 
			
		||||
	github.com/ethereum/go-ethereum => github.com/evmos/go-ethereum v1.10.26-evmos-rc2
 | 
			
		||||
	// Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support
 | 
			
		||||
	github.com/evmos/ethermint => github.com/0glabs/ethermint v0.21.0-0g.v3.1.10
 | 
			
		||||
	github.com/evmos/ethermint => github.com/0glabs/ethermint v0.21.0-0g.v3.1.12
 | 
			
		||||
	// See https://github.com/cosmos/cosmos-sdk/pull/10401, https://github.com/cosmos/cosmos-sdk/commit/0592ba6158cd0bf49d894be1cef4faeec59e8320
 | 
			
		||||
	github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0
 | 
			
		||||
	// Downgraded to avoid bugs in following commits which causes "version does not exist" errors
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							@ -213,8 +213,8 @@ github.com/0glabs/cometbft v0.37.9-0glabs.1 h1:KQJG17Y21suKP3QNICLto4b5Ak73XbSmK
 | 
			
		||||
github.com/0glabs/cometbft v0.37.9-0glabs.1/go.mod h1:j0Q3RqrCd+cztWCugs3obbzC4NyHGBPZZjtm/fWV00I=
 | 
			
		||||
github.com/0glabs/cosmos-sdk v0.47.10-0glabs.10 h1:NJp0RwczHBO4EvrQdDxxftHOgUDBtNh7M/vpaG7wFtQ=
 | 
			
		||||
github.com/0glabs/cosmos-sdk v0.47.10-0glabs.10/go.mod h1:KskIVnhXTFqrw7CDccMvx7To5KzUsOomIsQV7sPGOog=
 | 
			
		||||
github.com/0glabs/ethermint v0.21.0-0g.v3.1.10 h1:DE8hK2OJp9rKYdT2Y0G259/6nAFcOQi383l2e7/VFnE=
 | 
			
		||||
github.com/0glabs/ethermint v0.21.0-0g.v3.1.10/go.mod h1:6e/gOcDLhvlDWK3JLJVBgki0gD6H4E1eG7l9byocgWA=
 | 
			
		||||
github.com/0glabs/ethermint v0.21.0-0g.v3.1.12 h1:IRVTFhDEH2J5w8ywQW7obXQxYhJYib70SNgKqLOXikU=
 | 
			
		||||
github.com/0glabs/ethermint v0.21.0-0g.v3.1.12/go.mod h1:6e/gOcDLhvlDWK3JLJVBgki0gD6H4E1eG7l9byocgWA=
 | 
			
		||||
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
 | 
			
		||||
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
 | 
			
		||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM=
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user