什么是哈希现金(HashCash)

比特币使用哈希现金(hashcash和工作量证明(Proof_of_work)函数作为挖掘核心。无论是CPU,GPU,FPGA还是ASIC,所有比特币矿工都在努力创建哈希现金工作量证明,以证明区块链发展中的投票权并验证区块链交易日志。

像许多密码算法一样,hashcash使用哈希函数作为构建块,就像在可插拔哈希函数上定义HMAC或RSA签名一样(通常由算法哈希的命名约定表示:HMAC-SHA1,HMAC- MD5,HMAC-SHA256,RSA-SHA1等),hashcash可以使用不同的函数实例化,hashcash-SHA1(原始),hashcash-SHA256 ^ 2(比特币),hashcash-Scrypt(iter = 1)。

历史

Hashcash的工作量证明功能由Adam Back于1997年发明,并被提议用于反DoS用途,包括防止:匿名重寄邮件者和mail2news网关滥用,在nymserver上蹲下nym名称(可信任的假名remailer服务器)和普通电子邮件。反垃圾邮件和一般的网络滥用限制。在使用比特币之前,SpamAssasin使用hashcash,并且Microsoft(以“ email postmark”的名称)以不兼容的格式在hotmail,Exchange,Outlook等中使用哈希现金,并通过i2p匿名网络,mixmaster匿名转发器组件和其他系统使用。哈尔·芬尼(Hal Finney)的比特币前体RPOW 还使用Hashcash 来开采硬币。戴伟的B钱提案和尼克·萨博(Nick Szabo)在哈希现金挖掘的背景下,也提出了类似的Bit Gold建议比特币先驱。

哈希函数选择

在最初的1997年算法中,hashcash使用SHA1,因为那时这是defacto和NIST建议的哈希,而以前的defacto哈希MD5最近开始表现出弱点。在2008/2009年指定/发布的比特币使用SHA256。实际上,没有充分的理由说明SHA1也不会起作用,hashcash仅依赖于哈希部分原像抵抗特性(安全性最高为哈希大小,SHA1为160位),而不是生日碰撞强度(安全性最高为80位) ,因此SHA1哈希足够大。无论如何,比特币是为128位安全性而构建的,因为使用了256位ECDSA,它也提供128位安全性。从来没有少过的SHA256是正确且更保守的选择,因为即使SHA1也开始表现出一些弱点,尽管仅在生日碰撞中,而不是在第二张原图中。

密码分析风险

切换到hashcash-SHA3的一个实际问题是,它将使所有现有的ASIC挖掘硬件失效,因此,除非面临安全风险,否则将不太可能进行此更改。没有迹象表明SHA1或SHA256或SHA256 ^ 2容易受到映像前攻击,因此缺少新的密码分析技术,因此缺乏动机。另外,即使SHA256 ^ 2由于密码分析攻击而变得更容易,并且矿工开始使用新的算法方法,也不一定重要,因为困难只会适应它。但是,一个可能的副作用是,它将引入更多的内存或计算前的权衡,这可能会使ASIC失去利润,或者使拥有大量资源的人受益于进行计算前的工作。计算前的优势可能足以成为用SHA3替换哈希的动力。无论如何,如果在SHA256上找到任何影响密码分析攻击的前映像,这都是猜测。

哈希函数

hashcash算法相对容易理解。该思想建立在加密散列的安全属性上,即加密散列的设计目的是难以反转(所谓的单向或图像前抵抗属性)。您可以廉价地从x计算y y = H(x),但仅给定y很难找到x。完整的哈希反转具有已知的在计算上无法实现的蛮力运行时间,为O(2 ^ k),其中k是哈希大小,例如SHA256,k = 256,如果找到原图像,则任何人都可以通过以下方式非常有效地对其进行验证:计算一个哈希,因此在完整的映像前挖掘(计算上不可行)与验证(单个哈希调用)之间存在巨大的不对称性。

第二个哈希原像意味着给定哈希y的一个原像x,其中y = H(x),任务是找到哈希y的另一个原像:x',以便y = H(x')。这不能与生日碰撞混淆,后者是找到两个值x,x',使得H(x)= H(x'),这可以通过低得多的工作O(sqrt(2 ^ k))完成。 = O(2 ^(k / 2)),因为您可以通过计算许多H(x)值并将其存储直到找到匹配对来继续进行。它需要大量的内存,但是存在内存时间的折衷。

hashcash协议(1997)的版本0使用了部分第二个前映像,但是后来的版本1(2002)使用了相当选择的字符串的部分前映像,而不是pi的数字或任意的0 ^ k(即全部0字符串)是为了方便起见,因此工作是找到x使得H(x)= 0。这同样也很公平,只需要一次哈希调用即可验证,而第二次部分前映像则需要两次哈希调用。(此优化由Hal Finney提出,并由Thomas Boschloo独立提出)。为了简化工作,部分原像的定义是找到x使得H(x)/ 2 ^(nk)= 0其中/是除法运算的整数商,n是散列输出的大小(对于SHA256,n = 256位),并且k是工作因子,即哈希输出的前k位为0。因此,例如,k = 20需要平均一百万次尝试。

