func (p *Parser) VotesNodeNewMinerFront() error { err := p.generalCheck() if err != nil { return p.ErrInfo(err) } // является ли данный юзер майнером err = p.checkMiner(p.TxUserID) if err != nil { return err } if !utils.CheckInputData(p.TxMap["result"], "vote") { return utils.ErrInfoFmt("incorrect vote") } // получим public_key p.nodePublicKey, err = p.GetNodePublicKey(p.TxUserID) if len(p.nodePublicKey) == 0 { return utils.ErrInfoFmt("incorrect user_id len(nodePublicKey) = 0") } if !utils.CheckInputData(p.TxMap["vote_id"], "bigint") { return utils.ErrInfoFmt("incorrect bigint") } forSign := fmt.Sprintf("%s,%s,%s,%s,%s", p.TxMap["type"], p.TxMap["time"], p.TxMap["user_id"], p.TxMap["vote_id"], p.TxMap["result"]) CheckSignResult, err := utils.CheckSign([][]byte{p.nodePublicKey}, forSign, p.TxMap["sign"], true) if err != nil { return p.ErrInfo(err) } if !CheckSignResult { return utils.ErrInfoFmt("incorrect sign") } // проверим, верно ли указан ID и не закончилось ли голосование id, err := p.Single("SELECT id FROM votes_miners WHERE id = ? AND type = 'node_voting' AND votes_end = 0", p.TxMaps.Int64["vote_id"]).Int64() if err != nil { return p.ErrInfo(err) } if id == 0 { return p.ErrInfo(fmt.Errorf("voting is over")) } // проверим, не повторное ли это голосование данного юзера num, err := p.Single("SELECT count(user_id) FROM log_votes WHERE user_id = ? AND voting_id = ? AND type = 'votes_miners'", p.TxMaps.Int64["user_id"], p.TxMaps.Int64["vote_id"]).Int64() if err != nil { return p.ErrInfo(err) } if num > 0 { return utils.ErrInfoFmt("double voting") } // нод не должен голосовать более X раз за сутки, чтобы не было доса err = p.limitRequest(p.Variables.Int64["node_voting"], "votes_nodes", p.Variables.Int64["node_voting_period"]) if err != nil { return p.ErrInfo(err) } return nil }
func (p *Parser) NewMinerFront() error { err := p.generalCheck() if err != nil { return p.ErrInfo(err) } // получим кол-во точек для face и profile exampleSpots_, err := p.DCDB.Single("SELECT example_spots FROM spots_compatibility").String() if err != nil { return p.ErrInfo(err) } exampleSpots := new(exampleSpots) err = json.Unmarshal([]byte(exampleSpots_), &exampleSpots) if err != nil { return p.ErrInfo(err) } if !utils.CheckInputData(p.TxMap["race"], "race") { return utils.ErrInfoFmt("race") } if !utils.CheckInputData(p.TxMap["country"], "country") { return utils.ErrInfoFmt("country") } if !utils.CheckInputData(p.TxMap["latitude"], "coordinate") { return utils.ErrInfoFmt("latitude") } if !utils.CheckInputData(p.TxMap["longitude"], "coordinate") { return utils.ErrInfoFmt("longitude") } if !utils.CheckInputData(p.TxMap["http_host"], "http_host") { return utils.ErrInfoFmt("http_host") } if p.BlockData == nil || p.BlockData.BlockId > 250900 { if !utils.CheckInputData(p.TxMap["tcp_host"], "tcp_host") { return utils.ErrInfoFmt("tcp_host") } } if !utils.CheckInputData_(p.TxMap["face_coords"], "coords", utils.IntToStr(len(exampleSpots.Face)-1)) { return utils.ErrInfoFmt("face_coords") } if !utils.CheckInputData_(p.TxMap["profile_coords"], "coords", utils.IntToStr(len(exampleSpots.Profile)-1)) { return utils.ErrInfoFmt("profile_coords") } if !utils.CheckInputData(p.TxMap["face_hash"], "photo_hash") { return utils.ErrInfoFmt("face_hash") } if !utils.CheckInputData(p.TxMap["profile_hash"], "photo_hash") { return utils.ErrInfoFmt("profile_hash") } if !utils.CheckInputData(p.TxMap["video_type"], "video_type") { return utils.ErrInfoFmt("video_type") } if !utils.CheckInputData(p.TxMap["video_url_id"], "video_url_id") { return utils.ErrInfoFmt("video_url_id %s", p.TxMap["video_url_id"]) } if !utils.CheckInputData(p.TxMap["node_public_key"], "public_key") { return utils.ErrInfoFmt("node_public_key") } forSign := "" if p.BlockData != nil && p.BlockData.BlockId < 250900 { forSign = fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", p.TxMap["type"], p.TxMap["time"], p.TxMap["user_id"], p.TxMap["race"], p.TxMap["country"], p.TxMap["latitude"], p.TxMap["longitude"], p.TxMap["http_host"], p.TxMap["face_hash"], p.TxMap["profile_hash"], p.TxMap["face_coords"], p.TxMap["profile_coords"], p.TxMap["video_type"], p.TxMap["video_url_id"], p.TxMap["node_public_key"]) } else { forSign = fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", p.TxMap["type"], p.TxMap["time"], p.TxMap["user_id"], p.TxMap["race"], p.TxMap["country"], p.TxMap["latitude"], p.TxMap["longitude"], p.TxMap["http_host"], p.TxMap["tcp_host"], p.TxMap["face_hash"], p.TxMap["profile_hash"], p.TxMap["face_coords"], p.TxMap["profile_coords"], p.TxMap["video_type"], p.TxMap["video_url_id"], p.TxMap["node_public_key"]) } CheckSignResult, err := utils.CheckSign(p.PublicKeys, forSign, p.TxMap["sign"], false) if err != nil { return p.ErrInfo(err) } if !CheckSignResult { return utils.ErrInfoFmt("incorrect sign") } // проверим, не кончились ли попытки стать майнером у данного юзера count, err := p.CountMinerAttempt(p.TxUserID, "user_voting") if count >= p.Variables.Int64["miner_votes_attempt"] { return utils.ErrInfoFmt("miner_votes_attempt") } if err != nil { return p.ErrInfo(err) } // на всякий случай не даем начать нодовское, если идет юзерское голосование userVoting, err := p.DCDB.Single("SELECT id FROM votes_miners WHERE user_id = ? AND type = 'user_voting' AND votes_end = 0", p.TxUserID).String() if err != nil { return p.ErrInfo(err) } if len(userVoting) > 0 { return utils.ErrInfoFmt("existing $user_voting") } // проверим, не является ли юзер майнером и не разжалованный ли это бывший майнер minerStatus, err := p.DCDB.Single("SELECT status FROM miners_data WHERE user_id = ? AND status IN ('miner','passive_miner','suspended_miner')", p.TxUserID).String() if err != nil { return p.ErrInfo(err) } if len(minerStatus) > 0 { return utils.ErrInfoFmt("incorrect miner status") } // разрешен 1 запрос за сутки err = p.limitRequest(p.Variables.Int64["limit_new_miner"], "new_miner", p.Variables.Int64["limit_new_miner_period"]) if err != nil { return p.ErrInfo(err) } return nil }