From 6d11e233265b9ed1013bc728533b66a61b23f927 Mon Sep 17 00:00:00 2001 From: Louis Liu <35095310+louisliu2048@users.noreply.github.com> Date: Mon, 1 Feb 2021 10:20:22 +0800 Subject: [PATCH] rpc: fix method to calculate block hash and fix mismatch block hash in eth.getBlock response (#755) --- CHANGELOG.md | 3 ++- rpc/namespaces/eth/api.go | 9 +++++---- rpc/types/utils.go | 6 +++--- x/evm/client/rest/rest.go | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dab4eb58..7f75947e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,7 +43,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (evm) [\#670](https://github.com/cosmos/ethermint/pull/670) Migrate types to the ones defined by the protobuf messages, which are required for the stargate release. ### Bug Fixes - +* (evm) [\#751](https://github.com/cosmos/ethermint/issues/751) Fix misused method to calculate block hash in evm related function. +* (evm) [\#721](https://github.com/cosmos/ethermint/issues/721) Fix mismatch block hash in rpc response when use eht.getBlock. * (evm) [\#730](https://github.com/cosmos/ethermint/issues/730) Fix 'EIP2028' not open when Istanbul version has been enabled. * (evm) [\#749](https://github.com/cosmos/ethermint/issues/749) Fix panic in `AnteHandler` when gas price larger than 100000 * (evm) [\#747](https://github.com/cosmos/ethermint/issues/747) Fix format errors in String() of QueryETHLogs diff --git a/rpc/namespaces/eth/api.go b/rpc/namespaces/eth/api.go index ee3dd6f2..a1546593 100644 --- a/rpc/namespaces/eth/api.go +++ b/rpc/namespaces/eth/api.go @@ -689,10 +689,11 @@ func (api *PublicEthereumAPI) GetBlockByNumber(blockNum rpctypes.BlockNumber, fu ChainID: api.clientCtx.ChainID, Height: height + 1, Time: time.Unix(0, 0), - LastBlockID: latestBlock.BlockID, + LastBlockID: latestBlock.Block.LastBlockID, ValidatorsHash: latestBlock.Block.NextValidatorsHash, }, 0, + latestBlock.Block.Hash(), 0, gasUsed, pendingTxs, @@ -731,7 +732,7 @@ func (api *PublicEthereumAPI) GetTransactionByHash(hash common.Hash) (*rpctypes. return nil, err } - blockHash := common.BytesToHash(block.Block.Header.Hash()) + blockHash := common.BytesToHash(block.Block.Hash()) ethTx, err := rpctypes.RawTxToEthTx(api.clientCtx, tx.Tx) if err != nil { @@ -817,7 +818,7 @@ func (api *PublicEthereumAPI) getTransactionByBlockAndIndex(block *tmtypes.Block height := uint64(block.Height) txHash := common.BytesToHash(block.Txs[idx].Hash()) - blockHash := common.BytesToHash(block.Header.Hash()) + blockHash := common.BytesToHash(block.Hash()) return rpctypes.NewTransaction(ethTx, txHash, blockHash, height, uint64(idx)) } @@ -836,7 +837,7 @@ func (api *PublicEthereumAPI) GetTransactionReceipt(hash common.Hash) (map[strin return nil, err } - blockHash := common.BytesToHash(block.Block.Header.Hash()) + blockHash := common.BytesToHash(block.Block.Hash()) // Convert tx bytes to eth transaction ethTx, err := rpctypes.RawTxToEthTx(api.clientCtx, tx.Tx) diff --git a/rpc/types/utils.go b/rpc/types/utils.go index a0e591e1..202786db 100644 --- a/rpc/types/utils.go +++ b/rpc/types/utils.go @@ -90,7 +90,7 @@ func EthBlockFromTendermint(clientCtx clientcontext.CLIContext, block *tmtypes.B bloom := bloomRes.Bloom - return FormatBlock(block.Header, block.Size(), gasLimit, gasUsed, transactions, bloom), nil + return FormatBlock(block.Header, block.Size(), block.Hash(), gasLimit, gasUsed, transactions, bloom), nil } // EthHeaderFromTendermint is an util function that returns an Ethereum Header @@ -153,7 +153,7 @@ func BlockMaxGasFromConsensusParams(_ context.Context, clientCtx clientcontext.C // FormatBlock creates an ethereum block from a tendermint header and ethereum-formatted // transactions. func FormatBlock( - header tmtypes.Header, size int, gasLimit int64, + header tmtypes.Header, size int, curBlockHash tmbytes.HexBytes, gasLimit int64, gasUsed *big.Int, transactions interface{}, bloom ethtypes.Bloom, ) map[string]interface{} { if len(header.DataHash) == 0 { @@ -162,7 +162,7 @@ func FormatBlock( return map[string]interface{}{ "number": hexutil.Uint64(header.Height), - "hash": hexutil.Bytes(header.Hash()), + "hash": hexutil.Bytes(curBlockHash), "parentHash": hexutil.Bytes(header.LastBlockID.Hash), "nonce": hexutil.Uint64(0), // PoW specific "sha3Uncles": common.Hash{}, // No uncles in Tendermint diff --git a/x/evm/client/rest/rest.go b/x/evm/client/rest/rest.go index 7658faa9..a701a943 100644 --- a/x/evm/client/rest/rest.go +++ b/x/evm/client/rest/rest.go @@ -82,7 +82,7 @@ func getEthTransactionByHash(cliCtx context.CLIContext, hashHex string) ([]byte, return nil, err } - blockHash := common.BytesToHash(block.Block.Header.Hash()) + blockHash := common.BytesToHash(block.Block.Hash()) ethTx, err := rpctypes.RawTxToEthTx(cliCtx, tx.Tx) if err != nil {