跳转到主要内容

区块链 — ETH.BUILD

演示区块链挖矿的工作原理,包括区块如何链接在一起、工作量证明如何保护区块链,以及当有人试图篡改数据时会发生什么。

Date published: 2021年1月14日

奥斯汀·格里菲斯制作的教程,演示了如何使用 ETH.BUILD 可视化编程工具进行区块链挖矿。奥斯汀涵盖了工作量证明 (PoW) 共识、区块链接、挖矿难度、区块奖励和链的不可篡改性。

本文字稿是奥斯汀·格里菲斯发布的原视频文字稿 (opens in a new tab)的无障碍副本。为了提高可读性,进行了少量编辑。

协调问题 (0:00)

早上好,领结星期五快乐!这期 ETH.BUILD 的重点是区块链——非常酷的东西。我们坐在这艘小丑船上,戴着我们的比特币领结。我们开始吧。

在目前的课程中,我们已经快速学习了密钥对、哈希和账本。我们发现,如果我们想在一个分布式网络(而不是中心化网络)上进行价值的来回交易,我们最终会遇到协调问题。我们最终会遇到这样一个问题:我们无法在不同的参与方之间达成共识,因为他们都在不同的时间接收到不同的交易。有很多不同的方法可以解决这个问题,但在工作量证明 (PoW) 出现之前,没有一个是完美的。

我们在支线任务中讨论了拜占庭将军问题,我们在那里学到的是,将军们在通过不安全的网络发送消息时,需要证明他们拥有一支军队。这样,接收方就能确认那个人确实是一位即将发起攻击的将军,从而进行协调。

区块与随机数 (1:04)

因此,有了这个账本,我们就可以从网络中注入交易。我们不再让每个单独的用户证明他们的工作量,而是将工作量证明抽象成一个交易区块,并让矿工来处理它。

我们引入一个包含交易的区块——无论网络上传来什么,我们都将其加载到这个区块中。如果我们看一下这个区块的结构,它还有一个随机数。这个随机数允许我们微调哈希。如果我们把整个区块转换成字符串并进行哈希处理,我们就会得到一个哈希。随着交易的改变,哈希也会改变,但当我们改变随机数时,哈希同样会改变。

我们在这里做一些工作——我们有一组随机的交易,并且我们不断改变随机数,直到哈希出现前导零。如果你看过关于拜占庭将军的支线任务,我们选择这个前导零作为需要证明的任意工作量。因此,随机数只需遍历每个数字——一、二、三、四——当我们得到一个前导零时,我们就会说:这是一个有效的区块。

工作量证明的实际应用 (3:00)

如果我们拿一个已经挖出的区块,提取出哈希,并将其放入哈希函数中,我们就可以证明它有一个前导零——我们可以证明这个区块已经经过了工作量证明。

哈希函数会消耗 CPU,而 CPU 是一种有限的资源。我们投入所有的 CPU 算力,试图找到一个带有前导零的哈希。一旦找到,我们就得到了一个有效的区块——这个区块基本上就被冻结了。当时在里面的任何交易现在都在这个区块中,每个人都认可它,然后我们就可以继续处理下一个区块。

将区块链接在一起 (3:56)

诀窍在于:我们把旧区块和新区块连接起来。如果我们看一下结构,新区块没有交易,随机数也是空的,但它有一个包含交易的父区块。前一个区块将成为下一个区块的一部分,这样我们就会得到一条完整的链。

我们从交易池中投入最新的交易,并努力寻找一个随机数。二号区块被挖出来了——我们需要一个值为 10 的随机数才能使这些交易有效。然后我们做同样的事情:连接旧区块,引入新区块,投入最新的交易,然后再次进行工作量证明。经过足够多的尝试后,我们找到了三号区块的随机数。四号区块——同样的过程,我们继续向前推进。

挖矿难度 (5:02)

这太容易了——我们能够非常快地找到一个有效的区块,而我们希望它变得更难。我打算把难度调高到二。我们连接五号区块,引入最新的交易,并让计数器飞速运转。现在我们正在挖矿——利用我们有限的 CPU 算力随意地向其抛出随机哈希,直到我们找到一个带有两个前导零的哈希,因为难度已经提高了。这需要一点时间。

现在我们有了这条包含五个区块的区块链。这些区块包含交易,并且每个区块都引用前一个区块。每个区块都需要一定的任意工作量才能产生,而工作量的大小由难度控制。

矿工 (6:46)

让我们看看矿工是什么。在拜占庭将军问题中,想要“在黎明时分进攻”的将军需要士兵。每个士兵内部发生的事情,正是我们在这里用矿工所做的事情——我们获取一条消息和一个随机数,并尽可能快地将它们投入哈希函数中,试图获得那些前导零。前导零是我们大家都同意的某种任意标准——这足以证明你是一名士兵,或者你可以发动战争。

让我引入一个矿工,把这个过程做得更快一点。矿工将对我们的区块做同样的事情——它从交易池中获取传入的交易,将它们注入区块,然后不断进行工作量证明,直到找到一个有效的哈希。

矿工的效率要高一点。他更专注于挖矿。他正在随机抛出哈希——这正是我们的矿工之前所做的,只是被抽象化了。我们可以看到它在后台飞速运转,不断地进行哈希处理。找到了——六号区块被挖出来了。

双重支付与网络传播 (10:00)

现在我们讨论了双重支付的问题,甚至网络传播的问题。当我们有一个账本和一个分布式网络,并且有人发送了一笔交易时,它会在不同的时间到达不同的人那里。因此,网络上可能会有两个矿工在完全相同的时间挖出一个区块,而它们里面包含不同的交易。

