Github上有一个Repo,是一个使用Go语言(golang),不到200行代码写的区块链源代码,准确的说是174行。原作者起了个名字是 Code your own blockchain in less than 200 lines of Go! 而且作者也为此写了一篇文章。 https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc

这篇文章是一个大概的思路和代码的实现,当然还有很多代码的逻辑没有涉及,所以我就针对这不到200行的代码进行一个分析,包含原文章里没有涉及到的知识点,对Go语言,区块链都会有一个更深的认识。

在源代码的开头,是作者引入的一些包,有标准的,也有第三方的。像sha256,hex这些标准包是为了sha-256编码用的,其他还有启动http服务,打印日志的log,并发控制的sync,时间戳的time。

第三方包有三个,其中两个我都详细介绍过,相信大家不会陌生。

go-spew
gorilla/mux

不过目前用gin的比较多,也推荐使用gin https://github.com/gin-gonic/gin。

godotenv.env

TOML是我的最爱。关于Go工具包管理等知识可以参考我这篇 Go语言实战笔记(一)| Go包管理

struct
Block
  1. Index 就是Block的顺序索引
  2. Timestamp是生成Block的时间戳
  3. BPM,作者说代表心率,每分钟心跳数
  4. Hash是通过sha256生成的散列值,对整个Block数据的Hash
  5. PrevHash 上一个Block的Hash,这样区块才能连在一起构成区块链
Struct

有了区块Block了,那么区块链就非常好办了。

就是这么简单,一个Block数组就是一个区块链。区块链的构成关键在于Hash和PrevHash,通过他们一个个串联起来,就是一串Block,也就是区块链。因为相互之间通过Hash和PrevHash进行关联,所以整个链很难被篡改,链越长被篡改的成本越大,因为要把整个链全部改掉才能完成篡改的目的,这样的话,其他节点验证这次篡改肯定是不能通过的。

既然关键点在于Hash,所以我们要先算出来一个Block的数据的Hash,也就是对Block里的字段进行Hash,计算出一个唯一的Hash值。

sha256Blocksha256hex.EncodeToStringsha2568d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

Block的散列值被我们计算出来了,Block的Hash和PrevHash这两个字段搞定了,那么我们现在就可以生成一个区块了,因为其他几个字段都是可以自动生成的。

oldBlockBPM
IndexIndex+1Timestamptime.Now()calculateHash

在这里作者并没有使用POW(工作量证明)这类算法来生成区块,而是没有任何条件的,这里主要是为了模拟区块的生成,演示方便。

区块可以生成了,但是生成的区块是否可信,我们还得对他进行校验,不能随便生成一个区块。在比特币(BitCoin)中校验比较复杂,这里作者采用了简单模拟的方式。

IndexHashHash

到了这里,关于区块链的代码已经全部完成了,剩下的就是把区块链的生成、查看等包装成一个Web服务,可以通过API、浏览器访问查看。因为作者这里没有实现P2P网络,所以采用的是WEB服务的方式。

mux/Method
GEThandleGetBlockchain
Blockchain[]BlockhandleGetBlockchainBlockchainio.WriteStringWriter
handleWriteBlock
{"BPM":60}
Message
respondWithJSON

好了,快完成了,以上Web的Handler已经好了,现在我们要启动我们的Web服务了。

http.Servermain
mainrun
PrevHash
go run main.gohttp://localhost:8080
http://localhost:8080{"BPM":60}http://localhost:8080

到这里,整个源代码的分析已经完了,我们看下这个简易的区块链涉及到多少知识:

  1. sha256散列
  2. 字节到16进制转换
  3. 并发同步锁
  4. Web服务
  5. 配置文件
  6. 后向式链表
  7. 结构体
  8. JSON
  9. ……

等等,上面的很多知识,我已经在文章中讲解或者通过以前些的文章说明,大家可以看一下,详细了解。

区块链作为一个新的分布式数据存储技术,在追踪,信用,防篡改等方面肯定可以发挥更大的作用,当然这也是一个不错的机会,这里推荐几本不错的书籍,可以更好的了解和深入学习区块链。

flysnow_org