工作量证明(Proof-of-Work,PoW)
是一种对应服务与资源滥用、或是阻断服务攻击的经济对策。
一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。
此一概念最早由Cynthia Dwork和Moni Naor于1993年的学术论文提出[1],而工作量证明一词则是在1999年由Markus Jakobsson与Ari Juels.[2]所发表。
现时此一技术成为了加密货币的主流共识机制之一,如比特币所采用的技术。
工作量证明最常用的技术原理是散列函数。
由于输入散列函数h()的任意值n,会对应到一个h(n)结果,而n只要变动一个比特,就会引起雪崩效应,
所以几乎无法从h(n)反推回n,因此借由指定查找h(n)的特征,让用户进行大量的穷举运算,就可以达成工作量证明。
我们若指定h(n)的16进制值的前四值,求n,这样统计上平均约要运行216次h(n)散列运算,才会得到答案,但验算只要进行一次就可以了。如果想要增加难度,那就增加指定的位数即可。
以SHA256函数举例,假设我们要处理数据Hello World
,并找出h(n)前四值为0000的n,如果从Hello World0
开始加上一个十进制数ASCII进行穷举猜测,到Hello World107105
时才会得到匹配条件的h(n):
0000BFE6AF4232F78B0C8EBA37A6BA6C17B9B8671473B0B82305880BE077EDD9
验算时只要将Hello World107105代入SHA256函数一次即可。
由于加密货币多由区块链所建构,而区块链本来就要依赖散列函数来做为数据正确无误的担保,所以在加密货币上使用工作量证明,是非常简明的设计。
由分散在各处的计算机,竞赛谁能最早找出,搭配原本要打包的数据的穷举猜测值(nonce),谁就等同获得该区块的打包权(记账权)。
此猜测值被找出后,与数据、散列值一起打包成块后广播,经多数节点确认与承认,打包者就能获得打包该区块所提供的奖励。
一般采用工作量证明的加密货币,好比比特币,会设置成随着参与竞赛的算力增减,而调整找寻猜测值的难度,以维持合理的运作速度。
工作量证明,Proof of Work,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问 题(来源于 hashcash)。
保证在一段时间内,系统中只能出现少数合法提案。
同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会基于它认为的最 长链上继续难题的计算。
因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为 最长的链。
hash 问题具有不可逆的特点,因此,目前除了暴力计算外,还没有有效的算法进行解决。
反 之,如果获得符合要求的 nonce,则说明在概率上是付出了对应的算力。
谁的算力多,谁最 先解决问题的概率就越大。
当掌握超过全网一半算力时,从概率上就能控制网络中链的走 向。这也是所谓 51% 攻击 的由来。
参与 PoW 计算比赛的人,将付出不小的经济成本(硬件、电力、维护等)。当没有成为首个 算出的“幸运儿”时,这些成本都将被沉没掉。
这也保障了,如果有人恶意破坏,需要付出大量 的经济成本。也有设计试图将后算出结果者的算力按照一定比例折合进下一轮比赛考虑。
有一个很直观的例子可以说明为何这种经济博弈模式会确保系统中最长链的唯一。
超市付款需要排成一队,可能有人不守规矩要插队。
超市管理员会检查队伍,认为最长的一 条队伍是合法的,并让不合法的分叉队伍重新排队。
只要大部分人不傻,就会自觉在最长的 队伍上排队。
然而,工作量证明算法需要让所有节点解决密码难题。这个难题被矿工所解决,率先完成的能够获得奖励。
这导致人们构建越来越大型的挖矿设备,比如这样。
根据Digiconomist,仅仅比特币矿工就要使用54太千瓦时的电力。这些电量足够支持美国5百万个家庭用电,甚至整个新西兰或匈牙利,但是这不仅止于此。
对于有更好更多设备的人群,工作量证明将给予更多的奖励。你的计算能力越高,就越有可能去创建下一个区块,从而获得矿工奖励。
为了进一步提高机会,矿工们一起组成了矿池(mining pools),他们结合各自的算力,把奖励平均分配给矿池中的每个人。
总而言之 工作量证明让矿工们需使用大量的能量,从而促进了矿池的产生。这让区块链变得更加中心化,而不是去中心化。
算力决定一切。主链的机制是最长的,所以算力强大就可以重新打包区块,就可以拿到所有区块的打包费用啊!