btcctl: add regtest mode to btcctl

This commit is contained in:
Dan Cline 2020-04-14 07:06:39 -04:00 committed by John C. Vernaleo
parent b298415583
commit b470eee477

View file

@ -14,6 +14,7 @@ import (
"strings" "strings"
"github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil"
flags "github.com/jessevdk/go-flags" flags "github.com/jessevdk/go-flags"
) )
@ -92,42 +93,51 @@ func listCommands() {
// //
// See loadConfig for details on the configuration load process. // See loadConfig for details on the configuration load process.
type config struct { type config struct {
ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"` ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"`
ListCommands bool `short:"l" long:"listcommands" description:"List all of the supported commands and exit"` ListCommands bool `short:"l" long:"listcommands" description:"List all of the supported commands and exit"`
NoTLS bool `long:"notls" description:"Disable TLS"` NoTLS bool `long:"notls" description:"Disable TLS"`
Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"` Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"`
ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"` ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"`
ProxyUser string `long:"proxyuser" description:"Username for proxy server"` ProxyUser string `long:"proxyuser" description:"Username for proxy server"`
RPCCert string `short:"c" long:"rpccert" description:"RPC server certificate chain for validation"` RegressionTest bool `long:"regtest" description:"Connect to the regression test network"`
RPCPassword string `short:"P" long:"rpcpass" default-mask:"-" description:"RPC password"` RPCCert string `short:"c" long:"rpccert" description:"RPC server certificate chain for validation"`
RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"` RPCPassword string `short:"P" long:"rpcpass" default-mask:"-" description:"RPC password"`
RPCUser string `short:"u" long:"rpcuser" description:"RPC username"` RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"`
SimNet bool `long:"simnet" description:"Connect to the simulation test network"` RPCUser string `short:"u" long:"rpcuser" description:"RPC username"`
TLSSkipVerify bool `long:"skipverify" description:"Do not verify tls certificates (not recommended!)"` SimNet bool `long:"simnet" description:"Connect to the simulation test network"`
TestNet3 bool `long:"testnet" description:"Connect to testnet"` TLSSkipVerify bool `long:"skipverify" description:"Do not verify tls certificates (not recommended!)"`
ShowVersion bool `short:"V" long:"version" description:"Display version information and exit"` TestNet3 bool `long:"testnet" description:"Connect to testnet"`
Wallet bool `long:"wallet" description:"Connect to wallet"` ShowVersion bool `short:"V" long:"version" description:"Display version information and exit"`
Wallet bool `long:"wallet" description:"Connect to wallet"`
} }
// normalizeAddress returns addr with the passed default port appended if // normalizeAddress returns addr with the passed default port appended if
// there is not already a port specified. // there is not already a port specified.
func normalizeAddress(addr string, useTestNet3, useSimNet, useWallet bool) string { func normalizeAddress(addr string, chain *chaincfg.Params, useWallet bool) (string, error) {
_, _, err := net.SplitHostPort(addr) _, _, err := net.SplitHostPort(addr)
if err != nil { if err != nil {
var defaultPort string var defaultPort string
switch { switch chain {
case useTestNet3: case &chaincfg.TestNet3Params:
if useWallet { if useWallet {
defaultPort = "18332" defaultPort = "18332"
} else { } else {
defaultPort = "18334" defaultPort = "18334"
} }
case useSimNet: case &chaincfg.SimNetParams:
if useWallet { if useWallet {
defaultPort = "18554" defaultPort = "18554"
} else { } else {
defaultPort = "18556" defaultPort = "18556"
} }
case &chaincfg.RegressionNetParams:
if useWallet {
// TODO: add port once regtest is supported in btcwallet
paramErr := fmt.Errorf("cannot use -wallet with -regtest, btcwallet not yet compatible with regtest")
return "", paramErr
} else {
defaultPort = "18334"
}
default: default:
if useWallet { if useWallet {
defaultPort = "8332" defaultPort = "8332"
@ -136,9 +146,9 @@ func normalizeAddress(addr string, useTestNet3, useSimNet, useWallet bool) strin
} }
} }
return net.JoinHostPort(addr, defaultPort) return net.JoinHostPort(addr, defaultPort), nil
} }
return addr return addr, nil
} }
// cleanAndExpandPath expands environement variables and leading ~ in the // cleanAndExpandPath expands environement variables and leading ~ in the
@ -246,17 +256,27 @@ func loadConfig() (*config, []string, error) {
return nil, nil, err return nil, nil, err
} }
// default network is mainnet
network := &chaincfg.MainNetParams
// Multiple networks can't be selected simultaneously. // Multiple networks can't be selected simultaneously.
numNets := 0 numNets := 0
if cfg.TestNet3 { if cfg.TestNet3 {
numNets++ numNets++
network = &chaincfg.TestNet3Params
} }
if cfg.SimNet { if cfg.SimNet {
numNets++ numNets++
network = &chaincfg.SimNetParams
} }
if cfg.RegressionTest {
numNets++
network = &chaincfg.RegressionNetParams
}
if numNets > 1 { if numNets > 1 {
str := "%s: The testnet and simnet params can't be used " + str := "%s: Multiple network params can't be used " +
"together -- choose one of the two" "together -- choose one"
err := fmt.Errorf(str, "loadConfig") err := fmt.Errorf(str, "loadConfig")
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
return nil, nil, err return nil, nil, err
@ -273,8 +293,10 @@ func loadConfig() (*config, []string, error) {
// Add default port to RPC server based on --testnet and --wallet flags // Add default port to RPC server based on --testnet and --wallet flags
// if needed. // if needed.
cfg.RPCServer = normalizeAddress(cfg.RPCServer, cfg.TestNet3, cfg.RPCServer, err = normalizeAddress(cfg.RPCServer, network, cfg.Wallet)
cfg.SimNet, cfg.Wallet) if err != nil {
return nil, nil, err
}
return &cfg, remainingArgs, nil return &cfg, remainingArgs, nil
} }