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  }