commit
8e73fb7ada
@ -1,9 +1,70 @@ |
|||||||
package identitychain |
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
|
// IdentityBlock has the information of one node
|
||||||
type IdentityBlock struct { |
type IdentityBlock struct { |
||||||
Peer p2p.Peer |
Timestamp int64 |
||||||
|
PrevBlockHash [32]byte |
||||||
NumIdentities int32 |
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