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 4.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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:%s", repo.Name, err.Error())
  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. log.Info(strRepoID)
  115. _, err = blockchain.NewRepo(strRepoID, repo.Owner.PublicKey, repo.Name)
  116. if err != nil {
  117. log.Error("blockchain.NewRepo(%s) failed:%s", strRepoID, err.Error())
  118. }
  119. }
  120. return
  121. }
  122. func HandleBlockChainUnSuccessCommits() {
  123. blockChains, err := models.GetBlockChainUnSuccessCommits()
  124. if err != nil {
  125. log.Error("GetBlockChainUnSuccessCommits failed:", err.Error())
  126. return
  127. }
  128. for _, block_chain := range blockChains {
  129. _, err = blockchain.Contribute(block_chain.ContractAddress, block_chain.Contributor, blockchain.ActionCommit, block_chain.CommitID, int(block_chain.Amount))
  130. if err != nil {
  131. log.Error("blockchain.Contribute(%s) failed:%s", block_chain.CommitID, err.Error())
  132. }
  133. }
  134. return
  135. }
  136. func HandleBlockChainUnSuccessUsers() {
  137. users, err := models.GetBlockChainUnSuccessUsers()
  138. if err != nil {
  139. log.Error("GetBlockChainUnSuccessUsers failed:", err.Error())
  140. return
  141. }
  142. for _, user := range users {
  143. result, err := blockchain.CreateBlockchainAccount()
  144. if err != nil {
  145. log.Error("blockchain.CreateBlockchainAccount(%s) failed:%s", user.Name, err.Error())
  146. continue
  147. }
  148. user.PublicKey = result.Payload["publickey"].(string)
  149. user.PrivateKey = result.Payload["privatekey"].(string)
  150. models.UpdateUser(user)
  151. }
  152. return
  153. }