比特币如何运作:哈希

散列函数是一种只能在一个方向上计算的函数 – 这种奇异的流量使得区块链世界既清晰又安全。

这意味着如果我们给函数输入,我们可以计算输出,但是给定输出,没有可能的方法向后工作并找出输入。(从这个意义上说,就像从私钥获取公钥一样。)

我们不会深入研究这背后的数学或它现在如何运作。所有必要的是你了解它的作用。再一次,只要把它想象成魔术,即使它是数学。

此外,我们可以选择我们想要散列函数输出的范围。例如,我们可以使用0到9之间的所有数字(所以只有单个数字),0到99,0到100万,甚至是0到894之间的任意数字。

推荐阅读
1的8,531

为了说明这是如何工作的,让我们假设我们的哈希函数的范围是0到9.我们放入的任何东西都会给出一个这样的数字:如果我们给它一个表情符号,它可能会给我们一个5.如果我们输入7859它可能会回复3.如果我们输入Moby Dick的整个文本,它可能会给我们7号。

0jEBLzvSdeSaMaIka

简化的哈希过程

它总会给我们一个数字 – 但我们不知道为什么

现在想象一下,我们用Moby Dick的整个文本提供它,但添加了一个额外的单词。你可能会认为,由于这个输入与我们输入的最后一个输入非常相似,它返回了数字7,这个输入很可能也会返回7 – 但你会错的。

尽管输入非常相似,但这里输出中没有可预测的相关性。绝对的不知情云是阻止黑客攻击的原因 – 知道输出告诉你输入可能是什么。

在加密货币之外,散列函数用于在中心化Web服务器上存储加密货币。但网络数据库经常被黑客攻击,如果黑客能够在成功破解之后只读取每个人的加密货币,这对用户来说就是坏消息。

为了使用户更安全,几乎所有现代网站都会在将用户加密货币存储到数据库之前对其进行哈希处理。因此,黑客无法通过读取数据库来弄清楚用户的加密货币是什么,因为这意味着从输出到输入哈希函数 – 这是一个无法向后设计的极其复杂的代码,这意味着什么黑客读取看起来就像一堆随机数。

但是,每次用户登录时,服务器都可以正确验证他们是否提供了真正的加密货币 – 服务器获取确切的加密货币并再次哈希,并看到它与存储在数据库中的已经散列的结果相匹配。

通过这种方式,加密货币本身就是关键 – 但获取“哈希”加密货币对于黑客来说是无用的,因为它无法倒退。

哈希猜测游戏

在比特币上,我们选择奖励向矿机发布块的权利,矿机可以通过哈希函数运行他们提出的块,并使输出为某个范围内的数字。

然后矿机必须以有序,格式化的方式格式化他们发布的数据 – 但是有一个地方允许他们放置少量无用的垃圾数据(称为“nonce。”)这就像我们是举办一场比赛,我们告诉人们将一两个gobbledegook随机词添加到Moby Dick的文本中并通过哈希函数运行它以尝试将其输出与某个特定的幻数相匹配。

基本上,我们正在尝试反向 – 给定哈希输出,矿机需要找到适当的输入。

可是等等这不可能吗?

排序:不可能的是以某种方式使用方法来推断输出的输入。什么可能是随机猜测它。

让我们回到我们的哈希函数示例,该函数吐出0到9之间的数字。想象一下,我们正在玩一个Moby Dick Hashing Challenge,如果你用几句废话哈希编辑Moby Dick,你可以获得奖励。这将是非常容易的,因为有人从任何给定输入获得3的机会是10分中的1分。他们只需要尝试平均五个不同的输入来赢得奖金。

尽可能快地将MacBook上的标准CPU插入到每秒哈希函数的88,000个猜测中,因此它实际上只需要一小部分时间就可以获得答案。

比方说,如果有五十人全部使用MacBook来参加这项挑战,并且你希望比赛持续大约一个小时,你可以将88,000乘以60秒乘以60分钟,以获得一个小时内可以做的猜测次数,然后乘以50乘以播放的人数。

因此,你的哈希函数必须具有更大的范围:从0到(88000 * 60 * 60 * 50),范围从0到15840000000。

要获得奖励,你必须猜对了。

请注意,比特币使用非常大的数字作为散列函数的范围,因此对于所有玩家来说,运行这个猜谜游戏仍需要平均十分钟 – 即使玩家增长。一旦有人赢了比赛,他们写的新区块就被认为是“已发布”。

随着越来越多的电力投入到挖矿中,比特币网络与它一起进行校准,并根据计算先前块的时间长度动态地提高每个块的“难度”。通过这样做,我们显然并不是说中心化来源决定这一点并告诉其他人该怎么做。相反,每个矿机都在自己计算它。

