1.参考文献
https://studygolang.com/articles/11399?fr=sidebar
2.源码
跟参考文献相比略做修改。
package main
import (
"bytes"
"crypto/sha256"
"fmt"
"strconv"
"time"
)
//一个区块
type Block struct {
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
}
//区块链
type BlockChain struct {
blocks []*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[:]
}
//创建区块
func NewBlock(data string, preBlockHash []byte) *Block {
block := &Block{time.Now().Unix(), []byte(data), preBlockHash, []byte{}}
block.setHash()
return block
}
//创建区块链:第一个创始块是固定的字符串内容
func NewBlockChain(genesis string) *BlockChain {
return &BlockChain{[]*Block{NewBlock(genesis, []byte{})}}
}
func (bc *BlockChain) addBlock(data string) {
preBlock := bc.blocks[len(bc.blocks)-1]
newBlock := NewBlock(data, preBlock.Hash)
bc.blocks = append(bc.blocks, newBlock)
}
func main() {
bc := NewBlockChain("my first bc")
bc.addBlock("block no.1")
bc.addBlock("block no.2")
for _, block := range bc.blocks {
fmt.Println(block.PrevBlockHash)
fmt.Println(string(block.Data))
fmt.Println(block.Hash)
fmt.Println()
}
}