/
msg_resend_process.go
118 lines (106 loc) · 3.71 KB
/
msg_resend_process.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
// 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 blkverify
import (
"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"
)
func (p *Process) stopSender() {
p.closeMineReqMsgSender()
p.closePosedReqSender()
p.closeVoteMsgSender()
}
func (p *Process) startSendMineReq(req *mc.HD_MiningReqMsg) {
p.closeMineReqMsgSender()
sender, err := common.NewResendMsgCtrl(req, p.sendMineReqFunc, manparams.MinerReqSendInterval, 0)
if err != nil {
log.Error(p.logExtraInfo(), "创建挖矿请求发送器", "失败", "err", err)
return
}
p.mineReqMsgSender = sender
}
func (p *Process) closeMineReqMsgSender() {
if p.mineReqMsgSender == nil {
return
}
p.mineReqMsgSender.Close()
p.mineReqMsgSender = nil
}
func (p *Process) sendMineReqFunc(data interface{}, times uint32) {
req, OK := data.(*mc.HD_MiningReqMsg)
if !OK {
log.Error(p.logExtraInfo(), "发出挖矿请求", "反射消息失败")
return
}
hash := req.Header.HashNoSignsAndNonce()
//给矿工发送区块验证结果
if times == 1 {
log.Info(p.logExtraInfo(), "发出挖矿请求, Header hash with signs", hash, "高度", p.number)
} else {
log.Trace(p.logExtraInfo(), "发出挖矿请求, Header hash with signs", hash, "次数", times, "高度", p.number)
}
p.pm.hd.SendNodeMsg(mc.HD_MiningReq, req, common.RoleMiner|common.RoleInnerMiner, nil)
}
func (p *Process) startPosedReqSender(req *mc.HD_BlkConsensusReqMsg) {
p.closePosedReqSender()
sender, err := common.NewResendMsgCtrl(req, p.sendPosedReqFunc, manparams.PosedReqSendInterval, 0)
if err != nil {
log.Error(p.logExtraInfo(), "创建POS完成的req发送器", "失败", "err", err)
return
}
p.posedReqSender = sender
}
func (p *Process) closePosedReqSender() {
if p.posedReqSender == nil {
return
}
p.posedReqSender.Close()
p.posedReqSender = nil
}
func (p *Process) sendPosedReqFunc(data interface{}, times uint32) {
req, OK := data.(*mc.HD_BlkConsensusReqMsg)
if !OK {
log.Error(p.logExtraInfo(), "发出POS完成的req", "反射消息失败")
return
}
//给广播节点发送区块验证请求(带签名列表)
if times == 1 {
log.Debug(p.logExtraInfo(), "发出POS完成的req(to broadcast) leader", req.Header.Leader.Hex(), "高度", p.number)
} else {
log.Trace(p.logExtraInfo(), "发出POS完成的req(to broadcast) leader", req.Header.Leader.Hex(), "次数", times, "高度", p.number)
}
p.pm.hd.SendNodeMsg(mc.HD_BlkConsensusReq, req, common.RoleBroadcast, nil)
}
func (p *Process) startVoteMsgSender(vote *mc.HD_ConsensusVote) {
p.closeVoteMsgSender()
sender, err := common.NewResendMsgCtrl(vote, p.sendVoteMsgFunc, manparams.BlkVoteSendInterval, manparams.BlkVoteSendTimes)
if err != nil {
log.Error(p.logExtraInfo(), "创建投票消息发送器", "失败", "err", err)
return
}
p.voteMsgSender = sender
}
func (p *Process) closeVoteMsgSender() {
if p.voteMsgSender == nil {
return
}
p.voteMsgSender.Close()
p.voteMsgSender = nil
}
func (p *Process) sendVoteMsgFunc(data interface{}, times uint32) {
vote, OK := data.(*mc.HD_ConsensusVote)
if !OK {
log.Error(p.logExtraInfo(), "发出投票消息", "反射消息失败")
return
}
//发送投票消息
if times == 1 {
log.Info(p.logExtraInfo(), "发出投票消息 signHash", vote.SignHash.TerminalString(), "高度", p.number)
} else {
log.Trace(p.logExtraInfo(), "发出投票消息 signHash", vote.SignHash.TerminalString(), "次数", times, "高度", p.number)
}
p.pm.hd.SendNodeMsg(mc.HD_BlkConsensusVote, vote, common.RoleValidator, nil)
}