Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
69e7b23f
Commit
69e7b23f
authored
Feb 08, 2021
by
caopingcp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
improve tendermint stability
parent
8f8ae28f
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
699 additions
and
190 deletions
+699
-190
consensus_state.go
plugin/consensus/tendermint/consensus_state.go
+97
-44
node.go
plugin/consensus/tendermint/node.go
+10
-1
peer_set.go
plugin/consensus/tendermint/peer_set.go
+93
-44
tendermint.go
plugin/consensus/tendermint/tendermint.go
+41
-24
tendermint_test.go
plugin/consensus/tendermint/tendermint_test.go
+2
-2
block.go
plugin/consensus/tendermint/types/block.go
+2
-2
round_state.go
plugin/consensus/tendermint/types/round_state.go
+17
-8
valnode.go
plugin/dapp/valnode/commands/valnode.go
+37
-1
query.go
plugin/dapp/valnode/executor/query.go
+58
-1
valnode.proto
plugin/dapp/valnode/proto/valnode.proto
+29
-2
rpc.go
plugin/dapp/valnode/rpc/rpc.go
+3
-3
rpc_test.go
plugin/dapp/valnode/rpc/rpc_test.go
+15
-13
valnode.pb.go
plugin/dapp/valnode/types/valnode.pb.go
+295
-45
No files found.
plugin/consensus/tendermint/consensus_state.go
View file @
69e7b23f
...
...
@@ -312,6 +312,10 @@ func (cs *ConsensusState) updateToState(state State) {
tendermintlog
.
Info
(
"Ignoring updateToState()"
,
"newHeight"
,
state
.
LastBlockHeight
+
1
,
"oldHeight"
,
cs
.
state
.
LastBlockHeight
+
1
)
return
}
// disable gossip votes
if
useAggSig
&&
gossipVotes
.
Load
()
.
(
bool
)
{
gossipVotes
.
Store
(
false
)
}
// Reset fields based on state.
validators
:=
state
.
Validators
...
...
@@ -361,7 +365,7 @@ func (cs *ConsensusState) updateToState(state State) {
func
(
cs
*
ConsensusState
)
newStep
()
{
if
cs
.
broadcastChannel
!=
nil
{
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
cs
.
RoundStateMessage
(),
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
cs
.
RoundStateMessage
(),
PeerID
:
""
,
PeerIP
:
""
}
}
cs
.
nSteps
++
}
...
...
@@ -489,6 +493,10 @@ func (cs *ConsensusState) handleTimeout(ti timeoutInfo, rs ttypes.RoundState) {
case
ttypes
.
RoundStepPrecommitWait
:
cs
.
enterPrecommit
(
ti
.
Height
,
ti
.
Round
)
cs
.
enterNewRound
(
ti
.
Height
,
ti
.
Round
+
1
)
case
ttypes
.
RoundStepAggPrevoteWait
:
cs
.
enterAggPrevoteWait
(
ti
.
Height
,
ti
.
Round
)
case
ttypes
.
RoundStepAggPrecommitWait
:
cs
.
enterAggPrecommitWait
(
ti
.
Height
,
ti
.
Round
)
default
:
panic
(
fmt
.
Sprintf
(
"Invalid timeout step: %v"
,
ti
.
Step
))
}
...
...
@@ -505,10 +513,6 @@ func (cs *ConsensusState) checkTxsAvailable() {
tendermintlog
.
Info
(
fmt
.
Sprintf
(
"blockchain(H: %v) and consensus(H: %v) are not sync"
,
height
,
rs
.
Height
))
break
}
if
cs
.
checkProposalComplete
()
{
tendermintlog
.
Debug
(
"already has proposal"
)
break
}
cs
.
txsAvailable
<-
height
case
<-
cs
.
client
.
StopC
()
:
tendermintlog
.
Info
(
"checkTxsAvailable quit"
)
...
...
@@ -529,7 +533,18 @@ func (cs *ConsensusState) handleTxsAvailable(height int64) {
defer
cs
.
mtx
.
Unlock
()
// we only need to do this for round 0
cs
.
enterPropose
(
height
,
0
)
if
cs
.
Round
!=
0
{
return
}
switch
cs
.
Step
{
case
ttypes
.
RoundStepNewHeight
:
// timeoutCommit phase
// +1ms to ensure RoundStepNewRound timeout always happens after RoundStepNewHeight
timeoutCommit
:=
cs
.
StartTime
.
Sub
(
time
.
Now
())
+
1
*
time
.
Millisecond
cs
.
scheduleTimeout
(
timeoutCommit
,
height
,
0
,
ttypes
.
RoundStepNewRound
)
case
ttypes
.
RoundStepNewRound
:
// after timeoutCommit
cs
.
enterPropose
(
height
,
0
)
}
}
//-----------------------------------------------------------------------------
...
...
@@ -554,6 +569,10 @@ func (cs *ConsensusState) enterNewRound(height int64, round int) {
tendermintlog
.
Info
(
fmt
.
Sprintf
(
"enterNewRound(%v/%v). Current: %v/%v/%v"
,
height
,
round
,
cs
.
Height
,
cs
.
Round
,
cs
.
Step
))
// disable gossip votes
if
useAggSig
&&
gossipVotes
.
Load
()
.
(
bool
)
{
gossipVotes
.
Store
(
false
)
}
// Increment validators if necessary
validators
:=
cs
.
Validators
if
cs
.
Round
<
round
{
...
...
@@ -580,7 +599,7 @@ func (cs *ConsensusState) enterNewRound(height int64, round int) {
cs
.
Votes
.
SetRound
(
round
+
1
)
// also track next round (round+1) to allow round-skipping
//cs.eventBus.PublishEventNewRound(cs.RoundStateEvent())
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
cs
.
RoundStateMessage
(),
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
cs
.
RoundStateMessage
(),
PeerID
:
""
,
PeerIP
:
""
}
// Wait for txs to be available in the mempool
// before we enterPropose in round 0.
...
...
@@ -619,8 +638,8 @@ func (cs *ConsensusState) proposalHeartbeat(height int64, round int) {
tendermintlog
.
Error
(
"SignHeartbeat failed"
,
"err"
,
err
)
continue
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ProposalHeartbeatID
,
Msg
:
heartbeat
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
rs
.
RoundStateMessage
(),
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ProposalHeartbeatID
,
Msg
:
heartbeat
,
PeerID
:
""
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
rs
.
RoundStateMessage
(),
PeerID
:
""
,
PeerIP
:
""
}
counter
++
time
.
Sleep
(
proposalHeartbeatIntervalSeconds
*
time
.
Second
)
}
...
...
@@ -842,11 +861,6 @@ func (cs *ConsensusState) enterPrevote(height int64, round int) {
cs
.
newStep
()
}()
if
useAggSig
{
// Wait for some more prevotes; enterPrecommit
cs
.
scheduleTimeout
(
cs
.
Prevote
(
round
)
*
2
,
height
,
round
,
ttypes
.
RoundStepPrevoteWait
)
}
tendermintlog
.
Info
(
fmt
.
Sprintf
(
"enterPrevote(%v/%v). Current: %v/%v/%v"
,
height
,
round
,
cs
.
Height
,
cs
.
Round
,
cs
.
Step
),
"cost"
,
types
.
Since
(
cs
.
begCons
))
// Sign and broadcast vote as necessary
...
...
@@ -904,6 +918,18 @@ func (cs *ConsensusState) defaultDoPrevote(height int64, round int) {
cs
.
signAddVote
(
ttypes
.
VoteTypePrevote
,
cs
.
ProposalBlock
.
Hash
())
}
// Enter: send prevote for aggregate at next round.
func
(
cs
*
ConsensusState
)
enterAggPrevoteWait
(
height
int64
,
round
int
)
{
if
cs
.
Height
!=
height
||
round
<
cs
.
Round
||
(
cs
.
Round
==
round
&&
ttypes
.
RoundStepAggPrevoteWait
<=
cs
.
Step
)
{
tendermintlog
.
Debug
(
fmt
.
Sprintf
(
"enterAggPrevoteWait(%v/%v): Invalid args. Current step: %v/%v/%v"
,
height
,
round
,
cs
.
Height
,
cs
.
Round
,
cs
.
Step
))
return
}
tendermintlog
.
Info
(
fmt
.
Sprintf
(
"enterAggPrevoteWait(%v/%v). Current: %v/%v/%v"
,
height
,
round
,
cs
.
Height
,
cs
.
Round
,
cs
.
Step
))
// enable gossip votes when timeout waiting for aggregate prevote
gossipVotes
.
Store
(
true
)
}
// Enter: any +2/3 prevotes at next round.
func
(
cs
*
ConsensusState
)
enterPrevoteWait
(
height
int64
,
round
int
)
{
if
cs
.
Height
!=
height
||
round
<
cs
.
Round
||
(
cs
.
Round
==
round
&&
ttypes
.
RoundStepPrevoteWait
<=
cs
.
Step
)
{
...
...
@@ -921,6 +947,11 @@ func (cs *ConsensusState) enterPrevoteWait(height int64, round int) {
cs
.
newStep
()
}()
// enable gossip votes in case other validators enterAggPrevoteWait
if
useAggSig
&&
!
cs
.
isProposer
()
&&
cs
.
Votes
.
Prevotes
(
round
)
.
GetAggVote
()
==
nil
{
gossipVotes
.
Store
(
true
)
}
// Wait for some more prevotes; enterPrecommit
cs
.
scheduleTimeout
(
cs
.
Prevote
(
round
),
height
,
round
,
ttypes
.
RoundStepPrevoteWait
)
}
...
...
@@ -945,11 +976,6 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
cs
.
newStep
()
}()
if
useAggSig
{
// Wait for some more precommits; enterNewRound
cs
.
scheduleTimeout
(
cs
.
Precommit
(
round
)
*
2
,
height
,
round
,
ttypes
.
RoundStepPrecommitWait
)
}
blockID
,
ok
:=
cs
.
Votes
.
Prevotes
(
round
)
.
TwoThirdsMajority
()
// If we don't have a polka, we must precommit nil
...
...
@@ -957,7 +983,7 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
if
cs
.
LockedBlock
!=
nil
{
tendermintlog
.
Info
(
"enterPrecommit: No +2/3 prevotes during enterPrecommit while we're locked. Precommitting nil"
)
}
else
{
tendermintlog
.
Info
(
"enterPrecommit: No +2/3 prevotes during enterPrecommit. Precommitting nil
.
"
)
tendermintlog
.
Info
(
"enterPrecommit: No +2/3 prevotes during enterPrecommit. Precommitting nil"
)
}
cs
.
signAddVote
(
ttypes
.
VoteTypePrecommit
,
nil
)
return
...
...
@@ -1009,6 +1035,7 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
// Fetch that block, unlock, and precommit nil.
// The +2/3 prevotes for this round is the POL for our unlock.
// TODO: In the future save the POL prevotes for justification.
tendermintlog
.
Info
(
"enterPrecommit: +2/3 prevotes for a block we do not have. Precommitting nil"
,
"hash"
,
fmt
.
Sprintf
(
"%X"
,
blockID
.
Hash
))
cs
.
LockedRound
=
-
1
cs
.
LockedBlock
=
nil
if
!
bytes
.
Equal
(
cs
.
ProposalBlockHash
,
blockID
.
Hash
)
{
...
...
@@ -1018,6 +1045,22 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
cs
.
signAddVote
(
ttypes
.
VoteTypePrecommit
,
nil
)
}
// Enter: send precommit for aggregate at next round.
func
(
cs
*
ConsensusState
)
enterAggPrecommitWait
(
height
int64
,
round
int
)
{
if
cs
.
Height
!=
height
||
round
<
cs
.
Round
||
(
cs
.
Round
==
round
&&
ttypes
.
RoundStepAggPrecommitWait
<
cs
.
Step
)
{
tendermintlog
.
Debug
(
fmt
.
Sprintf
(
"enterAggPrecommitWait(%v/%v): Invalid args. Current step: %v/%v/%v"
,
height
,
round
,
cs
.
Height
,
cs
.
Round
,
cs
.
Step
))
return
}
tendermintlog
.
Info
(
fmt
.
Sprintf
(
"enterAggPrecommitWait(%v/%v). Current: %v/%v/%v"
,
height
,
round
,
cs
.
Height
,
cs
.
Round
,
cs
.
Step
))
// enable gossip votes when timeout waiting for aggregate precommit
gossipVotes
.
Store
(
true
)
//addr := cs.privValidator.GetAddress()
//vote := cs.Votes.Precommits(round).GetByAddress(addr)
//cs.broadcastChannel <- MsgInfo{TypeID: ttypes.VoteID, Msg: vote.Vote, PeerID: cs.ourID, PeerIP: ""}
}
// Enter: any +2/3 precommits for next round.
func
(
cs
*
ConsensusState
)
enterPrecommitWait
(
height
int64
,
round
int
)
{
if
cs
.
Height
!=
height
||
round
<
cs
.
Round
||
(
cs
.
Round
==
round
&&
ttypes
.
RoundStepPrecommitWait
<=
cs
.
Step
)
{
...
...
@@ -1035,9 +1078,13 @@ func (cs *ConsensusState) enterPrecommitWait(height int64, round int) {
cs
.
newStep
()
}()
// enable gossip votes in case other validators enterAggPrecommitWait
if
useAggSig
&&
!
cs
.
isProposer
()
&&
cs
.
Votes
.
Precommits
(
round
)
.
GetAggVote
()
==
nil
{
gossipVotes
.
Store
(
true
)
}
// Wait for some more precommits; enterNewRound
cs
.
scheduleTimeout
(
cs
.
Precommit
(
round
),
height
,
round
,
ttypes
.
RoundStepPrecommitWait
)
}
// Enter: +2/3 precommits for block
...
...
@@ -1076,22 +1123,22 @@ func (cs *ConsensusState) enterCommit(height int64, commitRound int) {
// If we don't have the block being committed, set up to get it.
if
!
cs
.
ProposalBlock
.
HashesTo
(
blockID
.
Hash
)
{
if
!
bytes
.
Equal
(
cs
.
ProposalBlockHash
,
blockID
.
Hash
)
{
tendermintlog
.
Info
(
"Commit is for a block we don't know about. Set ProposalBlock=nil"
,
"ProposalBlock-hash"
,
fmt
.
Sprintf
(
"%X"
,
cs
.
ProposalBlock
.
Hash
()),
"CommitBlock-hash"
,
fmt
.
Sprintf
(
"%X"
,
blockID
.
Hash
))
// We're getting the wrong block.
// Set up ProposalBlockHash and keep waiting.
cs
.
ProposalBlock
=
nil
cs
.
ProposalBlockHash
=
blockID
.
Hash
validBlockMsg
:=
&
tmtypes
.
ValidBlockMsg
{
Height
:
cs
.
Height
,
Round
:
int32
(
cs
.
Round
),
Blockhash
:
cs
.
ProposalBlockHash
,
IsCommit
:
false
,
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ValidBlockID
,
Msg
:
validBlockMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
tendermintlog
.
Info
(
"Commit is for a block we don't know about. Set ProposalBlock=nil"
,
"proposal"
,
fmt
.
Sprintf
(
"%X"
,
cs
.
ProposalBlock
.
Hash
()),
"ProposalBlockHash"
,
fmt
.
Sprintf
(
"%X"
,
cs
.
ProposalBlockHash
),
"commit"
,
fmt
.
Sprintf
(
"%X"
,
blockID
.
Hash
))
// We're getting the wrong block.
// Set up ProposalBlockHash and keep waiting.
cs
.
ProposalBlock
=
nil
cs
.
ProposalBlockHash
=
blockID
.
Hash
validBlockMsg
:=
&
tmtypes
.
ValidBlockMsg
{
Height
:
cs
.
Height
,
Round
:
int32
(
cs
.
Round
),
Blockhash
:
cs
.
ProposalBlockHash
,
IsCommit
:
true
,
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ValidBlockID
,
Msg
:
validBlockMsg
,
PeerID
:
""
,
PeerIP
:
""
}
//else {
// We just need to keep waiting.
//}
...
...
@@ -1398,7 +1445,7 @@ func (cs *ConsensusState) tryAddAggVote(aggVoteRaw *tmtypes.AggVote, peerID stri
Blockhash
:
cs
.
ProposalBlockHash
,
IsCommit
:
false
,
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ValidBlockID
,
Msg
:
validBlockMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ValidBlockID
,
Msg
:
validBlockMsg
,
PeerID
:
""
,
PeerIP
:
""
}
}
}
...
...
@@ -1500,7 +1547,7 @@ func (cs *ConsensusState) addVote(vote *ttypes.Vote, peerID string, peerIP strin
Type
:
int32
(
vote
.
Type
),
Index
:
vote
.
ValidatorIndex
,
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
HasVoteID
,
Msg
:
hasVoteMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
HasVoteID
,
Msg
:
hasVoteMsg
,
PeerID
:
""
,
PeerIP
:
""
}
// if we can skip timeoutCommit and have all the votes now,
if
skipTimeoutCommit
&&
cs
.
LastCommit
.
HasAll
()
{
...
...
@@ -1536,7 +1583,7 @@ func (cs *ConsensusState) addVote(vote *ttypes.Vote, peerID string, peerIP strin
Type
:
int32
(
vote
.
Type
),
Index
:
vote
.
ValidatorIndex
,
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
HasVoteID
,
Msg
:
hasVoteMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
HasVoteID
,
Msg
:
hasVoteMsg
,
PeerID
:
""
,
PeerIP
:
""
}
switch
vote
.
Type
{
case
uint32
(
ttypes
.
VoteTypePrevote
)
:
...
...
@@ -1585,7 +1632,7 @@ func (cs *ConsensusState) addVote(vote *ttypes.Vote, peerID string, peerIP strin
Blockhash
:
cs
.
ProposalBlockHash
,
IsCommit
:
false
,
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ValidBlockID
,
Msg
:
validBlockMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
ValidBlockID
,
Msg
:
validBlockMsg
,
PeerID
:
""
,
PeerIP
:
""
}
}
}
...
...
@@ -1597,14 +1644,14 @@ func (cs *ConsensusState) addVote(vote *ttypes.Vote, peerID string, peerIP strin
case
cs
.
Round
==
int
(
vote
.
Round
)
&&
ttypes
.
RoundStepPrevote
<=
cs
.
Step
:
// current round
blockID
,
ok
:=
prevotes
.
TwoThirdsMajority
()
if
ok
&&
(
cs
.
isProposalComplete
()
||
len
(
blockID
.
Hash
)
==
0
)
{
if
useAggSig
&&
prevotes
.
GetAggVote
()
==
nil
{
if
useAggSig
&&
cs
.
isProposer
()
&&
prevotes
.
GetAggVote
()
==
nil
{
err
:=
prevotes
.
SetAggVote
()
if
err
!=
nil
{
tendermintlog
.
Error
(
"prevotes SetAggVote fail"
,
"err"
,
err
)
break
}
aggVoteMsg
:=
prevotes
.
GetAggVote
()
.
AggVote
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
AggVoteID
,
Msg
:
aggVoteMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
AggVoteID
,
Msg
:
aggVoteMsg
,
PeerID
:
""
,
PeerIP
:
""
}
tendermintlog
.
Info
(
"Send aggregate prevote"
,
"aggVote"
,
prevotes
.
GetAggVote
())
}
cs
.
enterPrecommit
(
height
,
int
(
vote
.
Round
))
...
...
@@ -1628,14 +1675,14 @@ func (cs *ConsensusState) addVote(vote *ttypes.Vote, peerID string, peerIP strin
cs
.
enterNewRound
(
height
,
int
(
vote
.
Round
))
cs
.
enterPrecommit
(
height
,
int
(
vote
.
Round
))
if
len
(
blockID
.
Hash
)
!=
0
{
if
useAggSig
&&
precommits
.
GetAggVote
()
==
nil
{
if
useAggSig
&&
cs
.
isProposer
()
&&
precommits
.
GetAggVote
()
==
nil
{
err
:=
precommits
.
SetAggVote
()
if
err
!=
nil
{
tendermintlog
.
Error
(
"precommits SetAggVote fail"
,
"err"
,
err
)
break
}
aggVoteMsg
:=
precommits
.
GetAggVote
()
.
AggVote
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
AggVoteID
,
Msg
:
aggVoteMsg
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
AggVoteID
,
Msg
:
aggVoteMsg
,
PeerID
:
""
,
PeerIP
:
""
}
tendermintlog
.
Info
(
"Send aggregate precommit"
,
"aggVote"
,
precommits
.
GetAggVote
())
}
cs
.
enterCommit
(
height
,
int
(
vote
.
Round
))
...
...
@@ -1692,6 +1739,12 @@ func (cs *ConsensusState) signAddVote(voteType byte, hash []byte) *ttypes.Vote {
if
useAggSig
{
// send to proposer
cs
.
unicastChannel
<-
MsgInfo
{
TypeID
:
ttypes
.
VoteID
,
Msg
:
vote
.
Vote
,
PeerID
:
cs
.
getProposerID
(),
PeerIP
:
""
}
// wait for aggregate vote
if
voteType
==
ttypes
.
VoteTypePrevote
{
cs
.
scheduleTimeout
(
cs
.
Prevote
(
cs
.
Round
),
cs
.
Height
,
cs
.
Round
,
ttypes
.
RoundStepAggPrevoteWait
)
}
else
if
voteType
==
ttypes
.
VoteTypePrecommit
{
cs
.
scheduleTimeout
(
cs
.
Precommit
(
cs
.
Round
),
cs
.
Height
,
cs
.
Round
,
ttypes
.
RoundStepAggPrecommitWait
)
}
}
tendermintlog
.
Info
(
"Sign and send vote"
,
"height"
,
cs
.
Height
,
"round"
,
cs
.
Round
,
"vote"
,
vote
)
return
vote
...
...
plugin/consensus/tendermint/node.go
View file @
69e7b23f
...
...
@@ -200,7 +200,7 @@ func (node *Node) Start() {
ip
,
_
:=
splitHostPort
(
addr
)
_
,
ok
:=
node
.
localIPs
[
ip
]
if
ok
{
tendermintlog
.
Info
(
"find our ip "
,
"our
ip
"
,
ip
)
tendermintlog
.
Info
(
"find our ip "
,
"our
IP
"
,
ip
)
node
.
IP
=
ip
return
}
...
...
@@ -325,6 +325,8 @@ func (node *Node) UnicastRoutine() {
}
for
_
,
peer
:=
range
node
.
peerSet
.
List
()
{
if
peer
.
ID
()
==
msg
.
PeerID
{
peerIP
,
_
:=
peer
.
RemoteIP
()
msg
.
PeerIP
=
peerIP
.
String
()
success
:=
peer
.
Send
(
msg
)
if
!
success
{
tendermintlog
.
Error
(
"send failure in UnicastRoutine"
)
...
...
@@ -400,6 +402,7 @@ func (node *Node) addPeer(pc *peerConn) error {
ID
:
node
.
ID
,
Network
:
node
.
Network
,
Version
:
node
.
Version
,
IP
:
node
.
IP
,
}
// Exchange NodeInfo on the conn
peerNodeInfo
,
err
:=
pc
.
HandshakeTimeout
(
nodeinfo
,
handshakeTimeout
*
time
.
Second
)
...
...
@@ -460,6 +463,9 @@ func (node *Node) addPeer(pc *peerConn) error {
}
tendermintlog
.
Info
(
"Added peer"
,
"peer"
,
pc
.
ip
)
stateMsg
:=
MsgInfo
{
TypeID
:
ttypes
.
NewRoundStepID
,
Msg
:
node
.
state
.
RoundStateMessage
(),
PeerID
:
pc
.
id
,
PeerIP
:
pc
.
ip
.
String
()}
pc
.
Send
(
stateMsg
)
tendermintlog
.
Info
(
"Send state msg"
,
"msg"
,
stateMsg
,
"ourIP"
,
node
.
IP
,
"ourID"
,
node
.
ID
)
return
nil
}
...
...
@@ -472,6 +478,9 @@ func (node *Node) Broadcast(msg MsgInfo) chan bool {
wg
.
Add
(
1
)
go
func
(
peer
Peer
)
{
defer
wg
.
Done
()
msg
.
PeerID
=
peer
.
ID
()
peerIP
,
_
:=
peer
.
RemoteIP
()
msg
.
PeerIP
=
peerIP
.
String
()
success
:=
peer
.
Send
(
msg
)
successChan
<-
success
}(
peer
)
...
...
plugin/consensus/tendermint/peer_set.go
View file @
69e7b23f
...
...
@@ -165,6 +165,20 @@ func (ps *PeerSet) hasIP(peerIP net.IP) bool {
return
false
}
//
func
(
ps
*
PeerSet
)
GetIP
(
peerKey
ID
)
net
.
IP
{
ps
.
mtx
.
Lock
()
ps
.
mtx
.
Unlock
()
if
item
,
ok
:=
ps
.
lookup
[
peerKey
];
ok
{
ip
,
err
:=
item
.
peer
.
RemoteIP
()
if
err
==
nil
{
return
ip
}
}
return
nil
}
// Size of list
func
(
ps
*
PeerSet
)
Size
()
int
{
ps
.
mtx
.
Lock
()
...
...
@@ -356,6 +370,14 @@ func (pc *peerConn) Send(msg MsgInfo) bool {
atomic
.
AddInt32
(
&
pc
.
sendQueueSize
,
1
)
return
true
case
<-
time
.
After
(
defaultSendTimeout
)
:
if
msg
.
TypeID
==
ttypes
.
ProposalBlockID
{
if
propBlock
,
ok
:=
msg
.
Msg
.
(
*
tmtypes
.
TendermintBlock
);
ok
{
msg
.
Msg
=
&
tmtypes
.
TendermintBlock
{
Header
:
propBlock
.
Header
,
LastCommit
:
propBlock
.
LastCommit
,
}
}
}
tendermintlog
.
Error
(
"send msg timeout"
,
"peerip"
,
msg
.
PeerIP
,
"msg"
,
msg
)
return
false
}
...
...
@@ -378,29 +400,35 @@ func (pc *peerConn) TrySend(msg MsgInfo) bool {
// Returns true if vote was sent.
func
(
pc
*
peerConn
)
PickSendVote
(
votes
ttypes
.
VoteSetReader
)
bool
{
if
useAggSig
{
if
pc
.
state
.
AggPrecommit
{
time
.
Sleep
(
pc
.
myState
.
PeerGossipSleep
())
return
false
}
aggVote
:=
votes
.
GetAggVote
()
if
aggVote
!=
nil
{
if
votes
.
IsCommit
()
{
pc
.
state
.
ensureCatchupCommitRound
(
votes
.
Height
(),
votes
.
Round
(),
votes
.
Size
())
}
if
pc
.
state
.
Height
!=
aggVote
.
Height
||
(
pc
.
state
.
Round
!=
int
(
aggVote
.
Round
)
&&
pc
.
state
.
CatchupCommitRound
!=
int
(
aggVote
.
Round
))
{
return
false
}
if
(
aggVote
.
Type
==
uint32
(
ttypes
.
VoteTypePrevote
)
&&
pc
.
state
.
AggPrevote
)
||
(
aggVote
.
Type
==
uint32
(
ttypes
.
VoteTypePrecommit
)
&&
pc
.
state
.
AggPrecommit
)
{
return
false
}
msg
:=
MsgInfo
{
TypeID
:
ttypes
.
AggVoteID
,
Msg
:
aggVote
.
AggVote
,
PeerID
:
pc
.
id
,
PeerIP
:
pc
.
ip
.
String
()}
tendermintlog
.
Debug
(
"Sending aggregate vote message"
,
"msg"
,
msg
)
if
pc
.
Send
(
msg
)
{
pc
.
state
.
SetHasAggPrecommit
(
aggVote
)
time
.
Sleep
(
pc
.
myState
.
PeerGossipSleep
())
pc
.
state
.
SetHasAggVote
(
aggVote
)
return
true
}
return
false
}
return
false
}
else
if
vote
,
ok
:=
pc
.
state
.
PickVoteToSend
(
votes
);
ok
{
}
if
vote
,
ok
:=
pc
.
state
.
PickVoteToSend
(
votes
);
ok
{
msg
:=
MsgInfo
{
TypeID
:
ttypes
.
VoteID
,
Msg
:
vote
.
Vote
,
PeerID
:
pc
.
id
,
PeerIP
:
pc
.
ip
.
String
()}
tendermintlog
.
Debug
(
"Sending vote message"
,
"msg"
,
msg
)
if
pc
.
Send
(
msg
)
{
pc
.
state
.
SetHasVote
(
vote
)
return
true
}
return
false
}
return
false
}
...
...
@@ -666,7 +694,7 @@ FOR_LOOP:
if
ok
{
tendermintlog
.
Debug
(
"Received proposal heartbeat message"
,
"height"
,
msg
.
Height
,
"round"
,
msg
.
Round
,
"sequence"
,
msg
.
Sequence
,
"valIdx"
,
msg
.
ValidatorIndex
,
"valAddr"
,
msg
.
ValidatorAddress
)
"valIdx"
,
msg
.
ValidatorIndex
,
"valAddr"
,
fmt
.
Sprintf
(
"%X"
,
msg
.
ValidatorAddress
)
)
}
}
}
...
...
@@ -688,25 +716,30 @@ OUTER_LOOP:
// If the peer is on a previous height, help catch up.
if
(
0
<
prs
.
Height
)
&&
(
prs
.
Height
<
rs
.
Height
)
{
time
.
Sleep
(
2
*
pc
.
myState
.
PeerGossipSleep
())
if
prs
.
Height
>=
rs
.
Height
{
continue
OUTER_LOOP
}
proposalBlock
:=
pc
.
myState
.
client
.
LoadProposalBlock
(
prs
.
Height
)
if
proposalBlock
==
nil
{
tendermintlog
.
Error
(
"load proposal block fail"
,
"selfHeight"
,
rs
.
Height
,
"blockHeight"
,
pc
.
myState
.
client
.
GetCurrentHeight
())
if
prs
.
ProposalBlockHash
!=
nil
&&
!
prs
.
ProposalBlock
{
proposalBlock
:=
pc
.
myState
.
client
.
LoadProposalBlock
(
prs
.
Height
)
if
proposalBlock
==
nil
{
tendermintlog
.
Error
(
"load proposal block fail"
,
"selfHeight"
,
rs
.
Height
,
"blockHeight"
,
pc
.
myState
.
client
.
GetCurrentHeight
())
time
.
Sleep
(
pc
.
myState
.
PeerGossipSleep
())
continue
OUTER_LOOP
}
newBlock
:=
&
ttypes
.
TendermintBlock
{
TendermintBlock
:
proposalBlock
}
if
!
newBlock
.
HashesTo
(
prs
.
ProposalBlockHash
)
{
tendermintlog
.
Error
(
fmt
.
Sprintf
(
"Wrong proposal block hash. Expected %X, got %X"
,
prs
.
ProposalBlockHash
,
newBlock
.
Hash
()),
"height"
,
prs
.
Height
)
time
.
Sleep
(
pc
.
myState
.
PeerGossipSleep
())
continue
OUTER_LOOP
}
msg
:=
MsgInfo
{
TypeID
:
ttypes
.
ProposalBlockID
,
Msg
:
proposalBlock
,
PeerID
:
pc
.
id
,
PeerIP
:
pc
.
ip
.
String
()}
tendermintlog
.
Info
(
"Sending block for catchup"
,
"peerIP"
,
pc
.
ip
.
String
(),
"selfHeight"
,
rs
.
Height
,
"peer(H/R/S)"
,
fmt
.
Sprintf
(
"%v/%v/%v"
,
prs
.
Height
,
prs
.
Round
,
prs
.
Step
),
"block(H/R/hash)"
,
fmt
.
Sprintf
(
"%v/%v/%X"
,
proposalBlock
.
Header
.
Height
,
proposalBlock
.
Header
.
Round
,
newBlock
.
Hash
()))
if
pc
.
Send
(
msg
)
{
prs
.
SetHasProposalBlock
(
newBlock
)
}
continue
OUTER_LOOP
}
newBlock
:=
&
ttypes
.
TendermintBlock
{
TendermintBlock
:
proposalBlock
}
msg
:=
MsgInfo
{
TypeID
:
ttypes
.
ProposalBlockID
,
Msg
:
proposalBlock
,
PeerID
:
pc
.
id
,
PeerIP
:
pc
.
ip
.
String
()}
tendermintlog
.
Info
(
"Sending block for catchup"
,
"peerip"
,
pc
.
ip
.
String
(),
"selfHeight"
,
rs
.
Height
,
"peerHeight"
,
prs
.
Height
,
"block(H/R/hash)"
,
fmt
.
Sprintf
(
"%v/%v/%X"
,
proposalBlock
.
Header
.
Height
,
proposalBlock
.
Header
.
Round
,
newBlock
.
Hash
()))
if
!
pc
.
Send
(
msg
)
{
tendermintlog
.
Error
(
"send catchup block fail"
)
}
continue
OUTER_LOOP
}
// If height and round don't match, sleep.
...
...
@@ -790,8 +823,10 @@ OUTER_LOOP:
// If height matches, then send LastCommit, Prevotes, Precommits.
if
rs
.
Height
==
prs
.
Height
{
if
!
useAggSig
&&
pc
.
gossipVotesForHeight
(
rs
,
&
prs
.
PeerRoundState
)
{
continue
OUTER_LOOP
if
!
useAggSig
||
gossipVotes
.
Load
()
.
(
bool
)
{
if
pc
.
gossipVotesForHeight
(
rs
,
&
prs
.
PeerRoundState
)
{
continue
OUTER_LOOP
}
}
}
...
...
@@ -815,7 +850,7 @@ OUTER_LOOP:
tendermintlog
.
Info
(
"Picked Catchup commit to send"
,
"commit(H/R)"
,
fmt
.
Sprintf
(
"%v/%v"
,
commitObj
.
Height
(),
commitObj
.
Round
()),
"BitArray"
,
commitObj
.
BitArray
()
.
String
(),
"peerip"
,
pc
.
ip
.
String
(),
"
height"
,
prs
.
Height
)
"peerip"
,
pc
.
ip
.
String
(),
"
peer(H/R/S)"
,
fmt
.
Sprintf
(
"%v/%v/%v"
,
prs
.
Height
,
prs
.
Round
,
prs
.
Step
)
)
continue
OUTER_LOOP
}
}
...
...
@@ -1030,33 +1065,40 @@ func (ps *PeerConnState) SetHasProposalBlock(block *ttypes.TendermintBlock) {
ps
.
mtx
.
Lock
()
defer
ps
.
mtx
.
Unlock
()
if
ps
.
Height
!=
block
.
Header
.
Height
||
ps
.
Round
!=
int
(
block
.
Header
.
Round
)
{
if
ps
.
Height
!=
block
.
Header
.
Height
||
(
ps
.
Round
!=
int
(
block
.
Header
.
Round
)
&&
ps
.
CatchupCommitRound
!=
int
(
block
.
Header
.
Round
))
{
return
}
if
ps
.
ProposalBlock
{
return
}
tendermintlog
.
Debug
(
"Peer set proposal block"
,
"peer
ip
"
,
ps
.
ip
.
String
(),
"peer-state"
,
fmt
.
Sprintf
(
"%v/%v
/%v"
,
ps
.
Height
,
ps
.
Round
,
ps
.
Step
),
tendermintlog
.
Debug
(
"Peer set proposal block"
,
"peer
IP
"
,
ps
.
ip
.
String
(),
"peer-state"
,
fmt
.
Sprintf
(
"%v/%v
(%v)/%v"
,
ps
.
Height
,
ps
.
Round
,
ps
.
CatchupCommit
Round
,
ps
.
Step
),
"block(H/R)"
,
fmt
.
Sprintf
(
"%v/%v"
,
block
.
Header
.
Height
,
block
.
Header
.
Round
))
ps
.
ProposalBlock
=
true
}
// SetHasAgg
Precommit
sets the given aggregate precommit as known for the peer.
func
(
ps
*
PeerConnState
)
SetHasAgg
Precommit
(
aggVote
*
ttypes
.
AggVote
)
{
// SetHasAgg
Vote
sets the given aggregate precommit as known for the peer.
func
(
ps
*
PeerConnState
)
SetHasAgg
Vote
(
aggVote
*
ttypes
.
AggVote
)
{
ps
.
mtx
.
Lock
()
defer
ps
.
mtx
.
Unlock
()
if
ps
.
Height
!=
aggVote
.
Height
||
ps
.
Round
!=
int
(
aggVote
.
Round
)
{
if
ps
.
Height
!=
aggVote
.
Height
||
(
ps
.
Round
!=
int
(
aggVote
.
Round
)
&&
ps
.
CatchupCommitRound
!=
int
(
aggVote
.
Round
))
{
return
}
if
ps
.
AggPrecommit
{
if
(
aggVote
.
Type
==
uint32
(
ttypes
.
VoteTypePrevote
)
&&
ps
.
AggPrevote
)
||
(
aggVote
.
Type
==
uint32
(
ttypes
.
VoteTypePrecommit
)
&&
ps
.
AggPrecommit
)
{
return
}
tendermintlog
.
Debug
(
"Peer set aggregate precommit"
,
"peerip"
,
ps
.
ip
.
String
(),
"peer-state"
,
fmt
.
Sprintf
(
"%v/%v/%v"
,
ps
.
Height
,
ps
.
Round
,
ps
.
Step
),
"aggVote(H/R)"
,
fmt
.
Sprintf
(
"%v/%v"
,
aggVote
.
Height
,
aggVote
.
Round
))
ps
.
AggPrecommit
=
true
tendermintlog
.
Debug
(
"Peer set aggregate vote"
,
"peerIP"
,
ps
.
ip
.
String
(),
"peer-state"
,
fmt
.
Sprintf
(
"%v/%v(%v)/%v"
,
ps
.
Height
,
ps
.
Round
,
ps
.
CatchupCommitRound
,
ps
.
Step
),
"aggVote(H/R/T)"
,
fmt
.
Sprintf
(
"%v/%v/%v"
,
aggVote
.
Height
,
aggVote
.
Round
,
aggVote
.
Type
))
if
aggVote
.
Type
==
uint32
(
ttypes
.
VoteTypePrevote
)
{
ps
.
AggPrevote
=
true
}
else
if
aggVote
.
Type
==
uint32
(
ttypes
.
VoteTypePrecommit
)
{
ps
.
AggPrecommit
=
true
}
}
// PickVoteToSend picks a vote to send to the peer.
...
...
@@ -1086,7 +1128,7 @@ func (ps *PeerConnState) PickVoteToSend(votes ttypes.VoteSetReader) (vote *ttype
if
index
,
ok
:=
votes
.
BitArray
()
.
Sub
(
psVotes
)
.
PickRandom
();
ok
{
tendermintlog
.
Debug
(
"PickVoteToSend"
,
"peer(H/R)"
,
fmt
.
Sprintf
(
"%v/%v"
,
ps
.
Height
,
ps
.
Round
),
"vote(H/R)"
,
fmt
.
Sprintf
(
"%v/%v"
,
height
,
round
),
"type"
,
voteType
,
"selfVotes"
,
votes
.
BitArray
()
.
String
(),
"peerVotes"
,
psVotes
.
String
(),
"peer
ip
"
,
ps
.
ip
.
String
())
"peerVotes"
,
psVotes
.
String
(),
"peer
IP
"
,
ps
.
ip
.
String
())
return
votes
.
GetByIndex
(
index
),
true
}
return
nil
,
false
...
...
@@ -1252,6 +1294,7 @@ func (ps *PeerConnState) ApplyNewRoundStepMessage(msg *tmtypes.NewRoundStepMsg)
// We'll update the BitArray capacity later.
ps
.
Prevotes
=
nil
ps
.
Precommits
=
nil
ps
.
AggPrevote
=
false
ps
.
AggPrecommit
=
false
}
if
psHeight
==
msg
.
Height
&&
psRound
!=
int
(
msg
.
Round
)
&&
int
(
msg
.
Round
)
==
psCatchupCommitRound
{
...
...
@@ -1291,11 +1334,17 @@ func (ps *PeerConnState) ApplyValidBlockMessage(msg *tmtypes.ValidBlockMsg) {
if
ps
.
Round
!=
int
(
msg
.
Round
)
&&
!
msg
.
IsCommit
{
return
}
tendermintlog
.
Debug
(
"ApplyValidBlockMessage"
,
"peer
ip
"
,
ps
.
ip
.
String
(),
"peer(H/R
)"
,
fmt
.
Sprintf
(
"%v/%v"
,
ps
.
Height
,
ps
.
Round
),
tendermintlog
.
Debug
(
"ApplyValidBlockMessage"
,
"peer
IP
"
,
ps
.
ip
.
String
(),
"peer(H/R
/S)"
,
fmt
.
Sprintf
(
"%v/%v/%v"
,
ps
.
Height
,
ps
.
Round
,
ps
.
Step
),
"blockhash"
,
fmt
.
Sprintf
(
"%X"
,
msg
.
Blockhash
))
ps
.
ProposalBlockHash
=
msg
.
Blockhash
if
ps
.
CatchupCommitRound
==
int
(
msg
.
Round
)
&&
msg
.
IsCommit
{
tendermintlog
.
Info
(
"Set ProposalBlockHash for catchup"
,
"peerIP"
,
ps
.
ip
.
String
(),
"peer(H/R/S)"
,
fmt
.
Sprintf
(
"%v/%v/%v"
,
ps
.
Height
,
ps
.
Round
,
ps
.
Step
),
"CommitRound"
,
ps
.
CatchupCommitRound
,
"ProposalBlockHash"
,
fmt
.
Sprintf
(
"%X"
,
ps
.
ProposalBlockHash
))
}
}
// ApplyProposalPOLMessage updates the peer state for the new proposal POL.
...
...
plugin/consensus/tendermint/tendermint.go
View file @
69e7b23f
...
...
@@ -9,6 +9,7 @@ import (
"fmt"
"math/rand"
"os"
"sync/atomic"
"time"
"github.com/33cn/chain33/common/crypto"
...
...
@@ -47,12 +48,13 @@ var (
preExec
=
false
createEmptyBlocksInterval
int32
// second
validatorNodes
=
[]
string
{
"127.0.0.1:46656"
}
peerGossipSleepDuration
int32
=
2
00
peerGossipSleepDuration
int32
=
1
00
peerQueryMaj23SleepDuration
int32
=
2000
zeroHash
[
32
]
byte
random
*
rand
.
Rand
signName
=
"ed25519"
useAggSig
=
false
gossipVotes
atomic
.
Value
)
func
init
()
{
...
...
@@ -150,6 +152,7 @@ func applyConfig(sub []byte) {
signName
=
subcfg
.
SignName
}
useAggSig
=
subcfg
.
UseAggregateSignature
gossipVotes
.
Store
(
true
)
}
// DefaultDBProvider returns a database using the DBBackend and DBDir
...
...
@@ -306,12 +309,11 @@ OuterLoop:
}
tendermintlog
.
Info
(
"Save state from block"
)
}
tendermintlog
.
Debug
(
"Load state finish"
,
"state"
,
state
)
// start
tendermintlog
.
Info
(
"StartConsensus"
,
"privValidator"
,
fmt
.
Sprintf
(
"%X"
,
ttypes
.
Fingerprint
(
client
.
privValidator
.
GetAddress
())),
"
Validators"
,
state
.
Validators
.
String
()
)
"
state"
,
state
)
// Log whether this node is a validator or an observer
if
state
.
Validators
.
HasAddress
(
client
.
privValidator
.
GetAddress
())
{
tendermintlog
.
Info
(
"This node is a validator"
)
...
...
@@ -424,7 +426,6 @@ func (client *Client) ProcEvent(msg *queue.Message) bool {
// CreateBlock a routine monitor whether some transactions available and tell client by available channel
func
(
client
*
Client
)
CreateBlock
()
{
issleep
:=
true
for
{
if
client
.
IsClosed
()
{
tendermintlog
.
Info
(
"CreateBlock quit"
)
...
...
@@ -432,23 +433,18 @@ func (client *Client) CreateBlock() {
}
if
!
client
.
csState
.
IsRunning
()
{
tendermintlog
.
Info
(
"consensus not running"
)
time
.
Sleep
(
time
.
S
econd
)
time
.
Sleep
(
500
*
time
.
Millis
econd
)
continue
}
if
issleep
{
time
.
Sleep
(
time
.
Second
)
}
height
,
err
:=
client
.
getLastHeight
()
if
err
!=
nil
{
issleep
=
true
continue
}
if
!
client
.
CheckTxsAvailable
(
height
)
{
issleep
=
true
time
.
Sleep
(
500
*
time
.
Millisecond
)
continue
}
issleep
=
false
client
.
txsAvailable
<-
height
+
1
time
.
Sleep
(
time
.
Duration
(
timeoutTxAvail
)
*
time
.
Millisecond
)
...
...
@@ -590,7 +586,7 @@ func (client *Client) QueryValidatorsByHeight(height int64) (*tmtypes.ValNodes,
if
height
<
1
{
return
nil
,
ttypes
.
ErrHeightLessThanOne
}
req
:=
&
tmtypes
.
Req
NodeInfo
{
Height
:
height
}
req
:=
&
tmtypes
.
Req
ValNodes
{
Height
:
height
}
param
,
err
:=
proto
.
Marshal
(
req
)
if
err
!=
nil
{
tendermintlog
.
Error
(
"QueryValidatorsByHeight marshal"
,
"err"
,
err
)
...
...
@@ -670,22 +666,43 @@ func (client *Client) Query_IsHealthy(req *types.ReqNil) (types.Message, error)
// Query_NodeInfo query validator node info
func
(
client
*
Client
)
Query_NodeInfo
(
req
*
types
.
ReqNil
)
(
types
.
Message
,
error
)
{
node
s
:=
client
.
csState
.
GetRoundState
()
.
Validators
.
Validators
validators
:=
make
([]
*
tmtypes
.
Validator
,
0
)
for
_
,
node
:=
range
node
s
{
if
node
==
nil
{
validators
=
append
(
validators
,
&
tmtypes
.
Validator
{})
val
s
:=
client
.
csState
.
GetRoundState
()
.
Validators
.
Validators
nodes
:=
make
([]
*
tmtypes
.
ValNodeInfo
,
0
)
for
_
,
val
:=
range
val
s
{
if
val
==
nil
{
nodes
=
append
(
nodes
,
&
tmtypes
.
ValNodeInfo
{})
}
else
{
item
:=
&
tmtypes
.
Validator
{
Address
:
node
.
Address
,
PubKey
:
node
.
PubKey
,
VotingPower
:
node
.
VotingPower
,
Accum
:
node
.
Accum
,
ipstr
,
idstr
:=
"UNKOWN"
,
"UNKOWN"
pub
,
err
:=
ttypes
.
ConsensusCrypto
.
PubKeyFromBytes
(
val
.
PubKey
)
if
err
!=
nil
{
tendermintlog
.
Error
(
"Query_NodeInfo invalid pubkey"
,
"err"
,
err
)
}
else
{
id
:=
GenIDByPubKey
(
pub
)
idstr
=
string
(
id
)
if
id
==
client
.
node
.
ID
{
ipstr
=
client
.
node
.
IP
}
else
{
ip
:=
client
.
node
.
peerSet
.
GetIP
(
id
)
if
ip
==
nil
{
tendermintlog
.
Error
(
"Query_NodeInfo nil ip"
,
"id"
,
idstr
)
}
else
{
ipstr
=
ip
.
String
()
}
}
}
item
:=
&
tmtypes
.
ValNodeInfo
{
NodeIP
:
ipstr
,
NodeID
:
idstr
,
Address
:
fmt
.
Sprintf
(
"%X"
,
val
.
Address
),
PubKey
:
fmt
.
Sprintf
(
"%X"
,
val
.
PubKey
),
VotingPower
:
val
.
VotingPower
,
Accum
:
val
.
Accum
,
}
validators
=
append
(
validator
s
,
item
)
nodes
=
append
(
node
s
,
item
)
}
}
return
&
tmtypes
.
Val
idatorSet
{
Validators
:
validators
,
Proposer
:
&
tmtypes
.
Validator
{}
},
nil
return
&
tmtypes
.
Val
NodeInfoSet
{
Nodes
:
nodes
},
nil
}
// CmpBestBlock 比较newBlock是不是最优区块
...
...
plugin/consensus/tendermint/tendermint_test.go
View file @
69e7b23f
...
...
@@ -272,7 +272,7 @@ func CheckState(t *testing.T, client *Client) {
assert
.
Equal
(
t
,
client
.
csState
.
Prevote
(
0
),
1000
*
time
.
Millisecond
)
assert
.
Equal
(
t
,
client
.
csState
.
Precommit
(
0
),
1000
*
time
.
Millisecond
)
assert
.
Equal
(
t
,
client
.
csState
.
PeerGossipSleep
(),
2
00
*
time
.
Millisecond
)
assert
.
Equal
(
t
,
client
.
csState
.
PeerGossipSleep
(),
1
00
*
time
.
Millisecond
)
assert
.
Equal
(
t
,
client
.
csState
.
PeerQueryMaj23Sleep
(),
2000
*
time
.
Millisecond
)
assert
.
Equal
(
t
,
client
.
csState
.
IsProposer
(),
true
)
assert
.
Nil
(
t
,
client
.
csState
.
GetPrevotesState
(
state
.
LastBlockHeight
,
0
,
nil
))
...
...
@@ -286,7 +286,7 @@ func CheckState(t *testing.T, client *Client) {
msg2
,
err
:=
client
.
Query_NodeInfo
(
&
types
.
ReqNil
{})
assert
.
Nil
(
t
,
err
)
tvals
:=
msg2
.
(
*
vty
.
Val
idatorSet
)
.
Validator
s
tvals
:=
msg2
.
(
*
vty
.
Val
NodeInfoSet
)
.
Node
s
assert
.
Len
(
t
,
tvals
,
1
)
err
=
client
.
CommitBlock
(
client
.
GetCurrentBlock
())
...
...
plugin/consensus/tendermint/types/block.go
View file @
69e7b23f
...
...
@@ -201,7 +201,7 @@ func (h *Header) StringIndented(indent string) string {
%s LastCommit: %v
%s Validators: %v
%s App: %v
%s Con
ensus:
%v
%s Con
sensus:
%v
%s Results: %v
%s}#%v`
,
indent
,
h
.
ChainID
,
...
...
@@ -304,7 +304,7 @@ func (commit *Commit) IsCommit() bool {
// GetAggVote ...
func
(
commit
*
Commit
)
GetAggVote
()
*
AggVote
{
if
commit
==
nil
{
if
commit
==
nil
||
commit
.
AggVote
==
nil
{
return
nil
}
aggVote
:=
&
AggVote
{
commit
.
AggVote
}
...
...
plugin/consensus/tendermint/types/round_state.go
View file @
69e7b23f
...
...
@@ -22,14 +22,16 @@ var (
// step and message id define
const
(
RoundStepNewHeight
=
RoundStepType
(
0x01
)
// Wait til CommitTime + timeoutCommit
RoundStepNewRound
=
RoundStepType
(
0x02
)
// Setup new round and go to RoundStepPropose
RoundStepPropose
=
RoundStepType
(
0x03
)
// Did propose, gossip proposal
RoundStepPrevote
=
RoundStepType
(
0x04
)
// Did prevote, gossip prevotes
RoundStepPrevoteWait
=
RoundStepType
(
0x05
)
// Did receive any +2/3 prevotes, start timeout
RoundStepPrecommit
=
RoundStepType
(
0x06
)
// Did precommit, gossip precommits
RoundStepPrecommitWait
=
RoundStepType
(
0x07
)
// Did receive any +2/3 precommits, start timeout
RoundStepCommit
=
RoundStepType
(
0x08
)
// Entered commit state machine
RoundStepNewHeight
=
RoundStepType
(
0x01
)
// Wait til CommitTime + timeoutCommit
RoundStepNewRound
=
RoundStepType
(
0x02
)
// Setup new round and go to RoundStepPropose
RoundStepPropose
=
RoundStepType
(
0x03
)
// Did propose, gossip proposal
RoundStepPrevote
=
RoundStepType
(
0x04
)
// Did prevote, gossip prevotes
RoundStepAggPrevoteWait
=
RoundStepType
(
0x05
)
// Did send prevote for aggregate, start timeout
RoundStepPrevoteWait
=
RoundStepType
(
0x06
)
// Did receive any +2/3 prevotes, start timeout
RoundStepPrecommit
=
RoundStepType
(
0x07
)
// Did precommit, gossip precommits
RoundStepAggPrecommitWait
=
RoundStepType
(
0x08
)
// Did send precommit for aggregate, start timeout
RoundStepPrecommitWait
=
RoundStepType
(
0x09
)
// Did receive any +2/3 precommits, start timeout
RoundStepCommit
=
RoundStepType
(
0x10
)
// Entered commit state machine
// NOTE: RoundStepNewHeight acts as RoundStepCommitWait.
NewRoundStepID
=
byte
(
0x01
)
...
...
@@ -84,6 +86,10 @@ func (rs RoundStepType) String() string {
return
"RoundStepPrecommitWait"
case
RoundStepCommit
:
return
"RoundStepCommit"
case
RoundStepAggPrevoteWait
:
return
"RoundStepAggPrevoteWait"
case
RoundStepAggPrecommitWait
:
return
"RoundStepAggPrecommitWait"
default
:
return
"RoundStepUnknown"
// Cannot panic.
}
...
...
@@ -188,6 +194,7 @@ type PeerRoundState struct {
LastCommit
*
BitArray
// All commit precommits of commit for last height.
CatchupCommitRound
int
// Round that we have commit for. Not necessarily unique. -1 if none.
CatchupCommit
*
BitArray
// All commit precommits peer has for this height & CatchupCommitRound
AggPrevote
bool
// True if peer has aggregate prevote for this round
AggPrecommit
bool
// True if peer has aggregate precommit for this round
}
...
...
@@ -208,6 +215,7 @@ func (prs PeerRoundState) StringIndented(indent string) string {
%s Precommits %v
%s LastCommit %v (round %v)
%s CatchupCommit %v (round %v)
%s AggPrevote %v
%s AggPrecommit %v
%s}`
,
indent
,
prs
.
Height
,
prs
.
Round
,
prs
.
Step
,
prs
.
StartTime
,
...
...
@@ -219,6 +227,7 @@ func (prs PeerRoundState) StringIndented(indent string) string {
indent
,
prs
.
Precommits
,
indent
,
prs
.
LastCommit
,
prs
.
LastCommitRound
,
indent
,
prs
.
CatchupCommit
,
prs
.
CatchupCommitRound
,
indent
,
prs
.
AggPrevote
,
indent
,
prs
.
AggPrecommit
,
indent
)
}
...
...
plugin/dapp/valnode/commands/valnode.go
View file @
69e7b23f
...
...
@@ -40,6 +40,7 @@ func ValCmd() *cobra.Command {
IsSyncCmd
(),
GetBlockInfoCmd
(),
GetNodeInfoCmd
(),
GetPerfStatCmd
(),
AddNodeCmd
(),
CreateCmd
(),
)
...
...
@@ -75,7 +76,7 @@ func GetNodeInfoCmd() *cobra.Command {
func
getNodeInfo
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
var
res
[]
*
vt
.
Validator
var
res
*
vt
.
ValNodeInfoSet
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"valnode.GetNodeInfo"
,
nil
,
&
res
)
ctx
.
Run
()
}
...
...
@@ -113,6 +114,41 @@ func getBlockInfo(cmd *cobra.Command, args []string) {
ctx
.
Run
()
}
// GetPerfStatCmd get block info
func
GetPerfStatCmd
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
Use
:
"stat"
,
Short
:
"Get tendermint performance statistics"
,
Run
:
getPerfStat
,
}
addGetPerfStatFlags
(
cmd
)
return
cmd
}
func
addGetPerfStatFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
Int64P
(
"start"
,
"s"
,
0
,
"start block height"
)
cmd
.
Flags
()
.
Int64P
(
"end"
,
"e"
,
0
,
"end block height"
)
}
func
getPerfStat
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
start
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"start"
)
end
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"end"
)
req
:=
&
vt
.
ReqPerfStat
{
Start
:
start
,
End
:
end
,
}
params
:=
rpctypes
.
Query4Jrpc
{
Execer
:
vt
.
ValNodeX
,
FuncName
:
"GetPerfState"
,
Payload
:
types
.
MustPBToJSON
(
req
),
}
var
res
vt
.
PerfStat
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"Chain33.Query"
,
params
,
&
res
)
ctx
.
Run
()
}
// AddNodeCmd add validator node
func
AddNodeCmd
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
...
...
plugin/dapp/valnode/executor/query.go
View file @
69e7b23f
...
...
@@ -10,7 +10,7 @@ import (
)
// Query_GetValNodeByHeight method
func
(
val
*
ValNode
)
Query_GetValNodeByHeight
(
in
*
pty
.
Req
NodeInfo
)
(
types
.
Message
,
error
)
{
func
(
val
*
ValNode
)
Query_GetValNodeByHeight
(
in
*
pty
.
Req
ValNodes
)
(
types
.
Message
,
error
)
{
height
:=
in
.
GetHeight
()
if
height
<=
0
{
...
...
@@ -60,3 +60,60 @@ func (val *ValNode) Query_GetBlockInfoByHeight(in *pty.ReqBlockInfo) (types.Mess
}
return
reply
,
nil
}
// Query_GetPerfState method
func
(
val
*
ValNode
)
Query_GetPerfState
(
in
*
pty
.
ReqPerfStat
)
(
types
.
Message
,
error
)
{
start
:=
in
.
GetStart
()
end
:=
in
.
GetEnd
()
if
start
<
0
||
end
<
0
||
start
>
end
||
end
>
val
.
GetHeight
()
{
return
nil
,
types
.
ErrInvalidParam
}
if
start
==
0
{
start
=
1
}
if
end
==
0
{
end
=
val
.
GetHeight
()
}
startKey
:=
CalcValNodeBlockInfoHeightKey
(
start
)
startValue
,
err
:=
val
.
GetLocalDB
()
.
Get
(
startKey
)
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
startValue
)
==
0
{
return
nil
,
types
.
ErrNotFound
}
startInfo
:=
&
pty
.
TendermintBlockInfo
{}
err
=
types
.
Decode
(
startValue
,
startInfo
)
if
err
!=
nil
{
return
nil
,
err
}
endKey
:=
CalcValNodeBlockInfoHeightKey
(
end
)
endValue
,
err
:=
val
.
GetLocalDB
()
.
Get
(
endKey
)
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
endValue
)
==
0
{
return
nil
,
types
.
ErrNotFound
}
endInfo
:=
&
pty
.
TendermintBlockInfo
{}
err
=
types
.
Decode
(
endValue
,
endInfo
)
if
err
!=
nil
{
return
nil
,
err
}
startHeader
:=
startInfo
.
Block
.
Header
endHeader
:=
endInfo
.
Block
.
Header
totalTx
:=
endHeader
.
TotalTxs
-
startHeader
.
TotalTxs
totalBlock
:=
endHeader
.
Height
-
startHeader
.
Height
+
1
totalSecond
:=
endHeader
.
Time
-
startHeader
.
Time
+
1
return
&
pty
.
PerfStat
{
TotalTx
:
totalTx
,
TotalBlock
:
totalBlock
,
TxPerBlock
:
totalTx
/
totalBlock
,
TotalSecond
:
totalSecond
,
TxPerSecond
:
totalTx
/
totalSecond
,
},
nil
}
plugin/dapp/valnode/proto/valnode.proto
View file @
69e7b23f
...
...
@@ -21,7 +21,7 @@ message ValNodeAction {
int32
Ty
=
3
;
}
message
Req
NodeInfo
{
message
Req
ValNodes
{
int64
height
=
1
;
}
...
...
@@ -29,7 +29,33 @@ message ReqBlockInfo {
int64
height
=
1
;
}
message
ValNodeInfo
{
string
nodeIP
=
1
;
string
nodeID
=
2
;
string
address
=
3
;
string
pubKey
=
4
;
int64
votingPower
=
5
;
int64
accum
=
6
;
}
message
ValNodeInfoSet
{
repeated
ValNodeInfo
nodes
=
1
;
}
message
PerfStat
{
int64
totalTx
=
1
;
int64
totalBlock
=
2
;
int64
txPerBlock
=
3
;
int64
totalSecond
=
4
;
int64
txPerSecond
=
5
;
}
message
ReqPerfStat
{
int64
start
=
1
;
int64
end
=
2
;
}
service
valnode
{
rpc
IsSync
(
ReqNil
)
returns
(
IsHealthy
)
{}
rpc
GetNodeInfo
(
ReqNil
)
returns
(
Val
idator
Set
)
{}
rpc
GetNodeInfo
(
ReqNil
)
returns
(
Val
NodeInfo
Set
)
{}
}
\ No newline at end of file
plugin/dapp/valnode/rpc/rpc.go
View file @
69e7b23f
...
...
@@ -34,12 +34,12 @@ func (c *Jrpc) IsSync(req *types.ReqNil, result *interface{}) error {
}
// GetNodeInfo query node info
func
(
c
*
channelClient
)
GetNodeInfo
(
ctx
context
.
Context
,
req
*
types
.
ReqNil
)
(
*
vt
.
Val
idator
Set
,
error
)
{
func
(
c
*
channelClient
)
GetNodeInfo
(
ctx
context
.
Context
,
req
*
types
.
ReqNil
)
(
*
vt
.
Val
NodeInfo
Set
,
error
)
{
data
,
err
:=
c
.
QueryConsensusFunc
(
"tendermint"
,
"NodeInfo"
,
&
types
.
ReqNil
{})
if
err
!=
nil
{
return
nil
,
err
}
if
resp
,
ok
:=
data
.
(
*
vt
.
Val
idator
Set
);
ok
{
if
resp
,
ok
:=
data
.
(
*
vt
.
Val
NodeInfo
Set
);
ok
{
return
resp
,
nil
}
return
nil
,
types
.
ErrDecode
...
...
@@ -51,6 +51,6 @@ func (c *Jrpc) GetNodeInfo(req *types.ReqNil, result *interface{}) error {
if
err
!=
nil
{
return
err
}
*
result
=
data
.
Validators
*
result
=
data
return
nil
}
plugin/dapp/valnode/rpc/rpc_test.go
View file @
69e7b23f
...
...
@@ -63,15 +63,16 @@ func TestChannelClient_GetNodeInfo(t *testing.T) {
client
:=
newGrpc
(
api
)
client
.
Init
(
"valnode"
,
nil
,
nil
,
nil
)
req
:=
&
types
.
ReqNil
{}
node
:=
&
vt
.
Validator
{
Address
:
[]
byte
(
"aaa"
),
PubKey
:
[]
byte
(
"bbb"
),
node
:=
&
vt
.
ValNodeInfo
{
NodeIP
:
"127.0.0.1"
,
NodeID
:
"001"
,
Address
:
"aaa"
,
PubKey
:
"bbb"
,
VotingPower
:
10
,
Accum
:
-
1
,
}
set
:=
&
vt
.
ValidatorSet
{
Validators
:
[]
*
vt
.
Validator
{
node
},
Proposer
:
node
,
set
:=
&
vt
.
ValNodeInfoSet
{
Nodes
:
[]
*
vt
.
ValNodeInfo
{
node
},
}
api
.
On
(
"QueryConsensusFunc"
,
"tendermint"
,
"NodeInfo"
,
req
)
.
Return
(
set
,
nil
)
result
,
err
:=
client
.
GetNodeInfo
(
context
.
Background
(),
req
)
...
...
@@ -84,18 +85,19 @@ func TestJrpc_GetNodeInfo(t *testing.T) {
J
:=
newJrpc
(
api
)
req
:=
&
types
.
ReqNil
{}
var
result
interface
{}
node
:=
&
vt
.
Validator
{
Address
:
[]
byte
(
"aaa"
),
PubKey
:
[]
byte
(
"bbb"
),
node
:=
&
vt
.
ValNodeInfo
{
NodeIP
:
"127.0.0.1"
,
NodeID
:
"001"
,
Address
:
"aaa"
,
PubKey
:
"bbb"
,
VotingPower
:
10
,
Accum
:
-
1
,
}
set
:=
&
vt
.
ValidatorSet
{
Validators
:
[]
*
vt
.
Validator
{
node
},
Proposer
:
node
,
set
:=
&
vt
.
ValNodeInfoSet
{
Nodes
:
[]
*
vt
.
ValNodeInfo
{
node
},
}
api
.
On
(
"QueryConsensusFunc"
,
"tendermint"
,
"NodeInfo"
,
req
)
.
Return
(
set
,
nil
)
err
:=
J
.
GetNodeInfo
(
req
,
&
result
)
assert
.
Nil
(
t
,
err
)
assert
.
EqualValues
(
t
,
set
.
Validators
,
result
)
assert
.
EqualValues
(
t
,
set
,
result
)
}
plugin/dapp/valnode/types/valnode.pb.go
View file @
69e7b23f
...
...
@@ -200,39 +200,39 @@ func (*ValNodeAction) XXX_OneofWrappers() []interface{} {
}
}
type
Req
NodeInfo
struct
{
type
Req
ValNodes
struct
{
Height
int64
`protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
Req
NodeInfo
)
Reset
()
{
*
m
=
ReqNodeInfo
{}
}
func
(
m
*
Req
NodeInfo
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Req
NodeInfo
)
ProtoMessage
()
{}
func
(
*
Req
NodeInfo
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
m
*
Req
ValNodes
)
Reset
()
{
*
m
=
ReqValNodes
{}
}
func
(
m
*
Req
ValNodes
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Req
ValNodes
)
ProtoMessage
()
{}
func
(
*
Req
ValNodes
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_38e9a3523ca7e0ea
,
[]
int
{
3
}
}
func
(
m
*
Req
NodeInfo
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_Req
NodeInfo
.
Unmarshal
(
m
,
b
)
func
(
m
*
Req
ValNodes
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_Req
ValNodes
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
Req
NodeInfo
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_Req
NodeInfo
.
Marshal
(
b
,
m
,
deterministic
)
func
(
m
*
Req
ValNodes
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_Req
ValNodes
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
Req
NodeInfo
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_Req
NodeInfo
.
Merge
(
m
,
src
)
func
(
m
*
Req
ValNodes
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_Req
ValNodes
.
Merge
(
m
,
src
)
}
func
(
m
*
Req
NodeInfo
)
XXX_Size
()
int
{
return
xxx_messageInfo_Req
NodeInfo
.
Size
(
m
)
func
(
m
*
Req
ValNodes
)
XXX_Size
()
int
{
return
xxx_messageInfo_Req
ValNodes
.
Size
(
m
)
}
func
(
m
*
Req
NodeInfo
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_Req
NodeInfo
.
DiscardUnknown
(
m
)
func
(
m
*
Req
ValNodes
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_Req
ValNodes
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_Req
NodeInfo
proto
.
InternalMessageInfo
var
xxx_messageInfo_Req
ValNodes
proto
.
InternalMessageInfo
func
(
m
*
Req
NodeInfo
)
GetHeight
()
int64
{
func
(
m
*
Req
ValNodes
)
GetHeight
()
int64
{
if
m
!=
nil
{
return
m
.
Height
}
...
...
@@ -278,12 +278,252 @@ func (m *ReqBlockInfo) GetHeight() int64 {
return
0
}
type
ValNodeInfo
struct
{
NodeIP
string
`protobuf:"bytes,1,opt,name=nodeIP,proto3" json:"nodeIP,omitempty"`
NodeID
string
`protobuf:"bytes,2,opt,name=nodeID,proto3" json:"nodeID,omitempty"`
Address
string
`protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
PubKey
string
`protobuf:"bytes,4,opt,name=pubKey,proto3" json:"pubKey,omitempty"`
VotingPower
int64
`protobuf:"varint,5,opt,name=votingPower,proto3" json:"votingPower,omitempty"`
Accum
int64
`protobuf:"varint,6,opt,name=accum,proto3" json:"accum,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
ValNodeInfo
)
Reset
()
{
*
m
=
ValNodeInfo
{}
}
func
(
m
*
ValNodeInfo
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ValNodeInfo
)
ProtoMessage
()
{}
func
(
*
ValNodeInfo
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_38e9a3523ca7e0ea
,
[]
int
{
5
}
}
func
(
m
*
ValNodeInfo
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_ValNodeInfo
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
ValNodeInfo
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_ValNodeInfo
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
ValNodeInfo
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_ValNodeInfo
.
Merge
(
m
,
src
)
}
func
(
m
*
ValNodeInfo
)
XXX_Size
()
int
{
return
xxx_messageInfo_ValNodeInfo
.
Size
(
m
)
}
func
(
m
*
ValNodeInfo
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_ValNodeInfo
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_ValNodeInfo
proto
.
InternalMessageInfo
func
(
m
*
ValNodeInfo
)
GetNodeIP
()
string
{
if
m
!=
nil
{
return
m
.
NodeIP
}
return
""
}
func
(
m
*
ValNodeInfo
)
GetNodeID
()
string
{
if
m
!=
nil
{
return
m
.
NodeID
}
return
""
}
func
(
m
*
ValNodeInfo
)
GetAddress
()
string
{
if
m
!=
nil
{
return
m
.
Address
}
return
""
}
func
(
m
*
ValNodeInfo
)
GetPubKey
()
string
{
if
m
!=
nil
{
return
m
.
PubKey
}
return
""
}
func
(
m
*
ValNodeInfo
)
GetVotingPower
()
int64
{
if
m
!=
nil
{
return
m
.
VotingPower
}
return
0
}
func
(
m
*
ValNodeInfo
)
GetAccum
()
int64
{
if
m
!=
nil
{
return
m
.
Accum
}
return
0
}
type
ValNodeInfoSet
struct
{
Nodes
[]
*
ValNodeInfo
`protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
ValNodeInfoSet
)
Reset
()
{
*
m
=
ValNodeInfoSet
{}
}
func
(
m
*
ValNodeInfoSet
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ValNodeInfoSet
)
ProtoMessage
()
{}
func
(
*
ValNodeInfoSet
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_38e9a3523ca7e0ea
,
[]
int
{
6
}
}
func
(
m
*
ValNodeInfoSet
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_ValNodeInfoSet
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
ValNodeInfoSet
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_ValNodeInfoSet
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
ValNodeInfoSet
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_ValNodeInfoSet
.
Merge
(
m
,
src
)
}
func
(
m
*
ValNodeInfoSet
)
XXX_Size
()
int
{
return
xxx_messageInfo_ValNodeInfoSet
.
Size
(
m
)
}
func
(
m
*
ValNodeInfoSet
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_ValNodeInfoSet
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_ValNodeInfoSet
proto
.
InternalMessageInfo
func
(
m
*
ValNodeInfoSet
)
GetNodes
()
[]
*
ValNodeInfo
{
if
m
!=
nil
{
return
m
.
Nodes
}
return
nil
}
type
PerfStat
struct
{
TotalTx
int64
`protobuf:"varint,1,opt,name=totalTx,proto3" json:"totalTx,omitempty"`
TotalBlock
int64
`protobuf:"varint,2,opt,name=totalBlock,proto3" json:"totalBlock,omitempty"`
TxPerBlock
int64
`protobuf:"varint,3,opt,name=txPerBlock,proto3" json:"txPerBlock,omitempty"`
TotalSecond
int64
`protobuf:"varint,4,opt,name=totalSecond,proto3" json:"totalSecond,omitempty"`
TxPerSecond
int64
`protobuf:"varint,5,opt,name=txPerSecond,proto3" json:"txPerSecond,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
PerfStat
)
Reset
()
{
*
m
=
PerfStat
{}
}
func
(
m
*
PerfStat
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
PerfStat
)
ProtoMessage
()
{}
func
(
*
PerfStat
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_38e9a3523ca7e0ea
,
[]
int
{
7
}
}
func
(
m
*
PerfStat
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_PerfStat
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
PerfStat
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_PerfStat
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
PerfStat
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_PerfStat
.
Merge
(
m
,
src
)
}
func
(
m
*
PerfStat
)
XXX_Size
()
int
{
return
xxx_messageInfo_PerfStat
.
Size
(
m
)
}
func
(
m
*
PerfStat
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_PerfStat
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_PerfStat
proto
.
InternalMessageInfo
func
(
m
*
PerfStat
)
GetTotalTx
()
int64
{
if
m
!=
nil
{
return
m
.
TotalTx
}
return
0
}
func
(
m
*
PerfStat
)
GetTotalBlock
()
int64
{
if
m
!=
nil
{
return
m
.
TotalBlock
}
return
0
}
func
(
m
*
PerfStat
)
GetTxPerBlock
()
int64
{
if
m
!=
nil
{
return
m
.
TxPerBlock
}
return
0
}
func
(
m
*
PerfStat
)
GetTotalSecond
()
int64
{
if
m
!=
nil
{
return
m
.
TotalSecond
}
return
0
}
func
(
m
*
PerfStat
)
GetTxPerSecond
()
int64
{
if
m
!=
nil
{
return
m
.
TxPerSecond
}
return
0
}
type
ReqPerfStat
struct
{
Start
int64
`protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"`
End
int64
`protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
ReqPerfStat
)
Reset
()
{
*
m
=
ReqPerfStat
{}
}
func
(
m
*
ReqPerfStat
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReqPerfStat
)
ProtoMessage
()
{}
func
(
*
ReqPerfStat
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_38e9a3523ca7e0ea
,
[]
int
{
8
}
}
func
(
m
*
ReqPerfStat
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_ReqPerfStat
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
ReqPerfStat
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_ReqPerfStat
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
ReqPerfStat
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_ReqPerfStat
.
Merge
(
m
,
src
)
}
func
(
m
*
ReqPerfStat
)
XXX_Size
()
int
{
return
xxx_messageInfo_ReqPerfStat
.
Size
(
m
)
}
func
(
m
*
ReqPerfStat
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_ReqPerfStat
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_ReqPerfStat
proto
.
InternalMessageInfo
func
(
m
*
ReqPerfStat
)
GetStart
()
int64
{
if
m
!=
nil
{
return
m
.
Start
}
return
0
}
func
(
m
*
ReqPerfStat
)
GetEnd
()
int64
{
if
m
!=
nil
{
return
m
.
End
}
return
0
}
func
init
()
{
proto
.
RegisterType
((
*
ValNode
)(
nil
),
"types.ValNode"
)
proto
.
RegisterType
((
*
ValNodes
)(
nil
),
"types.ValNodes"
)
proto
.
RegisterType
((
*
ValNodeAction
)(
nil
),
"types.ValNodeAction"
)
proto
.
RegisterType
((
*
Req
NodeInfo
)(
nil
),
"types.ReqNodeInfo
"
)
proto
.
RegisterType
((
*
Req
ValNodes
)(
nil
),
"types.ReqValNodes
"
)
proto
.
RegisterType
((
*
ReqBlockInfo
)(
nil
),
"types.ReqBlockInfo"
)
proto
.
RegisterType
((
*
ValNodeInfo
)(
nil
),
"types.ValNodeInfo"
)
proto
.
RegisterType
((
*
ValNodeInfoSet
)(
nil
),
"types.ValNodeInfoSet"
)
proto
.
RegisterType
((
*
PerfStat
)(
nil
),
"types.PerfStat"
)
proto
.
RegisterType
((
*
ReqPerfStat
)(
nil
),
"types.ReqPerfStat"
)
}
func
init
()
{
...
...
@@ -291,28 +531,38 @@ func init() {
}
var
fileDescriptor_38e9a3523ca7e0ea
=
[]
byte
{
// 322 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0x74
,
0x51
,
0xcd
,
0x6a
,
0xf2
,
0x40
,
0x14
,
0x4d
,
0xcc
,
0x97
,
0xf8
,
0xf5
,
0x46
,
0x45
,
0xa6
,
0x45
,
0x42
,
0x56
,
0x61
,
0xb0
,
0x25
,
0x50
,
0x90
,
0xa2
,
0x8b
,
0x42
,
0x77
,
0x75
,
0x53
,
0xa5
,
0xd0
,
0xc5
,
0x28
,
0xdd
,
0xc7
,
0xe4
,
0xb6
,
0x06
,
0xe3
,
0x4c
,
0x4c
,
0x46
,
0x4b
,
0x5e
,
0xa1
,
0x4f
,
0x5d
,
0x32
,
0x99
,
0x46
,
0x68
,
0xe9
,
0xf2
,
0xfc
,
0xe5
,
0x9c
,
0xdc
,
0x81
,
0xfe
,
0x29
,
0xca
,
0xb8
,
0x48
,
0x70
,
0x92
,
0x17
,
0x42
,
0x0a
,
0x62
,
0xcb
,
0x2a
,
0xc7
,
0xd2
,
0xef
,
0xc5
,
0x62
,
0xbf
,
0x17
,
0xbc
,
0x21
,
0xfd
,
0xa1
,
0x44
,
0x9e
,
0x60
,
0xb1
,
0x4f
,
0xb9
,
0x6c
,
0x18
,
0x7a
,
0x0f
,
0xdd
,
0xd7
,
0x28
,
0x7b
,
0x11
,
0x09
,
0x92
,
0x11
,
0x38
,
0xf9
,
0x71
,
0xf3
,
0x8c
,
0x95
,
0x67
,
0x06
,
0x66
,
0xd8
,
0x63
,
0x1a
,
0x91
,
0x2b
,
0xb0
,
0x73
,
0xf1
,
0x81
,
0x85
,
0xd7
,
0x09
,
0xcc
,
0xd0
,
0x62
,
0x0d
,
0xa0
,
0x77
,
0xf0
,
0x5f
,
0x07
,
0x4b
,
0x32
,
0x06
,
0xbb
,
0x6e
,
0x2e
,
0x3d
,
0x33
,
0xb0
,
0x42
,
0x77
,
0x3a
,
0x98
,
0xa8
,
0xee
,
0x89
,
0xd6
,
0x59
,
0x23
,
0xd2
,
0x4f
,
0x13
,
0xfa
,
0x9a
,
0x7a
,
0x8c
,
0x65
,
0x2a
,
0x38
,
0x19
,
0xc3
,
0xbf
,
0x5a
,
0x52
,
0x7d
,
0xbf
,
0x62
,
0x0b
,
0x83
,
0x29
,
0x95
,
0x3c
,
0xc0
,
0xc5
,
0x26
,
0x13
,
0xf1
,
0x6e
,
0xc9
,
0xdf
,
0x84
,
0xda
,
0xe0
,
0x4e
,
0x7d
,
0x6d
,
0x5d
,
0xb7
,
0xbf
,
0x33
,
0xff
,
0x76
,
0x2c
,
0x0c
,
0x76
,
0xb6
,
0x93
,
0x01
,
0x74
,
0xd6
,
0x95
,
0x67
,
0x05
,
0x66
,
0x68
,
0xb3
,
0xce
,
0xba
,
0x9a
,
0x77
,
0xc1
,
0x3e
,
0x45
,
0xd9
,
0x11
,
0xe9
,
0x35
,
0xb8
,
0x0c
,
0x0f
,
0x75
,
0x8f
,
0xf2
,
0x8d
,
0xc0
,
0xd9
,
0x62
,
0xfa
,
0xbe
,
0x95
,
0x6a
,
0x8b
,
0xc5
,
0x34
,
0xa2
,
0x37
,
0xd0
,
0x63
,
0x78
,
0x68
,
0x3f
,
0xfe
,
0x97
,
0x6f
,
0xba
,
0x83
,
0xae
,
0x3e
,
0x3f
,
0xb9
,
0x05
,
0x67
,
0x59
,
0xae
,
0x2a
,
0x1e
,
0x93
,
0xbe
,
0x5e
,
0x59
,
0x17
,
0xa5
,
0x99
,
0x3f
,
0xd4
,
0x70
,
0x59
,
0x2e
,
0x30
,
0xca
,
0xe4
,
0xb6
,
0xa2
,
0x06
,
0x99
,
0x81
,
0xfb
,
0x84
,
0xb2
,
0x9d
,
0xf1
,
0x23
,
0x71
,
0x79
,
0xbe
,
0x48
,
0x9a
,
0x44
,
0x52
,
0x14
,
0x2b
,
0x94
,
0xd4
,
0xd8
,
0x38
,
0xea
,
0xe9
,
0x66
,
0x5f
,
0x01
,
0x00
,
0x00
,
0xff
,
0xff
,
0xce
,
0xc8
,
0x21
,
0x55
,
0xf2
,
0x01
,
0x00
,
0x00
,
// 496 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0x74
,
0x53
,
0xd1
,
0x6a
,
0xdb
,
0x40
,
0x10
,
0xb4
,
0xac
,
0xc8
,
0x8e
,
0x57
,
0xb6
,
0x31
,
0x47
,
0x1a
,
0x84
,
0x1f
,
0x8a
,
0x11
,
0x69
,
0x11
,
0x14
,
0x4c
,
0x71
,
0x09
,
0x85
,
0xbc
,
0x35
,
0x04
,
0x6a
,
0x53
,
0x08
,
0xe6
,
0x64
,
0xfa
,
0x2e
,
0x4b
,
0x9b
,
0x58
,
0x54
,
0xba
,
0xb3
,
0xa5
,
0xb3
,
0x1b
,
0xfd
,
0x42
,
0x7f
,
0xa4
,
0xfd
,
0xcc
,
0xa2
,
0xd5
,
0x49
,
0x55
,
0x1a
,
0xf2
,
0xa6
,
0x99
,
0x9d
,
0xbd
,
0x9b
,
0xdd
,
0xd1
,
0xc1
,
0xe8
,
0x14
,
0x24
,
0x42
,
0x46
,
0x38
,
0xdf
,
0x67
,
0x52
,
0x49
,
0x66
,
0xa9
,
0x62
,
0x8f
,
0xf9
,
0x74
,
0x18
,
0xca
,
0x34
,
0x95
,
0xa2
,
0x22
,
0xa7
,
0x13
,
0x85
,
0x22
,
0xc2
,
0x2c
,
0x8d
,
0x85
,
0xaa
,
0x18
,
0xf7
,
0x33
,
0xf4
,
0xbf
,
0x07
,
0xc9
,
0xbd
,
0x8c
,
0x90
,
0x5d
,
0x42
,
0x6f
,
0x7f
,
0xdc
,
0x7e
,
0xc3
,
0xc2
,
0x31
,
0x66
,
0x86
,
0x37
,
0xe4
,
0x1a
,
0xb1
,
0x0b
,
0xb0
,
0xf6
,
0xf2
,
0x27
,
0x66
,
0x4e
,
0x77
,
0x66
,
0x78
,
0x26
,
0xaf
,
0x80
,
0xfb
,
0x11
,
0xce
,
0x75
,
0x63
,
0xce
,
0xae
,
0xc0
,
0x2a
,
0x6f
,
0xce
,
0x1d
,
0x63
,
0x66
,
0x7a
,
0xf6
,
0x62
,
0x3c
,
0xa7
,
0xbb
,
0xe7
,
0xba
,
0xce
,
0xab
,
0xa2
,
0xfb
,
0xcb
,
0x80
,
0x91
,
0xa6
,
0xbe
,
0x84
,
0x2a
,
0x96
,
0x82
,
0x5d
,
0xc1
,
0x59
,
0x59
,
0xa2
,
0xfb
,
0x5e
,
0xb4
,
0x2d
,
0x3b
,
0x9c
,
0xaa
,
0xec
,
0x06
,
0x06
,
0xdb
,
0x44
,
0x86
,
0x3f
,
0x56
,
0xe2
,
0x41
,
0x92
,
0x07
,
0x7b
,
0x31
,
0xd5
,
0xd2
,
0x4d
,
0x33
,
0xce
,
0x6d
,
0xad
,
0x58
,
0x76
,
0xf8
,
0x3f
,
0x39
,
0x1b
,
0x43
,
0x77
,
0x53
,
0x38
,
0xe6
,
0xcc
,
0xf0
,
0x2c
,
0xde
,
0xdd
,
0x14
,
0xb7
,
0x7d
,
0xb0
,
0x4e
,
0x41
,
0x72
,
0x44
,
0xf7
,
0x1d
,
0xd8
,
0x1c
,
0x0f
,
0xcd
,
0x04
,
0x97
,
0xd0
,
0xdb
,
0x61
,
0xfc
,
0xb8
,
0x53
,
0xe4
,
0xc5
,
0xe4
,
0x1a
,
0xb9
,
0xef
,
0x61
,
0xc8
,
0xf1
,
0xd0
,
0x1c
,
0xfe
,
0xaa
,
0xee
,
0xb7
,
0x01
,
0xb6
,
0x3e
,
0xac
,
0xd6
,
0x95
,
0xde
,
0x57
,
0x6b
,
0xd2
,
0x0d
,
0xb8
,
0x46
,
0x0d
,
0x7f
,
0x47
,
0x83
,
0xd4
,
0xfc
,
0x1d
,
0x73
,
0xa0
,
0x1f
,
0x44
,
0x51
,
0x86
,
0x79
,
0x4e
,
0x66
,
0x07
,
0xbc
,
0x86
,
0xad
,
0x54
,
0xce
,
0xaa
,
0x0e
,
0x9d
,
0xca
,
0x0c
,
0xec
,
0x93
,
0x54
,
0xb1
,
0x78
,
0x5c
,
0x53
,
0x36
,
0x16
,
0xd9
,
0x69
,
0x53
,
0x65
,
0x6e
,
0x41
,
0x18
,
0x1e
,
0x53
,
0xa7
,
0x57
,
0xe5
,
0x46
,
0xc0
,
0xbd
,
0x81
,
0x71
,
0xcb
,
0xa8
,
0x8f
,
0x8a
,
0x79
,
0xcf
,
0xd3
,
0x63
,
0xcf
,
0x63
,
0x28
,
0x55
,
0x75
,
0x82
,
0x7f
,
0x0c
,
0x38
,
0x5f
,
0x63
,
0xf6
,
0xe0
,
0xab
,
0x40
,
0x95
,
0x96
,
0x95
,
0x54
,
0x41
,
0xb2
,
0x79
,
0xd2
,
0xbb
,
0xa8
,
0x21
,
0x7b
,
0x0b
,
0x40
,
0x9f
,
0xb4
,
0x36
,
0xfd
,
0xd7
,
0xb4
,
0x18
,
0xaa
,
0x3f
,
0xad
,
0x31
,
0xab
,
0xea
,
0xa6
,
0xae
,
0x37
,
0x4c
,
0x39
,
0x1a
,
0xa9
,
0x7d
,
0x0c
,
0xa5
,
0x88
,
0x68
,
0x6e
,
0x93
,
0xb7
,
0x29
,
0x52
,
0x94
,
0x7a
,
0xad
,
0xd0
,
0xc3
,
0xb7
,
0x28
,
0xf7
,
0x9a
,
0xf2
,
0x6d
,
0xcc
,
0x5e
,
0x80
,
0x95
,
0xab
,
0x20
,
0xab
,
0x63
,
0xab
,
0x00
,
0x9b
,
0x80
,
0x89
,
0x22
,
0xd2
,
0x0e
,
0xcb
,
0xcf
,
0x45
,
0x0a
,
0x7d
,
0xfd
,
0x8c
,
0xd8
,
0x07
,
0xe8
,
0xad
,
0x72
,
0xbf
,
0x10
,
0x21
,
0x1b
,
0xe9
,
0x8d
,
0x70
,
0x3c
,
0xdc
,
0xc7
,
0xc9
,
0x74
,
0xa2
,
0xe1
,
0x2a
,
0x5f
,
0x62
,
0x90
,
0xa8
,
0x5d
,
0xe1
,
0x76
,
0xd8
,
0x35
,
0xd8
,
0x5f
,
0x51
,
0x35
,
0xf1
,
0xff
,
0xd7
,
0xf1
,
0xe6
,
0xe5
,
0x4a
,
0x7d
,
0x54
,
0x6e
,
0x67
,
0xdb
,
0xa3
,
0x47
,
0xf8
,
0xe9
,
0x6f
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0xbe
,
0x95
,
0xc7
,
0x52
,
0xbc
,
0x03
,
0x00
,
0x00
,
}
// Reference imports to suppress errors if they are not otherwise used.
...
...
@@ -328,7 +578,7 @@ const _ = grpc.SupportPackageIsVersion6
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type
ValnodeClient
interface
{
IsSync
(
ctx
context
.
Context
,
in
*
types
.
ReqNil
,
opts
...
grpc
.
CallOption
)
(
*
IsHealthy
,
error
)
GetNodeInfo
(
ctx
context
.
Context
,
in
*
types
.
ReqNil
,
opts
...
grpc
.
CallOption
)
(
*
Val
idator
Set
,
error
)
GetNodeInfo
(
ctx
context
.
Context
,
in
*
types
.
ReqNil
,
opts
...
grpc
.
CallOption
)
(
*
Val
NodeInfo
Set
,
error
)
}
type
valnodeClient
struct
{
...
...
@@ -348,8 +598,8 @@ func (c *valnodeClient) IsSync(ctx context.Context, in *types.ReqNil, opts ...gr
return
out
,
nil
}
func
(
c
*
valnodeClient
)
GetNodeInfo
(
ctx
context
.
Context
,
in
*
types
.
ReqNil
,
opts
...
grpc
.
CallOption
)
(
*
Val
idator
Set
,
error
)
{
out
:=
new
(
Val
idator
Set
)
func
(
c
*
valnodeClient
)
GetNodeInfo
(
ctx
context
.
Context
,
in
*
types
.
ReqNil
,
opts
...
grpc
.
CallOption
)
(
*
Val
NodeInfo
Set
,
error
)
{
out
:=
new
(
Val
NodeInfo
Set
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
"/types.valnode/GetNodeInfo"
,
in
,
out
,
opts
...
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -360,7 +610,7 @@ func (c *valnodeClient) GetNodeInfo(ctx context.Context, in *types.ReqNil, opts
// ValnodeServer is the server API for Valnode service.
type
ValnodeServer
interface
{
IsSync
(
context
.
Context
,
*
types
.
ReqNil
)
(
*
IsHealthy
,
error
)
GetNodeInfo
(
context
.
Context
,
*
types
.
ReqNil
)
(
*
Val
idator
Set
,
error
)
GetNodeInfo
(
context
.
Context
,
*
types
.
ReqNil
)
(
*
Val
NodeInfo
Set
,
error
)
}
// UnimplementedValnodeServer can be embedded to have forward compatible implementations.
...
...
@@ -370,7 +620,7 @@ type UnimplementedValnodeServer struct {
func
(
*
UnimplementedValnodeServer
)
IsSync
(
ctx
context
.
Context
,
req
*
types
.
ReqNil
)
(
*
IsHealthy
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method IsSync not implemented"
)
}
func
(
*
UnimplementedValnodeServer
)
GetNodeInfo
(
ctx
context
.
Context
,
req
*
types
.
ReqNil
)
(
*
Val
idator
Set
,
error
)
{
func
(
*
UnimplementedValnodeServer
)
GetNodeInfo
(
ctx
context
.
Context
,
req
*
types
.
ReqNil
)
(
*
Val
NodeInfo
Set
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method GetNodeInfo not implemented"
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment