github.com/evdatsion/aphelion-dpos-bft@v0.32.1/cmd/tendermint/commands/lite.go (about) 1 package commands 2 3 import ( 4 "fmt" 5 "net/url" 6 7 "github.com/spf13/cobra" 8 9 cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common" 10 "github.com/evdatsion/aphelion-dpos-bft/lite/proxy" 11 rpcclient "github.com/evdatsion/aphelion-dpos-bft/rpc/client" 12 ) 13 14 // LiteCmd represents the base command when called without any subcommands 15 var LiteCmd = &cobra.Command{ 16 Use: "lite", 17 Short: "Run lite-client proxy server, verifying tendermint rpc", 18 Long: `This node will run a secure proxy to a tendermint rpc server. 19 20 All calls that can be tracked back to a block header by a proof 21 will be verified before passing them back to the caller. Other that 22 that it will present the same interface as a full tendermint node, 23 just with added trust and running locally.`, 24 RunE: runProxy, 25 SilenceUsage: true, 26 } 27 28 var ( 29 listenAddr string 30 nodeAddr string 31 chainID string 32 home string 33 maxOpenConnections int 34 cacheSize int 35 ) 36 37 func init() { 38 LiteCmd.Flags().StringVar(&listenAddr, "laddr", "tcp://localhost:8888", "Serve the proxy on the given address") 39 LiteCmd.Flags().StringVar(&nodeAddr, "node", "tcp://localhost:26657", "Connect to a Tendermint node at this address") 40 LiteCmd.Flags().StringVar(&chainID, "chain-id", "tendermint", "Specify the Tendermint chain ID") 41 LiteCmd.Flags().StringVar(&home, "home-dir", ".tendermint-lite", "Specify the home directory") 42 LiteCmd.Flags().IntVar(&maxOpenConnections, "max-open-connections", 900, "Maximum number of simultaneous connections (including WebSocket).") 43 LiteCmd.Flags().IntVar(&cacheSize, "cache-size", 10, "Specify the memory trust store cache size") 44 } 45 46 func EnsureAddrHasSchemeOrDefaultToTCP(addr string) (string, error) { 47 u, err := url.Parse(addr) 48 if err != nil { 49 return "", err 50 } 51 switch u.Scheme { 52 case "tcp", "unix": 53 case "": 54 u.Scheme = "tcp" 55 default: 56 return "", fmt.Errorf("unknown scheme %q, use either tcp or unix", u.Scheme) 57 } 58 return u.String(), nil 59 } 60 61 func runProxy(cmd *cobra.Command, args []string) error { 62 // Stop upon receiving SIGTERM or CTRL-C. 63 cmn.TrapSignal(logger, func() { 64 // TODO: close up shop 65 }) 66 67 nodeAddr, err := EnsureAddrHasSchemeOrDefaultToTCP(nodeAddr) 68 if err != nil { 69 return err 70 } 71 listenAddr, err := EnsureAddrHasSchemeOrDefaultToTCP(listenAddr) 72 if err != nil { 73 return err 74 } 75 76 // First, connect a client 77 logger.Info("Connecting to source HTTP client...") 78 node := rpcclient.NewHTTP(nodeAddr, "/websocket") 79 80 logger.Info("Constructing Verifier...") 81 cert, err := proxy.NewVerifier(chainID, home, node, logger, cacheSize) 82 if err != nil { 83 return cmn.ErrorWrap(err, "constructing Verifier") 84 } 85 cert.SetLogger(logger) 86 sc := proxy.SecureClient(node, cert) 87 88 logger.Info("Starting proxy...") 89 err = proxy.StartProxy(sc, listenAddr, logger, maxOpenConnections) 90 if err != nil { 91 return cmn.ErrorWrap(err, "starting proxy") 92 } 93 94 // Run forever 95 select {} 96 }