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

blockchain.go 6.4 kB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package repo
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. "code.gitea.io/gitea/models"
  6. "code.gitea.io/gitea/modules/blockchain"
  7. "code.gitea.io/gitea/modules/context"
  8. "code.gitea.io/gitea/modules/log"
  9. )
  10. type BlockChainInitNotify struct {
  11. RepoId int64 `json:"repoId"`
  12. ContractAddress string `json:"contractAddress"`
  13. }
  14. type BlockChainCommitNotify struct {
  15. CommitID string `json:"commitId"`
  16. TransactionHash string `json:"txHash"`
  17. }
  18. func HandleBlockChainInitNotify(ctx *context.Context) {
  19. var req BlockChainInitNotify
  20. data, _ := ctx.Req.Body().Bytes()
  21. json.Unmarshal(data, &req)
  22. repo, err := models.GetRepositoryByID(req.RepoId)
  23. if err != nil {
  24. log.Error("GetRepositoryByID failed:", err.Error())
  25. ctx.JSON(200, map[string]string{
  26. "code" : "-1",
  27. "message" : "internal error",
  28. })
  29. return
  30. }
  31. if repo.BlockChainStatus == models.RepoBlockChainSuccess && len(repo.ContractAddress) != 0 {
  32. log.Error("the repo has been RepoBlockChainSuccess:", req.RepoId)
  33. ctx.JSON(200, map[string]string{
  34. "code" : "-1",
  35. "message" : "the repo has been RepoBlockChainSuccess",
  36. })
  37. return
  38. }
  39. repo.BlockChainStatus = models.RepoBlockChainSuccess
  40. repo.ContractAddress = req.ContractAddress
  41. if err = models.UpdateRepositoryCols(repo, "block_chain_status", "contract_address"); err != nil {
  42. log.Error("UpdateRepositoryCols failed:", err.Error())
  43. ctx.JSON(200, map[string]string{
  44. "code" : "-1",
  45. "message" : "internal error",
  46. })
  47. return
  48. }
  49. ctx.JSON(200, map[string]string{
  50. "code": "0",
  51. "message": "",
  52. })
  53. }
  54. func HandleBlockChainCommitNotify(ctx *context.Context) {
  55. var req BlockChainCommitNotify
  56. data, _ := ctx.Req.Body().Bytes()
  57. if err := json.Unmarshal(data, &req); err != nil {
  58. log.Error("json.Unmarshal failed:", err.Error())
  59. ctx.JSON(200, map[string]string{
  60. "code" : "-1",
  61. "message" : "response data error",
  62. })
  63. return
  64. }
  65. blockChain, err := models.GetBlockChainByCommitID(req.CommitID)
  66. if err != nil {
  67. log.Error("GetRepositoryByID failed:", err.Error())
  68. ctx.JSON(200, map[string]string{
  69. "code" : "-1",
  70. "message" : "internal error",
  71. })
  72. return
  73. }
  74. if blockChain.Status == models.BlockChainCommitSuccess {
  75. log.Error("the commit has been BlockChainCommitReady:", blockChain.RepoID)
  76. ctx.JSON(200, map[string]string{
  77. "code" : "-1",
  78. "message" : "the commit has been BlockChainCommitReady",
  79. })
  80. return
  81. }
  82. blockChain.Status = models.BlockChainCommitSuccess
  83. blockChain.TransactionHash = req.TransactionHash
  84. if err = models.UpdateBlockChainCols(blockChain, "status", "transaction_hash"); err != nil {
  85. log.Error("UpdateBlockChainCols failed:", err.Error())
  86. ctx.JSON(200, map[string]string{
  87. "code" : "-1",
  88. "message" : "internal error",
  89. })
  90. return
  91. }
  92. ctx.JSON(200, map[string]string{
  93. "code": "0",
  94. "message": "",
  95. })
  96. }
  97. func HandleBlockChainUnSuccessRepos() {
  98. repos, err := models.GetBlockChainUnSuccessRepos()
  99. if err != nil {
  100. log.Error("GetBlockChainUnSuccessRepos failed:", err.Error())
  101. return
  102. }
  103. for _, repo := range repos {
  104. err = repo.GetOwner()
  105. if err != nil {
  106. log.Error("GetOwner(%s) failed:%v", repo.Name, err)
  107. continue
  108. }
  109. if len(repo.Owner.PrivateKey) == 0 || len(repo.Owner.PublicKey) == 0 {
  110. log.Error("the user has not been init in block_chain:", repo.Owner.Name)
  111. continue
  112. }
  113. strRepoID := strconv.FormatInt(repo.ID, 10)
  114. _, err = blockchain.NewRepo(strRepoID, repo.Owner.PublicKey, repo.Name)
  115. if err != nil {
  116. log.Error("blockchain.NewRepo(%s) failed:%v", strRepoID, err)
  117. }
  118. }
  119. return
  120. }
  121. func HandleBlockChainUnSuccessCommits() {
  122. blockChains, err := models.GetBlockChainUnSuccessCommits()
  123. if err != nil {
  124. log.Error("GetBlockChainUnSuccessCommits failed:", err.Error())
  125. return
  126. }
  127. for _, block_chain := range blockChains {
  128. _, err = blockchain.Contribute(block_chain.ContractAddress, block_chain.Contributor, block_chain.CommitID, block_chain.Amount)
  129. if err != nil {
  130. log.Error("blockchain.Contribute(%s) failed:%v", block_chain.CommitID, err)
  131. }
  132. }
  133. return
  134. }
  135. func HandleBlockChainUnSuccessUsers() {
  136. users, err := models.GetBlockChainUnSuccessUsers()
  137. if err != nil {
  138. log.Error("GetBlockChainUnSuccessUsers failed:", err.Error())
  139. return
  140. }
  141. for _, user := range users {
  142. result, err := blockchain.CreateBlockchainAccount()
  143. if err != nil {
  144. log.Error("blockchain.CreateBlockchainAccount(%s) failed:%v", user.Name, err)
  145. continue
  146. }
  147. user.PublicKey = result.Payload["publickey"].(string)
  148. user.PrivateKey = result.Payload["privatekey"].(string)
  149. models.UpdateUser(user)
  150. }
  151. return
  152. }
  153. func HandleBlockChainMergedPulls() {
  154. prs, err := models.GetUnTransformedMergedPullRequests()
  155. if err != nil {
  156. log.Error("GetUnTransformedMergedPullRequests failed:", err.Error())
  157. return
  158. }
  159. for _, pr := range prs {
  160. _, err = models.GetBlockChainByPrID(pr.ID)
  161. if err == nil {
  162. log.Info("the pr(%s) has been transformed", pr.MergedCommitID)
  163. continue
  164. }
  165. err = pr.LoadIssue()
  166. if err != nil {
  167. log.Error("LoadIssue(%s) failed:%v", pr.MergedCommitID, err)
  168. continue
  169. }
  170. poster, err := models.GetUserByID(pr.Issue.PosterID)
  171. if err != nil {
  172. log.Error("GetUserByID(%s) failed:%v", pr.MergedCommitID, err)
  173. continue
  174. }
  175. if len(poster.PrivateKey) == 0 || len(poster.PublicKey) == 0 {
  176. log.Error("the user has not been init in block_chain:", poster.Name)
  177. continue
  178. }
  179. repo, err := models.GetRepositoryByID(pr.HeadRepoID)
  180. if err != nil {
  181. log.Error("GetUserByID(%s) failed:%v", pr.MergedCommitID, err)
  182. continue
  183. }
  184. if len(repo.ContractAddress) == 0 {
  185. log.Error("the repo(%s) has not been initialized in block_chain", repo.Name)
  186. continue
  187. }
  188. blockChain := models.BlockChain{
  189. Contributor : poster.PublicKey,
  190. PrID : pr.ID,
  191. CommitID : pr.MergedCommitID,
  192. ContractAddress : repo.ContractAddress,
  193. Status : models.BlockChainCommitInit,
  194. Amount : int64(pr.Amount),
  195. UserID : poster.ID,
  196. RepoID : pr.HeadRepoID,
  197. }
  198. _, err = models.InsertBlockChain(&blockChain)
  199. if err != nil {
  200. log.Error("InsertBlockChain(%s) failed:%v", pr.MergedCommitID, err)
  201. continue
  202. }
  203. pr.IsTransformed = true
  204. pr.UpdateCols("is_transformed")
  205. _, err = blockchain.Contribute(repo.ContractAddress, poster.PublicKey, pr.MergedCommitID, int64(pr.Amount))
  206. if err != nil {
  207. log.Error("blockchain.Contribute(%s) failed:%v", pr.MergedCommitID, err)
  208. }
  209. }
  210. return
  211. }