You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

126 lines
2.7 KiB

package cmd
import (
"crypto/ecdsa"
"crypto/x509"
"encoding/hex"
"encoding/pem"
"fmt"
"io/ioutil"
"os"
"github.com/arnaucube/slowlorisdb/config"
"github.com/arnaucube/slowlorisdb/core"
"github.com/arnaucube/slowlorisdb/db"
"github.com/arnaucube/slowlorisdb/node"
"github.com/arnaucube/slowlorisdb/peer"
log "github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
var Commands = []cli.Command{
{
Name: "create",
Aliases: []string{},
Usage: "create the node",
Action: cmdCreate,
},
{
Name: "start",
Aliases: []string{},
Usage: "start the node",
Action: cmdStart,
},
}
func writePrivKToFile(privK *ecdsa.PrivateKey, path string) error {
x509Encoded, err := x509.MarshalECPrivateKey(privK)
if err != nil {
return err
}
pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded})
// write privK to file
err = ioutil.WriteFile(path, pemEncoded, 0777)
return err
}
func readPrivKFromFile(path string) (*ecdsa.PrivateKey, error) {
pemEncoded, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
block, _ := pem.Decode([]byte(pemEncoded))
x509Encoded := block.Bytes
privK, err := x509.ParseECPrivateKey(x509Encoded)
return privK, err
}
// creates the node, this needs to be executed for first time
func cmdCreate(c *cli.Context) error {
conf, err := config.MustRead(c)
if err != nil {
return err
}
log.Info("creating new keys of the node")
privK, err := core.NewKey()
if err != nil {
return err
}
err = os.MkdirAll(conf.StoragePath, 0777)
if err != nil {
return err
}
err = writePrivKToFile(privK, conf.StoragePath+"/privK.pem")
if err != nil {
return err
}
fmt.Println("pubK", hex.EncodeToString(core.PackPubK(&privK.PublicKey)))
fmt.Println("addr", core.AddressFromPubK(&privK.PublicKey).String())
return nil
}
func cmdStart(c *cli.Context) error {
conf, err := config.MustRead(c)
if err != nil {
return err
}
db, err := db.New(conf.StoragePath + "/db")
if err != nil {
return err
}
// parse AuthNodes from the config file
var authNodes []*ecdsa.PublicKey
for _, authNode := range conf.AuthNodes {
packedPubK, err := hex.DecodeString(authNode)
if err != nil {
return err
}
pubK := core.UnpackPubK(packedPubK)
authNodes = append(authNodes, pubK)
}
bc := core.NewPoABlockchain(db, authNodes)
// parse privK from path in the config file
privK, err := readPrivKFromFile(conf.StoragePath + "/privK.pem")
if err != nil {
return err
}
fmt.Println("pubK", hex.EncodeToString(core.PackPubK(&privK.PublicKey)))
fmt.Println("addr", core.AddressFromPubK(&privK.PublicKey).String())
node, err := node.NewNode(privK, bc, true)
if err != nil {
return err
}
p := peer.NewPeer(node, conf)
p.Start()
return nil
}