一条简单区块链的实现

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


在上一章中我们讲解了一个简单的区块创建,那么我们今天来讲解一下一条简单区块链的实现

思路分析:
创建一个创世块,就是区块链的头 //上一章节中讲解了如果实现一个区块的简单实现
定义一个结构体,用来保存区块链中的区块,结构体里面的元素可以就是那条链
用方法来实现区块的添加,每次调用方法都加进相应的区块
第一步实现

type Block struct {
    //创建一个区块的结构体
    Time         int64  //时间戳
    Data         []byte //数据信息
    PreviousHash []byte //前一个哈希值
    Hash         []byte //当前的哈希
}

第二步实现

type Blockchain struct{    //创建一个区块链类型
    blocks []*Block           //一系列区块储存,这里用切片来保存
}

第三步实现

func (blockchain *Blockchain)Addblock(data string){   //添加区块的方法
    newblock:=Block{}                           //一个新区块
    newblock.Data=[]byte(data)                     //初始化数据
    newblock.PreviousHash=blockchain.blocks[len(blockchain.blocks)-1].Hash   //得到前一个区块的哈希
    newblock.Sethash()                                 //得到哈希
    blockchain.blocks=append(blockchain.blocks,&newblock)     //新区块添加到这条链当中

}
func Newblockchain()*Blockchain{              // 创建一条新的区块链
    blos:=Blockchain{[]*Block{Firstblock()}}   //初始化
    return &blos
}

这样新的区块链就完成的差不多了,加上上一章的简单实现区块链的代码就已经实现了,下面我们整理一下将得到如下的代码

package main

import (
    "time"
    "strconv"
    "bytes"
    "crypto/sha256"
    "fmt"
)
/*一个简单的区块链创建*/
type Block struct {
    //创建一个区块的结构体
    Time         int64  //时间戳
    Data         []byte //数据信息
    PreviousHash []byte //前一个哈希值
    Hash         []byte //当前的哈希
}
type Blockchain struct{    //创建一个区块链类型
    blocks []*Block           //一系列区块储存,这里用切片来保存
}
func (blockchain *Blockchain)Addblock(data string){   //添加区块的方法
    newblock:=Block{}                           //一个新区块
    newblock.Data=[]byte(data)                     //初始化数据
    newblock.PreviousHash=blockchain.blocks[len(blockchain.blocks)-1].Hash   //得到前一个区块的哈希
    newblock.Sethash()                                 //得到哈希
    blockchain.blocks=append(blockchain.blocks,&newblock)     //新区块添加到这条链当中

}
func Newblockchain()*Blockchain{              // 创建一条新的区块链
    blos:=Blockchain{[]*Block{Firstblock()}}   //初始化
    return &blos
}
func Firstblock()*Block{
    firstblock:=Newblock("firstblock",[]byte{})
    return firstblock
}
func (block *Block)Sethash(){
    timer:=[]byte(strconv.FormatInt(block.Time,10))
    herds:=bytes.Join([][]byte{timer,[]byte(block.Data),block.PreviousHash},[]byte{})
    hash:=sha256.Sum256(herds)
    block.Hash=hash[:]
}
func Newblock(data string,prevhash []byte)*Block{
    block:=Block{}
    block.Time=time.Now().Unix()
    block.Data=[]byte(data)
    block.PreviousHash=prevhash
    block.Sethash()

   return &block
}
func main() {
    //创建一个区块链
    blocks:=Newblockchain()
    blocks.Addblock("seng one BTC to sary") //信息(数据)为seng one BTC to sary 添加到区块链中
    blocks.Addblock("send two ETH to wuman")//信息(数据)为send two ETH to wuman 添加到区块链中
    blocks.Addblock("send one ADA to zijian")//信息(数据)为send one ADA to zijian 添加到区块链中
    for _,v:=range blocks.blocks{                      //循环遍历打印一下看结果
        fmt.Println("=======================================")
        fmt.Printf("data=:%s\n",v.Data)
        fmt.Printf("prevhash:=%x\n",v.PreviousHash)
        fmt.Printf("hash:=%x\n",v.Hash)
    }
}

我们来看一下结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sgsgy5/article/details/82589844