Problem: newPendingTransactions filter don't return ethereum tx hash (#900)

This commit is contained in:
yihuang 2022-01-13 21:12:57 +08:00 committed by GitHub
parent cad7545f8a
commit aeb6aeb715
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 8 deletions

View File

@ -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 * (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. * (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#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 ## [v0.9.0] - 2021-12-01

View File

@ -31,9 +31,13 @@ func RawTxToEthTx(clientCtx client.Context, txBz tmtypes.Tx) (*evmtypes.MsgEther
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 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 { 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 return ethTx, nil
} }

View File

@ -11,6 +11,7 @@ import (
"net/http" "net/http"
"sync" "sync"
"github.com/cosmos/cosmos-sdk/client"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -73,7 +74,7 @@ type websocketsServer struct {
logger log.Logger 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") logger = logger.With("api", "websocket-server")
_, port, _ := net.SplitHostPort(cfg.JSONRPC.Address) _, port, _ := net.SplitHostPort(cfg.JSONRPC.Address)
@ -82,7 +83,7 @@ func NewWebsocketsServer(logger log.Logger, tmWSClient *rpcclient.WSClient, cfg
wsAddr: cfg.JSONRPC.WsAddress, wsAddr: cfg.JSONRPC.WsAddress,
certFile: cfg.TLS.CertificatePath, certFile: cfg.TLS.CertificatePath,
keyFile: cfg.TLS.KeyPath, keyFile: cfg.TLS.KeyPath,
api: newPubSubAPI(logger, tmWSClient), api: newPubSubAPI(clientCtx, logger, tmWSClient),
logger: logger, logger: logger,
} }
} }
@ -293,16 +294,18 @@ type pubSubAPI struct {
filtersMu *sync.RWMutex filtersMu *sync.RWMutex
filters map[rpc.ID]*wsSubscription filters map[rpc.ID]*wsSubscription
logger log.Logger logger log.Logger
clientCtx client.Context
} }
// newPubSubAPI creates an instance of the ethereum PubSub API. // 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") logger = logger.With("module", "websocket-client")
return &pubSubAPI{ return &pubSubAPI{
events: rpcfilters.NewEventSystem(logger, tmWSClient), events: rpcfilters.NewEventSystem(logger, tmWSClient),
filtersMu: new(sync.RWMutex), filtersMu: new(sync.RWMutex),
filters: make(map[rpc.ID]*wsSubscription), filters: make(map[rpc.ID]*wsSubscription),
logger: logger, logger: logger,
clientCtx: clientCtx,
} }
} }
@ -680,7 +683,11 @@ func (api *pubSubAPI) subscribePendingTransactions(wsConn *wsConn) (rpc.ID, erro
select { select {
case ev := <-txsCh: case ev := <-txsCh:
data, _ := ev.Data.(tmtypes.EventDataTx) 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() api.filtersMu.RLock()
for subID, wsSub := range api.filters { for subID, wsSub := range api.filters {
@ -695,7 +702,7 @@ func (api *pubSubAPI) subscribePendingTransactions(wsConn *wsConn) (rpc.ID, erro
Method: "eth_subscription", Method: "eth_subscription",
Params: &SubscriptionResult{ Params: &SubscriptionResult{
Subscription: subID, Subscription: subID,
Result: txHash, Result: ethTx.Hash,
}, },
} }

View File

@ -75,7 +75,7 @@ func StartJSONRPC(ctx *server.Context, clientCtx client.Context, tmRPCAddr, tmEn
// allocate separate WS connection to Tendermint // allocate separate WS connection to Tendermint
tmWsClient = ConnectTmWS(tmRPCAddr, tmEndpoint, ctx.Logger) tmWsClient = ConnectTmWS(tmRPCAddr, tmEndpoint, ctx.Logger)
wsSrv := rpc.NewWebsocketsServer(ctx.Logger, tmWsClient, config) wsSrv := rpc.NewWebsocketsServer(clientCtx, ctx.Logger, tmWsClient, config)
wsSrv.Start() wsSrv.Start()
return httpSrv, httpSrvDone, nil return httpSrv, httpSrvDone, nil
} }