了解区块链是如何工作的最快的方法是构建一个。
-- Daniel Van Flymen
致谢
编译自 |
https://hackernoon.com/learn-blockchains-by-building-one-117428612f46
作者 | Daniel Van Flymen
译者 | qhwdw 共计翻译:140篇 贡献时间:270 天
了解区块链是如何工作的最快的方法是构建一个。
你看到这篇文章是因为和我一样,对加密货币的大热而感到兴奋。并且想知道区块链是如何工作的 —— 它们背后的技术基础是什么。
但是理解区块链并不容易 —— 至少对我来说是这样。我徜徉在各种难懂的视频中,并且因为示例太少而陷入深深的挫败感中。
我喜欢在实践中学习。这会使得我在代码层面上处理主要问题,从而可以让我坚持到底。如果你也是这么做的,在本指南结束的时候,你将拥有一个功能正常的区块链,并且实实在在地理解了它的工作原理。
开始之前 …
记住,区块链是一个不可更改的、有序的记录(被称为区块)的链。它们可以包括交易transaction、文件或者任何你希望的真实数据。最重要的是它们是通过使用哈希链接到一起的。
如果你不知道哈希是什么,这里有解释
[1]
。
本指南的目标读者是谁?你应该能轻松地读、写一些基本的 Python 代码,并能够理解 HTTP 请求是如何工作的,因为我们讨论的区块链将基于 HTTP。
我需要做什么?确保安装了Python 3.6
[2]
+(以及 ),还需要去安装 Flask 和非常好用的 Requests 库:
当然,你也需要一个 HTTP 客户端,像Postman
[3]
或者 cURL。哪个都行。
最终的代码在哪里可以找到?源代码在这里
[4]
。
第 1 步:构建一个区块链
打开你喜欢的文本编辑器或者 IDE,我个人喜欢PyCharm
[5]
。创建一个名为 的新文件。我将仅使用一个文件,如果你看晕了,可以去参考源代码
[4]
。
描述一个区块链
我们将创建一个 类,它的构造函数将去初始化一个空列表(去存储我们的区块链),以及另一个列表去保存交易。下面是我们的类规划:
我们的 Blockchain 类的原型
我们的 类负责管理链。它将存储交易并且有一些为链中增加新区块的辅助性质的方法。现在我们开始去充实一些类的方法。
区块是什么样子的?
每个区块有一个索引、一个时间戳(Unix 时间)、一个交易的列表、一个证明(后面会详细解释)、以及前一个区块的哈希。
单个区块的示例应该是下面的样子:
我们的区块链中的块示例
此刻,链的概念应该非常明显 —— 每个新区块包含它自身的信息和前一个区域的哈希。这一点非常重要,因为这就是区块链不可更改的原因:如果攻击者修改了一个早期的区块,那么所有的后续区块将包含错误的哈希。
这样做有意义吗?如果没有,就让时间来埋葬它吧 —— 这就是区块链背后的核心思想。
添加交易到一个区块
我们将需要一种区块中添加交易的方式。我们的 就是做这个的,它非常简单明了:
在 运行后将在列表中添加一个交易,它返回添加交易后的那个区块的索引 —— 那个区块接下来将被挖矿。提交交易的用户后面会用到这些。
创建新区块
当我们的 被实例化后,我们需要一个创世区块(一个没有祖先的区块)来播种它。我们也需要去添加一些 “证明” 到创世区块,它是挖矿(工作量证明 PoW)的成果。我们在后面将讨论更多挖矿的内容。
除了在我们的构造函数中创建创世区块之外,我们还需要写一些方法,如 、 以及 :
上面的内容简单明了 —— 我添加了一些注释和文档字符串,以使代码清晰可读。到此为止,表示我们的区块链基本上要完成了。但是,你肯定想知道新区块是如何被创建、打造或者挖矿的。
理解工作量证明
工作量证明Proof of Work(PoW)算法是在区块链上创建或者挖出新区块的方法。PoW 的目标是去撞出一个能够解决问题的数字。这个数字必须满足“找到它很困难但是验证它很容易”的条件 —— 网络上的任何人都可以计算它。这就是 PoW 背后的核心思想。
我们来看一个非常简单的示例来帮助你了解它。
我们来解决一个问题,一些整数 乘以另外一个整数 的结果的哈希值必须以 结束。因此,。为简单起见,我们先把 固定下来。在 Python 中的实现如下:
在这里的答案是 。因为它产生的哈希值是以 0 结尾的:
在比特币中,工作量证明算法被称之为Hashcash
[6]
。与我们上面的例子没有太大的差别。这就是矿工们进行竞赛以决定谁来创建新块的算法。一般来说,其难度取决于在一个字符串中所查找的字符数量。然后矿工会因其做出的求解而得到奖励的币——在一个交易当中。
网络上的任何人都可以很容易地去核验它的答案。
实现基本的 PoW
为我们的区块链来实现一个简单的算法。我们的规则与上面的示例类似:
找出一个数字 ,它与前一个区块的答案进行哈希运算得到一个哈希值,这个哈希值的前四位必须是由 组成。
为了调整算法的难度,我们可以修改前导 0 的数量。但是 4 个零已经足够难了。你会发现,将前导 0 的数量每增加一,那么找到正确答案所需要的时间难度将大幅增加。
我们的类基本完成了,现在我们开始去使用 HTTP 请求与它交互。
第 2 步:以 API 方式去访问我们的区块链
我们将使用 Python Flask 框架。它是个微框架,使用它去做端点到 Python 函数的映射很容易。这样我们可以使用 HTTP 请求基于 web 来与我们的区块链对话。
我们将创建三个方法:
◈ 在一个区块上创建一个新交易
◈ 告诉我们的服务器去挖矿一个新区块
◈ 返回完整的区块链
配置 Flask
我们的 “服务器” 将在我们的区块链网络中产生一个单个的节点。我们来创建一些样板代码:
对上面的代码,我们做添加一些详细的解释:
领取专属 10元无门槛券
私享最新 技术干货