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

update

parent 2cb03695
......@@ -291,7 +291,7 @@ func (cs *ConsensusState) handleMsg(mi MsgInfo) {
cs.dposState.recvNotify(cs, msg)
case *dpostype.DPosVoteReply:
cs.dposState.recvVoteReply(cs, msg)
case *dty.DposCBInfo:
case *dpostype.DPosCBInfo:
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.cycle)
info, err := cs.QueryCycleBoundaryInfo(task.Cycle)
if err == nil && info != nil {
//cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateCBInfo(info)
return
}
info, err = cs.QueryCycleBoundaryInfo(task.cycle - 1)
info, err = cs.QueryCycleBoundaryInfo(task.Cycle - 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.cycle)
info, err := cs.QueryVrf(cs.privValidator.GetPubKey().Bytes(), task.Cycle)
if err == nil && info != nil {
//cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateVrfInfo(info)
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 {
//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.cycle - 1)
infos, err := cs.QueryVrfs(cs.validatorMgr.Validators, task.Cycle - 1)
if err == nil && infos != nil {
//cs.cycleBoundaryMap[task.cycle] = info
cs.UpdateVrfInfos(task.cycle, infos)
cs.UpdateVrfInfos(task.Cycle, infos)
}
return
......
......@@ -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
......@@ -50,28 +50,28 @@ var WaitNotifyStateObj = &WaitNofifyState{}
// Task 为计算当前时间所属周期的数据结构
type Task struct {
nodeID int64
cycle int64
cycleStart int64
cycleStop int64
periodStart int64
periodStop int64
blockStart int64
blockStop int64
NodeID int64
Cycle int64
CycleStart int64
CycleStop int64
PeriodStart int64
PeriodStop int64
BlockStart int64
BlockStop int64
}
// DecideTaskByTime 根据时间戳计算所属的周期,包括cycle周期,负责出块周期,当前出块周期
func DecideTaskByTime(now int64) (task Task) {
task.nodeID = now % dposCycle / dposPeriod
task.cycle = now / dposCycle
task.cycleStart = now - now%dposCycle
task.cycleStop = task.cycleStart + dposCycle - 1
task.NodeID = now % dposCycle / dposPeriod
task.Cycle = now / dposCycle
task.CycleStart = now - now % dposCycle
task.CycleStop = task.CycleStart + dposCycle - 1
task.periodStart = task.cycleStart + task.nodeID*dposBlockInterval*dposContinueBlockNum
task.periodStop = task.periodStart + dposPeriod - 1
task.PeriodStart = task.CycleStart + task.NodeID * dposBlockInterval * dposContinueBlockNum
task.PeriodStop = task.PeriodStart + dposPeriod - 1
task.blockStart = task.periodStart + now%dposCycle%dposPeriod/dposBlockInterval*dposBlockInterval
task.blockStop = task.blockStart + dposBlockInterval - 1
task.BlockStart = task.PeriodStart + now % dposCycle % dposPeriod/dposBlockInterval * dposBlockInterval
task.BlockStop = task.BlockStart + dposBlockInterval - 1
return task
}
......@@ -86,24 +86,23 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
//计算当前时间,属于哪一个周期,应该哪一个节点出块,应该出块的高度
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 {
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.nodeID),
Cycle: task.cycle,
CycleStart: task.cycleStart,
CycleStop: task.cycleStop,
PeriodStart: task.periodStart,
PeriodStop: task.periodStop,
VotedNodeIndex: int32(task.NodeID),
Cycle: task.Cycle,
CycleStart: task.CycleStart,
CycleStop: task.CycleStop,
PeriodStart: task.PeriodStart,
PeriodStop: task.PeriodStop,
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.cycleStart) / 2
middleTime := task.CycleStart + (task.CycleStop - task.CycleStart) / 2
if now < middleTime {
info := cs.GetVrfInfoByCircle(task.cycle, VrfQueryTypeM)
info := cs.GetVrfInfoByCircle(task.Cycle, VrfQueryTypeM)
if info == nil {
vrfM := &dty.DposVrfMRegist{
Pubkey: hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()),
Cycle: task.cycle,
Cycle: task.Cycle,
M: cs.currentVote.LastCBInfo.StopHash,
}
cs.SendRegistVrfMTx(vrfM)
}
} 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){
hash, proof := cs.VrfEvaluate(info.M)
vrfRP := &dty.DposVrfRPRegist{
Pubkey: hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()),
Cycle: task.cycle,
Cycle: task.Cycle,
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 := &dty.DposCBInfo{
info2 := &dpostype.DPosCBInfo{
Cycle: info.Cycle,
StopHeight: info.StopHeight,
StopHash: info.StopHash,
......@@ -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)
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)
cs.client.SetBlockTime(task.blockStop)
cs.client.SetBlockTime(task.BlockStop)
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 *dty.DposCBInfo) {
func (voted *VotedState) sendCBInfo(cs *ConsensusState, info *dpostype.DPosCBInfo) {
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")
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
......@@ -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.cycleStart,
task.cycleStop,
task.periodStart,
task.periodStop,
task.blockStart,
task.blockStop,
task.nodeID)
task.CycleStart,
task.CycleStop,
task.PeriodStart,
task.PeriodStop,
task.BlockStart,
task.BlockStop,
task.NodeID)
}
func assertTask(task *Task, t *testing.T) {
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.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)
}
func TestDecideTaskByTime(t *testing.T) {
......
......@@ -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,
}
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() {
VoteID: reflect.TypeOf(DPosVote{}),
VoteReplyID: reflect.TypeOf(DPosVoteReply{}),
NotifyID: reflect.TypeOf(DPosNotify{}),
CBInfoID: reflect.TypeOf(DPosCBInfo{}),
}
}
......
......@@ -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 {
......
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