package main import ( "bytes" "crypto/sha256" "fmt" "strconv" "time" ) // Block keeps block headers type Block struct { Timestamp int64 Data []byte PrevBlock []byte Hash []byte } // SetHash calculates and sets block hash func (b *Block) SetHash() { timestamp := []byte(strconv.FormatInt(b.Timestamp, 10)) headers := bytes.Join([][]byte{b.PrevBlock, b.Data, timestamp}, []byte{}) fmt.Printf("%s\n", headers) hash := sha256.Sum256(headers) b.Hash = hash[:] } // NewBlock creates and returns Block func NewBlock(data string, prevBlock []byte) *Block { block := &Block{time.Now().Unix(), []byte(data), prevBlock, []byte("")} block.SetHash() return block } // NewGenesisBlock creates and returns genesis Block func NewGenesisBlock() *Block { return NewBlock("Genesis Block", []byte("0")) }