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
4f86f81b
Commit
4f86f81b
authored
Aug 09, 2019
by
张振华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
2cb03695
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
625 additions
and
159 deletions
+625
-159
consensus_state.go
plugin/consensus/dpos/consensus_state.go
+8
-8
dpos_msg.proto
plugin/consensus/dpos/proto/dpos_msg.proto
+8
-0
state_machine.go
plugin/consensus/dpos/state_machine.go
+59
-82
state_machine_test.go
plugin/consensus/dpos/state_machine_test.go
+9
-9
dpos_msg.pb.go
plugin/consensus/dpos/types/dpos_msg.pb.go
+88
-36
genesis_test.go
plugin/consensus/dpos/types/genesis_test.go
+120
-0
msg.go
plugin/consensus/dpos/types/msg.go
+1
-0
priv_validator.go
plugin/consensus/dpos/types/priv_validator.go
+22
-24
priv_validator_test.go
plugin/consensus/dpos/types/priv_validator_test.go
+310
-0
No files found.
plugin/consensus/dpos/consensus_state.go
View file @
4f86f81b
...
...
@@ -291,7 +291,7 @@ func (cs *ConsensusState) handleMsg(mi MsgInfo) {
cs
.
dposState
.
recvNotify
(
cs
,
msg
)
case
*
dpostype
.
DPosVoteReply
:
cs
.
dposState
.
recvVoteReply
(
cs
,
msg
)
case
*
d
ty
.
Dp
osCBInfo
:
case
*
d
postype
.
DP
osCBInfo
:
cs
.
dposState
.
recvCBInfo
(
cs
,
msg
)
default
:
dposlog
.
Error
(
"Unknown msg type"
,
"msg"
,
msg
.
String
(),
"peerid"
,
peerID
,
"peerip"
,
peerIP
)
...
...
@@ -602,14 +602,14 @@ func (cs *ConsensusState) Init() {
// InitCycleBoundaryInfo method
func
(
cs
*
ConsensusState
)
InitCycleBoundaryInfo
(
task
Task
){
info
,
err
:=
cs
.
QueryCycleBoundaryInfo
(
task
.
c
ycle
)
info
,
err
:=
cs
.
QueryCycleBoundaryInfo
(
task
.
C
ycle
)
if
err
==
nil
&&
info
!=
nil
{
//cs.cycleBoundaryMap[task.cycle] = info
cs
.
UpdateCBInfo
(
info
)
return
}
info
,
err
=
cs
.
QueryCycleBoundaryInfo
(
task
.
c
ycle
-
1
)
info
,
err
=
cs
.
QueryCycleBoundaryInfo
(
task
.
C
ycle
-
1
)
if
err
==
nil
&&
info
!=
nil
{
//cs.cycleBoundaryMap[task.cycle] = info
cs
.
UpdateCBInfo
(
info
)
...
...
@@ -737,7 +737,7 @@ func (cs *ConsensusState) SendCBTx(info *dty.DposCBInfo) bool {
dposlog
.
Error
(
"SignCBInfo failed."
,
"err"
,
err
)
return
false
}
else
{
info
.
Signature
=
sig
info
.
Signature
=
hex
.
EncodeToString
(
sig
.
Bytes
())
tx
,
err
:=
cs
.
client
.
CreateRecordCBTx
(
info
)
if
err
!=
nil
{
dposlog
.
Error
(
"CreateRecordCBTx failed."
,
"err"
,
err
)
...
...
@@ -824,14 +824,14 @@ func (cs *ConsensusState) QueryVrf(pubkey []byte, cycle int64) (info *dty.VrfInf
// InitCycleVrfInfo method
func
(
cs
*
ConsensusState
)
InitCycleVrfInfo
(
task
Task
){
info
,
err
:=
cs
.
QueryVrf
(
cs
.
privValidator
.
GetPubKey
()
.
Bytes
(),
task
.
c
ycle
)
info
,
err
:=
cs
.
QueryVrf
(
cs
.
privValidator
.
GetPubKey
()
.
Bytes
(),
task
.
C
ycle
)
if
err
==
nil
&&
info
!=
nil
{
//cs.cycleBoundaryMap[task.cycle] = info
cs
.
UpdateVrfInfo
(
info
)
return
}
info
,
err
=
cs
.
QueryVrf
(
cs
.
privValidator
.
GetPubKey
()
.
Bytes
(),
task
.
c
ycle
-
1
)
info
,
err
=
cs
.
QueryVrf
(
cs
.
privValidator
.
GetPubKey
()
.
Bytes
(),
task
.
C
ycle
-
1
)
if
err
==
nil
&&
info
!=
nil
{
//cs.cycleBoundaryMap[task.cycle] = info
cs
.
UpdateVrfInfo
(
info
)
...
...
@@ -909,10 +909,10 @@ func (cs *ConsensusState) QueryVrfs(set *ttypes.ValidatorSet, cycle int64) (info
// InitCycleVrfInfo method
func
(
cs
*
ConsensusState
)
InitCycleVrfInfos
(
task
Task
){
infos
,
err
:=
cs
.
QueryVrfs
(
cs
.
validatorMgr
.
Validators
,
task
.
c
ycle
-
1
)
infos
,
err
:=
cs
.
QueryVrfs
(
cs
.
validatorMgr
.
Validators
,
task
.
C
ycle
-
1
)
if
err
==
nil
&&
infos
!=
nil
{
//cs.cycleBoundaryMap[task.cycle] = info
cs
.
UpdateVrfInfos
(
task
.
c
ycle
,
infos
)
cs
.
UpdateVrfInfos
(
task
.
C
ycle
,
infos
)
}
return
...
...
plugin/consensus/dpos/proto/dpos_msg.proto
View file @
4f86f81b
...
...
@@ -54,3 +54,10 @@ message DPosNotify {
bytes
signature
=
7
;
//通知节点的签名
}
message
DPosCBInfo
{
int64
cycle
=
1
;
int64
stopHeight
=
2
;
string
stopHash
=
3
;
string
pubkey
=
4
;
string
signature
=
5
;
}
\ No newline at end of file
plugin/consensus/dpos/state_machine.go
View file @
4f86f81b
...
...
@@ -50,28 +50,28 @@ var WaitNotifyStateObj = &WaitNofifyState{}
// Task 为计算当前时间所属周期的数据结构
type
Task
struct
{
n
odeID
int64
c
ycle
int64
c
ycleStart
int64
c
ycleStop
int64
p
eriodStart
int64
p
eriodStop
int64
b
lockStart
int64
b
lockStop
int64
N
odeID
int64
C
ycle
int64
C
ycleStart
int64
C
ycleStop
int64
P
eriodStart
int64
P
eriodStop
int64
B
lockStart
int64
B
lockStop
int64
}
// DecideTaskByTime 根据时间戳计算所属的周期,包括cycle周期,负责出块周期,当前出块周期
func
DecideTaskByTime
(
now
int64
)
(
task
Task
)
{
task
.
n
odeID
=
now
%
dposCycle
/
dposPeriod
task
.
c
ycle
=
now
/
dposCycle
task
.
cycleStart
=
now
-
now
%
dposCycle
task
.
cycleStop
=
task
.
c
ycleStart
+
dposCycle
-
1
task
.
N
odeID
=
now
%
dposCycle
/
dposPeriod
task
.
C
ycle
=
now
/
dposCycle
task
.
CycleStart
=
now
-
now
%
dposCycle
task
.
CycleStop
=
task
.
C
ycleStart
+
dposCycle
-
1
task
.
periodStart
=
task
.
cycleStart
+
task
.
nodeID
*
dposBlockInterval
*
dposContinueBlockNum
task
.
periodStop
=
task
.
p
eriodStart
+
dposPeriod
-
1
task
.
PeriodStart
=
task
.
CycleStart
+
task
.
NodeID
*
dposBlockInterval
*
dposContinueBlockNum
task
.
PeriodStop
=
task
.
P
eriodStart
+
dposPeriod
-
1
task
.
blockStart
=
task
.
periodStart
+
now
%
dposCycle
%
dposPeriod
/
dposBlockInterval
*
dposBlockInterval
task
.
blockStop
=
task
.
b
lockStart
+
dposBlockInterval
-
1
task
.
BlockStart
=
task
.
PeriodStart
+
now
%
dposCycle
%
dposPeriod
/
dposBlockInterval
*
dposBlockInterval
task
.
BlockStop
=
task
.
B
lockStart
+
dposBlockInterval
-
1
return
task
}
...
...
@@ -86,24 +86,23 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
//计算当前时间,属于哪一个周期,应该哪一个节点出块,应该出块的高度
task
:=
DecideTaskByTime
(
now
)
cs
.
ShuffleValidators
(
task
.
c
ycle
)
cs
.
ShuffleValidators
(
task
.
C
ycle
)
addr
,
validator
:=
cs
.
validatorMgr
.
GetValidatorByIndex
(
int
(
task
.
n
odeID
))
addr
,
validator
:=
cs
.
validatorMgr
.
GetValidatorByIndex
(
int
(
task
.
N
odeID
))
if
addr
==
nil
&&
validator
==
nil
{
dposlog
.
Error
(
"Address and Validator is nil"
,
"node index"
,
task
.
nodeID
,
"now"
,
now
,
"cycle"
,
dposCycle
,
"period"
,
dposPeriod
)
//cs.scheduleDPosTimeout(time.Duration(timeoutCheckConnections)*time.Millisecond, InitStateType)
dposlog
.
Error
(
"Address and Validator is nil"
,
"node index"
,
task
.
NodeID
,
"now"
,
now
,
"cycle"
,
dposCycle
,
"period"
,
dposPeriod
)
return
nil
}
//生成vote, 对于vote进行签名
voteItem
:=
&
dpostype
.
VoteItem
{
VotedNodeAddress
:
addr
,
VotedNodeIndex
:
int32
(
task
.
n
odeID
),
Cycle
:
task
.
c
ycle
,
CycleStart
:
task
.
c
ycleStart
,
CycleStop
:
task
.
c
ycleStop
,
PeriodStart
:
task
.
p
eriodStart
,
PeriodStop
:
task
.
p
eriodStop
,
VotedNodeIndex
:
int32
(
task
.
N
odeID
),
Cycle
:
task
.
C
ycle
,
CycleStart
:
task
.
C
ycleStart
,
CycleStop
:
task
.
C
ycleStop
,
PeriodStart
:
task
.
P
eriodStart
,
PeriodStop
:
task
.
P
eriodStop
,
Height
:
height
+
1
,
}
cs
.
validatorMgr
.
FillVoteItem
(
voteItem
)
...
...
@@ -133,30 +132,29 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
return
vote
}
func
checkVrf
(
cs
*
ConsensusState
)
{
now
:=
time
.
Now
()
.
Unix
()
task
:=
DecideTaskByTime
(
now
)
middleTime
:=
task
.
cycleStart
+
(
task
.
cycleStop
-
task
.
c
ycleStart
)
/
2
middleTime
:=
task
.
CycleStart
+
(
task
.
CycleStop
-
task
.
C
ycleStart
)
/
2
if
now
<
middleTime
{
info
:=
cs
.
GetVrfInfoByCircle
(
task
.
c
ycle
,
VrfQueryTypeM
)
info
:=
cs
.
GetVrfInfoByCircle
(
task
.
C
ycle
,
VrfQueryTypeM
)
if
info
==
nil
{
vrfM
:=
&
dty
.
DposVrfMRegist
{
Pubkey
:
hex
.
EncodeToString
(
cs
.
privValidator
.
GetPubKey
()
.
Bytes
()),
Cycle
:
task
.
c
ycle
,
Cycle
:
task
.
C
ycle
,
M
:
cs
.
currentVote
.
LastCBInfo
.
StopHash
,
}
cs
.
SendRegistVrfMTx
(
vrfM
)
}
}
else
{
info
:=
cs
.
GetVrfInfoByCircle
(
task
.
c
ycle
,
VrfQueryTypeRP
)
info
:=
cs
.
GetVrfInfoByCircle
(
task
.
C
ycle
,
VrfQueryTypeRP
)
if
info
!=
nil
&&
len
(
info
.
M
)
>
0
&&
(
len
(
info
.
R
)
==
0
||
len
(
info
.
P
)
==
0
){
hash
,
proof
:=
cs
.
VrfEvaluate
(
info
.
M
)
vrfRP
:=
&
dty
.
DposVrfRPRegist
{
Pubkey
:
hex
.
EncodeToString
(
cs
.
privValidator
.
GetPubKey
()
.
Bytes
()),
Cycle
:
task
.
c
ycle
,
Cycle
:
task
.
C
ycle
,
R
:
hex
.
EncodeToString
(
hash
[
:
]),
P
:
hex
.
EncodeToString
(
proof
),
}
...
...
@@ -167,6 +165,17 @@ func checkVrf(cs *ConsensusState) {
}
func
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dpostype
.
DPosCBInfo
)
{
newInfo
:=
&
dty
.
DposCBInfo
{
Cycle
:
info
.
Cycle
,
StopHeight
:
info
.
StopHeight
,
StopHash
:
info
.
StopHash
,
Pubkey
:
info
.
Pubkey
,
Signature
:
info
.
Signature
,
}
cs
.
UpdateCBInfo
(
newInfo
)
}
// State is the base class of dpos state machine, it defines some interfaces.
type
State
interface
{
timeOut
(
cs
*
ConsensusState
)
...
...
@@ -176,8 +185,7 @@ type State interface {
recvVoteReply
(
cs
*
ConsensusState
,
reply
*
dpostype
.
DPosVoteReply
)
sendNotify
(
cs
*
ConsensusState
,
notify
*
dpostype
.
DPosNotify
)
recvNotify
(
cs
*
ConsensusState
,
notify
*
dpostype
.
DPosNotify
)
//sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dty
.
DposCBInfo
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dpostype
.
DPosCBInfo
)
}
// InitState is the initial state of dpos state machine
...
...
@@ -232,7 +240,6 @@ func (init *InitState) sendVote(cs *ConsensusState, vote *dpostype.DPosVote) {
func
(
init
*
InitState
)
recvVote
(
cs
*
ConsensusState
,
vote
*
dpostype
.
DPosVote
)
{
dposlog
.
Info
(
"InitState recvVote ,add it and will handle it later."
)
//cs.AddVotes(vote)
cs
.
CacheVotes
(
vote
)
}
...
...
@@ -255,13 +262,9 @@ func (init *InitState) recvNotify(cs *ConsensusState, notify *dpostype.DPosNotif
cs
.
SetNotify
(
notify
)
}
//func (init *InitState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) {
// dposlog.Info("InitState does not support sendCBInfo,so do nothing")
//}
func
(
init
*
InitState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dty
.
DposCBInfo
)
{
func
(
init
*
InitState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dpostype
.
DPosCBInfo
)
{
dposlog
.
Info
(
"InitState recvCBInfo"
)
cs
.
UpdateCBInfo
(
info
)
recvCBInfo
(
cs
,
info
)
}
// VotingState is the voting state of dpos state machine until timeout or get an agreement by votes.
type
VotingState
struct
{
...
...
@@ -341,7 +344,6 @@ func (voting *VotingState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote)
func
(
voting
*
VotingState
)
sendVoteReply
(
cs
*
ConsensusState
,
reply
*
dpostype
.
DPosVoteReply
)
{
dposlog
.
Info
(
"VotingState don't support sendVoteReply,so do nothing"
)
//cs.broadcastChannel <- MsgInfo{TypeID: dpostype.VoteReplyID, Msg: reply, PeerID: cs.ourID, PeerIP: ""}
}
func
(
voting
*
VotingState
)
recvVoteReply
(
cs
*
ConsensusState
,
reply
*
dpostype
.
DPosVoteReply
)
{
...
...
@@ -357,13 +359,9 @@ func (voting *VotingState) recvNotify(cs *ConsensusState, notify *dpostype.DPosN
dposlog
.
Info
(
"VotingState does not support recvNotify,so do nothing"
)
}
//func (voting *VotingState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) {
// dposlog.Info("VotingState does not support sendCBInfo,so do nothing")
//}
func
(
voting
*
VotingState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dty
.
DposCBInfo
)
{
func
(
voting
*
VotingState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dpostype
.
DPosCBInfo
)
{
dposlog
.
Info
(
"VotingState recvCBInfo"
)
cs
.
UpdateCBInfo
(
info
)
recvCBInfo
(
cs
,
info
)
}
// VotedState is the voted state of dpos state machine after getting an agreement for a period
type
VotedState
struct
{
...
...
@@ -401,7 +399,7 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
}
cs
.
SendCBTx
(
info
)
info2
:=
&
d
ty
.
Dp
osCBInfo
{
info2
:=
&
d
postype
.
DP
osCBInfo
{
Cycle
:
info
.
Cycle
,
StopHeight
:
info
.
StopHeight
,
StopHash
:
info
.
StopHash
,
...
...
@@ -453,18 +451,18 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
}
//当前时间未到节点切换时间,则继续进行出块判断
if
block
.
BlockTime
>=
task
.
b
lockStop
{
if
block
.
BlockTime
>=
task
.
B
lockStop
{
//已出块,或者时间落后了。
dposlog
.
Info
(
"VotedState timeOut but block already is generated."
,
"blocktime"
,
block
.
BlockTime
,
"blockStop"
,
task
.
b
lockStop
,
"now"
,
now
)
dposlog
.
Info
(
"VotedState timeOut but block already is generated."
,
"blocktime"
,
block
.
BlockTime
,
"blockStop"
,
task
.
B
lockStop
,
"now"
,
now
)
cs
.
scheduleDPosTimeout
(
time
.
Second
*
1
,
VotedStateType
)
return
}
else
if
block
.
BlockTime
<
task
.
b
lockStart
{
}
else
if
block
.
BlockTime
<
task
.
B
lockStart
{
//本出块周期尚未出块,则进行出块
if
task
.
b
lockStop
-
now
<=
1
{
if
task
.
B
lockStop
-
now
<=
1
{
dposlog
.
Info
(
"Create new block."
,
"height"
,
block
.
Height
+
1
)
cs
.
client
.
SetBlockTime
(
task
.
b
lockStop
)
cs
.
client
.
SetBlockTime
(
task
.
B
lockStop
)
cs
.
client
.
CreateBlock
()
cs
.
scheduleDPosTimeout
(
time
.
Millisecond
*
500
,
VotedStateType
)
return
...
...
@@ -476,7 +474,7 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
}
else
{
//本周期已经出块
dposlog
.
Info
(
"Wait to next block cycle."
,
"waittime"
,
task
.
blockStop
-
now
+
1
)
dposlog
.
Info
(
"Wait to next block cycle."
,
"waittime"
,
task
.
BlockStop
-
now
+
1
)
//cs.scheduleDPosTimeout(time.Second * time.Duration(task.blockStop-now+1), VotedStateType)
cs
.
scheduleDPosTimeout
(
time
.
Millisecond
*
500
,
VotedStateType
)
...
...
@@ -561,13 +559,13 @@ func (voted *VotedState) recvNotify(cs *ConsensusState, notify *dpostype.DPosNot
}
}
func
(
voted
*
VotedState
)
sendCBInfo
(
cs
*
ConsensusState
,
info
*
d
ty
.
Dp
osCBInfo
)
{
func
(
voted
*
VotedState
)
sendCBInfo
(
cs
*
ConsensusState
,
info
*
d
postype
.
DP
osCBInfo
)
{
cs
.
broadcastChannel
<-
MsgInfo
{
TypeID
:
dpostype
.
CBInfoID
,
Msg
:
info
,
PeerID
:
cs
.
ourID
,
PeerIP
:
""
}
}
func
(
voted
*
VotedState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
d
ty
.
Dp
osCBInfo
)
{
func
(
voted
*
VotedState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
d
postype
.
DP
osCBInfo
)
{
dposlog
.
Info
(
"VotedState recvCBInfo"
)
cs
.
UpdateCBInfo
(
info
)
recvCBInfo
(
cs
,
info
)
}
// WaitNofifyState is the state of dpos state machine to wait notify.
...
...
@@ -588,12 +586,6 @@ func (wait *WaitNofifyState) sendVote(cs *ConsensusState, vote *dpostype.DPosVot
func
(
wait
*
WaitNofifyState
)
recvVote
(
cs
*
ConsensusState
,
vote
*
dpostype
.
DPosVote
)
{
dposlog
.
Info
(
"WaitNofifyState recvVote,store it."
)
//对于vote进行保存,在后续状态中进行处理。 保存的选票有先后,同一个节点发来的最新的选票被保存。
//if !cs.VerifyVote(vote) {
// dposlog.Info("VotingState verify vote failed", "vote", vote.String())
// return
//}
//cs.AddVotes(vote)
cs
.
CacheVotes
(
vote
)
}
...
...
@@ -649,32 +641,16 @@ func (wait *WaitNofifyState) recvNotify(cs *ConsensusState, notify *dpostype.DPo
hint
.
Stop
()
}
/*
info := &dty.DposCBInfo{
Cycle: notify.Vote.Cycle,
StopHeight: notify.HeightStop,
StopHash: hex.EncodeToString(notify.HashStop),
}
cs.UpdateCBInfo(info)
*/
cs
.
ClearCachedNotify
()
cs
.
SaveNotify
()
cs
.
SetNotify
(
notify
)
//cs.clearVotes()
cs
.
SetState
(
InitStateObj
)
dposlog
.
Info
(
"Change state because recv notify."
,
"from"
,
"WaitNofifyState"
,
"to"
,
"InitState"
)
cs
.
dposState
.
timeOut
(
cs
)
//cs.scheduleDPosTimeout(time.Second * 1, InitStateType)
}
//func (wait *WaitNofifyState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) {
// dposlog.Info("WaitNofifyState does not support sendCBInfo,so do nothing")
//}
func
(
wait
*
WaitNofifyState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dty
.
DposCBInfo
)
{
func
(
wait
*
WaitNofifyState
)
recvCBInfo
(
cs
*
ConsensusState
,
info
*
dpostype
.
DPosCBInfo
)
{
dposlog
.
Info
(
"WaitNofifyState recvCBInfo"
)
cs
.
UpdateCBInfo
(
info
)
recvCBInfo
(
cs
,
info
)
}
\ No newline at end of file
plugin/consensus/dpos/state_machine_test.go
View file @
4f86f81b
...
...
@@ -29,17 +29,17 @@ func setParams(delegateNum int64, blockInterval int64, continueBlockNum int64) {
func
printTask
(
now
int64
,
task
*
Task
)
{
fmt
.
Printf
(
"now:%v|cycleStart:%v|cycleStop:%v|periodStart:%v|periodStop:%v|blockStart:%v|blockStop:%v|nodeId:%v
\n
"
,
now
,
task
.
c
ycleStart
,
task
.
c
ycleStop
,
task
.
p
eriodStart
,
task
.
p
eriodStop
,
task
.
b
lockStart
,
task
.
b
lockStop
,
task
.
n
odeID
)
task
.
C
ycleStart
,
task
.
C
ycleStop
,
task
.
P
eriodStart
,
task
.
P
eriodStop
,
task
.
B
lockStart
,
task
.
B
lockStop
,
task
.
N
odeID
)
}
func
assertTask
(
task
*
Task
,
t
*
testing
.
T
)
{
assert
.
Equal
(
t
,
true
,
task
.
nodeID
>=
0
&&
task
.
n
odeID
<
dposDelegateNum
)
assert
.
Equal
(
t
,
true
,
task
.
cycleStart
<=
task
.
periodStart
&&
task
.
periodStart
<=
task
.
blockStart
&&
task
.
blockStop
<=
task
.
periodStop
&&
task
.
periodStop
<=
task
.
c
ycleStop
)
assert
.
Equal
(
t
,
true
,
task
.
NodeID
>=
0
&&
task
.
N
odeID
<
dposDelegateNum
)
assert
.
Equal
(
t
,
true
,
task
.
CycleStart
<=
task
.
PeriodStart
&&
task
.
PeriodStart
<=
task
.
BlockStart
&&
task
.
BlockStop
<=
task
.
PeriodStop
&&
task
.
PeriodStop
<=
task
.
C
ycleStop
)
}
func
TestDecideTaskByTime
(
t
*
testing
.
T
)
{
...
...
plugin/consensus/dpos/types/dpos_msg.pb.go
View file @
4f86f81b
...
...
@@ -14,6 +14,7 @@ It has these top-level messages:
DPosVote
DPosVoteReply
DPosNotify
DPosCBInfo
*/
package
types
...
...
@@ -338,6 +339,54 @@ func (m *DPosNotify) GetSignature() []byte {
return
nil
}
type
DPosCBInfo
struct
{
Cycle
int64
`protobuf:"varint,1,opt,name=cycle" json:"cycle,omitempty"`
StopHeight
int64
`protobuf:"varint,2,opt,name=stopHeight" json:"stopHeight,omitempty"`
StopHash
string
`protobuf:"bytes,3,opt,name=stopHash" json:"stopHash,omitempty"`
Pubkey
string
`protobuf:"bytes,4,opt,name=pubkey" json:"pubkey,omitempty"`
Signature
string
`protobuf:"bytes,5,opt,name=signature" json:"signature,omitempty"`
}
func
(
m
*
DPosCBInfo
)
Reset
()
{
*
m
=
DPosCBInfo
{}
}
func
(
m
*
DPosCBInfo
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
DPosCBInfo
)
ProtoMessage
()
{}
func
(
*
DPosCBInfo
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor0
,
[]
int
{
6
}
}
func
(
m
*
DPosCBInfo
)
GetCycle
()
int64
{
if
m
!=
nil
{
return
m
.
Cycle
}
return
0
}
func
(
m
*
DPosCBInfo
)
GetStopHeight
()
int64
{
if
m
!=
nil
{
return
m
.
StopHeight
}
return
0
}
func
(
m
*
DPosCBInfo
)
GetStopHash
()
string
{
if
m
!=
nil
{
return
m
.
StopHash
}
return
""
}
func
(
m
*
DPosCBInfo
)
GetPubkey
()
string
{
if
m
!=
nil
{
return
m
.
Pubkey
}
return
""
}
func
(
m
*
DPosCBInfo
)
GetSignature
()
string
{
if
m
!=
nil
{
return
m
.
Signature
}
return
""
}
func
init
()
{
proto
.
RegisterType
((
*
CycleBoundaryInfo
)(
nil
),
"types.CycleBoundaryInfo"
)
proto
.
RegisterType
((
*
SuperNode
)(
nil
),
"types.SuperNode"
)
...
...
@@ -345,45 +394,48 @@ func init() {
proto
.
RegisterType
((
*
DPosVote
)(
nil
),
"types.DPosVote"
)
proto
.
RegisterType
((
*
DPosVoteReply
)(
nil
),
"types.DPosVoteReply"
)
proto
.
RegisterType
((
*
DPosNotify
)(
nil
),
"types.DPosNotify"
)
proto
.
RegisterType
((
*
DPosCBInfo
)(
nil
),
"types.DPosCBInfo"
)
}
func
init
()
{
proto
.
RegisterFile
(
"dpos_msg.proto"
,
fileDescriptor0
)
}
var
fileDescriptor0
=
[]
byte
{
// 558 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0x74
,
0x54
,
0xdd
,
0x8a
,
0x13
,
0x31
,
0x14
,
0xa6
,
0x3b
,
0xfd
,
0x3d
,
0xfd
,
0xd9
,
0xdd
,
0x20
,
0x12
,
0x44
,
0xa4
,
0x8c
,
0x22
,
0x45
,
0xa5
,
0x48
,
0x15
,
0x11
,
0xc1
,
0x0b
,
0x77
,
0xf7
,
0xc2
,
0x22
,
0x2c
,
0x32
,
0xbb
,
0xf4
,
0x56
,
0xb2
,
0x3b
,
0x69
,
0x67
,
0xa0
,
0x6d
,
0x42
,
0x92
,
0x16
,
0xe7
,
0x21
,
0x7c
,
0x0d
,
0x5f
,
0xc7
,
0x57
,
0x92
,
0x9c
,
0xcc
,
0x4c
,
0xa6
,
0x53
,
0x7a
,
0x37
,
0xdf
,
0x77
,
0x7e
,
0x92
,
0xf3
,
0x9d
,
0x2f
,
0x03
,
0xa3
,
0x58
,
0x0a
,
0xfd
,
0x6b
,
0xa3
,
0x57
,
0x53
,
0xa9
,
0x84
,
0x11
,
0xa4
,
0x65
,
0x32
,
0xc9
,
0x75
,
0xc8
,
0xe1
,
0xf2
,
0x3a
,
0x7b
,
0x5c
,
0xf3
,
0x2b
,
0xb1
,
0xdb
,
0xc6
,
0x4c
,
0x65
,
0xf3
,
0xed
,
0x52
,
0x90
,
0x27
,
0xd0
,
0x7a
,
0xb4
,
0x24
,
0x6d
,
0x8c
,
0x1b
,
0x93
,
0x20
,
0x72
,
0x80
,
0xbc
,
0x00
,
0xd0
,
0x46
,
0xc8
,
0xef
,
0x3c
,
0x5d
,
0x25
,
0x86
,
0x9e
,
0x61
,
0xa8
,
0xc2
,
0x90
,
0x67
,
0xd0
,
0x45
,
0xc4
,
0x74
,
0x42
,
0x83
,
0x71
,
0x63
,
0xd2
,
0x8b
,
0x4a
,
0x1c
,
0x7e
,
0x85
,
0xde
,
0xdd
,
0x4e
,
0x72
,
0x75
,
0x2b
,
0x62
,
0x4e
,
0x28
,
0x74
,
0x58
,
0x1c
,
0x2b
,
0xae
,
0x35
,
0x1e
,
0x30
,
0x88
,
0x0a
,
0x48
,
0x9e
,
0x42
,
0x5b
,
0xee
,
0x1e
,
0x7e
,
0xf0
,
0x0c
,
0xdb
,
0x0f
,
0xa2
,
0x1c
,
0x85
,
0x7f
,
0x9b
,
0xd0
,
0x5d
,
0x08
,
0xc3
,
0xe7
,
0x86
,
0x6f
,
0xc8
,
0x6b
,
0x18
,
0xed
,
0x85
,
0xe1
,
0xb1
,
0xed
,
0x35
,
0xdf
,
0xc6
,
0xfc
,
0x37
,
0x76
,
0x69
,
0x45
,
0x35
,
0x96
,
0xbc
,
0x81
,
0x8b
,
0x92
,
0xf9
,
0x96
,
0x9f
,
0xe7
,
0xda
,
0x1e
,
0xf1
,
0x7e
,
0xe2
,
0xa0
,
0x36
,
0x31
,
0x7e
,
0xdc
,
0x19
,
0xa6
,
0x0c
,
0x6d
,
0xba
,
0x89
,
0x3d
,
0x43
,
0x9e
,
0x43
,
0x2f
,
0x47
,
0x42
,
0xd2
,
0x16
,
0x86
,
0x3d
,
0x41
,
0xc6
,
0xd0
,
0x97
,
0x5c
,
0xa5
,
0x22
,
0x76
,
0xe5
,
0x6d
,
0x8c
,
0x57
,
0x29
,
0xdb
,
0xbf
,
0x80
,
0x42
,
0xd2
,
0x8e
,
0xeb
,
0xef
,
0x19
,
0x2b
,
0x47
,
0xe2
,
0xd4
,
0xee
,
0x62
,
0x2c
,
0x47
,
0x96
,
0xb7
,
0x13
,
0xcc
,
0x6f
,
0x68
,
0xcf
,
0xc9
,
0xe4
,
0x10
,
0xf9
,
0x0c
,
0xb0
,
0x66
,
0xda
,
0x5c
,
0x5f
,
0xd9
,
0x2d
,
0x52
,
0x18
,
0x37
,
0x26
,
0xfd
,
0x19
,
0x9d
,
0xe2
,
0xa2
,
0xa7
,
0x47
,
0x5b
,
0x8e
,
0x2a
,
0xb9
,
0xf6
,
0xae
,
0x3a
,
0xd9
,
0x2d
,
0x97
,
0x6b
,
0x7e
,
0x9f
,
0x49
,
0x4e
,
0xfb
,
0xee
,
0xae
,
0x15
,
0x8a
,
0xbc
,
0x07
,
0xd8
,
0xb3
,
0x75
,
0x1a
,
0x33
,
0x23
,
0x94
,
0xa6
,
0x83
,
0x71
,
0x30
,
0xe9
,
0xcf
,
0x2e
,
0xf2
,
0xde
,
0xe5
,
0x6a
,
0xa3
,
0x4a
,
0x0e
,
0xf9
,
0x04
,
0xc3
,
0xbd
,
0x5a
,
0x2e
,
0x7c
,
0xd1
,
0xf0
,
0x44
,
0xd1
,
0x61
,
0x1a
,
0xf9
,
0x02
,
0xe7
,
0x5b
,
0xb1
,
0x38
,
0xa8
,
0x1c
,
0x9d
,
0xa8
,
0xac
,
0x27
,
0x86
,
0xff
,
0x1a
,
0xd0
,
0xbd
,
0xf9
,
0x29
,
0xb4
,
0x35
,
0x0b
,
0x79
,
0x0b
,
0xdd
,
0x7d
,
0x6e
,
0x1a
,
0xb4
,
0x48
,
0x7f
,
0x76
,
0x9e
,
0x77
,
0x28
,
0xbc
,
0x14
,
0x95
,
0x09
,
0xe4
,
0x15
,
0x0c
,
0xed
,
0xf7
,
0x7d
,
0xba
,
0xe1
,
0xda
,
0xb0
,
0x8d
,
0xcc
,
0x0d
,
0x7e
,
0x48
,
0x16
,
0xde
,
0x53
,
0xde
,
0x7b
,
0x81
,
0xf7
,
0x9e
,
0x3a
,
0xf2
,
0x9e
,
0xaa
,
0x7a
,
0xaf
,
0xe9
,
0xbd
,
0x57
,
0xe5
,
0xad
,
0x8b
,
0x74
,
0xba
,
0xda
,
0x32
,
0xb3
,
0x53
,
0x1c
,
0x5d
,
0x34
,
0x88
,
0x3c
,
0x11
,
0x7e
,
0x84
,
0x61
,
0x31
,
0x50
,
0xc4
,
0xe5
,
0x3a
,
0x23
,
0x2f
,
0xa1
,
0x69
,
0x5b
,
0xd4
,
0x26
,
0x2a
,
0x73
,
0x30
,
0x18
,
0xfe
,
0x39
,
0x03
,
0xb0
,
0xd4
,
0xad
,
0x30
,
0xe9
,
0xf2
,
0x54
,
0x4d
,
0xa9
,
0x02
,
0x06
,
0xad
,
0x1b
,
0x9d
,
0xbf
,
0xd0
,
0x8d
,
0xf9
,
0xfb
,
0xf6
,
0x8c
,
0x7d
,
0xdf
,
0x09
,
0xd3
,
0x09
,
0x46
,
0x03
,
0xbc
,
0x66
,
0x89
,
0xc9
,
0xc4
,
0xee
,
0xcc
,
0x1e
,
0xe5
,
0xf5
,
0x73
,
0xcf
,
0xa5
,
0x4e
,
0xfb
,
0x4c
,
0x2f
,
0x61
,
0x0b
,
0x25
,
0xac
,
0xd3
,
0xe4
,
0x1d
,
0x5c
,
0x7a
,
0xaa
,
0x10
,
0xb1
,
0x8d
,
0x07
,
0x1f
,
0x07
,
0x0e
,
0x55
,
0xec
,
0xd4
,
0x54
,
0x7c
,
0x68
,
0xe3
,
0x4f
,
0xef
,
0xc3
,
0xff
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x1d
,
0x49
,
0x1a
,
0xb6
,
0x06
,
0x05
,
0x00
,
0x00
,
// 587 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xac
,
0x54
,
0xdd
,
0x8a
,
0xd3
,
0x4c
,
0x18
,
0x26
,
0x9b
,
0xb6
,
0xdb
,
0xbc
,
0xfd
,
0xd9
,
0xdd
,
0xe1
,
0xe3
,
0x63
,
0x10
,
0x91
,
0x12
,
0x45
,
0x8a
,
0x4a
,
0x91
,
0x2a
,
0x22
,
0x82
,
0x07
,
0xee
,
0xee
,
0x81
,
0x45
,
0x58
,
0x64
,
0x76
,
0xe9
,
0xa9
,
0x64
,
0x37
,
0xd3
,
0x26
,
0xd8
,
0x76
,
0x86
,
0x99
,
0x69
,
0x31
,
0x17
,
0xe1
,
0x99
,
0xd7
,
0xe0
,
0xed
,
0x78
,
0x4b
,
0x32
,
0x3f
,
0xc9
,
0xa4
,
0x29
,
0x3d
,
0xf3
,
0x2c
,
0xcf
,
0xf3
,
0xfe
,
0xcc
,
0xbc
,
0xcf
,
0xfb
,
0x64
,
0x60
,
0x98
,
0x72
,
0x26
,
0xbf
,
0xad
,
0xe5
,
0x72
,
0xc2
,
0x05
,
0x53
,
0x0c
,
0xb5
,
0x55
,
0xc1
,
0xa9
,
0x8c
,
0x29
,
0x5c
,
0x5c
,
0x15
,
0x0f
,
0x2b
,
0x7a
,
0xc9
,
0xb6
,
0x9b
,
0x34
,
0x11
,
0xc5
,
0x6c
,
0xb3
,
0x60
,
0xe8
,
0x3f
,
0x68
,
0x3f
,
0x68
,
0x12
,
0x07
,
0xa3
,
0x60
,
0x1c
,
0x12
,
0x0b
,
0xd0
,
0x13
,
0x00
,
0xa9
,
0x18
,
0xff
,
0x4c
,
0xf3
,
0x65
,
0xa6
,
0xf0
,
0x89
,
0x09
,
0xd5
,
0x18
,
0xf4
,
0x08
,
0xba
,
0x06
,
0x25
,
0x32
,
0xc3
,
0xe1
,
0x28
,
0x18
,
0x47
,
0xa4
,
0xc2
,
0xf1
,
0x47
,
0x88
,
0x6e
,
0xb7
,
0x9c
,
0x8a
,
0x1b
,
0x96
,
0x52
,
0x84
,
0xe1
,
0x34
,
0x49
,
0x53
,
0x41
,
0xa5
,
0x34
,
0x07
,
0xf4
,
0x49
,
0x09
,
0xd1
,
0xff
,
0xd0
,
0xe1
,
0xdb
,
0xfb
,
0x2f
,
0xb4
,
0x30
,
0xed
,
0xfb
,
0xc4
,
0xa1
,
0xf8
,
0x77
,
0x0b
,
0xba
,
0x73
,
0xa6
,
0xe8
,
0x4c
,
0xd1
,
0x35
,
0x7a
,
0x0e
,
0xc3
,
0x1d
,
0x53
,
0x34
,
0xd5
,
0xbd
,
0x66
,
0x9b
,
0x94
,
0xfe
,
0x30
,
0x5d
,
0xda
,
0xa4
,
0xc1
,
0xa2
,
0x17
,
0x70
,
0x5e
,
0x31
,
0x9f
,
0xdc
,
0x79
,
0xb6
,
0xed
,
0x01
,
0xef
,
0x27
,
0x0e
,
0x1b
,
0x13
,
0x9b
,
0x8f
,
0x5b
,
0x95
,
0x08
,
0x85
,
0x5b
,
0x76
,
0x62
,
0xcf
,
0xa0
,
0xc7
,
0x10
,
0x39
,
0xc4
,
0x38
,
0x6e
,
0x9b
,
0xb0
,
0x27
,
0xd0
,
0x08
,
0x7a
,
0x9c
,
0x8a
,
0x9c
,
0xa5
,
0xb6
,
0xbc
,
0x63
,
0xe2
,
0x75
,
0x4a
,
0xf7
,
0x2f
,
0x21
,
0xe3
,
0xf8
,
0xd4
,
0xf6
,
0xf7
,
0x8c
,
0x96
,
0x23
,
0xb3
,
0x6a
,
0x77
,
0x4d
,
0xcc
,
0x21
,
0xcd
,
0xeb
,
0x09
,
0x66
,
0xd7
,
0x38
,
0xb2
,
0x32
,
0x59
,
0x84
,
0xde
,
0x03
,
0xac
,
0x12
,
0xa9
,
0xae
,
0x2e
,
0xf5
,
0x16
,
0x31
,
0x8c
,
0x82
,
0x71
,
0x6f
,
0x8a
,
0x27
,
0x66
,
0xd1
,
0x93
,
0x83
,
0x2d
,
0x93
,
0x5a
,
0xae
,
0xbe
,
0xab
,
0xcc
,
0xb6
,
0x8b
,
0xc5
,
0x8a
,
0xde
,
0x15
,
0x9c
,
0xe2
,
0x9e
,
0xbd
,
0x6b
,
0x8d
,
0x42
,
0xaf
,
0x01
,
0x76
,
0xc9
,
0x2a
,
0x4f
,
0x13
,
0xc5
,
0x84
,
0xc4
,
0xfd
,
0x51
,
0x38
,
0xee
,
0x4d
,
0xcf
,
0x5d
,
0xef
,
0x6a
,
0xb5
,
0xa4
,
0x96
,
0x83
,
0xde
,
0xc1
,
0x60
,
0x27
,
0x16
,
0x73
,
0x5f
,
0x34
,
0x38
,
0x52
,
0xb4
,
0x9f
,
0x86
,
0x3e
,
0xc0
,
0xd9
,
0x86
,
0xcd
,
0xf7
,
0x2a
,
0x87
,
0x47
,
0x2a
,
0x9b
,
0x89
,
0xf1
,
0x9f
,
0x00
,
0xba
,
0xd7
,
0x5f
,
0x99
,
0xd4
,
0x66
,
0x41
,
0x2f
,
0xa1
,
0xbb
,
0x73
,
0xa6
,
0x31
,
0x16
,
0xe9
,
0x4d
,
0xcf
,
0x5c
,
0x87
,
0xd2
,
0x4b
,
0xa4
,
0x4a
,
0x40
,
0xcf
,
0x60
,
0xa0
,
0xbf
,
0xef
,
0xf2
,
0x35
,
0x95
,
0x2a
,
0x59
,
0x73
,
0x67
,
0xf0
,
0x7d
,
0xb2
,
0xf4
,
0x9e
,
0xf0
,
0xde
,
0x0b
,
0xbd
,
0xf7
,
0xc4
,
0x81
,
0xf7
,
0x44
,
0xdd
,
0x7b
,
0x2d
,
0xef
,
0xbd
,
0x3a
,
0xaf
,
0x5d
,
0x24
,
0xf3
,
0xe5
,
0x26
,
0x51
,
0x5b
,
0x41
,
0x8d
,
0x8b
,
0xfa
,
0xc4
,
0x13
,
0xf1
,
0x5b
,
0x18
,
0x94
,
0x03
,
0x11
,
0xca
,
0x57
,
0x05
,
0x7a
,
0x0a
,
0x2d
,
0xdd
,
0xa2
,
0x31
,
0x51
,
0x95
,
0x63
,
0x82
,
0xf1
,
0xcf
,
0x13
,
0x00
,
0x4d
,
0xdd
,
0x30
,
0x95
,
0x2f
,
0x8e
,
0xd5
,
0x54
,
0x2a
,
0x98
,
0xa0
,
0x76
,
0xa3
,
0xf5
,
0x97
,
0x71
,
0xa3
,
0xfb
,
0xbf
,
0x3d
,
0xa3
,
0xff
,
0xef
,
0x2c
,
0x91
,
0x99
,
0x89
,
0x86
,
0xe6
,
0x9a
,
0x15
,
0x46
,
0x63
,
0xbd
,
0x33
,
0x7d
,
0x94
,
0xd7
,
0xcf
,
0xfe
,
0x2e
,
0x4d
,
0xda
,
0x67
,
0x7a
,
0x09
,
0xdb
,
0x46
,
0xc2
,
0x26
,
0x8d
,
0x5e
,
0xc1
,
0x85
,
0xa7
,
0x4a
,
0x11
,
0x3b
,
0xe6
,
0xe0
,
0xc3
,
0xc0
,
0xbe
,
0x8a
,
0xa7
,
0x4d
,
0x15
,
0x7f
,
0x05
,
0x56
,
0x0f
,
0x67
,
0xf7
,
0x7f
,
0xfe
,
0xc0
,
0xb9
,
0x97
,
0xeb
,
0x3b
,
0x2d
,
0xcc
,
0xdc
,
0x11
,
0x71
,
0xe8
,
0x70
,
0xb9
,
0x51
,
0xed
,
0x5a
,
0xf7
,
0x1d
,
0xf3
,
0x16
,
0xbf
,
0xf9
,
0x1b
,
0x00
,
0x00
,
0xff
,
0xff
,
0xea
,
0x85
,
0x23
,
0x04
,
0x9d
,
0x05
,
0x00
,
0x00
,
}
plugin/consensus/dpos/types/genesis_test.go
0 → 100644
View file @
4f86f81b
package
types
import
(
"bytes"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"os"
"testing"
)
const
(
err_genesis_file
=
`{"genesis_time:"2018-08-16T15:38:56.951569432+08:00","chain_id":"chain33-Z2cgFj","validators":[{"pub_key":{"type":"secp256k1","data":"03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4"},"name":""},{"pub_key":{"type":"secp256k1","data":"027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3"},"name":""},{"pub_key":{"type":"secp256k1","data":"03F4AB6659E61E8512C9A24AC385CC1AC4D52B87D10ADBDF060086EA82BE62CDDE"},"name":""}],"app_hash":null}`
genesis_file
=
`{"genesis_time":"2018-08-16T15:38:56.951569432+08:00","chain_id":"chain33-Z2cgFj","validators":[{"pub_key":{"type":"secp256k1","data":"03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4"},"name":""},{"pub_key":{"type":"secp256k1","data":"027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3"},"name":""},{"pub_key":{"type":"secp256k1","data":"03F4AB6659E61E8512C9A24AC385CC1AC4D52B87D10ADBDF060086EA82BE62CDDE"},"name":""}],"app_hash":null}`
)
func
init
(){
//为了使用VRF,需要使用SECP256K1体系的公私钥
cr
,
err
:=
crypto
.
New
(
types
.
GetSignName
(
""
,
types
.
SECP256K1
))
if
err
!=
nil
{
panic
(
"init ConsensusCrypto failed."
)
return
}
ConsensusCrypto
=
cr
}
func
TestGenesisDocFromFile
(
t
*
testing
.
T
)
{
genDoc
,
err
:=
GenesisDocFromFile
(
"./genesis.json"
)
require
.
NotNil
(
t
,
err
)
require
.
Nil
(
t
,
genDoc
)
genDoc
,
err
=
GenesisDocFromFile
(
"../genesis.json"
)
require
.
NotNil
(
t
,
genDoc
)
require
.
Nil
(
t
,
err
)
}
func
TestGenesisDocFromJSON
(
t
*
testing
.
T
)
{
genDoc
,
err
:=
GenesisDocFromJSON
([]
byte
(
genesis_file
))
require
.
NotNil
(
t
,
genDoc
)
require
.
Nil
(
t
,
err
)
assert
.
True
(
t
,
genDoc
.
ChainID
==
"chain33-Z2cgFj"
)
assert
.
True
(
t
,
genDoc
.
AppHash
==
nil
)
assert
.
True
(
t
,
len
(
genDoc
.
Validators
)
==
3
)
genDoc
,
err
=
GenesisDocFromJSON
([]
byte
(
err_genesis_file
))
require
.
NotNil
(
t
,
err
)
require
.
Nil
(
t
,
genDoc
)
}
func
TestSaveAs
(
t
*
testing
.
T
)
{
genDoc
,
err
:=
GenesisDocFromJSON
([]
byte
(
genesis_file
))
require
.
NotNil
(
t
,
genDoc
)
require
.
Nil
(
t
,
err
)
assert
.
True
(
t
,
genDoc
.
ChainID
==
"chain33-Z2cgFj"
)
assert
.
True
(
t
,
genDoc
.
AppHash
==
nil
)
assert
.
True
(
t
,
len
(
genDoc
.
Validators
)
==
3
)
err
=
genDoc
.
SaveAs
(
"./tmp_genesis.json"
)
require
.
Nil
(
t
,
err
)
genDoc2
,
err
:=
GenesisDocFromFile
(
"./tmp_genesis.json"
)
require
.
NotNil
(
t
,
genDoc2
)
require
.
Nil
(
t
,
err
)
assert
.
True
(
t
,
genDoc
.
ChainID
==
genDoc2
.
ChainID
)
assert
.
True
(
t
,
genDoc
.
GenesisTime
==
genDoc2
.
GenesisTime
)
assert
.
True
(
t
,
bytes
.
Equal
(
genDoc
.
AppHash
,
genDoc2
.
AppHash
))
assert
.
True
(
t
,
genDoc
.
Validators
[
0
]
.
Name
==
genDoc2
.
Validators
[
0
]
.
Name
)
assert
.
True
(
t
,
genDoc
.
Validators
[
0
]
.
PubKey
.
Data
==
genDoc2
.
Validators
[
0
]
.
PubKey
.
Data
)
assert
.
True
(
t
,
genDoc
.
Validators
[
0
]
.
PubKey
.
Kind
==
genDoc2
.
Validators
[
0
]
.
PubKey
.
Kind
)
assert
.
True
(
t
,
genDoc
.
Validators
[
1
]
.
Name
==
genDoc2
.
Validators
[
1
]
.
Name
)
assert
.
True
(
t
,
genDoc
.
Validators
[
1
]
.
PubKey
.
Data
==
genDoc2
.
Validators
[
1
]
.
PubKey
.
Data
)
assert
.
True
(
t
,
genDoc
.
Validators
[
1
]
.
PubKey
.
Kind
==
genDoc2
.
Validators
[
1
]
.
PubKey
.
Kind
)
assert
.
True
(
t
,
genDoc
.
Validators
[
2
]
.
Name
==
genDoc2
.
Validators
[
2
]
.
Name
)
assert
.
True
(
t
,
genDoc
.
Validators
[
2
]
.
PubKey
.
Data
==
genDoc2
.
Validators
[
2
]
.
PubKey
.
Data
)
assert
.
True
(
t
,
genDoc
.
Validators
[
2
]
.
PubKey
.
Kind
==
genDoc2
.
Validators
[
2
]
.
PubKey
.
Kind
)
err
=
os
.
Remove
(
"./tmp_genesis.json"
)
require
.
Nil
(
t
,
err
)
}
func
TestValidateAndComplete
(
t
*
testing
.
T
)
{
genDoc
,
err
:=
GenesisDocFromJSON
([]
byte
(
genesis_file
))
require
.
NotNil
(
t
,
genDoc
)
require
.
Nil
(
t
,
err
)
tt
:=
genDoc
.
GenesisTime
setSize
:=
len
(
genDoc
.
Validators
)
err
=
genDoc
.
ValidateAndComplete
()
assert
.
True
(
t
,
tt
==
genDoc
.
GenesisTime
)
require
.
Nil
(
t
,
err
)
assert
.
True
(
t
,
setSize
==
len
(
genDoc
.
Validators
))
vals
:=
genDoc
.
Validators
genDoc
.
Validators
=
nil
err
=
genDoc
.
ValidateAndComplete
()
require
.
NotNil
(
t
,
err
)
genDoc
.
Validators
=
vals
genDoc
.
ChainID
=
""
err
=
genDoc
.
ValidateAndComplete
()
require
.
NotNil
(
t
,
err
)
}
func
TestValidatorHash
(
t
*
testing
.
T
)
{
genDoc
,
err
:=
GenesisDocFromJSON
([]
byte
(
genesis_file
))
require
.
NotNil
(
t
,
genDoc
)
require
.
Nil
(
t
,
err
)
hash
:=
genDoc
.
ValidatorHash
()
assert
.
True
(
t
,
len
(
hash
)
>
0
)
}
\ No newline at end of file
plugin/consensus/dpos/types/msg.go
View file @
4f86f81b
...
...
@@ -32,6 +32,7 @@ func InitMessageMap() {
VoteID
:
reflect
.
TypeOf
(
DPosVote
{}),
VoteReplyID
:
reflect
.
TypeOf
(
DPosVoteReply
{}),
NotifyID
:
reflect
.
TypeOf
(
DPosNotify
{}),
CBInfoID
:
reflect
.
TypeOf
(
DPosCBInfo
{}),
}
}
...
...
plugin/consensus/dpos/types/priv_validator.go
View file @
4f86f81b
...
...
@@ -34,7 +34,7 @@ type PrivValidator interface {
SignVote
(
chainID
string
,
vote
*
Vote
)
error
SignNotify
(
chainID
string
,
notify
*
Notify
)
error
SignMsg
(
msg
[]
byte
)
(
sig
string
,
err
error
)
SignMsg
(
msg
[]
byte
)
(
sig
crypto
.
Signature
,
err
error
)
SignTx
(
tx
*
types
.
Transaction
)
VrfEvaluate
(
input
[]
byte
)
(
hash
[
32
]
byte
,
proof
[]
byte
)
VrfProof
(
pubkey
[]
byte
,
input
[]
byte
,
hash
[
32
]
byte
,
proof
[]
byte
)
bool
...
...
@@ -46,8 +46,8 @@ type PrivValidator interface {
type
PrivValidatorFS
struct
{
Address
string
`json:"address"`
PubKey
KeyText
`json:"pub_key"`
LastSignature
*
KeyText
`json:"last_signature,omitempty"`
// so we dont lose signatures
LastSignBytes
string
`json:"last_signbytes,omitempty"`
// so we dont lose signatures
//
LastSignature *KeyText `json:"last_signature,omitempty"` // so we dont lose signatures
//
LastSignBytes string `json:"last_signbytes,omitempty"` // so we dont lose signatures
// PrivKey should be empty if a Signer other than the default is being used.
PrivKey
KeyText
`json:"priv_key"`
...
...
@@ -57,8 +57,8 @@ type PrivValidatorFS struct {
type
PrivValidatorImp
struct
{
Address
[]
byte
PubKey
crypto
.
PubKey
LastSignature
crypto
.
Signature
LastSignBytes
[]
byte
//
LastSignature crypto.Signature
//
LastSignBytes []byte
// PrivKey should be empty if a Signer other than the default is being used.
PrivKey
crypto
.
PrivKey
...
...
@@ -130,6 +130,7 @@ func PubKeyFromString(pubkeystring string) (crypto.PubKey, error) {
}
// SignatureFromString ...
/*
func SignatureFromString(sigString string) (crypto.Signature, error) {
sigbyte, err := hex.DecodeString(sigString)
if err != nil {
...
...
@@ -141,7 +142,7 @@ func SignatureFromString(sigString string) (crypto.Signature, error) {
}
return sig, nil
}
*/
// GenPrivValidatorImp generates a new validator with randomly generated private key
// and sets the filePath, but does not call Save().
func
GenPrivValidatorImp
(
filePath
string
)
*
PrivValidatorImp
{
...
...
@@ -221,6 +222,7 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidato
}
privValImp
.
PubKey
=
pubKey
/*
if len(privVal.LastSignBytes) != 0 {
tmp, err = hex.DecodeString(privVal.LastSignBytes)
if err != nil {
...
...
@@ -237,7 +239,7 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidato
} else {
privValImp.LastSignature = nil
}
*/
privValImp
.
filePath
=
filePath
privValImp
.
Signer
=
signerFunc
(
privValImp
)
return
privValImp
...
...
@@ -258,10 +260,11 @@ func (pv *PrivValidatorImp) save() {
privValFS
:=
&
PrivValidatorFS
{
Address
:
addr
,
LastSignature
:
nil
,
//
LastSignature: nil,
}
privValFS
.
PrivKey
=
KeyText
{
Kind
:
"secp256k1"
,
Data
:
Fmt
(
"%X"
,
pv
.
PrivKey
.
Bytes
()[
:
])}
privValFS
.
PubKey
=
KeyText
{
Kind
:
"secp256k1"
,
Data
:
pv
.
PubKey
.
KeyString
()}
/*
if len(pv.LastSignBytes) != 0 {
tmp := Fmt("%X", pv.LastSignBytes[:])
privValFS.LastSignBytes = tmp
...
...
@@ -270,6 +273,7 @@ func (pv *PrivValidatorImp) save() {
sig := Fmt("%X", pv.LastSignature.Bytes()[:])
privValFS.LastSignature = &KeyText{Kind: "ed25519", Data: sig}
}
*/
jsonBytes
,
err
:=
json
.
Marshal
(
privValFS
)
if
err
!=
nil
{
// `@; BOOM!!!
...
...
@@ -285,8 +289,8 @@ func (pv *PrivValidatorImp) save() {
// Reset resets all fields in the PrivValidatorFS.
// NOTE: Unsafe!
func
(
pv
*
PrivValidatorImp
)
Reset
()
{
pv
.
LastSignature
=
nil
pv
.
LastSignBytes
=
nil
//
pv.LastSignature = nil
//
pv.LastSignBytes = nil
pv
.
Save
()
}
...
...
@@ -323,21 +327,13 @@ func (pv *PrivValidatorImp) SignNotify(chainID string, notify *Notify) error {
}
// SignCBInfo signs a canonical representation of the DposCBInfo, Implements PrivValidator.
func
(
pv
*
PrivValidatorImp
)
SignMsg
(
msg
[]
byte
)
(
sig
string
,
err
error
)
{
func
(
pv
*
PrivValidatorImp
)
SignMsg
(
msg
[]
byte
)
(
sig
crypto
.
Signature
,
err
error
)
{
pv
.
mtx
.
Lock
()
defer
pv
.
mtx
.
Unlock
()
buf
:=
new
(
bytes
.
Buffer
)
_
,
err
=
buf
.
Write
(
msg
)
if
err
!=
nil
{
return
""
,
errors
.
New
(
Fmt
(
"Error write buffer: %v"
,
err
))
}
signature
:=
pv
.
PrivKey
.
Sign
(
buf
.
Bytes
())
sig
=
hex
.
EncodeToString
(
signature
.
Bytes
())
return
sig
,
nil
signature
:=
pv
.
PrivKey
.
Sign
(
msg
)
//sig = hex.EncodeToString(signature.Bytes())
return
signature
,
nil
}
// SignTx signs a tx, Implements PrivValidator.
func
(
pv
*
PrivValidatorImp
)
SignTx
(
tx
*
types
.
Transaction
){
...
...
@@ -376,12 +372,14 @@ func (pv *PrivValidatorImp) VrfProof(pubkey []byte, input []byte, hash [32]byte,
}
// Persist height/round/step and signature
/*
func (pv *PrivValidatorImp) saveSigned(signBytes []byte, sig crypto.Signature) {
pv
.
LastSignature
=
sig
pv
.
LastSignBytes
=
signBytes
//
pv.LastSignature = sig
//
pv.LastSignBytes = signBytes
pv.save()
}
*/
// String returns a string representation of the PrivValidatorImp.
func
(
pv
*
PrivValidatorImp
)
String
()
string
{
...
...
plugin/consensus/dpos/types/priv_validator_test.go
0 → 100644
View file @
4f86f81b
package
types
import
(
"bytes"
"encoding/hex"
"encoding/json"
"fmt"
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"io"
"os"
"sort"
"strings"
"testing"
"time"
)
const
(
priv_validator_file
=
`{"address":"2FA286246F0222C4FF93210E91AECE0C66723F15","pub_key":{"type":"secp256k1","data":"03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4"},"last_height":1679,"last_round":0,"last_step":3,"last_signature":{"type":"secp256k1","data":"37892A916D6E487ADF90F9E88FE37024597677B6C6FED47444AD582F74144B3D6E4B364EAF16AF03A4E42827B6D3C86415D734A5A6CCA92E114B23EB9265AF09"},"last_signbytes":"7B22636861696E5F6964223A22636861696E33332D5A326367466A222C22766F7465223A7B22626C6F636B5F6964223A7B2268617368223A224F6A657975396B2B4149426A6E4859456739584765356A7A462B673D222C227061727473223A7B2268617368223A6E756C6C2C22746F74616C223A307D7D2C22686569676874223A313637392C22726F756E64223A302C2274696D657374616D70223A22323031382D30382D33315430373A35313A34332E3935395A222C2274797065223A327D7D","priv_key":{"type":"secp256k1","data":"5A6A14DA6F5A42835E529D75D87CC8904544F59EEE5387A37D87EEAD194D7EB2"}}`
strAddr
=
"2FA286246F0222C4FF93210E91AECE0C66723F15"
strPubkey
=
"03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4"
addr1
=
"79F9608B6826762CACCA843E81AE86837ABFFB21"
addr2
=
"3480088E35099CBA75958DAE7A364A8AAD2C1BD0"
addr3
=
"9FF8678DBDA4EAE2F999CBFBCBD8F5F3FC47FBAE"
addr4
=
"70A51AD9777EF1F97250F7E4C156D8637BC7143C"
)
func
init
(){
//为了使用VRF,需要使用SECP256K1体系的公私钥
cr
,
err
:=
crypto
.
New
(
types
.
GetSignName
(
""
,
types
.
SECP256K1
))
if
err
!=
nil
{
panic
(
"init ConsensusCrypto failed."
)
return
}
ConsensusCrypto
=
cr
}
func
save
(
filename
,
filecontent
string
)
{
f
,
err
:=
os
.
Create
(
filename
)
if
err
!=
nil
{
fmt
.
Println
(
"err = "
,
err
)
return
}
defer
f
.
Close
()
n
,
err
:=
f
.
WriteString
(
filecontent
)
if
err
!=
nil
{
fmt
.
Println
(
"err = "
,
err
)
return
}
fmt
.
Println
(
"n="
,
n
,
" contentlen="
,
len
(
filecontent
))
}
func
remove
(
filename
string
)
{
os
.
Remove
(
filename
)
}
func
read
(
filename
string
)
bool
{
f
,
err
:=
os
.
Open
(
filename
)
if
err
!=
nil
{
fmt
.
Println
(
"err="
,
err
)
return
false
}
defer
f
.
Close
()
buf
:=
make
([]
byte
,
1024
*
2
)
_
,
err1
:=
f
.
Read
(
buf
)
if
err1
!=
nil
&&
err1
!=
io
.
EOF
{
fmt
.
Println
(
"err1="
,
err1
)
return
false
}
//fmt.Println("buf=",string(buf[:n]))
return
true
}
func
TestLoadOrGenPrivValidatorFS
(
t
*
testing
.
T
)
{
filename
:=
"./tmp_priv_validator.json"
save
(
filename
,
priv_validator_file
)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
require
.
NotNil
(
t
,
privValidator
)
assert
.
True
(
t
,
strings
.
EqualFold
(
strAddr
,
hex
.
EncodeToString
(
privValidator
.
GetAddress
())))
assert
.
True
(
t
,
strings
.
EqualFold
(
strPubkey
,
hex
.
EncodeToString
(
privValidator
.
GetPubKey
()
.
Bytes
())))
fmt
.
Println
(
privValidator
.
String
())
remove
(
filename
)
}
func
TestGenPrivValidatorImp
(
t
*
testing
.
T
)
{
filename
:=
"tmp_priv_validator2.json"
//save(filename, priv_validator_file)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
require
.
NotNil
(
t
,
privValidator
)
assert
.
True
(
t
,
true
==
read
(
filename
))
remove
(
filename
)
assert
.
True
(
t
,
false
==
read
(
filename
))
privValidator
.
Reset
()
assert
.
True
(
t
,
true
==
read
(
filename
))
assert
.
True
(
t
,
len
(
privValidator
.
GetPubKey
()
.
Bytes
())
>
0
)
assert
.
True
(
t
,
len
(
privValidator
.
GetAddress
())
>
0
)
remove
(
filename
)
}
func
TestPrivValidatorImpSort
(
t
*
testing
.
T
)
{
var
arr
[]
*
PrivValidatorImp
Addr1
,
_
:=
hex
.
DecodeString
(
addr1
)
Addr2
,
_
:=
hex
.
DecodeString
(
addr2
)
Addr3
,
_
:=
hex
.
DecodeString
(
addr3
)
Addr4
,
_
:=
hex
.
DecodeString
(
addr4
)
imp1
:=
&
PrivValidatorImp
{
Address
:
Addr1
,
}
arr
=
append
(
arr
,
imp1
)
imp2
:=
&
PrivValidatorImp
{
Address
:
Addr2
,
}
arr
=
append
(
arr
,
imp2
)
imp3
:=
&
PrivValidatorImp
{
Address
:
Addr3
,
}
arr
=
append
(
arr
,
imp3
)
imp4
:=
&
PrivValidatorImp
{
Address
:
Addr4
,
}
arr
=
append
(
arr
,
imp4
)
sort
.
Sort
(
PrivValidatorsByAddress
(
arr
))
assert
.
True
(
t
,
strings
.
EqualFold
(
addr2
,
hex
.
EncodeToString
(
arr
[
0
]
.
Address
)))
assert
.
True
(
t
,
strings
.
EqualFold
(
addr4
,
hex
.
EncodeToString
(
arr
[
1
]
.
Address
)))
assert
.
True
(
t
,
strings
.
EqualFold
(
addr1
,
hex
.
EncodeToString
(
arr
[
2
]
.
Address
)))
assert
.
True
(
t
,
strings
.
EqualFold
(
addr3
,
hex
.
EncodeToString
(
arr
[
3
]
.
Address
)))
}
func
TestSignAndVerifyVote
(
t
*
testing
.
T
)
{
filename
:=
"./tmp_priv_validator.json"
save
(
filename
,
priv_validator_file
)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
now
:=
time
.
Now
()
.
Unix
()
//task := dpos.DecideTaskByTime(now)
//生成vote, 对于vote进行签名
voteItem
:=
&
VoteItem
{
VotedNodeAddress
:
privValidator
.
Address
,
VotedNodeIndex
:
int32
(
0
),
Cycle
:
100
,
CycleStart
:
18888
,
CycleStop
:
28888
,
PeriodStart
:
20000
,
PeriodStop
:
21000
,
Height
:
100
,
}
encode
,
err
:=
json
.
Marshal
(
voteItem
)
if
err
!=
nil
{
panic
(
"Marshal vote failed."
)
}
voteItem
.
VoteID
=
crypto
.
Ripemd160
(
encode
)
vote
:=
&
Vote
{
DPosVote
:
&
DPosVote
{
VoteItem
:
voteItem
,
VoteTimestamp
:
now
,
VoterNodeAddress
:
privValidator
.
GetAddress
(),
VoterNodeIndex
:
int32
(
0
),
},
}
assert
.
True
(
t
,
0
==
len
(
vote
.
Signature
))
chainID
:=
"test-chain-Ep9EcD"
privValidator
.
SignVote
(
chainID
,
vote
)
assert
.
True
(
t
,
0
<
len
(
vote
.
Signature
))
vote2
:=
vote
.
Copy
()
err
=
vote2
.
Verify
(
chainID
,
privValidator
.
PubKey
)
require
.
Nil
(
t
,
err
)
remove
(
filename
)
privValidator2
:=
LoadOrGenPrivValidatorFS
(
filename
)
require
.
NotNil
(
t
,
privValidator2
)
err
=
vote2
.
Verify
(
chainID
,
privValidator2
.
PubKey
)
require
.
NotNil
(
t
,
err
)
remove
(
filename
)
}
func
TestSignAndVerifyNotify
(
t
*
testing
.
T
)
{
filename
:=
"./tmp_priv_validator.json"
save
(
filename
,
priv_validator_file
)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
now
:=
time
.
Now
()
.
Unix
()
//task := dpos.DecideTaskByTime(now)
//生成vote, 对于vote进行签名
voteItem
:=
&
VoteItem
{
VotedNodeAddress
:
privValidator
.
Address
,
VotedNodeIndex
:
int32
(
0
),
Cycle
:
100
,
CycleStart
:
18888
,
CycleStop
:
28888
,
PeriodStart
:
20000
,
PeriodStop
:
21000
,
Height
:
100
,
}
encode
,
err
:=
json
.
Marshal
(
voteItem
)
if
err
!=
nil
{
panic
(
"Marshal vote failed."
)
}
voteItem
.
VoteID
=
crypto
.
Ripemd160
(
encode
)
chainID
:=
"test-chain-Ep9EcD"
notify
:=
&
Notify
{
DPosNotify
:
&
DPosNotify
{
Vote
:
voteItem
,
HeightStop
:
200
,
HashStop
:
[]
byte
(
"abcdef121212"
),
NotifyTimestamp
:
now
,
NotifyNodeAddress
:
privValidator
.
GetAddress
(),
NotifyNodeIndex
:
int32
(
0
),
},
}
err
=
privValidator
.
SignNotify
(
chainID
,
notify
)
require
.
Nil
(
t
,
err
)
notify2
:=
notify
.
Copy
()
err
=
notify2
.
Verify
(
chainID
,
privValidator
.
PubKey
)
require
.
Nil
(
t
,
err
)
remove
(
filename
)
privValidator2
:=
LoadOrGenPrivValidatorFS
(
filename
)
require
.
NotNil
(
t
,
privValidator2
)
err
=
notify2
.
Verify
(
chainID
,
privValidator2
.
PubKey
)
require
.
NotNil
(
t
,
err
)
remove
(
filename
)
}
func
TestSignMsg
(
t
*
testing
.
T
)
{
filename
:=
"./tmp_priv_validator.json"
save
(
filename
,
priv_validator_file
)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
byteCB
:=
[]
byte
(
"asdfadsasf"
)
sig
,
err
:=
privValidator
.
SignMsg
(
byteCB
)
require
.
Nil
(
t
,
err
)
assert
.
True
(
t
,
0
<
len
(
sig
.
Bytes
()))
remove
(
filename
)
}
func
TestVrf
(
t
*
testing
.
T
)
{
filename
:=
"./tmp_priv_validator.json"
save
(
filename
,
priv_validator_file
)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
input
:=
[]
byte
(
"abcdefghijklmn"
)
hash
,
proof
:=
privValidator
.
VrfEvaluate
(
input
)
assert
.
True
(
t
,
32
==
len
(
hash
))
assert
.
True
(
t
,
0
<
len
(
proof
))
result
:=
privValidator
.
VrfProof
(
privValidator
.
PubKey
.
Bytes
(),
input
,
hash
,
proof
)
assert
.
True
(
t
,
result
)
remove
(
filename
)
}
func
TestSignTx
(
t
*
testing
.
T
)
{
filename
:=
"./tmp_priv_validator.json"
save
(
filename
,
priv_validator_file
)
privValidator
:=
LoadOrGenPrivValidatorFS
(
filename
)
tx
:=
&
types
.
Transaction
{}
privValidator
.
SignTx
(
tx
)
assert
.
True
(
t
,
types
.
SECP256K1
==
tx
.
Signature
.
Ty
)
assert
.
True
(
t
,
bytes
.
Equal
(
privValidator
.
PubKey
.
Bytes
(),
tx
.
Signature
.
Pubkey
))
assert
.
True
(
t
,
0
<
len
(
tx
.
Signature
.
Signature
))
remove
(
filename
)
}
\ No newline at end of file
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