diff --git a/config.go b/config.go index 06ab7d0f..8c326652 100644 --- a/config.go +++ b/config.go @@ -1 +1,105 @@ package main + +import ( + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcutil" + flags "github.com/btcsuite/go-flags" + "path/filepath" + "io/ioutil" + "os" +) + +const ( + defaultConfigFilename = "lnwallet.conf" + defaultDataDirname = "test_wal" + defaultRPCPort = 10009 + defaultSPVMode = false + defaultPeerPort = 10011 + defaultBTCDHost = "localhost:18334" + defaultBTCDUser = "user" + defaultBTCDPass = "passwd" + defaultBTCDCACertPath = "" + defaultUseRegtest = false + defaultSPVHostAdr = "localhost:18333" + defaultBTCDNoTLS = false +) + +var ( + lnwalletHomeDir = btcutil.AppDataDir("lnwallet", false) + defaultConfigFile = filepath.Join(lnwalletHomeDir, defaultConfigFilename) + defaultDataDir = filepath.Join(lnwalletHomeDir, defaultDataDirname) +) + +type config struct { + ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"` + DataDir string `short:"b" long:"datadir" description:"The directory to store lnd's data within"` + PeerPort int `long:"peerport" description:"The port to listen on for incoming p2p connections"` + RPCPort int `long:"rpcport" description:"The port for the rpc server"` + SPVMode bool `long:"spv" description:"assert to enter spv wallet mode"` + BTCDHost string `long:"btcdhost" description:"The BTCD RPC address. "` + BTCDUser string `long:"btcduser" description:"The BTCD RPC user"` + BTCDPass string `long:"btcdpass" description:"The BTCD RPC password"` + BTCDNoTLS bool `long:"btcdnotls" description:"Do not use TLS for RPC connection to BTCD"` + BTCDCACertPath string `long:"btcdcacert" description:"Path to certificate for BTCD RPC"` + UseRegtest bool `long:"regtest" description:"Use RegNet. If not specified TestNet3 is used"` + SPVHostAdr string `long:"spvhostadr" description:"Address of full bitcoin node. It is used in SPV mode."` + NetParams *chaincfg.Params + BTCDCACert []byte +} + +// loadConfig initializes and parses the config using a config file and command +// line options. +// +// The configuration proceeds as follows: +// 1) Start with a default config with sane settings +// 2) Pre-parse the command line to check for an alternative config file +// 3) Load configuration file overwriting defaults with any specified options +// 4) Parse CLI options and overwrite/add any specified options +func loadConfig() (*config, error) { + defaultCfg := config{ + ConfigFile: defaultConfigFile, + DataDir: defaultDataDir, + PeerPort: defaultPeerPort, + RPCPort: defaultRPCPort, + SPVMode: defaultSPVMode, + BTCDHost: defaultBTCDHost, + BTCDUser: defaultBTCDUser, + BTCDPass: defaultBTCDPass, + BTCDNoTLS: defaultBTCDNoTLS, + BTCDCACertPath: defaultBTCDCACertPath, + UseRegtest: defaultUseRegtest, + SPVHostAdr: defaultSPVHostAdr, + } + preCfg := defaultCfg + _, err := flags.Parse(&preCfg) + if err != nil { + return nil, err + } + cfg := defaultCfg + err = flags.IniParse(preCfg.ConfigFile, &cfg) + if err != nil { + return nil, err + } + _, err = flags.Parse(&cfg) +// Determine net parameters + if cfg.UseRegtest { + cfg.NetParams = &chaincfg.RegressionNetParams + } else { + cfg.NetParams = &chaincfg.TestNet3Params + } +// Read certificate if needed + if cfg.BTCDCACertPath!=""{ + f, err := os.Open(cfg.BTCDCACertPath) + defer f.Close() + if err!=nil{ + return nil, err + } + cert, err := ioutil.ReadAll(f) + if err!=nil{ + return nil, err + } + cfg.BTCDCACert = cert + } + + return &cfg, nil +} diff --git a/lnd.go b/lnd.go index 4f9672e3..6e6db265 100644 --- a/lnd.go +++ b/lnd.go @@ -1,33 +1,30 @@ package main import ( - "flag" "fmt" + "google.golang.org/grpc" + "google.golang.org/grpc/grpclog" "net" "net/http" _ "net/http/pprof" "os" + "strconv" - "google.golang.org/grpc" - "google.golang.org/grpc/grpclog" - - "github.com/btcsuite/btcd/chaincfg" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwallet" ) -var ( - rpcPort = flag.Int("rpcport", 10009, "The port for the rpc server") - peerPort = flag.String("peerport", "10011", "The port to listen on for incoming p2p connections") - dataDir = flag.String("datadir", "test_wal", "The directory to store lnd's data within") - spvMode = flag.Bool("spv", false, "assert to enter spv wallet mode") -) - func main() { - flag.Parse() - if *spvMode == true { - shell() + loadedConfig, err := loadConfig() + + if err != nil { + fmt.Printf("unable to load config: %v\n", err) + os.Exit(1) + } + + if loadedConfig.SPVMode == true { + shell(loadedConfig.SPVHostAdr, loadedConfig.NetParams) return } @@ -43,8 +40,16 @@ func main() { // logic, and exposes control via proxy state machines. // TODO(roasbeef): accept config via cli flags, move to real config file // afterwards - config := &lnwallet.Config{PrivatePass: []byte("hello"), DataDir: *dataDir} - + config := &lnwallet.Config{ + PrivatePass: []byte("hello"), + DataDir: loadedConfig.DataDir, + RpcHost: loadedConfig.BTCDHost, + RpcUser: loadedConfig.BTCDUser, + RpcPass: loadedConfig.BTCDPass, + RpcNoTLS: loadedConfig.BTCDNoTLS, + CACert: loadedConfig.BTCDCACert, + NetParams: loadedConfig.NetParams, + } lnwallet, db, err := lnwallet.NewLightningWallet(config) if err != nil { fmt.Printf("unable to create wallet: %v\n", err) @@ -61,8 +66,8 @@ func main() { // Set up the core server which will listen for incoming peer // connections. - defaultListenAddr := []string{net.JoinHostPort("", *peerPort)} - server, err := newServer(defaultListenAddr, &chaincfg.TestNet3Params, + defaultListenAddr := []string{net.JoinHostPort("", strconv.Itoa(loadedConfig.PeerPort))} + server, err := newServer(defaultListenAddr, loadedConfig.NetParams, lnwallet) if err != nil { fmt.Printf("unable to create server: %v\n", err) @@ -76,7 +81,7 @@ func main() { lnrpc.RegisterLightningServer(grpcServer, server.rpcServer) // Finally, start the grpc server listening for HTTP/2 connections. - lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *rpcPort)) + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", loadedConfig.RPCPort)) if err != nil { grpclog.Fatalf("failed to listen: %v", err) fmt.Printf("failed to listen: %v", err) diff --git a/lnwallet/config.go b/lnwallet/config.go index 56f70897..05f7d0ea 100644 --- a/lnwallet/config.go +++ b/lnwallet/config.go @@ -40,6 +40,7 @@ type Config struct { RpcHost string // localhost:18334 RpcUser string RpcPass string + RpcNoTLS bool RPCCert string RPCKey string diff --git a/shell.go b/shell.go index 2ec9a50b..e549b8d3 100644 --- a/shell.go +++ b/shell.go @@ -34,7 +34,7 @@ var ( SCon uspv.SPVCon // global here for now ) -func shell() { +func shell(SPVHostAdr string, Params *chaincfg.Params) { fmt.Printf("LND spv shell v0.0\n") fmt.Printf("Not yet well integrated, but soon.\n")