Skip to content

Commit

Permalink
Problem: hash in subscribe newHeads differs from eth_getBlockByNumber (
Browse files Browse the repository at this point in the history
…evmos#521)

* Problem: hash in subscribe newHeads differs from eth_getBlockByNumber

* fix test

* cleanup
  • Loading branch information
mmsqe committed Sep 16, 2024
1 parent a4e82cc commit 5a129e2
Show file tree
Hide file tree
Showing 12 changed files with 171 additions and 20 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (rpc) [#473](https://github.com/crypto-org-chain/ethermint/pull/473) Avoid panic on invalid elasticity_multiplier.
* (rpc) [#480](https://github.com/crypto-org-chain/ethermint/pull/480) Fix parsed logs from old events.
* (rpc) [#488](https://github.com/crypto-org-chain/ethermint/pull/488) Fix handling of pending transactions related APIs.
* (rpc) [#521](https://github.com/crypto-org-chain/ethermint/pull/521) Align hash and miner in subscribe newHeads with eth_getBlockByNumber.

### Improvements

Expand Down
21 changes: 15 additions & 6 deletions rpc/backend/blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -322,8 +322,11 @@ func (b *Backend) HeaderByNumber(blockNum rpctypes.BlockNumber) (*ethtypes.Heade
// handle the error for pruned node.
b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", resBlock.Block.Height, "error", err)
}

ethHeader := rpctypes.EthHeaderFromTendermint(resBlock.Block.Header, bloom, baseFee)
validator, err := b.getValidatorAccount(resBlock)
if err != nil {
return nil, err
}
ethHeader := rpctypes.EthHeaderFromTendermint(resBlock.Block.Header, bloom, baseFee, validator)
return ethHeader, nil
}

Expand Down Expand Up @@ -352,8 +355,11 @@ func (b *Backend) HeaderByHash(blockHash common.Hash) (*ethtypes.Header, error)
// handle the error for pruned node.
b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", resBlock.Block.Height, "error", err)
}

ethHeader := rpctypes.EthHeaderFromTendermint(resBlock.Block.Header, bloom, baseFee)
validator, err := b.getValidatorAccount(resBlock)
if err != nil {
return nil, err
}
ethHeader := rpctypes.EthHeaderFromTendermint(resBlock.Block.Header, bloom, baseFee, validator)
return ethHeader, nil
}

Expand Down Expand Up @@ -505,8 +511,11 @@ func (b *Backend) EthBlockFromTendermintBlock(
// handle error for pruned node and log
b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", height, "error", err)
}

ethHeader := rpctypes.EthHeaderFromTendermint(block.Header, bloom, baseFee)
validator, err := b.getValidatorAccount(resBlock)
if err != nil {
return nil, err
}
ethHeader := rpctypes.EthHeaderFromTendermint(block.Header, bloom, baseFee, validator)
msgs := b.EthMsgsFromTendermintBlock(resBlock, blockRes)

txs := make([]*ethtypes.Transaction, len(msgs))
Expand Down
26 changes: 24 additions & 2 deletions rpc/backend/blocks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() {
var expResultBlock *tmrpctypes.ResultBlock

_, bz := suite.buildEthereumTx()
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())

testCases := []struct {
name string
Expand Down Expand Up @@ -1240,6 +1241,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() {

queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFeeError(queryClient)
RegisterValidatorAccount(queryClient, validator)
},
true,
},
Expand All @@ -1255,6 +1257,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() {

queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
true,
},
Expand All @@ -1270,6 +1273,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() {

queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
true,
},
Expand All @@ -1282,7 +1286,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() {
header, err := suite.backend.HeaderByNumber(tc.blockNumber)

if tc.expPass {
expHeader := ethrpc.EthHeaderFromTendermint(expResultBlock.Block.Header, ethtypes.Bloom{}, tc.baseFee)
expHeader := ethrpc.EthHeaderFromTendermint(expResultBlock.Block.Header, ethtypes.Bloom{}, tc.baseFee, validator)
suite.Require().NoError(err)
suite.Require().Equal(expHeader, header)
} else {
Expand All @@ -1298,6 +1302,8 @@ func (suite *BackendTestSuite) TestHeaderByHash() {
_, bz := suite.buildEthereumTx()
block := tmtypes.MakeBlock(1, []tmtypes.Tx{bz}, nil, nil)
emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil)
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())
emptyBlock.Header.ProposerAddress = validator.Bytes()

testCases := []struct {
name string
Expand Down Expand Up @@ -1350,6 +1356,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() {

queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFeeError(queryClient)
RegisterValidatorAccount(queryClient, validator)
},
true,
},
Expand All @@ -1365,6 +1372,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() {

queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
true,
},
Expand All @@ -1380,6 +1388,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() {

queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
true,
},
Expand All @@ -1392,7 +1401,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() {
header, err := suite.backend.HeaderByHash(tc.hash)

if tc.expPass {
expHeader := ethrpc.EthHeaderFromTendermint(expResultBlock.Block.Header, ethtypes.Bloom{}, tc.baseFee)
expHeader := ethrpc.EthHeaderFromTendermint(expResultBlock.Block.Header, ethtypes.Bloom{}, tc.baseFee, validator)
suite.Require().NoError(err)
suite.Require().Equal(expHeader, header)
} else {
Expand All @@ -1405,6 +1414,8 @@ func (suite *BackendTestSuite) TestHeaderByHash() {
func (suite *BackendTestSuite) TestEthBlockByNumber() {
msgEthereumTx, bz := suite.buildEthereumTx()
emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil)
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())
emptyBlock.Header.ProposerAddress = validator.Bytes()

testCases := []struct {
name string
Expand Down Expand Up @@ -1448,12 +1459,14 @@ func (suite *BackendTestSuite) TestEthBlockByNumber() {
queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
baseFee := sdk.NewInt(1)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
ethtypes.NewBlock(
ethrpc.EthHeaderFromTendermint(
emptyBlock.Header,
ethtypes.Bloom{},
sdk.NewInt(1).BigInt(),
validator,
),
[]*ethtypes.Transaction{},
nil,
Expand All @@ -1474,12 +1487,14 @@ func (suite *BackendTestSuite) TestEthBlockByNumber() {
queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
baseFee := sdk.NewInt(1)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
ethtypes.NewBlock(
ethrpc.EthHeaderFromTendermint(
emptyBlock.Header,
ethtypes.Bloom{},
sdk.NewInt(1).BigInt(),
validator,
),
[]*ethtypes.Transaction{msgEthereumTx.AsTransaction()},
nil,
Expand Down Expand Up @@ -1515,6 +1530,9 @@ func (suite *BackendTestSuite) TestEthBlockByNumber() {
func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() {
msgEthereumTx, bz := suite.buildEthereumTx()
emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil)
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())
emptyBlock.Header.ProposerAddress = validator.Bytes()
consAddress := sdk.ConsAddress(emptyBlock.Header.ProposerAddress).String()

testCases := []struct {
name string
Expand All @@ -1538,12 +1556,14 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() {
func(baseFee sdk.Int, blockNum int64) {
queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccountWithConsAddress(queryClient, validator, consAddress)
},
ethtypes.NewBlock(
ethrpc.EthHeaderFromTendermint(
emptyBlock.Header,
ethtypes.Bloom{},
sdk.NewInt(1).BigInt(),
validator,
),
[]*ethtypes.Transaction{},
nil,
Expand Down Expand Up @@ -1573,12 +1593,14 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() {
func(baseFee sdk.Int, blockNum int64) {
queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
ethtypes.NewBlock(
ethrpc.EthHeaderFromTendermint(
emptyBlock.Header,
ethtypes.Bloom{},
sdk.NewInt(1).BigInt(),
validator,
),
[]*ethtypes.Transaction{msgEthereumTx.AsTransaction()},
nil,
Expand Down
11 changes: 11 additions & 0 deletions rpc/backend/call_tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ func (suite *BackendTestSuite) TestResend() {
gasPrice := new(hexutil.Big)
toAddr := tests.GenerateAddress()
chainID := (*hexutil.Big)(suite.backend.chainID)
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())
callArgs := evmtypes.TransactionArgs{
From: nil,
To: &toAddr,
Expand Down Expand Up @@ -67,6 +68,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFeeDisabled(queryClient)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand All @@ -89,6 +91,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand All @@ -108,6 +111,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFeeDisabled(queryClient)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand Down Expand Up @@ -161,6 +165,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand All @@ -184,6 +189,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand All @@ -208,6 +214,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterParams(queryClient, &header, 1)
RegisterParamsWithoutHeader(queryClient, 1)
RegisterUnconfirmedTxsError(client, nil)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand Down Expand Up @@ -236,6 +243,7 @@ func (suite *BackendTestSuite) TestResend() {
RegisterParams(queryClient, &header, 1)
RegisterParamsWithoutHeader(queryClient, 1)
RegisterUnconfirmedTxsEmpty(client, nil)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
Nonce: &txNonce,
Expand Down Expand Up @@ -437,6 +445,7 @@ func (suite *BackendTestSuite) TestDoCall() {

func (suite *BackendTestSuite) TestGasPrice() {
defaultGasPrice := (*hexutil.Big)(big.NewInt(1))
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())

testCases := []struct {
name string
Expand All @@ -456,6 +465,7 @@ func (suite *BackendTestSuite) TestGasPrice() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFee(queryClient, sdk.NewInt(1))
RegisterValidatorAccount(queryClient, validator)
},
defaultGasPrice,
true,
Expand All @@ -472,6 +482,7 @@ func (suite *BackendTestSuite) TestGasPrice() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFee(queryClient, sdk.NewInt(1))
RegisterValidatorAccount(queryClient, validator)
},
defaultGasPrice,
false,
Expand Down
7 changes: 7 additions & 0 deletions rpc/backend/evm_query_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,13 @@ func RegisterValidatorAccount(queryClient *mocks.EVMQueryClient, validator sdk.A
Return(&evmtypes.QueryValidatorAccountResponse{AccountAddress: validator.String()}, nil)
}

func RegisterValidatorAccountWithConsAddress(queryClient *mocks.EVMQueryClient, validator sdk.AccAddress, consAddress string) {
queryClient.On("ValidatorAccount", rpc.ContextWithHeight(1), &evmtypes.QueryValidatorAccountRequest{
ConsAddress: consAddress,
}).
Return(&evmtypes.QueryValidatorAccountResponse{AccountAddress: validator.String()}, nil)
}

func RegisterValidatorAccountError(queryClient *mocks.EVMQueryClient) {
queryClient.On("ValidatorAccount", rpc.ContextWithHeight(1), &evmtypes.QueryValidatorAccountRequest{}).
Return(nil, status.Error(codes.InvalidArgument, "empty request"))
Expand Down
5 changes: 4 additions & 1 deletion rpc/backend/sign_tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ func (suite *BackendTestSuite) TestSendTransaction() {
Gas: &gas,
Nonce: &nonce,
}

hash := common.Hash{}
validator := sdk.AccAddress(tests.GenerateAddress().Bytes())

testCases := []struct {
name string
Expand Down Expand Up @@ -77,6 +77,7 @@ func (suite *BackendTestSuite) TestSendTransaction() {
RegisterBlock(client, 1, nil)
RegisterBlockResults(client, 1)
RegisterBaseFee(queryClient, baseFee)
RegisterValidatorAccount(queryClient, validator)
},
evmtypes.TransactionArgs{
From: &from,
Expand Down Expand Up @@ -108,6 +109,7 @@ func (suite *BackendTestSuite) TestSendTransaction() {
txEncoder := suite.backend.clientCtx.TxConfig.TxEncoder()
txBytes, _ := txEncoder(tx)
RegisterBroadcastTxError(client, txBytes)
RegisterValidatorAccount(queryClient, validator)
},
callArgsDefault,
common.Hash{},
Expand All @@ -133,6 +135,7 @@ func (suite *BackendTestSuite) TestSendTransaction() {
txEncoder := suite.backend.clientCtx.TxConfig.TxEncoder()
txBytes, _ := txEncoder(tx)
RegisterBroadcastTx(client, txBytes)
RegisterValidatorAccount(queryClient, validator)
},
callArgsDefault,
hash,
Expand Down
13 changes: 13 additions & 0 deletions rpc/backend/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -317,3 +317,16 @@ func GetHexProofs(proof *crypto.ProofOps) []string {
}
return proofs
}

func (b *Backend) getValidatorAccount(resBlock *tmrpctypes.ResultBlock) (sdk.AccAddress, error) {
res, err := b.queryClient.ValidatorAccount(
types.ContextWithHeight(resBlock.Block.Header.Height),
&evmtypes.QueryValidatorAccountRequest{
ConsAddress: sdk.ConsAddress(resBlock.Block.Header.ProposerAddress).String(),
},
)
if err != nil {
return nil, fmt.Errorf("failed to get validator account %w", err)
}
return sdk.AccAddressFromBech32(res.AccountAddress)
}
Loading

0 comments on commit 5a129e2

Please sign in to comment.