300行 Golang 实现区块链

作者 疯魔慕薇

0x1 开篇

  区块链,时下最火的技术。前段时间一篇《A blockchain in 200 lines of code》更是在技术圈里刷屏。在读过 Lauri Hartikka 写的这篇文章和代码后,我愈发对区块链兴趣浓厚。
  纸上得来终觉浅,要深入了解一门技术,终究是需要自己造一次轮子。于是,我着手用 Go 语言仿造着实现了一个 naivechain

0x2 区块数据结构

  和 Lauri Hartikka 一样,数据结构上我们一切从简,只使用 IndexPreviousHashTimestampDataHash 这几个必要的字段。

300行 Golang 实现区块链_第1张图片


0x3 区块哈希

  区块哈希用于验证区块数据的完整性,使用 SHA-256 算法生成Index, PreviousHashTimestamp, Data 拼接字符串的摘要。

300行 Golang 实现区块链_第2张图片


0x4 创建新区块

  为了生成新区块,我们需要知道前区块和新区块的必要数据(IndexHashTimestamp, Data);区块数据由终端用户提供。

300行 Golang 实现区块链_第3张图片


0x5 创世块

  区块链的第一个区块被称之为创世块,被硬编码在程序内。

300行 Golang 实现区块链_第4张图片


0x6 区块存储

  这里使用 Go 语言的 Slice 存储区块。区块链是有序 List,为了保证有序性,需要对内存中保存区块的数组进行排序。定义按 Index 排序的结构体 ByIndex,并实现 sort.Interface

300行 Golang 实现区块链_第5张图片


0x7 区块完整性验证

300行 Golang 实现区块链_第6张图片


0x8 节点通讯

  每个节点在启动时监听一个端口(由 -p2p 参数指定),使用 websocket 协议和其它节点通讯。

0x9 节点控制

  没个节点在启动时监听一个端口(由 -api 参数指定),接收 HTTP 协议的 JSON 控制命令。使用示例:

  • 查看区块

    1

    curl http://localhost:3001/blocks

  • 创建区块

    1

    curl -H "Content-type:application/json" --data '{"data" : "Some data to the first block"}' http://localhost:3001/mine_block

  • 添加节点

    1

    curl -H "Content-type:application/json" --data '{"peer" : "ws://localhost:6002"}' http://localhost:3001/add_peer

  • 查看节点

    1

    curl http://localhost:3001/peers


0xA 结语

  这是一个最简单的区块链实现,用于学习区块链的工作原理,因为没用实现工作量证明这一类的挖矿算法,不适宜在公共网络使用。更多的细节请访问 Github: https://github.com/kofj/naivechain。

你可能感兴趣的:(区块链,golang)