添加目的

如果来自y = H(x)的部分原像x是随机的,那只是毫无目的的断开工作量证明,每个人都可以看到您确实做了工作,但是他们不知道为什么,所以用户可以将相同的工作重用于不同的服务。为了使工作量证明绑定到服务或目的,哈希必须包含s(服务字符串),以便使工作成为H(s,c)/ 2 ^(nk)= 0。矿工改变计数器c,直到这是真的。服务字符串可以是Web服务器域名,收件人电子邮件地址,也可以是比特币中的比特币区块链分类帐的一部分。

另一个问题是,如果多个人正在使用相同的服务字符串进行挖掘,则他们不得以相同的x开头,否则可能会以相同的证明结尾,并且任何看着它的人​​都不会尊重同一作品的重复副本由于可以原本不用工作而被复制,因此首先提出的人将得到奖励,而其他人将发现他们的工作被拒绝。为了避免以这种方式浪费工作的风险,需要有一个随机的起点,因此工作变得容易找到H(s,x,c)/ 2 ^(nk)= 0,其中x是随机的(例如128位)使其在统计上无法让两个用户恶意或意外地从同一点启动),并且c是变化的计数器,而s是服务字符串。

这就是hashcash版本1和比特币的功能。实际上,在比特币中,服务字符串是coinbase,coinbase包括收件人的奖励地址以及在区块中进行验证的交易。比特币实际上不包括随机起点x,因此将奖励地址重新用作随机因子,以避免出于此随机起点目的而发生冲突,从而在币库中节省了16个字节的空间。对于隐私比特币,期望矿工在每个成功区块上使用不同的奖励地址。

更精确的工作

最初提出的Hashcash的工作为2 ^ k,其中k为整数,这意味着难度只能以2的幂进行缩放。这稍微简单一点,因为您可以看到并仅通过以十六进制/二进制数为0来完全测量难度,并且足够用于先前的用途。(许多hashcash设计选择是出于简单性的考虑)。

但是由于比特币需要更精确和动态的工作控制(以精确地定位10分钟的块间隔为目标),因此它将k更改为分数(浮点数),因此工作变得可以找到H(s,x,c)<2 ^(nk),如果k是整数,则等效。比特币将目标定义为target = 2 ^(nk),因此可以更简单地编写工作以找到H(s,x,c)<目标。当然,由于运气好,块时间实际上具有很高的方差,但是通过引入分数k仍然可以更准确地确定平均值。

工作,难度和密码安全

Hashcash用标准密码安全性术语O(2 ^ k)表示安全性余量,为了进行比较,DES提供k = 56位安全性,而ECDSA-256提供k = 128位安全性,并且由于其广泛使用的log2方式表达工作和安全性对于进行安全性比较也很有用。

比特币的工作速率称为以GH / sec 为单位的网络哈希率。由于目标区块间隔为10分钟,可以转换为log2(hashrate * 600),因此密码安全性为2013年11月,哈希率是4 petahash / sec,比特币的hashcash-256 ^ 2工作量证明是62位(包括+1代表双哈希)。

比特币还定义了(相对)难度的新概念,这是所需的工作,因此,在当前的网络哈希率下,预计每10分钟会发现一个块。它相对于2 ^ 32次迭代的最小工作单位表示(由于比特币实施级别的详细信息,技术上的最小工作量约为0xFFFF0000)。比特币难度很容易近似地转换为log2密码安全性:k = log2(difficulty)+32(或者对于高精度log2(difficulty * 0xFFFF0000))。难度与目标相关,只是难度=目标/ 0xFFFF0000。

处理log2规模的高难度(petahash /秒是每秒16个十进制数字的哈希数)可能更容易处理,并使它们与其他加密安全性语句可比。例如,EFF“ deepcrack” DES破解程序项目建造了一个硬件暴力破解机器,该机器能够在56小时内破解DES密钥,从而得出一个政治观点,即1998年56位DES太弱了,花费了250,000美元(加上志愿者设计时间) )。相比之下,比特币网络每10分钟执行一次62位(包括+1的双哈希),并且比deepcrack强大537,000倍,或者如果它专注于DES而不是SHA256,则可以在9秒内破解DES密钥到Deepcracks 56小时。

矿工隐私

因此,原则上,矿工出于隐私考虑,应为每个区块使用不同的奖励地址(并将计数器重置为0)。Satoshi的早期开采比特币之所以可能具有关联性,是因为当他更改奖励地址时,他忘记在每次成功开采之后重置计数器,这是比特币开采的隐私漏洞。实际上,使用比特币时,计数器也应该被遮盖,否则您会透露自己的努力水平,并且如果您具有大量挖掘能力,则可能暗示该代币属于谁。比特币通过随机数和随机数来做到这一点。随机数从0开始,但是额外的随机数是随机的。这些加在一起就形成了一个随机计数器,隐藏了证明工作量,因此没有人知道是努力工作的强大但不幸的矿工还是非常幸运的疲弱的矿工。

