From 69b0abaa0df0f14e451acc2577d059d8108a6365 Mon Sep 17 00:00:00 2001 From: crypto-facs <84574577+crypto-facs@users.noreply.github.com> Date: Mon, 11 Jul 2022 23:04:45 +0800 Subject: [PATCH] fix(rpc): optimize `eth_getBalance` endpoint (#1169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * optimize get balance endpoint * add comment * add changelog Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> --- CHANGELOG.md | 29 +++++++++++++++++++++++++---- rpc/backend/backend.go | 1 + rpc/backend/evm_backend.go | 12 ++++++++++++ rpc/namespaces/ethereum/eth/api.go | 4 ++-- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3b86e3c26..72ce2c60f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,8 +40,20 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### State Machine Breaking -* (evm) [\#1128](https://github.com/tharsis/ethermint/pull/1128) Clear tx logs if tx failed in post processing hooks -* (evm) [\#1124](https://github.com/tharsis/ethermint/pull/1124) Reject non-replay-protected tx in `AnteHandler` to prevent replay attack +* (deps) [\#1159](https://github.com/evmos/ethermint/pull/1159) Bump Geth version to `v1.10.19`. +* (deps) [#1167](https://github.com/evmos/ethermint/pull/1167) Upgrade ibc-go to v4. + +### Improvements + +* (feemarket) [\#1165](https://github.com/evmos/ethermint/pull/1165) Add hint in specs about different gas terminology for gas in Cosmos and Ethereum. +* (rpc) [\#1169](https://github.com/evmos/ethermint/pull/1169) Remove unnecessary queries from `getBlockNumber` function + +## [v0.17.0] - 2022-06-27 + +### State Machine Breaking + +* (evm) [\#1128](https://github.com/evmos/ethermint/pull/1128) Clear tx logs if tx failed in post processing hooks +* (evm) [\#1124](https://github.com/evmos/ethermint/pull/1124) Reject non-replay-protected tx in `AnteHandler` to prevent replay attack ### API Breaking @@ -52,14 +64,23 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements * (deps) [\#1147](https://github.com/evmos/ethermint/pull/1147) Bump Go version to `1.18`. -* (feemarket) [\#1120](https://github.com/evmos/ethermint/pull/1120) Make `min-gas-multiplier` parameter accept zero value * (feemarket) [\#1135](https://github.com/evmos/ethermint/pull/1135) Set lower bound of base fee to min gas price param +* (evm) [\#1142](https://github.com/evmos/ethermint/pull/1142) Rename `RejectUnprotectedTx` to `AllowUnprotectedTxs` for consistency with go-ethereum. ### Bug Fixes -* (evm) [\#1118](https://github.com/evmos/ethermint/pull/1118) Fix `Type()` `Account` method `EmptyCodeHash` comparison * (rpc) [\#1138](https://github.com/evmos/ethermint/pull/1138) Fix GasPrice calculation with relation to `MinGasPrice` +## [v0.16.1] - 2022-06-09 + +### Improvements + +* (feemarket) [\#1120](https://github.com/evmos/ethermint/pull/1120) Make `min-gas-multiplier` parameter accept zero value + +### Bug Fixes + +* (evm) [\#1118](https://github.com/evmos/ethermint/pull/1118) Fix `Type()` `Account` method `EmptyCodeHash` comparison + ## [v0.16.0] - 2022-06-06 ### State Machine Breaking diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index bb3fe58b49..67e815a368 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -61,6 +61,7 @@ type EVMBackend interface { CurrentHeader() *ethtypes.Header HeaderByNumber(blockNum types.BlockNumber) (*ethtypes.Header, error) HeaderByHash(blockHash common.Hash) (*ethtypes.Header, error) + GetBlockNumberByHash(blockHash common.Hash) (*big.Int, error) PendingTransactions() ([]*sdk.Tx, error) GetTransactionCount(address common.Address, blockNum types.BlockNumber) (*hexutil.Uint64, error) SendTransaction(args evmtypes.TransactionArgs) (common.Hash, error) diff --git a/rpc/backend/evm_backend.go b/rpc/backend/evm_backend.go index a62f5a5d5e..21494cb33a 100644 --- a/rpc/backend/evm_backend.go +++ b/rpc/backend/evm_backend.go @@ -369,6 +369,18 @@ func (b *Backend) HeaderByNumber(blockNum types.BlockNumber) (*ethtypes.Header, return ethHeader, nil } +// GetBlockNumberByHash returns the block height of given block hash +func (b *Backend) GetBlockNumberByHash(blockHash common.Hash) (*big.Int, error) { + resBlock, err := b.GetTendermintBlockByHash(blockHash) + if err != nil { + return nil, err + } + if resBlock == nil { + return nil, errors.Errorf("block not found for hash %s", blockHash.Hex()) + } + return big.NewInt(resBlock.Block.Height), nil +} + // HeaderByHash returns the block header identified by hash. func (b *Backend) HeaderByHash(blockHash common.Hash) (*ethtypes.Header, error) { resBlock, err := b.GetTendermintBlockByHash(blockHash) diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index c2094d8111..a1d9cb4155 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -1138,11 +1138,11 @@ func (e *PublicAPI) getBlockNumber(blockNrOrHash rpctypes.BlockNumberOrHash) (rp case blockNrOrHash.BlockHash == nil && blockNrOrHash.BlockNumber == nil: return rpctypes.EthEarliestBlockNumber, fmt.Errorf("types BlockHash and BlockNumber cannot be both nil") case blockNrOrHash.BlockHash != nil: - blockHeader, err := e.backend.HeaderByHash(*blockNrOrHash.BlockHash) + blockNumber, err := e.backend.GetBlockNumberByHash(*blockNrOrHash.BlockHash) if err != nil { return rpctypes.EthEarliestBlockNumber, err } - return rpctypes.NewBlockNumber(blockHeader.Number), nil + return rpctypes.NewBlockNumber(blockNumber), nil case blockNrOrHash.BlockNumber != nil: return *blockNrOrHash.BlockNumber, nil default: