Commit 81815ab0 authored by duanjinfei's avatar duanjinfei

init commit

parent 4a784859
Pipeline #598 failed with stages
nft-event
.idea
\ No newline at end of file
package cache
import (
"fmt"
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
"github.com/garyburd/redigo/redis"
red "github.com/wuban/nft-event/cache/redis"
"time"
)
var Redis red.IRedis
var pool *redis.Pool
func init() {
conn := beego.AppConfig.String("cache::conn")
dbNum := beego.AppConfig.String("cache::dbNum")
password := beego.AppConfig.String("cache::password")
if err := NewPool(conn, dbNum, password); err != nil {
logs.Error(err)
return
}
Redis = red.NewStoreRedis(pool)
}
func NewPool(conn, dbNum, password string) error {
fmt.Println("redis连接池里的连接为空,重新创建连接池,starting...")
pool = &redis.Pool{
MaxIdle: 50, //最大空闲连接数
MaxActive: 0, //若为0,则活跃数没有限制
Wait: true,
IdleTimeout: 30 * time.Second, //最大空闲连接时间
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", conn)
if err != nil {
panic(err)
return nil, err
}
// 设置密码
if _, err := c.Do("AUTH", password); err != nil {
panic(err)
return nil, err
}
// 选择db
c.Do("SELECT", dbNum)
return c, nil
},
}
return nil
}
package redis
type IRedis interface {
Set(key, value string) error
Get(key string) string
LpushByte(key string, value []byte) error
Close()
RPopByte(key string) ([]byte, error)
LLen(key string) (int64, error)
RPopLPushByte(key, key1 string) ([]byte, error)
}
package redis
import (
"fmt"
"github.com/garyburd/redigo/redis"
"reflect"
"strings"
"unsafe"
)
type StoreRedis struct {
pool *redis.Pool
}
func NewStoreRedis(pool *redis.Pool) IRedis {
sr := new(StoreRedis)
sr.pool = pool
return sr
}
/**
此方法没有使用
*/
func (s *StoreRedis) errorLogic(e error) {
i := strings.Index(e.Error(), "connect: connection refused")
if i == -1 {
fmt.Println(i, "不包含")
}
}
/**
设置key,value数据
*/
func (s *StoreRedis) Set(key, value string) error {
_, err := s.pool.Get().Do("SET", key, value)
defer s.Close()
if err != nil {
return err
}
return nil
}
/**
设置key,value数据
*/
func (s *StoreRedis) SetBytes(key string, value []byte) error {
_, err := s.pool.Get().Do("SET", key, value)
defer s.Close()
if err != nil {
return err
}
return nil
}
/**
设置key的过期时间
*/
func (s *StoreRedis) SetKvAndExp(key, value string, expire int) error {
_, err := s.pool.Get().Do("SET", key, value, "EX", expire)
defer s.Close()
if err != nil {
return err
}
return nil
}
func (s *StoreRedis) SetKvInt(key string, value int) error {
_, err := s.pool.Get().Do("SET", key, value)
defer s.Close()
if err != nil {
return err
}
return nil
}
/**
根据key获取对应数据
*/
func (s *StoreRedis) Get(key string) string {
value, err := redis.String(s.pool.Get().Do("GET", key))
defer s.Close()
if err != nil {
fmt.Println("redis get failed:", err)
}
return value
}
/**
根据key获取对应数据
*/
func (s *StoreRedis) GetBytes(key string) []byte {
value, err := s.pool.Get().Do("GET", key)
defer s.Close()
if err != nil {
fmt.Println("redis get failed:", err)
}
if value == nil {
return nil
}
return value.([]byte)
}
/**
判断key是否存在
*/
func (s *StoreRedis) IsKeyExists(key string) bool {
is_key_exit, _ := redis.Bool(s.pool.Get().Do("EXISTS", key))
defer s.Close()
return is_key_exit
}
/**
删除key
*/
func (s *StoreRedis) Del(key string) bool {
is_key_delete, err := redis.Bool(s.pool.Get().Do("DEL", key))
defer s.Close()
if err != nil {
fmt.Println("error:", err)
}
return is_key_delete
}
/**
删除key
*/
func (s *StoreRedis) HDel(key string, field string) bool {
is_key_delete, err := redis.Bool(s.pool.Get().Do("HDEL", key, field))
defer s.Close()
if err != nil {
fmt.Println("error:", err)
}
return is_key_delete
}
/**
对象转换成json后进行存储
*/
func (s *StoreRedis) Setnx(key string, value []byte) error {
_, err := s.pool.Get().Do("SETNX", key, value)
defer s.Close()
if err != nil {
return err
}
return nil
}
func (s *StoreRedis) LpushByte(key string, value []byte) error {
_, err := s.pool.Get().Do("lpush", key, value)
if err != nil {
defer s.Close()
return err
}
defer s.Close()
return nil
}
func (s *StoreRedis) RPopByte(key string) ([]byte, error) {
v, err := redis.Bytes(s.pool.Get().Do("rpop", key))
if err != nil {
defer s.Close()
return nil, err
}
defer s.Close()
return v, nil
}
func (s *StoreRedis) LPop(key string) (string, error) {
v, err := s.pool.Get().Do("lpop", key)
if err != nil {
defer s.Close()
return "", err
}
defer s.Close()
if v == nil {
return "", nil
}
vv := BytesToString(v.([]byte))
return vv, nil
}
func BytesToString(b []byte) string {
bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
sh := reflect.StringHeader{bh.Data, bh.Len}
return *(*string)(unsafe.Pointer(&sh))
}
func (s *StoreRedis) LLen(key string) (int64, error) {
v, err := s.pool.Get().Do("llen", key)
if err != nil {
defer s.Close()
return 0, err
}
defer s.Close()
if v == nil {
return 0, nil
}
return v.(int64), nil
}
func (s *StoreRedis) Close() {
s.pool.Get().Close()
}
/**
Hincryby方法
*/
func (s *StoreRedis) HINCRBY(key, field string) {
s.pool.Get().Do("HINCRBY", key, field, 1)
defer s.Close()
}
/**
HGet方法
*/
func (s *StoreRedis) HGet(key, field string) (interface{}, error) {
value, err := s.pool.Get().Do("HGET", key, field)
defer s.Close()
return value, err
}
/**
HGetAll方法
*/
func (s *StoreRedis) HGetAll(key string) ([][]byte, error) {
inter, err := redis.ByteSlices(s.pool.Get().Do("HGetAll", key))
defer s.Close()
return inter, err
}
/**
Hset方法
*/
func (s *StoreRedis) HSet(key string, field string, value string) (interface{}, error) {
inter, err := s.pool.Get().Do("HSET", key, field, value)
defer s.Close()
return inter, err
}
/**
Hset方法
*/
func (s *StoreRedis) HSetByte(key string, field string, value []byte) (interface{}, error) {
inter, err := s.pool.Get().Do("HSET", key, field, value)
defer s.Close()
return inter, err
}
/**
SADD方法
*/
func (s *StoreRedis) SAdd(args []interface{}) (interface{}, error) {
inter, err := s.pool.Get().Do("SADD", args...)
defer s.Close()
return inter, err
}
/**
Scard方法
*/
func (s *StoreRedis) SCard(key string) (interface{}, error) {
inter, err := s.pool.Get().Do("SCARD", key)
defer s.Close()
return inter, err
}
/**
Spop方法
*/
func (s *StoreRedis) SPop(key string) (interface{}, error) {
inter, err := s.pool.Get().Do("SPOP", key)
defer s.Close()
vv := BytesToString(inter.([]byte))
return vv, err
}
func (s *StoreRedis) RPopLPushByte(key, key1 string) ([]byte, error) {
v, err := redis.Bytes(s.pool.Get().Do("RPOPLPUSH", key, key1))
if err != nil {
defer s.Close()
return nil, err
}
defer s.Close()
return v, nil
}
appname = nft-event
httpport = 9000
runmode = dev
mysql = root:mysql2022@/nftEvent?charset=utf8
rpcUrl = https://cloudflare-eth.com
deployedBlock = 17347500
isSyncLog = false
beforeEndReqUrl = https://meta.hapeprime.com/
httpUrlRegex = ^(http|https):\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(\/\S*)?$
lotteryContract = 0x2Fc9Ba75f1c78ECc77D1a8fD3BDd6bA83eA68b7e
secret = 0x2Fc9Ba75f1c78ECc77D1a8fD3BDd6bA83eA68b7e
# redis config
[cache]
collectionName = redis
conn = 127.0.0.1:6379
dbNum = 1
password = 123456
package controllers
import (
"github.com/astaxie/beego"
"github.com/wuban/nft-event/utils"
)
type AuthController struct {
BaseController
}
func (c *AuthController) GetToken() {
secret := beego.AppConfig.String("secret")
res, err := utils.GenerateToken(secret)
if err != nil {
c.ResponseInfo(500, "Get token error", err.Error())
}
c.ResponseInfo(200, "success", res)
}
package controllers
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
)
type BaseController struct {
beego.Controller
}
func (d *BaseController) ResponseInfo(code int, msg interface{}, result interface{}) {
switch code {
case 500:
logs.Error(msg, result)
d.Data["json"] = map[string]interface{}{"code": "500", "msg": msg, "data": result}
case 200:
logs.Info(msg, result)
d.Data["json"] = map[string]interface{}{"code": "200", "msg": msg, "data": result}
}
d.ServeJSON()
}
package controllers
import (
"encoding/json"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/wuban/nft-event/models"
"github.com/wuban/nft-event/utils"
"io/ioutil"
"net/http"
"regexp"
)
type LotteryController struct {
BaseController
}
func (c *LotteryController) GetPeriodList() {
poolAddr := c.GetString("poolAddr")
if poolAddr == "" || !utils.IsAddress(poolAddr) {
c.ResponseInfo(500, models.PARAM_ERR, "")
}
o := orm.NewOrm()
var lotteries []*models.Lottery
_, err := o.QueryTable("lottery").Filter("pool_addr", poolAddr).All(&lotteries, "period")
if err != nil {
c.ResponseInfo(500, models.PERIOD_ERR, err.Error())
}
res := &models.LotteryPeriodListRes{
PoolAddr: poolAddr,
}
periodList := make([]int64, 0)
for i := 0; i < len(lotteries); i++ {
periodList = append(periodList, lotteries[i].Period)
}
res.PeriodList = periodList
c.ResponseInfo(200, models.SUCCESS, res)
}
func (c *LotteryController) GetUserList() {
poolAddr := c.GetString("poolAddr")
if poolAddr == "" || !utils.IsAddress(poolAddr) {
c.ResponseInfo(500, models.PARAM_ERR, "")
}
period, err := c.GetInt64("period")
if err != nil {
c.ResponseInfo(500, models.PARAM_ERR, err.Error())
}
o := orm.NewOrm()
var lotteries []*models.Lottery
_, err = o.QueryTable("lottery").Filter("pool_addr", poolAddr).Filter("period", period).OrderBy("-sort_by").All(&lotteries, "user", "value", "hash")
if err != nil {
c.ResponseInfo(500, models.USER_ERR, err.Error())
}
res := make([]*models.LotteryUserList, 0)
for i := 0; i < len(lotteries); i++ {
lottery := lotteries[i]
lotteryUserList := &models.LotteryUserList{
UserAddr: lottery.User,
Value: lottery.Value,
Hash: lottery.Hash,
}
res = append(res, lotteryUserList)
}
c.ResponseInfo(200, models.SUCCESS, res)
}
func (c *LotteryController) GetHashSortByCondition() {
poolAddr := c.GetString("poolAddr")
if poolAddr == "" || !utils.IsAddress(poolAddr) {
c.ResponseInfo(500, models.PARAM_ERR, "")
}
userAddr := c.GetString("user")
if userAddr == "" || !utils.IsAddress(poolAddr) {
c.ResponseInfo(500, models.PARAM_ERR, "")
}
period, err := c.GetInt64("period")
if err != nil {
c.ResponseInfo(500, models.PARAM_ERR, err.Error())
}
o := orm.NewOrm()
lottery := &models.Lottery{}
err = o.QueryTable("lottery").Filter("pool_addr", poolAddr).Filter("period", period).One(lottery)
if err != nil {
c.ResponseInfo(500, models.SORTBY_ERR, err.Error())
}
if lottery == nil {
c.ResponseInfo(200, models.DATA_NIL, nil)
}
lotteryHashLastSix := &models.LotteryHashLastSix{
Hash: lottery.Hash,
SortBy: lottery.SortBy,
}
c.ResponseInfo(200, models.SUCCESS, lotteryHashLastSix)
}
func (c *LotteryController) ForwardReq() {
id := c.GetString("id")
urlPattern := beego.AppConfig.String("httpUrlRegex")
// 编译正则表达式
regex, err := regexp.Compile(urlPattern)
if err != nil {
c.ResponseInfo(500, models.FAILED, err.Error())
}
if id == "" {
c.ResponseInfo(500, models.PARAM_ERR, nil)
}
if regex.MatchString(id) {
c.ResponseInfo(500, models.PARAM_ERR, nil)
}
url := beego.AppConfig.String("beforeEndReqUrl") + id
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
c.ResponseInfo(500, models.FAILED, err.Error())
}
resp, err := client.Do(req)
if err != nil {
c.ResponseInfo(500, models.FAILED, err.Error())
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
c.ResponseInfo(500, models.FAILED, err.Error())
}
res := map[string]interface{}{}
json.Unmarshal(body, &res)
c.ResponseInfo(200, models.SUCCESS, res)
}
module github.com/wuban/nft-event
go 1.19
require github.com/astaxie/beego v1.12.1
require (
github.com/ethereum/go-ethereum v1.12.0
github.com/garyburd/redigo v1.6.4
github.com/go-sql-driver/mysql v1.7.1
github.com/sirupsen/logrus v1.9.2
github.com/smartystreets/goconvey v1.6.4
)
require (
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/deckarep/golang-set/v2 v2.1.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/go-ole/go-ole v1.2.1 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect
github.com/jtolds/gls v4.20.0+incompatible // indirect
github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect
github.com/tklauser/go-sysconf v0.3.5 // indirect
github.com/tklauser/numcpus v0.2.2 // indirect
golang.org/x/crypto v0.1.0 // indirect
golang.org/x/net v0.8.0 // indirect
golang.org/x/sys v0.7.0 // indirect
golang.org/x/text v0.8.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8=
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
github.com/astaxie/beego v1.12.1 h1:dfpuoxpzLVgclveAXe4PyNKqkzgm5zF4tgF2B3kkM2I=
github.com/astaxie/beego v1.12.1/go.mod h1:kPBWpSANNbSdIqOc8SUL9h+1oyBMZhROeYsXQDbidWQ=
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk=
github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=
github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI=
github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
github.com/ethereum/go-ethereum v1.12.0 h1:bdnhLPtqETd4m3mS8BGMNvBTf36bO5bx/hxE2zljOa0=
github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/garyburd/redigo v1.6.4 h1:LFu2R3+ZOPgSMWMOL+saa/zXRjw0ID2G8FepO53BGlg=
github.com/garyburd/redigo v1.6.4/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8=
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw=
github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI=
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 h1:v9ezJDHA1XGxViAUSIoO/Id7Fl63u6d0YmsAm+/p2hs=
github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02/go.mod h1:RF16/A3L0xSa0oSERcnhd8Pu3IXSDZSK2gmGIMsttFE=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4=
github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q=
github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
package main
import (
"github.com/astaxie/beego"
_ "github.com/wuban/nft-event/routers"
"github.com/wuban/nft-event/sync"
)
func main() {
isSyncLog, _ := beego.AppConfig.Bool("isSyncLog")
if isSyncLog {
go sync.SyncLogs()
}
beego.Run()
}
package models
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
mysqlCfg := beego.AppConfig.String("mysql")
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", mysqlCfg)
orm.RegisterModel(new(Lottery))
orm.RunSyncdb("default", false, true)
}
package models
type Lottery struct {
Id int64 `orm:"pk;auto"`
PoolAddr string `orm:"size(255)"`
Period int64
User string `orm:"size(255)"`
Value string `orm:"size(255)"`
Hash string `orm:"size(255)"`
SortBy string `orm:"size(255)"`
}
package models
const (
SUCCESS = "success"
FAILED = "failed"
PARAM_ERR = "Input param error"
DATA_NIL = "Get data is nil"
PERIOD_ERR = "Get period list err"
USER_ERR = "Get user list err"
SORTBY_ERR = "Get sort condition err"
)
package models
type LotteryPeriodListRes struct {
PoolAddr string `json:"poolAddr"`
PeriodList []int64 `json:"periodList"`
}
type LotteryUserList struct {
UserAddr string `json:"userAddr"`
Value string `json:"value"`
Hash string `json:"hash"`
}
type LotteryHashLastSix struct {
Hash string `json:"hash"`
SortBy string `json:"sortBy"`
}
type FilterRes struct {
Code int `json:"code"`
Msg interface{} `json:"msg"`
Data interface{} `json:"data"`
}
package routers
import (
"github.com/astaxie/beego"
"github.com/wuban/nft-event/controllers"
)
func init() {
beego.Router("/api/v1/event/get/periodList", &controllers.LotteryController{}, "get:GetPeriodList")
beego.Router("/api/v1/event/get/joinUserList", &controllers.LotteryController{}, "get:GetUserList")
beego.Router("/api/v1/event/get/sortCondition", &controllers.LotteryController{}, "get:GetHashSortByCondition")
beego.Router("/api/v1/event/get/param", &controllers.LotteryController{}, "get:ForwardReq")
beego.Router("/getToken", &controllers.AuthController{}, "get:GetToken")
// 添加鉴权过滤器
//beego.InsertFilter("/*", beego.BeforeRouter, utils.AuthFilter)
}
package sync
import (
"bufio"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/orm"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
log "github.com/sirupsen/logrus"
"github.com/wuban/nft-event/models"
"github.com/wuban/nft-event/utils"
"math/big"
"os"
)
// LotteryTopic ERC721 transfer event topic
var LotteryTopic = crypto.Keccak256Hash([]byte("Lottery(address,uint256,address,uint256)")).Hex()
func LotteryContractHandler(vLog types.Log) error {
logs.Info("handler lottery contract logs")
file, err := os.Open("./sync/Lottery_Event.json")
if err != nil {
panic(err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
log.Error("read file close failed:", err)
}
}(file)
lotteryAbiInfo, _ := abi.JSON(bufio.NewReader(file))
log.Info("LotteryTopic:", LotteryTopic)
{
txHash := vLog.TxHash.Hex()
method := vLog.Topics[0]
switch method.String() {
case LotteryTopic:
rp, err := lotteryAbiInfo.Unpack("Lottery", vLog.Data)
period, err := utils.HexToInt64(vLog.Topics[2].Hex())
if err != nil {
log.Error("HexToInt64 error:", err.Error())
return err
}
value := rp[0].(*big.Int)
log.Info("value:", value.String())
lottery := &models.Lottery{
PoolAddr: utils.HexToAddr(vLog.Topics[1].Hex()).String(),
Period: period,
User: utils.HexToAddr(vLog.Topics[3].Hex()).String(),
Value: value.String(),
Hash: txHash,
SortBy: txHash[len(txHash)-6:],
}
log.Info("Insert data lottery:", lottery)
o := orm.NewOrm()
lotteryVar := &models.Lottery{}
// todo 是否需要过滤每个用户只能参加一次抽奖的日志
o.QueryTable("lottery").Filter("pool_addr", lottery.PoolAddr).Filter("period", lottery.Period).Filter("User", lottery.User).All(lotteryVar)
if lotteryVar.PoolAddr != "" {
log.Warning("The lottery is exist", lotteryVar)
return nil
}
_, err = o.Insert(lottery)
if err != nil {
logs.Error("Insert lottery error:", err.Error())
return err
}
}
}
return nil
}
[
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "pool",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "period",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Lottery",
"type": "event"
}
]
\ No newline at end of file
package sync
import (
"context"
"fmt"
"github.com/astaxie/beego"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
log "github.com/sirupsen/logrus"
"github.com/wuban/nft-event/cache"
"math/big"
"time"
)
const (
LastSyncBlockKey = "lastSyncBlock"
)
var (
pullTask *PullEvent
bigOne = big.NewInt(1)
bigTen = big.NewInt(10)
bigHundred = big.NewInt(100)
bigEight = big.NewInt(700)
)
type logHandler func(log types.Log) error
type PullEvent struct {
ctx context.Context
client *ethclient.Client
lastBlock *big.Int
contractList []common.Address
contractHandler map[common.Address]logHandler
}
func SyncLogs() {
pullTask.GetLogs()
}
func init() {
var err error
rpc := beego.AppConfig.String("rpcUrl")
deployBlock := beego.AppConfig.String("deployedBlock")
fmt.Println("get rpc ", rpc)
pullTask = &PullEvent{contractHandler: make(map[common.Address]logHandler)}
client, err := ethclient.Dial(rpc)
if err != nil {
panic(fmt.Sprintf("ethclient dial failed, err:", err))
} else {
pullTask.client = client
lastBlock := cache.Redis.Get(LastSyncBlockKey)
if len(lastBlock) == 0 {
lastBlock = deployBlock
}
{
blockNumber, _ := new(big.Int).SetString(lastBlock, 10)
pullTask.lastBlock = blockNumber
}
}
pullTask.ctx = context.Background()
pullTask.contractList = make([]common.Address, 0)
{
lotteryAddr := beego.AppConfig.String("lotteryContract")
if lotteryAddr == "" {
return
}
addr := common.HexToAddress(lotteryAddr)
pullTask.contractList = append(pullTask.contractList, addr)
pullTask.contractHandler[addr] = LotteryContractHandler
}
}
func (p *PullEvent) GetLogs() {
query := ethereum.FilterQuery{}
query.FromBlock = p.lastBlock
query.ToBlock = new(big.Int).Add(p.lastBlock, big.NewInt(1))
query.Addresses = p.contractList
for {
query.FromBlock = p.lastBlock
log.Info("start fileter start at ", p.lastBlock.Text(10))
height, err := p.client.BlockNumber(p.ctx)
log.Info("current node height:", height)
if height <= p.lastBlock.Uint64() {
time.Sleep(time.Second)
continue
} else if (height - 700) >= p.lastBlock.Uint64() {
query.ToBlock = new(big.Int).Add(p.lastBlock, bigEight)
} else if (height - 100) >= p.lastBlock.Uint64() {
query.ToBlock = new(big.Int).Add(p.lastBlock, bigHundred)
} else if (height - 10) >= p.lastBlock.Uint64() {
query.ToBlock = new(big.Int).Add(p.lastBlock, bigTen)
} else {
query.ToBlock = new(big.Int).Add(p.lastBlock, bigOne)
}
allLogs, err := p.client.FilterLogs(p.ctx, query)
if err != nil {
log.Error("filter logs failed", err)
continue
}
if len(allLogs) > 0 {
for _, vlog := range allLogs {
handle, exist := p.contractHandler[vlog.Address]
if exist {
handle(vlog)
}
}
}
p.lastBlock = new(big.Int).Add(query.ToBlock, bigOne)
cache.Redis.Set(LastSyncBlockKey, p.lastBlock.Text(10))
}
}
package test
import (
"net/http"
"net/http/httptest"
"testing"
"runtime"
"path/filepath"
_ "nft-event/routers"
"github.com/astaxie/beego"
. "github.com/smartystreets/goconvey/convey"
)
func init() {
_, file, _, _ := runtime.Caller(0)
apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator))))
beego.TestBeegoInit(apppath)
}
// TestBeego is a sample to run an endpoint test
func TestBeego(t *testing.T) {
r, _ := http.NewRequest("GET", "/", nil)
w := httptest.NewRecorder()
beego.BeeApp.Handlers.ServeHTTP(w, r)
beego.Trace("testing", "TestBeego", "Code[%d]\n%s", w.Code, w.Body.String())
Convey("Subject: Test Station Endpoint\n", t, func() {
Convey("Status Code Should Be 200", func() {
So(w.Code, ShouldEqual, 200)
})
Convey("The Result Should Not Be Empty", func() {
So(w.Body.Len(), ShouldBeGreaterThan, 0)
})
})
}
package utils
import (
"fmt"
"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
"github.com/dgrijalva/jwt-go"
"github.com/wuban/nft-event/models"
"net/http"
"time"
)
// 定义 JWT 密钥
var jwtKey = []byte(beego.AppConfig.String("secret"))
// Claims 定义自定义声明
type Claims struct {
Address string `json:"address"`
jwt.StandardClaims
}
// GenerateToken 生成 JWT
func GenerateToken(address string) (string, error) {
// 设置过期时间
expirationTime := time.Now().Add(15 * time.Minute)
// 创建声明
claims := &Claims{
Address: address,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expirationTime.Unix(),
IssuedAt: time.Now().Unix(),
},
}
// 创建令牌
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// 签名令牌
tokenString, err := token.SignedString(jwtKey)
if err != nil {
return "", err
}
return tokenString, nil
}
// AuthFilter 鉴权过滤器
var AuthFilter = func(ctx *context.Context) {
// 判断路由是否需要鉴权
if ctx.Request.URL.Path == "/getToken" {
// 不进行鉴权校验,直接通过
return
}
filterRes := &models.FilterRes{
Data: "",
Code: http.StatusUnauthorized,
Msg: "Unauthorized",
}
authHeader := ctx.Input.Header("Authorization")
if authHeader == "" {
ctx.Output.SetStatus(http.StatusUnauthorized)
ctx.Output.JSON(filterRes, true, false)
return
}
// 解析 JWT
tokenString := authHeader[len("Bearer "):]
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("UnExpected signing method")
}
return jwtKey, nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
ctx.Output.SetStatus(http.StatusUnauthorized)
ctx.Output.JSON(filterRes, true, false)
return
}
filterRes.Code = http.StatusBadRequest
filterRes.Msg = "Bad Request"
ctx.Output.SetStatus(http.StatusBadRequest)
ctx.Output.JSON(filterRes, true, false)
return
}
if !token.Valid {
ctx.Output.SetStatus(http.StatusUnauthorized)
ctx.Output.JSON(filterRes, true, false)
return
}
if claims.Address != beego.AppConfig.String("secret") {
ctx.Output.SetStatus(http.StatusUnauthorized)
filterRes.Msg = "Error token"
ctx.Output.JSON(filterRes, true, false)
return
}
}
package utils
import (
"encoding/hex"
"fmt"
"github.com/astaxie/beego"
"github.com/dgrijalva/jwt-go"
"github.com/ethereum/go-ethereum/common"
log "github.com/sirupsen/logrus"
)
func IsAddress(val string) bool {
return common.IsHexAddress(val)
}
func HexToAddr(val string) common.Address {
return common.HexToAddress(val)
}
func HexToInt64(hexStr string) (int64, error) {
// 去除十六进制字符串的前缀 "0x"
if len(hexStr) > 2 && hexStr[0:2] == "0x" {
hexStr = hexStr[2:]
}
// 解码十六进制字符串
bytes, err := hex.DecodeString(hexStr)
if err != nil {
return 0, err
}
// 将解码后的字节切片转换为 int64 类型
value := int64(0)
for _, b := range bytes {
value = (value << 8) | int64(b)
}
return value, nil
}
func CheckToken(tokenString string) bool {
token, _ := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("UnExpected signing method")
}
return []byte(beego.AppConfig.String("secret")), nil
})
if token == nil {
return false
}
claims, _ := token.Claims.(jwt.MapClaims)
log.Info("claims:", claims)
return true
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment