Commit 4f86f81b authored by 张振华's avatar 张振华

update

parent 2cb03695
...@@ -291,7 +291,7 @@ func (cs *ConsensusState) handleMsg(mi MsgInfo) { ...@@ -291,7 +291,7 @@ func (cs *ConsensusState) handleMsg(mi MsgInfo) {
cs.dposState.recvNotify(cs, msg) cs.dposState.recvNotify(cs, msg)
case *dpostype.DPosVoteReply: case *dpostype.DPosVoteReply:
cs.dposState.recvVoteReply(cs, msg) cs.dposState.recvVoteReply(cs, msg)
case *dty.DposCBInfo: case *dpostype.DPosCBInfo:
cs.dposState.recvCBInfo(cs, msg) cs.dposState.recvCBInfo(cs, msg)
default: default:
dposlog.Error("Unknown msg type", "msg", msg.String(), "peerid", peerID, "peerip", peerIP) dposlog.Error("Unknown msg type", "msg", msg.String(), "peerid", peerID, "peerip", peerIP)
...@@ -602,14 +602,14 @@ func (cs *ConsensusState) Init() { ...@@ -602,14 +602,14 @@ func (cs *ConsensusState) Init() {
// InitCycleBoundaryInfo method // InitCycleBoundaryInfo method
func (cs *ConsensusState) InitCycleBoundaryInfo(task Task){ func (cs *ConsensusState) InitCycleBoundaryInfo(task Task){
info, err := cs.QueryCycleBoundaryInfo(task.cycle) info, err := cs.QueryCycleBoundaryInfo(task.Cycle)
if err == nil && info != nil { if err == nil && info != nil {
//cs.cycleBoundaryMap[task.cycle] = info //cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateCBInfo(info) cs.UpdateCBInfo(info)
return return
} }
info, err = cs.QueryCycleBoundaryInfo(task.cycle - 1) info, err = cs.QueryCycleBoundaryInfo(task.Cycle - 1)
if err == nil && info != nil { if err == nil && info != nil {
//cs.cycleBoundaryMap[task.cycle] = info //cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateCBInfo(info) cs.UpdateCBInfo(info)
...@@ -737,7 +737,7 @@ func (cs *ConsensusState) SendCBTx(info *dty.DposCBInfo) bool { ...@@ -737,7 +737,7 @@ func (cs *ConsensusState) SendCBTx(info *dty.DposCBInfo) bool {
dposlog.Error("SignCBInfo failed.", "err", err) dposlog.Error("SignCBInfo failed.", "err", err)
return false return false
} else { } else {
info.Signature = sig info.Signature = hex.EncodeToString(sig.Bytes())
tx, err := cs.client.CreateRecordCBTx(info) tx, err := cs.client.CreateRecordCBTx(info)
if err != nil { if err != nil {
dposlog.Error("CreateRecordCBTx failed.", "err", err) dposlog.Error("CreateRecordCBTx failed.", "err", err)
...@@ -824,14 +824,14 @@ func (cs *ConsensusState) QueryVrf(pubkey []byte, cycle int64) (info *dty.VrfInf ...@@ -824,14 +824,14 @@ func (cs *ConsensusState) QueryVrf(pubkey []byte, cycle int64) (info *dty.VrfInf
// InitCycleVrfInfo method // InitCycleVrfInfo method
func (cs *ConsensusState) InitCycleVrfInfo(task Task){ func (cs *ConsensusState) InitCycleVrfInfo(task Task){
info, err := cs.QueryVrf(cs.privValidator.GetPubKey().Bytes(), task.cycle) info, err := cs.QueryVrf(cs.privValidator.GetPubKey().Bytes(), task.Cycle)
if err == nil && info != nil { if err == nil && info != nil {
//cs.cycleBoundaryMap[task.cycle] = info //cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateVrfInfo(info) cs.UpdateVrfInfo(info)
return return
} }
info, err = cs.QueryVrf(cs.privValidator.GetPubKey().Bytes(), task.cycle - 1) info, err = cs.QueryVrf(cs.privValidator.GetPubKey().Bytes(), task.Cycle - 1)
if err == nil && info != nil { if err == nil && info != nil {
//cs.cycleBoundaryMap[task.cycle] = info //cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateVrfInfo(info) cs.UpdateVrfInfo(info)
...@@ -909,10 +909,10 @@ func (cs *ConsensusState) QueryVrfs(set *ttypes.ValidatorSet, cycle int64) (info ...@@ -909,10 +909,10 @@ func (cs *ConsensusState) QueryVrfs(set *ttypes.ValidatorSet, cycle int64) (info
// InitCycleVrfInfo method // InitCycleVrfInfo method
func (cs *ConsensusState) InitCycleVrfInfos(task Task){ func (cs *ConsensusState) InitCycleVrfInfos(task Task){
infos, err := cs.QueryVrfs(cs.validatorMgr.Validators, task.cycle - 1) infos, err := cs.QueryVrfs(cs.validatorMgr.Validators, task.Cycle - 1)
if err == nil && infos != nil { if err == nil && infos != nil {
//cs.cycleBoundaryMap[task.cycle] = info //cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateVrfInfos(task.cycle, infos) cs.UpdateVrfInfos(task.Cycle, infos)
} }
return return
......
...@@ -54,3 +54,10 @@ message DPosNotify { ...@@ -54,3 +54,10 @@ message DPosNotify {
bytes signature = 7; //通知节点的签名 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
...@@ -50,28 +50,28 @@ var WaitNotifyStateObj = &WaitNofifyState{} ...@@ -50,28 +50,28 @@ var WaitNotifyStateObj = &WaitNofifyState{}
// Task 为计算当前时间所属周期的数据结构 // Task 为计算当前时间所属周期的数据结构
type Task struct { type Task struct {
nodeID int64 NodeID int64
cycle int64 Cycle int64
cycleStart int64 CycleStart int64
cycleStop int64 CycleStop int64
periodStart int64 PeriodStart int64
periodStop int64 PeriodStop int64
blockStart int64 BlockStart int64
blockStop int64 BlockStop int64
} }
// DecideTaskByTime 根据时间戳计算所属的周期,包括cycle周期,负责出块周期,当前出块周期 // DecideTaskByTime 根据时间戳计算所属的周期,包括cycle周期,负责出块周期,当前出块周期
func DecideTaskByTime(now int64) (task Task) { func DecideTaskByTime(now int64) (task Task) {
task.nodeID = now % dposCycle / dposPeriod task.NodeID = now % dposCycle / dposPeriod
task.cycle = now / dposCycle task.Cycle = now / dposCycle
task.cycleStart = now - now%dposCycle task.CycleStart = now - now % dposCycle
task.cycleStop = task.cycleStart + dposCycle - 1 task.CycleStop = task.CycleStart + dposCycle - 1
task.periodStart = task.cycleStart + task.nodeID*dposBlockInterval*dposContinueBlockNum task.PeriodStart = task.CycleStart + task.NodeID * dposBlockInterval * dposContinueBlockNum
task.periodStop = task.periodStart + dposPeriod - 1 task.PeriodStop = task.PeriodStart + dposPeriod - 1
task.blockStart = task.periodStart + now%dposCycle%dposPeriod/dposBlockInterval*dposBlockInterval task.BlockStart = task.PeriodStart + now % dposCycle % dposPeriod/dposBlockInterval * dposBlockInterval
task.blockStop = task.blockStart + dposBlockInterval - 1 task.BlockStop = task.BlockStart + dposBlockInterval - 1
return task return task
} }
...@@ -86,24 +86,23 @@ func generateVote(cs *ConsensusState) *dpostype.Vote { ...@@ -86,24 +86,23 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
//计算当前时间,属于哪一个周期,应该哪一个节点出块,应该出块的高度 //计算当前时间,属于哪一个周期,应该哪一个节点出块,应该出块的高度
task := DecideTaskByTime(now) task := DecideTaskByTime(now)
cs.ShuffleValidators(task.cycle) cs.ShuffleValidators(task.Cycle)
addr, validator := cs.validatorMgr.GetValidatorByIndex(int(task.nodeID)) addr, validator := cs.validatorMgr.GetValidatorByIndex(int(task.NodeID))
if addr == nil && validator == nil { if addr == nil && validator == nil {
dposlog.Error("Address and Validator is nil", "node index", task.nodeID, "now", now, "cycle", dposCycle, "period", dposPeriod) 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)
return nil return nil
} }
//生成vote, 对于vote进行签名 //生成vote, 对于vote进行签名
voteItem := &dpostype.VoteItem{ voteItem := &dpostype.VoteItem{
VotedNodeAddress: addr, VotedNodeAddress: addr,
VotedNodeIndex: int32(task.nodeID), VotedNodeIndex: int32(task.NodeID),
Cycle: task.cycle, Cycle: task.Cycle,
CycleStart: task.cycleStart, CycleStart: task.CycleStart,
CycleStop: task.cycleStop, CycleStop: task.CycleStop,
PeriodStart: task.periodStart, PeriodStart: task.PeriodStart,
PeriodStop: task.periodStop, PeriodStop: task.PeriodStop,
Height: height + 1, Height: height + 1,
} }
cs.validatorMgr.FillVoteItem(voteItem) cs.validatorMgr.FillVoteItem(voteItem)
...@@ -133,30 +132,29 @@ func generateVote(cs *ConsensusState) *dpostype.Vote { ...@@ -133,30 +132,29 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
return vote return vote
} }
func checkVrf(cs *ConsensusState) { func checkVrf(cs *ConsensusState) {
now := time.Now().Unix() now := time.Now().Unix()
task := DecideTaskByTime(now) task := DecideTaskByTime(now)
middleTime := task.cycleStart + (task.cycleStop - task.cycleStart) / 2 middleTime := task.CycleStart + (task.CycleStop - task.CycleStart) / 2
if now < middleTime { if now < middleTime {
info := cs.GetVrfInfoByCircle(task.cycle, VrfQueryTypeM) info := cs.GetVrfInfoByCircle(task.Cycle, VrfQueryTypeM)
if info == nil { if info == nil {
vrfM := &dty.DposVrfMRegist{ vrfM := &dty.DposVrfMRegist{
Pubkey: hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()), Pubkey: hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()),
Cycle: task.cycle, Cycle: task.Cycle,
M: cs.currentVote.LastCBInfo.StopHash, M: cs.currentVote.LastCBInfo.StopHash,
} }
cs.SendRegistVrfMTx(vrfM) cs.SendRegistVrfMTx(vrfM)
} }
} else { } else {
info := cs.GetVrfInfoByCircle(task.cycle, VrfQueryTypeRP) info := cs.GetVrfInfoByCircle(task.Cycle, VrfQueryTypeRP)
if info != nil && len(info.M) > 0 && (len(info.R) == 0 || len(info.P) == 0){ if info != nil && len(info.M) > 0 && (len(info.R) == 0 || len(info.P) == 0){
hash, proof := cs.VrfEvaluate(info.M) hash, proof := cs.VrfEvaluate(info.M)
vrfRP := &dty.DposVrfRPRegist{ vrfRP := &dty.DposVrfRPRegist{
Pubkey: hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()), Pubkey: hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()),
Cycle: task.cycle, Cycle: task.Cycle,
R: hex.EncodeToString(hash[:]), R: hex.EncodeToString(hash[:]),
P: hex.EncodeToString(proof), P: hex.EncodeToString(proof),
} }
...@@ -167,6 +165,17 @@ func checkVrf(cs *ConsensusState) { ...@@ -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. // 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)
...@@ -176,8 +185,7 @@ type State interface { ...@@ -176,8 +185,7 @@ type State interface {
recvVoteReply(cs *ConsensusState, reply *dpostype.DPosVoteReply) recvVoteReply(cs *ConsensusState, reply *dpostype.DPosVoteReply)
sendNotify(cs *ConsensusState, notify *dpostype.DPosNotify) sendNotify(cs *ConsensusState, notify *dpostype.DPosNotify)
recvNotify(cs *ConsensusState, notify *dpostype.DPosNotify) recvNotify(cs *ConsensusState, notify *dpostype.DPosNotify)
//sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo)
recvCBInfo(cs *ConsensusState, info *dty.DposCBInfo)
} }
// InitState is the initial state of dpos state machine // InitState is the initial state of dpos state machine
...@@ -232,7 +240,6 @@ func (init *InitState) sendVote(cs *ConsensusState, vote *dpostype.DPosVote) { ...@@ -232,7 +240,6 @@ func (init *InitState) sendVote(cs *ConsensusState, vote *dpostype.DPosVote) {
func (init *InitState) recvVote(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.") dposlog.Info("InitState recvVote ,add it and will handle it later.")
//cs.AddVotes(vote)
cs.CacheVotes(vote) cs.CacheVotes(vote)
} }
...@@ -255,13 +262,9 @@ func (init *InitState) recvNotify(cs *ConsensusState, notify *dpostype.DPosNotif ...@@ -255,13 +262,9 @@ func (init *InitState) recvNotify(cs *ConsensusState, notify *dpostype.DPosNotif
cs.SetNotify(notify) cs.SetNotify(notify)
} }
//func (init *InitState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) { func (init *InitState) recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
// dposlog.Info("InitState does not support sendCBInfo,so do nothing")
//}
func (init *InitState) recvCBInfo(cs *ConsensusState, info *dty.DposCBInfo) {
dposlog.Info("InitState recvCBInfo") 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. // VotingState is the voting state of dpos state machine until timeout or get an agreement by votes.
type VotingState struct { type VotingState struct {
...@@ -341,7 +344,6 @@ func (voting *VotingState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote) ...@@ -341,7 +344,6 @@ func (voting *VotingState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote)
func (voting *VotingState) sendVoteReply(cs *ConsensusState, reply *dpostype.DPosVoteReply) { func (voting *VotingState) sendVoteReply(cs *ConsensusState, reply *dpostype.DPosVoteReply) {
dposlog.Info("VotingState don't support sendVoteReply,so do nothing") 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) { func (voting *VotingState) recvVoteReply(cs *ConsensusState, reply *dpostype.DPosVoteReply) {
...@@ -357,13 +359,9 @@ func (voting *VotingState) recvNotify(cs *ConsensusState, notify *dpostype.DPosN ...@@ -357,13 +359,9 @@ func (voting *VotingState) recvNotify(cs *ConsensusState, notify *dpostype.DPosN
dposlog.Info("VotingState does not support recvNotify,so do nothing") dposlog.Info("VotingState does not support recvNotify,so do nothing")
} }
//func (voting *VotingState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) { func (voting *VotingState) recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
// dposlog.Info("VotingState does not support sendCBInfo,so do nothing")
//}
func (voting *VotingState) recvCBInfo(cs *ConsensusState, info *dty.DposCBInfo) {
dposlog.Info("VotingState recvCBInfo") 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 // VotedState is the voted state of dpos state machine after getting an agreement for a period
type VotedState struct { type VotedState struct {
...@@ -401,7 +399,7 @@ func (voted *VotedState) timeOut(cs *ConsensusState) { ...@@ -401,7 +399,7 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
} }
cs.SendCBTx(info) cs.SendCBTx(info)
info2 := &dty.DposCBInfo{ info2 := &dpostype.DPosCBInfo{
Cycle: info.Cycle, Cycle: info.Cycle,
StopHeight: info.StopHeight, StopHeight: info.StopHeight,
StopHash: info.StopHash, StopHash: info.StopHash,
...@@ -453,18 +451,18 @@ func (voted *VotedState) timeOut(cs *ConsensusState) { ...@@ -453,18 +451,18 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
} }
//当前时间未到节点切换时间,则继续进行出块判断 //当前时间未到节点切换时间,则继续进行出块判断
if block.BlockTime >= task.blockStop { if block.BlockTime >= task.BlockStop {
//已出块,或者时间落后了。 //已出块,或者时间落后了。
dposlog.Info("VotedState timeOut but block already is generated.", "blocktime", block.BlockTime, "blockStop", task.blockStop, "now", now) dposlog.Info("VotedState timeOut but block already is generated.", "blocktime", block.BlockTime, "blockStop", task.BlockStop, "now", now)
cs.scheduleDPosTimeout(time.Second*1, VotedStateType) cs.scheduleDPosTimeout(time.Second*1, VotedStateType)
return return
} else if block.BlockTime < task.blockStart { } else if block.BlockTime < task.BlockStart {
//本出块周期尚未出块,则进行出块 //本出块周期尚未出块,则进行出块
if task.blockStop - now <= 1 { if task.BlockStop - now <= 1 {
dposlog.Info("Create new block.", "height", block.Height+1) dposlog.Info("Create new block.", "height", block.Height+1)
cs.client.SetBlockTime(task.blockStop) cs.client.SetBlockTime(task.BlockStop)
cs.client.CreateBlock() cs.client.CreateBlock()
cs.scheduleDPosTimeout(time.Millisecond*500, VotedStateType) cs.scheduleDPosTimeout(time.Millisecond*500, VotedStateType)
return return
...@@ -476,7 +474,7 @@ func (voted *VotedState) timeOut(cs *ConsensusState) { ...@@ -476,7 +474,7 @@ func (voted *VotedState) timeOut(cs *ConsensusState) {
} else { } 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.Second * time.Duration(task.blockStop-now+1), VotedStateType)
cs.scheduleDPosTimeout(time.Millisecond*500, VotedStateType) cs.scheduleDPosTimeout(time.Millisecond*500, VotedStateType)
...@@ -561,13 +559,13 @@ func (voted *VotedState) recvNotify(cs *ConsensusState, notify *dpostype.DPosNot ...@@ -561,13 +559,13 @@ func (voted *VotedState) recvNotify(cs *ConsensusState, notify *dpostype.DPosNot
} }
} }
func (voted *VotedState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) { func (voted *VotedState) sendCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
cs.broadcastChannel <- MsgInfo{TypeID: dpostype.CBInfoID, Msg: info, PeerID: cs.ourID, PeerIP: ""} cs.broadcastChannel <- MsgInfo{TypeID: dpostype.CBInfoID, Msg: info, PeerID: cs.ourID, PeerIP: ""}
} }
func (voted *VotedState) recvCBInfo(cs *ConsensusState, info *dty.DposCBInfo) { func (voted *VotedState) recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
dposlog.Info("VotedState recvCBInfo") dposlog.Info("VotedState recvCBInfo")
cs.UpdateCBInfo(info) recvCBInfo(cs, info)
} }
// WaitNofifyState is the state of dpos state machine to wait notify. // WaitNofifyState is the state of dpos state machine to wait notify.
...@@ -588,12 +586,6 @@ func (wait *WaitNofifyState) sendVote(cs *ConsensusState, vote *dpostype.DPosVot ...@@ -588,12 +586,6 @@ func (wait *WaitNofifyState) sendVote(cs *ConsensusState, vote *dpostype.DPosVot
func (wait *WaitNofifyState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote) { func (wait *WaitNofifyState) recvVote(cs *ConsensusState, vote *dpostype.DPosVote) {
dposlog.Info("WaitNofifyState recvVote,store it.") dposlog.Info("WaitNofifyState recvVote,store it.")
//对于vote进行保存,在后续状态中进行处理。 保存的选票有先后,同一个节点发来的最新的选票被保存。 //对于vote进行保存,在后续状态中进行处理。 保存的选票有先后,同一个节点发来的最新的选票被保存。
//if !cs.VerifyVote(vote) {
// dposlog.Info("VotingState verify vote failed", "vote", vote.String())
// return
//}
//cs.AddVotes(vote)
cs.CacheVotes(vote) cs.CacheVotes(vote)
} }
...@@ -649,32 +641,16 @@ func (wait *WaitNofifyState) recvNotify(cs *ConsensusState, notify *dpostype.DPo ...@@ -649,32 +641,16 @@ func (wait *WaitNofifyState) recvNotify(cs *ConsensusState, notify *dpostype.DPo
hint.Stop() hint.Stop()
} }
/*
info := &dty.DposCBInfo{
Cycle: notify.Vote.Cycle,
StopHeight: notify.HeightStop,
StopHash: hex.EncodeToString(notify.HashStop),
}
cs.UpdateCBInfo(info)
*/
cs.ClearCachedNotify() cs.ClearCachedNotify()
cs.SaveNotify() cs.SaveNotify()
cs.SetNotify(notify) cs.SetNotify(notify)
//cs.clearVotes()
cs.SetState(InitStateObj) cs.SetState(InitStateObj)
dposlog.Info("Change state because recv notify.", "from", "WaitNofifyState", "to", "InitState") dposlog.Info("Change state because recv notify.", "from", "WaitNofifyState", "to", "InitState")
cs.dposState.timeOut(cs) cs.dposState.timeOut(cs)
//cs.scheduleDPosTimeout(time.Second * 1, InitStateType)
} }
//func (wait *WaitNofifyState) sendCBInfo(cs *ConsensusState, info *dty.DposCBInfo) { func (wait *WaitNofifyState) recvCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
// dposlog.Info("WaitNofifyState does not support sendCBInfo,so do nothing")
//}
func (wait *WaitNofifyState) recvCBInfo(cs *ConsensusState, info *dty.DposCBInfo) {
dposlog.Info("WaitNofifyState recvCBInfo") dposlog.Info("WaitNofifyState recvCBInfo")
cs.UpdateCBInfo(info) recvCBInfo(cs, info)
} }
\ No newline at end of file
...@@ -29,17 +29,17 @@ func setParams(delegateNum int64, blockInterval int64, continueBlockNum int64) { ...@@ -29,17 +29,17 @@ func setParams(delegateNum int64, blockInterval int64, continueBlockNum int64) {
func printTask(now int64, task *Task) { 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", fmt.Printf("now:%v|cycleStart:%v|cycleStop:%v|periodStart:%v|periodStop:%v|blockStart:%v|blockStop:%v|nodeId:%v\n",
now, now,
task.cycleStart, task.CycleStart,
task.cycleStop, task.CycleStop,
task.periodStart, task.PeriodStart,
task.periodStop, task.PeriodStop,
task.blockStart, task.BlockStart,
task.blockStop, task.BlockStop,
task.nodeID) task.NodeID)
} }
func assertTask(task *Task, t *testing.T) { func assertTask(task *Task, t *testing.T) {
assert.Equal(t, true, task.nodeID >= 0 && task.nodeID < dposDelegateNum) assert.Equal(t, true, task.NodeID >= 0 && task.NodeID < dposDelegateNum)
assert.Equal(t, true, task.cycleStart <= task.periodStart && task.periodStart <= task.blockStart && task.blockStop <= task.periodStop && task.periodStop <= task.cycleStop) assert.Equal(t, true, task.CycleStart <= task.PeriodStart && task.PeriodStart <= task.BlockStart && task.BlockStop <= task.PeriodStop && task.PeriodStop <= task.CycleStop)
} }
func TestDecideTaskByTime(t *testing.T) { func TestDecideTaskByTime(t *testing.T) {
......
...@@ -14,6 +14,7 @@ It has these top-level messages: ...@@ -14,6 +14,7 @@ It has these top-level messages:
DPosVote DPosVote
DPosVoteReply DPosVoteReply
DPosNotify DPosNotify
DPosCBInfo
*/ */
package types package types
...@@ -338,6 +339,54 @@ func (m *DPosNotify) GetSignature() []byte { ...@@ -338,6 +339,54 @@ func (m *DPosNotify) GetSignature() []byte {
return nil 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() { func init() {
proto.RegisterType((*CycleBoundaryInfo)(nil), "types.CycleBoundaryInfo") proto.RegisterType((*CycleBoundaryInfo)(nil), "types.CycleBoundaryInfo")
proto.RegisterType((*SuperNode)(nil), "types.SuperNode") proto.RegisterType((*SuperNode)(nil), "types.SuperNode")
...@@ -345,45 +394,48 @@ func init() { ...@@ -345,45 +394,48 @@ func init() {
proto.RegisterType((*DPosVote)(nil), "types.DPosVote") proto.RegisterType((*DPosVote)(nil), "types.DPosVote")
proto.RegisterType((*DPosVoteReply)(nil), "types.DPosVoteReply") proto.RegisterType((*DPosVoteReply)(nil), "types.DPosVoteReply")
proto.RegisterType((*DPosNotify)(nil), "types.DPosNotify") proto.RegisterType((*DPosNotify)(nil), "types.DPosNotify")
proto.RegisterType((*DPosCBInfo)(nil), "types.DPosCBInfo")
} }
func init() { proto.RegisterFile("dpos_msg.proto", fileDescriptor0) } func init() { proto.RegisterFile("dpos_msg.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 558 bytes of a gzipped FileDescriptorProto // 587 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xdd, 0x8a, 0x13, 0x31, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xdd, 0x8a, 0xd3, 0x4c,
0x14, 0xa6, 0x3b, 0xfd, 0x3d, 0xfd, 0xd9, 0xdd, 0x20, 0x12, 0x44, 0xa4, 0x8c, 0x22, 0x45, 0xa5, 0x18, 0x26, 0x9b, 0xb6, 0xdb, 0xbc, 0xfd, 0xd9, 0xdd, 0xe1, 0xe3, 0x63, 0x10, 0x91, 0x12, 0x45,
0x48, 0x15, 0x11, 0xc1, 0x0b, 0x77, 0xf7, 0xc2, 0x22, 0x2c, 0x32, 0xbb, 0xf4, 0x56, 0xb2, 0x3b, 0x8a, 0x4a, 0x91, 0x2a, 0x22, 0x82, 0x07, 0xee, 0xee, 0x81, 0x45, 0x58, 0x64, 0x76, 0xe9, 0xa9,
0x69, 0x67, 0xa0, 0x6d, 0x42, 0x92, 0x16, 0xe7, 0x21, 0x7c, 0x0d, 0x5f, 0xc7, 0x57, 0x92, 0x9c, 0x64, 0x37, 0xd3, 0x26, 0xd8, 0x76, 0x86, 0x99, 0x69, 0x31, 0x17, 0xe1, 0x99, 0xd7, 0xe0, 0xed,
0xcc, 0x4c, 0xa6, 0x53, 0x7a, 0x37, 0xdf, 0x77, 0x7e, 0x92, 0xf3, 0x9d, 0x2f, 0x03, 0xa3, 0x58, 0x78, 0x4b, 0x32, 0x3f, 0xc9, 0xa4, 0x29, 0x3d, 0xf3, 0x2c, 0xcf, 0xf3, 0xfe, 0xcc, 0xbc, 0xcf,
0x0a, 0xfd, 0x6b, 0xa3, 0x57, 0x53, 0xa9, 0x84, 0x11, 0xa4, 0x65, 0x32, 0xc9, 0x75, 0xc8, 0xe1, 0xfb, 0x64, 0x60, 0x98, 0x72, 0x26, 0xbf, 0xad, 0xe5, 0x72, 0xc2, 0x05, 0x53, 0x0c, 0xb5, 0x55,
0xf2, 0x3a, 0x7b, 0x5c, 0xf3, 0x2b, 0xb1, 0xdb, 0xc6, 0x4c, 0x65, 0xf3, 0xed, 0x52, 0x90, 0x27, 0xc1, 0xa9, 0x8c, 0x29, 0x5c, 0x5c, 0x15, 0x0f, 0x2b, 0x7a, 0xc9, 0xb6, 0x9b, 0x34, 0x11, 0xc5,
0xd0, 0x7a, 0xb4, 0x24, 0x6d, 0x8c, 0x1b, 0x93, 0x20, 0x72, 0x80, 0xbc, 0x00, 0xd0, 0x46, 0xc8, 0x6c, 0xb3, 0x60, 0xe8, 0x3f, 0x68, 0x3f, 0x68, 0x12, 0x07, 0xa3, 0x60, 0x1c, 0x12, 0x0b, 0xd0,
0xef, 0x3c, 0x5d, 0x25, 0x86, 0x9e, 0x61, 0xa8, 0xc2, 0x90, 0x67, 0xd0, 0x45, 0xc4, 0x74, 0x42, 0x13, 0x00, 0xa9, 0x18, 0xff, 0x4c, 0xf3, 0x65, 0xa6, 0xf0, 0x89, 0x09, 0xd5, 0x18, 0xf4, 0x08,
0x83, 0x71, 0x63, 0xd2, 0x8b, 0x4a, 0x1c, 0x7e, 0x85, 0xde, 0xdd, 0x4e, 0x72, 0x75, 0x2b, 0x62, 0xba, 0x06, 0x25, 0x32, 0xc3, 0xe1, 0x28, 0x18, 0x47, 0xa4, 0xc2, 0xf1, 0x47, 0x88, 0x6e, 0xb7,
0x4e, 0x28, 0x74, 0x58, 0x1c, 0x2b, 0xae, 0x35, 0x1e, 0x30, 0x88, 0x0a, 0x48, 0x9e, 0x42, 0x5b, 0x9c, 0x8a, 0x1b, 0x96, 0x52, 0x84, 0xe1, 0x34, 0x49, 0x53, 0x41, 0xa5, 0x34, 0x07, 0xf4, 0x49,
0xee, 0x1e, 0x7e, 0xf0, 0x0c, 0xdb, 0x0f, 0xa2, 0x1c, 0x85, 0x7f, 0x9b, 0xd0, 0x5d, 0x08, 0xc3, 0x09, 0xd1, 0xff, 0xd0, 0xe1, 0xdb, 0xfb, 0x2f, 0xb4, 0x30, 0xed, 0xfb, 0xc4, 0xa1, 0xf8, 0x77,
0xe7, 0x86, 0x6f, 0xc8, 0x6b, 0x18, 0xed, 0x85, 0xe1, 0xb1, 0xed, 0x35, 0xdf, 0xc6, 0xfc, 0x37, 0x0b, 0xba, 0x73, 0xa6, 0xe8, 0x4c, 0xd1, 0x35, 0x7a, 0x0e, 0xc3, 0x1d, 0x53, 0x34, 0xd5, 0xbd,
0x76, 0x69, 0x45, 0x35, 0x96, 0xbc, 0x81, 0x8b, 0x92, 0xf9, 0x96, 0x9f, 0xe7, 0xda, 0x1e, 0xf1, 0x66, 0x9b, 0x94, 0xfe, 0x30, 0x5d, 0xda, 0xa4, 0xc1, 0xa2, 0x17, 0x70, 0x5e, 0x31, 0x9f, 0xdc,
0x7e, 0xe2, 0xa0, 0x36, 0x31, 0x7e, 0xdc, 0x19, 0xa6, 0x0c, 0x6d, 0xba, 0x89, 0x3d, 0x43, 0x9e, 0x79, 0xb6, 0xed, 0x01, 0xef, 0x27, 0x0e, 0x1b, 0x13, 0x9b, 0x8f, 0x5b, 0x95, 0x08, 0x85, 0x5b,
0x43, 0x2f, 0x47, 0x42, 0xd2, 0x16, 0x86, 0x3d, 0x41, 0xc6, 0xd0, 0x97, 0x5c, 0xa5, 0x22, 0x76, 0x76, 0x62, 0xcf, 0xa0, 0xc7, 0x10, 0x39, 0xc4, 0x38, 0x6e, 0x9b, 0xb0, 0x27, 0xd0, 0x08, 0x7a,
0xe5, 0x6d, 0x8c, 0x57, 0x29, 0xdb, 0xbf, 0x80, 0x42, 0xd2, 0x8e, 0xeb, 0xef, 0x19, 0x2b, 0x47, 0x9c, 0x8a, 0x9c, 0xa5, 0xb6, 0xbc, 0x63, 0xe2, 0x75, 0x4a, 0xf7, 0x2f, 0x21, 0xe3, 0xf8, 0xd4,
0xe2, 0xd4, 0xee, 0x62, 0x2c, 0x47, 0x96, 0xb7, 0x13, 0xcc, 0x6f, 0x68, 0xcf, 0xc9, 0xe4, 0x10, 0xf6, 0xf7, 0x8c, 0x96, 0x23, 0xb3, 0x6a, 0x77, 0x4d, 0xcc, 0x21, 0xcd, 0xeb, 0x09, 0x66, 0xd7,
0xf9, 0x0c, 0xb0, 0x66, 0xda, 0x5c, 0x5f, 0xd9, 0x2d, 0x52, 0x18, 0x37, 0x26, 0xfd, 0x19, 0x9d, 0x38, 0xb2, 0x32, 0x59, 0x84, 0xde, 0x03, 0xac, 0x12, 0xa9, 0xae, 0x2e, 0xf5, 0x16, 0x31, 0x8c,
0xe2, 0xa2, 0xa7, 0x47, 0x5b, 0x8e, 0x2a, 0xb9, 0xf6, 0xae, 0x3a, 0xd9, 0x2d, 0x97, 0x6b, 0x7e, 0x82, 0x71, 0x6f, 0x8a, 0x27, 0x66, 0xd1, 0x93, 0x83, 0x2d, 0x93, 0x5a, 0xae, 0xbe, 0xab, 0xcc,
0x9f, 0x49, 0x4e, 0xfb, 0xee, 0xae, 0x15, 0x8a, 0xbc, 0x07, 0xd8, 0xb3, 0x75, 0x1a, 0x33, 0x23, 0xb6, 0x8b, 0xc5, 0x8a, 0xde, 0x15, 0x9c, 0xe2, 0x9e, 0xbd, 0x6b, 0x8d, 0x42, 0xaf, 0x01, 0x76,
0x94, 0xa6, 0x83, 0x71, 0x30, 0xe9, 0xcf, 0x2e, 0xf2, 0xde, 0xe5, 0x6a, 0xa3, 0x4a, 0x0e, 0xf9, 0xc9, 0x2a, 0x4f, 0x13, 0xc5, 0x84, 0xc4, 0xfd, 0x51, 0x38, 0xee, 0x4d, 0xcf, 0x5d, 0xef, 0x6a,
0x04, 0xc3, 0xbd, 0x5a, 0x2e, 0x7c, 0xd1, 0xf0, 0x44, 0xd1, 0x61, 0x1a, 0xf9, 0x02, 0xe7, 0x5b, 0xb5, 0xa4, 0x96, 0x83, 0xde, 0xc1, 0x60, 0x27, 0x16, 0x73, 0x5f, 0x34, 0x38, 0x52, 0xb4, 0x9f,
0xb1, 0x38, 0xa8, 0x1c, 0x9d, 0xa8, 0xac, 0x27, 0x86, 0xff, 0x1a, 0xd0, 0xbd, 0xf9, 0x29, 0xb4, 0x86, 0x3e, 0xc0, 0xd9, 0x86, 0xcd, 0xf7, 0x2a, 0x87, 0x47, 0x2a, 0x9b, 0x89, 0xf1, 0x9f, 0x00,
0x35, 0x0b, 0x79, 0x0b, 0xdd, 0x7d, 0x6e, 0x1a, 0xb4, 0x48, 0x7f, 0x76, 0x9e, 0x77, 0x28, 0xbc, 0xba, 0xd7, 0x5f, 0x99, 0xd4, 0x66, 0x41, 0x2f, 0xa1, 0xbb, 0x73, 0xa6, 0x31, 0x16, 0xe9, 0x4d,
0x14, 0x95, 0x09, 0xe4, 0x15, 0x0c, 0xed, 0xf7, 0x7d, 0xba, 0xe1, 0xda, 0xb0, 0x8d, 0xcc, 0x0d, 0xcf, 0x5c, 0x87, 0xd2, 0x4b, 0xa4, 0x4a, 0x40, 0xcf, 0x60, 0xa0, 0xbf, 0xef, 0xf2, 0x35, 0x95,
0x7e, 0x48, 0x16, 0xde, 0x53, 0xde, 0x7b, 0x81, 0xf7, 0x9e, 0x3a, 0xf2, 0x9e, 0xaa, 0x7a, 0xaf, 0x2a, 0x59, 0x73, 0x67, 0xf0, 0x7d, 0xb2, 0xf4, 0x9e, 0xf0, 0xde, 0x0b, 0xbd, 0xf7, 0xc4, 0x81,
0xe9, 0xbd, 0x57, 0xe5, 0xad, 0x8b, 0x74, 0xba, 0xda, 0x32, 0xb3, 0x53, 0x1c, 0x5d, 0x34, 0x88, 0xf7, 0x44, 0xdd, 0x7b, 0x2d, 0xef, 0xbd, 0x3a, 0xaf, 0x5d, 0x24, 0xf3, 0xe5, 0x26, 0x51, 0x5b,
0x3c, 0x11, 0x7e, 0x84, 0x61, 0x31, 0x50, 0xc4, 0xe5, 0x3a, 0x23, 0x2f, 0xa1, 0x69, 0x5b, 0xd4, 0x41, 0x8d, 0x8b, 0xfa, 0xc4, 0x13, 0xf1, 0x5b, 0x18, 0x94, 0x03, 0x11, 0xca, 0x57, 0x05, 0x7a,
0x26, 0x2a, 0x73, 0x30, 0x18, 0xfe, 0x39, 0x03, 0xb0, 0xd4, 0xad, 0x30, 0xe9, 0xf2, 0x54, 0x4d, 0x0a, 0x2d, 0xdd, 0xa2, 0x31, 0x51, 0x95, 0x63, 0x82, 0xf1, 0xcf, 0x13, 0x00, 0x4d, 0xdd, 0x30,
0xa9, 0x02, 0x06, 0xad, 0x1b, 0x9d, 0xbf, 0xd0, 0x8d, 0xf9, 0xfb, 0xf6, 0x8c, 0x7d, 0xdf, 0x09, 0x95, 0x2f, 0x8e, 0xd5, 0x54, 0x2a, 0x98, 0xa0, 0x76, 0xa3, 0xf5, 0x97, 0x71, 0xa3, 0xfb, 0xbf,
0xd3, 0x09, 0x46, 0x03, 0xbc, 0x66, 0x89, 0xc9, 0xc4, 0xee, 0xcc, 0x1e, 0xe5, 0xf5, 0x73, 0xcf, 0x3d, 0xa3, 0xff, 0xef, 0x2c, 0x91, 0x99, 0x89, 0x86, 0xe6, 0x9a, 0x15, 0x46, 0x63, 0xbd, 0x33,
0xa5, 0x4e, 0xfb, 0x4c, 0x2f, 0x61, 0x0b, 0x25, 0xac, 0xd3, 0xe4, 0x1d, 0x5c, 0x7a, 0xaa, 0x10, 0x7d, 0x94, 0xd7, 0xcf, 0xfe, 0x2e, 0x4d, 0xda, 0x67, 0x7a, 0x09, 0xdb, 0x46, 0xc2, 0x26, 0x8d,
0xb1, 0x8d, 0x07, 0x1f, 0x07, 0x0e, 0x55, 0xec, 0xd4, 0x54, 0x7c, 0x68, 0xe3, 0x4f, 0xef, 0xc3, 0x5e, 0xc1, 0x85, 0xa7, 0x4a, 0x11, 0x3b, 0xe6, 0xe0, 0xc3, 0xc0, 0xbe, 0x8a, 0xa7, 0x4d, 0x15,
0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x49, 0x1a, 0xb6, 0x06, 0x05, 0x00, 0x00, 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,
} }
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
...@@ -32,6 +32,7 @@ func InitMessageMap() { ...@@ -32,6 +32,7 @@ func InitMessageMap() {
VoteID: reflect.TypeOf(DPosVote{}), VoteID: reflect.TypeOf(DPosVote{}),
VoteReplyID: reflect.TypeOf(DPosVoteReply{}), VoteReplyID: reflect.TypeOf(DPosVoteReply{}),
NotifyID: reflect.TypeOf(DPosNotify{}), NotifyID: reflect.TypeOf(DPosNotify{}),
CBInfoID: reflect.TypeOf(DPosCBInfo{}),
} }
} }
......
...@@ -34,7 +34,7 @@ type PrivValidator interface { ...@@ -34,7 +34,7 @@ type PrivValidator interface {
SignVote(chainID string, vote *Vote) error SignVote(chainID string, vote *Vote) error
SignNotify(chainID string, notify *Notify) 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) SignTx(tx *types.Transaction)
VrfEvaluate(input []byte) (hash [32]byte, proof []byte) VrfEvaluate(input []byte) (hash [32]byte, proof []byte)
VrfProof(pubkey []byte, input []byte, hash [32]byte, proof []byte) bool VrfProof(pubkey []byte, input []byte, hash [32]byte, proof []byte) bool
...@@ -46,8 +46,8 @@ type PrivValidator interface { ...@@ -46,8 +46,8 @@ type PrivValidator interface {
type PrivValidatorFS struct { type PrivValidatorFS struct {
Address string `json:"address"` Address string `json:"address"`
PubKey KeyText `json:"pub_key"` PubKey KeyText `json:"pub_key"`
LastSignature *KeyText `json:"last_signature,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 //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 should be empty if a Signer other than the default is being used.
PrivKey KeyText `json:"priv_key"` PrivKey KeyText `json:"priv_key"`
...@@ -57,8 +57,8 @@ type PrivValidatorFS struct { ...@@ -57,8 +57,8 @@ type PrivValidatorFS struct {
type PrivValidatorImp struct { type PrivValidatorImp struct {
Address []byte Address []byte
PubKey crypto.PubKey PubKey crypto.PubKey
LastSignature crypto.Signature //LastSignature crypto.Signature
LastSignBytes []byte //LastSignBytes []byte
// PrivKey should be empty if a Signer other than the default is being used. // PrivKey should be empty if a Signer other than the default is being used.
PrivKey crypto.PrivKey PrivKey crypto.PrivKey
...@@ -130,6 +130,7 @@ func PubKeyFromString(pubkeystring string) (crypto.PubKey, error) { ...@@ -130,6 +130,7 @@ func PubKeyFromString(pubkeystring string) (crypto.PubKey, error) {
} }
// SignatureFromString ... // SignatureFromString ...
/*
func SignatureFromString(sigString string) (crypto.Signature, error) { func SignatureFromString(sigString string) (crypto.Signature, error) {
sigbyte, err := hex.DecodeString(sigString) sigbyte, err := hex.DecodeString(sigString)
if err != nil { if err != nil {
...@@ -141,7 +142,7 @@ func SignatureFromString(sigString string) (crypto.Signature, error) { ...@@ -141,7 +142,7 @@ func SignatureFromString(sigString string) (crypto.Signature, error) {
} }
return sig, nil return sig, nil
} }
*/
// GenPrivValidatorImp generates a new validator with randomly generated private key // GenPrivValidatorImp generates a new validator with randomly generated private key
// and sets the filePath, but does not call Save(). // and sets the filePath, but does not call Save().
func GenPrivValidatorImp(filePath string) *PrivValidatorImp { func GenPrivValidatorImp(filePath string) *PrivValidatorImp {
...@@ -221,6 +222,7 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidato ...@@ -221,6 +222,7 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidato
} }
privValImp.PubKey = pubKey privValImp.PubKey = pubKey
/*
if len(privVal.LastSignBytes) != 0 { if len(privVal.LastSignBytes) != 0 {
tmp, err = hex.DecodeString(privVal.LastSignBytes) tmp, err = hex.DecodeString(privVal.LastSignBytes)
if err != nil { if err != nil {
...@@ -237,7 +239,7 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidato ...@@ -237,7 +239,7 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidato
} else { } else {
privValImp.LastSignature = nil privValImp.LastSignature = nil
} }
*/
privValImp.filePath = filePath privValImp.filePath = filePath
privValImp.Signer = signerFunc(privValImp) privValImp.Signer = signerFunc(privValImp)
return privValImp return privValImp
...@@ -258,10 +260,11 @@ func (pv *PrivValidatorImp) save() { ...@@ -258,10 +260,11 @@ func (pv *PrivValidatorImp) save() {
privValFS := &PrivValidatorFS{ privValFS := &PrivValidatorFS{
Address: addr, Address: addr,
LastSignature: nil, //LastSignature: nil,
} }
privValFS.PrivKey = KeyText{Kind: "secp256k1", Data: Fmt("%X", pv.PrivKey.Bytes()[:])} privValFS.PrivKey = KeyText{Kind: "secp256k1", Data: Fmt("%X", pv.PrivKey.Bytes()[:])}
privValFS.PubKey = KeyText{Kind: "secp256k1", Data: pv.PubKey.KeyString()} privValFS.PubKey = KeyText{Kind: "secp256k1", Data: pv.PubKey.KeyString()}
/*
if len(pv.LastSignBytes) != 0 { if len(pv.LastSignBytes) != 0 {
tmp := Fmt("%X", pv.LastSignBytes[:]) tmp := Fmt("%X", pv.LastSignBytes[:])
privValFS.LastSignBytes = tmp privValFS.LastSignBytes = tmp
...@@ -270,6 +273,7 @@ func (pv *PrivValidatorImp) save() { ...@@ -270,6 +273,7 @@ func (pv *PrivValidatorImp) save() {
sig := Fmt("%X", pv.LastSignature.Bytes()[:]) sig := Fmt("%X", pv.LastSignature.Bytes()[:])
privValFS.LastSignature = &KeyText{Kind: "ed25519", Data: sig} privValFS.LastSignature = &KeyText{Kind: "ed25519", Data: sig}
} }
*/
jsonBytes, err := json.Marshal(privValFS) jsonBytes, err := json.Marshal(privValFS)
if err != nil { if err != nil {
// `@; BOOM!!! // `@; BOOM!!!
...@@ -285,8 +289,8 @@ func (pv *PrivValidatorImp) save() { ...@@ -285,8 +289,8 @@ func (pv *PrivValidatorImp) save() {
// Reset resets all fields in the PrivValidatorFS. // Reset resets all fields in the PrivValidatorFS.
// NOTE: Unsafe! // NOTE: Unsafe!
func (pv *PrivValidatorImp) Reset() { func (pv *PrivValidatorImp) Reset() {
pv.LastSignature = nil //pv.LastSignature = nil
pv.LastSignBytes = nil //pv.LastSignBytes = nil
pv.Save() pv.Save()
} }
...@@ -323,21 +327,13 @@ func (pv *PrivValidatorImp) SignNotify(chainID string, notify *Notify) error { ...@@ -323,21 +327,13 @@ func (pv *PrivValidatorImp) SignNotify(chainID string, notify *Notify) error {
} }
// SignCBInfo signs a canonical representation of the DposCBInfo, Implements PrivValidator. // 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() pv.mtx.Lock()
defer pv.mtx.Unlock() defer pv.mtx.Unlock()
buf := new(bytes.Buffer) signature := pv.PrivKey.Sign(msg)
//sig = hex.EncodeToString(signature.Bytes())
_, err = buf.Write(msg) return signature, nil
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
} }
// SignTx signs a tx, Implements PrivValidator. // SignTx signs a tx, Implements PrivValidator.
func (pv *PrivValidatorImp)SignTx(tx *types.Transaction){ func (pv *PrivValidatorImp)SignTx(tx *types.Transaction){
...@@ -376,12 +372,14 @@ func (pv *PrivValidatorImp) VrfProof(pubkey []byte, input []byte, hash [32]byte, ...@@ -376,12 +372,14 @@ func (pv *PrivValidatorImp) VrfProof(pubkey []byte, input []byte, hash [32]byte,
} }
// Persist height/round/step and signature // Persist height/round/step and signature
/*
func (pv *PrivValidatorImp) saveSigned(signBytes []byte, sig crypto.Signature) { func (pv *PrivValidatorImp) saveSigned(signBytes []byte, sig crypto.Signature) {
pv.LastSignature = sig //pv.LastSignature = sig
pv.LastSignBytes = signBytes //pv.LastSignBytes = signBytes
pv.save() pv.save()
} }
*/
// String returns a string representation of the PrivValidatorImp. // String returns a string representation of the PrivValidatorImp.
func (pv *PrivValidatorImp) String() string { func (pv *PrivValidatorImp) String() string {
......
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment