【笔记】go语言实现简单区块链
go实现简单区块链这个是根据大神们分享的视屏中学到的,go语言的学习也大部分从论坛中大神们分享的资源中学习的。以下便是我的学习笔记:https://static.52pojie.cn/static/image/hrline/5.gifhttps://static.52pojie.cn/static/image/hrline/5.gif
准备工作:
os:win 10
go语言安装(略)
go编辑器(我是用的是notepad,此处略)
go语言知识(各种搜索引擎都可搜索到)
基础知识:
一 区块
(一)定义一个区块
TimestampDataPrevBlocaHashHash
一个区块是由时间戳,存储数据(用户行为),前区块Hash(当前区块的位置),当前区块Hash(下一个区块的前区hash)
type Block status{
Timestamp int62 //时间戳,当前区块 创建的时间
Data []byte //当前区块 存放的信息 (加密货币的话,就是账单信息)
PrevBlocaHash []byte //上一个区块的加密Hash值
Hash []byte //当前区块的加密Hash 值
}
(二)给一个区块进行SHA256加密依赖Bytestrconvcrypto/sha256
我们给刚才的block绑定一个方法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 [:]
}
(三) 生成一个区块
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
}
源码在这里到此时了,我们可以验证一下 使用命令go run block.go(效果自行尝试)
二 打造区块链通过区块的定义,我们不难看出我们可以通过区块的前驱和后继形成链表配图(略,哈哈,想用表格画,可是两个表格不能在一行)
定义结构体:type BlockChain struct{
Blocks []*Block //有序的区块链
} (一)新建一个创始块,新建一个区块链创始块(无前驱)func NewGenesisBlock *Block{
genesisBlock:= Block{}
genesisBlock.Data = "Genesis Block"
gengsisBlock.PrevBlockHash = []byte{}
return &genesisBlock
}
//新建一个区块链
func NewBlockChain() *BlockChain {
return &BlockChain{[]*Blocks{NewGenesisBlock()}}
}
(二)添加一个区块到一个区块链中依赖: os 将区块添加到一个区块中:func (this *BlockChain) AddBlock(data string){
//1得到 新添加区块的 前驱区块
prevBlock :=this.Block
//2 根据 data 创建一个新的区块
newBlock := NewBlock(data, prevBlock)
//3 依照前驱区块和新区快 添加到区块链blocks 中
this.Block = append(this.Blocks, newBlock)
}
(三)生成demo主函数调用: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
}
}
}
以上,便可实现一个简单的区块链,源码及可执行文件在这里
dos下使用start blockchain.exe或者双击即可(演示请自行解决)
注: 添加区块:1(空格)信息(回车)查看区块:2(回车)退出系统:other(回车)
https://static.52pojie.cn/static/image/hrline/5.gifhttps://static.52pojie.cn/static/image/hrline/5.gif
还在学习,不足之处多批评指正,最后希望各位大神们还可以分享更多的资源学习交流,谢谢!
支持一下你 以后互相交流 小小学生 发表于 2018-10-28 14:26
支持一下你 以后互相交流
哈哈哈,{:1_893:} 学习一下 看看研究一下 drawning 发表于 2018-10-28 14:32
学习一下
互相学习,资源共享呀{:1_918:} 4561pkpk 发表于 2018-10-28 15:44
看看研究一下
一起研究吧,顺便把你的“存活”共享出来呀 wangqiustc 发表于 2018-10-28 15:48
谢谢分享
一起学习呀, go语言做区块链比较适合嘛? 158563862 发表于 2018-10-29 10:42
go语言做区块链比较适合嘛?
貌似是大家比较推崇的
页:
[1]
2