From d04787e97f777be169c692b7d069d3944d2e437d Mon Sep 17 00:00:00 2001 From: Loredana Cirstea Date: Tue, 15 Mar 2022 09:11:31 +0200 Subject: [PATCH] eth_feeHistory - fix reward calculation from MsgEthereumTx (#990) * eth_feeHistory - fix reward calculation from MsgEthereumTx Problem: - rewards calculation based on percentiles took into consideration the tendermint tx count instead of `MsgEthereumTx` count. - `sorter := make(sortGasAndReward, tendermintTxCount)` creates an array of `{0 }` values. The `nil` value from the `reward` attribute was never rewritten for tendermint Tx without any `MsgEthereumTx` Fixes: - return early if there are 0 `MsgEthereumTx` - use the `MsgEthereumTx` count to calculate rewards * Add change log --- CHANGELOG.md | 6 ++++++ rpc/ethereum/backend/feebackend.go | 30 +++++++++++++++--------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 102488ff..b7b4a0d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,12 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## Unreleased +### Bug Fixes + +* (rpc) [tharsis#990](https://github.com/tharsis/ethermint/pull/990) Calculate reward values from all `MsgEthereumTx` from a block in `eth_feeHistory`. + +## [v0.11.0] - 2022-03-06 + ### State Machine Breaking * (ante) [tharsis#964](https://github.com/tharsis/ethermint/pull/964) add NewInfiniteGasMeterWithLimit for storing the user provided gas limit. Fixes block's consumed gas calculation in the block creation phase. diff --git a/rpc/ethereum/backend/feebackend.go b/rpc/ethereum/backend/feebackend.go index ed44833a..88afc668 100644 --- a/rpc/ethereum/backend/feebackend.go +++ b/rpc/ethereum/backend/feebackend.go @@ -61,14 +61,15 @@ func (e *EVMBackend) processBlock( rewardCount := len(rewardPercentiles) targetOneFeeHistory.Reward = make([]*big.Int, rewardCount) for i := 0; i < rewardCount; i++ { - targetOneFeeHistory.Reward[i] = big.NewInt(2000) + targetOneFeeHistory.Reward[i] = big.NewInt(0) } // check tendermintTxs tendermintTxs := tendermintBlock.Block.Txs tendermintTxResults := tendermintBlockResult.TxsResults tendermintTxCount := len(tendermintTxs) - sorter := make(sortGasAndReward, tendermintTxCount) + + var sorter sortGasAndReward for i := 0; i < tendermintTxCount; i++ { eachTendermintTx := tendermintTxs[i] @@ -90,29 +91,28 @@ func (e *EVMBackend) processBlock( if reward == nil { reward = big.NewInt(0) } - sorter[i] = txGasAndReward{gasUsed: txGasUsed, reward: reward} - break + sorter = append(sorter, txGasAndReward{gasUsed: txGasUsed, reward: reward}) } } + + // return an all zero row if there are no transactions to gather data from + ethTxCount := len(sorter) + if ethTxCount == 0 { + return nil + } + sort.Sort(sorter) var txIndex int - sumGasUsed := uint64(0) - if len(sorter) > 0 { - sumGasUsed = sorter[0].gasUsed - } + sumGasUsed := sorter[0].gasUsed + for i, p := range rewardPercentiles { thresholdGasUsed := uint64(blockGasUsed * p / 100) - for sumGasUsed < thresholdGasUsed && txIndex < tendermintTxCount-1 { + for sumGasUsed < thresholdGasUsed && txIndex < ethTxCount-1 { txIndex++ sumGasUsed += sorter[txIndex].gasUsed } - - chosenReward := big.NewInt(0) - if 0 <= txIndex && txIndex < len(sorter) { - chosenReward = sorter[txIndex].reward - } - targetOneFeeHistory.Reward[i] = chosenReward + targetOneFeeHistory.Reward[i] = sorter[txIndex].reward } return nil