SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

SHA256 和挖矿如何保护比特币网络

比特币如何受到能源的保护? 什么是随机数? 这些问题以及更多问题都在里面得到解答!

采矿的工作原理令人着迷。 当我向人们解释它时,我喜欢在他们的头脑被震撼的那一刻看到他们的脸。 我会在这里解释它,但要知道,我在想象你所有的脸,因为你的思想爆炸!

我必须从哈希函数开始。 没有哈希函数,比特币就不可能存在。 让我先解释一下它们是什么,不仅是为了让你在聚会上听起来很酷,而且因为它是理解比特币如何运作的基础——尤其是挖矿和交易——在幕后。

您无需了解比特币的工作原理即可从中受益,就像您无需了解 TCP/IP 如何使用互联网一样。 但是请继续,因为它很有趣,我保证它会很容易理解。

散列函数

让我们从一个示意图开始,我将在下面解释......

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。
(形象的/@jirols_btc)

左边是输入,中间是函数,右边是输出。 输入可以是任何数据,只要它是数字的。 它可以是任何大小,只要您的计算机可以处理它。 数据被传递给 SHA256 函数。 该函数获取数据并计算一个看似随机的数字,但具有特殊属性(稍后讨论)。

第一个安全哈希算法(SHA)最初是 由美国国家安全局开发 现在有很多不同的版本(比特币使用 SHA256)。 这是一组关于如何以非常复杂但指定的方式混淆数据的说明。 说明不是秘密,甚至可以手工完成,但非常繁琐。

对于 SHA256,输出是 256 位数字(并非巧合)。

256 位数字表示 256 位长的二进制数。 二进制表示该值用两个符号表示,0 或 1。二进制数可以转换为任何其他格式,例如十进制数,这是我们所熟悉的。

虽然该函数返回一个 256 位二进制数,但该值通常以十六进制格式表示,长度为 64 位。

十六进制意味着我们有 10 个符号(我们习惯的 0-9,加上字母 a、b、c、d、e、和 f;其值为 16 到 0)。 举个例子,用十六进制表示十进制 9 的值,我们只写“f”,它是相同的值。 如果您需要更多详细信息,可以通过快速 Google 搜索在线获取大量信息。

为了演示 SHA256 的实际应用,我可以取数字 1 并通过 在线哈希计算器,并得到这个输出(十六进制):

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

顶部框是输入,底部框是结果输出。

请注意,只要输入相同并且使用 SHA256 函数,世界上所有计算机都会产生相同的输出。

十六进制数输出,如果转换为十进制,是(注意它需要更多的数字来写入):

48,635,463,943,209,834,798,109,814,161,294,753,926,839,975,257,569,795,305,637,098,542,720,658,922,315

并转换为二进制它是:

11010111000011010110010011100111111111100110100111111001110000110011101011010111000000001001110111111110101101000111111010101110100011110101101101001001110101010100010001011110001110101001001110000000001111001010010110111011011011110000111010110110100101111010111001101011100110101110011010111001101011100110101110011010111001101011100111

只是出于兴趣,这里的值相同 基础64.

1w1k5/5p+cM61wCd/rR+ro9bSdVEXjqTgDylu28OtpY=

请注意,SHA256 可以返回的最小可能值为零,但 LENGTH 仍然是 256 位。 这就是零的表示方式:

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

最大可能值为:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

以十进制表示,即:

115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935

在十六进制中,它是:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

请注意,恰好有 64 个 F。

十六进制中的零可以简单地写成一个零,但是对于散列输出,需要 64 个来满足固定大小输出的要求:

0000000000000000000000000000000000000000000000000000000000000000

以下是关于哈希函数的一些重要事实的摘要:

  • 输入不能从输出中确定
  • 输入可以是任意长度
  • 输出总是相同的长度
  • 如果您提供相同的输入,输出将始终以相同的方式复制。
  • 输入的任何变化,无论多么小,都会导致不可预测且截然不同的输出
  • 输出看似随机,但实际上是确定性的(意味着它是经过计算且可重现的)
  • 输出无法预测。 它只能被计算出来,这需要通过计算机进行大量的工作(以及使用铅笔和纸的时间!不要这样做。)

既然您了解了哈希的基本概念,您就可以理解比特币挖矿的工作原理了。

但在你继续之前,我建议你去一个在线哈希计算器玩一下,自己测试一下我所说的关于哈希函数的内容。 我喜欢这一个。

采矿

