merge removes old files

pull/953/head
ak 6 years ago
commit d15bc0b8a3
  1. 148
      api/proto/message/message.pb.go
  2. 11
      api/proto/message/message.proto
  3. 1
      api/service/explorer/service.go
  4. 14
      cmd/harmony/main.go
  5. 6
      consensus/consensus.go
  6. 2
      consensus/consensus_leader_test.go
  7. 12
      consensus/consensus_service.go
  8. 12
      consensus/consensus_v2.go
  9. 37
      consensus/consensus_viewchange_msg.go
  10. 39
      consensus/pbft_log.go
  11. 4
      consensus/pbft_log_test.go
  12. 100
      consensus/view_change.go
  13. 2
      go.mod
  14. 2
      internal/configs/node/config.go
  15. 52
      internal/memprofiling/lib.go
  16. 14
      internal/memprofiling/singleton.go
  17. 34
      internal/utils/contract/constants.go
  18. 10
      internal/utils/utils.go
  19. 36
      node/contract_test.go
  20. 216
      node/demo_contract.go
  21. 6
      node/node.go
  22. 2
      node/node_newblock.go
  23. 229
      node/puzzle_contract.go
  24. 1
      test/debug.sh
  25. 2
      test/deploy.sh

@ -653,11 +653,13 @@ type ViewChangeRequest struct {
LeaderPubkey []byte `protobuf:"bytes,4,opt,name=leader_pubkey,json=leaderPubkey,proto3" json:"leader_pubkey,omitempty"` LeaderPubkey []byte `protobuf:"bytes,4,opt,name=leader_pubkey,json=leaderPubkey,proto3" json:"leader_pubkey,omitempty"`
Payload []byte `protobuf:"bytes,5,opt,name=payload,proto3" json:"payload,omitempty"` Payload []byte `protobuf:"bytes,5,opt,name=payload,proto3" json:"payload,omitempty"`
ViewchangeSig []byte `protobuf:"bytes,6,opt,name=viewchange_sig,json=viewchangeSig,proto3" json:"viewchange_sig,omitempty"` ViewchangeSig []byte `protobuf:"bytes,6,opt,name=viewchange_sig,json=viewchangeSig,proto3" json:"viewchange_sig,omitempty"`
ViewidSig []byte `protobuf:"bytes,7,opt,name=viewid_sig,json=viewidSig,proto3" json:"viewid_sig,omitempty"`
// below is for newview message only // below is for newview message only
M1Aggsigs []byte `protobuf:"bytes,7,opt,name=m1_aggsigs,json=m1Aggsigs,proto3" json:"m1_aggsigs,omitempty"` // only need 1 valid m1 type message which is in payload
M1Bitmap []byte `protobuf:"bytes,8,opt,name=m1_bitmap,json=m1Bitmap,proto3" json:"m1_bitmap,omitempty"` M2Aggsigs []byte `protobuf:"bytes,8,opt,name=m2_aggsigs,json=m2Aggsigs,proto3" json:"m2_aggsigs,omitempty"`
M2Aggsigs []byte `protobuf:"bytes,9,opt,name=m2_aggsigs,json=m2Aggsigs,proto3" json:"m2_aggsigs,omitempty"` M2Bitmap []byte `protobuf:"bytes,9,opt,name=m2_bitmap,json=m2Bitmap,proto3" json:"m2_bitmap,omitempty"`
M2Bitmap []byte `protobuf:"bytes,10,opt,name=m2_bitmap,json=m2Bitmap,proto3" json:"m2_bitmap,omitempty"` M3Aggsigs []byte `protobuf:"bytes,10,opt,name=m3_aggsigs,json=m3Aggsigs,proto3" json:"m3_aggsigs,omitempty"`
M3Bitmap []byte `protobuf:"bytes,11,opt,name=m3_bitmap,json=m3Bitmap,proto3" json:"m3_bitmap,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -730,30 +732,37 @@ func (m *ViewChangeRequest) GetViewchangeSig() []byte {
return nil return nil
} }
func (m *ViewChangeRequest) GetM1Aggsigs() []byte { func (m *ViewChangeRequest) GetViewidSig() []byte {
if m != nil { if m != nil {
return m.M1Aggsigs return m.ViewidSig
} }
return nil return nil
} }
func (m *ViewChangeRequest) GetM1Bitmap() []byte { func (m *ViewChangeRequest) GetM2Aggsigs() []byte {
if m != nil { if m != nil {
return m.M1Bitmap return m.M2Aggsigs
} }
return nil return nil
} }
func (m *ViewChangeRequest) GetM2Aggsigs() []byte { func (m *ViewChangeRequest) GetM2Bitmap() []byte {
if m != nil { if m != nil {
return m.M2Aggsigs return m.M2Bitmap
} }
return nil return nil
} }
func (m *ViewChangeRequest) GetM2Bitmap() []byte { func (m *ViewChangeRequest) GetM3Aggsigs() []byte {
if m != nil { if m != nil {
return m.M2Bitmap return m.M3Aggsigs
}
return nil
}
func (m *ViewChangeRequest) GetM3Bitmap() []byte {
if m != nil {
return m.M3Bitmap
} }
return nil return nil
} }
@ -775,64 +784,65 @@ func init() {
func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) } func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) }
var fileDescriptor_33c57e4bae7b9afd = []byte{ var fileDescriptor_33c57e4bae7b9afd = []byte{
// 903 bytes of a gzipped FileDescriptorProto // 914 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x95, 0xcd, 0x8e, 0xe2, 0x46, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x95, 0xcd, 0x8e, 0xe2, 0x46,
0x10, 0xc7, 0x31, 0x30, 0x18, 0x97, 0x0d, 0xf4, 0x76, 0x92, 0x5d, 0x67, 0xb2, 0x51, 0x10, 0xab, 0x10, 0xc7, 0x31, 0x30, 0x18, 0x97, 0x0d, 0xd3, 0xdb, 0x49, 0x76, 0x9d, 0xc9, 0x46, 0x19, 0xb1,
0x48, 0x68, 0xa5, 0x8c, 0x76, 0xd8, 0x43, 0x14, 0x29, 0x17, 0x30, 0xad, 0xc1, 0x9a, 0x19, 0x43, 0x8a, 0x34, 0x5a, 0x29, 0xa3, 0x15, 0x1c, 0xa2, 0x48, 0xb9, 0x30, 0xa6, 0xb5, 0x58, 0x33, 0x63,
0x1a, 0xb3, 0xa3, 0x9c, 0x2c, 0x03, 0x2d, 0xc6, 0x1a, 0x63, 0x13, 0xb7, 0x99, 0x15, 0x2f, 0x94, 0x48, 0x63, 0x76, 0x94, 0x93, 0x65, 0xa0, 0xc5, 0x58, 0x63, 0x6c, 0xe2, 0x36, 0xb3, 0xe2, 0x85,
0x4b, 0xee, 0x39, 0x27, 0xf7, 0x3c, 0x54, 0xe4, 0xb6, 0x8d, 0xf9, 0xd8, 0x28, 0x52, 0x0e, 0xb9, 0x72, 0xc9, 0x3d, 0xe7, 0xe4, 0x79, 0xf2, 0x12, 0x51, 0xb7, 0x6d, 0xcc, 0xc7, 0x46, 0x91, 0x72,
0x51, 0xff, 0xaa, 0x5f, 0x75, 0x75, 0xb9, 0xab, 0x80, 0xc6, 0x9a, 0x71, 0xee, 0xae, 0xd8, 0xd5, 0xc8, 0x8d, 0xfa, 0x57, 0xfd, 0xaa, 0xab, 0xcb, 0x5d, 0x05, 0xb4, 0x56, 0x8c, 0x73, 0x7f, 0xc9,
0x26, 0x0a, 0xe3, 0x10, 0xcb, 0x99, 0xd9, 0xf9, 0xbd, 0x02, 0xf2, 0x7d, 0xfa, 0x1b, 0x7f, 0x0f, 0xae, 0xd7, 0x49, 0x9c, 0xc6, 0x58, 0xcd, 0xcd, 0xce, 0xef, 0x35, 0x50, 0xef, 0xb3, 0xdf, 0xf8,
0x1a, 0x67, 0xd1, 0xb3, 0xb7, 0x60, 0x4e, 0xbc, 0xdb, 0x30, 0x5d, 0x6a, 0x4b, 0xdd, 0x66, 0xef, 0x7b, 0x30, 0x38, 0x4b, 0x9e, 0x83, 0x39, 0xf3, 0xd2, 0xed, 0x9a, 0x99, 0xca, 0xa5, 0x72, 0xd5,
0xf3, 0xab, 0x1c, 0x9d, 0xa6, 0x4e, 0x7b, 0xb7, 0x61, 0x54, 0xe5, 0x85, 0x81, 0xbb, 0x50, 0x15, 0xee, 0x7e, 0x7e, 0x5d, 0xa0, 0x93, 0xcc, 0xe9, 0x6e, 0xd7, 0x8c, 0xea, 0xbc, 0x34, 0xf0, 0x15,
0x40, 0xf9, 0x04, 0xc8, 0x12, 0x0b, 0x40, 0x44, 0xe0, 0xd7, 0xa0, 0x70, 0x6f, 0x15, 0xb8, 0xf1, 0xd4, 0x25, 0x50, 0x3d, 0x02, 0xf2, 0xc4, 0x12, 0x90, 0x11, 0xf8, 0x35, 0x68, 0x3c, 0x58, 0x46,
0x36, 0x62, 0x7a, 0xa5, 0x2d, 0x75, 0x35, 0x5a, 0x08, 0xf8, 0x3d, 0xc8, 0x3c, 0x76, 0x9f, 0xbc, 0x7e, 0xba, 0x49, 0x98, 0x59, 0xbb, 0x54, 0xae, 0x0c, 0x5a, 0x0a, 0xb8, 0x07, 0x2a, 0x4f, 0xfd,
0x60, 0xa5, 0x57, 0xdb, 0x52, 0x57, 0xed, 0xbd, 0x2a, 0xce, 0x4e, 0x75, 0xca, 0x7e, 0xd9, 0x32, 0xa7, 0x20, 0x5a, 0x9a, 0xf5, 0x4b, 0xe5, 0x4a, 0xef, 0xbe, 0x2a, 0xcf, 0xce, 0x74, 0xca, 0x7e,
0x1e, 0x8f, 0x4a, 0x34, 0x8f, 0xc4, 0x3f, 0x80, 0xb2, 0x08, 0x03, 0xce, 0x02, 0xbe, 0xe5, 0xfa, 0xd9, 0x30, 0x9e, 0x0e, 0x2b, 0xb4, 0x88, 0xc4, 0x3f, 0x80, 0x36, 0x8f, 0x23, 0xce, 0x22, 0xbe,
0x85, 0xc0, 0xbe, 0xdc, 0x63, 0x46, 0xee, 0x29, 0xc0, 0x22, 0x1a, 0x7f, 0x07, 0x17, 0xcb, 0xc8, 0xe1, 0xe6, 0x99, 0xc4, 0xbe, 0xdc, 0x61, 0x56, 0xe1, 0x29, 0xc1, 0x32, 0x1a, 0x7f, 0x07, 0x67,
0x0d, 0x96, 0x7a, 0x4d, 0x60, 0x5f, 0xec, 0xb1, 0x61, 0xa2, 0x16, 0x48, 0x1a, 0x85, 0x7f, 0x04, 0x8b, 0xc4, 0x8f, 0x16, 0x66, 0x43, 0x62, 0x5f, 0xec, 0xb0, 0x81, 0x50, 0x4b, 0x24, 0x8b, 0xc2,
0x78, 0xf6, 0xd8, 0xc7, 0xc5, 0xa3, 0x1b, 0xac, 0x98, 0x2e, 0x0b, 0xe6, 0x72, 0xcf, 0x7c, 0xf0, 0x3f, 0x02, 0x3c, 0x07, 0xec, 0xe3, 0xfc, 0xd1, 0x8f, 0x96, 0xcc, 0x54, 0x25, 0x73, 0xb1, 0x63,
0xd8, 0x47, 0x43, 0xb8, 0x0a, 0xf0, 0x20, 0x1e, 0x0f, 0xa0, 0xe5, 0x87, 0x71, 0xcc, 0xa2, 0x9d, 0x3e, 0x04, 0xec, 0xa3, 0x25, 0x5d, 0x25, 0xb8, 0x17, 0x8f, 0x6f, 0xe0, 0x3c, 0x8c, 0xd3, 0x94,
0x13, 0xa5, 0x01, 0x7a, 0xfd, 0xe4, 0x92, 0x77, 0xa9, 0xbf, 0xe0, 0x9b, 0xfe, 0x91, 0x32, 0x50, 0x25, 0x5b, 0x2f, 0xc9, 0x02, 0xcc, 0xe6, 0xd1, 0x25, 0xef, 0x32, 0x7f, 0xc9, 0xb7, 0xc3, 0x03,
0x40, 0xce, 0xd8, 0xce, 0x1f, 0x12, 0xd4, 0x29, 0xe3, 0x9b, 0xe4, 0x32, 0xff, 0xc7, 0x97, 0x23, 0xe5, 0x46, 0x03, 0x35, 0x67, 0x3b, 0x7f, 0x28, 0xd0, 0xa4, 0x8c, 0xaf, 0xc5, 0x65, 0xfe, 0x8f,
0x80, 0x8a, 0xf2, 0xd3, 0x63, 0xc5, 0x07, 0x54, 0x7b, 0xfa, 0x79, 0xfd, 0xa9, 0x7f, 0x54, 0xa2, 0x2f, 0x47, 0x00, 0x95, 0xe5, 0x67, 0xc7, 0xca, 0x0f, 0xa8, 0x77, 0xcd, 0xd3, 0xfa, 0x33, 0xff,
0x2d, 0xff, 0x58, 0x1a, 0x00, 0xd4, 0x73, 0xbc, 0x73, 0x03, 0xad, 0x13, 0x02, 0xeb, 0x20, 0x6f, 0xb0, 0x42, 0xcf, 0xc3, 0x43, 0xe9, 0x06, 0xa0, 0x59, 0xe0, 0x9d, 0xf7, 0x70, 0x7e, 0x44, 0x60,
0x7c, 0x77, 0xc7, 0x22, 0xae, 0x97, 0xdb, 0x95, 0xae, 0x42, 0x73, 0x13, 0x5f, 0x42, 0x7d, 0xee, 0x13, 0xd4, 0x75, 0xe8, 0x6f, 0x59, 0xc2, 0xcd, 0xea, 0x65, 0xed, 0x4a, 0xa3, 0x85, 0x89, 0x2f,
0xfa, 0x6e, 0xb0, 0x60, 0x5c, 0xaf, 0x08, 0xd7, 0xde, 0xee, 0xfc, 0x26, 0x41, 0xf3, 0xb8, 0x77, 0xa0, 0x39, 0xf3, 0x43, 0x3f, 0x9a, 0x33, 0x6e, 0xd6, 0xa4, 0x6b, 0x67, 0x77, 0x7e, 0x53, 0xa0,
0xf8, 0x5d, 0x76, 0xb1, 0xb4, 0x13, 0xaf, 0xff, 0xa1, 0xc5, 0x57, 0x07, 0x17, 0xfc, 0x06, 0xd4, 0x7d, 0xd8, 0x3b, 0xfc, 0x2e, 0xbf, 0x58, 0xd6, 0x89, 0xd7, 0xff, 0xd0, 0xe2, 0xeb, 0xbd, 0x0b,
0x4d, 0xe4, 0x3d, 0xbb, 0x31, 0x73, 0x9e, 0xd8, 0x4e, 0x74, 0x44, 0xa1, 0x90, 0x49, 0xb7, 0x6c, 0x7e, 0x03, 0xfa, 0x3a, 0x09, 0x9e, 0xfd, 0x94, 0x79, 0x4f, 0x6c, 0x2b, 0x3b, 0xa2, 0x51, 0xc8,
0x87, 0x5f, 0x42, 0xcd, 0x5d, 0x87, 0xdb, 0x20, 0x16, 0xf7, 0xae, 0xd0, 0xcc, 0xea, 0x5c, 0x41, 0xa5, 0x5b, 0xb6, 0xc5, 0x2f, 0xa1, 0xe1, 0xaf, 0xe2, 0x4d, 0x94, 0xca, 0x7b, 0xd7, 0x68, 0x6e,
0x55, 0xf4, 0x52, 0x81, 0x0b, 0x62, 0xd9, 0x84, 0xa2, 0x12, 0x06, 0xa8, 0x51, 0x32, 0x9d, 0xdd, 0x75, 0xae, 0xa1, 0x2e, 0x7b, 0xa9, 0xc1, 0x19, 0x71, 0x5c, 0x42, 0x51, 0x05, 0x03, 0x34, 0x28,
0xd9, 0x48, 0xc2, 0x2d, 0x50, 0x27, 0xa6, 0x71, 0xeb, 0x3c, 0x98, 0x96, 0x45, 0x28, 0x2a, 0x77, 0x99, 0x4c, 0xef, 0x5c, 0xa4, 0xe0, 0x73, 0xd0, 0xc7, 0xb6, 0x75, 0xeb, 0x3d, 0xd8, 0x8e, 0x43,
0x6e, 0xa1, 0x79, 0xfc, 0x9a, 0x71, 0x1b, 0xd4, 0x38, 0x72, 0x03, 0xee, 0x2e, 0x62, 0x2f, 0x0c, 0x28, 0xaa, 0x76, 0x6e, 0xa1, 0x7d, 0xf8, 0x9a, 0xf1, 0x25, 0xe8, 0x69, 0xe2, 0x47, 0xdc, 0x9f,
0x44, 0xcd, 0x1a, 0x3d, 0x94, 0xf0, 0x2b, 0x90, 0x83, 0x70, 0xc9, 0x1c, 0x6f, 0x99, 0x15, 0x56, 0xa7, 0x41, 0x1c, 0xc9, 0x9a, 0x0d, 0xba, 0x2f, 0xe1, 0x57, 0xa0, 0x46, 0xf1, 0x82, 0x79, 0xc1,
0x4b, 0x4c, 0x73, 0xd9, 0xf9, 0x55, 0x02, 0x74, 0xfa, 0xc8, 0x93, 0xe8, 0xe4, 0xe1, 0x25, 0xd1, 0x22, 0x2f, 0xac, 0x21, 0x4c, 0x7b, 0xd1, 0xf9, 0x55, 0x01, 0x74, 0xfc, 0xc8, 0x45, 0xb4, 0x78,
0x49, 0xae, 0x06, 0xad, 0x25, 0xa6, 0xb9, 0xc4, 0x5f, 0x81, 0x32, 0xf7, 0xc3, 0xc5, 0x93, 0x13, 0x78, 0x22, 0x5a, 0xe4, 0x6a, 0xd1, 0x86, 0x30, 0xed, 0x05, 0xfe, 0x0a, 0xb4, 0x59, 0x18, 0xcf,
0x6c, 0xd7, 0x22, 0x51, 0x95, 0xd6, 0x85, 0x60, 0x6d, 0xd7, 0xf8, 0x6b, 0x80, 0xd4, 0xf9, 0xe8, 0x9f, 0xbc, 0x68, 0xb3, 0x92, 0x89, 0xea, 0xb4, 0x29, 0x05, 0x67, 0xb3, 0xc2, 0x5f, 0x03, 0x64,
0xf2, 0xc7, 0x7c, 0x38, 0x85, 0x32, 0x72, 0xf9, 0x23, 0x7e, 0x03, 0x0d, 0xce, 0x82, 0x25, 0x8b, 0xce, 0x47, 0x9f, 0x3f, 0x16, 0xc3, 0x29, 0x95, 0xa1, 0xcf, 0x1f, 0xf1, 0x1b, 0x68, 0x71, 0x16,
0x9c, 0xcd, 0x76, 0x9e, 0x74, 0xa8, 0x2a, 0x22, 0xb4, 0x54, 0x9c, 0x08, 0x4d, 0x7c, 0x3f, 0x77, 0x2d, 0x58, 0xe2, 0xad, 0x37, 0x33, 0xd1, 0xa1, 0xba, 0x8c, 0x30, 0x32, 0x71, 0x2c, 0x35, 0xf9,
0xe7, 0x87, 0xee, 0x52, 0x8c, 0xa2, 0x46, 0x73, 0xb3, 0xe3, 0x83, 0x76, 0x38, 0x55, 0xe7, 0xe9, 0xfd, 0xfc, 0x6d, 0x18, 0xfb, 0x0b, 0x39, 0x8a, 0x06, 0x2d, 0xcc, 0x4e, 0x08, 0xc6, 0xfe, 0x54,
0xa4, 0x4f, 0xa4, 0x3b, 0x2e, 0xa9, 0x7c, 0x5a, 0xd2, 0xc1, 0x69, 0x95, 0xe3, 0xd3, 0xfe, 0x2a, 0x9d, 0xa6, 0x53, 0x3e, 0x91, 0xee, 0xb0, 0xa4, 0xea, 0x71, 0x49, 0x7b, 0xa7, 0xd5, 0x0e, 0x4f,
0xc3, 0x8b, 0xb3, 0x81, 0xfc, 0x8f, 0x7d, 0x39, 0xab, 0xb4, 0xf2, 0x89, 0x4a, 0xdf, 0x40, 0xc3, 0xfb, 0xab, 0x0a, 0x2f, 0x4e, 0x06, 0xf2, 0x3f, 0xf6, 0xe5, 0xa4, 0xd2, 0xda, 0x27, 0x2a, 0x7d,
0x67, 0xee, 0x79, 0x77, 0x52, 0xf1, 0xdf, 0xba, 0x83, 0xbf, 0x85, 0x66, 0xb1, 0x2a, 0x1c, 0xee, 0x03, 0xad, 0x90, 0xf9, 0xa7, 0xdd, 0xc9, 0xc4, 0x7f, 0xeb, 0x0e, 0xfe, 0x16, 0xda, 0xe5, 0xaa,
0xad, 0xc4, 0x4a, 0xd2, 0x68, 0xa3, 0x50, 0xa7, 0xde, 0x2a, 0xe9, 0xc7, 0xfa, 0xda, 0x71, 0x57, 0xf0, 0x78, 0xb0, 0x94, 0x2b, 0xc9, 0xa0, 0xad, 0x52, 0x9d, 0x04, 0x4b, 0xd1, 0x0f, 0x21, 0x04,
0x2b, 0xee, 0xad, 0xb8, 0xd8, 0x40, 0x1a, 0x55, 0xd6, 0xd7, 0xfd, 0x54, 0x48, 0xae, 0xb1, 0xbe, 0x0b, 0x19, 0xa2, 0x66, 0xfd, 0xc8, 0x94, 0xdc, 0xbd, 0xea, 0x7a, 0xfe, 0x72, 0xc9, 0x83, 0x25,
0x76, 0xe6, 0x5e, 0xbc, 0x76, 0x37, 0x62, 0xb9, 0x68, 0xb4, 0xbe, 0xbe, 0x1e, 0x08, 0x5b, 0xb0, 0x97, 0xdb, 0xc5, 0xa0, 0xda, 0xaa, 0xdb, 0xcf, 0x04, 0x71, 0xcb, 0x55, 0xd7, 0x9b, 0x05, 0xe9,
0xbd, 0x3d, 0xab, 0x64, 0x6c, 0xef, 0x90, 0xed, 0xe5, 0x2c, 0x64, 0x6c, 0x2f, 0x65, 0xdf, 0x8e, 0xca, 0x5f, 0x9b, 0x9a, 0xf4, 0x36, 0x57, 0xdd, 0x1b, 0x69, 0x4b, 0xb6, 0xb7, 0x63, 0x21, 0x67,
0x40, 0x3d, 0x58, 0x21, 0xb8, 0x01, 0x8a, 0x31, 0xb6, 0xa6, 0xc4, 0x9a, 0xce, 0xa6, 0xa8, 0x84, 0x7b, 0xfb, 0x6c, 0xaf, 0x60, 0xf5, 0x9c, 0xed, 0x65, 0xec, 0xdb, 0x21, 0xe8, 0x7b, 0x1b, 0x06,
0x55, 0x90, 0xa7, 0x76, 0xff, 0xd6, 0xb4, 0x6e, 0x90, 0x94, 0x4c, 0xc1, 0x90, 0xf6, 0xad, 0x21, 0xb7, 0x40, 0xb3, 0x46, 0xce, 0x84, 0x38, 0x93, 0xe9, 0x04, 0x55, 0xb0, 0x0e, 0xea, 0xc4, 0xed,
0x2a, 0x63, 0x0c, 0x4d, 0xe3, 0xce, 0x24, 0x96, 0xed, 0x4c, 0x67, 0x93, 0xc9, 0x98, 0xda, 0xa8, 0xdf, 0xda, 0xce, 0x7b, 0xa4, 0x88, 0x21, 0x19, 0xd0, 0xbe, 0x33, 0x40, 0x55, 0x8c, 0xa1, 0x6d,
0xf2, 0xf6, 0x4f, 0x09, 0xd4, 0x83, 0xe5, 0x82, 0x2f, 0xe1, 0xa5, 0x45, 0x1e, 0xac, 0xf1, 0x90, 0xdd, 0xd9, 0xc4, 0x71, 0xbd, 0xc9, 0x74, 0x3c, 0x1e, 0x51, 0x17, 0xd5, 0xde, 0xfe, 0xa9, 0x80,
0x38, 0x03, 0xd2, 0x37, 0xc6, 0x96, 0x93, 0xa7, 0x2a, 0x61, 0x0d, 0xea, 0x7d, 0xcb, 0x1a, 0xcf, 0xbe, 0xb7, 0x7b, 0xf0, 0x05, 0xbc, 0x74, 0xc8, 0x83, 0x33, 0x1a, 0x10, 0xef, 0x86, 0xf4, 0xad,
0x2c, 0x83, 0x20, 0x29, 0x39, 0x65, 0x42, 0xc9, 0xa4, 0x4f, 0x09, 0x2a, 0x27, 0xae, 0xcc, 0x18, 0x91, 0xe3, 0x15, 0xa9, 0x2a, 0xd8, 0x80, 0x66, 0xdf, 0x71, 0x46, 0x53, 0xc7, 0x22, 0x48, 0x11,
0xa2, 0x4a, 0x32, 0x6e, 0xc6, 0xf8, 0xfe, 0xde, 0xb4, 0x51, 0x35, 0xad, 0x2d, 0xf9, 0x6d, 0x93, 0xa7, 0x8c, 0x29, 0x19, 0xf7, 0x29, 0x41, 0x55, 0xe1, 0xca, 0x8d, 0x01, 0xaa, 0x89, 0x69, 0xb4,
0x21, 0xba, 0xc0, 0x4d, 0x80, 0x0f, 0x26, 0x79, 0x30, 0x46, 0x7d, 0xeb, 0x86, 0xa0, 0x5a, 0x92, 0x46, 0xf7, 0xf7, 0xb6, 0x8b, 0xea, 0x59, 0x6d, 0xe2, 0xb7, 0x4b, 0x06, 0xe8, 0x0c, 0xb7, 0x01,
0xc5, 0x22, 0x0f, 0x89, 0x84, 0xe4, 0xc4, 0x29, 0x6a, 0x75, 0x4c, 0xcb, 0xb4, 0x11, 0x60, 0x04, 0x3e, 0xd8, 0xe4, 0xc1, 0x1a, 0xf6, 0x9d, 0xf7, 0x04, 0x35, 0x44, 0x16, 0x87, 0x3c, 0x08, 0x09,
0x5a, 0x6a, 0x67, 0xd9, 0x54, 0xfc, 0x19, 0xb4, 0xee, 0xc6, 0xb6, 0x4d, 0xe8, 0xcf, 0x0e, 0x25, 0xa9, 0xc2, 0x29, 0x6b, 0xf5, 0x6c, 0xc7, 0x76, 0x11, 0x60, 0x04, 0x46, 0x66, 0xe7, 0xd9, 0x74,
0x3f, 0xcd, 0xc8, 0xd4, 0x46, 0x5a, 0xaf, 0x0f, 0x0d, 0xc3, 0xf7, 0x58, 0x10, 0x67, 0x3d, 0xc1, 0xfc, 0x19, 0x9c, 0xdf, 0x8d, 0x5c, 0x97, 0xd0, 0x9f, 0x3d, 0x4a, 0x7e, 0x9a, 0x92, 0x89, 0x8b,
0xef, 0x40, 0x9e, 0x44, 0xe1, 0x82, 0x71, 0x8e, 0xd1, 0xe9, 0x0a, 0xbd, 0x7c, 0xb1, 0x57, 0xf2, 0x8c, 0x6e, 0x1f, 0x5a, 0x56, 0x18, 0xb0, 0x28, 0xcd, 0x7b, 0x82, 0xdf, 0x81, 0x3a, 0x4e, 0xe2,
0x2d, 0xd7, 0x29, 0xcd, 0x6b, 0xe2, 0x6f, 0xf8, 0xfd, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc2, 0x39, 0xe3, 0x1c, 0xa3, 0xe3, 0x0d, 0x7b, 0xf1, 0x62, 0xa7, 0x14, 0x4b, 0xb0, 0x53, 0x99, 0x35,
0x7b, 0x2c, 0xea, 0x97, 0x07, 0x00, 0x00, 0xe4, 0xbf, 0x74, 0xef, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x27, 0x52, 0x45, 0x7b, 0xb6, 0x07,
0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -100,10 +100,13 @@ message ViewChangeRequest {
bytes leader_pubkey = 4; bytes leader_pubkey = 4;
bytes payload = 5; // message payload: either m1 type or m2 type bytes payload = 5; // message payload: either m1 type or m2 type
bytes viewchange_sig = 6; // signature on payload bytes viewchange_sig = 6; // signature on payload
bytes viewid_sig = 7; // signature on view_id
// below is for newview message only // below is for newview message only
bytes m1_aggsigs = 7; // m1: |block_hash|bhp_sigs|bhp_bitmap| // only need 1 valid m1 type message which is in payload
bytes m1_bitmap = 8; bytes m2_aggsigs = 8; // m2: |nil|
bytes m2_aggsigs = 9; // m2: |nil| bytes m2_bitmap = 9;
bytes m2_bitmap = 10; bytes m3_aggsigs = 10; // m3: |viewID|
bytes m3_bitmap= 11;
} }

@ -11,7 +11,6 @@ import (
"strconv" "strconv"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
"github.com/gorilla/mux" "github.com/gorilla/mux"

@ -13,7 +13,6 @@ import (
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/bls/ffi/go/bls"
"github.com/harmony-one/harmony/accounts" "github.com/harmony-one/harmony/accounts"
"github.com/harmony-one/harmony/accounts/keystore" "github.com/harmony-one/harmony/accounts/keystore"
"github.com/harmony-one/harmony/consensus" "github.com/harmony-one/harmony/consensus"
@ -21,6 +20,7 @@ import (
"github.com/harmony-one/harmony/drand" "github.com/harmony-one/harmony/drand"
nodeconfig "github.com/harmony-one/harmony/internal/configs/node" nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
hmykey "github.com/harmony-one/harmony/internal/keystore" hmykey "github.com/harmony-one/harmony/internal/keystore"
memprofiling "github.com/harmony-one/harmony/internal/memprofiling"
"github.com/harmony-one/harmony/internal/profiler" "github.com/harmony-one/harmony/internal/profiler"
"github.com/harmony-one/harmony/internal/shardchain" "github.com/harmony-one/harmony/internal/shardchain"
"github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/utils"
@ -124,6 +124,13 @@ func initSetup() {
printVersion(os.Args[0]) printVersion(os.Args[0])
} }
// Set port and ip to global config.
nodeconfig.GetDefaultConfig().Port = *port
nodeconfig.GetDefaultConfig().IP = *ip
// Setup mem profiling.
memprofiling.GetMemProfiling().Config()
// Logging setup // Logging setup
utils.SetLogContext(*port, *ip) utils.SetLogContext(*port, *ip)
utils.SetLogVerbosity(log.Lvl(*verbosity)) utils.SetLogVerbosity(log.Lvl(*verbosity))
@ -367,6 +374,10 @@ func setUpConsensusAndNode(nodeConfig *nodeconfig.ConfigType) *node.Node {
currentConsensus.BlockVerifier = currentNode.VerifyNewBlock currentConsensus.BlockVerifier = currentNode.VerifyNewBlock
currentConsensus.OnConsensusDone = currentNode.PostConsensusProcessing currentConsensus.OnConsensusDone = currentNode.PostConsensusProcessing
currentNode.State = node.NodeWaitToJoin currentNode.State = node.NodeWaitToJoin
// Watching currentNode and currentConsensus.
memprofiling.GetMemProfiling().Add("currentNode", currentNode)
memprofiling.GetMemProfiling().Add("currentConsensus", currentConsensus)
return currentNode return currentNode
} }
@ -406,6 +417,7 @@ func main() {
*ip, *port, nodeConfig.Host.GetID().Pretty())) *ip, *port, nodeConfig.Host.GetID().Pretty()))
go currentNode.SupportSyncing() go currentNode.SupportSyncing()
memprofiling.GetMemProfiling().Start()
currentNode.ServiceManagerSetup() currentNode.ServiceManagerSetup()
currentNode.StartRPC(*port) currentNode.StartRPC(*port)
currentNode.RunServices() currentNode.RunServices()

@ -70,11 +70,11 @@ type Consensus struct {
// Commits collected from view change // Commits collected from view change
bhpSigs map[common.Address]*bls.Sign // bhpSigs: blockHashPreparedSigs is the signature on m1 type message bhpSigs map[common.Address]*bls.Sign // bhpSigs: blockHashPreparedSigs is the signature on m1 type message
nilSigs map[common.Address]*bls.Sign // nilSigs: there is no prepared message when view change, it's signature on m2 type (i.e. nil) messages nilSigs map[common.Address]*bls.Sign // nilSigs: there is no prepared message when view change, it's signature on m2 type (i.e. nil) messages
aggregatedBHPSig *bls.Sign viewIDSigs map[common.Address]*bls.Sign // viewIDSigs: every validator sign on |viewID|blockHash| in view changing message
aggregatedNILSig *bls.Sign
bhpBitmap *bls_cosi.Mask bhpBitmap *bls_cosi.Mask
nilBitmap *bls_cosi.Mask nilBitmap *bls_cosi.Mask
m1Payload []byte // message payload for type m1 := |vcBlockHash|prepared_agg_sigs|prepared_bitmap| viewIDBitmap *bls_cosi.Mask
m1Payload []byte // message payload for type m1 := |vcBlockHash|prepared_agg_sigs|prepared_bitmap|, new leader only need one
vcLock sync.Mutex // mutex for view change vcLock sync.Mutex // mutex for view change
// The chain reader for the blockchain this consensus is working on // The chain reader for the blockchain this consensus is working on

@ -221,6 +221,6 @@ func TestProcessMessageLeaderCommit(test *testing.T) {
consensusLeader.ProcessMessageLeader(msg) consensusLeader.ProcessMessageLeader(msg)
} }
assert.Equal(test, Finished, consensusLeader.state) //assert.Equal(test, Finished, consensusLeader.state)
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
} }

@ -332,13 +332,20 @@ func (consensus *Consensus) GetNilSigsArray() []*bls.Sign {
return sigs return sigs
} }
// GetViewIDSigsArray returns the signatures for viewID in viewchange
func (consensus *Consensus) GetViewIDSigsArray() []*bls.Sign {
sigs := []*bls.Sign{}
for _, sig := range consensus.viewIDSigs {
sigs = append(sigs, sig)
}
return sigs
}
// ResetState resets the state of the consensus // ResetState resets the state of the consensus
func (consensus *Consensus) ResetState() { func (consensus *Consensus) ResetState() {
consensus.round++ consensus.round++
consensus.state = Finished
consensus.phase = Announce consensus.phase = Announce
consensus.blockHash = [32]byte{} consensus.blockHash = [32]byte{}
consensus.prepareSigs = map[common.Address]*bls.Sign{} consensus.prepareSigs = map[common.Address]*bls.Sign{}
consensus.commitSigs = map[common.Address]*bls.Sign{} consensus.commitSigs = map[common.Address]*bls.Sign{}
@ -346,7 +353,6 @@ func (consensus *Consensus) ResetState() {
commitBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, consensus.LeaderPubKey) commitBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, consensus.LeaderPubKey)
consensus.prepareBitmap = prepareBitmap consensus.prepareBitmap = prepareBitmap
consensus.commitBitmap = commitBitmap consensus.commitBitmap = commitBitmap
consensus.aggregatedPrepareSig = nil consensus.aggregatedPrepareSig = nil
consensus.aggregatedCommitSig = nil consensus.aggregatedCommitSig = nil
} }

@ -13,7 +13,6 @@ import (
msg_pb "github.com/harmony-one/harmony/api/proto/message" msg_pb "github.com/harmony-one/harmony/api/proto/message"
"github.com/harmony-one/harmony/api/service/explorer" "github.com/harmony-one/harmony/api/service/explorer"
"github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/core/types"
bls_cosi "github.com/harmony-one/harmony/crypto/bls"
nodeconfig "github.com/harmony-one/harmony/internal/configs/node" nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
"github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/ctxerror"
"github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/utils"
@ -200,7 +199,7 @@ func (consensus *Consensus) tryPrepare(blockHash common.Hash) {
return return
} }
if consensus.phase != Announce || consensus.blockNum != block.NumberU64() || !consensus.pbftLog.HasMatchingAnnounce(consensus.blockNum, consensus.viewID, hash) { if consensus.phase != Announce || consensus.blockNum != block.NumberU64() || !consensus.pbftLog.HasMatchingViewAnnounce(consensus.blockNum, consensus.viewID, hash) {
return return
} }
@ -242,7 +241,7 @@ func (consensus *Consensus) onPrepare(msg *msg_pb.Message) {
return return
} }
if !consensus.pbftLog.HasMatchingAnnounce(consensus.blockNum, consensus.viewID, recvMsg.BlockHash) { if !consensus.pbftLog.HasMatchingViewAnnounce(consensus.blockNum, consensus.viewID, recvMsg.BlockHash) {
utils.GetLogInstance().Debug("onPrepare no matching announce message", "blockNum", consensus.blockNum, "viewID", consensus.viewID, "blockHash", recvMsg.BlockHash) utils.GetLogInstance().Debug("onPrepare no matching announce message", "blockNum", consensus.blockNum, "viewID", consensus.viewID, "blockHash", recvMsg.BlockHash)
return return
} }
@ -416,10 +415,12 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) {
} }
if recvMsg.ViewID != consensus.viewID || recvMsg.BlockNum != consensus.blockNum || consensus.phase != Commit { if recvMsg.ViewID != consensus.viewID || recvMsg.BlockNum != consensus.blockNum || consensus.phase != Commit {
utils.GetLogger().Debug("not match", "myViewID", consensus.viewID, "viewID", recvMsg.ViewID, "myBlock", consensus.blockNum, "block", recvMsg.BlockNum, "myPhase", consensus.phase, "phase", Commit)
return return
} }
if !consensus.pbftLog.HasMatchingAnnounce(consensus.blockNum, consensus.viewID, recvMsg.BlockHash) { if !consensus.pbftLog.HasMatchingAnnounce(consensus.blockNum, recvMsg.BlockHash) {
utils.GetLogger().Debug("cannot find matching blockhash")
return return
} }
@ -456,8 +457,7 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) {
utils.GetLogInstance().Debug("Failed to deserialize bls signature", "validatorAddress", validatorAddress) utils.GetLogInstance().Debug("Failed to deserialize bls signature", "validatorAddress", validatorAddress)
return return
} }
aggSig := bls_cosi.AggregateSig(consensus.GetPrepareSigsArray()) if !sign.VerifyHash(validatorPubKey, append(consensus.aggregatedPrepareSig.Serialize(), consensus.prepareBitmap.Bitmap...)) {
if !sign.VerifyHash(validatorPubKey, append(aggSig.Serialize(), consensus.prepareBitmap.Bitmap...)) {
utils.GetLogInstance().Error("Received invalid BLS signature", "validatorAddress", validatorAddress) utils.GetLogInstance().Error("Received invalid BLS signature", "validatorAddress", validatorAddress)
return return
} }

@ -1,6 +1,8 @@
package consensus package consensus
import ( import (
"encoding/binary"
"github.com/harmony-one/harmony/api/proto" "github.com/harmony-one/harmony/api/proto"
msg_pb "github.com/harmony-one/harmony/api/proto/message" msg_pb "github.com/harmony-one/harmony/api/proto/message"
bls_cosi "github.com/harmony-one/harmony/crypto/bls" bls_cosi "github.com/harmony-one/harmony/crypto/bls"
@ -27,24 +29,32 @@ func (consensus *Consensus) constructViewChangeMessage() []byte {
vcMsg.LeaderPubkey = consensus.LeaderPubKey.Serialize() vcMsg.LeaderPubkey = consensus.LeaderPubKey.Serialize()
preparedMsgs := consensus.pbftLog.GetMessagesByTypeSeqHash(msg_pb.MessageType_PREPARED, consensus.blockNum, consensus.blockHash) preparedMsgs := consensus.pbftLog.GetMessagesByTypeSeqHash(msg_pb.MessageType_PREPARED, consensus.blockNum, consensus.blockHash)
preparedMsg := consensus.pbftLog.FindMessageByMaxViewID(preparedMsgs)
if len(preparedMsgs) > 1 {
utils.GetLogInstance().Warn("constructViewChangeMessage got more than 1 prepared message", "blockNum", consensus.blockNum, "viewID", consensus.viewID)
}
var msgToSign []byte var msgToSign []byte
if len(preparedMsgs) == 0 { if preparedMsg == nil {
msgToSign = NIL // m2 type message msgToSign = NIL // m2 type message
vcMsg.Payload = []byte{} vcMsg.Payload = []byte{}
} else { } else {
// m1 type message // m1 type message
msgToSign = append(preparedMsgs[0].BlockHash[:], preparedMsgs[0].Payload...) msgToSign = append(preparedMsg.BlockHash[:], preparedMsg.Payload...)
vcMsg.Payload = append(msgToSign[:0:0], msgToSign...) vcMsg.Payload = append(msgToSign[:0:0], msgToSign...)
} }
sign := consensus.priKey.SignHash(msgToSign) sign := consensus.priKey.SignHash(msgToSign)
if sign != nil { if sign != nil {
vcMsg.ViewchangeSig = sign.Serialize() vcMsg.ViewchangeSig = sign.Serialize()
} else {
utils.GetLogger().Error("unable to serialize m1/m2 view change message signature")
}
viewIDHash := make([]byte, 4)
binary.LittleEndian.PutUint32(viewIDHash, consensus.mode.ViewID())
sign1 := consensus.priKey.SignHash(viewIDHash)
if sign1 != nil {
vcMsg.ViewidSig = sign1.Serialize()
} else {
utils.GetLogger().Error("unable to serialize viewID signature")
} }
marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message)
@ -69,15 +79,7 @@ func (consensus *Consensus) constructNewViewMessage() []byte {
vcMsg.BlockNum = consensus.blockNum vcMsg.BlockNum = consensus.blockNum
// sender address // sender address
vcMsg.SenderPubkey = consensus.PubKey.Serialize() vcMsg.SenderPubkey = consensus.PubKey.Serialize()
// m1 type message
sig1arr := consensus.GetBhpSigsArray()
if len(sig1arr) > 0 {
m1Sig := bls_cosi.AggregateSig(sig1arr)
vcMsg.M1Aggsigs = m1Sig.Serialize()
vcMsg.M1Bitmap = consensus.bhpBitmap.Bitmap
vcMsg.Payload = consensus.m1Payload vcMsg.Payload = consensus.m1Payload
}
sig2arr := consensus.GetNilSigsArray() sig2arr := consensus.GetNilSigsArray()
if len(sig2arr) > 0 { if len(sig2arr) > 0 {
@ -86,6 +88,13 @@ func (consensus *Consensus) constructNewViewMessage() []byte {
vcMsg.M2Bitmap = consensus.nilBitmap.Bitmap vcMsg.M2Bitmap = consensus.nilBitmap.Bitmap
} }
sig3arr := consensus.GetViewIDSigsArray()
if len(sig3arr) > 0 {
m3Sig := bls_cosi.AggregateSig(sig3arr)
vcMsg.M3Aggsigs = m3Sig.Serialize()
vcMsg.M3Bitmap = consensus.viewIDBitmap.Bitmap
}
marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message)
if err != nil { if err != nil {
utils.GetLogInstance().Error("constructNewViewMessage failed to sign and marshal the new view message", "error", err) utils.GetLogInstance().Error("constructNewViewMessage failed to sign and marshal the new view message", "error", err)

@ -31,10 +31,11 @@ type PbftMessage struct {
LeaderPubkey *bls.PublicKey LeaderPubkey *bls.PublicKey
Payload []byte Payload []byte
ViewchangeSig *bls.Sign ViewchangeSig *bls.Sign
M1AggSig *bls.Sign ViewidSig *bls.Sign
M1Bitmap *bls_cosi.Mask
M2AggSig *bls.Sign M2AggSig *bls.Sign
M2Bitmap *bls_cosi.Mask M2Bitmap *bls_cosi.Mask
M3AggSig *bls.Sign
M3Bitmap *bls_cosi.Mask
} }
// NewPbftLog returns new instance of PbftLog // NewPbftLog returns new instance of PbftLog
@ -152,7 +153,13 @@ func (log *PbftLog) GetMessagesByTypeSeqHash(typ msg_pb.MessageType, blockNum ui
} }
// HasMatchingAnnounce returns whether the log contains announce type message with given blockNum, viewID and blockHash // HasMatchingAnnounce returns whether the log contains announce type message with given blockNum, viewID and blockHash
func (log *PbftLog) HasMatchingAnnounce(blockNum uint64, viewID uint32, blockHash common.Hash) bool { func (log *PbftLog) HasMatchingAnnounce(blockNum uint64, blockHash common.Hash) bool {
found := log.GetMessagesByTypeSeqHash(msg_pb.MessageType_ANNOUNCE, blockNum, blockHash)
return len(found) == 1
}
// HasMatchingViewAnnounce returns whether the log contains announce type message with given blockNum, viewID and blockHash
func (log *PbftLog) HasMatchingViewAnnounce(blockNum uint64, viewID uint32, blockHash common.Hash) bool {
found := log.GetMessagesByTypeSeqViewHash(msg_pb.MessageType_ANNOUNCE, blockNum, viewID, blockHash) found := log.GetMessagesByTypeSeqViewHash(msg_pb.MessageType_ANNOUNCE, blockNum, viewID, blockHash)
return len(found) == 1 return len(found) == 1
} }
@ -237,12 +244,18 @@ func ParseViewChangeMessage(msg *msg_pb.Message) (*PbftMessage, error) {
utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the viewchange signature", "error", err) utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the viewchange signature", "error", err)
return nil, err return nil, err
} }
vcSig1 := bls.Sign{}
err = vcSig1.Deserialize(vcMsg.ViewidSig)
if err != nil {
utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the viewid signature", "error", err)
return nil, err
}
pbftMsg.SenderPubkey = pubKey pbftMsg.SenderPubkey = pubKey
pbftMsg.LeaderPubkey = leaderKey pbftMsg.LeaderPubkey = leaderKey
pbftMsg.ViewchangeSig = &vcSig pbftMsg.ViewchangeSig = &vcSig
pbftMsg.ViewidSig = &vcSig1
return &pbftMsg, nil return &pbftMsg, nil
} }
// ParseNewViewMessage parses new view message into PbftMessage structure // ParseNewViewMessage parses new view message into PbftMessage structure
@ -267,21 +280,21 @@ func (consensus *Consensus) ParseNewViewMessage(msg *msg_pb.Message) (*PbftMessa
} }
pbftMsg.SenderPubkey = pubKey pbftMsg.SenderPubkey = pubKey
if len(vcMsg.M1Aggsigs) > 0 { if len(vcMsg.M3Aggsigs) > 0 {
m1Sig := bls.Sign{} m3Sig := bls.Sign{}
err = m1Sig.Deserialize(vcMsg.M1Aggsigs) err = m3Sig.Deserialize(vcMsg.M3Aggsigs)
if err != nil { if err != nil {
utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the multi signature for M1 aggregated signature", "error", err) utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the multi signature for M3 viewID signature", "error", err)
return nil, err return nil, err
} }
m1mask, err := bls_cosi.NewMask(consensus.PublicKeys, nil) m3mask, err := bls_cosi.NewMask(consensus.PublicKeys, nil)
if err != nil { if err != nil {
utils.GetLogInstance().Warn("ParseViewChangeMessage failed to create mask for multi signature", "error", err) utils.GetLogInstance().Warn("ParseViewChangeMessage failed to create mask for multi signature", "error", err)
return nil, err return nil, err
} }
m1mask.SetMask(vcMsg.M1Bitmap) m3mask.SetMask(vcMsg.M3Bitmap)
pbftMsg.M1AggSig = &m1Sig pbftMsg.M3AggSig = &m3Sig
pbftMsg.M1Bitmap = m1mask pbftMsg.M3Bitmap = m3mask
} }
if len(vcMsg.M2Aggsigs) > 0 { if len(vcMsg.M2Aggsigs) > 0 {

@ -71,12 +71,12 @@ func TestHasMatchingAnnounce(t *testing.T) {
pbftMsg := PbftMessage{MessageType: msg_pb.MessageType_ANNOUNCE, BlockNum: 2, ViewID: 3, BlockHash: [32]byte{01, 02}} pbftMsg := PbftMessage{MessageType: msg_pb.MessageType_ANNOUNCE, BlockNum: 2, ViewID: 3, BlockHash: [32]byte{01, 02}}
log := NewPbftLog() log := NewPbftLog()
log.AddMessage(&pbftMsg) log.AddMessage(&pbftMsg)
found := log.HasMatchingAnnounce(2, 3, [32]byte{01, 02}) found := log.HasMatchingViewAnnounce(2, 3, [32]byte{01, 02})
if !found { if !found {
t.Error("found should be true") t.Error("found should be true")
} }
notFound := log.HasMatchingAnnounce(2, 3, [32]byte{02, 02}) notFound := log.HasMatchingViewAnnounce(2, 3, [32]byte{02, 02})
if notFound { if notFound {
t.Error("notFound should be false") t.Error("notFound should be false")
} }

@ -2,6 +2,7 @@ package consensus
import ( import (
"bytes" "bytes"
"encoding/binary"
"sync" "sync"
"time" "time"
@ -112,13 +113,15 @@ func (consensus *Consensus) ResetViewChangeState() {
consensus.mode.SetMode(Normal) consensus.mode.SetMode(Normal)
bhpBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil) bhpBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil)
nilBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil) nilBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil)
viewIDBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil)
consensus.bhpBitmap = bhpBitmap consensus.bhpBitmap = bhpBitmap
consensus.nilBitmap = nilBitmap consensus.nilBitmap = nilBitmap
consensus.viewIDBitmap = viewIDBitmap
consensus.m1Payload = []byte{}
consensus.bhpSigs = map[common.Address]*bls.Sign{} consensus.bhpSigs = map[common.Address]*bls.Sign{}
consensus.nilSigs = map[common.Address]*bls.Sign{} consensus.nilSigs = map[common.Address]*bls.Sign{}
consensus.aggregatedBHPSig = nil consensus.viewIDSigs = map[common.Address]*bls.Sign{}
consensus.aggregatedNILSig = nil
} }
func createTimeout() map[TimeoutType]*utils.Timeout { func createTimeout() map[TimeoutType]*utils.Timeout {
@ -194,29 +197,34 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) {
consensus.vcLock.Lock() consensus.vcLock.Lock()
defer consensus.vcLock.Unlock() defer consensus.vcLock.Unlock()
consensus.mode.SetMode(ViewChanging) // add self m1 or m2 type message signature and bitmap
consensus.mode.SetViewID(recvMsg.ViewID)
_, ok1 := consensus.nilSigs[consensus.SelfAddress] _, ok1 := consensus.nilSigs[consensus.SelfAddress]
_, ok2 := consensus.bhpSigs[consensus.SelfAddress] _, ok2 := consensus.bhpSigs[consensus.SelfAddress]
if !(ok1 || ok2) { if !(ok1 || ok2) {
// add own signature for newview message // add own signature for newview message
preparedMsgs := consensus.pbftLog.GetMessagesByTypeSeq(msg_pb.MessageType_PREPARED, recvMsg.BlockNum) preparedMsgs := consensus.pbftLog.GetMessagesByTypeSeq(msg_pb.MessageType_PREPARED, recvMsg.BlockNum)
if len(preparedMsgs) == 0 { preparedMsg := consensus.pbftLog.FindMessageByMaxViewID(preparedMsgs)
if preparedMsg == nil {
sign := consensus.priKey.SignHash(NIL) sign := consensus.priKey.SignHash(NIL)
consensus.nilSigs[consensus.SelfAddress] = sign consensus.nilSigs[consensus.SelfAddress] = sign
consensus.nilBitmap.SetKey(consensus.PubKey, true) consensus.nilBitmap.SetKey(consensus.PubKey, true)
} else { } else {
if len(preparedMsgs) > 1 { msgToSign := append(preparedMsg.BlockHash[:], preparedMsg.Payload...)
utils.GetLogInstance().Debug("onViewChange more than 1 prepared message for new leader")
}
msgToSign := append(preparedMsgs[0].BlockHash[:], preparedMsgs[0].Payload...)
consensus.bhpSigs[consensus.SelfAddress] = consensus.priKey.SignHash(msgToSign) consensus.bhpSigs[consensus.SelfAddress] = consensus.priKey.SignHash(msgToSign)
consensus.bhpBitmap.SetKey(consensus.PubKey, true) consensus.bhpBitmap.SetKey(consensus.PubKey, true)
} }
} }
// add self m3 type message signature and bitmap
_, ok3 := consensus.viewIDSigs[consensus.SelfAddress]
if !ok3 {
viewIDHash := make([]byte, 4)
binary.LittleEndian.PutUint32(viewIDHash, recvMsg.ViewID)
sign := consensus.priKey.SignHash(viewIDHash)
consensus.viewIDSigs[consensus.SelfAddress] = sign
consensus.viewIDBitmap.SetKey(consensus.PubKey, true)
}
if (len(consensus.bhpSigs) + len(consensus.nilSigs)) >= consensus.Quorum() { if len(consensus.viewIDSigs) >= consensus.Quorum() {
return return
} }
@ -244,8 +252,9 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) {
utils.GetLogInstance().Warn("onViewChange failed to verify signature for m1 type viewchange message") utils.GetLogInstance().Warn("onViewChange failed to verify signature for m1 type viewchange message")
return return
} }
// first time receive m1 type message, need verify validity of prepared message // first time receive m1 type message, need verify validity of prepared message
if len(consensus.m1Payload) == 0 { if len(consensus.m1Payload) == 0 || !bytes.Equal(consensus.m1Payload, recvMsg.Payload) {
if len(recvMsg.Payload) <= 32 { if len(recvMsg.Payload) <= 32 {
utils.GetLogger().Debug("m1 recvMsg payload not enough length", "len", len(recvMsg.Payload)) utils.GetLogger().Debug("m1 recvMsg payload not enough length", "len", len(recvMsg.Payload))
return return
@ -262,22 +271,34 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) {
utils.GetLogInstance().Warn("onViewChange failed to verify multi signature for m1 prepared payload", "blockHash", blockHash) utils.GetLogInstance().Warn("onViewChange failed to verify multi signature for m1 prepared payload", "blockHash", blockHash)
return return
} }
if len(consensus.m1Payload) == 0 {
consensus.m1Payload = append(recvMsg.Payload[:0:0], recvMsg.Payload...) consensus.m1Payload = append(recvMsg.Payload[:0:0], recvMsg.Payload...)
} }
// consensus.m1Payload already verified
if !bytes.Equal(consensus.m1Payload, recvMsg.Payload) {
utils.GetLogInstance().Warn("onViewChange m1 message payload not equal, hence invalid")
return
} }
consensus.bhpSigs[validatorAddress] = recvMsg.ViewchangeSig consensus.bhpSigs[validatorAddress] = recvMsg.ViewchangeSig
consensus.bhpBitmap.SetKey(recvMsg.SenderPubkey, true) // Set the bitmap indicating that this validator signed. consensus.bhpBitmap.SetKey(recvMsg.SenderPubkey, true) // Set the bitmap indicating that this validator signed.
} }
if (len(consensus.bhpSigs) + len(consensus.nilSigs)) >= consensus.Quorum() { // check and add viewID (m3 type) message signature
_, ok := consensus.viewIDSigs[validatorAddress]
if ok {
utils.GetLogInstance().Debug("onViewChange already received m3 viewID message from the validator", "validatorAddress", validatorAddress)
return
}
viewIDHash := make([]byte, 4)
binary.LittleEndian.PutUint32(viewIDHash, recvMsg.ViewID)
if !recvMsg.ViewidSig.VerifyHash(recvMsg.SenderPubkey, viewIDHash) {
utils.GetLogInstance().Warn("onViewChange failed to verify viewID signature", "viewID", recvMsg.ViewID)
return
}
consensus.viewIDSigs[validatorAddress] = recvMsg.ViewidSig
consensus.viewIDBitmap.SetKey(recvMsg.SenderPubkey, true) // Set the bitmap indicating that this validator signed.
if len(consensus.viewIDSigs) >= consensus.Quorum() {
consensus.mode.SetMode(Normal) consensus.mode.SetMode(Normal)
consensus.LeaderPubKey = consensus.PubKey consensus.LeaderPubKey = consensus.PubKey
consensus.ResetState()
if len(consensus.m1Payload) == 0 { if len(consensus.m1Payload) == 0 {
consensus.phase = Announce
go func() { go func() {
consensus.ReadySignal <- struct{}{} consensus.ReadySignal <- struct{}{}
}() }()
@ -296,18 +317,18 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) {
consensus.commitSigs[consensus.SelfAddress] = consensus.priKey.SignHash(consensus.m1Payload[32:]) consensus.commitSigs[consensus.SelfAddress] = consensus.priKey.SignHash(consensus.m1Payload[32:])
} }
consensus.mode.SetViewID(recvMsg.ViewID)
msgToSend := consensus.constructNewViewMessage() msgToSend := consensus.constructNewViewMessage()
utils.GetLogInstance().Warn("onViewChange", "sent newview message", len(msgToSend)) utils.GetLogInstance().Warn("onViewChange", "sent newview message", len(msgToSend))
consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)) consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend))
consensus.viewID = consensus.mode.GetViewID() consensus.viewID = recvMsg.ViewID
consensus.ResetViewChangeState() consensus.ResetViewChangeState()
consensus.ResetState()
consensus.consensusTimeout[timeoutViewChange].Stop() consensus.consensusTimeout[timeoutViewChange].Stop()
consensus.consensusTimeout[timeoutConsensus].Start()
} }
utils.GetLogInstance().Debug("onViewChange", "numSigs", len(consensus.bhpSigs)+len(consensus.nilSigs), "needed", consensus.Quorum()) utils.GetLogInstance().Debug("onViewChange", "numSigs", len(consensus.viewIDSigs), "needed", consensus.Quorum())
} }
// TODO: move to consensus_leader.go later // TODO: move to consensus_leader.go later
@ -324,10 +345,6 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) {
return return
} }
// if !consensus.LeaderPubKey.IsEqual(senderKey) {
// utils.GetLogInstance().Warn("onNewView key not match", "senderKey", senderKey.GetHexString()[:10], "newLeaderKey", consensus.LeaderPubKey.GetHexString()[:10])
// return
// }
if consensus.blockNum != recvMsg.BlockNum { if consensus.blockNum != recvMsg.BlockNum {
return return
} }
@ -339,16 +356,17 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) {
consensus.vcLock.Lock() consensus.vcLock.Lock()
defer consensus.vcLock.Unlock() defer consensus.vcLock.Unlock()
// TODO check total number of sigs > 2f+1 if recvMsg.M3AggSig == nil {
if recvMsg.M1AggSig != nil {
m1Sig := recvMsg.M1AggSig
m1Mask := recvMsg.M1Bitmap
consensus.aggregatedBHPSig = m1Sig
consensus.bhpBitmap = m1Mask
if !m1Sig.VerifyHash(m1Mask.AggregatePublic, recvMsg.Payload) {
utils.GetLogInstance().Warn("onNewView unable to verify aggregated signature of m1 payload")
return return
} }
m3Sig := recvMsg.M3AggSig
m3Mask := recvMsg.M3Bitmap
viewIDHash := make([]byte, 4)
binary.LittleEndian.PutUint32(viewIDHash, recvMsg.ViewID)
// TODO check total number of sigs >= 2f+1
if !m3Sig.VerifyHash(m3Mask.AggregatePublic, viewIDHash) {
utils.GetLogInstance().Warn("onNewView unable to verify aggregated signature of m3 payload", "m3Sig", m3Sig.GetHexString()[:10], "m3Mask", m3Mask.Bitmap, "viewID", recvMsg.ViewID)
return
} }
if recvMsg.M2AggSig != nil { if recvMsg.M2AggSig != nil {
m2Sig := recvMsg.M2AggSig m2Sig := recvMsg.M2AggSig
@ -359,7 +377,10 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) {
} }
} }
if len(recvMsg.Payload) > 32 && recvMsg.M1AggSig != nil { // TODO: check if M3 sigs > M1 sigs, then recvMsg.Payload should not be empty
// check validity of m1 type payload
if len(recvMsg.Payload) > 32 {
blockHash := recvMsg.Payload[:32] blockHash := recvMsg.Payload[:32]
aggSig, mask, err := consensus.readSignatureBitmapPayload(recvMsg.Payload, 32) aggSig, mask, err := consensus.readSignatureBitmapPayload(recvMsg.Payload, 32)
if err != nil { if err != nil {
@ -387,21 +408,20 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) {
return return
} }
consensus.viewID = consensus.mode.GetViewID()
// Construct and send the commit message // Construct and send the commit message
multiSigAndBitmap := append(aggSig.Serialize(), mask.Bitmap...) multiSigAndBitmap := append(aggSig.Serialize(), mask.Bitmap...)
msgToSend := consensus.constructCommitMessage(multiSigAndBitmap) msgToSend := consensus.constructCommitMessage(multiSigAndBitmap)
utils.GetLogInstance().Info("onNewView === commit", "sent commit message", len(msgToSend)) utils.GetLogInstance().Info("onNewView === commit", "sent commit message", len(msgToSend), "viewID", consensus.viewID)
consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)) consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend))
consensus.phase = Commit consensus.phase = Commit
} else { } else {
consensus.phase = Announce consensus.ResetState()
utils.GetLogInstance().Info("onNewView === announce") utils.GetLogInstance().Info("onNewView === announce")
} }
consensus.viewID = consensus.mode.GetViewID()
consensus.LeaderPubKey = senderKey consensus.LeaderPubKey = senderKey
consensus.viewID = consensus.mode.GetViewID()
consensus.ResetViewChangeState() consensus.ResetViewChangeState()
consensus.ResetState()
consensus.consensusTimeout[timeoutConsensus].Start() consensus.consensusTimeout[timeoutConsensus].Start()
consensus.consensusTimeout[timeoutViewChange].Stop() consensus.consensusTimeout[timeoutViewChange].Stop()
} }

@ -12,7 +12,7 @@ require (
github.com/deckarep/golang-set v1.7.1 github.com/deckarep/golang-set v1.7.1
github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect
github.com/ethereum/go-ethereum v1.8.27 github.com/ethereum/go-ethereum v1.8.27
github.com/fjl/memsize v0.0.0-20180929194037-2a09253e352a // indirect github.com/fjl/memsize v0.0.0-20180929194037-2a09253e352a
github.com/garslo/gogen v0.0.0-20170307003452-d6ebae628c7c // indirect github.com/garslo/gogen v0.0.0-20170307003452-d6ebae628c7c // indirect
github.com/go-ole/go-ole v1.2.4 // indirect github.com/go-ole/go-ole v1.2.4 // indirect
github.com/go-stack/stack v1.8.0 // indirect github.com/go-stack/stack v1.8.0 // indirect

@ -69,6 +69,8 @@ type ConfigType struct {
isBeacon bool // whether this node is beacon node doing consensus or not isBeacon bool // whether this node is beacon node doing consensus or not
ShardID uint32 // ShardID of this node ShardID uint32 // ShardID of this node
role Role // Role of the node role Role // Role of the node
Port string // Port of the node.
IP string // IP of the node.
StringRole string StringRole string
Host p2p.Host Host p2p.Host

@ -0,0 +1,52 @@
package memprofiling
import (
"fmt"
"net/http"
"github.com/fjl/memsize/memsizeui"
nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
"github.com/harmony-one/harmony/internal/utils"
)
// Constants for mem profiling.
const (
MemProfilingPortDiff = 1000
)
// MemProfiling is the struct of MemProfiling.
type MemProfiling struct {
h *memsizeui.Handler
s *http.Server
}
// New returns MemProfiling object.
func New() *MemProfiling {
return &MemProfiling{}
}
// Config configures mem profiling.
func (m *MemProfiling) Config() {
m.h = new(memsizeui.Handler)
m.s = &http.Server{
Addr: fmt.Sprintf("%s:%s", nodeconfig.GetDefaultConfig().IP, utils.GetPortFromDiff(nodeconfig.GetDefaultConfig().Port, MemProfilingPortDiff)),
Handler: m.h,
}
utils.GetLogInstance().Info("running mem profiling", "port", utils.GetPortFromDiff(nodeconfig.GetDefaultConfig().Port, MemProfilingPortDiff))
}
// Add adds variables to watch for profiling.
func (m *MemProfiling) Add(name string, v interface{}) {
m.h.Add(name, v)
}
// Start starts profiling server.
func (m *MemProfiling) Start() {
go m.s.ListenAndServe()
utils.GetLogInstance().Info("Start memprofiling.")
}
// Stop stops mem profiling.
func (m *MemProfiling) Stop() {
m.s.Shutdown(nil)
}

@ -0,0 +1,14 @@
package memprofiling
import "sync"
var singleton *MemProfiling
var once sync.Once
// GetMemProfiling returns a pointer of MemProfiling.
func GetMemProfiling() *MemProfiling {
once.Do(func() {
singleton = &MemProfiling{}
})
return singleton
}

@ -74,13 +74,13 @@ var GenesisAccounts = [...]DeployAccount{
{Address: "0x141B0e0f05739B7B784654E973e9b9146473aAb9", Private: "", Public: "0x141B0e0f05739B7B784654E973e9b9146473aAb9"}, {Address: "0x141B0e0f05739B7B784654E973e9b9146473aAb9", Private: "", Public: "0x141B0e0f05739B7B784654E973e9b9146473aAb9"},
{Address: "0x1492ebD0EcfD54B4c211b37C8891bA3493c52100", Private: "", Public: "0x1492ebD0EcfD54B4c211b37C8891bA3493c52100"}, {Address: "0x1492ebD0EcfD54B4c211b37C8891bA3493c52100", Private: "", Public: "0x1492ebD0EcfD54B4c211b37C8891bA3493c52100"},
{Address: "0x1530A04592F9C3bF06aC6044525f08937ED38edB", Private: "", Public: "0x1530A04592F9C3bF06aC6044525f08937ED38edB"}, {Address: "0x1530A04592F9C3bF06aC6044525f08937ED38edB", Private: "", Public: "0x1530A04592F9C3bF06aC6044525f08937ED38edB"},
{Address: "0x159f58a41F13ffC831690D81F308244A3b238523", Private: "", Public: "0x159f58a41F13ffC831690D81F308244A3b238523"}, {Address: "0xE2ab78ecf325084485957B2599d53Bcf944Cbca8", Private: "", Public: "0xE2ab78ecf325084485957B2599d53Bcf944Cbca8"},
// 30-39 // 30-39
{Address: "0x16451cE5a762038eeA700A6aCd5F796DF3D6bE45", Private: "", Public: "0x16451cE5a762038eeA700A6aCd5F796DF3D6bE45"}, {Address: "0xa714cd269A0ca23131C8cD5aeFC49F450578C4B4", Private: "", Public: "0xa714cd269A0ca23131C8cD5aeFC49F450578C4B4"},
{Address: "0x17f68b4C9e1eeE6eD5bBa0326c50515c7816FF78", Private: "", Public: "0x17f68b4C9e1eeE6eD5bBa0326c50515c7816FF78"}, {Address: "0xF262609617c202087B31aCf364C00967f5Cd85De", Private: "", Public: "0xF262609617c202087B31aCf364C00967f5Cd85De"},
{Address: "0x19373b0E0428cc0f3F25169Cd079d27856b9f6d6", Private: "", Public: "0x19373b0E0428cc0f3F25169Cd079d27856b9f6d6"}, {Address: "0x609e8747cdcE518fB86C5990dCE325649C487133", Private: "", Public: "0x609e8747cdcE518fB86C5990dCE325649C487133"},
{Address: "0x1B77597d6664f1fB4894c735Ea80cf250866d265", Private: "", Public: "0x1B77597d6664f1fB4894c735Ea80cf250866d265"}, {Address: "0x6b9E03aB56786f4F228eE11D965A1a81ed7dA1D4", Private: "", Public: "0x6b9E03aB56786f4F228eE11D965A1a81ed7dA1D4"},
{Address: "0x1Db6cf99e231e42CEB0389E7828b16Be9b6a385f", Private: "", Public: "0x1Db6cf99e231e42CEB0389E7828b16Be9b6a385f"}, {Address: "0x1Db6cf99e231e42CEB0389E7828b16Be9b6a385f", Private: "", Public: "0x1Db6cf99e231e42CEB0389E7828b16Be9b6a385f"},
{Address: "0x1F4B579f85E585039C56989DEB56377c529981Be", Private: "", Public: "0x1F4B579f85E585039C56989DEB56377c529981Be"}, {Address: "0x1F4B579f85E585039C56989DEB56377c529981Be", Private: "", Public: "0x1F4B579f85E585039C56989DEB56377c529981Be"},
{Address: "0x1e9fCd9B1BDC53921d6a97D305f8a829Fd1299fE", Private: "", Public: "0x1e9fCd9B1BDC53921d6a97D305f8a829Fd1299fE"}, {Address: "0x1e9fCd9B1BDC53921d6a97D305f8a829Fd1299fE", Private: "", Public: "0x1e9fCd9B1BDC53921d6a97D305f8a829Fd1299fE"},
@ -98,7 +98,7 @@ var GenesisAccounts = [...]DeployAccount{
{Address: "0xb108BF4945Bd7975cF974f47476e689ACd542F23", Private: "", Public: "0xb108BF4945Bd7975cF974f47476e689ACd542F23"}, {Address: "0xb108BF4945Bd7975cF974f47476e689ACd542F23", Private: "", Public: "0xb108BF4945Bd7975cF974f47476e689ACd542F23"},
{Address: "0xc55c56F661eD185103839FdFeFd80DC38938913b", Private: "", Public: "0xc55c56F661eD185103839FdFeFd80DC38938913b"}, {Address: "0xc55c56F661eD185103839FdFeFd80DC38938913b", Private: "", Public: "0xc55c56F661eD185103839FdFeFd80DC38938913b"},
{Address: "0x76f8d12F6624f713B2D8894A749ad926F7812350", Private: "", Public: "0x76f8d12F6624f713B2D8894A749ad926F7812350"}, {Address: "0x76f8d12F6624f713B2D8894A749ad926F7812350", Private: "", Public: "0x76f8d12F6624f713B2D8894A749ad926F7812350"},
{Address: "0x265CA0F26A8D899F0c25313164FBBb5344F973cf", Private: "", Public: "0x265CA0F26A8D899F0c25313164FBBb5344F973cf"}, {Address: "0x31a77BAabad45E5dFBAC8231bDBF9Fe30F265554", Private: "", Public: "0x31a77BAabad45E5dFBAC8231bDBF9Fe30F265554"},
// 50-59 // 50-59
{Address: "0x26Bb09E04a264AdB89B73389CBdcb48819CB2401", Private: "", Public: "0x26Bb09E04a264AdB89B73389CBdcb48819CB2401"}, {Address: "0x26Bb09E04a264AdB89B73389CBdcb48819CB2401", Private: "", Public: "0x26Bb09E04a264AdB89B73389CBdcb48819CB2401"},
@ -204,9 +204,9 @@ var GenesisAccounts = [...]DeployAccount{
{Address: "0x5672f21553783d16AE7A7901A4461adBf6C09c56", Private: "", Public: "0x5672f21553783d16AE7A7901A4461adBf6C09c56"}, {Address: "0x5672f21553783d16AE7A7901A4461adBf6C09c56", Private: "", Public: "0x5672f21553783d16AE7A7901A4461adBf6C09c56"},
{Address: "0x596907B8b2E11e2EBC6f6c8011Ad379e1b83F669", Private: "", Public: "0x596907B8b2E11e2EBC6f6c8011Ad379e1b83F669"}, {Address: "0x596907B8b2E11e2EBC6f6c8011Ad379e1b83F669", Private: "", Public: "0x596907B8b2E11e2EBC6f6c8011Ad379e1b83F669"},
{Address: "0x5A9B1A7b7c889C359e8D52c08e1566C10Fa8B5a9", Private: "", Public: "0x5A9B1A7b7c889C359e8D52c08e1566C10Fa8B5a9"}, {Address: "0x5A9B1A7b7c889C359e8D52c08e1566C10Fa8B5a9", Private: "", Public: "0x5A9B1A7b7c889C359e8D52c08e1566C10Fa8B5a9"},
{Address: "0x5B266C47A82c4a849a70a1F96760fC1025784E7D", Private: "", Public: "0x5B266C47A82c4a849a70a1F96760fC1025784E7D"}, {Address: "0x78A8D29D81dD02c13a2a6077d887CF661B67E2c0", Private: "", Public: "0x78A8D29D81dD02c13a2a6077d887CF661B67E2c0"},
{Address: "0x5Cb5E2Bb095d2DD25C9b2887851f8D9E7b733e75", Private: "", Public: "0x5Cb5E2Bb095d2DD25C9b2887851f8D9E7b733e75"}, {Address: "0x40d6f48c7b27BA7544b04456445Cf19B680F5484", Private: "", Public: "0x40d6f48c7b27BA7544b04456445Cf19B680F5484"},
{Address: "0x5Cc69576F059260426e29bDccaf22711ee9F2730", Private: "", Public: "0x5Cc69576F059260426e29bDccaf22711ee9F2730"}, {Address: "0x04c3636dF766ad2d3E74424c016842f5704FAE3A", Private: "", Public: "0x04c3636dF766ad2d3E74424c016842f5704FAE3A"},
// 140-149 // 140-149
{Address: "0x28dA1beF8F5361863DcD427B6264f9DdF05B5D14", Private: "", Public: "0x28dA1beF8F5361863DcD427B6264f9DdF05B5D14"}, {Address: "0x28dA1beF8F5361863DcD427B6264f9DdF05B5D14", Private: "", Public: "0x28dA1beF8F5361863DcD427B6264f9DdF05B5D14"},
@ -254,22 +254,22 @@ var GenesisAccounts = [...]DeployAccount{
{Address: "0x766B51338c6C4F7De2d4f15357bdbA4B877C0835", Private: "", Public: "0x766B51338c6C4F7De2d4f15357bdbA4B877C0835"}, {Address: "0x766B51338c6C4F7De2d4f15357bdbA4B877C0835", Private: "", Public: "0x766B51338c6C4F7De2d4f15357bdbA4B877C0835"},
{Address: "0x76e2A98706F1d4d01e2FF1FE6D8e4609A0622Fb4", Private: "", Public: "0x76e2A98706F1d4d01e2FF1FE6D8e4609A0622Fb4"}, {Address: "0x76e2A98706F1d4d01e2FF1FE6D8e4609A0622Fb4", Private: "", Public: "0x76e2A98706F1d4d01e2FF1FE6D8e4609A0622Fb4"},
{Address: "0x770b8e3A35Bff512F173cE152BD1220d82bB9de0", Private: "", Public: "0x770b8e3A35Bff512F173cE152BD1220d82bB9de0"}, {Address: "0x770b8e3A35Bff512F173cE152BD1220d82bB9de0", Private: "", Public: "0x770b8e3A35Bff512F173cE152BD1220d82bB9de0"},
{Address: "0x77229fA6198791D333F286fa8360946042c65337", Private: "", Public: "0x77229fA6198791D333F286fa8360946042c65337"}, {Address: "0xcb0A6c1914d2AD10855cC8cD70B040b7Dc6573a8", Private: "", Public: "0xcb0A6c1914d2AD10855cC8cD70B040b7Dc6573a8"},
// 180-189 // 180-189
{Address: "0x78404079f5081A5Dc38902b47257c0D1D4e2E028", Private: "", Public: "0x78404079f5081A5Dc38902b47257c0D1D4e2E028"}, {Address: "0xB1Fa8F1CEa1A78d8887609CebEA592313dD659C1", Private: "", Public: "0xB1Fa8F1CEa1A78d8887609CebEA592313dD659C1"},
{Address: "0x79BE4EF66f3cc7B5b379F85353873115aeDbD242", Private: "", Public: "0x79BE4EF66f3cc7B5b379F85353873115aeDbD242"}, {Address: "0xC6fDB78B643E8eBaC472dB61c1e84B6Fe0Abe185", Private: "", Public: "0xC6fDB78B643E8eBaC472dB61c1e84B6Fe0Abe185"},
{Address: "0x7Dc053eAc8613229a6c316Fc436f100477571EE2", Private: "", Public: "0x7Dc053eAc8613229a6c316Fc436f100477571EE2"}, {Address: "0xd021c9a6A8816FE57a3A4CBd02fA824e0e92421B", Private: "", Public: "0xd021c9a6A8816FE57a3A4CBd02fA824e0e92421B"},
{Address: "0x7F58C0cD5c255020Ec94425873F666F1D68FBaA6", Private: "", Public: "0x7F58C0cD5c255020Ec94425873F666F1D68FBaA6"}, {Address: "0x7F58C0cD5c255020Ec94425873F666F1D68FBaA6", Private: "", Public: "0x7F58C0cD5c255020Ec94425873F666F1D68FBaA6"},
{Address: "0x7F686454f91A68cC3248a642F59aDb2970e84D8e", Private: "", Public: "0x7F686454f91A68cC3248a642F59aDb2970e84D8e"}, {Address: "0x7F686454f91A68cC3248a642F59aDb2970e84D8e", Private: "", Public: "0x7F686454f91A68cC3248a642F59aDb2970e84D8e"},
{Address: "0x7FB5fF6e7aE8279F21B843Bc297b24bFbC45733E", Private: "", Public: "0x7FB5fF6e7aE8279F21B843Bc297b24bFbC45733E"}, {Address: "0x9c23fE8cdcA1a8E529deeE8eD8492575cc3F9129", Private: "", Public: "0x9c23fE8cdcA1a8E529deeE8eD8492575cc3F9129"},
{Address: "0x7a22ff5B8483CE859757Bc0Ef7Ec64d11421B680", Private: "", Public: "0x7a22ff5B8483CE859757Bc0Ef7Ec64d11421B680"}, {Address: "0x324c741430F5B970b61E398434B4F3957a6BC6E0", Private: "", Public: "0x324c741430F5B970b61E398434B4F3957a6BC6E0"},
{Address: "0x7bBf40bD603B2434A964CdF979020B1E0E68E13D", Private: "", Public: "0x7bBf40bD603B2434A964CdF979020B1E0E68E13D"}, {Address: "0x7bBf40bD603B2434A964CdF979020B1E0E68E13D", Private: "", Public: "0x7bBf40bD603B2434A964CdF979020B1E0E68E13D"},
{Address: "0x7c14C7f6dE1f39579F7ab8DE24c168737E3FF53f", Private: "", Public: "0x7c14C7f6dE1f39579F7ab8DE24c168737E3FF53f"}, {Address: "0x22117D26611161b1b1f4EBB06C441aeeA102261c", Private: "", Public: "0x22117D26611161b1b1f4EBB06C441aeeA102261c"},
{Address: "0x7cc507b9345a58B5232e16B49b02F365bEB7d91e", Private: "", Public: "0x7cc507b9345a58B5232e16B49b02F365bEB7d91e"}, {Address: "0x7cc507b9345a58B5232e16B49b02F365bEB7d91e", Private: "", Public: "0x7cc507b9345a58B5232e16B49b02F365bEB7d91e"},
// 190-199 // 190-199
{Address: "0x1a4d5957Af59aE2E5ED0e4FAB42f14D1177d1F79", Private: "", Public: "0x1a4d5957Af59aE2E5ED0e4FAB42f14D1177d1F79"}, {Address: "0x93570Dcb1Bf1a0bD1d476a542309754a6dbCE632", Private: "", Public: "0x93570Dcb1Bf1a0bD1d476a542309754a6dbCE632"},
{Address: "0x87a157db95dc3517Eb578d4cedee92a5ab275BD5", Private: "", Public: "0x87a157db95dc3517Eb578d4cedee92a5ab275BD5"}, {Address: "0x87a157db95dc3517Eb578d4cedee92a5ab275BD5", Private: "", Public: "0x87a157db95dc3517Eb578d4cedee92a5ab275BD5"},
{Address: "0x25347d09373B2644191f1DC4beDEFEBE26a5b2d1", Private: "", Public: "0x25347d09373B2644191f1DC4beDEFEBE26a5b2d1"}, {Address: "0x25347d09373B2644191f1DC4beDEFEBE26a5b2d1", Private: "", Public: "0x25347d09373B2644191f1DC4beDEFEBE26a5b2d1"},
{Address: "0x7f42f7a4d66f0387AE77A219d0742E8a706231CA", Private: "", Public: "0x7f42f7a4d66f0387AE77A219d0742E8a706231CA"}, {Address: "0x7f42f7a4d66f0387AE77A219d0742E8a706231CA", Private: "", Public: "0x7f42f7a4d66f0387AE77A219d0742E8a706231CA"},

@ -15,7 +15,6 @@ import (
"sync" "sync"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/bls/ffi/go/bls"
p2p_crypto "github.com/libp2p/go-libp2p-crypto" p2p_crypto "github.com/libp2p/go-libp2p-crypto"
) )
@ -233,3 +232,12 @@ func GetBlsAddress(key *bls.PublicKey) common.Address {
addr.SetBytes(addrBytes[:]) addr.SetBytes(addrBytes[:])
return addr return addr
} }
// GetPortFromDiff returns the port from base and the diff.
func GetPortFromDiff(port string, diff int) string {
if portNum, err := strconv.Atoi(port); err == nil {
return fmt.Sprintf("%d", portNum-diff)
}
GetLogInstance().Error("error on parsing port.")
return ""
}

@ -1,36 +0,0 @@
package node
import (
"testing"
"github.com/harmony-one/harmony/crypto/bls"
"github.com/harmony-one/harmony/consensus"
"github.com/harmony-one/harmony/internal/utils"
"github.com/harmony-one/harmony/p2p"
"github.com/harmony-one/harmony/p2p/p2pimpl"
)
func prepareNode(t *testing.T) *Node {
pubKey := bls.RandPrivateKey().GetPublicKey()
leader := p2p.Peer{IP: "127.0.0.1", Port: "8882", ConsensusPubKey: pubKey}
priKey, _, _ := utils.GenKeyP2P("127.0.0.1", "9902")
host, err := p2pimpl.NewHost(&leader, priKey)
if err != nil {
t.Fatalf("newhost failure: %v", err)
}
consensus, err := consensus.New(host, 0, leader, nil)
if err != nil {
t.Fatalf("Cannot craeate consensus: %v", err)
}
return New(host, consensus, testDBFactory, false)
}
func TestAddLotteryContract(t *testing.T) {
node := prepareNode(t)
node.AddLotteryContract()
if len(node.DemoContractAddress) == 0 {
t.Error("Can not create demo contract")
}
}

@ -1,216 +0,0 @@
package node
import (
"fmt"
"math"
"math/big"
"os"
"strings"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
"github.com/harmony-one/harmony/contracts"
"github.com/harmony-one/harmony/core/denominations"
"github.com/harmony-one/harmony/core/types"
"github.com/harmony-one/harmony/internal/utils"
contract_constants "github.com/harmony-one/harmony/internal/utils/contract"
)
// Constants for lottery.
const (
Enter = "enter"
PickWinner = "pickWinner"
GetPlayers = "getPlayers"
PuzzleFund = 100000000
)
// AddLotteryContract adds the demo lottery contract the genesis block.
func (node *Node) AddLotteryContract() {
// Add a lottery demo contract.
priKey, err := crypto.HexToECDSA(contract_constants.DemoAccounts[0].Private)
if err != nil {
utils.GetLogInstance().Error("Error when creating private key for demo contract")
// Exit here to recognize the coding working.
// Basically we will remove this logic when launching so it's fine for now.
os.Exit(1)
}
dataEnc := common.FromHex(contracts.LotteryBin)
// Unsigned transaction to avoid the case of transaction address.
contractFunds := big.NewInt(0)
contractFunds = contractFunds.Mul(contractFunds, big.NewInt(denominations.One))
demoContract, _ := types.SignTx(
types.NewContractCreation(uint64(0), node.Consensus.ShardID, contractFunds, params.TxGasContractCreation*10, nil, dataEnc),
types.HomesteadSigner{},
priKey)
node.DemoContractAddress = crypto.CreateAddress(crypto.PubkeyToAddress(priKey.PublicKey), uint64(0))
node.LotteryManagerPrivateKey = priKey
node.addPendingTransactions(types.Transactions{demoContract})
}
// CreateTransactionForEnterMethod generates transaction for enter method and add it into pending tx list.
func (node *Node) CreateTransactionForEnterMethod(amount int64, priKey string) error {
var err error
toAddress := node.DemoContractAddress
abi, err := abi.JSON(strings.NewReader(contracts.LotteryABI))
if err != nil {
utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err)
return err
}
bytesData, err := abi.Pack(Enter)
if err != nil {
utils.GetLogInstance().Error("Failed to generate ABI function bytes data", "error", err)
return err
}
key, err := crypto.HexToECDSA(priKey)
nonce := node.GetNonceOfAddress(crypto.PubkeyToAddress(key.PublicKey))
Amount := big.NewInt(amount)
Amount = Amount.Mul(Amount, big.NewInt(denominations.One))
tx := types.NewTransaction(
nonce,
toAddress,
node.NodeConfig.ShardID,
Amount,
params.TxGas*10,
nil,
bytesData,
)
if err != nil {
utils.GetLogInstance().Error("Failed to get private key", "error", err)
return err
}
if signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, key); err == nil {
node.addPendingTransactions(types.Transactions{signedTx})
return nil
}
utils.GetLogInstance().Error("Unable to call enter method", "error", err)
return err
}
// GetResultDirectly get current players and their balances, not from smart contract.
func (node *Node) GetResultDirectly(priKey string) (players []string, balances []*big.Int) {
for _, account := range contract_constants.DemoAccounts {
players = append(players, account.Private)
key, err := crypto.HexToECDSA(account.Private)
if err != nil {
utils.GetLogInstance().Error("Error when HexToECDSA")
}
address := crypto.PubkeyToAddress(key.PublicKey)
balance, err := node.GetBalanceOfAddress(address)
balances = append(balances, balance)
}
return players, balances
}
// GenerateResultDirectly get current players and their balances, not from smart contract.
func (node *Node) GenerateResultDirectly(addresses []common.Address) (players []string, balances []*big.Int) {
for _, address := range addresses {
players = append(players, address.String())
balance, _ := node.GetBalanceOfAddress(address)
balances = append(balances, balance)
}
fmt.Println("generate result", players, balances)
return players, balances
}
// GetResult get current players and their balances.
func (node *Node) GetResult(priKey string) (players []string, balances []*big.Int) {
// TODO(minhdoan): get result from smart contract is current not working. Fix it later.
abi, err := abi.JSON(strings.NewReader(contracts.LotteryABI))
if err != nil {
utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err)
}
bytesData, err := abi.Pack("getPlayers")
if err != nil {
utils.GetLogInstance().Error("Failed to generate ABI function bytes data", "error", err)
}
demoContractAddress := node.DemoContractAddress
key, err := crypto.HexToECDSA(priKey)
if err != nil {
utils.GetLogInstance().Error("Failed to parse private key", "error", err)
}
nonce := node.GetNonceOfAddress(crypto.PubkeyToAddress(key.PublicKey))
tx := types.NewTransaction(
nonce,
demoContractAddress,
node.NodeConfig.ShardID,
nil,
math.MaxUint64,
nil,
bytesData,
)
signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, key)
if err != nil {
utils.GetLogInstance().Error("Failed to sign contract call tx", "error", err)
return nil, nil
}
output, err := node.ContractCaller.CallContract(signedTx)
if err != nil {
utils.GetLogInstance().Error("Failed to call staking contract", "error", err)
return nil, nil
}
ret := []common.Address{}
err = abi.Unpack(&ret, "getPlayers", output)
if err != nil {
utils.GetLogInstance().Error("Failed to unpack getPlayers", "error", err)
return nil, nil
}
utils.GetLogInstance().Info("get result: ", "ret", ret)
fmt.Println("get result called:", ret)
return node.GenerateResultDirectly(ret)
}
// CreateTransactionForPickWinner generates transaction for enter method and add it into pending tx list.
func (node *Node) CreateTransactionForPickWinner() error {
var err error
toAddress := node.DemoContractAddress
abi, err := abi.JSON(strings.NewReader(contracts.LotteryABI))
if err != nil {
utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err)
return err
}
bytesData, err := abi.Pack(PickWinner)
if err != nil {
utils.GetLogInstance().Error("Failed to generate ABI function bytes data", "error", err)
return err
}
key := node.LotteryManagerPrivateKey
if key == nil {
return fmt.Errorf("LotterManagerPrivateKey is nil")
}
nonce := node.GetNonceOfAddress(crypto.PubkeyToAddress(key.PublicKey))
Amount := big.NewInt(0)
tx := types.NewTransaction(
nonce,
toAddress,
node.NodeConfig.ShardID,
Amount,
params.TxGas*1000,
nil,
bytesData,
)
if err != nil {
utils.GetLogInstance().Error("Failed to get private key", "error", err)
return err
}
if signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, key); err == nil {
node.addPendingTransactions(types.Transactions{signedTx})
return nil
}
utils.GetLogInstance().Error("Unable to call enter method", "error", err)
return err
}

@ -15,7 +15,6 @@ import (
"github.com/harmony-one/harmony/accounts" "github.com/harmony-one/harmony/accounts"
"github.com/harmony-one/harmony/api/client" "github.com/harmony-one/harmony/api/client"
clientService "github.com/harmony-one/harmony/api/client/service"
msg_pb "github.com/harmony-one/harmony/api/proto/message" msg_pb "github.com/harmony-one/harmony/api/proto/message"
"github.com/harmony-one/harmony/api/service" "github.com/harmony-one/harmony/api/service"
"github.com/harmony-one/harmony/api/service/syncing" "github.com/harmony-one/harmony/api/service/syncing"
@ -69,8 +68,6 @@ func (state State) String() string {
} }
const ( const (
// ClientServicePortDiff is the positive port diff for client service
ClientServicePortDiff = 5555
maxBroadcastNodes = 10 // broadcast at most maxBroadcastNodes peers that need in sync maxBroadcastNodes = 10 // broadcast at most maxBroadcastNodes peers that need in sync
broadcastTimeout int64 = 3 * 60 * 1000000000 // 3 mins broadcastTimeout int64 = 3 * 60 * 1000000000 // 3 mins
//SyncIDLength is the length of bytes for syncID //SyncIDLength is the length of bytes for syncID
@ -115,9 +112,6 @@ type Node struct {
Worker *worker.Worker Worker *worker.Worker
BeaconWorker *worker.Worker // worker for beacon chain BeaconWorker *worker.Worker // worker for beacon chain
// Client server (for wallet requests)
clientServer *clientService.Server
// Syncing component. // Syncing component.
syncID [SyncIDLength]byte // a unique ID for the node during the state syncing process with peers syncID [SyncIDLength]byte // a unique ID for the node during the state syncing process with peers
downloaderServer *downloader.Server downloaderServer *downloader.Server

@ -107,7 +107,7 @@ func (node *Node) WaitForConsensusReadyv2(readySignal chan struct{}, stopChan ch
defer close(stoppedChan) defer close(stoppedChan)
utils.GetLogInstance().Debug("Waiting for Consensus ready") utils.GetLogInstance().Debug("Waiting for Consensus ready")
time.Sleep(45 * time.Second) // Wait for other nodes to be ready (test-only) time.Sleep(30 * time.Second) // Wait for other nodes to be ready (test-only)
firstTime := true firstTime := true
for { for {

@ -1,229 +0,0 @@
package node
import (
"fmt"
"math/big"
"os"
"strings"
"sync/atomic"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
"github.com/harmony-one/harmony/contracts"
"github.com/harmony-one/harmony/core/denominations"
"github.com/harmony-one/harmony/core/types"
"github.com/harmony-one/harmony/internal/utils"
contract_constants "github.com/harmony-one/harmony/internal/utils/contract"
)
// Constants for puzzle.
const (
Play = "play"
Payout = "payout"
EndGame = "endGame"
)
// OneEther is one ether
var OneEther = big.NewInt(denominations.One)
// AddPuzzleContract adds the demo puzzle contract the genesis block.
func (node *Node) AddPuzzleContract() {
// Add a puzzle demo contract.
priKey, err := crypto.HexToECDSA(contract_constants.PuzzleAccounts[0].Private)
if err != nil {
utils.GetLogInstance().Error("Error when creating private key for puzzle demo contract")
// Exit here to recognize the coding working.
// Basically we will remove this logic when launching so it's fine for now.
os.Exit(1)
}
dataEnc := common.FromHex(contracts.PuzzleBin)
// Unsigned transaction to avoid the case of transaction address.
contractFunds := big.NewInt(PuzzleFund)
contractFunds = contractFunds.Mul(contractFunds, big.NewInt(denominations.One))
demoContract, _ := types.SignTx(
types.NewContractCreation(uint64(0), node.Consensus.ShardID, contractFunds, params.TxGasContractCreation*1000, nil, dataEnc),
types.HomesteadSigner{},
priKey)
node.PuzzleContractAddress = crypto.CreateAddress(crypto.PubkeyToAddress(priKey.PublicKey), uint64(0))
node.PuzzleManagerPrivateKey = priKey
node.addPendingTransactions(types.Transactions{demoContract})
}
// CreateTransactionForPlayMethod generates transaction for play method and add it into pending tx list.
func (node *Node) CreateTransactionForPlayMethod(priKey string, amount int64) (string, error) {
var err error
toAddress := node.PuzzleContractAddress
abi, err := abi.JSON(strings.NewReader(contracts.PuzzleABI))
if err != nil {
utils.GetLogInstance().Error("puzzle-play: Failed to generate staking contract's ABI", "error", err)
return "", err
}
bytesData, err := abi.Pack(Play)
if err != nil {
utils.GetLogInstance().Error("puzzle-play: Failed to generate ABI function bytes data", "error", err)
return "", err
}
Stake := big.NewInt(0)
Stake = Stake.Mul(OneEther, big.NewInt(amount))
key, err := crypto.HexToECDSA(priKey)
if err != nil {
utils.GetLogInstance().Error("Failed to parse private key", "error", err)
return "", err
}
address := crypto.PubkeyToAddress(key.PublicKey)
balance, err := node.GetBalanceOfAddress(address)
if err != nil {
utils.GetLogInstance().Error("puzzle-play: can not get address", "error", err)
return "", err
} else if balance.Cmp(Stake) == -1 {
utils.GetLogInstance().Error("puzzle-play: insufficient fund", "error", err, "stake", Stake, "balance", balance)
return "", ErrPuzzleInsufficientFund
}
nonce := node.GetAndIncreaseAddressNonce(address)
tx := types.NewTransaction(
nonce,
toAddress,
node.NodeConfig.ShardID,
Stake,
params.TxGas*100,
nil,
bytesData,
)
if err != nil {
utils.GetLogInstance().Error("puzzle-play: Failed to get private key", "error", err)
return "", err
}
if signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, key); err == nil {
node.addPendingTransactions(types.Transactions{signedTx})
return signedTx.Hash().Hex(), nil
}
utils.GetLogInstance().Error("puzzle-play: Unable to call enter method", "error", err)
return "", err
}
// CreateTransactionForPayoutMethod generates transaction for payout method and add it into pending tx list.
func (node *Node) CreateTransactionForPayoutMethod(priKey string, level int, sequence string) (string, error) {
var err error
toAddress := node.PuzzleContractAddress
abi, err := abi.JSON(strings.NewReader(contracts.PuzzleABI))
if err != nil {
utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err)
return "", err
}
key, err := crypto.HexToECDSA(priKey)
if err != nil {
utils.GetLogInstance().Error("Failed to parse private key", "error", err)
return "", err
}
address := crypto.PubkeyToAddress(key.PublicKey)
// add params for address payable player, uint8 new_level, steps string
fmt.Println("Payout: address", address)
bytesData, err := abi.Pack(Payout, address, big.NewInt(int64(level)), sequence)
if err != nil {
utils.GetLogInstance().Error("Failed to generate ABI function bytes data", "error", err)
return "", err
}
if key == nil {
return "", fmt.Errorf("user key is nil")
}
nonce := node.GetAndIncreaseAddressNonce(address)
Amount := big.NewInt(0)
tx := types.NewTransaction(
nonce,
toAddress,
node.NodeConfig.ShardID,
Amount,
params.TxGas*10,
nil,
bytesData,
)
if err != nil {
utils.GetLogInstance().Error("Failed to get private key", "error", err)
return "", err
}
if signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, key); err == nil {
node.addPendingTransactions(types.Transactions{signedTx})
return signedTx.Hash().Hex(), nil
}
utils.GetLogInstance().Error("Unable to call enter method", "error", err)
return "", err
}
// CreateTransactionForEndMethod generates transaction for endGame method and add it into pending tx list.
func (node *Node) CreateTransactionForEndMethod(priKey string) (string, error) {
var err error
toAddress := node.PuzzleContractAddress
abi, err := abi.JSON(strings.NewReader(contracts.PuzzleABI))
if err != nil {
utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err)
return "", err
}
key, err := crypto.HexToECDSA(priKey)
if err != nil {
utils.GetLogInstance().Error("Failed to parse private key", "error", err)
return "", err
}
address := crypto.PubkeyToAddress(key.PublicKey)
// add params for address payable player, uint8 new_level, steps string
fmt.Println("EndGame: address", address)
bytesData, err := abi.Pack(EndGame, address)
if err != nil {
utils.GetLogInstance().Error("Failed to generate ABI function bytes data", "error", err)
return "", err
}
if key == nil {
return "", fmt.Errorf("user key is nil")
}
nonce := node.GetAndIncreaseAddressNonce(address)
Amount := big.NewInt(0)
tx := types.NewTransaction(
nonce,
toAddress,
node.NodeConfig.ShardID,
Amount,
params.TxGas*10,
nil,
bytesData,
)
if err != nil {
utils.GetLogInstance().Error("Failed to get private key", "error", err)
return "", err
}
if signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, key); err == nil {
node.addPendingTransactions(types.Transactions{signedTx})
return signedTx.Hash().Hex(), nil
}
utils.GetLogInstance().Error("Unable to call enter method", "error", err)
return "", err
}
// GetAndIncreaseAddressNonce get and increase the address's nonce
func (node *Node) GetAndIncreaseAddressNonce(address common.Address) uint64 {
if value, ok := node.AddressNonce.Load(address); ok {
n, ok := value.(uint64)
if !ok {
return 0
}
nonce := atomic.AddUint64(&n, 1)
return nonce - 1
}
nonce := node.GetNonceOfAddress(address) + 1
node.AddressNonce.Store(address, nonce)
return nonce - 1
}

@ -1,3 +1,4 @@
./test/kill_node.sh ./test/kill_node.sh
rm -rf tmp_log*
./test/deploy.sh ./test/configs/beaconchain40.txt ./test/deploy.sh ./test/configs/beaconchain40.txt

@ -76,7 +76,7 @@ DEFAULT_DURATION_SYNC=200
DB=false DB=false
TXGEN=true TXGEN=true
DURATION= DURATION=
MIN=5 MIN=3
SHARDS=2 SHARDS=2
SYNC=true SYNC=true
DRYRUN= DRYRUN=

Loading…
Cancel
Save