diff --git a/Makefile b/Makefile index 4b95c23..bf063e6 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ test: test-evmos: @echo "Testing subnode with evmos config" - @go test -mod readonly --timeout=10m -ldflags '$(LD_FLAGS) -X github.com/notional-labs/subnode/test.Chain=evmos' ./test + @go test -p 1 -mod readonly --timeout=10m -ldflags '$(LD_FLAGS) -X github.com/notional-labs/subnode/test.Chain=evmos' ./test lint: @echo "Running golangci-lint" diff --git a/aggerator/eth_aggregator.go b/aggerator/eth_aggregator.go index f7216f3..779dafb 100644 --- a/aggerator/eth_aggregator.go +++ b/aggerator/eth_aggregator.go @@ -68,22 +68,27 @@ func Eth_getBlockTransactionCountByHash(w http.ResponseWriter, jsonBody []byte) } func Eth_getBlockByHash(w http.ResponseWriter, jsonBody []byte) { + //log.Println("Eth_getBlockByHash") for i, s := range state.PoolEth { ethUrl := s.Backend.Eth + //log.Println("Eth_getBlockByHash ethUrl=", ethUrl) body, err := utils.FetchJsonRpcOverHttp(ethUrl, jsonBody) if err != nil { + //log.Println("Eth_getBlockByHash Error, continue", err) continue } var j0 interface{} err = json.Unmarshal(body, &j0) if err != nil { + //log.Println("Eth_getBlockByHash SendError", err) _ = utils.SendError(w) return } if m0, ok := j0.(map[string]interface{}); ok { if (m0["result"] != nil) || (i >= len(state.PoolEth)-1) { // found result or last node, send it + //log.Println("Eth_getBlockByHash SendResult") _ = utils.SendResult(w, body) return } @@ -95,8 +100,10 @@ func Eth_getBlockByHash(w http.ResponseWriter, jsonBody []byte) { } func Eth_getTransactionByHash(w http.ResponseWriter, jsonBody []byte) { + //log.Println("Eth_getTransactionByHash") for i, s := range state.PoolEth { ethUrl := s.Backend.Eth + //log.Println("Eth_getTransactionByHash ethUrl=", ethUrl) body, err := utils.FetchJsonRpcOverHttp(ethUrl, jsonBody) if err != nil { continue @@ -105,12 +112,14 @@ func Eth_getTransactionByHash(w http.ResponseWriter, jsonBody []byte) { var j0 interface{} err = json.Unmarshal(body, &j0) if err != nil { + //log.Println("Eth_getTransactionByHash SendError") _ = utils.SendError(w) return } if m0, ok := j0.(map[string]interface{}); ok { if (m0["result"] != nil) || (i >= len(state.PoolEth)-1) { // found result or last node, send it + //log.Println("Eth_getTransactionByHash SendResult") _ = utils.SendResult(w, body) return } diff --git a/cmd/cmd_start.go b/cmd/cmd_start.go index 88ec730..fd92741 100644 --- a/cmd/cmd_start.go +++ b/cmd/cmd_start.go @@ -11,7 +11,8 @@ func startCmd() *cobra.Command { Short: "start subnode server", Args: cobra.ExactArgs(0), RunE: func(cmd *cobra.Command, args []string) error { - server.Start() + node := server.NewNode() + node.Start() return nil }, diff --git a/server/api_server.go b/server/api_server.go index 08d380d..448c774 100644 --- a/server/api_server.go +++ b/server/api_server.go @@ -11,10 +11,18 @@ import ( "strconv" ) -var apiServer *http.Server +type ApiServer struct { + apiServer *http.Server +} + +func NewApiServer() *ApiServer { + newItem := &ApiServer{} + return newItem +} -func StartApiServer() { +func (m *ApiServer) StartApiServer() { fmt.Println("StartApiServer...") + handler := func(w http.ResponseWriter, r *http.Request) { prunedNode := state.SelectPrunedNode(config.ProtocolTypeApi) @@ -46,19 +54,17 @@ func StartApiServer() { r.Host = r.URL.Host state.ProxyMapApi[selectedHost].ServeHTTP(w, r) } - // handle all requests to your server using the proxy - //http.HandleFunc("/", handler) + serverMux := http.NewServeMux() serverMux.HandleFunc("/", handler) go func() { - //log.Fatal(http.ListenAndServe(":1337", serverMux)) - apiServer = &http.Server{Addr: ":1337", Handler: serverMux} - log.Fatal(apiServer.ListenAndServe()) + m.apiServer = &http.Server{Addr: ":1337", Handler: serverMux} + log.Fatal(m.apiServer.ListenAndServe()) }() } -func ShutdownApiServer() { - if err := apiServer.Shutdown(context.Background()); err != nil { +func (m *ApiServer) ShutdownApiServer() { + if err := m.apiServer.Shutdown(context.Background()); err != nil { log.Printf("apiServer Shutdown: %v", err) } } diff --git a/server/eth_server.go b/server/eth_server.go index 085d7d4..ceed327 100644 --- a/server/eth_server.go +++ b/server/eth_server.go @@ -16,9 +16,16 @@ import ( "strings" ) -var ethServer *http.Server +type EthServer struct { + ethServer *http.Server +} + +func NewEthServer() *EthServer { + newItem := &EthServer{} + return newItem +} -func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { +func (m *EthServer) ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { prunedNode := state.SelectPrunedNode(config.ProtocolTypeEth) selectedHost := prunedNode.Backend.Eth // default to pruned node @@ -74,7 +81,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { //} else if method == "eth_getBalance" { - height := getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) if height >= 0 { node, err := state.SelectMatchedBackend(height, config.ProtocolTypeEth) @@ -117,7 +124,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { selectedHost = node.Backend.Eth } } else if method == "eth_getTransactionCount" { - height := getHeightFromEthJsonrpcParams(m0["params"], 3, 2, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 3, 2, w) if height >= 0 { node, err := state.SelectMatchedBackend(height, config.ProtocolTypeEth) @@ -129,7 +136,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { selectedHost = node.Backend.Eth } } else if method == "eth_getBlockTransactionCountByNumber" { - height := getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) if height >= 0 { node, err := state.SelectMatchedBackend(height, config.ProtocolTypeEth) @@ -141,7 +148,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { selectedHost = node.Backend.Eth } } else if method == "eth_getCode" { - height := getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) if height >= 0 { node, err := state.SelectMatchedBackend(height, config.ProtocolTypeEth) @@ -153,7 +160,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { selectedHost = node.Backend.Eth } } else if method == "eth_call" { - height := getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 2, 1, w) if height >= 0 { node, err := state.SelectMatchedBackend(height, config.ProtocolTypeEth) @@ -165,7 +172,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { selectedHost = node.Backend.Eth } } else if method == "eth_getBlockByNumber" { - height := getHeightFromEthJsonrpcParams(m0["params"], 2, 0, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 2, 0, w) fmt.Println("height=", height) @@ -179,7 +186,7 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { selectedHost = node.Backend.Eth } } else if method == "eth_getProof" { - height := getHeightFromEthJsonrpcParams(m0["params"], 3, 1, w) + height := m.getHeightFromEthJsonrpcParams(m0["params"], 3, 1, w) fmt.Println("height=", height) @@ -219,33 +226,32 @@ func ethJsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { state.ProxyMapEth[selectedHost].ServeHTTP(w, r) } -func StartEthServer() { +func (m *EthServer) StartEthServer() { fmt.Println("StartEthServer...") handler := func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { // JSONRPC over HTTP - ethJsonRpcOverHttp(w, r) + m.ethJsonRpcOverHttp(w, r) } else { _ = utils.SendError(w) return } } - // handle all requests to your server using the proxy - //http.HandleFunc("/", handler) + serverMux := http.NewServeMux() serverMux.HandleFunc("/", handler) go func() { - ethServer = &http.Server{Addr: ":8545", Handler: serverMux} - log.Fatal(ethServer.ListenAndServe()) + m.ethServer = &http.Server{Addr: ":8545", Handler: serverMux} + log.Fatal(m.ethServer.ListenAndServe()) }() } -func ShutdownEthServer() { - if err := ethServer.Shutdown(context.Background()); err != nil { +func (m *EthServer) ShutdownEthServer() { + if err := m.ethServer.Shutdown(context.Background()); err != nil { log.Printf("ethServer Shutdown: %v", err) } } -func getHeightFromEthJsonrpcParams(params interface{}, paramsLen int, posHeight int, w http.ResponseWriter) (height int64) { +func (m *EthServer) getHeightFromEthJsonrpcParams(params interface{}, paramsLen int, posHeight int, w http.ResponseWriter) (height int64) { height = int64(-1) positionalParams, ok := params.([]interface{}) diff --git a/server/ethws_server.go b/server/ethws_server.go index 7bc2580..d91d028 100644 --- a/server/ethws_server.go +++ b/server/ethws_server.go @@ -15,10 +15,18 @@ import ( "sync" ) -var ethWsServer *http.Server var upgrader = websocket.Upgrader{} // use default options -func createWSClient() (*websocket.Conn, error) { +type EthWsServer struct { + ethWsServer *http.Server +} + +func NewEthWsServer() *EthWsServer { + newItem := &EthWsServer{} + return newItem +} + +func (m *EthWsServer) createWSClient() (*websocket.Conn, error) { prunedNode := state.SelectPrunedNode(config.ProtocolTypeEthWs) selectedHost := prunedNode.Backend.EthWs // default to pruned node targetEthWs, err := url.Parse(selectedHost) @@ -36,7 +44,7 @@ func createWSClient() (*websocket.Conn, error) { return c, nil } -func wsClientConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { +func (m *EthWsServer) wsClientConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { defer wg.Done() //defer close(clientChannel) @@ -48,7 +56,7 @@ func wsClientConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, err := wsConServer.WriteMessage(websocket.TextMessage, msg) if err != nil { log.Println("relay to server err:", err) - closeAll(wsConServer, wsConClient, clientChannel, serverChannel) + m.closeAll(wsConServer, wsConClient, clientChannel, serverChannel) break } } @@ -56,7 +64,7 @@ func wsClientConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, log.Println("exit processing clientChannel") } -func wsServerConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { +func (m *EthWsServer) wsServerConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { defer wg.Done() //defer close(serverChannel) @@ -68,7 +76,7 @@ func wsServerConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, err := wsConClient.WriteMessage(websocket.TextMessage, msg) if err != nil { log.Println("relay to client err:", err) - closeAll(wsConServer, wsConClient, clientChannel, serverChannel) + m.closeAll(wsConServer, wsConClient, clientChannel, serverChannel) break } } @@ -76,14 +84,14 @@ func wsServerConRelay(wsConServer *websocket.Conn, wsConClient *websocket.Conn, log.Println("exit processing serverChannel") } -func wsClientHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { +func (m *EthWsServer) wsClientHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { defer wg.Done() for { _, msg, err := wsConClient.ReadMessage() if err != nil { log.Println("ws-client read err:", err) - closeAll(wsConServer, wsConClient, clientChannel, serverChannel) + m.closeAll(wsConServer, wsConClient, clientChannel, serverChannel) break } log.Printf("ws-client recv: %s", msg) @@ -93,14 +101,14 @@ func wsClientHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, cl log.Println("exit ws-client") } -func wsServerHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { +func (m *EthWsServer) wsServerHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte, wg *sync.WaitGroup) { defer wg.Done() for { _, msg, err := wsConServer.ReadMessage() if err != nil { log.Println("ws-server read err:", err) - closeAll(wsConServer, wsConClient, clientChannel, serverChannel) + m.closeAll(wsConServer, wsConClient, clientChannel, serverChannel) break } log.Printf("ws-server recv: %s", msg) @@ -113,7 +121,7 @@ func wsServerHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, cl err := json.Unmarshal(msg, &arr) if err != nil { - _ = sendWsRpcResponseErr(wsConServer, err) + _ = m.sendWsRpcResponseErr(wsConServer, err) continue } @@ -123,7 +131,7 @@ func wsServerHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, cl for i, s := range arr { bodyChild, err := utils.FetchJsonRpcOverHttp("http://localhost:8545", s) if err != nil { - errMsg := getWsJsonRpcErr(s, err) + errMsg := m.getWsJsonRpcErr(s, err) arrRes[i] = errMsg continue } @@ -133,7 +141,7 @@ func wsServerHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, cl jsonBytes, err := json.Marshal(arrRes) if err != nil { - _ = sendWsRpcResponseErr(wsConServer, err) + _ = m.sendWsRpcResponseErr(wsConServer, err) continue } @@ -146,17 +154,17 @@ func wsServerHandle(wsConServer *websocket.Conn, wsConClient *websocket.Conn, cl var rpcReq = types.RPCRequest{} err = rpcReq.UnmarshalJSON(msg) if err != nil { - _ = sendWsRpcResponseErr(wsConServer, err) + _ = m.sendWsRpcResponseErr(wsConServer, err) continue } - processSingleMsg(wsConServer, serverChannel, &rpcReq, msg) + m.processSingleMsg(wsConServer, serverChannel, &rpcReq, msg) } log.Println("exit ws-server") } -func ethWsHandle(w http.ResponseWriter, r *http.Request) { +func (m *EthWsServer) ethWsHandle(w http.ResponseWriter, r *http.Request) { var wg sync.WaitGroup var wsConServer *websocket.Conn var wsConClient *websocket.Conn @@ -170,47 +178,47 @@ func ethWsHandle(w http.ResponseWriter, r *http.Request) { return } - defer closeAll(wsConServer, wsConClient, clientChannel, serverChannel) + defer m.closeAll(wsConServer, wsConClient, clientChannel, serverChannel) //--------------------------------- // ws-client - wsConClient, err = createWSClient() + wsConClient, err = m.createWSClient() if err != nil { log.Print("error with createWSClient:", err) return } wg.Add(1) - go wsClientConRelay(wsConServer, wsConClient, clientChannel, serverChannel, &wg) + go m.wsClientConRelay(wsConServer, wsConClient, clientChannel, serverChannel, &wg) wg.Add(1) - go wsServerConRelay(wsConServer, wsConClient, clientChannel, serverChannel, &wg) + go m.wsServerConRelay(wsConServer, wsConClient, clientChannel, serverChannel, &wg) wg.Add(1) - go wsClientHandle(wsConServer, wsConClient, clientChannel, serverChannel, &wg) + go m.wsClientHandle(wsConServer, wsConClient, clientChannel, serverChannel, &wg) wg.Add(1) - go wsServerHandle(wsConServer, wsConClient, clientChannel, serverChannel, &wg) + go m.wsServerHandle(wsConServer, wsConClient, clientChannel, serverChannel, &wg) wg.Wait() log.Printf("WaitGroup counter is zero") } -func StartEthWsServer() { +func (m *EthWsServer) StartEthWsServer() { fmt.Println("StartEthWsServer...") handler := func(w http.ResponseWriter, r *http.Request) { - ethWsHandle(w, r) + m.ethWsHandle(w, r) } serverMux := http.NewServeMux() serverMux.HandleFunc("/", handler) go func() { - ethWsServer = &http.Server{Addr: ":8546", Handler: serverMux} - log.Fatal(ethWsServer.ListenAndServe()) + m.ethWsServer = &http.Server{Addr: ":8546", Handler: serverMux} + log.Fatal(m.ethWsServer.ListenAndServe()) }() } -func ShutdownEthWsServer() { - if err := ethWsServer.Shutdown(context.Background()); err != nil { +func (m *EthWsServer) ShutdownEthWsServer() { + if err := m.ethWsServer.Shutdown(context.Background()); err != nil { log.Printf("ethWsServer Shutdown: %v", err) } } @@ -218,7 +226,7 @@ func ShutdownEthWsServer() { // ------------------ // helper -func getWsJsonRpcErr(jsonRawReq []byte, err error) []byte { +func (m *EthWsServer) getWsJsonRpcErr(jsonRawReq []byte, err error) []byte { var rpcReq = types.RPCRequest{} errJson := rpcReq.UnmarshalJSON(jsonRawReq) if errJson != nil { @@ -231,17 +239,17 @@ func getWsJsonRpcErr(jsonRawReq []byte, err error) []byte { return jsonStrRes } -func sendWsRpcResponseErr(wsConServer *websocket.Conn, err error) error { +func (m *EthWsServer) sendWsRpcResponseErr(wsConServer *websocket.Conn, err error) error { errMsg := fmt.Sprintf("{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32600,\"message\":\"%s\"},\"id\":null}", err) errWrite := wsConServer.WriteMessage(websocket.TextMessage, []byte(errMsg)) return errWrite } -func processSingleMsg(wsConServer *websocket.Conn, serverChannel chan []byte, rpcReq *types.RPCRequest, jsonRaw []byte) { +func (m *EthWsServer) processSingleMsg(wsConServer *websocket.Conn, serverChannel chan []byte, rpcReq *types.RPCRequest, jsonRaw []byte) { if rpcReq.Method != "eth_subscribe" && rpcReq.Method != "eth_unsubscribe" { res, err := utils.FetchJsonRpcOverHttp("http://localhost:8545", jsonRaw) if err != nil { - _ = sendWsRpcResponseErr(wsConServer, err) + _ = m.sendWsRpcResponseErr(wsConServer, err) return } @@ -252,7 +260,7 @@ func processSingleMsg(wsConServer *websocket.Conn, serverChannel chan []byte, rp serverChannel <- jsonRaw // send msg to serverChannel } -func isClosed(ch <-chan []byte) bool { +func (m *EthWsServer) isClosed(ch <-chan []byte) bool { select { case <-ch: return true @@ -262,11 +270,11 @@ func isClosed(ch <-chan []byte) bool { return false } -func closeAll(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte) { - if !isClosed(clientChannel) { +func (m *EthWsServer) closeAll(wsConServer *websocket.Conn, wsConClient *websocket.Conn, clientChannel chan []byte, serverChannel chan []byte) { + if !m.isClosed(clientChannel) { close(clientChannel) } - if !isClosed(serverChannel) { + if !m.isClosed(serverChannel) { close(serverChannel) } if wsConServer != nil { diff --git a/server/grpc_server.go b/server/grpc_server.go index b8cfdac..80af10a 100644 --- a/server/grpc_server.go +++ b/server/grpc_server.go @@ -18,10 +18,18 @@ import ( "strings" ) -var grpcServer *grpc.Server +type GrpcServer struct { + grpcServer *grpc.Server +} + +func NewGrpcServer() *GrpcServer { + newItem := &GrpcServer{} + return newItem +} -func StartGrpcServer() { +func (m *GrpcServer) StartGrpcServer() { fmt.Println("StartGrpcServer...") + tlsConfig := &tls.Config{ InsecureSkipVerify: false, } @@ -64,17 +72,17 @@ func StartGrpcServer() { return nil, nil, status.Errorf(codes.Unimplemented, "Unknown method") } - grpcServer := grpc.NewServer(grpc.UnknownServiceHandler(proxy.TransparentHandler(director))) + m.grpcServer = grpc.NewServer(grpc.UnknownServiceHandler(proxy.TransparentHandler(director))) lis, err := net.Listen("tcp", ":9090") if err != nil { panic(err) } go func() { - _ = grpcServer.Serve(lis) + _ = m.grpcServer.Serve(lis) }() } -func ShutdownGrpcServer() { - grpcServer.GracefulStop() +func (m *GrpcServer) ShutdownGrpcServer() { + m.grpcServer.GracefulStop() } diff --git a/server/rpc_server.go b/server/rpc_server.go index 2aeb938..d6b9e74 100644 --- a/server/rpc_server.go +++ b/server/rpc_server.go @@ -16,9 +16,16 @@ import ( "strings" ) -var rpcServer *http.Server +type RpcServer struct { + rpcServer *http.Server +} + +func NewRpcServer() *RpcServer { + newItem := &RpcServer{} + return newItem +} -func uriOverHttp(w http.ResponseWriter, r *http.Request) { +func (m *RpcServer) uriOverHttp(w http.ResponseWriter, r *http.Request) { prunedNode := state.SelectPrunedNode(config.ProtocolTypeRpc) selectedHost := prunedNode.Backend.Rpc // default to pruned node @@ -109,7 +116,7 @@ func uriOverHttp(w http.ResponseWriter, r *http.Request) { state.ProxyMapRpc[selectedHost].ServeHTTP(w, r) } -func jsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { +func (m *RpcServer) jsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { prunedNode := state.SelectPrunedNode(config.ProtocolTypeRpc) selectedHost := prunedNode.Backend.Rpc // default to pruned node @@ -289,15 +296,15 @@ func jsonRpcOverHttp(w http.ResponseWriter, r *http.Request) { state.ProxyMapRpc[selectedHost].ServeHTTP(w, r) } -func StartRpcServer() { +func (m *RpcServer) StartRpcServer() { fmt.Println("StartRpcServer...") handler := func(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { // URI over HTTP // see `/doc/rpc.md` and `https://github.com/tendermint/tendermint/blob/main/light/proxy/routes.go` to see the logic - uriOverHttp(w, r) + m.uriOverHttp(w, r) } else if r.Method == "POST" { // JSONRPC over HTTP - jsonRpcOverHttp(w, r) + m.jsonRpcOverHttp(w, r) } else { _ = utils.SendError(w) return @@ -310,14 +317,14 @@ func StartRpcServer() { serverMux.HandleFunc("/", handler) go func() { //log.Fatal(http.ListenAndServe(":26657", serverMux)) - rpcServer = &http.Server{Addr: ":26657", Handler: serverMux} - log.Fatal(rpcServer.ListenAndServe()) + m.rpcServer = &http.Server{Addr: ":26657", Handler: serverMux} + log.Fatal(m.rpcServer.ListenAndServe()) }() } -func ShutdownRpcServer() { - if err := rpcServer.Shutdown(context.Background()); err != nil { +func (m *RpcServer) ShutdownRpcServer() { + if err := m.rpcServer.Shutdown(context.Background()); err != nil { log.Printf("rpcServer Shutdown: %v", err) } } diff --git a/server/server.go b/server/server.go index f15c901..5426c34 100644 --- a/server/server.go +++ b/server/server.go @@ -2,21 +2,41 @@ package server import "github.com/notional-labs/subnode/state" -func Start() { +type Node struct { + rpcServer *RpcServer + apiServer *ApiServer + grpcServer *GrpcServer + ethServer *EthServer + ethWsServer *EthWsServer +} + +func NewNode() *Node { + newItem := &Node{ + rpcServer: NewRpcServer(), + apiServer: NewApiServer(), + grpcServer: NewGrpcServer(), + ethServer: NewEthServer(), + ethWsServer: NewEthWsServer(), + } + return newItem +} + +func (m *Node) Start() { state.Init() - StartRpcServer() - StartApiServer() - StartGrpcServer() - StartEthServer() - StartEthWsServer() + + m.rpcServer.StartRpcServer() + m.apiServer.StartApiServer() + m.grpcServer.StartGrpcServer() + m.ethServer.StartEthServer() + m.ethWsServer.StartEthWsServer() select {} } -func Shutdown() { - ShutdownRpcServer() - ShutdownApiServer() - ShutdownGrpcServer() - ShutdownEthServer() - ShutdownEthWsServer() +func (m *Node) Shutdown() { + m.rpcServer.ShutdownRpcServer() + m.apiServer.ShutdownApiServer() + m.grpcServer.ShutdownGrpcServer() + m.ethServer.ShutdownEthServer() + m.ethWsServer.ShutdownEthWsServer() } diff --git a/test/common.go b/test/common.go index 7a9f471..4e456a3 100644 --- a/test/common.go +++ b/test/common.go @@ -9,10 +9,10 @@ import ( // Chain is set at compile time `-X github.com/notional-labs/subnode/test.Chain=osmosis` // supported value: osmosis, evmos -// default is osmosis -var Chain = "osmosis" +// default is evmos +var Chain = "evmos" -const SleepBeforeEachTest = 2 * time.Second +const SleepBeforeEachTest = 3 * time.Second var isServerStarted = false @@ -30,5 +30,7 @@ func startServer() { } //fmt.Printf("%+v\n", c) config.SetConfig(c) - server.Start() + + node := server.NewNode() + node.Start() }