scan.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package blockchain
  2. import (
  3. "context"
  4. "fmt"
  5. "ktogame/contractgo/Collect"
  6. "ktogame/dbUtil"
  7. "ktogame/models"
  8. "os"
  9. "strings"
  10. "time"
  11. "github.com/astaxie/beego"
  12. "github.com/astaxie/beego/logs"
  13. "github.com/ethereum/go-ethereum/accounts/abi"
  14. utilAddress "github.com/korthochain/korthochain/pkg/address"
  15. "github.com/korthochain/korthochain/pkg/block"
  16. pb "github.com/korthochain/korthochain/pkg/server/grpcserver/message"
  17. "github.com/korthochain/korthochain/pkg/transaction"
  18. "google.golang.org/grpc"
  19. )
  20. var ktoClient pb.GreeterClient
  21. var ktoRpc = beego.AppConfig.String("hostHttp_mit_kto")
  22. var currentBlock uint64
  23. var TopsMap map[string]string
  24. func init() {
  25. kc, err := grpc.Dial(ktoRpc, grpc.WithInsecure(), grpc.WithBlock())
  26. if err != nil {
  27. logs.Info(err)
  28. os.Exit(1)
  29. }
  30. ktoClient = pb.NewGreeterClient(kc)
  31. utilAddress.SetNetWork("mainnet")
  32. tm := make(map[string]string, 0)
  33. tm[TopicParticipate] = COLLECT_PARTICIPATE
  34. TopsMap = tm
  35. go scanBlock()
  36. }
  37. func scanBlock() {
  38. time.Sleep(time.Second * 2)
  39. var bi models.BlockInfo
  40. ok, err := dbUtil.Engine.Id(1).Get(&bi)
  41. if err != nil {
  42. fmt.Println("获取最新快高错误=", err)
  43. return
  44. }
  45. if !ok {
  46. fmt.Println("获取最新快高失败!")
  47. return
  48. }
  49. currentBlock = uint64(bi.BlockNumber) + 1
  50. //currentBlock =62203394
  51. for {
  52. time.Sleep(time.Second * 5)
  53. res, err := ktoClient.GetMaxBlockHeight(context.Background(), &pb.ReqMaxBlockHeight{})
  54. if err != nil {
  55. fmt.Println("获取交易block number错误=", err)
  56. time.Sleep(time.Second * 5)
  57. continue
  58. }
  59. if res.MaxHeight < currentBlock {
  60. time.Sleep(time.Second * time.Duration(((currentBlock - res.MaxHeight) * 5)))
  61. continue
  62. }
  63. bl, err := ktoClient.GetBlockByNum(context.Background(), &pb.ReqBlockByNumber{Height: currentBlock})
  64. if err != nil || bl.Code != 0 {
  65. fmt.Println("获取交易block错误=", err)
  66. continue
  67. }
  68. blc, errs := block.Deserialize(bl.Data)
  69. if errs != nil {
  70. fmt.Println("解析blcock错误=", errs)
  71. continue
  72. }
  73. var ERR error
  74. for _, v := range blc.Transactions {
  75. evm, err := transaction.DecodeEvmData(v.Input)
  76. if err != nil {
  77. ERR = err
  78. break
  79. }
  80. if len(evm.Logs) == 0 {
  81. break
  82. }
  83. for _, l := range evm.Logs {
  84. th := l.Topics[0].Hex()
  85. method := TopsMap[th]
  86. addr := l.Address.String()
  87. if method == COLLECT_PARTICIPATE && addr == COLLECTCONTRACT {
  88. var ev EventParticipate
  89. abi, err := abi.JSON(strings.NewReader(Collect.CollectMetaData.ABI))
  90. if err != nil {
  91. ERR = err
  92. break
  93. }
  94. err = abi.UnpackIntoInterface(&ev, method, l.Data)
  95. if err != nil {
  96. ERR = err
  97. break
  98. }
  99. fmt.Printf("data=%+v\n ", ev)
  100. //handle user participate
  101. //usdrido(ev.User.String(), ev.Referrer.String(), v.HashToString(), decimal.NewFromBigInt(ev.Amount, -11), decimal.NewFromBigInt(ev.Price, -18), currentBlock)
  102. }
  103. }
  104. }
  105. if ERR != nil {
  106. fmt.Println("处理错误=", ERR)
  107. continue
  108. }
  109. bi.BlockNumber = int64(currentBlock)
  110. _, err = dbUtil.Engine.ID(1).Update(&bi)
  111. if err != nil {
  112. fmt.Println("更新最新快高错误=", err)
  113. return
  114. }
  115. currentBlock++
  116. }
  117. }