通过上面的代码和注释可以对区块链有直观的了解,接下来我们看看区块是怎么挖出来的。
理解工作量证明
新的区块依赖工作量证明算法(PoW)来构造。PoW 的目标是找出一个符合特定条件的数字,这个数字很难计算出来,但容易验证。这就是工作量证明的核心思想。
为了方便理解,举个例子:
假设一个整数 x 乘以另一个整数 y 的积的 Hash 值必须以 0 结尾,即 hash(x * y) = ac23dc...0。设变量 x = 5,求 y 的值?
用 Python 实现如下:
结果是:y = 21,因为:
hash(5 * 21) = 1253e9373e...5e3600155e860
在比特币中,使用称为 Hashcash 的工作量证明算法,它和上面的问题很类似,矿工们为了争夺创建区块的权利而争相计算结果。
通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,会获得比特币奖励。当然,在网络上非常容易验证这个结果。
实现工作量证明
让我们来实现一个相似 PoW 算法,规则是:寻找一个数 p,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。
衡量算法复杂度的办法是修改零开头的个数。使用 4 个零来用于演示,你会发现多一个零都会大大增加计算出结果所需的时间。
现在 Blockchain 类基本已经完成了,接下来使用 HTTP requests 来进行交互。
Blockchain 作为 API 接口
我们将使用 Python Flask 框架,这是一个轻量 Web 应用框架,它方便将网络请求映射到 Python 函数,现在我们来让 Blockchain 运行在 Flask Web 上。
我们将创建三个接口:
/transactions/new 创建一个交易并添加到区块
/mine 告诉服务器去挖掘新的区块
/chain 返回整个区块链
创建节点
我们的“Flask 服务器”将扮演区块链网络中的一个节点,我们先添加一些框架代码: