300行 Golang 实现区块链

作者 疯魔慕薇

0x1 开篇

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

0x2 区块数据结构

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


0x3 区块哈希

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


0x4 创建新区块

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


0x5 创世块

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


0x6 区块存储

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


0x7 区块完整性验证


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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值