区块链
首发于区块链
区块链之工作量证明,挖矿是什么?

区块链之工作量证明,挖矿是什么?

起源

区块链中有一个很重要的概念,工作量证明,矿工挖矿如何挖出一个新的区块,靠的就是工作量证明。

工作量证明(POW)从字面意思就知道,就是证明一个人干了这份活,得到大家认可之后,产生一个新区块,然后给干这份工作的人一定的比特币作为报酬。

工作量证明一开始被提出是用于解决诸如垃圾邮件问题,使用工作证明作为发送电子邮件的善意标志,至于工作量证明能不能解决垃圾邮件问题有待商榷,但是工作量证明在区块链中保证了区块链的安全。

了解工作量证明之前,我们先看一个哈希函数。

哈希函数

哈希函数(Hash Function),也称为散列函数,给定一个输入x,它会算出相应的输出H(x)。哈希函数的主要特征是:

  1. 输入x可以是任意长度的字符串
  2. 输出结果即H(x)的长度是固定的,比特币采用的是SHA256
  3. 输入输出是不可逆的,通过输入x能到到H(x),但是知道输出H(x)无法计算得出输入是x
  4. 对于长度为n的字符串x,计算出H(x)的时间复杂度应为O(n),即字符串越长,则计算时间越久。

对于比特币加密系统使用的hash函数,需要具备以下几点要求:

  1. 免碰撞,即避免输入两个不同的数,得到一个相同的输出。

这一点是无法避免的,就拿比特币使用的SHA256算法,有2^256种输出,如果我们进行2^256+1次输入,那么必然会产生一次碰撞;甚至从概率的角度看,进行2^130次输入就会有99%的可能发生一次碰撞。但是2^256是非常大的,发现碰撞的几率也是极其小的,几乎不太可能存在碰撞的可能性。

2. 隐匿性,也就是说,对于一个给定的输出结果H(x),想要逆推出输入x,在计算上是不可能的。

工作量证明的基本原理

有两类证明工作协议。(略枯燥,可简单浏览)

  • Challenge-response协议假设请求者(客户端)和提供者(服务器)之间相互连接。请求者发起一个请求,提供者选择一个挑战,请求者为了这个挑战进行工作,这个响应被提供者发回并检查。由于挑战是由供应商当场选择的,其难度可以适当调整。请求者完成这份工作后,将自己的工作量的成果提交到服务端进行验证,通过则开始下面的工作。



  • Solution-verification协议不会假定这样的链接:因此,在请求者寻求解决方案之前,必须自行解决问题,并且提供者必须检查问题选择和找到的解决方案。大多数这样的方案是无限的概率迭代过程。


是不是比较难懂,我们举一个例子,因为比特币采用的工作证明是第二种,所以我们举一个Solution-verification协议的例子。【重点理解这个例子

给定的一个基本的字符串"Hello, world!",我们给出的工作量要求是

可以在这个字符串后面添加一个整数值(在比特币中为nonce的标记),对变更后的字符串进行SHA256哈希运算,如果得到的哈希结果(以16进制的形式表示)是以"0000"开头的,则验证通过。为了达到这个工作量证明的目标。我们需要不停的递增值,对得到的新字符串进行SHA256哈希运算。按照这个规则,我们预计需要经过4251次计算才能找到恰好前4位为0的哈希散列。

"Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
"Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
"Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
...
"Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
"Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
"Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

注意观察前几位

在这个例子中,数学期望的计算次数,就是我们要求的“工作量”,重复多次进行的工作量证明会是一个符合统计学规律的概率事件。

比特币的工作量证明

比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链

关键的三个要素是工作量证明函数区块及难度值。工作量证明函数是计算方法,区块决定了输入数据,难度值决定了所需要的计算量。

  1. 工作量证明函数

用的SHA256

2. 区块

比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间缀(当前时间)、4字节的当前难度值、4字节的随机数组成。将整个80字节的区块作为输入

区块的大致结构如图所示:

第二行就是能证明工作量的hash值.

第六行是nonce就是计算的次数,越高则证明难度越大

3. 难度值

难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。

比特币的区块大约每10分钟生成一个,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。

每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。

这个公式可以总结为如下形式:

新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )

工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:

目标值 = 最大目标值 / 难度值

其中最大目标值为一个恒定值:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。

我们也可以简单理解成,比特币工作量证明的过程,就是通过不停的变换区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。

现在你该知道什么叫做挖矿了吧,干的也是体力活,就是不停的算hash值,创造新的区块。

欢迎关注专栏,了解更多区块链相关的知识。

本篇文章参考:

Editing Proof-of-work system

Editing Proof-of-work systemen.wikipedia.org

Editing Proof-of-work system

cs.unc.edu/~reiter/pape

编辑于 2018-01-20

文章被以下专栏收录