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