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
This diff is collapsed.
......@@ -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