作者 疯魔慕薇

0x1 开篇

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

0x2 区块数据结构

IndexPreviousHashTimestampDataHash


0x3 区块哈希

区块哈希用于验证区块数据的完整性,使用 SHA-256 算法生成Index, PreviousHash,Timestamp, Data 拼接字符串的摘要。区块哈希区块数据IndexPreviousHashTimestampData
0x4 创建新区块
  为了生成新区块,我们需要知道前区块和新区块的必要数据(Index,Hash,Timestamp, Data);区块数据由终端用户提供。前区块IndexHashTimestampData区块数据
0x5 创世块
  区块链的第一个区块被称之为创世块,被硬编码在程序内。创世块
0x6 区块存储
  这里使用 Go 语言的 Slice 存储区块。区块链是有序 List,为了保证有序性,需要对内存中保存区块的数组进行排序。定义按 Index 排序的结构体 ByIndex,并实现 sort.Interface:IndexByIndexsort.Interface
0x7 区块完整性验证
0x8 节点通讯
  每个节点在启动时监听一个端口(由 -p2p 参数指定),使用 websocket 协议和其它节点通讯。-p2p
0x9 节点控制
  没个节点在启动时监听一个端口(由 -api 参数指定),接收 HTTP 协议的 JSON 控制命令。使用示例:-api

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。