Skip to content

Commit 820d51a

Browse files
committed
add Node Key func
1 parent d67603b commit 820d51a

File tree

4 files changed

+106
-10
lines changed

4 files changed

+106
-10
lines changed

config/config.go

+23-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package config
22

33
import (
4+
"os/user"
5+
"path"
6+
47
"github.com/qlcchain/go-qlc/common"
58
)
69

@@ -14,8 +17,9 @@ type RPC struct {
1417
Port uint `json:"Port"`
1518
}
1619
type Node struct {
17-
Version uint `json:"Version"`
18-
Network string `json:"Network"`
20+
Version uint `json:"Version"`
21+
Network string `json:"Network"`
22+
PrivateKeyPath string `json:"PrivateKeyPath"`
1923
}
2024
type Config struct {
2125
*RPC `json:"RPC"`
@@ -37,17 +41,31 @@ var (
3741
Port: 29735,
3842
},
3943
Node: &Node{
40-
Version: 1,
41-
Network: "testnet",
44+
Version: 1,
45+
Network: "testnet",
46+
PrivateKeyPath: "",
4247
},
4348
}
4449
)
4550

51+
func privateKeyPath() (string, error) {
52+
usr, err := user.Current()
53+
if err != nil {
54+
return "", err
55+
}
56+
dir := path.Join(usr.HomeDir, ".qlcchain")
57+
return path.Join(dir, "network.key"), nil
58+
}
59+
4660
var log = common.NewLogger("config")
4761

4862
func init() {
4963
cfg := DefaultlConfig
50-
var err error
64+
privateKeyPath, err := privateKeyPath()
65+
if err != nil {
66+
log.Errorf("privateKeyPath error: %s", err)
67+
}
68+
cfg.PrivateKeyPath = privateKeyPath
5169
if qlccfg, err = NewCfgManager("", ""); err != nil {
5270
log.Errorf("config manager error: %s", err)
5371
}

go.mod

+8-5
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,29 @@ module github.com/qlcchain/go-qlc
33
require (
44
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 // indirect
55
github.com/BurntSushi/toml v0.3.1 // indirect
6+
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
7+
github.com/btcsuite/btcd v0.0.0-20181013004428-67e573d211ac // indirect
68
github.com/davecgh/go-spew v1.1.1 // indirect
79
github.com/dgraph-io/badger v1.5.4
810
github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 // indirect
9-
github.com/golang/protobuf v1.2.0
11+
github.com/gogo/protobuf v1.1.1 // indirect
12+
github.com/golang/protobuf v1.2.0 // indirect
1013
github.com/kr/pretty v0.1.0 // indirect
11-
github.com/kr/pty v1.1.3 // indirect
14+
github.com/libp2p/go-libp2p-crypto v1.5.0
1215
github.com/mitchellh/go-homedir v1.0.0
1316
github.com/philhofer/fwd v1.0.0 // indirect
1417
github.com/pkg/errors v0.8.0 // indirect
1518
github.com/pmezard/go-difflib v1.0.0 // indirect
1619
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24
1720
github.com/stretchr/testify v1.2.2 // indirect
1821
github.com/tinylib/msgp v1.0.2
19-
go.uber.org/atomic v1.3.2
20-
go.uber.org/multierr v1.1.0
22+
go.uber.org/atomic v1.3.2 // indirect
23+
go.uber.org/multierr v1.1.0 // indirect
2124
go.uber.org/zap v1.9.1
2225
golang.org/x/crypto v0.0.0-20180927165925-5295e8364332
2326
golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3 // indirect
2427
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect
25-
golang.org/x/sys v0.0.0-20180928133829-e4b3c5e90611
28+
golang.org/x/sys v0.0.0-20180928133829-e4b3c5e90611 // indirect
2629
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
2730
gopkg.in/natefinch/lumberjack.v2 v2.0.0
2831
gopkg.in/yaml.v2 v2.2.1 // indirect

p2p/key.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package p2p
2+
3+
import (
4+
"encoding/base64"
5+
"io/ioutil"
6+
mrand "math/rand"
7+
"time"
8+
9+
crypto "github.com/libp2p/go-libp2p-crypto"
10+
)
11+
12+
// LoadNetworkKeyFromFile load network priv key from file.
13+
func loadNetworkKeyFromFile(path string) (crypto.PrivKey, error) {
14+
data, err := ioutil.ReadFile(path)
15+
if err != nil {
16+
key, err := generateEd25519Key()
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
str, _ := marshalNetworkKey(key)
22+
23+
ioutil.WriteFile(path, []byte(str), 0600)
24+
25+
return key, err
26+
}
27+
return unmarshalNetworkKey(string(data))
28+
}
29+
30+
// LoadNetworkKeyFromFileOrCreateNew load network priv key from file or create new one.
31+
func LoadNetworkKeyFromFileOrCreateNew(path string) (crypto.PrivKey, error) {
32+
if path == "" {
33+
return generateEd25519Key()
34+
}
35+
return loadNetworkKeyFromFile(path)
36+
}
37+
38+
// UnmarshalNetworkKey unmarshal network key.
39+
func unmarshalNetworkKey(data string) (crypto.PrivKey, error) {
40+
binaryData, err := base64.StdEncoding.DecodeString(data)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
return crypto.UnmarshalPrivateKey(binaryData)
46+
}
47+
48+
// MarshalNetworkKey marshal network key.
49+
func marshalNetworkKey(key crypto.PrivKey) (string, error) {
50+
binaryData, err := crypto.MarshalPrivateKey(key)
51+
if err != nil {
52+
return "", err
53+
}
54+
55+
return base64.StdEncoding.EncodeToString(binaryData), nil
56+
}
57+
58+
// GenerateEd25519Key return a new generated Ed22519 Private key.
59+
func generateEd25519Key() (crypto.PrivKey, error) {
60+
r := mrand.New(mrand.NewSource(time.Now().UnixNano()))
61+
key, _, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
62+
return key, err
63+
}

p2p/key_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package p2p
2+
3+
import (
4+
"testing"
5+
6+
"github.com/qlcchain/go-qlc/config"
7+
)
8+
9+
func TestLoadNetworkKeyFromFileOrCreateNew(t *testing.T) {
10+
var cfg = config.DefaultlConfig
11+
LoadNetworkKeyFromFileOrCreateNew(cfg.PrivateKeyPath)
12+
}

0 commit comments

Comments
 (0)