woodenwang 发表于 2018-10-28 13:19

【笔记】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

支持一下你 以后互相交流

woodenwang 发表于 2018-10-28 14:28

小小学生 发表于 2018-10-28 14:26
支持一下你 以后互相交流

哈哈哈,{:1_893:}

drawning 发表于 2018-10-28 14:32

学习一下

4561pkpk 发表于 2018-10-28 15:44

看看研究一下

woodenwang 发表于 2018-10-29 09:36

drawning 发表于 2018-10-28 14:32
学习一下

互相学习,资源共享呀{:1_918:}

woodenwang 发表于 2018-10-29 09:39

4561pkpk 发表于 2018-10-28 15:44
看看研究一下

一起研究吧,顺便把你的“存活”共享出来呀

woodenwang 发表于 2018-10-29 09:40

wangqiustc 发表于 2018-10-28 15:48
谢谢分享

一起学习呀,

Titanic 发表于 2018-10-29 10:42

go语言做区块链比较适合嘛?

woodenwang 发表于 2018-10-29 17:10

158563862 发表于 2018-10-29 10:42
go语言做区块链比较适合嘛?

貌似是大家比较推崇的
页: [1] 2
查看完整版本: 【笔记】go语言实现简单区块链