package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"time"
)
type Block struct {
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
}
type Blockchain struct {
blocks []*Block
}
func (b *Block) SetHash() {
timestamp := []byte(fmt.Sprint(b.Timestamp))
headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
hash := sha256.Sum256(headers)
b.Hash = hash[:]
}
func NewBlock(data string, prevBlockHash []byte) *Block {
block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
block.SetHash()
return block
}
func (bc *Blockchain) AddBlock(data string) {
prevBlock := bc.blocks[len(bc.blocks)-1]
newBlock := NewBlock(data, prevBlock.Hash)
bc.blocks = append(bc.blocks, newBlock)
}
func NewGenesisBlock() *Block {
return NewBlock("Genesis Block", []byte{})
}
func NewBlockchain() *Blockchain {
return &Blockchain{[]*Block{NewGenesisBlock()}}
}
func main() {
bc := NewBlockchain()
bc.AddBlock("Block 1 Data")
bc.AddBlock("Block 2 Data")
for _, block := range bc.blocks {
fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash)
fmt.Printf("Data: %s\n", block.Data)
fmt.Printf("Hash: %x\n", block.Hash)
fmt.Println()
}
}
上述代码实现了一个区块链,包含了创建区块、加密哈希以及链接区块的功能。其中,Block结构体用于表示一个区块,包含时间戳、数据、前一个区块的哈希值以及本区块的哈希值。我们利用sha256算法对区块头进行哈希加密,然后将加密后的哈希值赋给区块的Hash字段。NewBlock函数用于创建新的区块,通过调用SetHash函数设置区块的哈希值。AddBlock函数用于向区块链中添加新的区块,它先找到前一个区块,然后利用NewBlock创建新的区块,并将其添加到区块链中。NewGenesisBlock用于创建创世区块,包含了一些默认值。NewBlockchain用于创建一个新的区块链,包含一个创世区块。最后,在main函数中,我们创建一个新的区块链,向其中添加了两个区块,并打印出每个区块的前一个区块的哈希值、区块数据和哈希值。