我将首先展示一个工作概念,这就是比特币中“工作量证明”的来源。

转到在线哈希计算器并输入“我正在创建 50 个比特币并支付给自己这个金额”。

准确输入,区分大小写,包括句号。 你应该得到这个输出:

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

现在,让我们创建一个规则,说明要使该支付消息有效,我们需要哈希以一个零开始。 为此,我们必须以某种方式更改输入。 但是,正如您所了解的,对于给定的输入,输出是什么是不可预测的。 我们可以进行哪些修改来确保散列从零开始?

我们必须使用反复试验来添加数据。 但是我们也不想改变输入消息的含义。 因此,让我们创建一个名为“nonce”的字段(分配的部分),它将保存一个无意义的值。

“Nonce”这个词应该源自“仅使用一次的数字”,但我不明白。

请注意下面添加“Nonce:”作为额外字段标题如何更改哈希输出。

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

输出仍然不是以“0”开头,所以让我们添加一些废话(我添加了一个无意义的“x”):

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

它仍然不是从零开始的。 我尝试了更多字符,直到哈希以零开头:

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

我们去吧。 现在,根据我为这个假装版本的比特币设置的任意规则,输入窗口中的文本是一个有效块,单笔交易支付给我 50 比特币。

请注意,比特币块本质上是分类账的页面。 每个区块都被编号并创建新的比特币,同时列出用户之间的交易。 这条记录是比特币存在的地方。

现在有了新规则。 对于下一个块,必须包括前一个块的哈希。 我将添加一点复杂性并添加更多字段来接近真正的比特币区块所具有的内容。

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

哈希以“f”而不是“0”开头,所以我必须在 nonce 字段中尝试一些值:

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

这次我比较幸运,只尝试了四次就找到了合适的随机数。 回想一下,第一个块需要 22 次尝试。 这里有一些随机性,但如果我们试图得到的只是一个零,通常不难找到一个有效的散列。 第一个哈希数字有 16 个可能的值,所以我有 1 分之一的机会,我对输入字段所做的任何修改都会导致第一个哈希数字为“16”。

请注意,比特币的字段是这样的,但我没有添加更多细节。 这只是为了说明一点,不一定要详细说明比特币区块的具体外观。

我将在下一个块中添加一个时间字段,因为我需要它来解释接下来的“难度调整”:

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

上面是第三块。 它包括前一个区块的哈希,现在我也开始包括时间。 我找到的随机数成功地使散列从零开始(我只是一直输入“1”,直到达到散列目标)。

现在这里已经足够了,我可以开始解释一些关于比特币区块链和挖矿的有趣概念了。

赢得一个街区

采矿过程具有竞争力。 谁首先产生了一个有效的区块,谁就可以向自己支付固定的区块奖励。 稍后产生相同块号的矿工一无所获——该块被拒绝。 现在解释为什么会导致过多的转移,所以我将在附录中解释。

在找到区块 XNUMX 并将其广播给所有人(所有比特币节点)后,所有矿工都停止了他们的区块 XNUMX 版本的工作。 他们开始在成功的区块 XNUMX 之上构建(通过将其区块哈希向前拉到新区块中)并开始努力为区块 XNUMX 寻找合适的随机数。 获胜者公布结果,然后每个人都开始在第五块上工作,等等。

每个区块都会创建新的比特币,并共同构成迄今为止的总供应量。 如果有很多矿工,那么从统计上来说,我们应该期望出块的速度更快,因此比特币的创建速度也会更快。 问题,对吧?

随着时间的推移,为了寻求有限的比特币供应,可预测的发行量,中本聪想到了这个问题,并引入了一个负反馈循环,以保持平均每 10 分钟的一次区块生产。 如何? 看看能不能想出办法。 暂停片刻,思考一下——看看你是否能想出同样的天才解决方案,并在你放弃时继续阅读。

节点:我提到“有效”块。 所以呢? 谁在检查? 比特币节点是。 到目前为止,比特币节点保留了区块链的副本,并遵循一组规则来检查新块是否符合规则并拒绝那些不符合规则的块。 规则在哪里? 在代码中。 下载比特币代码的计算机是一个节点。

难度调整

创建新比特币区块的平均时间由每个节点每 2016 个区块计算一次(这就是需要时间字段的原因)。 这是节点遵循的协议和规则的一部分。 应用一个公式来调整每个块哈希必须从零开始的数量才能有效。

严格来说,调整的不是零的数量,而是哈希必须低于的目标值,但是考虑前导零更容易解释。

