package main import ( "crypto/sha256" "encoding/hex" "flag" "fmt" "log" "os" "time" log2 "github.com/sirupsen/logrus" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" ) // 激活链账户 var apiUrl, dsn, phone string var size int func main() { flag.StringVar(&apiUrl, "url", " https://test-dna.bitfactory.cn/registration/api/v2/account/upload", "激活接口地址") flag.StringVar(&dsn, "dsn", "root:rootPassword@tcp(192.168.150.40:23306)/dna_test", "mysql连接地址") flag.StringVar(&phone, "phone", "", "激活bid的手机号") flag.IntVar(&size, "size", 1, "每次激活的链账户数") flag.Parse() if size < 1 || size > 100 { log2.Error("size must be between 1 and 100") return } if phone == "" { log2.Error("phone is required") return } data := []byte(phone) // 使用SHA-256哈希算法计算哈希值 hash := sha256.Sum256(data) // 将哈希值转换为十六进制字符串 phoneHash := hex.EncodeToString(hash[:]) // 连接mysql newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer logger.Config{ SlowThreshold: time.Second, // 慢 SQL 阈值 LogLevel: logger.Silent, // Log level Colorful: false, // 禁用彩色打印 }, ) dsn := fmt.Sprintf("%s?charset=utf8&parseTime=True", dsn) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger, NamingStrategy: schema.NamingStrategy{ TablePrefix: "t_", SingularTable: false, }, }) if err != nil { log2.WithError(err).Error("init db failed") return } var total int64 err = db.Model(&AccountBid{}).Select("Max(id)").Where("status", 2).Scan(&total).Error if err != nil { log2.WithError(err).Error("query bid total number failed") return } var minId int64 for minId < total { fmt.Println(minId) var list []AccountBid err = db.Debug().Model(&AccountBid{}).Where("status", 2).Where("id > ?", minId).Limit(size).Order("id asc").Find(&list).Error if err != nil { log2.WithError(err).Error("query not active bid failed") return } if len(list) == 0 { log2.Info("there is no unverified data left") break } for _, item := range list { fmt.Println(item) } err = db.Transaction(func(tx *gorm.DB) error { // var bidReq []Bid result := tx.Debug().Model(&AccountBid{}).Where("status", 2).Where("id > ?", minId).Limit(size).Order("id asc").Update("status", 3) if result.Error != nil { log2.WithError(err).Error("update bid status failed") return err } fmt.Println("影响行数:", result.RowsAffected) // for j := 0; j < len(list); j++ { // bidReq = append(bidReq, Bid{ // Phone: phoneHash, // Bid: list[j].Bid, // }) // fmt.Println(list[j]) // } fmt.Println(phoneHash) return nil }) if err != nil { return } minId = list[len(list)-1].Id } log2.Info("finish") } type Req struct { Data []Bid `json:"data"` } type Bid struct { Phone string `json:"phone"` Bid string `json:"bid"` } type Resp struct { RetCode int `json:"retCode"` RetMsg string `json:"retMsg"` } // 链账户关联表 type AccountBid struct { Id int64 `gorm:"column:id;type:bigint(20) unsigned;primary_key;AUTO_INCREMENT;comment:主键id" json:"id"` Bid string `gorm:"column:bid;type:char(40);comment:星火bid;NOT NULL" json:"bid"` PublicKey string `gorm:"column:public_key;type:varchar(100);comment:公钥;NOT NULL" json:"public_key"` PrivateKey string `gorm:"column:private_key;type:varchar(100);comment:私钥;NOT NULL" json:"private_key"` Status int `gorm:"column:status;type:tinyint(4);default:2;comment:激活状态 1:已激活 2:未激活;NOT NULL" json:"status"` Account string `gorm:"column:account;type:char(42);comment:文昌链链账户地址;NOT NULL" json:"account"` ErrMsg string `gorm:"column:err_msg;type:varchar(255);comment:异常信息;NOT NULL" json:"err_msg"` CreatedAt time.Time `gorm:"<-:false"` UpdatedAt time.Time `gorm:"<-:false"` }