|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:https://blog.csdn.net/sgsgy5
我们可以先来理一下思路,我们想要实现一个区块该怎么办,思路理好然后再来代码一步一步实现
1:第一步创建一个区块结构体
type Block struct {
//创建一个区块结构体
Timer int64 //时间戳
Data []byte //数据
prevHash []byte //前一个区块的哈希值
Hash []byte //本区块的哈希值
}
区块结构体创建完成,继续下一步
2:创建第一个区块
func Firstblosk() *Block { //创建第一个区块信息,相当于一个创始块
firstblock := NewBlock("This is firstblock", []byte{}) //传入参数,返回结构体指针类型
return firstblock //返回的是结构体指针类型
}
func NewBlock(data string, prevhash []byte) *Block { //创建区块的函数
block1 := Block{} //创建一个区块结构体
block1.Timer = time.Now().Unix() //得到时间
block1.Data = []byte(data) //传入数据参数
block1.prevHash = prevhash //前一个哈希值为传入的数据
block1.setHash() //setHash 方法加密得到自己的hash
return &block1 //返回区块指针
}
用来创建第一个区块
3:给区块信息数据处理
func (block *Block) setHash() {
time := []byte(strconv.FormatInt(block.Timer, 10)) //将区块的时间转为字符切片类型,方便加密
heards := bytes.Join([][]byte{time, block.Data, block.prevHash}, []byte{}) //将时间,数据,前一个哈希拼接一下
hash := sha256.Sum256(heards) //用sha256包的Sum256函数加密
block.Hash = hash[:] //加密后的直接赋值给本哈希
}
4:主函数里面打印看一下本区块的哈希 //哈希用16进制打印
func main() { firstblock := Firstblosk() fmt.Printf("%x",string(firstblock.Hash)) //16进制打印 }
这样一个简单的区块就创建成功了,我们把所有代码连接起来然后来看一下打印结果
package main
/*一个简单的区块创建实现*/
import (
"time"
"strconv"
"bytes"
"crypto/sha256"
"fmt"
)
type Block struct {
//创建一个区块结构体
Timer int64 //时间戳
Data []byte //数据
prevHash []byte //前一个区块的哈希值
Hash []byte //本区块的哈希值
}
func (block *Block) setHash() {
time := []byte(strconv.FormatInt(block.Timer, 10)) //将区块的时间转为字符切片类型,方便加密
heards := bytes.Join([][]byte{time, block.Data, block.prevHash}, []byte{}) //将时间,数据,前一个哈希拼接一下
hash := sha256.Sum256(heards) //用sha256包的Sum256函数加密
block.Hash = hash[:] //加密后的直接赋值给本哈希
}
func Firstblosk() *Block { //创建第一个区块信息,相当于一个创始块
firstblock := NewBlock("This is firstblock", []byte{}) //传入参数,返回结构体指针类型
return firstblock //返回的是结构体指针类型
}
func NewBlock(data string, prevhash []byte) *Block { //创建区块的函数
block1 := Block{} //创建一个区块结构体
block1.Timer = time.Now().Unix() //得到时间
block1.Data = []byte(data) //传入数据参数
block1.prevHash = prevhash //前一个哈希值为传入的数据
block1.setHash() //setHash 方法加密得到自己的hash
return &block1 //返回区块指针
}
func main() {
firstblock := Firstblosk()
fmt.Printf("%x",string(firstblock.Hash)) //16进制打印
}