吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4488|回复: 11
收起左侧

[其他原创] 【笔记】go语言实现简单区块链

[复制链接]
woodenwang 发表于 2018-10-28 13:19
go实现简单区块链这个是根据大神们分享的视屏中学到的,go语言的学习也大部分从论坛中大神们分享的资源中学习的。以下便是我的学习笔记:





准备工作:
os:win 10
go语言安装(略)
go编辑器(我是用的是notepad,此处略)
go语言知识(各种搜索引擎都可搜索到)

基础知识:
一 区块
(一)定义一个区块
TimestampDataPrevBlocaHashHash



一个区块是由时间戳,存储数据(用户行为),前区块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(回车)


还在学习,不足之处多批评指正,最后希望各位大神们还可以分享更多的资源学习交流,谢谢!


   






免费评分

参与人数 3吾爱币 +5 热心值 +3 收起 理由
sadlybox + 1 + 1 谢谢@Thanks!
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
553429363 + 1 + 1 啥也不说了 给分

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

小小学生 发表于 2018-10-28 14:26
支持一下你 以后互相交流
 楼主| woodenwang 发表于 2018-10-28 14:28
drawning 发表于 2018-10-28 14:32
4561pkpk 发表于 2018-10-28 15:44
看看研究一下
 楼主| woodenwang 发表于 2018-10-29 09:36

互相学习,资源共享呀
 楼主| woodenwang 发表于 2018-10-29 09:39

一起研究吧,顺便把你的“存活”共享出来呀
 楼主| woodenwang 发表于 2018-10-29 09:40

一起学习呀,
Titanic 发表于 2018-10-29 10:42
go语言做区块链比较适合嘛?
 楼主| woodenwang 发表于 2018-10-29 17:10
158563862 发表于 2018-10-29 10:42
go语言做区块链比较适合嘛?

貌似是大家比较推崇的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 21:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表