slowlorisdb/cmd/cmd.go
cmd/cmd.goRaw
1package cmd
2
3import (
4 "crypto/ecdsa"
5 "crypto/x509"
6 "encoding/hex"
7 "encoding/pem"
8 "fmt"
9 "io/ioutil"
10 "os"
11
12 "github.com/arnaucube/slowlorisdb/config"
13 "github.com/arnaucube/slowlorisdb/core"
14 "github.com/arnaucube/slowlorisdb/db"
15 "github.com/arnaucube/slowlorisdb/node"
16 log "github.com/sirupsen/logrus"
17 "github.com/urfave/cli"
18)
19
20var Commands = []cli.Command{
21 {
22 Name: "create",
23 Aliases: []string{},
24 Usage: "create the node",
25 Action: cmdCreate,
26 },
27 {
28 Name: "start",
29 Aliases: []string{},
30 Usage: "start the node",
31 Action: cmdStart,
32 },
33}
34
35func writePrivKToFile(privK *ecdsa.PrivateKey, path string) error {
36 x509Encoded, err := x509.MarshalECPrivateKey(privK)
37 if err != nil {
38 return err
39 }
40 pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded})
41 // write privK to file
42 err = ioutil.WriteFile(path, pemEncoded, 0777)
43 return err
44}
45
46func readPrivKFromFile(path string) (*ecdsa.PrivateKey, error) {
47 pemEncoded, err := ioutil.ReadFile(path)
48 if err != nil {
49 return nil, err
50 }
51 block, _ := pem.Decode([]byte(pemEncoded))
52 x509Encoded := block.Bytes
53 privK, err := x509.ParseECPrivateKey(x509Encoded)
54 return privK, err
55}
56
57// creates the node, this needs to be executed for first time
58func cmdCreate(c *cli.Context) error {
59 conf, err := config.MustRead(c)
60 if err != nil {
61 return err
62 }
63
64 log.Info("creating new keys of the node")
65 privK, err := core.NewKey()
66 if err != nil {
67 return err
68 }
69 err = os.MkdirAll(conf.StoragePath, 0777)
70 if err != nil {
71 return err
72 }
73 err = writePrivKToFile(privK, conf.StoragePath+"/privK.pem")
74 if err != nil {
75 return err
76 }
77
78 fmt.Println("pubK", hex.EncodeToString(core.PackPubK(&privK.PublicKey)))
79 fmt.Println("addr", core.AddressFromPubK(&privK.PublicKey).String())
80
81 return nil
82}
83
84func cmdStart(c *cli.Context) error {
85 conf, err := config.MustRead(c)
86 if err != nil {
87 return err
88 }
89
90 db, err := db.New(conf.StoragePath + "/db")
91 if err != nil {
92 return err
93 }
94
95 // parse AuthNodes from the config file
96 var authNodes []*ecdsa.PublicKey
97 for _, authNode := range conf.AuthNodes {
98 packedPubK, err := hex.DecodeString(authNode)
99 if err != nil {
100 return err
101 }
102 pubK := core.UnpackPubK(packedPubK)
103 authNodes = append(authNodes, pubK)
104 }
105
106 bc := core.NewPoABlockchain(db, authNodes)
107
108 // parse privK from path in the config file
109 privK, err := readPrivKFromFile(conf.StoragePath + "/privK.pem")
110 if err != nil {
111 return err
112 }
113 fmt.Println("pubK", hex.EncodeToString(core.PackPubK(&privK.PublicKey)))
114 fmt.Println("addr", core.AddressFromPubK(&privK.PublicKey).String())
115
116 node, err := node.NewNode(privK, bc, true)
117 if err != nil {
118 return err
119 }
120 err = node.Start()
121 if err != nil {
122 return err
123 }
124
125 return nil
126}