Merge branch 'master' of github.com:harmony-one/harmony into rj_branch

pull/398/head
Rongjian Lan 6 years ago
commit 5b66061b66
  1. 3
      .gitignore
  2. 0
      api/proto/message/gen.sh
  3. 139
      api/proto/message/message.pb.go
  4. 10
      api/proto/message/message.proto
  5. 18
      api/service/staking/service.go
  6. 30
      cmd/client/txgen/main.go
  7. 2
      cmd/harmony.go
  8. 2012
      internal/utils/contract/constants.go
  9. 32
      node/constants.go
  10. 84
      node/contract.go
  11. 59
      node/node.go

3
.gitignore vendored

@ -60,3 +60,6 @@ vendor
# node_modules # node_modules
node_modules/ node_modules/
# txgen node keystore
.txgenkey

@ -23,11 +23,12 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type MessageType int32 type MessageType int32
const ( const (
MessageType_UNKNOWN MessageType = 0 MessageType_UNKNOWN MessageType = 0
MessageType_NEWNODE_BOOTNODE MessageType = 1 MessageType_NEWNODE_BOOTNODE MessageType = 1
MessageType_BOOTNODE_NEWNODE MessageType = 2 MessageType_BOOTNODE_NEWNODE MessageType = 2
MessageType_NEWNODE_BEACON MessageType = 3 MessageType_NEWNODE_BEACON MessageType = 3
MessageType_BEACON_NEWNODE MessageType = 4 MessageType_BEACON_NEWNODE MessageType = 4
MessageType_NEWNODE_BEACON_STAKING MessageType = 5
) )
var MessageType_name = map[int32]string{ var MessageType_name = map[int32]string{
@ -36,14 +37,16 @@ var MessageType_name = map[int32]string{
2: "BOOTNODE_NEWNODE", 2: "BOOTNODE_NEWNODE",
3: "NEWNODE_BEACON", 3: "NEWNODE_BEACON",
4: "BEACON_NEWNODE", 4: "BEACON_NEWNODE",
5: "NEWNODE_BEACON_STAKING",
} }
var MessageType_value = map[string]int32{ var MessageType_value = map[string]int32{
"UNKNOWN": 0, "UNKNOWN": 0,
"NEWNODE_BOOTNODE": 1, "NEWNODE_BOOTNODE": 1,
"BOOTNODE_NEWNODE": 2, "BOOTNODE_NEWNODE": 2,
"NEWNODE_BEACON": 3, "NEWNODE_BEACON": 3,
"BEACON_NEWNODE": 4, "BEACON_NEWNODE": 4,
"NEWNODE_BEACON_STAKING": 5,
} }
func (x MessageType) String() string { func (x MessageType) String() string {
@ -62,8 +65,7 @@ func (MessageType) EnumDescriptor() ([]byte, []int) {
type Message struct { type Message struct {
Type MessageType `protobuf:"varint,1,opt,name=type,proto3,enum=message.MessageType" json:"type,omitempty"` Type MessageType `protobuf:"varint,1,opt,name=type,proto3,enum=message.MessageType" json:"type,omitempty"`
// Types that are valid to be assigned to Request: // Types that are valid to be assigned to Request:
// *Message_NewnodeBootnodeRequest // *Message_Staking
// *Message_BootnodeNewnodeRequest
Request isMessage_Request `protobuf_oneof:"request"` Request isMessage_Request `protobuf_oneof:"request"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
@ -106,17 +108,11 @@ type isMessage_Request interface {
isMessage_Request() isMessage_Request()
} }
type Message_NewnodeBootnodeRequest struct { type Message_Staking struct {
NewnodeBootnodeRequest *NewNodeBootNodeRequest `protobuf:"bytes,2,opt,name=newnode_bootnode_request,json=newnodeBootnodeRequest,proto3,oneof"` Staking *StakingRequest `protobuf:"bytes,3,opt,name=staking,proto3,oneof"`
} }
type Message_BootnodeNewnodeRequest struct { func (*Message_Staking) isMessage_Request() {}
BootnodeNewnodeRequest *BootNodeNewNodeRequest `protobuf:"bytes,3,opt,name=bootnode_newnode_request,json=bootnodeNewnodeRequest,proto3,oneof"`
}
func (*Message_NewnodeBootnodeRequest) isMessage_Request() {}
func (*Message_BootnodeNewnodeRequest) isMessage_Request() {}
func (m *Message) GetRequest() isMessage_Request { func (m *Message) GetRequest() isMessage_Request {
if m != nil { if m != nil {
@ -125,16 +121,9 @@ func (m *Message) GetRequest() isMessage_Request {
return nil return nil
} }
func (m *Message) GetNewnodeBootnodeRequest() *NewNodeBootNodeRequest { func (m *Message) GetStaking() *StakingRequest {
if x, ok := m.GetRequest().(*Message_NewnodeBootnodeRequest); ok { if x, ok := m.GetRequest().(*Message_Staking); ok {
return x.NewnodeBootnodeRequest return x.Staking
}
return nil
}
func (m *Message) GetBootnodeNewnodeRequest() *BootNodeNewNodeRequest {
if x, ok := m.GetRequest().(*Message_BootnodeNewnodeRequest); ok {
return x.BootnodeNewnodeRequest
} }
return nil return nil
} }
@ -142,8 +131,7 @@ func (m *Message) GetBootnodeNewnodeRequest() *BootNodeNewNodeRequest {
// XXX_OneofWrappers is for the internal use of the proto package. // XXX_OneofWrappers is for the internal use of the proto package.
func (*Message) XXX_OneofWrappers() []interface{} { func (*Message) XXX_OneofWrappers() []interface{} {
return []interface{}{ return []interface{}{
(*Message_NewnodeBootnodeRequest)(nil), (*Message_Staking)(nil),
(*Message_BootnodeNewnodeRequest)(nil),
} }
} }
@ -211,31 +199,82 @@ func (m *BootNodeNewNodeRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_BootNodeNewNodeRequest proto.InternalMessageInfo var xxx_messageInfo_BootNodeNewNodeRequest proto.InternalMessageInfo
// Staking Request from new node to beacon node.
type StakingRequest struct {
Transaction []byte `protobuf:"bytes,1,opt,name=transaction,proto3" json:"transaction,omitempty"`
NodeId string `protobuf:"bytes,2,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *StakingRequest) Reset() { *m = StakingRequest{} }
func (m *StakingRequest) String() string { return proto.CompactTextString(m) }
func (*StakingRequest) ProtoMessage() {}
func (*StakingRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_33c57e4bae7b9afd, []int{3}
}
func (m *StakingRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StakingRequest.Unmarshal(m, b)
}
func (m *StakingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_StakingRequest.Marshal(b, m, deterministic)
}
func (m *StakingRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_StakingRequest.Merge(m, src)
}
func (m *StakingRequest) XXX_Size() int {
return xxx_messageInfo_StakingRequest.Size(m)
}
func (m *StakingRequest) XXX_DiscardUnknown() {
xxx_messageInfo_StakingRequest.DiscardUnknown(m)
}
var xxx_messageInfo_StakingRequest proto.InternalMessageInfo
func (m *StakingRequest) GetTransaction() []byte {
if m != nil {
return m.Transaction
}
return nil
}
func (m *StakingRequest) GetNodeId() string {
if m != nil {
return m.NodeId
}
return ""
}
func init() { func init() {
proto.RegisterEnum("message.MessageType", MessageType_name, MessageType_value) proto.RegisterEnum("message.MessageType", MessageType_name, MessageType_value)
proto.RegisterType((*Message)(nil), "message.Message") proto.RegisterType((*Message)(nil), "message.Message")
proto.RegisterType((*NewNodeBootNodeRequest)(nil), "message.NewNodeBootNodeRequest") proto.RegisterType((*NewNodeBootNodeRequest)(nil), "message.NewNodeBootNodeRequest")
proto.RegisterType((*BootNodeNewNodeRequest)(nil), "message.BootNodeNewNodeRequest") proto.RegisterType((*BootNodeNewNodeRequest)(nil), "message.BootNodeNewNodeRequest")
proto.RegisterType((*StakingRequest)(nil), "message.StakingRequest")
} }
func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) } func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) }
var fileDescriptor_33c57e4bae7b9afd = []byte{ var fileDescriptor_33c57e4bae7b9afd = []byte{
// 253 bytes of a gzipped FileDescriptorProto // 276 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0x41, 0x4b, 0xc3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x91, 0x4f, 0x6b, 0xc2, 0x30,
0x10, 0x85, 0xbb, 0x6d, 0x31, 0x38, 0xc1, 0xb2, 0x2c, 0xa5, 0xe4, 0x66, 0xe9, 0x29, 0x78, 0xe8, 0x18, 0xc6, 0x8d, 0x3a, 0x83, 0x6f, 0xb7, 0x12, 0x82, 0x68, 0xd9, 0xa9, 0x78, 0x2a, 0x3b, 0x78,
0xa1, 0xfe, 0x02, 0xa3, 0x01, 0x41, 0x9c, 0x85, 0x50, 0xe9, 0xc1, 0x43, 0xb0, 0x74, 0xf0, 0x64, 0xd0, 0x4f, 0x60, 0xb7, 0xb2, 0x49, 0x59, 0x0a, 0xb1, 0xc3, 0x63, 0xe9, 0xd6, 0x20, 0x65, 0xac,
0x26, 0x36, 0x2b, 0xa5, 0xff, 0xdc, 0xa3, 0x6c, 0x32, 0x1b, 0x8a, 0xe4, 0xb4, 0x6f, 0xe6, 0xbd, 0xe9, 0x9a, 0x8c, 0xe1, 0x57, 0xd8, 0xa7, 0x1e, 0xfd, 0x93, 0xaa, 0xa7, 0xbc, 0xcf, 0xef, 0xf9,
0xf9, 0x66, 0xd9, 0x85, 0x9b, 0x2f, 0x6a, 0x9a, 0x8f, 0x4f, 0x5a, 0xd7, 0x47, 0x76, 0x6c, 0x22, 0x25, 0x24, 0x04, 0xee, 0xbe, 0x84, 0x52, 0xe9, 0x51, 0xac, 0xca, 0x4a, 0x6a, 0x49, 0x71, 0x17,
0x29, 0x57, 0xbf, 0x0a, 0xa2, 0xd7, 0x4e, 0x9b, 0x14, 0xa6, 0xee, 0x5c, 0x53, 0xa2, 0x96, 0x2a, 0x97, 0x0a, 0xf0, 0x6b, 0x3b, 0x52, 0x0f, 0xc6, 0xfa, 0x54, 0x0a, 0x07, 0xb9, 0xc8, 0xb3, 0xd7,
0x9d, 0x6d, 0xe6, 0xeb, 0x30, 0x22, 0xfe, 0xf6, 0x5c, 0x53, 0xd1, 0x26, 0xcc, 0x3b, 0x24, 0x15, 0xb3, 0x95, 0xd9, 0xd1, 0xf5, 0xf1, 0xa9, 0x14, 0xbc, 0x31, 0xe8, 0x06, 0xb0, 0xd2, 0xe9, 0x67,
0x9d, 0x2a, 0x3e, 0x50, 0xb9, 0x67, 0x76, 0xad, 0x38, 0xd2, 0xf7, 0x0f, 0x35, 0x2e, 0x19, 0x2f, 0x5e, 0x1c, 0x9d, 0x91, 0x8b, 0x3c, 0x6b, 0xbd, 0xe8, 0xe5, 0x7d, 0xcb, 0xb9, 0xf8, 0xfe, 0x11,
0x55, 0x1a, 0x6f, 0x6e, 0xfb, 0x69, 0xa4, 0x13, 0xf2, 0x81, 0x32, 0x66, 0xe7, 0xcf, 0xa2, 0x8b, 0x4a, 0xbf, 0x0c, 0xb8, 0x31, 0xfd, 0x29, 0xe0, 0xaa, 0xa5, 0x4b, 0x07, 0xe6, 0x4c, 0xfc, 0x32,
0x3d, 0x8f, 0x8a, 0x85, 0x20, 0x32, 0x21, 0x88, 0xe3, 0xe1, 0x3d, 0x34, 0x6c, 0x09, 0xf0, 0xc9, 0x99, 0x09, 0x5f, 0x4a, 0x5d, 0xaf, 0xfc, 0xdc, 0x18, 0xd4, 0x19, 0xa6, 0x09, 0xc1, 0xbe, 0x3e,
0x3f, 0x78, 0xa0, 0xca, 0x92, 0x0b, 0x78, 0x40, 0x60, 0x47, 0x10, 0x27, 0xbb, 0x86, 0x48, 0x58, 0x9b, 0xba, 0x60, 0xe9, 0x2a, 0x2d, 0x54, 0xfa, 0xa1, 0x73, 0x59, 0x34, 0xd7, 0xbe, 0xe5, 0x97,
0xab, 0x04, 0x16, 0xc3, 0x77, 0xf3, 0xce, 0x30, 0xf8, 0xae, 0x82, 0xf8, 0xe2, 0x35, 0x4c, 0x0c, 0x88, 0x2e, 0x00, 0x17, 0x32, 0x13, 0x49, 0x9e, 0x39, 0x43, 0x17, 0x79, 0x53, 0x3e, 0xa9, 0xe3,
0xd1, 0x1b, 0xbe, 0xa0, 0xdd, 0xa1, 0x1e, 0x99, 0x39, 0x68, 0xcc, 0x77, 0x68, 0x9f, 0xf2, 0x32, 0x2e, 0x7b, 0xf8, 0x43, 0x60, 0x5d, 0x3c, 0x8b, 0x5a, 0x80, 0xdf, 0x58, 0xc8, 0xa2, 0x03, 0x23,
0xb3, 0x76, 0xeb, 0x85, 0x56, 0xbe, 0x1b, 0xaa, 0x52, 0x6c, 0x3d, 0x36, 0x06, 0x66, 0x7d, 0x36, 0x03, 0x3a, 0x03, 0xc2, 0x82, 0x03, 0x8b, 0x9e, 0x82, 0xc4, 0x8f, 0xa2, 0xb8, 0x1e, 0x08, 0xaa,
0x7f, 0x78, 0xb4, 0xa8, 0x27, 0xbe, 0xd7, 0xe9, 0x3e, 0x37, 0xdd, 0x5f, 0xb5, 0xdf, 0x75, 0xff, 0xa9, 0x49, 0x49, 0x57, 0x93, 0x21, 0xa5, 0x60, 0xf7, 0x6e, 0xb0, 0x7d, 0x8c, 0x18, 0x19, 0xd5,
0x17, 0x00, 0x00, 0xff, 0xff, 0x37, 0x30, 0xd0, 0xfb, 0xbf, 0x01, 0x00, 0x00, 0xac, 0x9d, 0x7b, 0x6f, 0x4c, 0xef, 0x61, 0x7e, 0xed, 0x25, 0xfb, 0x78, 0x1b, 0xee, 0xd8, 0x33,
0xb9, 0x79, 0x9f, 0x34, 0x5f, 0xb2, 0xf9, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xd6, 0xe4, 0x08,
0xa3, 0x01, 0x00, 0x00,
} }

@ -7,6 +7,7 @@ enum MessageType {
BOOTNODE_NEWNODE = 2; BOOTNODE_NEWNODE = 2;
NEWNODE_BEACON = 3; NEWNODE_BEACON = 3;
BEACON_NEWNODE = 4; BEACON_NEWNODE = 4;
NEWNODE_BEACON_STAKING = 5;
} }
// This is universal message for all communication protocols. // This is universal message for all communication protocols.
@ -17,8 +18,7 @@ enum MessageType {
message Message { message Message {
MessageType type = 1; MessageType type = 1;
oneof request { oneof request {
NewNodeBootNodeRequest newnode_bootnode_request = 2; StakingRequest staking = 3;
BootNodeNewNodeRequest bootnode_newnode_request = 3;
} }
} }
@ -30,4 +30,8 @@ message NewNodeBootNodeRequest {
message BootNodeNewNodeRequest { message BootNodeNewNodeRequest {
} }
// TODO(minhdoan): refactor and introduce consensus message as one of possible Message.request. // Staking Request from new node to beacon node.
message StakingRequest {
bytes transaction = 1;
string node_id = 2;
}

@ -2,6 +2,7 @@ package staking
import ( import (
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/harmony-one/harmony/api/proto/message"
"github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/utils"
"github.com/harmony-one/harmony/p2p" "github.com/harmony-one/harmony/p2p"
) )
@ -54,6 +55,23 @@ func (s *Service) Run() {
// DoService does staking. // DoService does staking.
func (s *Service) DoService(peer *p2p.Peer) { func (s *Service) DoService(peer *p2p.Peer) {
utils.GetLogInstance().Info("Staking with Peer") utils.GetLogInstance().Info("Staking with Peer")
// TODO(minhdoan): How to use the p2p or pubsub to send Staking Message to beacon chain.
// See below of how to create a staking message.
}
func (s *Service) createStakingMessage() *message.Message {
// TODO(minhdoan): Add signature and public key.
// To add public we need to assign a fake account to new node initially.
return &message.Message{
Type: message.MessageType_NEWNODE_BEACON_STAKING,
Request: &message.Message_Staking{
Staking: &message.StakingRequest{
Transaction: []byte{},
NodeId: "",
},
},
}
} }
// StopService stops staking service. // StopService stops staking service.

@ -54,6 +54,13 @@ func main() {
bcAddr := flag.String("bc_addr", "", "MultiAddr of the identity chain") bcAddr := flag.String("bc_addr", "", "MultiAddr of the identity chain")
// Key file to store the private key
keyFile := flag.String("key", "./.txgenkey", "the private key file of the txgen")
flag.Var(&utils.BootNodes, "bootnodes", "a list of bootnode multiaddress")
// LibP2P peer discovery integration test
libp2pPD := flag.Bool("libp2p_pd", false, "enable libp2p based peer discovery")
flag.Parse() flag.Parse()
if *versionFlag { if *versionFlag {
@ -65,7 +72,10 @@ func main() {
var bcPeer *p2p.Peer var bcPeer *p2p.Peer
var shardIDLeaderMap map[uint32]p2p.Peer var shardIDLeaderMap map[uint32]p2p.Peer
priKey, _, err := utils.GenKeyP2P(*ip, *port) priKey, err := utils.LoadKeyFromFile(*keyFile)
if err != nil {
panic(err)
}
if *bcAddr != "" { if *bcAddr != "" {
// Turn the destination into a multiaddr. // Turn the destination into a multiaddr.
@ -165,12 +175,22 @@ func main() {
for _, leader := range shardIDLeaderMap { for _, leader := range shardIDLeaderMap {
log.Debug("Client Join Shard", "leader", leader) log.Debug("Client Join Shard", "leader", leader)
clientNode.GetHost().AddPeer(&leader) clientNode.GetHost().AddPeer(&leader)
go clientNode.JoinShard(leader) if *libp2pPD {
clientNode.Role = node.NewNode
} else {
go clientNode.JoinShard(leader)
}
clientNode.State = node.NodeReadyForConsensus clientNode.State = node.NodeReadyForConsensus
} }
// wait for 1 seconds for client to send ping message to leader if *libp2pPD {
time.Sleep(time.Second) clientNode.ServiceManagerSetup()
clientNode.StopPing <- struct{}{} clientNode.RunServices()
clientNode.StartServer()
} else {
// wait for 1 seconds for client to send ping message to leader
time.Sleep(time.Second)
clientNode.StopPing <- struct{}{}
}
clientNode.State = node.NodeReadyForConsensus clientNode.State = node.NodeReadyForConsensus
// Transaction generation process // Transaction generation process

@ -99,7 +99,7 @@ func main() {
minPeers := flag.Int("min_peers", 100, "Minimal number of Peers in shard") minPeers := flag.Int("min_peers", 100, "Minimal number of Peers in shard")
// Key file to store the private key // Key file to store the private key
keyFile := flag.String("key", "./.hmykey", "the private key file of the bootnode") keyFile := flag.String("key", "./.hmykey", "the private key file of the harmony node")
flag.Var(&utils.BootNodes, "bootnodes", "a list of bootnode multiaddress") flag.Var(&utils.BootNodes, "bootnodes", "a list of bootnode multiaddress")
// LibP2P peer discovery integration test // LibP2P peer discovery integration test

File diff suppressed because it is too large Load Diff

@ -1,32 +0,0 @@
package node
// DeployAccount is the accounts used for development.
type DeployAccount struct {
Address string
Private string
Public string
}
// FakeAccounts is the accounts only used for development purpose.
var FakeAccounts = [...]DeployAccount{
{Address: "0xAAde00D97E9b2AAa19d2710b76d6413f993D9745", Private: "c6f4ab50857a394ed31297f9d41ace1816d2f566b3ef36639708d8799d98ce61", Public: "0xAAde00D97E9b2AAa19d2710b76d6413f993D9745"},
{Address: "0x3c44143624e0872D4e32Db1CE20Af2EbFe09F880", Private: "b9162457b06a474bdf00ba3107f830f5cccb1a6d316add395b80d3d36ddf84d4", Public: "0x3c44143624e0872D4e32Db1CE20Af2EbFe09F880"},
{Address: "0x8B7f5BA93996FFC10774b9F523c804918fb37635", Private: "d35ce93f89fe8d5dd76ed8cdb252ac143b53169add2b84a76e4780d705438f8e", Public: "0x8B7f5BA93996FFC10774b9F523c804918fb37635"},
{Address: "0x1973F2cDE703889Ba918e8864f040cD756DA710B", Private: "b8cf4ed5ba0b77a43b866524498b2f09ecdbfd036305d768292947e56bccceb7", Public: "0x1973F2cDE703889Ba918e8864f040cD756DA710B"},
{Address: "0xc41497315f5605Efc697Eb84C5b27980762556eD", Private: "8347df49470d61958c058e9d4d57e7915d6438b9c3a20444340e02c51a5ed2b4", Public: "0xc41497315f5605Efc697Eb84C5b27980762556eD"},
{Address: "0x32Ee9017f7b7dd05399Fb14525e1e56690894fB1", Private: "723927de4bb8a02deb8404cfda308e08e2cbc91f6de920cf0cb79c1232dde23f", Public: "0x32Ee9017f7b7dd05399Fb14525e1e56690894fB1"},
{Address: "0xe5C98A43f42E9fB1b290FBCBCEE6D31BCE433c6E", Private: "37b3db0c95d7d98166428a3dcdcbe3bb1e13d39aa08646f11bbb5accf4a546ee", Public: "0xe5C98A43f42E9fB1b290FBCBCEE6D31BCE433c6E"},
{Address: "0xBE4b41dc86A443Da147DA5a7a30D188EA8A45E58", Private: "3c1b4f6520b070d271c2de7d342d0eb664be82d2744307a64273049ff2354ee5", Public: "0xBE4b41dc86A443Da147DA5a7a30D188EA8A45E58"},
{Address: "0x2E0EF2E3e9f4F314b4cc54Efc1ea4cCc157E5749", Private: "88cc2c68a2f543ae2d0d2b363a03633fd5878a42f5e35049e773c29ec1ed4cd4", Public: "0x2E0EF2E3e9f4F314b4cc54Efc1ea4cCc157E5749"},
{Address: "0x01e58d72695197Fc35d24acfD909E390578cd962", Private: "4a9679c8b12bc48a442e75cd25bea47fb0c8b1cec56da65e145a642ffe8aa396", Public: "0x01e58d72695197Fc35d24acfD909E390578cd962"},
{Address: "0x35F5991124dF32E32552B59562EF46a5074cB5A3", Private: "61228f8938836278b99e3c37c9254fc23aa32c990287e466630d8b30c03627f4", Public: "0x35F5991124dF32E32552B59562EF46a5074cB5A3"},
{Address: "0xA832d248267af5e9B2eE78a8668EBb04AeA99613", Private: "8cd88a9cf78c2b685e793dece6f0171292cf72cbbfea831151d2b39935cb1532", Public: "0xA832d248267af5e9B2eE78a8668EBb04AeA99613"},
{Address: "0x11E88086EAd0042E04a63A67B02471afeB0b15eb", Private: "e05b811022a268d8382fccdf11dbeafa61f7c2eaba56bfdcc8c9408543628c69", Public: "0x11E88086EAd0042E04a63A67B02471afeB0b15eb"},
{Address: "0x3F510917bf1976Dc5De6396c534Dbe318B7146a2", Private: "69d13ca50a3fb4492476738a7571effe4cf55e8db1155de1327435460043a11f", Public: "0x3F510917bf1976Dc5De6396c534Dbe318B7146a2"},
{Address: "0x024bC87a26A3bB9cE7e18bCA2A2cDbDBAE42B12B", Private: "9271ae0561e8c002e273ccbdb389c11aac686a607af1ce33f8ed3a49975dd075", Public: "0x024bC87a26A3bB9cE7e18bCA2A2cDbDBAE42B12B"},
{Address: "0x960DF705848B2013DD6cf1E3F1376461dA8a24D6", Private: "f53ae08d87d744d45470b45ffff2af71269aef33033acf5344c7d4d8c64400d7", Public: "0x960DF705848B2013DD6cf1E3F1376461dA8a24D6"},
{Address: "0xb7F3F347a02BB6dFeF28d6A71197873e98E5942e", Private: "7cf030e2e75ccee0df0e462b20083cda1b164921816f55d7bb14642248933c64", Public: "0xb7F3F347a02BB6dFeF28d6A71197873e98E5942e"},
{Address: "0xc856Bb24116D617ba15881bcbdCC55B5a31996ae", Private: "8a6e9683ca8e980101260435b11357f4094fc3233772be38a75b653ad3983294", Public: "0xc856Bb24116D617ba15881bcbdCC55B5a31996ae"},
{Address: "0xf8FCE07DFFFd1E0B5fcc2f07116AC1E54AA7a27e", Private: "12ec787ab6667fbbc7ea23723b2e52d66452cacac09a574915600d85af24141a", Public: "0xf8FCE07DFFFd1E0B5fcc2f07116AC1E54AA7a27e"},
{Address: "0xf9b099054f28f2DE96DF8a46F8e2eFC07f110C45", Private: "ecaa786f451fa31ba74deb2bc6c0c02b85c3f52c0175f111daa750297fc426c9", Public: "0xf9b099054f28f2DE96DF8a46F8e2eFC07f110C45"},
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save