parent
ab113e02ca
commit
8154d4f281
@ -0,0 +1,37 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"bytes" |
||||
"crypto/sha256" |
||||
"strconv" |
||||
"time" |
||||
) |
||||
|
||||
// Block keeps block headers
|
||||
type Block struct { |
||||
Timestamp int64 |
||||
Data []byte |
||||
PrevBlockHash []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.PrevBlockHash, b.Data, timestamp}, []byte{}) |
||||
hash := sha256.Sum256(headers) |
||||
|
||||
b.Hash = hash[:] |
||||
} |
||||
|
||||
// NewBlock creates and returns Block
|
||||
func NewBlock(data string, prevBlockHash []byte) *Block { |
||||
block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}} |
||||
block.SetHash() |
||||
return block |
||||
} |
||||
|
||||
// NewGenesisBlock creates and returns genesis Block
|
||||
func NewGenesisBlock() *Block { |
||||
return NewBlock("Genesis Block", []byte{}) |
||||
} |
@ -0,0 +1,18 @@ |
||||
package main |
||||
|
||||
// Blockchain keeps a sequence of Blocks
|
||||
type Blockchain struct { |
||||
blocks []*Block |
||||
} |
||||
|
||||
// AddBlock saves provided data as a block in the blockchain
|
||||
func (bc *Blockchain) AddBlock(data string) { |
||||
prevBlock := bc.blocks[len(bc.blocks)-1] |
||||
newBlock := NewBlock(data, prevBlock.Hash) |
||||
bc.blocks = append(bc.blocks, newBlock) |
||||
} |
||||
|
||||
// NewBlockchain creates a new Blockchain with genesis Block
|
||||
func NewBlockchain() *Blockchain { |
||||
return &Blockchain{[]*Block{NewGenesisBlock()}} |
||||
} |
Loading…
Reference in new issue