一个简单区块的实现

|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:https://blog.csdn.net/sgsgy5


简单区块实现
区块链技术如今已经越来越成熟,但是我们怎么深入到本质用技术的眼光来看待区块链技术,见名知意,区块链的意思就是用链条把区块链接起来,那我们先用代码来看一下,今天我们用go语言来简单的实现一个区块并打印。

我们可以先来理一下思路,我们想要实现一个区块该怎么办,思路理好然后再来代码一步一步实现

  • 创建一个结构体来保存一个区块的信息 //大概包括时间戳,数据,前哈希,本哈希这几个数据
  • 创建第一个区块并给其中的数据赋值,也就相当于一个创世块,注意这里创世块的前哈希传一个空值就可以
  • 给这个区块的数据处理一下然后加密得到本区块的哈希
  • 主函数里面打印看一下本区块的哈希 //哈希用16进制打印
    大概这样思路就可以理顺了,然后我们就可以一步一步实现了

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进制打印
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sgsgy5/article/details/82561101
今日推荐