|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package identitychain |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"fmt" |
|
|
|
|
"net" |
|
|
|
|
"os" |
|
|
|
|
"sync" |
|
|
|
@ -8,17 +9,17 @@ import ( |
|
|
|
|
"github.com/simple-rules/harmony-benchmark/log" |
|
|
|
|
"github.com/simple-rules/harmony-benchmark/p2p" |
|
|
|
|
"github.com/simple-rules/harmony-benchmark/waitnode" |
|
|
|
|
"github.com/simple-rules/harmony-benchmark/proto" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var mutex sync.Mutex |
|
|
|
|
var IdentityPerBlock := 100000 |
|
|
|
|
var IdentityPerBlock = 100000 |
|
|
|
|
|
|
|
|
|
// IdentityChain (Blockchain) keeps Identities per epoch, currently centralized!
|
|
|
|
|
type IdentityChain struct { |
|
|
|
|
Identities []*IdentityBlock |
|
|
|
|
PendingIdentities []*waitnode.WaitNode |
|
|
|
|
log log.Logger |
|
|
|
|
Peer p2p.Peer |
|
|
|
|
Peer p2p.Peer |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//IdentityChainHandler handles registration of new Identities
|
|
|
|
@ -26,29 +27,30 @@ func (IDC *IdentityChain) IdentityChainHandler(conn net.Conn) { |
|
|
|
|
// Read p2p message payload
|
|
|
|
|
content, err := p2p.ReadMessageContent(conn) |
|
|
|
|
if err != nil { |
|
|
|
|
IDC.log.Error("Read p2p data failed", "err", err, "node", node) |
|
|
|
|
IDC.log.Error("Read p2p data failed") |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
fmt.Printf("content is %b", content) |
|
|
|
|
|
|
|
|
|
msgCategory, err := proto.GetMessageCategory(content) |
|
|
|
|
if err != nil { |
|
|
|
|
IDC.log.Error("Read node type failed", "err", err, "node", node) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
// msgCategory, err := proto.GetMessageCategory(content)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// IDC.log.Error("Read node type failed", "err", err, "node", node)
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
msgType, err := proto.GetMessageType(content) |
|
|
|
|
if err != nil { |
|
|
|
|
IDC.log.Error("Read action type failed", "err", err, "node", node) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
// msgType, err := proto.GetMessageType(content)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// IDC.log.Error("Read action type failed", "err", err, "node", node)
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
msgPayload, err := proto.GetMessagePayload(content) |
|
|
|
|
if err != nil { |
|
|
|
|
IDC.log.Error("Read message payload failed", "err", err, "node", node) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
NewWaitNode := *waitnode.DeserializeWaitNode(msgPayload) |
|
|
|
|
IDC.PendingIdentities = append(IDC.PendingIdentities, NewWaitNode) |
|
|
|
|
// msgPayload, err := proto.GetMessagePayload(content)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// IDC.log.Error("Read message payload failed", "err", err, "node", node)
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
// NewWaitNode := *waitnode.DeserializeWaitNode(msgPayload)
|
|
|
|
|
// IDC.PendingIdentities = append(IDC.PendingIdentities, NewWaitNode)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// GetLatestBlock gests the latest block at the end of the chain
|
|
|
|
@ -59,37 +61,40 @@ func (IDC *IdentityChain) GetLatestBlock() *IdentityBlock { |
|
|
|
|
return IDC.Identities[len(IDC.Identities)-1] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//CreateNewBlock is to create the Blocks to be added to the chain
|
|
|
|
|
func (IDC *IdentityChain) MakeNewBlock() *IdentityBlock { |
|
|
|
|
//UpdateIdentityChain is to create the Blocks to be added to the chain
|
|
|
|
|
func (IDC *IdentityChain) UpdateIdentityChain() { |
|
|
|
|
|
|
|
|
|
if len(IDC.Identities) == 0 { |
|
|
|
|
return NewGenesisBlock() |
|
|
|
|
} |
|
|
|
|
//If there are no more Identities registring the blockchain is dead
|
|
|
|
|
if len(IDC.PendingIdentities) == 0 { |
|
|
|
|
// This is abd, because previous block might not be alive
|
|
|
|
|
return IDC.GetLatestBlock() |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
prevBlock := IDC.GetLatestBlock() |
|
|
|
|
NewIdentities := IDC.PendingIdentities[:IdentityPerBlock] |
|
|
|
|
IDC.PendingIdentities = IDC.PendingIdentities[IdentityPerBlock]: |
|
|
|
|
//All other blocks are dropped.
|
|
|
|
|
IDBlock = NewBlock(NewIdentities,prevBlock.CalculateBlockHash()) |
|
|
|
|
IDC.Identities = append(IDBlock,IDC.Identities) |
|
|
|
|
if len(IDC.Identities) == 0 { |
|
|
|
|
block := NewGenesisBlock() |
|
|
|
|
IDC.Identities = append(IDC.Identities, block) |
|
|
|
|
} else { |
|
|
|
|
prevBlock := IDC.GetLatestBlock() |
|
|
|
|
prevBlockHash := prevBlock.CalculateBlockHash() |
|
|
|
|
NewIdentities := IDC.PendingIdentities[:IdentityPerBlock] |
|
|
|
|
IDC.PendingIdentities = IDC.PendingIdentities[IdentityPerBlock:] |
|
|
|
|
//All other blocks are dropped.
|
|
|
|
|
IDBlock := NewBlock(NewIdentities, prevBlockHash) |
|
|
|
|
IDC.Identities = append(IDC.Identities, IDBlock) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (IDC *IdentityChain) listenOnPort() { |
|
|
|
|
listen, err := net.Listen("tcp4", IDC.Peer.Ip + ":" IDC.Peer.Port) |
|
|
|
|
listen, err := net.Listen("tcp4", IDC.Peer.Ip+":"+IDC.Peer.Port) |
|
|
|
|
defer listen.Close() |
|
|
|
|
if err != nil { |
|
|
|
|
IDC.log.Crit("Socket listen port failed", "port", port, "err", err) |
|
|
|
|
IDC.log.Crit("Socket listen port failed", "port", IDC.Peer.Port, "err", err) |
|
|
|
|
os.Exit(1) |
|
|
|
|
} |
|
|
|
|
for { |
|
|
|
|
conn, err := listen.Accept() |
|
|
|
|
if err != nil { |
|
|
|
|
IDC.log.Crit("Error listening on port. Exiting.", "port", port) |
|
|
|
|
IDC.log.Crit("Error listening on port. Exiting.", "port", IDC.Peer.Port) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
go IDC.IdentityChainHandler(conn) |
|
|
|
@ -97,12 +102,5 @@ func (IDC *IdentityChain) listenOnPort() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func main() { |
|
|
|
|
var IDC IdentityChain |
|
|
|
|
var nullPeer p2p.Peer |
|
|
|
|
go func() { |
|
|
|
|
genesisBlock := &IdentityBlock{nullPeer, 0} |
|
|
|
|
mutex.Lock() |
|
|
|
|
IDC.Identities = append(IDC.Identities, genesisBlock) |
|
|
|
|
mutex.Unlock() |
|
|
|
|
}() |
|
|
|
|
fmt.Print("Hi") |
|
|
|
|
} |
|
|
|
|