arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
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}