如果块的生成速度过快,那么哈希目标会根据所有节点都遵循的预定义规则进行调整(在他们的代码中)。

在我的示例中保持简单,假设其他人在与我竞争,区块发生得太快,现在第四个区块需要两个零而不是一个,根据假想的计算。

我需要更长的时间才能得到两个零,但我们想象有很多其他人在与我竞争,所以任何人找到一个块所花费的总时间都保持在一个目标上。

这是下一个块:

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

注意时间。 距离上一个区块已经过去了 10 多分钟(我只是抽出时间来演示)。 10 分钟目标是概率性的; 永远无法确切知道何时会找到下一个区块。

我在键盘上玩了一分钟,直到出现两个零。 这比找到一个零要困难得多。 连续找到两个零的机会是 1 分之一2,或 1 分之一的机会。

如果更多的人加入到新比特币的挖矿和竞争中,那么最终将需要三个零。

我刚刚查找了最后一个真正的比特币区块,其中包含前一个区块的哈希值。 哈希是:

000000000000000000084d31772619ee08e21b232f755a506bc5d09f3f1a43a1

那是19个零! 1 人中有 16 人19 每次尝试找到这样一个块的机会。 比特币矿工每秒做很多很多次尝试,在世界各地集体进行。

每秒的尝试次数称为“哈希率”。 目前,估计世界哈希率略低于每秒 200 亿太哈希(一太哈希等于一万亿哈希)。 每秒尝试这么多次,大约每 19 分钟就会发现一个以 10 个零开头的哈希块。

未来,随着更多矿工的加入,哈希率会上升,出块速度会更快,比特币的难度会调整为需要 20 个零,这将使出块时间回落到 10 分钟左右。

减半

比特币刚开始时,每个区块产生 50 个比特币。 比特币区块链的规则规定,每产生 210,000 个区块,奖励就会减半。 这一时刻被称为“减半”,大约每四年发生一次。 减半,再加上每隔 10 分钟保持区块的难度调整,意味着在 2140 年左右,区块奖励将是 0.00000001,或 1 satoshi,比特币的最小单位,并且不能再减半。 挖矿不会停止,但区块奖励将为零。 从那一刻起,不会再创造新的比特币,比特币的数量是可以用数学计算的,并且足够接近 21 万枚硬币。 这就是总供应量的已知方式——它是通过程序设置的。

即使区块奖励为零,矿工仍将被激励继续工作以赚取交易费用。

区块奖励究竟是如何减半的? 它在节点持有的代码中。 他们知道在矿工支付超过 210,000 个比特币的 25 之后拒绝任何新区块。 然后在 420,000 之后拒绝任何矿工支付超过 12.5 比特币的区块,依此类推。

交易费

到目前为止,我只展示了单笔交易的虚构区块——矿工获得奖励的交易。 这被称为“coinbase 交易”。

它不是以公司命名的,Conbase,我的意思是 Coinbase。 该公司以 coinbase 交易命名,而不是相反。 不要混淆。

除了 coinbase 交易之外,还有人们相互支付的交易。 这是一个想象的例子:

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

这次我没有费心去寻找真正的哈希(实际上是第 200,001 块报告的真正哈希)。 我只是为了好玩而编造的随机数,但请注意其中可以嵌入一条消息。

Satoshis 在当天的报纸头条之后,在第一个比特币区块(创世纪区块)中加入了著名的词“总理即将对银行进行第二次救助”。

SHA256 和挖矿如何保护比特币网络 PlatoBlockchain 数据智能。 垂直搜索。 人工智能。

这里的重点是包含 132 笔交易(未全部显示)。 看看交易#132——来自一个地址的 2.3 个比特币向另一个地址支付 2.1 个比特币,同时向另一个地址支付 0.1 个比特币(我使用点来缩短地址的长度)。

因此,一个 2.3 比特币的来源总共支付 2.2 比特币(2.2 + 0.1 = 2.2)。 是否缺少 0.1 个比特币? 不,差异是矿工声称的,我将解释。

矿工可以向自己支付 25 个比特币作为区块奖励(因为 210,000 个区块已经过去,所以奖励从 50 减半到 25)。 但是如果你看一下,coinbase 交易是 27.33880022。 额外的 2.33880022 比特币来自区块中的其他 132 笔交易——输入都将略大于输出的总和。 因此,矿工可以将这个“被遗弃”的比特币作为对自己的付款。 这些被认为是支付给矿工的交易费用。

