package main
import (
"crypto/sha256"
"fmt"
)
//0 定义结构
// 创建前哈希值 创建当前哈希值 和数据
type Block struct {
Prevhash []byte //前哈希
Hash []byte //当前哈希 TODO
Data []byte //数据
}
//创建一个区块
func NewBlock(data string,prevBlockHash []byte) *Block {
block:=Block{
Prevhash: prevBlockHash,
Hash: []byte{}, //当前的先默认为空的 后面再计算
Data:[]byte(data), //传过来的肯定是字符串 转byte
}
block.SetHash()
return &block
}
//3 将区块生成哈希 SetHash()方法来生成 传递的是结构的类
func (block *Block) SetHash() {
//拼接数据 前哈希加上当前区块的数据
blcokInfo:= append(block.Prevhash,block.Data...)
//调用哈希方法生成
hash:=sha256.Sum256(blcokInfo)
block.Hash=hash[:]
}
// 4. 引入区块链 就是把block连接起来
// 4-1 定义区块链结构
type BlockChain struct {
//定义一个区块链数组
blocks []*Block
}
// 5. 定义(创建)一个区块链 注意 定义区块链要弄一个创世区块
func NewBlockChain() *BlockChain{
// 创建一个创世区块 并作为第一个添加到区块链当中
genesisBlock:=genesisBlock()
return &BlockChain{
blocks:[]*Block{genesisBlock},
}
}
//定义一个创世区块
func genesisBlock() *Block {
return NewBlock("我是创世区块",[]byte{})
}
// 5. 添加区块代码
// 6. 重构代码
func main() {
//创建一个区块链
bc:=NewBlockChain() //创建完是一个数组 对数组循环遍历
for i,block:=range bc.blocks{
fmt.Printf("当前区块高度: %x\n",i)
fmt.Printf("前区块的哈希是: %x\n",block.Prevhash)
fmt.Printf("当前区块的哈希是: %x\n",block.Hash)
fmt.Printf("当前区块的数据是: %s\n",block.Data)
}
//block:= NewBlock("老师让班长转一枚比特币给我",[]byte{})
//fmt.Printf("前区块的哈希是: %x\n",block.Prevhash)
//fmt.Printf("当前区块的哈希是: %x\n",block.Hash)
//fmt.Printf("当前区块的数据是: %s\n",block.Data)
}