Skip to content

Commit 1370914

Browse files
committed
add sbp reward calc
1 parent d6b353a commit 1370914

File tree

4 files changed

+296
-6
lines changed

4 files changed

+296
-6
lines changed

Diff for: gvite-tools/go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/go-stack/stack v1.8.1 // indirect
1010
github.com/kr/text v0.2.0 // indirect
1111
github.com/mattn/go-isatty v0.0.14 // indirect
12+
github.com/pkg/errors v0.9.1
1213
github.com/shirou/gopsutil v3.21.8+incompatible // indirect
1314
github.com/tklauser/go-sysconf v0.3.9 // indirect
1415
github.com/tyler-smith/go-bip39 v1.1.0

Diff for: gvite-tools/go.sum

-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
1616
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1717
github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
1818
github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
19-
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
2019
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
2120
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
2221
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@@ -58,7 +57,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
5857
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
5958
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
6059
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
61-
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
6260
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
6361
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
6462
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -123,7 +121,6 @@ github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
123121
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
124122
github.com/vitelabs/go-vite/v2 v2.11.2 h1:6V1iU5Q24BfSs5VV0XPl32oytpQymt8xw/1SZQoE5s8=
125123
github.com/vitelabs/go-vite/v2 v2.11.2/go.mod h1:mdldLHfQp5yl9G5m4YeOwESuqVnKNImZhww2iW7s1DY=
126-
github.com/viteshan/gvite-tools v0.0.1 h1:s/wpEum+WmgJzX2Q/9H1jV7yFfY08Eh1Ehzca0fclG0=
127124
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
128125
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
129126
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@@ -190,15 +187,13 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE
190187
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
191188
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
192189
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
193-
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
194190
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
195191
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
196192
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
197193
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
198194
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
199195
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
200196
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
201-
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
202197
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
203198
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
204199
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
@@ -210,7 +205,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep
210205
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
211206
gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
212207
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
213-
gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI=
214208
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
215209
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
216210
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=

Diff for: gvite-tools/sbp/reward_sbp.go

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package sbp
2+
3+
import (
4+
"math/big"
5+
6+
"github.com/pkg/errors"
7+
"github.com/vitelabs/go-vite/v2/client"
8+
"github.com/vitelabs/go-vite/v2/common/types"
9+
"github.com/vitelabs/go-vite/v2/rpcapi/api"
10+
)
11+
12+
var OnePercentVite, _ = big.NewInt(0).SetString("10000000000000000", 10)
13+
var OneVite, _ = big.NewInt(0).SetString("1000000000000000000", 10)
14+
var OneViteFloat, _ = big.NewFloat(0).SetString("1000000000000000000")
15+
16+
type SBPRewardVote struct {
17+
SbpReward *api.Reward
18+
VoteTotal *big.Int
19+
VoteDetails map[types.Address]*big.Int
20+
Idx uint64
21+
}
22+
23+
type SBPRewardDropDetails struct {
24+
ToAddr types.Address
25+
Amount *big.Int
26+
}
27+
28+
func CalReward(startIdx uint64, endIdx uint64, sbp string, sbpRewardAddr types.Address, rpc client.RpcClient) (map[uint64]*SBPRewardVote, error) {
29+
result := make(map[uint64]*SBPRewardVote)
30+
for i := startIdx; i <= endIdx; i++ {
31+
tmp := &SBPRewardVote{}
32+
result[i] = tmp
33+
reward, err := rpc.GetRewardByIndex(i)
34+
if err != nil {
35+
return nil, err
36+
}
37+
38+
tmp.SbpReward = reward.RewardMap[sbp]
39+
details, err := rpc.GetVoteDetailsByIndex(i)
40+
if err != nil {
41+
return nil, err
42+
}
43+
44+
for _, v := range details {
45+
if v.Name == sbp {
46+
tmp.VoteTotal, tmp.VoteDetails = reCalReward(sbpRewardAddr, v.Balance, v.Addr)
47+
}
48+
}
49+
}
50+
return result, nil
51+
}
52+
53+
func reCalReward(sbpRewardAddr types.Address, totalBalance *big.Int, voteDetails map[types.Address]*big.Int) (*big.Int, map[types.Address]*big.Int) {
54+
sbpFixVote := big.NewInt(1000000)
55+
sbpFixVote.Mul(sbpFixVote, OneVite)
56+
57+
reTotalBalance := big.NewInt(0)
58+
reTotalBalance.Add(reTotalBalance, totalBalance)
59+
reTotalBalance.Add(reTotalBalance, sbpFixVote)
60+
61+
reSbp, ok := voteDetails[sbpRewardAddr]
62+
if !ok {
63+
voteDetails[sbpRewardAddr] = sbpFixVote
64+
} else {
65+
reSbp.Add(reSbp, sbpFixVote)
66+
}
67+
return reTotalBalance, voteDetails
68+
}
69+
70+
func MergeReward(rewardVoteMap map[uint64]*SBPRewardVote) (*big.Int, error) {
71+
totalReward := big.NewInt(0)
72+
for _, v := range rewardVoteMap {
73+
total, flag := big.NewInt(0).SetString(v.SbpReward.TotalReward, 10)
74+
if !flag {
75+
return nil, errors.Errorf("can't parse [%s] to bigInt.", v.SbpReward.TotalReward)
76+
}
77+
totalReward.Add(totalReward, total)
78+
}
79+
return totalReward, nil
80+
}
81+
82+
func CalRewardDropDetails(rewardVoteMap map[uint64]*SBPRewardVote) (map[uint64]map[types.Address]*SBPRewardDropDetails, error) {
83+
result := make(map[uint64]map[types.Address]*SBPRewardDropDetails)
84+
85+
for k, v := range rewardVoteMap {
86+
if v.VoteTotal.Sign() <= 0 {
87+
continue
88+
}
89+
m := make(map[types.Address]*SBPRewardDropDetails)
90+
total := big.NewInt(0)
91+
for kk, vv := range v.VoteDetails {
92+
details := &SBPRewardDropDetails{ToAddr: kk}
93+
total.Add(total, vv)
94+
totalReward, flag := big.NewInt(0).SetString(v.SbpReward.TotalReward, 10)
95+
if !flag {
96+
return nil, errors.Errorf("bigInt fail %s", v.SbpReward.TotalReward)
97+
}
98+
totalReward.Mul(totalReward, vv)
99+
totalReward.Div(totalReward, v.VoteTotal)
100+
101+
details.Amount = totalReward
102+
m[kk] = details
103+
}
104+
if total.Cmp(v.VoteTotal) != 0 {
105+
return nil, errors.Errorf("total vote not equal")
106+
}
107+
result[k] = m
108+
}
109+
return result, nil
110+
}
111+
112+
func MergeRewardDrop(details map[uint64]map[types.Address]*SBPRewardDropDetails) (map[types.Address]*SBPRewardDropDetails, error) {
113+
result := make(map[types.Address]*SBPRewardDropDetails)
114+
for _, v := range details {
115+
for kk, vv := range v {
116+
dropDetails, ok := result[kk]
117+
if !ok {
118+
dropDetails = &SBPRewardDropDetails{ToAddr: kk, Amount: big.NewInt(0)}
119+
result[kk] = dropDetails
120+
}
121+
dropDetails.Amount.Add(dropDetails.Amount, vv.Amount)
122+
}
123+
}
124+
return result, nil
125+
}

