首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

200行代码就能写出区块链

从本质上看,区块链远没有你想象的那么难!

区块链的基本概念是非常简单的:一个维护不断增长的有序数据的分布式数据库。然而当我们讨论使用区块链解决具体问题的时候,很容易把他们混为一体,比如当前非常有名的比特币和以太坊,它们往往和交易、智能合约、加密货币等概念绑在一起。

这让理解区块链变成了非常困难的事情,但区块链本质上没有这么复杂。Lauri Hartikka 使用 200 行 js 代码实现一个简单的区块链,称为 NaiveChain

区块结构

第一个逻辑步骤就是定义区块结构。为了让这个区块链尽可能的简单,在这个区块链中只包含一些必需元素,包括:区块索引、时间戳、区块数据、当前区块 Hash、上一个区块的 Hash

区块Hash

区块 Hash 是为了保持区块数据的完整性,这里使用的是 SHA-256 算法。需要注意的是这里的 hash 和挖矿没有关系,因为这里没有工作量证明的问题需要解决。

生成区块

为了打包一个区块,除了知道上一个区块的 hash 值以外,还需要得到当前区块的索引、hash、数据以及当前的时间戳。区块数据有使用者提供。

存储区块

在这里使用 js 的数组将区块存储在内存中。第一个区块通过硬编码完成,通常被称为创始区块。

验证区块

任何时候要具备验证一个区块或者区块链完整性的能力。尤其在从其他节点接收到一个新区块之后,当前节点必需验证该接收区块的有效性以判断是否接受。

选择最长链

在任何一个时间点上,区块链应该是一个确定区块的集合。但是当区块存在冲突的时候(比如两个节点都生成了高度为 72 的区块),那么当前节点会选择最长链

节点通信

一个区块的必要模块就是同其他节点分享和同步区块链。为了保持区块链在网络中的同步,节点需要遵守以下规则:

当一个节点完成打包一个区块之后,要广播到网络

当一个节点连接到另一个节点之后,需要查询最新区块

当一个节点接收到一个大于当前区块索引的区块之后,需要将这个区块添加到当前区块之后,或者查询整个区块

这里没有节点发现的功能,需要手动添加节点地址

节点管理

通过搭建一个 Http 服务,用户可以管理当前节点

用户可以通过以下方式同节点进行交互:

获取区块列表

创建新区快

添加和查看节点

然而,管理节点的最直接方式就是通过 curl 命令:

架构

需要注意的是节点暴露了两个 web 服务器:一个用户管理当前节点,一个用于区块之间的 p2p 通信(Websocket HTTP server)

总结

这个区块链(NaiveChain)是为了演示和学习区块链。它不能在实践中的使用,因为他没有 PoS 或 PoW 挖矿算法,然而它实现了区块链的基本特性。你可以通过https://github.com/lhartikk/naivechain获取更多的技术细节。

你可以通过https://lhartikk.github.io/深入理解区块链,在那里你会获得关于工作量证明、交易、钱包等相关知识。

引用

https://medium.com/@lhartikk/a-blockchain-in-200-lines-of-code-963cc1cc0e54

本文由 翻译,转载无需授权。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180205G0CAJV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券