commit
8e73fb7ada
@ -1,9 +1,70 @@ |
||||
package identitychain |
||||
|
||||
import "github.com/simple-rules/harmony-benchmark/p2p" |
||||
import ( |
||||
"bytes" |
||||
"crypto/sha256" |
||||
"encoding/gob" |
||||
"log" |
||||
"time" |
||||
|
||||
"github.com/simple-rules/harmony-benchmark/utils" |
||||
"github.com/simple-rules/harmony-benchmark/waitnode" |
||||
) |
||||
|
||||
// IdentityBlock has the information of one node
|
||||
type IdentityBlock struct { |
||||
Peer p2p.Peer |
||||
Timestamp int64 |
||||
PrevBlockHash [32]byte |
||||
NumIdentities int32 |
||||
Identities []*waitnode.WaitNode |
||||
} |
||||
|
||||
// Serialize serializes the block
|
||||
func (b *IdentityBlock) Serialize() []byte { |
||||
var result bytes.Buffer |
||||
encoder := gob.NewEncoder(&result) |
||||
err := encoder.Encode(b) |
||||
if err != nil { |
||||
log.Panic(err) |
||||
} |
||||
return result.Bytes() |
||||
} |
||||
|
||||
// DeserializeBlock deserializes a block
|
||||
func DeserializeBlock(d []byte) *IdentityBlock { |
||||
var block IdentityBlock |
||||
decoder := gob.NewDecoder(bytes.NewReader(d)) |
||||
err := decoder.Decode(&block) |
||||
if err != nil { |
||||
log.Panic(err) |
||||
} |
||||
return &block |
||||
} |
||||
|
||||
// NewBlock creates and returns a new block.
|
||||
func NewBlock(Identities []*waitnode.WaitNode, prevBlockHash [32]byte) *IdentityBlock { |
||||
block := &IdentityBlock{Timestamp: time.Now().Unix(), PrevBlockHash: prevBlockHash, NumIdentities: int32(len(Identities)), Identities: Identities} |
||||
return &block |
||||
} |
||||
|
||||
// CalculateBlockHash returns a hash of the block
|
||||
func (b *IdentityBlock) CalculateBlockHash() []byte { |
||||
var hashes [][]byte |
||||
var blockHash [32]byte |
||||
hashes = append(hashes, utils.ConvertFixedDataIntoByteArray(b.Timestamp)) |
||||
hashes = append(hashes, b.PrevBlockHash[:]) |
||||
for _, id := range b.Identities { |
||||
hashes = append(hashes, id) |
||||
} |
||||
hashes = append(hashes, utils.ConvertFixedDataIntoByteArray(b.ShardId)) |
||||
blockHash = sha256.Sum256(bytes.Join(hashes, []byte{})) |
||||
return blockHash[:] |
||||
} |
||||
|
||||
// NewGenesisBlock creates and returns genesis Block.
|
||||
func NewGenesisBlock() *IdentityBlock { |
||||
numTxs := 0 |
||||
var Ids []*waitnode.WaitNode |
||||
block := &IdentityBlock{Timestamp: time.Now().Unix(), PrevBlockHash: [32]byte{}, NumIdentities: 1, Identities: Ids} |
||||
return block |
||||
} |
||||
|
@ -0,0 +1,42 @@ |
||||
package identity |
||||
|
||||
import ( |
||||
"errors" |
||||
) |
||||
|
||||
// the number of bytes consensus message type occupies
|
||||
const IDENTITY_MESSAGE_TYPE_BYTES = 1 |
||||
|
||||
type MessageType int |
||||
|
||||
const ( |
||||
REGISTER MessageType = iota |
||||
) |
||||
|
||||
// Returns string name for the MessageType enum
|
||||
func (msgType MessageType) String() string { |
||||
names := [...]string{ |
||||
"REGISTER", |
||||
} |
||||
|
||||
if msgType < REGISTER || msgType > REGISTER { |
||||
return "Unknown" |
||||
} |
||||
return names[msgType] |
||||
} |
||||
|
||||
// GetIdentityMessageType Get the consensus message type from the identity message
|
||||
func GetIdentityMessageType(message []byte) (MessageType, error) { |
||||
if len(message) < 1 { |
||||
return 0, errors.New("Failed to get consensus message type: no data available.") |
||||
} |
||||
return MessageType(message[0]), nil |
||||
} |
||||
|
||||
// GetIdentityMessagePayload message payload from the identity message
|
||||
func GetIdentityMessagePayload(message []byte) ([]byte, error) { |
||||
if len(message) < 2 { |
||||
return []byte{}, errors.New("Failed to get consensus message payload: no data available.") |
||||
} |
||||
return message[IDENTITY_MESSAGE_TYPE_BYTES:], nil |
||||
} |
Loading…
Reference in new issue