Diff for: gvite-tools/sbp/reward_sbp_test.go

+170
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package sbp
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
"math/rand"
7+
"testing"
8+
9+
"github.com/vitelabs/go-vite/v2/client"
10+
core "github.com/vitelabs/go-vite/v2/interfaces/core"
11+
comm "github.com/viteshan/vite_tools/gvite-tools/common"
12+
13+
"github.com/vitelabs/go-vite/v2/common/types"
14+
)
15+
16+
// var RawUrl = "http://116.63.158.55:48132"
17+
var RawUrl = "https://node.vite.net/gvite"
18+
19+
// 发送奖励地址
20+
var selfAddr = types.HexToAddressPanic("vite_xxx")
21+
22+
// 发送奖励助记词
23+
var mnemonic = "xxxxx"
24+
25+
// sbp注册100w的算份额
26+
var sbpFixAddr = types.HexToAddressPanic("vite_xxx")
27+
28+
var sbpName = "V.Morgen"
29+
30+
func TestCalReward(t *testing.T) {
31+
cli := comm.GetCli(RawUrl)
32+
startIdx := uint64(668)
33+
endIdx := uint64(683)
34+
for i := startIdx; i <= endIdx; i++ {
35+
fmt.Printf("start:%d, end: %d\n", startIdx, startIdx+6)
36+
oneP(startIdx, startIdx+6, cli, t)
37+
startIdx = startIdx + 7
38+
}
39+
}
40+
func oneP(startIdx, endIdx uint64, cli client.RpcClient, t *testing.T) {
41+
42+
// startIdx := uint64(143)
43+
// endIdx := uint64(149)
44+
45+
if endIdx < startIdx {
46+
t.Fatal("error for idx")
47+
}
48+
49+
//todo reward address
50+
votes, err := CalReward(startIdx, endIdx, sbpName, sbpFixAddr, cli)
51+
if err != nil {
52+
t.Error(err)
53+
t.FailNow()
54+
}
55+
56+
//t.Log(votes)
57+
58+
rewardTotal, err := MergeReward(votes)
59+
if err != nil {
60+
t.Error(err)
61+
t.FailNow()
62+
}
63+
avg := big.NewInt(0).Set(rewardTotal)
64+
65+
t.Log("total reward", big.NewInt(0).Div(rewardTotal, OnePercentVite).String(), avg.Div(avg, big.NewInt(int64(endIdx-startIdx+1))).String(), int64(endIdx-startIdx+1))
66+
67+
details, err := CalRewardDropDetails(votes)
68+
69+
if err != nil {
70+
t.Error(err)
71+
t.FailNow()
72+
}
73+
// t.Log(details)
74+
75+
{ // print to csv
76+
var logs = ""
77+
for i := startIdx; i <= endIdx; i++ {
78+
details := details[i]
79+
for kk, vv := range details {
80+
amount := big.NewInt(0).Set(vv.Amount)
81+
amountStr := amount.String()
82+
logs += fmt.Sprintf("%d,%s,%f,%s\n", i, kk, float64(amount.Div(vv.Amount, OnePercentVite).Int64())/100.0, amountStr)
83+
}
84+
}
85+
fmt.Println(logs)
86+
}
87+
return
88+
89+
mergedDetails, err := MergeRewardDrop(details)
90+
91+
{ // 打印一共发送了多少钱
92+
sendTotal := big.NewInt(0)
93+
for k, v := range mergedDetails {
94+
amount := big.NewInt(0).Set(v.Amount)
95+
t.Log(k, amount.Div(amount, OnePercentVite))
96+
sendTotal.Add(sendTotal, amount)
97+
}
98+
99+
//t.Log("all send", sendTotal.Div(sendTotal, oneVite))
100+
t.Log("all send", sendTotal)
101+
}
102+
{ // 打印每万份投票每天大概是多少收益
103+
fixAvgVote := big.NewInt(0)
104+
allAvgVote := big.NewInt(0)
105+
{
106+
for k, v := range votes {
107+
s := big.NewInt(0).Div(v.VoteDetails[sbpFixAddr], OnePercentVite)
108+
t.Log(k, s.String())
109+
fixAvgVote.Add(fixAvgVote, s)
110+
allAvgVote.Add(allAvgVote, v.VoteTotal)
111+
}
112+
fixAvgVote.Div(fixAvgVote, big.NewInt(int64(len(votes))))
113+
}
114+
avgReward := big.NewInt(0).Set(mergedDetails[sbpFixAddr].Amount)
115+
avgReward.Div(avgReward, big.NewInt(int64(len(votes))))
116+
avgReward.Div(avgReward, OnePercentVite)
117+
fixAvgVote.Div(fixAvgVote, big.NewInt(100))
118+
119+
allAvgVote.Div(allAvgVote, big.NewInt(int64(len(votes))))
120+
t.Log("sbpFixAddr", allAvgVote.Div(allAvgVote, OneVite), avgReward.Div(avgReward, fixAvgVote.Div(fixAvgVote, big.NewInt(10000))))
121+
}
122+
123+
txId := fmt.Sprintf("%d", rand.Intn(10000000))
124+
125+
var finalLog []*comm.SimpleRequestTx
126+
127+
var tokenId = core.ViteTokenId
128+
{
129+
for _, v := range mergedDetails {
130+
amount := big.NewInt(0).Set(v.Amount)
131+
if amount.Cmp(OnePercentVite) < 0 {
132+
t.Log("ignore amount", v.ToAddr, v.Amount)
133+
continue
134+
}
135+
finalLog = append(finalLog, &comm.SimpleRequestTx{ToAddr: v.ToAddr, Amount: amount, TokenId: tokenId, Data: []byte(txId)})
136+
}
137+
138+
for k, v := range finalLog {
139+
t.Log(k, v.ToAddr, v.Amount.String())
140+
}
141+
}
142+
143+
return
144+
145+
// key, _, err := comm.DerivationKey(mnemonic, selfAddr)
146+
// if err != nil {
147+
// t.Fatal(err)
148+
// }
149+
150+
// if err != nil {
151+
// t.Error(err)
152+
// t.FailNow()
153+
// }
154+
155+
// sender, err := comm.NewSender(cli, selfAddr, key)
156+
// if err != nil {
157+
// t.Error(err)
158+
// t.FailNow()
159+
// }
160+
161+
// all, err := sender.BatchSend(finalLog, nil)
162+
// if err != nil {
163+
// t.Error(err)
164+
// t.FailNow()
165+
// }
166+
167+
// for _, v := range all {
168+
// t.Log(selfAddr, v.Height, v.Hash)
169+
// }
170+
}

0 commit comments

Comments
 (0)