技术原理
工作量证明(Proof-of-Work,简称PoW)是一种共识算法。涉及两个角色:证明者(the prover)和 验证者(the verifiers)。其中,证明者需要付出巨大的成本来得到结果,而验证者只需要很小的成本就可验证结果。
监督一项工作的过程是非常低效的,但是验证一个工作的结果却是非常高效的。举个例子,学历证书是一种工作量证明。学生需要耗费十几年的时间寒窗苦读、参加一次次的考试,最终才能获得学历证书。而用人单位不需要跟踪学生十几年的学习过程,只需要查看最终的学历证书,就能用很低的成本判断学生的大概水平。
工作量证明算法,核心思想是通过计算工作量来证明某个操作的有效性。一个优秀的PoW算法需要满足以下几个条件:
- 难计算:对证明者,只能耗费大量的计算资源和时间,才能得出证明,在数学上没有捷径。
- 易验证:对于验证者,仅需耗费极少的计算资源,就能快速验证有效性。
- 随机性:防止攻击者通过预先计算的方式,提前得出证明。
- 难度可调:通过调整难度系数,可以控制工作量的大小,从而控制操作的频率。
算法之一:SHA
SHA(Secure Hash Algorithm)是一系列密码散列函数的集合。输入一段内容,通过SHA算法,可以得到一个固定长度的哈希值。
这是一个最简单的使用示例:首先,验证者随机生成一个哈希值。然后将这个哈希值给到证明者,要求证明者找到一个特定的随机数,使得计算出的哈希值与给出的哈希值最后N位完全一致。由于SHA算法的单向性和抗碰撞性,证明者只有耗费大量的计算资源不断尝试,才能找到这个特定的随机数。当证明者通过不断尝试找到这个随机数后,验证者将这个随机数给回验证者。验证者只需要对这个随机数进行一次SHA计算,就能快速验证结果是否有效。
在上述例子中,验证者只需计算一次SHA,而证明者需要计算许多次,证明者的工作量比验证者大得多。通过修改最后N位的长度,可以调整工作量的大小。N越大,工作量越大,反之亦然。这样,就可以根据实际情况,调整工作量的大小,从而控制操作的频率。在此基础上,在随机数上加上一个时间戳或者其他随机内容,可以防止攻击者通过预先计算的方式,提前得出证明。
算法之二:SCRPYT
SCRYPT是一种基于密码学的密钥派生函数。SCRYPT算法计算过程,依赖大量的伪随机数序列,这个随机数序列会被用在后续的key生成过程中,所以一般来说需要一个RAM来进行存储。比起SHA算法,SCRYPT算法特点是内存消耗量大,计算量小。
使用SCRYPT算法来作为工作量证明,流程与散列函数差不多。SCRYPT的入参,还有三个非常重要的参数:
- CostFactor(N): CPU/内存的消耗成本,必须是2的指数。通过此值来调整整体难度。
- BlockSizeFactor(r): 块大小。通过此值会来调整内存和带宽的消耗。
- ParallelizationFactor(p): 可以并行执行的内部块的数量。
算法组合
选择某种算法来作为工作量证明时,要特别注意算法的安全性。比如,MD5算法由于其碰撞性,已经不再适合作为工作量证明的算法。随着数学的进步、计算资源的提升,原本安全的算法可能会变得不再安全。
为了在安全性上更有保障,有人就提出了算法组合的概念,使用多个不同的算法组合在一起。这样,即使其中一个算法被攻破,其他算法仍然能保证整体的安全性。常用的组合方式有两种:串联和并联。
串联组合,对输入数据依次使用多个算法,前一轮运算结果作为后一轮运算的输入。看似安全了很多倍,但因为链条效应,一旦其中一个算法被攻破,攻击者可以伪造该哈希函数的输出,从而影响后续所有哈希函数的输入。就好像一条环环相扣的铁链,其中一环断了,整个链条就一分为二了,只有剩下的那一半链条是安全的。
并联组合,对输入数据同时使用多个算法,然后将多个算法的结果合并在一起。比串联组合要更安全一些,即便其中一个算法被攻破,也不会影响到其他算法的结果。就好像一条铁链被分成了几段,其中一段断了,其他段仍然是完整的。
常见应用之一:加密货币
PoW是加密货币的基础之一。在区块链中,矿工计算工作量证明来生成新的区块,并获得一定数量的加密货币作为奖励。同时,只有完成工作量证明的矿工才能将新的区块添加到区块链中,从而防止恶意节点篡改数据。
不同的加密货币使用不同的PoW算法。比如,比特币使用 SHA-256,狗狗币、莱特币使用 SCRYPT,以太坊使用 ETHASH。
常见应用之二:防暴力破解
工作量证明还可以用于防止暴力破解。
举例,网站登录功能,可以让每次提交登录请求的时候,都进行一次工作量证明,并把工作量证明的难度设计在几秒内完成。对于服务器来说,验证成本很低;对于普通用户来说,完成一次工作量证明也能接受。但对于攻击者来说,每次尝试都需要进行一次工作量证明,这样就大大增加了暴力破解的成本。
一些网站登录功能,需要用户输入验证码。以往验证码是用作图灵测试,但在AI技术的发展下,机器现在也能识别很多验证码了。这时候,验证码最大的作用就是用来区分人类和机器,而是作为工作量证明,来防止暴力破解。
参考文献
- https://en.wikipedia.org/wiki/Proof_of_work
- https://en.wikipedia.org/wiki/Scrypt
- https://en.wikipedia.org/wiki/List_of_cryptocurrencies
本文未经许可禁止转载,如需转载关注微信公众号【工程师加一】并留言。