比特币越有价值,人们越想要它,范围越大 – 确保“游戏”保持平等和宽广,即使更多的玩家加入。

现在,比特币实际上并没有调整散列函数的范围来使挑战变得更容易或更难,而是使用固定范围:2到256的幂。然而在比特币的挑战版本中,矿机们并不竞争特定的数字,但他们的哈希函数的输出只需要一定的截止下。

我们来解释一下。

调整此截止值可以减少挑战。例如,如果我们有一个范围为一千万到一千万的哈希函数,我们可以将我们的截止值设置为“2”以使匹配的几率为千万 – 输出必须等于“1”才能使矿机获得赢得。或者我们可以将截止值设置为500万,使得第一次尝试获得它的几率达到50%。

在比特币网络上,有人在第一次尝试时解决挑战的可能性总是非常小 – 远远小于千万分之一 – 但考虑到计算能力的数量用于解决全世界的挑战,有人仍然会在大约十分钟内得到它。

想想看:有了足够的刮刮票,你的个人获胜几率很低,即使你购买了数百张。但是,有了中奖票,有人必然会赢 – 而且这种保证和随机性取代了中央权威。

将“链”放在区块链中

一旦矿机成功解决了这个难题,会发生什么?他们如何告诉网络的其他部分?所有用户如何接受新块作为规范?

简而言之:在这场比赛中,我们如何最终创造一个确定的历史以确保公平和清晰?

在这里,我们将解释一个非常优雅的设计方面,确保矿机最终只是为了自己的利益而避免双重花费。

使这成为可能的好主意是:

  1. 每个块必须包含前一个块的哈希值
  2. 用户被告知总是接受最长的有效块链作为规范块

0x06A64kZV4jPH31t

块的特征

总之,这些条件使得只要在网络上发布新的有效块,矿机就必须拿起新的块并将其放入链中 – 从头开始​​完全挖矿新块。

为什么?

每个块必须包含前一个块的散列的事实确保了Blockchain不断更新。

让我们说这个链条目前长达五个街区(这将是比特币创建后五十分钟 – 一个街区十分钟,还记得吗?)这意味着我们正在尝试制作第六个街区,而第六个街区的一部分是第五个块的哈希值。

但是,让我们说有人击败我们,并在我们做之前发布第六块 – 现在我们正在尝试制作第七块,我们必须包括另一个人的第六块的哈希,我们将无法使用知道它出版之前。我们不能继续努力制造第六块,因为我们浪费时间 – 人们已经接受了六个街区最长的链条 – 如果我们不赶时间,很快就会有第七个。

哎呀这意味着必须从头开始我们创建下一个区块的目标,如果我们希望它被接受并获得奖励。

关键点在于块只对引用它之前的另一个块有效。我们谈到在“另一块”之上“挖矿”,以确保堆叠到一个有凝聚力的未来。

如果两个块同时发布怎么办?矿机将挑选一个或另一个挖矿,并且稍微会有两个竞争链。但在几个街区内,一个将很快变得比另一个更长,并且该链将成为规范而另一个被放弃。

出于这个原因,建议用户不要将付款视为最终确定,直到至少几个街区为止。

现在我们可以看到双重支出是不可能的:在“给定区块之上”发布了几个区块后,该区块中的交易实际上被“埋没” – 无法恢复并锁定到支付历史记录中。

如果不撤消整个区块链,就无法撤消它们。抱歉!

那么,有人如何撤销整个区块链?这很难做到。事实上,如果你消耗的电量比其他所有人都多,那么你只能胜过其他矿机。这被称为51%的攻击,因为我们需要控制51%的电力进入系统才能做到这一点。

这是比特币的弱点,如果有的话。而且,只要这种情况没有发生,系统就是安全的。

(这也是政府可能破坏比特币网络的方式。如果一个演员经常有51%的攻击来反转历史并用一堆垃圾交易代替它,那么没有人的付款最终被记录下来,而且就像没有任何东西一样在比特币网络中继续前进 – 如果你是偏执狂的话就抬头)

但这个问题并不是一个问题:为了扰乱生态系统,一个行动者(或政府)仍然需要花费尽可能多的电力,因为全世界来自世界各地的未经请求的志愿者大量开采比特币因为他们可以获利。

并且,假设世界上任何其他人都希望阻止它(想想其他强大的,竞争的演员),他们就无法摆脱它。

那个演员需要区块链网络中所有电力的51% – 这可能很难。

原文:https://medium.com/certik/how-bitcoin-works-hashing-e897157f7940

关注我们:Twitter | Facebook | Linkedin | Medium | Telegram | Weibo | WeChat