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
69366e2b
Commit
69366e2b
authored
Aug 20, 2019
by
张振华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
7f71d2a5
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
82 additions
and
249 deletions
+82
-249
dpos.go
plugin/consensus/dpos/dpos.go
+27
-193
node.go
plugin/consensus/dpos/node.go
+15
-0
state_machine.go
plugin/consensus/dpos/state_machine.go
+40
-19
dposvotedb.go
plugin/dapp/dposvote/executor/dposvotedb.go
+0
-37
No files found.
plugin/consensus/dpos/dpos.go
View file @
69366e2b
...
@@ -211,7 +211,6 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
...
@@ -211,7 +211,6 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
}
}
// PrivValidator returns the Node's PrivValidator.
// PrivValidator returns the Node's PrivValidator.
// XXX: for convenience only!
func
(
client
*
Client
)
PrivValidator
()
ttypes
.
PrivValidator
{
func
(
client
*
Client
)
PrivValidator
()
ttypes
.
PrivValidator
{
return
client
.
privValidator
return
client
.
privValidator
}
}
...
@@ -291,20 +290,24 @@ OuterLoop:
...
@@ -291,20 +290,24 @@ OuterLoop:
dposlog
.
Info
(
"QueryCandidators success but no enough candidators"
,
"dposDelegateNum"
,
dposDelegateNum
,
"candidatorNum"
,
len
(
cands
))
dposlog
.
Info
(
"QueryCandidators success but no enough candidators"
,
"dposDelegateNum"
,
dposDelegateNum
,
"candidatorNum"
,
len
(
cands
))
}
else
{
}
else
{
validators
:=
make
([]
*
ttypes
.
Validator
,
dposDelegateNum
)
validators
:=
make
([]
*
ttypes
.
Validator
,
dposDelegateNum
)
nodes
:=
make
([]
string
,
dposDelegateNum
)
for
i
,
val
:=
range
cands
{
for
i
,
val
:=
range
cands
{
// Make validator
// Make validator
validators
[
i
]
=
&
ttypes
.
Validator
{
validators
[
i
]
=
&
ttypes
.
Validator
{
Address
:
address
.
PubKeyToAddress
(
val
.
Pubkey
)
.
Hash160
[
:
],
Address
:
address
.
PubKeyToAddress
(
val
.
Pubkey
)
.
Hash160
[
:
],
PubKey
:
val
.
Pubkey
,
PubKey
:
val
.
Pubkey
,
}
}
nodes
[
i
]
=
val
.
Ip
+
":"
+
dposPort
}
}
valMgr
.
Validators
=
ttypes
.
NewValidatorSet
(
validators
)
valMgr
.
Validators
=
ttypes
.
NewValidatorSet
(
validators
)
dposlog
.
Info
(
"QueryCandidators success and update validator set"
,
"old validators"
,
valMgrTmp
.
Validators
.
String
(),
"new validators"
,
valMgr
.
Validators
.
String
())
dposlog
.
Info
(
"QueryCandidators success and update validator set"
,
"old validators"
,
printValidators
(
valMgrTmp
.
Validators
),
"new validators"
,
printValidators
(
valMgr
.
Validators
))
dposlog
.
Info
(
"QueryCandidators success and update validator node ips"
,
"old validator ips"
,
printNodeIPs
(
validatorNodes
),
"new validators ips"
,
printNodeIPs
(
nodes
))
validatorNodes
=
nodes
}
}
}
}
}
}
dposlog
.
Info
(
"StartConsensus"
,
"validators"
,
valMgr
.
Validators
)
dposlog
.
Info
(
"StartConsensus"
,
"validators"
,
printValidators
(
valMgr
.
Validators
)
)
// Log whether this node is a delegator or an observer
// Log whether this node is a delegator or an observer
if
valMgr
.
Validators
.
HasAddress
(
client
.
privValidator
.
GetAddress
())
{
if
valMgr
.
Validators
.
HasAddress
(
client
.
privValidator
.
GetAddress
())
{
dposlog
.
Info
(
"This node is a delegator"
)
dposlog
.
Info
(
"This node is a delegator"
)
...
@@ -337,6 +340,26 @@ OuterLoop:
...
@@ -337,6 +340,26 @@ OuterLoop:
//go client.MonitorCandidators()
//go client.MonitorCandidators()
}
}
func
printValidators
(
set
*
ttypes
.
ValidatorSet
)
string
{
result
:=
"Validators:["
for
_
,
v
:=
range
set
.
Validators
{
result
=
fmt
.
Sprintf
(
"%s%s,"
,
result
,
hex
.
EncodeToString
(
v
.
PubKey
))
}
result
+=
"]"
return
result
}
func
printNodeIPs
(
ips
[]
string
)
string
{
result
:=
"nodeIPs:["
for
_
,
v
:=
range
ips
{
result
=
fmt
.
Sprintf
(
"%s%s,"
,
result
,
v
)
}
result
+=
"]"
return
result
}
// GetGenesisBlockTime ...
// GetGenesisBlockTime ...
func
(
client
*
Client
)
GetGenesisBlockTime
()
int64
{
func
(
client
*
Client
)
GetGenesisBlockTime
()
int64
{
return
genesisBlockTime
return
genesisBlockTime
...
@@ -409,54 +432,6 @@ func (client *Client) CreateBlock() {
...
@@ -409,54 +432,6 @@ func (client *Client) CreateBlock() {
}
}
}
}
// CreateBlock a routine monitor whether some transactions available and tell client by available channel
/*
func (client *Client) CreateBlockWithPriorTxs(priorTxs []*types.Transaction) {
lastBlock := client.GetCurrentBlock()
txs := client.RequestTx(int(types.GetP(lastBlock.Height + 1).MaxTxNumber), nil)
if len(priorTxs) > 0 {
txs = append(txs, priorTxs...)
}
if len(txs) == 0 {
block := client.GetCurrentBlock()
if createEmptyBlocks {
emptyBlock := &types.Block{}
emptyBlock.StateHash = block.StateHash
emptyBlock.ParentHash = block.Hash()
emptyBlock.Height = block.Height + 1
emptyBlock.Txs = nil
emptyBlock.TxHash = zeroHash[:]
emptyBlock.BlockTime = client.blockTime
err := client.WriteBlock(lastBlock.StateHash, emptyBlock)
//判断有没有交易是被删除的,这类交易要从mempool 中删除
if err != nil {
return
}
} else {
dposlog.Info("Ignore to create new Block for no tx in mempool", "Height", block.Height+1)
}
return
}
//check dup
txs = client.CheckTxDup(txs, client.GetCurrentHeight())
var newblock types.Block
newblock.ParentHash = lastBlock.Hash()
newblock.Height = lastBlock.Height + 1
client.AddTxsToBlock(&newblock, txs)
//
newblock.Difficulty = types.GetP(0).PowLimitBits
newblock.TxHash = merkle.CalcMerkleRoot(newblock.Txs)
newblock.BlockTime = client.blockTime
err := client.WriteBlock(lastBlock.StateHash, &newblock)
//判断有没有交易是被删除的,这类交易要从mempool 中删除
if err != nil {
return
}
}
*/
// StopC stop client
// StopC stop client
func
(
client
*
Client
)
StopC
()
<-
chan
struct
{}
{
func
(
client
*
Client
)
StopC
()
<-
chan
struct
{}
{
return
client
.
stopC
return
client
.
stopC
...
@@ -539,46 +514,6 @@ func (client *Client)QueryCandidators()([]*dty.Candidator, error) {
...
@@ -539,46 +514,6 @@ func (client *Client)QueryCandidators()([]*dty.Candidator, error) {
return
cands
,
nil
return
cands
,
nil
}
}
/*
func (client *Client)QueryCandidators()([]*dty.Candidator, error) {
var params rpctypes.Query4Jrpc
params.Execer = dty.DPosX
req := &dty.CandidatorQuery{
TopN: int32(dposDelegateNum),
}
params.FuncName = dty.FuncNameQueryCandidatorByTopN
params.Payload = types.MustPBToJSON(req)
var res dty.CandidatorReply
ctx := jsonrpc.NewRPCCtx(rpcAddr, "Chain33.Query", params, &res)
result, err := ctx.RunResult()
if err != nil {
fmt.Fprintln(os.Stderr, err)
return nil, err
}
res = *result.(*dty.CandidatorReply)
var cands []*dty.Candidator
for _, val := range res.GetCandidators() {
bPubkey, err := hex.DecodeString(val.Pubkey)
if err != nil {
return nil, err
}
cand := &dty.Candidator{
Pubkey: bPubkey,
Address: val.Address,
Ip: val.Ip,
Votes: val.Votes,
Status: val.Status,
}
cands = append(cands, cand)
}
return cands, nil
}
*/
func
(
client
*
Client
)
MonitorCandidators
()
{
func
(
client
*
Client
)
MonitorCandidators
()
{
ticker
:=
time
.
NewTicker
(
30
*
time
.
Second
)
ticker
:=
time
.
NewTicker
(
30
*
time
.
Second
)
for
{
for
{
...
@@ -639,31 +574,6 @@ func (client *Client)isValidatorSetSame(v1, v2 *ttypes.ValidatorSet) bool {
...
@@ -639,31 +574,6 @@ func (client *Client)isValidatorSetSame(v1, v2 *ttypes.ValidatorSet) bool {
return
true
return
true
}
}
/*
func (client *Client)QueryCycleBoundaryInfo(cycle int64)(*dty.DposCBInfo, error) {
var params rpctypes.Query4Jrpc
params.Execer = dty.DPosX
req := &dty.DposCBQuery{
Ty: dty.QueryCBInfoByCycle,
Cycle: cycle,
}
params.FuncName = dty.FuncNameQueryCBInfoByCycle
params.Payload = types.MustPBToJSON(req)
var res dty.DposCBReply
ctx := jsonrpc.NewRPCCtx(rpcAddr, "Chain33.Query", params, &res)
result, err := ctx.RunResult()
if err != nil {
fmt.Fprintln(os.Stderr, err)
return nil, err
}
res = *result.(*dty.DposCBReply)
return res.CbInfo, nil
}
*/
func
(
client
*
Client
)
CreateRecordCBTx
(
info
*
dty
.
DposCBInfo
)(
tx
*
types
.
Transaction
,
err
error
)
{
func
(
client
*
Client
)
CreateRecordCBTx
(
info
*
dty
.
DposCBInfo
)(
tx
*
types
.
Transaction
,
err
error
)
{
var
action
dty
.
DposVoteAction
var
action
dty
.
DposVoteAction
action
.
Value
=
&
dty
.
DposVoteAction_RecordCB
{
action
.
Value
=
&
dty
.
DposVoteAction_RecordCB
{
...
@@ -743,7 +653,7 @@ func (client *Client)QueryVrfInfos(pubkeys [][]byte, cycle int64)([]*dty.VrfInfo
...
@@ -743,7 +653,7 @@ func (client *Client)QueryVrfInfos(pubkeys [][]byte, cycle int64)([]*dty.VrfInfo
res
:=
msg
.
GetData
()
.
(
types
.
Message
)
.
(
*
dty
.
DposVrfReply
)
res
:=
msg
.
GetData
()
.
(
types
.
Message
)
.
(
*
dty
.
DposVrfReply
)
if
len
(
res
.
Vrf
)
>
0
{
if
len
(
res
.
Vrf
)
>
0
{
dposlog
.
Info
(
"DposVrfQuerys ok"
)
//, "info", fmt.Sprintf("Cycle:%d,pubkey:%s,Height:%d,M:%s,R:%s,P:%s", res.Vrf[0].Cycle, res.Vrf[0].Pubkey, res.Vrf[0].Height, res.Vrf[0].M, res.Vrf[0].R, res.Vrf[0].P))
dposlog
.
Info
(
"DposVrfQuerys ok"
)
}
else
{
}
else
{
dposlog
.
Info
(
"DposVrfQuerys ok,but no info"
)
dposlog
.
Info
(
"DposVrfQuerys ok,but no info"
)
}
}
...
@@ -787,78 +697,3 @@ func (client *Client)QueryVrfInfos(pubkeys [][]byte, cycle int64)([]*dty.VrfInfo
...
@@ -787,78 +697,3 @@ func (client *Client)QueryVrfInfos(pubkeys [][]byte, cycle int64)([]*dty.VrfInfo
return
infos
,
nil
return
infos
,
nil
}
}
/*
func (client *Client)QueryVrfInfo(pubkeys []byte, cycle int64)(*dty.VrfInfo, error) {
req := &dty.DposVrfQuery{
Cycle: cycle,
Ty: dty.QueryVrfByCycleForPubkeys,
}
req.Pubkeys = append(req.Pubkeys, hex.EncodeToString(pubkeys))
param, err := proto.Marshal(req)
if err != nil {
dposlog.Error("Marshal DposVrfQuery failed", "err", err)
return nil, err
}
msg := client.GetQueueClient().NewMessage("execs", types.EventBlockChainQuery,
&types.ChainExecutor{
Driver: dty.DPosX,
FuncName: dty.FuncNameQueryVrfByCycleForPubkeys,
StateHash: zeroHash[:],
Param:param,
})
err = client.GetQueueClient().Send(msg, true)
if err != nil {
dposlog.Error("send DposVrfQuery to dpos exec failed", "err", err)
return nil, err
}
msg, err = client.GetQueueClient().Wait(msg)
if err != nil {
dposlog.Error("send DposVrfQuery wait failed", "err", err)
return nil, err
}
res := msg.GetData().(types.Message).(*dty.DposVrfReply)
if len(res.Vrf) > 0 {
dposlog.Info("DposVrfQuery ok", "info", fmt.Sprintf("Cycle:%d,pubkey:%s,Height:%d,M:%s,R:%s,P:%s", res.Vrf[0].Cycle, res.Vrf[0].Pubkey, res.Vrf[0].Height, res.Vrf[0].M, res.Vrf[0].R, res.Vrf[0].P))
} else {
dposlog.Info("DposVrfQuery ok,but no info")
}
vrf := res.Vrf[0]
bPubkey, err := hex.DecodeString(vrf.Pubkey)
if err != nil {
bPubkey = nil
}
bM, err := hex.DecodeString(vrf.M)
if err != nil {
bM = nil
}
bR, err := hex.DecodeString(vrf.R)
if err != nil {
bR = nil
}
bP, err := hex.DecodeString(vrf.P)
if err != nil {
bP = nil
}
info := &dty.VrfInfo{
Index: vrf.Index,
Pubkey: bPubkey,
Cycle: vrf.Cycle,
Height: vrf.Height,
Time: vrf.Time,
M: bM,
R: bR,
P: bP,
}
return info, nil
}
*/
\ No newline at end of file
plugin/consensus/dpos/node.go
View file @
69366e2b
...
@@ -14,6 +14,7 @@ import (
...
@@ -14,6 +14,7 @@ import (
"sync"
"sync"
"sync/atomic"
"sync/atomic"
"time"
"time"
"errors"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/common/crypto"
ttypes
"github.com/33cn/plugin/plugin/consensus/dpos/types"
ttypes
"github.com/33cn/plugin/plugin/consensus/dpos/types"
...
@@ -489,6 +490,20 @@ func (node *Node) startInitPeer(peer *peerConn) error {
...
@@ -489,6 +490,20 @@ func (node *Node) startInitPeer(peer *peerConn) error {
// FilterConnByAddr TODO:can make fileter by addr
// FilterConnByAddr TODO:can make fileter by addr
func
(
node
*
Node
)
FilterConnByAddr
(
addr
net
.
Addr
)
error
{
func
(
node
*
Node
)
FilterConnByAddr
(
addr
net
.
Addr
)
error
{
ip
,
_
:=
splitHostPort
(
addr
.
String
())
legalIP
:=
false
for
_
,
v
:=
range
node
.
seeds
{
host
:=
strings
.
Split
(
v
,
":"
)
if
ip
==
host
[
0
]
{
legalIP
=
true
break
}
}
if
!
legalIP
{
return
errors
.
New
(
fmt
.
Sprintf
(
"%s is not legal seeds ip"
,
ip
))
}
return
nil
return
nil
}
}
...
...
plugin/consensus/dpos/state_machine.go
View file @
69366e2b
...
@@ -8,10 +8,12 @@ import (
...
@@ -8,10 +8,12 @@ import (
"bytes"
"bytes"
"encoding/hex"
"encoding/hex"
"encoding/json"
"encoding/json"
"fmt"
"math"
"math"
"strings"
"strings"
"time"
"time"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/common/crypto"
dpostype
"github.com/33cn/plugin/plugin/consensus/dpos/types"
dpostype
"github.com/33cn/plugin/plugin/consensus/dpos/types"
...
@@ -200,6 +202,38 @@ func recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
...
@@ -200,6 +202,38 @@ func recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
cs
.
UpdateCBInfo
(
newInfo
)
cs
.
UpdateCBInfo
(
newInfo
)
}
}
func
printNotify
(
notify
*
dpostype
.
DPosNotify
)
string
{
if
notify
.
Vote
.
LastCBInfo
!=
nil
{
return
fmt
.
Sprintf
(
"vote:[VotedNodeIndex:%d, VotedNodeAddr:%s,Cycle:%d,CycleStart:%d,CycleStop:%d,PeriodStart:%d,PeriodStop:%d,Height:%d,VoteID:%s,CBInfo[Cycle:%d,StopHeight:%d,StopHash:%s],ShuffleType:%d,ValidatorSize:%d,VrfValidatorSize:%d,NoVrfValidatorSize:%d];HeightStop:%d,HashStop:%s,NotifyTimestamp:%d,NotifyNodeIndex:%d,NotifyNodeAddrress:%s,Sig:%s"
,
notify
.
Vote
.
VotedNodeIndex
,
hex
.
EncodeToString
(
notify
.
Vote
.
VotedNodeAddress
),
notify
.
Vote
.
Cycle
,
notify
.
Vote
.
CycleStart
,
notify
.
Vote
.
CycleStop
,
notify
.
Vote
.
PeriodStart
,
notify
.
Vote
.
PeriodStop
,
notify
.
Vote
.
Height
,
hex
.
EncodeToString
(
notify
.
Vote
.
VoteID
),
notify
.
Vote
.
LastCBInfo
.
Cycle
,
notify
.
Vote
.
LastCBInfo
.
StopHeight
,
notify
.
Vote
.
LastCBInfo
.
StopHash
,
notify
.
Vote
.
ShuffleType
,
len
(
notify
.
Vote
.
Validators
),
len
(
notify
.
Vote
.
VrfValidators
),
len
(
notify
.
Vote
.
NoVrfValidators
),
notify
.
HeightStop
,
hex
.
EncodeToString
(
notify
.
HashStop
),
notify
.
NotifyTimestamp
,
notify
.
NotifyNodeIndex
,
hex
.
EncodeToString
(
notify
.
NotifyNodeAddress
),
hex
.
EncodeToString
(
notify
.
Signature
))
}
else
{
return
fmt
.
Sprintf
(
"vote:[VotedNodeIndex:%d, VotedNodeAddr:%s,Cycle:%d,CycleStart:%d,CycleStop:%d,PeriodStart:%d,PeriodStop:%d,Height:%d,VoteID:%s,CBInfo[],ShuffleType:%d,ValidatorSize:%d,VrfValidatorSize:%d,NoVrfValidatorSize:%d];HeightStop:%d,HashStop:%s,NotifyTimestamp:%d,NotifyNodeIndex:%d,NotifyNodeAddrress:%s,Sig:%s"
,
notify
.
Vote
.
VotedNodeIndex
,
hex
.
EncodeToString
(
notify
.
Vote
.
VotedNodeAddress
),
notify
.
Vote
.
Cycle
,
notify
.
Vote
.
CycleStart
,
notify
.
Vote
.
CycleStop
,
notify
.
Vote
.
PeriodStart
,
notify
.
Vote
.
PeriodStop
,
notify
.
Vote
.
Height
,
hex
.
EncodeToString
(
notify
.
Vote
.
VoteID
),
notify
.
Vote
.
ShuffleType
,
len
(
notify
.
Vote
.
Validators
),
len
(
notify
.
Vote
.
VrfValidators
),
len
(
notify
.
Vote
.
NoVrfValidators
),
notify
.
HeightStop
,
hex
.
EncodeToString
(
notify
.
HashStop
),
notify
.
NotifyTimestamp
,
notify
.
NotifyNodeIndex
,
hex
.
EncodeToString
(
notify
.
NotifyNodeAddress
),
hex
.
EncodeToString
(
notify
.
Signature
))
}
}
func
printVote
(
vote
*
dpostype
.
DPosVote
)
string
{
return
fmt
.
Sprintf
(
"vote:[VotedNodeIndex:%d,VotedNodeAddress:%s,Cycle:%d,CycleStart:%d,CycleStop:%d,PeriodStart:%d,PeriodStop:%d,Height:%d,VoteID:%s,VoteTimestamp:%d,VoterNodeIndex:%d,VoterNodeAddress:%s,Sig:%s]"
,
vote
.
VoteItem
.
VotedNodeIndex
,
common
.
ToHex
(
vote
.
VoteItem
.
VotedNodeAddress
),
vote
.
VoteItem
.
Cycle
,
vote
.
VoteItem
.
CycleStart
,
vote
.
VoteItem
.
CycleStop
,
vote
.
VoteItem
.
PeriodStart
,
vote
.
VoteItem
.
PeriodStop
,
vote
.
VoteItem
.
Height
,
hex
.
EncodeToString
(
vote
.
VoteItem
.
VoteID
),
vote
.
VoteTimestamp
,
vote
.
VoterNodeIndex
,
hex
.
EncodeToString
(
vote
.
VoterNodeAddress
),
hex
.
EncodeToString
(
vote
.
Signature
))
}
func
printVoteItem
(
voteItem
*
dpostype
.
VoteItem
)
string
{
if
voteItem
.
LastCBInfo
!=
nil
{
return
fmt
.
Sprintf
(
"vote:[VotedNodeIndex:%d, VotedNodeAddr:%s,Cycle:%d,CycleStart:%d,CycleStop:%d,PeriodStart:%d,PeriodStop:%d,Height:%d,VoteID:%s,CBInfo[Cycle:%d,StopHeight:%d,StopHash:%s],ShuffleType:%d,ValidatorSize:%d,VrfValidatorSize:%d,NoVrfValidatorSize:%d]"
,
voteItem
.
VotedNodeIndex
,
hex
.
EncodeToString
(
voteItem
.
VotedNodeAddress
),
voteItem
.
Cycle
,
voteItem
.
CycleStart
,
voteItem
.
CycleStop
,
voteItem
.
PeriodStart
,
voteItem
.
PeriodStop
,
voteItem
.
Height
,
hex
.
EncodeToString
(
voteItem
.
VoteID
),
voteItem
.
LastCBInfo
.
Cycle
,
voteItem
.
LastCBInfo
.
StopHeight
,
voteItem
.
LastCBInfo
.
StopHash
,
voteItem
.
ShuffleType
,
len
(
voteItem
.
Validators
),
len
(
voteItem
.
VrfValidators
),
len
(
voteItem
.
NoVrfValidators
))
}
else
{
return
fmt
.
Sprintf
(
"vote:[VotedNodeIndex:%d, VotedNodeAddr:%s,Cycle:%d,CycleStart:%d,CycleStop:%d,PeriodStart:%d,PeriodStop:%d,Height:%d,VoteID:%s,CBInfo[],ShuffleType:%d,ValidatorSize:%d,VrfValidatorSize:%d,NoVrfValidatorSize:%d]"
,
voteItem
.
VotedNodeIndex
,
hex
.
EncodeToString
(
voteItem
.
VotedNodeAddress
),
voteItem
.
Cycle
,
voteItem
.
CycleStart
,
voteItem
.
CycleStop
,
voteItem
.
PeriodStart
,
voteItem
.
PeriodStop
,
voteItem
.
Height
,
hex
.
EncodeToString
(
voteItem
.
VoteID
),
voteItem
.
ShuffleType
,
len
(
voteItem
.
Validators
),
len
(
voteItem
.
VrfValidators
),
len
(
voteItem
.
NoVrfValidators
))
}
}
// State is the base class of dpos state machine, it defines some interfaces.
// State is the base class of dpos state machine, it defines some interfaces.
type
State
interface
{
type
State
interface
{
timeOut
(
cs
*
ConsensusState
)
timeOut
(
cs
*
ConsensusState
)
...
@@ -247,6 +281,7 @@ func (init *InitState) timeOut(cs *ConsensusState) {
...
@@ -247,6 +281,7 @@ func (init *InitState) timeOut(cs *ConsensusState) {
cs
.
SetState
(
VotingStateObj
)
cs
.
SetState
(
VotingStateObj
)
dposlog
.
Info
(
"Change state."
,
"from"
,
"InitState"
,
"to"
,
"VotingState"
)
dposlog
.
Info
(
"Change state."
,
"from"
,
"InitState"
,
"to"
,
"VotingState"
)
//通过node发送p2p消息到其他节点
//通过node发送p2p消息到其他节点
dposlog
.
Info
(
"VotingState send a vote"
,
"vote info"
,
printVote
(
vote
.
DPosVote
),
"localNodeIndex"
,
cs
.
client
.
ValidatorIndex
(),
"now"
,
time
.
Now
()
.
Unix
())
cs
.
dposState
.
sendVote
(
cs
,
vote
.
DPosVote
)
cs
.
dposState
.
sendVote
(
cs
,
vote
.
DPosVote
)
cs
.
scheduleDPosTimeout
(
time
.
Duration
(
timeoutVoting
)
*
time
.
Millisecond
,
VotingStateType
)
cs
.
scheduleDPosTimeout
(
time
.
Duration
(
timeoutVoting
)
*
time
.
Millisecond
,
VotingStateType
)
...
@@ -312,20 +347,7 @@ func (voting *VotingState) sendVote(cs *ConsensusState, vote *dpostype.DPosVote)
...
@@ -312,20 +347,7 @@ func (voting *VotingState) sendVote(cs *ConsensusState, vote *dpostype.DPosVote)
}
}
func
(
voting
*
VotingState
)
recvVote
(
cs
*
ConsensusState
,
vote
*
dpostype
.
DPosVote
)
{
func
(
voting
*
VotingState
)
recvVote
(
cs
*
ConsensusState
,
vote
*
dpostype
.
DPosVote
)
{
dposlog
.
Info
(
"VotingState get a vote"
,
"VotedNodeIndex"
,
vote
.
VoteItem
.
VotedNodeIndex
,
dposlog
.
Info
(
"VotingState get a vote"
,
"vote info"
,
printVote
(
vote
),
"localNodeIndex"
,
cs
.
client
.
ValidatorIndex
(),
"now"
,
time
.
Now
()
.
Unix
())
"VotedNodeAddress"
,
common
.
ToHex
(
vote
.
VoteItem
.
VotedNodeAddress
),
"Cycle"
,
vote
.
VoteItem
.
Cycle
,
"CycleStart"
,
vote
.
VoteItem
.
CycleStart
,
"CycleStop"
,
vote
.
VoteItem
.
CycleStop
,
"PeriodStart"
,
vote
.
VoteItem
.
PeriodStart
,
"periodStop"
,
vote
.
VoteItem
.
PeriodStop
,
"Height"
,
vote
.
VoteItem
.
Height
,
"VoteID"
,
common
.
ToHex
(
vote
.
VoteItem
.
VoteID
),
"VoteTimestamp"
,
vote
.
VoteTimestamp
,
"VoterNodeIndex"
,
vote
.
VoterNodeIndex
,
"VoterNodeAddress"
,
common
.
ToHex
(
vote
.
VoterNodeAddress
),
"Signature"
,
common
.
ToHex
(
vote
.
Signature
),
"localNodeIndex"
,
cs
.
client
.
ValidatorIndex
(),
"now"
,
time
.
Now
()
.
Unix
())
if
!
cs
.
VerifyVote
(
vote
)
{
if
!
cs
.
VerifyVote
(
vote
)
{
dposlog
.
Info
(
"VotingState verify vote failed"
)
dposlog
.
Info
(
"VotingState verify vote failed"
)
...
@@ -337,7 +359,7 @@ func (voting *VotingState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote)
...
@@ -337,7 +359,7 @@ func (voting *VotingState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote)
result
,
voteItem
:=
cs
.
CheckVotes
()
result
,
voteItem
:=
cs
.
CheckVotes
()
if
result
==
voteSuccess
{
if
result
==
voteSuccess
{
dposlog
.
Info
(
"VotingState get 2/3 result"
,
"final vote:"
,
voteItem
.
String
(
))
dposlog
.
Info
(
"VotingState get 2/3 result"
,
"final vote:"
,
printVoteItem
(
voteItem
))
dposlog
.
Info
(
"VotingState change state to VotedState"
)
dposlog
.
Info
(
"VotingState change state to VotedState"
)
//切换状态
//切换状态
cs
.
SetState
(
VotedStateObj
)
cs
.
SetState
(
VotedStateObj
)
...
@@ -523,7 +545,6 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
...
@@ -523,7 +545,6 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
cs
.
scheduleDPosTimeout
(
time
.
Duration
(
timeoutWaitNotify
)
*
time
.
Millisecond
,
WaitNotifyStateType
)
cs
.
scheduleDPosTimeout
(
time
.
Duration
(
timeoutWaitNotify
)
*
time
.
Millisecond
,
WaitNotifyStateType
)
if
cs
.
cachedNotify
!=
nil
{
if
cs
.
cachedNotify
!=
nil
{
cs
.
dposState
.
recvNotify
(
cs
,
cs
.
cachedNotify
)
cs
.
dposState
.
recvNotify
(
cs
,
cs
.
cachedNotify
)
}
}
return
return
}
}
...
@@ -638,12 +659,12 @@ func (wait *WaitNofifyState) recvNotify(cs *ConsensusState, notify *dpostype.DPo
...
@@ -638,12 +659,12 @@ func (wait *WaitNofifyState) recvNotify(cs *ConsensusState, notify *dpostype.DPo
block
:=
cs
.
client
.
GetCurrentBlock
()
block
:=
cs
.
client
.
GetCurrentBlock
()
if
block
.
Height
>
notify
.
HeightStop
{
if
block
.
Height
>
notify
.
HeightStop
{
dposlog
.
Info
(
"Local block height is advanced than notify, discard it."
,
"localheight"
,
block
.
Height
,
"notify"
,
notify
.
String
(
))
dposlog
.
Info
(
"Local block height is advanced than notify, discard it."
,
"localheight"
,
block
.
Height
,
"notify"
,
printNotify
(
notify
))
return
return
}
else
if
block
.
Height
==
notify
.
HeightStop
&&
bytes
.
Equal
(
block
.
Hash
(),
notify
.
HashStop
)
{
}
else
if
block
.
Height
==
notify
.
HeightStop
&&
bytes
.
Equal
(
block
.
Hash
(),
notify
.
HashStop
)
{
dposlog
.
Info
(
"Local block height is sync with notify"
,
"notify"
,
notify
.
String
(
))
dposlog
.
Info
(
"Local block height is sync with notify"
,
"notify"
,
printNotify
(
notify
))
}
else
{
}
else
{
dposlog
.
Info
(
"Local block height is not sync with notify"
,
"localheight"
,
cs
.
client
.
GetCurrentHeight
(),
"notify"
,
notify
.
String
(
))
dposlog
.
Info
(
"Local block height is not sync with notify"
,
"localheight"
,
cs
.
client
.
GetCurrentHeight
(),
"notify"
,
printNotify
(
notify
))
hint
:=
time
.
NewTicker
(
3
*
time
.
Second
)
hint
:=
time
.
NewTicker
(
3
*
time
.
Second
)
beg
:=
time
.
Now
()
beg
:=
time
.
Now
()
catchupFlag
:=
false
catchupFlag
:=
false
...
...
plugin/dapp/dposvote/executor/dposvotedb.go
View file @
69366e2b
...
@@ -238,43 +238,6 @@ func queryVrfByCycleForTopN(kvdb db.KVDB, req *dty.DposVrfQuery) (types.Message,
...
@@ -238,43 +238,6 @@ func queryVrfByCycleForTopN(kvdb db.KVDB, req *dty.DposVrfQuery) (types.Message,
}
}
vrfs
:=
queryVrfByCycleAndPubkeys
(
kvdb
,
pubkeys
,
req
.
Cycle
)
vrfs
:=
queryVrfByCycleAndPubkeys
(
kvdb
,
pubkeys
,
req
.
Cycle
)
/*
VrfRPTable := dty.NewDposVrfRPTable(kvdb)
query := VrfRPTable.GetQuery(kvdb)
var tempCands [] *dty.JsonCandidator
var vrfs [] *dty.VrfInfo
for i := 0; i < len(res.Candidators); i ++ {
rows, err := query.ListIndex("pubkey_cycle", []byte(fmt.Sprintf("%s:%018d", res.Candidators[i].Pubkey, req.Cycle)), nil, 1, 0)
if err != nil {
logger.Error("queryVrf RP failed", "pubkey", res.Candidators[i].Pubkey, "cycle", req.Cycle)
tempCands = append(tempCands, res.Candidators[i])
continue
}
vrfRP := rows[0].Data.(*dty.DposVrfRP)
vrf := getVrfInfoFromVrfRP(vrfRP)
vrfs = append(vrfs, vrf)
}
if tempCands == nil || len(tempCands) == 0 {
return &dty.DposVrfReply{Vrf: getJsonVrfs(vrfs)}, nil
}
vrfMTable := dty.NewDposVrfMTable(kvdb)
query = vrfMTable.GetQuery(kvdb)
for i := 0; i < len(tempCands); i++ {
rows, err := query.ListIndex("pubkey_cycle", []byte(fmt.Sprintf("%s:%018d", tempCands[i].Pubkey, req.Cycle)), nil, 1, 0)
if err != nil {
logger.Error("queryVrf M failed", "pubkey", res.Candidators[i].Pubkey, "cycle", req.Cycle)
continue
}
vrfM := rows[0].Data.(*dty.DposVrfM)
vrf := getVrfInfoFromVrfM(vrfM)
vrfs = append(vrfs, vrf)
}
*/
return
&
dty
.
DposVrfReply
{
Vrf
:
getJsonVrfs
(
vrfs
)},
nil
return
&
dty
.
DposVrfReply
{
Vrf
:
getJsonVrfs
(
vrfs
)},
nil
}
}
...
...
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