|
|
|
package beaconchain
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"os"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/dedis/kyber"
|
|
|
|
"github.com/harmony-one/harmony/crypto/pki"
|
|
|
|
"github.com/harmony-one/harmony/log"
|
|
|
|
"github.com/harmony-one/harmony/node"
|
|
|
|
"github.com/harmony-one/harmony/p2p"
|
|
|
|
proto_identity "github.com/harmony-one/harmony/proto/identity"
|
|
|
|
)
|
|
|
|
|
|
|
|
var mutex sync.Mutex
|
|
|
|
var identityPerBlock = 100000
|
|
|
|
|
|
|
|
// BeaconChain (Blockchain) keeps Identities per epoch, currently centralized!
|
|
|
|
type BeaconChain struct {
|
|
|
|
//Identities []*IdentityBlock //No need to have the identity block as of now
|
|
|
|
Identities []*node.Node
|
|
|
|
log log.Logger
|
|
|
|
PeerToShardMap map[*node.Node]int
|
|
|
|
ShardLeaderMap map[int]*node.Node
|
|
|
|
PubKey kyber.Point
|
|
|
|
NumberOfShards int
|
|
|
|
NumberOfLeadersAdded int
|
|
|
|
}
|
|
|
|
|
|
|
|
// New return BeaconChain.
|
|
|
|
func New(filename string) *BeaconChain {
|
|
|
|
idc := BeaconChain{}
|
|
|
|
//idc.NumberOfShards = readConfigFile(filename)
|
|
|
|
idc.log = log.New()
|
|
|
|
idc.NumberOfShards = 2
|
|
|
|
idc.PubKey = generateIDCKeys()
|
|
|
|
return &idc
|
|
|
|
}
|
|
|
|
|
|
|
|
func readConfigFile(filename string) int {
|
|
|
|
return 2
|
|
|
|
}
|
|
|
|
|
|
|
|
func generateIDCKeys() kyber.Point {
|
|
|
|
priKey := pki.GetPrivateKeyFromInt(10)
|
|
|
|
pubkey := pki.GetPublicKeyFromPrivateKey(priKey)
|
|
|
|
return pubkey
|
|
|
|
}
|
|
|
|
|
|
|
|
// AcceptConnections welcomes new connections
|
|
|
|
func (IDC *BeaconChain) AcceptConnections(b []byte) {
|
|
|
|
NewNode := node.DeserializeNode(b)
|
|
|
|
fmt.Println(NewNode)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (IDC *BeaconChain) registerNode(Node *node.Node) {
|
|
|
|
IDC.Identities = append(IDC.Identities, Node)
|
|
|
|
fmt.Println(IDC.Identities)
|
|
|
|
//IDC.CommunicatePublicKeyToNode(Node.SelfPeer)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// CommunicatePublicKeyToNode communicates public key to node.
|
|
|
|
func (IDC *BeaconChain) CommunicatePublicKeyToNode(peer p2p.Peer) {
|
|
|
|
pbkey := pki.GetBytesFromPublicKey(IDC.PubKey)
|
|
|
|
msgToSend := proto_identity.ConstructIdentityMessage(proto_identity.Acknowledge, pbkey[:])
|
|
|
|
p2p.SendMessage(peer, msgToSend)
|
|
|
|
}
|
|
|
|
|
|
|
|
//StartServer a server and process the request by a handler.
|
|
|
|
func (IDC *BeaconChain) StartServer() {
|
|
|
|
IDC.log.Info("Starting IDC server...") //log.Info does nothing for me! (ak)
|
|
|
|
IDC.listenOnPort()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (IDC *BeaconChain) listenOnPort() {
|
|
|
|
addr := net.JoinHostPort("127.0.0.1", "8081")
|
|
|
|
listen, err := net.Listen("tcp", addr)
|
|
|
|
if err != nil {
|
|
|
|
IDC.log.Crit("Socket listen port failed")
|
|
|
|
os.Exit(1)
|
|
|
|
} else {
|
|
|
|
IDC.log.Info("Identity chain is now listening ..")
|
|
|
|
}
|
|
|
|
defer listen.Close()
|
|
|
|
for {
|
|
|
|
IDC.log.Info("I am accepting connections now")
|
|
|
|
conn, err := listen.Accept()
|
|
|
|
fmt.Println(conn)
|
|
|
|
if err != nil {
|
|
|
|
IDC.log.Crit("Error listening on port. Exiting", "8081")
|
|
|
|
continue
|
|
|
|
} else {
|
|
|
|
IDC.log.Info("I am accepting connections now")
|
|
|
|
}
|
|
|
|
go IDC.BeaconChainHandler(conn)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|