每一个在当时都是有效的——它们都完成了工作量证明,它们都有前导零。但它们不可能都是规范的。它们不可能都是真相。因此,我们需要一种方法让网络就哪一条是真正的链达成共识。

多个矿工与共识 (12:27)

让我抓住这个区块并把它移到这里。我想要的是两个不同的矿工在同一个问题上工作,有点像监听同一个交易池并独立地生成区块。我们有两个矿工:Mallory 和 Mike。我已经把难度调到了三,两人都在努力寻找一个带有三个前导零的哈希。

所以 Mallory 先找到了一个区块!太棒了。现在会发生什么——因为我们在一个分布式网络上,Mike 可能还不知道 Mallory 的区块。他可能还在处理他自己的版本。现在 Mike 也找到了一个。所以我们有两条有效的路径。

如果你是网络上的一个对等节点,并且你先看到了 Mallory 的区块,你会认为那是主区块。然后稍后 Mike 的区块到达了。你会把它们都保留下来,以防其中一个成为最长的链。规则是:遵循最长的有效链。

Coinbase 与区块奖励 (15:33)

当矿工挖出一个区块时,我们会说:这是我们想要的所有交易,这是随机数,这是父区块——但我们也会说,这是挖出那个区块的人。这被称为 coinbase——我想现在有一家公司叫这个名字,但这是两码事。我们姑且称之为“矿工”。所以我们的区块现在需要一个矿工字段。

所以 Mike 刚刚找到了这个区块,Mike 也将从中获得 10 的价值。我们需要激励矿工去做所有这些工作,对吧?他们花钱购买这些矿机,基本上是为了确保网络的安全。这些矿工花钱用他们所有的哈希算力来保护网络——所有矿工加起来,可能有成千上万个。他们花大价钱建造处理这些哈希的矿机,为了激励他们,我们从他们挖出的每个区块中给他们一部分分成,称为区块奖励。

区块奖励与激励 (16:52)

所以在这个版本的区块中,Mallory 有十美元,但在另一个版本中 Mike 有十美元。这两个参与者都有动力继续沿着他们自己的链走下去,而网络的其余部分需要达成共识。基本上,这归结为谁拥有最长的有效链。

Mike 将把他的区块设置为父区块,并开始处理下一个区块。Mallory 也会做同样的事情。这取决于网络上的其他人选择站在哪一边。因为我们不想惩罚网络状况不佳的人,我很确定在以太坊中我们会向叔块(未能进入最长链的有效区块)支付报酬——因为它们仍在帮助保护网络。

我们遇到了协调和共识的问题,我们通过引入必须参与的任意工作量来使交易有效,从而解决了这个问题。Mallory 做了所有这些哈希处理工作,不断地进行哈希处理,以找到所有这些交易和前一个区块的哈希的三个前导零。

查询区块链 (18:30)

我们可以与任何最长的链进行交互。Mike 还没有达到七,所以我们可以看到这里的区块高度仍然是六。我们可以做一些事情,比如查询人们的余额。所以我们点击余额——我们得到了什么?五百二十四。所以 Heidi 一直持有 524 个这条链的原生代币。我们可以看到她的随机数,我们可以做所有我们在账本上能做的事情,但现在我们正在堆叠区块,而这些区块包含着交易。

我们已经将工作量从只是发送资金的用户抽象给了矿工,并且我们通过给予他们区块奖励来激励他们。每笔交易每个人还需要支付少量费用,但我们将在以后的节目中讨论这个问题。我们现在不想谈论 Gas,但了解这一点很有帮助:不仅有挖出一个区块的激励,还有挖出一个包含大量交易的完整区块的激励。但这是一个较小的激励——我们最终会讲到它。

链的不可篡改性 (19:51)

随着区块被挖出,它们变得越来越安全。让我向你展示我的意思。所以 Mike 挖出了一个区块,Mallory 在这里做演示,没能挖出一个区块。所以现在 Mike 的链将是最长的,它将在整个网络中传播。每个人都会看到它并说:好的,这条链有七个区块,它们都是有效的——这就是我们要遵循的链。你可能会遇到硬分叉、有争议的分叉,我们所遵循的规则将会改变,不同的人群想要遵循不同的链。很酷的东西。

好了,最后,如果我们回到三号区块并改变一些东西——改变任何微小的细节——我要进去了。有一笔给 Frank 的交易。假设我们把 Frank 改成 Eve。现在看看当我点击确定时会发生什么:看那个。我改变了三号区块的一小部分,突然之间整条链就崩溃了。它不再有效了。如果我在网络上广播这个,人们会把我笑掉大牙。

一旦区块被挖出,你就不能改变任何东西,除非你回去并在它改变时重新挖矿。我基本上必须把矿机重新连接到这里,并试图拥有足够的算力来追上已经有七个区块的 Mike。这将是非常非常困难的。一个区块越深,就越难恢复。事实上,在这个三号区块中,Carlos 发送了 84 给 Bob——Bob 可以非常确定地知道,在多个区块的深度下,那笔钱肯定在那里。这里不可能出现什么有争议的分叉——我很稳。这就是我们所说的最终性。

总结 (22:00)

我们不再使用账本并面临这种共识问题,而是使用工作量证明 (PoW) 来进行哈希处理以验证区块——而“有效”意味着任意数量的前导零。在构建区块链时,我们仍然会遇到问题,即挖出的区块实际上可能会在不同的时间到达不同的地方。因此,我们有一个进一步的共识算法,它规定:遵循最长的有效链,并且遵循你希望参与的规则集。

好了,领结星期五快乐!这就是 ETH.BUILD 上的区块链。我会把它保存并放上去,这样你只需点击“加载”就可以有一条链来玩了。星期五快乐!

这个页面对您有帮助吗?