从本质上看,区块链远没有你想象的那么难!
区块链的基本概念是非常简单的:一个维护不断增长的有序数据的分布式数据库。然而当我们讨论使用区块链解决具体问题的时候,很容易把他们混为一体,比如当前非常有名的比特币和以太坊,它们往往和交易、智能合约、加密货币等概念绑在一起。
这让理解区块链变成了非常困难的事情,但区块链本质上没有这么复杂。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
本文由 翻译,转载无需授权。
领取专属 10元无门槛券
私享最新 技术干货