//block.go
package main
import (
"bytes"
"crypto/sha256"
"strconv"
"time"
)
//定义区块
type Block struct{
Timestamp int64 //时间线,1970年1月1日00.00.00
Data []byte //交易数据
PrevBlockHash []byte //上一块数据的哈希
Hash []byte //当前块数据的哈希
}
//设定结构体对象哈希
func (block *Block)SetHash(){
//处理当前的时间,转化为10进制的字符串,再转化为字节集合
timestamp:=[]byte(strconv.FormatInt(block.Timestamp,10))
//叠加要哈希的数据
headers:=bytes.Join([][]byte{block.PrevBlockHash,block.Data,timestamp},[]byte{})
//计算出哈希地址
hash:=sha256.Sum256(headers)
block.Hash=hash[:]//设置哈希
}
//创建一个区块
func NewBlock(data string, prevBlockHash []byte) *Block{
//block是一个指针,取得一个对象初始化之后的地址
block:=&Block{time.Now().Unix(),[]byte(data),prevBlockHash,[]byte{}}
block.SetHash()//设置当前哈希
return block
}
//创建创世区块,
func NewGenesisBlock() *Block{
return NewBlock("hello, welcome to my second BlockChain",[]byte{})
}
//blockchain.go
package main
type BlockChain struct{
blocks []*Block //一个数组,每个元素都是指针,存储block区块的地址
}
//增加一个区块
func (blocks *BlockChain)AddBlock(data string ){
prevBlock:=blocks.blocks[len(blocks.blocks)-1] //取出最后一个区块
newBlock:=NewBlock(data,prevBlock.Hash) //创建一个区块
blocks.blocks=append(blocks.blocks,newBlock) //区块链插入新的区块
}
//创建一个区块链
func NewBlockchain ()*BlockChain{
return &BlockChain{[]*Block{NewGenesisBlock()}}
}
//main.go
package main
import "fmt"
func main(){
fmt.Println("hello game start")
bc:=NewBlockchain() //创建区块链
bc.AddBlock("小明1 pay 小红 10")
bc.AddBlock("小明2 pay 小红 20")
bc.AddBlock("小明3 pay 小红 30")
for _,block:=range bc.blocks{
fmt.Printf("上一块哈希%x\n",block.PrevBlockHash)
fmt.Printf("数据: %s\n",block.Data)
fmt.Printf("当前哈希%x\n",block.Hash)
fmt.Println()
}
}