一条简单区块链的实现

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

思路分析:

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

第一步实现

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

第二步实现

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

第三步实现

1
2
3
4
5
6
7
8
9
10
11
12
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
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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)
}
}

我们来看一下结果:

-------------本文结束感谢您的阅读-------------

本文标题:一条简单区块链的实现

文章作者:Wuman

发布时间:2018年09月02日 - 10:09

最后更新:2018年09月02日 - 18:09

原始链接:http://yoursite.com/2018/09/02/一条简单区块链的实现/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。