块空间是有限的。 当比特币是新的时,用户可以免费发送交易,矿工会将交易包含在区块中。 但是现在有更多的用户,并且由于进入下一个区块具有竞争力,用户在交易中包含费用以诱使矿工选择他们的交易而不是其他人的交易。

因此,当区块奖励稳步下降,每四年减半并最终为零时,矿工仍然以这种方式获得报酬。

有人认为,有朝一日对矿工的奖励将不够,并将导致比特币失败。 这种担忧已被彻底揭穿,我不会在这里重复。

可以重写一个块吗?

这是极不可能的,值得理解为什么。 然后你就会明白为什么比特币交易是不可变的(不可改变的)。

我之前解释过,前一个块的哈希包含在当前块中。 这意味着对旧区块中交易的任何编辑都会更改该已编辑区块的哈希值。 但是该哈希值记录在下一个块中,因此这意味着下一个块也需要更新。 但是如果你改变了记录在下一个区块中的哈希值,那么它的哈希值就需要改变,以此类推。

请注意,任何时候更改散列时,您都会丢失所有这些可爱的零,并且只会留下一个看起来随机的散列 - 并且必须再次完成所有工作才能恢复零。 如果您对尝试编辑的块执行此操作,则必须为下一个块重做工作,并且一直到最近的块。 你不能简单地停留在旧区块,因为比特币的规则是,最长的区块链就是真正的比特币记录。 如果您在 10 个区块前返回并编辑一个区块,您将不再拥有最长的链。 您必须再添加 10 个块,然后再添加一点,因为当您创建这 10 个块时,真正的链可能会变得更长一些。 您必须比赛才能超越真正的链条。 如果成功,则新版本成为真实版本。

从编辑区块到最新区块重复整个世界的集体散列工作是编辑比特币的障碍。 能量被用来创建那些带有所有那些不可能的零的哈希值,并且必须重复能量消耗来编辑比特币。 这就是为什么用于开采比特币的能源不会“浪费”的原因; 它可以保护比特币免受编辑,使账本不可变,而无需信任中央权威。

如果两个矿工同时发现一个区块会发生什么?

这实际上时不时地发生,并且它总是按如下方式自行排序:

每个节点将首先接收新的几乎同时出现的块中的任何一个,然后接受那个并拒绝稍后到达的那个。 这会导致网络分裂,但这是暂时的。

为了说明,我们将其中一个块称为蓝色,另一个称为红色(它们没有颜色,请耐心等待)。

然后矿工在下一个区块上工作,但是对于他们从哪个区块延伸链会有分歧。

假设获胜的矿工使用蓝色链找到了一个区块。 他们会将新块发送到所有节点,最长的链将显而易见。 接受红色链的节点将丢弃它并采用蓝色链。

所有在红色链上工作的矿工都将停止工作,现在将在较长的链上工作,即蓝色链。 红链死了。

附录

为什么亚军矿工的区块无效

假设 700,000 块刚刚被 MINER-A 开采。 700,000 秒后,MINER-B 也创建了不同版本的 30 区块。 当 MINER-B 广播这个替代方案时,每个节点都会拒绝它,因为他们已经看到并接受了 MINER-A 的块。 更重要的是,在那 700,001 秒内,假设 MINER-C 找到了 700,000 块。 鉴于 MINER-B 竞争的第 700,001 个区块没有扩展当前链(最多 XNUMX),因此它也被拒绝。

更有趣的是,如果 MINER-B 一直在开发 700,001 区块而不是 700,000 的竞争版本,那么他们挖掘有效区块 700,001 的机会与他们最终必须找到替代区块 700,000 的机会一样多。 因此,一旦任何矿工看到一个新区块,他们就应该将精力放在下一个区块上。

但是,如果 Miner-B 在 MINER-A 之后一秒找到了第 700,000 个区块,那么根据地理位置和互联网速度,可能一些节点首先看到 MINER-A 的区块,而其他节点首先看到 MINER-B 的区块。 在这种情况下,会有一个临时分叉,一些矿工将努力扩展一个版本,而其他矿工将努力扩展另一个版本。 正如前面使用“蓝链”和“红链”描述符所解释的那样,最终其中一个版本将在另一个版本之前进一步扩展并一致成为有效版本。

这是帕尔曼阿曼的客座文章。 所表达的意见完全是他们自己的,不一定反映 BTC Inc 或 比特币杂志.

时间戳记:

更多来自 比特币杂志