X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=config%2Fconfig.go;h=02d2c7cfa007fe87621f71194fede9ba74b8c659;hb=4adf3b94c3cf38f3ff3d77e95f6a4830f516d2d9;hp=03d7d6fb1ff344c434f07a384ebe1096c8f0e0ce;hpb=627c2746596ce7cf687cc6afd7c93754510eea63;p=bytom%2Fvapor.git diff --git a/config/config.go b/config/config.go index 03d7d6fb..02d2c7cf 100644 --- a/config/config.go +++ b/config/config.go @@ -1,8 +1,8 @@ package config import ( + "encoding/hex" "io" - "io/ioutil" "os" "os/user" "path/filepath" @@ -10,7 +10,7 @@ import ( log "github.com/sirupsen/logrus" - "github.com/vapor/crypto/ed25519" + "github.com/vapor/crypto/ed25519/chainkd" ) var ( @@ -22,11 +22,12 @@ type Config struct { // Top level options use an anonymous struct BaseConfig `mapstructure:",squash"` // Options for services - P2P *P2PConfig `mapstructure:"p2p"` - Wallet *WalletConfig `mapstructure:"wallet"` - Auth *RPCAuthConfig `mapstructure:"auth"` - Web *WebConfig `mapstructure:"web"` - Websocket *WebsocketConfig `mapstructure:"ws"` + P2P *P2PConfig `mapstructure:"p2p"` + Wallet *WalletConfig `mapstructure:"wallet"` + Auth *RPCAuthConfig `mapstructure:"auth"` + Web *WebConfig `mapstructure:"web"` + Websocket *WebsocketConfig `mapstructure:"ws"` + Federation *FederationConfig `mapstructure:"federation"` } // Default configurable parameters. @@ -38,6 +39,7 @@ func DefaultConfig() *Config { Auth: DefaultRPCAuthConfig(), Web: DefaultWebConfig(), Websocket: DefaultWebsocketConfig(), + Federation: DefaultFederationConfig(), } } @@ -50,32 +52,32 @@ func (cfg *Config) SetRoot(root string) *Config { // NodeKey retrieves the currently configured private key of the node, checking // first any manually set key, falling back to the one found in the configured // data folder. If no key can be found, a new one is generated. -func (cfg *Config) NodeKey() (string, error) { - // Use any specifically configured key. - if cfg.P2P.PrivateKey != "" { - return cfg.P2P.PrivateKey, nil +func (cfg *Config) PrivateKey() *chainkd.XPrv { + if cfg.XPrv != nil { + return cfg.XPrv } - keyFile := rootify(cfg.P2P.NodeKeyFile, cfg.BaseConfig.RootDir) - buf := make([]byte, ed25519.PrivateKeySize*2) - fd, err := os.Open(keyFile) - defer fd.Close() - if err == nil { - if _, err = io.ReadFull(fd, buf); err == nil { - return string(buf), nil - } + filePath := rootify(cfg.PrivateKeyFile, cfg.BaseConfig.RootDir) + fildReader, err := os.Open(filePath) + if err != nil { + log.WithField("err", err).Panic("fail on open private key file") } - log.WithField("err", err).Warning("key file access failed") - _, privKey, err := ed25519.GenerateKey(nil) - if err != nil { - return "", err + defer fildReader.Close() + buf := make([]byte, 128) + if _, err = io.ReadFull(fildReader, buf); err != nil { + log.WithField("err", err).Panic("fail on read private key file") } - if err = ioutil.WriteFile(keyFile, []byte(privKey.String()), 0600); err != nil { - return "", err + var xprv chainkd.XPrv + if _, err := hex.Decode(xprv[:], buf); err != nil { + log.WithField("err", err).Panic("fail on decode private key") } - return privKey.String(), nil + + cfg.XPrv = &xprv + xpub := cfg.XPrv.XPub() + cfg.XPub = &xpub + return cfg.XPrv } //----------------------------------------------------------------------------- @@ -115,19 +117,26 @@ type BaseConfig struct { // log file name LogFile string `mapstructure:"log_file"` - // Cipher Service Provider - // CipherServiceProvider string `mapstructure:"csp"` + PrivateKeyFile string `mapstructure:"private_key_file"` + XPrv *chainkd.XPrv + XPub *chainkd.XPub + + // Federation file name + FederationFileName string `mapstructure:"federation_file"` } // Default configurable base parameters. func DefaultBaseConfig() BaseConfig { return BaseConfig{ - Moniker: "anonymous", - ProfListenAddress: "", - Mining: false, - DBBackend: "leveldb", - DBPath: "data", - KeysPath: "keystore", + Moniker: "anonymous", + ProfListenAddress: "", + Mining: false, + DBBackend: "leveldb", + DBPath: "data", + KeysPath: "keystore", + LogFile: "log", + PrivateKeyFile: "node_key.txt", + FederationFileName: "federation.json", } } @@ -135,16 +144,22 @@ func (b BaseConfig) DBDir() string { return rootify(b.DBPath, b.RootDir) } +func (b BaseConfig) LogDir() string { + return rootify(b.LogFile, b.RootDir) +} + func (b BaseConfig) KeysDir() string { return rootify(b.KeysPath, b.RootDir) } +func (b BaseConfig) FederationFile() string { + return rootify(b.FederationFileName, b.RootDir) +} + // P2PConfig type P2PConfig struct { ListenAddress string `mapstructure:"laddr"` Seeds string `mapstructure:"seeds"` - PrivateKey string `mapstructure:"node_key"` - NodeKeyFile string `mapstructure:"node_key_file"` SkipUPNP bool `mapstructure:"skip_upnp"` LANDiscover bool `mapstructure:"lan_discoverable"` MaxNumPeers int `mapstructure:"max_num_peers"` @@ -154,21 +169,22 @@ type P2PConfig struct { ProxyUsername string `mapstructure:"proxy_username"` ProxyPassword string `mapstructure:"proxy_password"` KeepDial string `mapstructure:"keep_dial"` + Compression string `mapstructure:"compression_backend"` } // Default configurable p2p parameters. func DefaultP2PConfig() *P2PConfig { return &P2PConfig{ - ListenAddress: "tcp://0.0.0.0:46656", - NodeKeyFile: "nodekey", + ListenAddress: "tcp://0.0.0.0:56656", SkipUPNP: false, LANDiscover: true, - MaxNumPeers: 50, + MaxNumPeers: 20, HandshakeTimeout: 30, DialTimeout: 3, ProxyAddress: "", ProxyUsername: "", ProxyPassword: "", + Compression: "snappy", } } @@ -193,6 +209,11 @@ type WebsocketConfig struct { MaxNumConcurrentReqs int `mapstructure:"max_num_concurrent_reqs"` } +type FederationConfig struct { + Xpubs []chainkd.XPub `json:"xpubs"` + Quorum int `json:"quorum"` +} + // Default configurable rpc's auth parameters. func DefaultRPCAuthConfig() *RPCAuthConfig { return &RPCAuthConfig{ @@ -224,6 +245,25 @@ func DefaultWebsocketConfig() *WebsocketConfig { } } +func DefaultFederationConfig() *FederationConfig { + return &FederationConfig{ + Xpubs: []chainkd.XPub{ + xpub("580daf48fa8962100047cb1391da890bb7f2c849fdbc9b368cb4394a4c7cbb0977e2e7ebbf055dc0ef90af6a0d2af01ce7ec56b735d016aab597815ec48552e5"), + xpub("f3f6bcf61b65fa9d1566455a5688ca8b395efdc22e654963134b5e5cb0a45d8be522d21abc384a73177a7b9d64eba915fcfe2862d86a508a3c46dc410bdd72ad"), + xpub("53559612f2b7bcada18948b7de39d63947a0e2bd7336d07db1350c54ba5743996b84bf9d18ff7a2457e1a5c70ce5013e4a3b62666ddb03294c53051d5f5c70c0"), + xpub("7c88cc58adfc71818b08308d43c29de22460b0ea6895449cbec6e458d7dc09e0aea243fa5075ee6621da0d805bd047f6bb207329c5bd2ca3253b172fb323b512"), + }, + Quorum: 2, + } +} + +func xpub(str string) (xpub chainkd.XPub) { + if err := xpub.UnmarshalText([]byte(str)); err != nil { + log.Panicf("Fail converts a string to xpub") + } + return xpub +} + //----------------------------------------------------------------------------- // Utils @@ -241,25 +281,15 @@ func DefaultDataDir() string { // Try to place the data folder in the user's home dir home := homeDir() if home == "" { - return "./.bytom" + return "./.vapor" } switch runtime.GOOS { case "darwin": - // In order to be compatible with old data path, - // copy the data from the old path to the new path - oldPath := filepath.Join(home, "Library", "Bytom") - newPath := filepath.Join(home, "Library", "Application Support", "Bytom") - if !isFolderNotExists(oldPath) && isFolderNotExists(newPath) { - if err := os.Rename(oldPath, newPath); err != nil { - log.Errorf("DefaultDataDir: %v", err) - return oldPath - } - } - return newPath + return filepath.Join(home, "Library", "Application Support", "Vapor") case "windows": - return filepath.Join(home, "AppData", "Roaming", "Bytom") + return filepath.Join(home, "AppData", "Roaming", "Vapor") default: - return filepath.Join(home, ".bytom") + return filepath.Join(home, ".vapor") } }