2021-06-25 09:18:37 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
2022-08-10 12:26:51 +00:00
|
|
|
"net"
|
2021-06-25 09:18:37 +00:00
|
|
|
"net/http"
|
|
|
|
"time"
|
|
|
|
|
2022-08-10 12:26:51 +00:00
|
|
|
"github.com/evmos/ethermint/server/config"
|
2021-06-25 09:18:37 +00:00
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/improbable-eng/grpc-web/go/grpcweb"
|
2021-06-29 17:02:21 +00:00
|
|
|
"github.com/spf13/cobra"
|
2022-08-10 12:26:51 +00:00
|
|
|
"golang.org/x/net/netutil"
|
2021-06-29 17:02:21 +00:00
|
|
|
|
|
|
|
sdkserver "github.com/cosmos/cosmos-sdk/server"
|
|
|
|
"github.com/cosmos/cosmos-sdk/server/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/version"
|
|
|
|
|
2022-04-12 13:31:25 +00:00
|
|
|
tmcmd "github.com/tendermint/tendermint/cmd/tendermint/commands"
|
2021-08-19 16:55:13 +00:00
|
|
|
tmlog "github.com/tendermint/tendermint/libs/log"
|
2021-06-29 17:02:21 +00:00
|
|
|
rpcclient "github.com/tendermint/tendermint/rpc/jsonrpc/client"
|
2021-06-25 09:18:37 +00:00
|
|
|
)
|
|
|
|
|
2022-08-10 12:26:51 +00:00
|
|
|
// AddCommands adds server commands
|
2021-06-29 17:02:21 +00:00
|
|
|
func AddCommands(rootCmd *cobra.Command, defaultNodeHome string, appCreator types.AppCreator, appExport types.AppExporter, addStartFlags types.ModuleInitFlags) {
|
|
|
|
tendermintCmd := &cobra.Command{
|
|
|
|
Use: "tendermint",
|
|
|
|
Short: "Tendermint subcommands",
|
|
|
|
}
|
|
|
|
|
|
|
|
tendermintCmd.AddCommand(
|
|
|
|
sdkserver.ShowNodeIDCmd(),
|
|
|
|
sdkserver.ShowValidatorCmd(),
|
|
|
|
sdkserver.ShowAddressCmd(),
|
|
|
|
sdkserver.VersionCmd(),
|
2022-04-12 13:31:25 +00:00
|
|
|
tmcmd.ResetAllCmd,
|
|
|
|
tmcmd.ResetStateCmd,
|
2021-06-29 17:02:21 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
startCmd := StartCmd(appCreator, defaultNodeHome)
|
|
|
|
addStartFlags(startCmd)
|
|
|
|
|
|
|
|
rootCmd.AddCommand(
|
|
|
|
startCmd,
|
|
|
|
tendermintCmd,
|
2021-09-15 08:27:37 +00:00
|
|
|
sdkserver.ExportCmd(appExport, defaultNodeHome),
|
2021-06-29 17:02:21 +00:00
|
|
|
version.NewVersionCommand(),
|
2022-05-31 10:26:40 +00:00
|
|
|
sdkserver.NewRollbackCmd(defaultNodeHome),
|
2021-06-29 17:02:21 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2021-08-19 16:55:13 +00:00
|
|
|
func ConnectTmWS(tmRPCAddr, tmEndpoint string, logger tmlog.Logger) *rpcclient.WSClient {
|
2021-06-25 09:18:37 +00:00
|
|
|
tmWsClient, err := rpcclient.NewWS(tmRPCAddr, tmEndpoint,
|
|
|
|
rpcclient.MaxReconnectAttempts(256),
|
|
|
|
rpcclient.ReadWait(120*time.Second),
|
|
|
|
rpcclient.WriteWait(120*time.Second),
|
|
|
|
rpcclient.PingPeriod(50*time.Second),
|
|
|
|
rpcclient.OnReconnect(func() {
|
2021-08-19 16:55:13 +00:00
|
|
|
logger.Debug("EVM RPC reconnects to Tendermint WS", "address", tmRPCAddr+tmEndpoint)
|
2021-06-25 09:18:37 +00:00
|
|
|
}),
|
|
|
|
)
|
|
|
|
|
|
|
|
if err != nil {
|
2021-08-19 16:55:13 +00:00
|
|
|
logger.Error(
|
|
|
|
"Tendermint WS client could not be created",
|
|
|
|
"address", tmRPCAddr+tmEndpoint,
|
|
|
|
"error", err,
|
|
|
|
)
|
2021-06-25 09:18:37 +00:00
|
|
|
} else if err := tmWsClient.OnStart(); err != nil {
|
2021-08-19 16:55:13 +00:00
|
|
|
logger.Error(
|
|
|
|
"Tendermint WS client could not start",
|
|
|
|
"address", tmRPCAddr+tmEndpoint,
|
|
|
|
"error", err,
|
|
|
|
)
|
2021-06-25 09:18:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return tmWsClient
|
|
|
|
}
|
|
|
|
|
|
|
|
func MountGRPCWebServices(
|
|
|
|
router *mux.Router,
|
|
|
|
grpcWeb *grpcweb.WrappedGrpcServer,
|
|
|
|
grpcResources []string,
|
2021-08-19 16:55:13 +00:00
|
|
|
logger tmlog.Logger,
|
2021-06-25 09:18:37 +00:00
|
|
|
) {
|
|
|
|
for _, res := range grpcResources {
|
2021-08-19 16:55:13 +00:00
|
|
|
|
|
|
|
logger.Info("[GRPC Web] HTTP POST mounted", "resource", res)
|
2021-06-25 09:18:37 +00:00
|
|
|
|
|
|
|
s := router.Methods("POST").Subrouter()
|
|
|
|
s.HandleFunc(res, func(resp http.ResponseWriter, req *http.Request) {
|
|
|
|
if grpcWeb.IsGrpcWebSocketRequest(req) {
|
|
|
|
grpcWeb.HandleGrpcWebsocketRequest(resp, req)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if grpcWeb.IsGrpcWebRequest(req) {
|
|
|
|
grpcWeb.HandleGrpcWebRequest(resp, req)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2022-08-10 12:26:51 +00:00
|
|
|
|
|
|
|
// Listen starts a net.Listener on the tcp network on the given address.
|
|
|
|
// If there is a specified MaxOpenConnections in the config, it will also set the limitListener.
|
|
|
|
func Listen(addr string, config *config.Config) (net.Listener, error) {
|
|
|
|
if addr == "" {
|
|
|
|
addr = ":http"
|
|
|
|
}
|
|
|
|
ln, err := net.Listen("tcp", addr)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if config.JSONRPC.MaxOpenConnections > 0 {
|
|
|
|
ln = netutil.LimitListener(ln, config.JSONRPC.MaxOpenConnections)
|
|
|
|
}
|
|
|
|
return ln, err
|
|
|
|
}
|