工作量证明(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):
由于加密货币多由
区块链所建构,而区块链本来就要依赖散列函数来做为数据正确无误的担保,所以在加密货币上使用工作量证明,是非常简明的设计。由分散在各处的
计算机,竞赛谁能最早找出,搭配原本要打包的数据的穷举猜测值(nonce),谁就等同获得该区块的打包权(记账权)。此猜测值被找出后,与数据、散列值一起打包成块后广播,经多数节点确认与承认,打包者就能获得打包该区块所提供的奖励。一般采用工作量证明的加密货币,好比比特币,会设置成随着参与竞赛的算力增减,而调整找寻猜测值的难度,以维持合理的运作速度。
由于加密货币在世界上已成为一种投资标的,所以有技术者或富有者,可以开发出由
ASIC组成的特制计算机,垄断算力。这与加密货币的去中心化思想背道而驰。
也因此,后期开发的加密货币有针对抗ASIC的算法设计,例如
以太坊采用的
有向无环图(DAG)技术。