/
challenge.go
110 lines (90 loc) · 3.47 KB
/
challenge.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package event
import (
"fmt"
common2 "0chain.net/smartcontract/common"
"gorm.io/gorm/clause"
"0chain.net/core/common"
"gorm.io/gorm"
)
// swagger:model Challenges
type Challenges []Challenge
type Challenge struct {
gorm.Model
ChallengeID string `json:"challenge_id" gorm:"index:idx_cchallenge_id,unique"`
CreatedAt common.Timestamp `json:"created_at" gorm:"index:idx_copen_challenge,priority:1"`
AllocationID string `json:"allocation_id"`
BlobberID string `json:"blobber_id" gorm:"index:idx_copen_challenge,priority:2"`
ValidatorsID string `json:"validators_id"`
Seed int64 `json:"seed"`
AllocationRoot string `json:"allocation_root"`
Responded bool `json:"responded" gorm:"index:idx_copen_challenge,priority:3"`
Passed bool `json:"passed"`
RoundResponded int64 `json:"round_responded" gorm:"index"`
ExpiredN int `json:"expired_n" gorm:"-"`
}
func (edb *EventDb) GetAllChallengesByAllocationID(allocationID string) (Challenges, error) {
var chs Challenges
result := edb.Store.Get().Model(&Challenge{}).Where(&Challenge{AllocationID: allocationID}).Find(&chs)
return chs, result.Error
}
func (edb *EventDb) GetChallenge(challengeID string) (*Challenge, error) {
var ch Challenge
result := edb.Store.Get().Model(&Challenge{}).Where(&Challenge{ChallengeID: challengeID}).First(&ch)
if result.Error != nil {
return nil, fmt.Errorf("error retriving Challenge node with ID %v; error: %v", challengeID, result.Error)
}
return &ch, nil
}
func (edb *EventDb) GetChallenges(blobberId string, start, end int64) ([]Challenge, error) {
var chs []Challenge
result := edb.Store.Get().
Model(&Challenge{}).
Where("blobber_id = ? AND round_responded >= ? AND round_responded < ?",
blobberId, start, end).
Find(&chs)
return chs, result.Error
}
func (edb *EventDb) GetOpenChallengesForBlobber(blobberID string, from, now, cct common.Timestamp,
limit common2.Pagination) ([]*Challenge, error) {
var chs []*Challenge
expiry := now - cct
if from < expiry {
from = expiry
}
query := edb.Store.Get().Model(&Challenge{}).
Where("created_at > ? AND blobber_id = ? AND responded = ?",
from, blobberID, false).Limit(limit.Limit).Offset(limit.Offset).Order(clause.OrderByColumn{
Column: clause.Column{Name: "created_at"},
Desc: limit.IsDescending,
})
result := query.Find(&chs)
if result.Error != nil {
return nil, fmt.Errorf("error retriving open Challenges with blobberid %v; error: %v",
blobberID, result.Error)
}
return chs, nil
}
func (edb *EventDb) addChallenges(chlgs []Challenge) error {
return edb.Store.Get().Create(&chlgs).Error
}
func (edb *EventDb) updateChallenges(chs []Challenge) error {
var (
challengeIdList []string
respondedList []bool
passedList []bool
)
for _, ch := range chs {
challengeIdList = append(challengeIdList, ch.ChallengeID)
respondedList = append(respondedList, ch.Responded)
passedList = append(passedList, ch.Passed)
}
return CreateBuilder("challenges", "challenge_id", challengeIdList).
AddUpdate("responded", respondedList).
AddUpdate("passed", passedList).Exec(edb).Error
}
func mergeAddChallengesEvents() *eventsMergerImpl[Challenge] {
return newEventsMerger[Challenge](TagAddChallenge, withUniqueEventOverwrite())
}
func mergeUpdateChallengesEvents() *eventsMergerImpl[Challenge] {
return newEventsMerger[Challenge](TagUpdateChallenge, withUniqueEventOverwrite())
}