From aeb6aeb71507c2c38b111fa7eac19e76832518c0 Mon Sep 17 00:00:00 2001 From: yihuang Date: Thu, 13 Jan 2022 21:12:57 +0800 Subject: [PATCH] Problem: newPendingTransactions filter don't return ethereum tx hash (#900) --- CHANGELOG.md | 1 + rpc/ethereum/types/utils.go | 8 ++++++-- rpc/websockets.go | 17 ++++++++++++----- server/json_rpc.go | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1694ed3a..ea8b26ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (rpc) [tharsis#865](https://github.com/tharsis/ethermint/pull/865) Fix RPC Filter parameters being ignored * (evm) [tharsis#871](https://github.com/tharsis/ethermint/pull/871) Set correct nonce in `EthCall` and `EstimateGas` grpc query. * (rpc) [tharsis#878](https://github.com/tharsis/ethermint/pull/878) Workaround to make GetBlock RPC api report correct block gas used. +* (rpc) [tharsis#900](https://github.com/tharsis/ethermint/pull/900) newPendingTransactions filter return ethereum tx hash. ## [v0.9.0] - 2021-12-01 diff --git a/rpc/ethereum/types/utils.go b/rpc/ethereum/types/utils.go index 290af5eb..6e8990d7 100644 --- a/rpc/ethereum/types/utils.go +++ b/rpc/ethereum/types/utils.go @@ -31,9 +31,13 @@ func RawTxToEthTx(clientCtx client.Context, txBz tmtypes.Tx) (*evmtypes.MsgEther return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) } - ethTx, ok := tx.(*evmtypes.MsgEthereumTx) + if len(tx.GetMsgs()) != 1 { + return nil, errors.New("not ethereum tx") + } + + ethTx, ok := tx.GetMsgs()[0].(*evmtypes.MsgEthereumTx) if !ok { - return nil, fmt.Errorf("invalid transaction type %T, expected %T", tx, evmtypes.MsgEthereumTx{}) + return nil, fmt.Errorf("invalid msg type %T, expected %T", tx, evmtypes.MsgEthereumTx{}) } return ethTx, nil } diff --git a/rpc/websockets.go b/rpc/websockets.go index 80679f8c..1a6ef78b 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -11,6 +11,7 @@ import ( "net/http" "sync" + "github.com/cosmos/cosmos-sdk/client" "github.com/gorilla/mux" "github.com/gorilla/websocket" "github.com/pkg/errors" @@ -73,7 +74,7 @@ type websocketsServer struct { logger log.Logger } -func NewWebsocketsServer(logger log.Logger, tmWSClient *rpcclient.WSClient, cfg config.Config) WebsocketsServer { +func NewWebsocketsServer(clientCtx client.Context, logger log.Logger, tmWSClient *rpcclient.WSClient, cfg config.Config) WebsocketsServer { logger = logger.With("api", "websocket-server") _, port, _ := net.SplitHostPort(cfg.JSONRPC.Address) @@ -82,7 +83,7 @@ func NewWebsocketsServer(logger log.Logger, tmWSClient *rpcclient.WSClient, cfg wsAddr: cfg.JSONRPC.WsAddress, certFile: cfg.TLS.CertificatePath, keyFile: cfg.TLS.KeyPath, - api: newPubSubAPI(logger, tmWSClient), + api: newPubSubAPI(clientCtx, logger, tmWSClient), logger: logger, } } @@ -293,16 +294,18 @@ type pubSubAPI struct { filtersMu *sync.RWMutex filters map[rpc.ID]*wsSubscription logger log.Logger + clientCtx client.Context } // newPubSubAPI creates an instance of the ethereum PubSub API. -func newPubSubAPI(logger log.Logger, tmWSClient *rpcclient.WSClient) *pubSubAPI { +func newPubSubAPI(clientCtx client.Context, logger log.Logger, tmWSClient *rpcclient.WSClient) *pubSubAPI { logger = logger.With("module", "websocket-client") return &pubSubAPI{ events: rpcfilters.NewEventSystem(logger, tmWSClient), filtersMu: new(sync.RWMutex), filters: make(map[rpc.ID]*wsSubscription), logger: logger, + clientCtx: clientCtx, } } @@ -680,7 +683,11 @@ func (api *pubSubAPI) subscribePendingTransactions(wsConn *wsConn) (rpc.ID, erro select { case ev := <-txsCh: data, _ := ev.Data.(tmtypes.EventDataTx) - txHash := common.BytesToHash(tmtypes.Tx(data.Tx).Hash()) + ethTx, err := types.RawTxToEthTx(api.clientCtx, data.Tx) + if err != nil { + // not ethereum tx + panic("debug") + } api.filtersMu.RLock() for subID, wsSub := range api.filters { @@ -695,7 +702,7 @@ func (api *pubSubAPI) subscribePendingTransactions(wsConn *wsConn) (rpc.ID, erro Method: "eth_subscription", Params: &SubscriptionResult{ Subscription: subID, - Result: txHash, + Result: ethTx.Hash, }, } diff --git a/server/json_rpc.go b/server/json_rpc.go index 204427fc..315cc850 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -75,7 +75,7 @@ func StartJSONRPC(ctx *server.Context, clientCtx client.Context, tmRPCAddr, tmEn // allocate separate WS connection to Tendermint tmWsClient = ConnectTmWS(tmRPCAddr, tmEndpoint, ctx.Logger) - wsSrv := rpc.NewWebsocketsServer(ctx.Logger, tmWsClient, config) + wsSrv := rpc.NewWebsocketsServer(clientCtx, ctx.Logger, tmWsClient, config) wsSrv.Start() return httpSrv, httpSrvDone, nil }