/
selectedreward.go
131 lines (104 loc) · 4.32 KB
/
selectedreward.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package selectedreward
import (
"errors"
"math/big"
"github.com/MatrixAINetwork/go-matrix/core/state"
"github.com/MatrixAINetwork/go-matrix/params"
"github.com/MatrixAINetwork/go-matrix/mc"
"github.com/MatrixAINetwork/go-matrix/reward/util"
"github.com/MatrixAINetwork/go-matrix/common"
"github.com/MatrixAINetwork/go-matrix/core/types"
"github.com/MatrixAINetwork/go-matrix/log"
)
const (
PackageName = "参与奖励"
)
type SelectedReward struct {
}
type ChainReader interface {
// Config retrieves the blockchain's chain configuration.
Config() *params.ChainConfig
// CurrentHeader retrieves the current header from the local chain.
CurrentHeader() *types.Header
// GetHeader retrieves a block header from the database by hash and number.
GetHeader(hash common.Hash, number uint64) *types.Header
// GetHeaderByNumber retrieves a block header from the database by number.
GetHeaderByNumber(number uint64) *types.Header
// GetHeaderByHash retrieves a block header from the database by its hash.
GetHeaderByHash(hash common.Hash) *types.Header
GetBlockByNumber(number uint64) *types.Block
// GetBlock retrieves a block sfrom the database by hash and number.
GetBlock(hash common.Hash, number uint64) *types.Block
StateAt(root common.Hash) (*state.StateDB, error)
State() (*state.StateDB, error)
NewTopologyGraph(header *types.Header) (*mc.TopologyGraph, error)
}
func (sr *SelectedReward) GetTopAndDeposit(state util.StateDB, currentNum uint64, roleType common.RoleType, currentTop *mc.TopologyGraph, originElectNodes *mc.ElectGraph) ([]common.Address, map[common.Address]uint16, error) {
if originElectNodes == nil || 0 == len(originElectNodes.ElectList) {
log.Error(PackageName, "get获取初选列表为空", "")
return nil, nil, errors.New("get获取初选列表为空")
}
if currentTop == nil || 0 == len(currentTop.NodeList) {
log.Error(PackageName, "当前拓扑图是 空", "")
return nil, nil, errors.New("当前拓扑图是 空")
}
topNodes := make([]common.Address, 0)
for _, node := range currentTop.NodeList {
if node.Type == node.Type&roleType {
topNodes = append(topNodes, node.Account)
}
}
electNodes := make(map[common.Address]uint16, 0)
for _, node := range originElectNodes.ElectList {
if node.Type == node.Type&roleType {
electNodes[node.Account] = node.Stock
}
}
return topNodes, electNodes, nil
}
func (sr *SelectedReward) GetSelectedRewards(reward *big.Int, state util.StateDB, roleType common.RoleType, currentNum uint64, rate uint64, topology *mc.TopologyGraph, elect *mc.ElectGraph) map[common.Address]*big.Int {
//计算选举的拓扑图的高度
if reward.Cmp(big.NewInt(0)) <= 0 {
//log.WARN(PackageName, "奖励金额不合法", reward)
return nil
}
//log.Debug(PackageName, "参与奖励大家共发放", reward)
currentTop, originElectNodes, err := sr.GetTopAndDeposit(state, currentNum, roleType, topology, elect)
if nil != err {
return nil
}
selectedNodesDeposit := sr.CaclSelectedDeposit(currentTop, originElectNodes, rate)
if 0 == len(selectedNodesDeposit) {
log.Error(PackageName, "获取参与的抵押列表错误", "")
return nil
}
return util.CalcStockRate(reward, selectedNodesDeposit)
}
func (sr *SelectedReward) CaclSelectedDeposit(newGraph []common.Address, originElectNodes map[common.Address]uint16, rewardRate uint64) map[common.Address]util.DepositInfo {
NodesRewardMap := make(map[common.Address]uint64, 0)
for _, nodelist := range newGraph {
NodesRewardMap[nodelist] = rewardRate
//log.Debug(PackageName, "当前节点", nodelist.Hex())
}
for electList := range originElectNodes {
if _, ok := NodesRewardMap[electList]; ok {
NodesRewardMap[electList] = util.RewardFullRate
} else {
NodesRewardMap[electList] = util.RewardFullRate - rewardRate
}
//log.Debug(PackageName, "初选节点", electList.Hex(), "比例", NodesRewardMap[electList])
}
selectedNodesDeposit := make(map[common.Address]util.DepositInfo, 0)
for k, v := range NodesRewardMap {
var finalStock uint64
if stock, ok := originElectNodes[k]; ok {
finalStock = uint64(stock) * v
} else {
//二级节点股权默认值为1
finalStock = uint64(1) * v
}
selectedNodesDeposit[k] = util.DepositInfo{Deposit: big.NewInt(0), FixStock: finalStock}
//log.Debug(PackageName, "计算抵押总额,账户", k.Hex(), "股权", finalStock)
}
return selectedNodesDeposit
}