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

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