-
Notifications
You must be signed in to change notification settings - Fork 4
/
minhash.go
83 lines (74 loc) · 2.7 KB
/
minhash.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
// Copyright (c) 2018 The MATRIX Authors
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php
package electionseed
import (
"math/big"
"github.com/MatrixAINetwork/go-matrix/baseinterface"
"github.com/MatrixAINetwork/go-matrix/common"
"github.com/MatrixAINetwork/go-matrix/log"
"github.com/MatrixAINetwork/go-matrix/mc"
"github.com/MatrixAINetwork/go-matrix/params/manparams"
"github.com/MatrixAINetwork/go-matrix/random/commonsupport"
)
func init() {
minHash := &MinHashPlug{privatekey: big.NewInt(0)}
RegisterElectSeedPlugs(manparams.ElectionSeed_Plug_MinHash, minHash)
}
type MinHashPlug struct {
privatekey *big.Int
}
func (self *MinHashPlug) Prepare(height uint64, hash common.Hash, support baseinterface.RandomChainSupport) error {
data, err := commonsupport.GetElectGenTimes(support.BlockChain(), hash)
if err != nil {
log.ERROR(ModuleElectSeed, "获取通用配置失败:", err)
return err
}
voteBeforeTime := uint64(data.VoteBeforeTime)
bcInterval := manparams.GetBCIntervalInfo()
if bcInterval.IsBroadcastNumber(height+voteBeforeTime) == false {
return nil
}
if CanVote(hash) == false {
return nil
}
privatekey, publickeySend, err := commonsupport.GetVoteData()
if err != nil {
log.ERROR(ModuleElectSeed, "获取投票数据失败:", err)
return err
}
privatekeySend := common.BigToHash(self.privatekey).Bytes()
log.TRACE(ModuleElectSeed, "投票:", (height + voteBeforeTime))
mc.PublishEvent(mc.SendBroadCastTx, mc.BroadCastEvent{Txtyps: mc.Publickey, Height: big.NewInt(int64(height + voteBeforeTime)), Data: publickeySend})
mc.PublishEvent(mc.SendBroadCastTx, mc.BroadCastEvent{Txtyps: mc.Privatekey, Height: big.NewInt(int64(height + voteBeforeTime)), Data: privatekeySend})
self.privatekey = privatekey
return nil
}
func (self *MinHashPlug) CalcSeed(hash common.Hash, support baseinterface.RandomChainSupport) (*big.Int, error) {
SeedSum, err := commonsupport.GetValidVoteSum(hash, support)
if err != nil {
log.ERROR(ModuleElectSeed, "获取数据错误:", err)
return nil, err
}
minHash, err := commonsupport.GetMinHash(hash, support)
if err != nil {
log.ERROR(ModuleElectSeed, "获取最小hash错误:", err)
return nil, err
}
SeedSum.Add(SeedSum, minHash.Big())
return SeedSum, nil
}
func CanVote(hash common.Hash) bool {
depositList, err := commonsupport.GetDepositListByHeightAndRole(hash, common.RoleValidator)
if err != nil {
log.Error(ModuleElectSeed, "投票失敗", "获取验证者身份列表失败", "hash", hash)
return false
}
selfAddress := commonsupport.GetSelfAddress()
for _, v := range depositList {
if v.Address == selfAddress {
return true
}
}
return false
}