Chunk.go
package model
import (
"encoding/json"
"sort"
"strconv"
"strings"
"github.com/saseul/util"
)
type Chunk struct {
PreviousBlockHash string `json:"previous_blockhash"`
STimestamp int64 `json:"s_timestamp"`
Transactions []string `json:"transactions"`
ChunkHash string `json:"chunk_hash"`
PublicKey string `json:"public_key"`
Signature string `json:"signature"`
}
func NewChunk(initialInfo map[string]interface{}) *Chunk {
chunk := &Chunk{
PreviousBlockHash: initialInfo["previous_blockhash"].(string),
STimestamp: int64(initialInfo["s_timestamp"].(float64)),
Transactions: toStringSlice(initialInfo["transactions"]),
ChunkHash: initialInfo["chunk_hash"].(string),
PublicKey: initialInfo["public_key"].(string),
Signature: initialInfo["signature"].(string),
}
return chunk
}
func (c *Chunk) Signer() string {
return util.Address(c.PublicKey)
}
func (c *Chunk) ChunkRoot() string {
return util.MerkleRoot(c.Thashs())
}
func (c *Chunk) Thashs() []string {
thashs := c.Transactions
sort.Strings(thashs)
return thashs
}
func (c *Chunk) SignChunk(account *Account) {
chunkRoot := c.ChunkRoot()
c.ChunkHash = util.TimeHash(c.PreviousBlockHash + chunkRoot, strconv.FormatInt(c.STimestamp, 10))
c.PublicKey = account.PublicKey
c.Signature = util.Signature(c.ChunkHash, account.PrivateKey)
}
func (c *Chunk) HashValidity() bool {
chunkRoot := c.ChunkRoot()
chunkHash := util.TimeHash(c.PreviousBlockHash + chunkRoot, strconv.FormatInt(c.STimestamp, 10))
return chunkHash == c.ChunkHash
}
func (c *Chunk) SignatureValidity() bool {
return util.SignatureValidity(c.ChunkHash, c.PublicKey, c.Signature)
}
func (c *Chunk) StructureValidity() bool {
return c.PreviousBlockHash != "" &&
c.STimestamp != 0 &&
len(c.Transactions) > 0 &&
c.ChunkHash != "" &&
c.PublicKey != "" &&
c.Signature != ""
}
func (c *Chunk) Validity() bool {
return c.StructureValidity() &&
c.HashValidity() &&
c.SignatureValidity()
}
func (c *Chunk) Obj() map[string]interface{} {
return map[string]interface{}{
"previous_blockhash": c.PreviousBlockHash,
"s_timestamp": c.STimestamp,
"transactions": c.Transactions,
"chunk_hash": c.ChunkHash,
"public_key": c.PublicKey,
"signature": c.Signature,
}
}
func (c *Chunk) JSON() string {
obj := c.Obj()
jsonStr, _ := json.Marshal(obj)
return string(jsonStr)
}
func toStringSlice(data interface{}) []string {
if data == nil {
return nil
}
switch v := data.(type) {
case []interface{}:
result := make([]string, len(v))
for i, value := range v {
result[i] = value.(string)
}
return result
case []string:
return v
default:
return nil
}
}1. Chunk 구조체
Chunk 구조체2. NewChunk 함수
NewChunk 함수3. Signer 메서드
Signer 메서드4. ChunkRoot 메서드
ChunkRoot 메서드5. Thashs 메서드
Thashs 메서드6. SignChunk 메서드
SignChunk 메서드7. HashValidity 메서드
HashValidity 메서드8. SignatureValidity 메서드
SignatureValidity 메서드9. StructureValidity 메서드
StructureValidity 메서드10. Validity 메서드
Validity 메서드11. Obj 메서드
Obj 메서드12. JSON 메서드
JSON 메서드13. toStringSlice 함수
toStringSlice 함수Last updated