go实现简单区块链这个是根据大神们分享的视屏中学到的,go语言的学习也大部分从论坛中大神们分享的资源中学习的。以下便是我的学习笔记:
准备工作:
os:win 10
go语言安装(略)
go编辑器(我是用的是notepad,此处略)
go语言知识(各种搜索引擎都可搜索到)
基础知识:
一 区块
(一)定义一个区块
Timestamp | Data | PrevBlocaHash | Hash |
一个区块是由时间戳,存储数据(用户行为),前区块Hash(当前区块的位置),当前区块Hash(下一个区块的前区hash)
[Golang] 纯文本查看 复制代码 type Block status{
Timestamp int62 //时间戳,当前区块 创建的时间
Data []byte //当前区块 存放的信息 (加密货币的话,就是账单信息)
PrevBlocaHash []byte //上一个区块的 加密Hash值
Hash []byte //当前区块的 加密Hash 值
}
(二)给一个区块进行SHA256加密依赖Bytestrconvcrypto/sha256
我们给刚才的block绑定一个方法[Golang] 纯文本查看 复制代码 func ( this *Block) SetHash(){
//将本区快的时间戳和数据上一个区块的hash 进行加密
//将时间戳由整型转换为二进制
timestamp :=[]byte(strconv.FormatInt(this.Timestamp,10))
//将三个二进制的属性进行转换
headers :=bytes.Join([][]byte{this.PrevBlockHash,this.Data,timestamp},[]byte{})
//将拼接的headers进行SHA256加密
hash :=sha256.Sum256(headers)
this.Hash = hash [:]
}
(三) 生成一个区块
[Golang] 纯文本查看 复制代码 func NewBlock (data string,prevBlockHash []byte) *Block{
// 生成一个区块
block :=Block{}
//给当前区块 赋值(创建时间,data,前驱hash)
block.Timestamp = time.Now().Unix()
block.Data = []byte(data)
block.PrevBlockHash = prevBlockHash
//给当前区块进行hash加密
block.SetHash() //能够将本block 进行一个hash加密,将hash加密的结果放在block.Hash属性中
//将已经赋值好的区块 返回给外边
return &block
}
[fly]源码在这里
Block.rar
(1000 Bytes, 下载次数: 3)
[/fly]到此时了,我们可以验证一下 使用命令go run block.go(效果自行尝试)
二 打造区块链通过区块的定义,我们不难看出我们可以通过区块的前驱和后继形成链表配图(略,哈哈,想用表格画,可是两个表格不能在一行)
定义结构体:[Golang] 纯文本查看 复制代码 type BlockChain struct{
Blocks []*Block //有序的区块链
} (一)新建一个创始块,新建一个区块链创始块(无前驱)[Golang] 纯文本查看 复制代码 func NewGenesisBlock *Block{
genesisBlock := Block{}
genesisBlock.Data = "Genesis Block"
gengsisBlock.PrevBlockHash = []byte{}
return &genesisBlock
}
//新建一个区块链
func NewBlockChain() *BlockChain {
return &BlockChain{[]*Blocks{NewGenesisBlock()}}
}
(二)添加一个区块到一个区块链中依赖: os 将区块添加到一个区块中:[Golang] 纯文本查看 复制代码 func (this *BlockChain) AddBlock(data string){
//1得到 新添加区块的 前驱区块
prevBlock :=this.Block[len(this.Blocks)-1]
//2 根据 data 创建一个新的区块
newBlock := NewBlock(data, prevBlock)
//3 依照前驱区块和新区快 添加到区块链blocks 中
this.Block = append(this.Blocks, newBlock)
}
(三)生成demo主函数调用:[Golang] 纯文本查看 复制代码 func main(){
//创建一个区块链 bc
bc :=NewBlockChain()
//用户输入指令1,2,other
var cmd string
for{
fmt.Println("按 ‘1’添加一条信息数据 到区块链中")
fmt.Println("按 ‘2’遍历当前的区块链都有哪些区块信息")
fmt.Println("按 其他按键就是退出")
fmt.Scanf("%s",&cmd)
switch cmd{
case "1":
input :=make([]byte, 1024)
//t添加一个区块
fmt.Println("请输入区块链的行为数据(要添加保存的数据):")
os.Stdin.Read(input)
bc.AddBlock(string(input))
case "2":
//遍历整个区块链
for i,block := range bc.Blocks {
fmt.Println("========")
fmt.Println("第",i,"个 区块的信息:")
fmt.Println("PrevHash:%x\n",block.PrevBlockHash)
fmt.Println("Data:%s\n",block.Data)
fmt.Println("Hash:%s\n",block.Hash)
fmt.Println("========")
}
default:
//退出程序
fmt.Println("您已退出")
return
}
}
}
以上,便可实现一个简单的区块链,源码及可执行文件在这里
BlockChain.rar
(683.97 KB, 下载次数: 4)
dos下使用start blockchain.exe或者双击即可(演示请自行解决)
注: 添加区块:1(空格)信息(回车)查看区块:2(回车)退出系统:other(回车)
还在学习,不足之处多批评指正,最后希望各位大神们还可以分享更多的资源学习交流,谢谢!
|