블록체인 튜토리얼 오픈-ethereum-pool 광지 원본 분석payouts 모듈
open-ethereum-pooleth 광지-payouts 모듈
PayoutsProcessor 정의
type PayoutsProcessor struct {
config *PayoutsConfig
backend *storage.RedisClient
rpc *rpc.RPCClient
halt bool
lastFail error}
GetPendingPayments 원리
func (r *RedisClient) GetPendingPayments() []*PendingPayment {
//ZREVRANGE eth:payments:pending 0 -1 WITHSCORES
raw := r.client.ZRevRangeWithScores(r.formatKey("payments", "pending"), 0, -1)
var result []*PendingPayment for _, v := range raw.Val() {
// timestamp -> "address:amount"
payment := PendingPayment{}
payment.Timestamp = int64(v.Score)
fields := strings.Split(v.Member.(string), ":")
payment.Address = fields[0]
payment.Amount, _ = strconv.ParseInt(fields[1], 10, 64)
result = append(result, &payment)
}
return result}
GetPayees 원리
func (r *RedisClient) GetPayees() ([]string, error) {
payees := make(map[string]struct{})
var result []string
var c int64
for {
var keys []string
var err error
c, keys, err = r.client.Scan(c, r.formatKey("miners", "*"), 100).Result()
if err != nil {
return nil, err }
for _, row := range keys {
login := strings.Split(row, ":")[2]
payees[login] = struct{}{}
}
if c == 0 {
break
}
}
for login, _ := range payees {
result = append(result, login)
}
return result, nil}
LockPayouts 원리
func (r *RedisClient) LockPayouts(login string, amount int64) error {
//eth:payments:lock
key := r.formatKey("payments", "lock")
//SETNX eth:payments:lock login:amount 0
//Setnx(SET if Not eXists) key , key
result := r.client.SetNX(key, join(login, amount), 0).Val()
if !result {
return fmt.Errorf("Unable to acquire lock '%s'", key)
}
return nil}
UpdateBalance 원리
func (r *RedisClient) UpdateBalance(login string, amount int64) error {tx := r.client.Multi()defer tx.Close()ts := util.MakeTimestamp() / 1000_, err := tx.Exec(func() error {
//Hincrby
//HINCRBY eth:miners:login balance -amounttx.HIncrBy(r.formatKey("miners", login), "balance", (amount * -1))
//HINCRBY eth:miners:login pending amounttx.HIncrBy(r.formatKey("miners", login), "pending", amount)
//HINCRBY eth:finances balance -amounttx.HIncrBy(r.formatKey("finances"), "balance", (amount * -1))
//HINCRBY eth:finances pending amounttx.HIncrBy(r.formatKey("finances"), "pending", amount)
//ZADD eth:payments:pending ts login:amount
//Zadd tx.ZAdd(r.formatKey("payments", "pending"), redis.Z{Score: float64(ts), Member: join(login, amount)})return nil})return err}
RollbackBalance 원리
func (r *RedisClient) RollbackBalance(login string, amount int64) error {
tx := r.client.Multi()
defer tx.Close()
_, err := tx.Exec(func() error {
tx.HIncrBy(r.formatKey("miners", login), "balance", amount)
tx.HIncrBy(r.formatKey("miners", login), "pending", (amount * -1))
tx.HIncrBy(r.formatKey("finances"), "balance", amount)
tx.HIncrBy(r.formatKey("finances"), "pending", (amount * -1))
tx.ZRem(r.formatKey("payments", "pending"), join(login, amount))
return nil
})
return err}
WritePayment 원리
func (r *RedisClient) WritePayment(login, txHash string, amount int64) error {
tx := r.client.Multi()
defer tx.Close()
ts := util.MakeTimestamp() / 1000
_, err := tx.Exec(func() error {
//HINCRBY eth:miners:login pending -amount
tx.HIncrBy(r.formatKey("miners", login), "pending", (amount * -1))
//HINCRBY eth:miners:login paid amount
tx.HIncrBy(r.formatKey("miners", login), "paid", amount)
//HINCRBY eth:finances pending -amount
tx.HIncrBy(r.formatKey("finances"), "pending", (amount * -1))
//HINCRBY eth:finances paid amount
tx.HIncrBy(r.formatKey("finances"), "paid", amount)
//ZADD eth:payments:all ts txHash:login:amount
tx.ZAdd(r.formatKey("payments", "all"), redis.Z{Score: float64(ts), Member: join(txHash, login, amount)})
//ZADD eth:payments:login ts txHash:amount
tx.ZAdd(r.formatKey("payments", login), redis.Z{Score: float64(ts), Member: join(txHash, amount)})
//ZREM eth:payments:pending login:amount
//Zrem Redis (sorted set) Redis Zrem
tx.ZRem(r.formatKey("payments", "pending"), join(login, amount))
//DEL
//DEL eth:payments:lock
tx.Del(r.formatKey("payments", "lock"))
return nil
})
return err}
ITPUB 블로그에서 링크:http://blog.itpub.net/31557831/viewspace-2216017/만약 전재가 필요하다면 출처를 밝혀 주십시오. 그렇지 않으면 법적 책임을 추궁할 것입니다.
다음으로 전송:http://blog.itpub.net/31557831/viewspace-2216017/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
type PayoutsProcessor struct {
config *PayoutsConfig
backend *storage.RedisClient
rpc *rpc.RPCClient
halt bool
lastFail error}
func (r *RedisClient) GetPendingPayments() []*PendingPayment {
//ZREVRANGE eth:payments:pending 0 -1 WITHSCORES
raw := r.client.ZRevRangeWithScores(r.formatKey("payments", "pending"), 0, -1)
var result []*PendingPayment for _, v := range raw.Val() {
// timestamp -> "address:amount"
payment := PendingPayment{}
payment.Timestamp = int64(v.Score)
fields := strings.Split(v.Member.(string), ":")
payment.Address = fields[0]
payment.Amount, _ = strconv.ParseInt(fields[1], 10, 64)
result = append(result, &payment)
}
return result}
func (r *RedisClient) GetPayees() ([]string, error) {
payees := make(map[string]struct{})
var result []string
var c int64
for {
var keys []string
var err error
c, keys, err = r.client.Scan(c, r.formatKey("miners", "*"), 100).Result()
if err != nil {
return nil, err }
for _, row := range keys {
login := strings.Split(row, ":")[2]
payees[login] = struct{}{}
}
if c == 0 {
break
}
}
for login, _ := range payees {
result = append(result, login)
}
return result, nil}
func (r *RedisClient) LockPayouts(login string, amount int64) error {
//eth:payments:lock
key := r.formatKey("payments", "lock")
//SETNX eth:payments:lock login:amount 0
//Setnx(SET if Not eXists) key , key
result := r.client.SetNX(key, join(login, amount), 0).Val()
if !result {
return fmt.Errorf("Unable to acquire lock '%s'", key)
}
return nil}
func (r *RedisClient) UpdateBalance(login string, amount int64) error {tx := r.client.Multi()defer tx.Close()ts := util.MakeTimestamp() / 1000_, err := tx.Exec(func() error {
//Hincrby
//HINCRBY eth:miners:login balance -amounttx.HIncrBy(r.formatKey("miners", login), "balance", (amount * -1))
//HINCRBY eth:miners:login pending amounttx.HIncrBy(r.formatKey("miners", login), "pending", amount)
//HINCRBY eth:finances balance -amounttx.HIncrBy(r.formatKey("finances"), "balance", (amount * -1))
//HINCRBY eth:finances pending amounttx.HIncrBy(r.formatKey("finances"), "pending", amount)
//ZADD eth:payments:pending ts login:amount
//Zadd tx.ZAdd(r.formatKey("payments", "pending"), redis.Z{Score: float64(ts), Member: join(login, amount)})return nil})return err}
func (r *RedisClient) RollbackBalance(login string, amount int64) error {
tx := r.client.Multi()
defer tx.Close()
_, err := tx.Exec(func() error {
tx.HIncrBy(r.formatKey("miners", login), "balance", amount)
tx.HIncrBy(r.formatKey("miners", login), "pending", (amount * -1))
tx.HIncrBy(r.formatKey("finances"), "balance", amount)
tx.HIncrBy(r.formatKey("finances"), "pending", (amount * -1))
tx.ZRem(r.formatKey("payments", "pending"), join(login, amount))
return nil
})
return err}
func (r *RedisClient) WritePayment(login, txHash string, amount int64) error {
tx := r.client.Multi()
defer tx.Close()
ts := util.MakeTimestamp() / 1000
_, err := tx.Exec(func() error {
//HINCRBY eth:miners:login pending -amount
tx.HIncrBy(r.formatKey("miners", login), "pending", (amount * -1))
//HINCRBY eth:miners:login paid amount
tx.HIncrBy(r.formatKey("miners", login), "paid", amount)
//HINCRBY eth:finances pending -amount
tx.HIncrBy(r.formatKey("finances"), "pending", (amount * -1))
//HINCRBY eth:finances paid amount
tx.HIncrBy(r.formatKey("finances"), "paid", amount)
//ZADD eth:payments:all ts txHash:login:amount
tx.ZAdd(r.formatKey("payments", "all"), redis.Z{Score: float64(ts), Member: join(txHash, login, amount)})
//ZADD eth:payments:login ts txHash:amount
tx.ZAdd(r.formatKey("payments", login), redis.Z{Score: float64(ts), Member: join(txHash, amount)})
//ZREM eth:payments:pending login:amount
//Zrem Redis (sorted set) Redis Zrem
tx.ZRem(r.formatKey("payments", "pending"), join(login, amount))
//DEL
//DEL eth:payments:lock
tx.Del(r.formatKey("payments", "lock"))
return nil
})
return err}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.