key.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "key-manager/dao"
  6. "key-manager/key"
  7. )
  8. func (km *KeyManager) CreateKey(ctx context.Context, req *CreateKeyRequest) (*KeyResponse, error) {
  9. km.lk.Lock()
  10. defer km.lk.Unlock()
  11. if _, ok := km.mnemonics[req.Name]; !ok {
  12. return &KeyResponse{
  13. Code: mnemonicNotExistErrCode,
  14. Msg: mnemonicNotExistErrMsg,
  15. Network: req.Network,
  16. Name: req.Name,
  17. Index: req.Index,
  18. }, nil
  19. }
  20. account, err := createKey(km.mnemonics[req.Name], req.Network, req.Index)
  21. if err != nil {
  22. return &KeyResponse{
  23. Code: createKeyErrCode,
  24. Msg: err.Error(),
  25. Network: req.Network,
  26. Name: req.Name,
  27. Index: req.Index,
  28. }, nil
  29. }
  30. if req.Network == eth {
  31. err = km.dao.CreateEth(&dao.EthAddressInfo{
  32. Name: req.Name,
  33. EthIndex: req.Index,
  34. EthAddress: account.GetAddr(),
  35. })
  36. } else {
  37. err = km.dao.CreateTron(&dao.TronAddressInfo{
  38. Name: req.Name,
  39. TronIndex: req.Index,
  40. TronAddress: account.GetAddr(),
  41. })
  42. }
  43. if err != nil {
  44. return &KeyResponse{
  45. Code: dbErrCode,
  46. Msg: err.Error(),
  47. Network: req.Network,
  48. Name: req.Name,
  49. Index: req.Index,
  50. }, nil
  51. }
  52. km.signers[account.GetAddr()] = account.GetPriKey()
  53. return &KeyResponse{
  54. Code: okCode,
  55. Msg: okMsg,
  56. Network: req.Network,
  57. Name: req.Name,
  58. Index: req.Index,
  59. Address: account.GetAddr(),
  60. }, nil
  61. }
  62. func createKey(mnemonic string, network string, index int64) (key.Account, error) {
  63. switch network {
  64. case eth:
  65. return key.NewEthAccount(mnemonic, uint64(index))
  66. case tron:
  67. return key.NewTronAccount(mnemonic, uint64(index))
  68. default:
  69. return nil, errors.New("network must be eth or tron")
  70. }
  71. }
  72. func (km *KeyManager) GetIndex(ctx context.Context, req *GetIndexRequest) (*KeyResponse, error) {
  73. km.lk.Lock()
  74. defer km.lk.Unlock()
  75. addr, err := format(req.Network, req.Address)
  76. if err != nil {
  77. return &KeyResponse{
  78. Code: addressErrCode,
  79. Msg: addressErrMsg,
  80. Network: req.Network,
  81. Name: "",
  82. Index: -1,
  83. }, nil
  84. }
  85. var info dao.AccountInfo
  86. switch req.Network {
  87. case eth:
  88. info, err = km.dao.GetEthFromAddress(addr)
  89. case tron:
  90. info, err = km.dao.GetTronFromAddress(addr)
  91. default:
  92. return &KeyResponse{
  93. Code: networkErrCode,
  94. Msg: networkErrMsg,
  95. Network: req.Network,
  96. Name: "",
  97. Index: -1,
  98. }, nil
  99. }
  100. if err != nil {
  101. return &KeyResponse{
  102. Code: dbErrCode,
  103. Msg: err.Error(),
  104. Network: req.Network,
  105. Name: "",
  106. Index: -1,
  107. }, nil
  108. }
  109. return &KeyResponse{
  110. Code: okCode,
  111. Msg: okMsg,
  112. Network: req.Network,
  113. Name: info.GetName(),
  114. Index: info.GetIndex(),
  115. Address: info.GetAddr(),
  116. }, nil
  117. }
  118. func (km *KeyManager) GetAddress(ctx context.Context, req *GetAddressRequest) (*KeyResponse, error) {
  119. km.lk.Lock()
  120. defer km.lk.Unlock()
  121. var info dao.AccountInfo
  122. var err error
  123. switch req.Network {
  124. case eth:
  125. info, err = km.dao.GetEthFromIndex(req.Name, req.Index)
  126. case tron:
  127. info, err = km.dao.GetTronFromIndex(req.Name, req.Index)
  128. default:
  129. return &KeyResponse{
  130. Code: networkErrCode,
  131. Msg: networkErrMsg,
  132. Network: req.Network,
  133. Name: "",
  134. Index: -1,
  135. }, nil
  136. }
  137. if err != nil {
  138. return &KeyResponse{
  139. Code: dbErrCode,
  140. Msg: err.Error(),
  141. Network: req.Network,
  142. Name: "",
  143. Index: -1,
  144. }, nil
  145. }
  146. return &KeyResponse{
  147. Code: okCode,
  148. Msg: okMsg,
  149. Network: req.Network,
  150. Name: info.GetName(),
  151. Index: info.GetIndex(),
  152. Address: info.GetAddr(),
  153. }, nil
  154. }