此外,随着矿池的引入,如果矿工为所有用户使用相同的奖励地址(当前的挖矿协议正在这样做),则存在用户可能重做工作的风险。为了避免用户重做工作,矿工向用户分发已定义的工作。但是,这会造成不必要的通信往返,并且在早期协议版本中,这可能是决定将池发送实际块给我的决定的一个因素,这意味着矿工没有验证自己的块,这委托了验证权限,尽管不起作用对池操作员而言,降低了比特币网络的安全性。较新的挖掘协议版本允许用户添加自己的块定义,但仍然不必要地往返进行工作分配。由于新的共享挖矿协议选择了一个矿工,因此它实际上是一个随机的开始因素,因此实际上无需与矿池进行工作分配,因此矿池可以具有静态的发布地址,矿工可以完成矿工的工作。他们选择的大小,然后将其作为UDP数据包提交到池中。(如果矿工需要私密性,则可以使用BIP 32中的公共派生方法,以允许节点通过加密消息告知矿工采矿工作,从而乘以静态公钥。)

加密工作量证明

谈论Scrypt的工作量证明是一种误解。Scrypt并非旨在用作工作量证明功能,而是扩展的密钥派生功能,尽管其设计使进行高迭代计算成本高昂,但不能用于制作有效的可公开审核的工作量证明,因为验证费用与创建相同。

具有Scrypt内部哈希函数的Hashcash可以表示为hashcash-Scrypt(1)。Colin Percival的Scrypt是一种密钥派生功能,用于将用户选择的密码短语转换为密钥。它被加盐(以防止进行预计算/彩虹表攻击),并且对哈希进行多次迭代,以减慢密码短语的打磨速度。Scrypt的用途类似于事实上的标准密码短语密钥派生功能PBKDF2(内部使用HMAC-SHA1)。人们与众不同的原因以及为什么选择Scrypt而不是PBDF2的原因在于Scrypt的内部哈希使用更多的内存,因此与CPU相比,密码(GPU)(或理论上的Scrypt ASIC / FPGA)在密码研磨方面的优势被削弱。

这没有使用Scrypt的密钥拉伸功能,因此挖掘实际上并没有直接使用Scrypt,而是仅使用内部Scrypt哈希(通过将迭代参数设置为一个迭代来访问)。因此,完全不使用Scrypt的密钥拉伸功能来提高硬度,不像它通常用于密钥保护那样,例如,从用户密码派生加密密钥来加密比特币钱包。无法将Scrypt的密钥拉伸用于挖掘的原因是,这同时使按相同因素进行验证更加昂贵。此hashcash变体可以表示为hashcash-Scrypt(iter = 1,mem = 128KB)或简称为hashcash-Scrypt(1)。另一个主要的scrypt参数表示使用的内存量(通常为128kB)。

去中心化:hashcash-Scrypt与hashcash-SHA256

128kB Scrypt的内存占用空间可以说不那么容易受到用户对ASIC设备的有限访问或所有权而导致的集中采矿能力的影响。这是有争议的,而且不清楚,因为存在相反的论点:hashcash-SHA256 ^ 2非常简单,因此有个人储蓄或熟练的Kickstarter项目的熟练人员可以设计并与芯片制造商联系。这种简单性确保了许多人可以做到这一点,并且应该可以使用ASIC。相反,与之相比,制造hashcash-Scrypt(1)ASIC则要困难一些,因此,如果资金充裕的商业实体通过更快,但专有而不是专有技术垄断市场,那么在中期看来,集权化实际上会更糟。 hashcash-Scrypt(1)ASIC可以在市场上买到,从而使scrypt GPU挖掘无利可图。

还要注意的一个缓解因素是,与hashcash-SHA256 ^ 2相比,hashcash-Scrypt(1)被认为比ASIC实现的GPU提速要低。之所以这样声明,是因为有一个论点,即认为128kB RAM占用的裸片区域必须专用于每个Scrypt(1)内核,这样会减少每个芯片可容纳的Scrypt(1)内核的数量。但是请注意,Scrypt(1)实际上并不是安全的存储硬体,因为它没有尝试防止时间-内存折衷,因此实际上可以重复内部回合的计算以减少内存需求。因此,从理论上讲,用最少的内存来实现Scrypt(iter = 1,mem = 128kB)可能需要花费更多的计算,但是要花更多的工作。

Hashcash-Scrypt(1)相对于hashcash-SHA256 ^ 2也有一个缺点,那就是验证速度要慢得多,因为一次Scrypt(mem = 128kB)迭代的验证成本远远高于两个SHA256哈希。这使得验证scrypt区块链对于所有完整节点的CPU和内存消耗都更大。但是请注意,验证的主要CPU工作是验证块中多个事务的每个事务ECDSA签名。即使是一个ECDSA签名也比每个块执行一次的Scrypt(1)验证要慢,并且在一个块中要验证的事务很多(因此还有ECDSA签名验证)。

本文链接地址:https://www.wwsww.cn/btbkuangye/1700.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读