|
|
|
@ -97,6 +97,20 @@ type BlockData struct { |
|
|
|
immatureKey string |
|
|
|
immatureKey string |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type NetCharts struct { |
|
|
|
|
|
|
|
Timestamp int64 `json:"x"` |
|
|
|
|
|
|
|
TimeFormat string `json:"timeFormat"` |
|
|
|
|
|
|
|
NetHash int64 `json:"y"` |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type ShareCharts struct { |
|
|
|
|
|
|
|
Timestamp int64 `json:"x"` |
|
|
|
|
|
|
|
TimeFormat string `json:"timeFormat"` |
|
|
|
|
|
|
|
Valid int64 `json:"valid"` |
|
|
|
|
|
|
|
Stale int64 `json:"stale"` |
|
|
|
|
|
|
|
WorkerOnline string `json:"workerOnline"` |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (b *BlockData) RewardInShannon() int64 { |
|
|
|
func (b *BlockData) RewardInShannon() int64 { |
|
|
|
reward := new(big.Int).Div(b.Reward, util.Shannon) |
|
|
|
reward := new(big.Int).Div(b.Reward, util.Shannon) |
|
|
|
return reward.Int64() |
|
|
|
return reward.Int64() |
|
|
|
@ -185,12 +199,65 @@ func (r *RedisClient) WritePoolCharts(time1 int64, time2 string, poolHash string |
|
|
|
return cmd.Err() |
|
|
|
return cmd.Err() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) WriteDiffCharts(time1 int64, time2 string, netHash string) error { |
|
|
|
|
|
|
|
s := join(time1, time2, netHash) |
|
|
|
|
|
|
|
cmd := r.client.ZAdd(r.formatKey("charts", "difficulty"), redis.Z{Score: float64(time1), Member: s}) |
|
|
|
|
|
|
|
return cmd.Err() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) WriteMinerCharts(time1 int64, time2, k string, hash, largeHash, workerOnline int64) error { |
|
|
|
func (r *RedisClient) WriteMinerCharts(time1 int64, time2, k string, hash, largeHash, workerOnline int64) error { |
|
|
|
s := join(time1, time2, hash, largeHash, workerOnline) |
|
|
|
s := join(time1, time2, hash, largeHash, workerOnline) |
|
|
|
cmd := r.client.ZAdd(r.formatKey("charts", "miner", k), redis.Z{Score: float64(time1), Member: s}) |
|
|
|
cmd := r.client.ZAdd(r.formatKey("charts", "miner", k), redis.Z{Score: float64(time1), Member: s}) |
|
|
|
return cmd.Err() |
|
|
|
return cmd.Err() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) WriteShareCharts(time1 int64, time2, login string, valid, stale, workerOnline int64) error { |
|
|
|
|
|
|
|
valid_s := r.client.HGet(r.formatKey("chartsNum", "share", login), "valid") |
|
|
|
|
|
|
|
stale_s := r.client.HGet(r.formatKey("chartsNum", "share", login), "stale") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if valid_s.Err() == redis.Nil || stale_s.Err() == redis.Nil { |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "valid", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "stale", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
//return nil, nil
|
|
|
|
|
|
|
|
} else if valid_s.Err() != nil || stale_s.Err() != nil { |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "valid", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "stale", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
//return nil, valid_s.Err()
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
v_s, _ := valid_s.Int64() |
|
|
|
|
|
|
|
s_s, _ := stale_s.Int64() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
l_valid := r.client.HGet(r.formatKey("chartsNum", "share", login), "lastvalid") |
|
|
|
|
|
|
|
l_stale := r.client.HGet(r.formatKey("chartsNum", "share", login), "laststale") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if l_valid.Err() == redis.Nil || l_stale.Err() == redis.Nil { |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "lastvalid", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "laststale", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
//return nil, nil
|
|
|
|
|
|
|
|
} else if l_valid.Err() != nil || l_stale.Err() != nil { |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "lastvalid", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
r.client.HSet(r.formatKey("chartsNum", "share", login), "laststale", strconv.FormatInt(0, 10)) |
|
|
|
|
|
|
|
//return nil, l_valid.Err()
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
l_v, _ := l_valid.Int64() |
|
|
|
|
|
|
|
l_s, _ := l_stale.Int64() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
valid_c := v_s - l_v |
|
|
|
|
|
|
|
stale_c := s_s - l_s |
|
|
|
|
|
|
|
s := join(time1, time2, valid_c, stale_c, workerOnline) |
|
|
|
|
|
|
|
cmd := r.client.ZAdd(r.formatKey("charts", "share", login), redis.Z{Score: float64(time1), Member: s}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tx := r.client.Multi() |
|
|
|
|
|
|
|
defer tx.Close() |
|
|
|
|
|
|
|
tx.Exec(func() error { |
|
|
|
|
|
|
|
tx.HSet(r.formatKey("chartsNum", "share", login), "lastvalid", strconv.FormatInt(v_s, 10)) |
|
|
|
|
|
|
|
tx.HSet(r.formatKey("chartsNum", "share", login), "laststale", strconv.FormatInt(s_s, 10)) |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
return cmd.Err() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) GetPoolCharts(poolHashLen int64) (stats []*PoolCharts, err error) { |
|
|
|
func (r *RedisClient) GetPoolCharts(poolHashLen int64) (stats []*PoolCharts, err error) { |
|
|
|
|
|
|
|
|
|
|
|
tx := r.client.Multi() |
|
|
|
tx := r.client.Multi() |
|
|
|
@ -230,6 +297,46 @@ func convertPoolChartsResults(raw *redis.ZSliceCmd) []*PoolCharts { |
|
|
|
return reverse |
|
|
|
return reverse |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) GetNetCharts(netHashLen int64) (stats []*NetCharts, err error) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tx := r.client.Multi() |
|
|
|
|
|
|
|
defer tx.Close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
now := util.MakeTimestamp() / 1000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmds, err := tx.Exec(func() error { |
|
|
|
|
|
|
|
tx.ZRemRangeByScore(r.formatKey("charts", "difficulty"), "-inf", fmt.Sprint("(", now-172800)) |
|
|
|
|
|
|
|
tx.ZRevRangeWithScores(r.formatKey("charts", "difficulty"), 0, netHashLen) |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return nil, err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stats = convertNetChartsResults(cmds[1].(*redis.ZSliceCmd)) |
|
|
|
|
|
|
|
return stats, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func convertNetChartsResults(raw *redis.ZSliceCmd) []*NetCharts { |
|
|
|
|
|
|
|
var result []*NetCharts |
|
|
|
|
|
|
|
for _, v := range raw.Val() { |
|
|
|
|
|
|
|
// "Timestamp:TimeFormat:Hash"
|
|
|
|
|
|
|
|
pc := NetCharts{} |
|
|
|
|
|
|
|
pc.Timestamp = int64(v.Score) |
|
|
|
|
|
|
|
str := v.Member.(string) |
|
|
|
|
|
|
|
pc.TimeFormat = str[strings.Index(str, ":")+1 : strings.LastIndex(str, ":")] |
|
|
|
|
|
|
|
pc.NetHash, _ = strconv.ParseInt(str[strings.LastIndex(str, ":")+1:], 10, 64) |
|
|
|
|
|
|
|
result = append(result, &pc) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var reverse []*NetCharts |
|
|
|
|
|
|
|
for i := len(result) - 1; i >= 0; i-- { |
|
|
|
|
|
|
|
reverse = append(reverse, result[i]) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return reverse |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func convertMinerChartsResults(raw *redis.ZSliceCmd) []*MinerCharts { |
|
|
|
func convertMinerChartsResults(raw *redis.ZSliceCmd) []*MinerCharts { |
|
|
|
var result []*MinerCharts |
|
|
|
var result []*MinerCharts |
|
|
|
for _, v := range raw.Val() { |
|
|
|
for _, v := range raw.Val() { |
|
|
|
@ -290,6 +397,43 @@ func (r *RedisClient) GetMinerCharts(hashNum int64, login string) (stats []*Mine |
|
|
|
return stats, nil |
|
|
|
return stats, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) GetShareCharts(shareNum int64, login string) (stats []*ShareCharts, err error) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tx := r.client.Multi() |
|
|
|
|
|
|
|
defer tx.Close() |
|
|
|
|
|
|
|
now := util.MakeTimestamp() / 1000 |
|
|
|
|
|
|
|
cmds, err := tx.Exec(func() error { |
|
|
|
|
|
|
|
tx.ZRemRangeByScore(r.formatKey("charts", "share", login), "-inf", fmt.Sprint("(", now-172800)) |
|
|
|
|
|
|
|
tx.ZRevRangeWithScores(r.formatKey("charts", "share", login), 0, shareNum) |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return nil, err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
stats = convertShareChartsResults(cmds[1].(*redis.ZSliceCmd)) |
|
|
|
|
|
|
|
return stats, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func convertShareChartsResults(raw *redis.ZSliceCmd) []*ShareCharts { |
|
|
|
|
|
|
|
var result []*ShareCharts |
|
|
|
|
|
|
|
for _, v := range raw.Val() { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mc := ShareCharts{} |
|
|
|
|
|
|
|
mc.Timestamp = int64(v.Score) |
|
|
|
|
|
|
|
str := v.Member.(string) |
|
|
|
|
|
|
|
mc.TimeFormat = strings.Split(str, ":")[1] |
|
|
|
|
|
|
|
mc.Valid, _ = strconv.ParseInt(strings.Split(str, ":")[2], 10, 64) |
|
|
|
|
|
|
|
mc.Stale, _ = strconv.ParseInt(strings.Split(str, ":")[3], 10, 64) |
|
|
|
|
|
|
|
mc.WorkerOnline = strings.Split(str, ":")[4] |
|
|
|
|
|
|
|
result = append(result, &mc) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var reverse []*ShareCharts |
|
|
|
|
|
|
|
for i := len(result) - 1; i >= 0; i-- { |
|
|
|
|
|
|
|
reverse = append(reverse, result[i]) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return reverse |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (r *RedisClient) GetPaymentCharts(login string) (stats []*PaymentCharts, err error) { |
|
|
|
func (r *RedisClient) GetPaymentCharts(login string) (stats []*PaymentCharts, err error) { |
|
|
|
|
|
|
|
|
|
|
|
tx := r.client.Multi() |
|
|
|
tx := r.client.Multi() |
|
|
|
|