帖子目录
区块的剖析
您也许或可能已经知道所谓的区块,就是构成区块链的基本构建块。
那么,区块内到底有些什么?
网络不仅仅是硬件,它也是由文字组成的。简单地说,区块即是文字块,其主要目的就是记录交易。
区块是由区块头和区块体组成。
区块头主要由三组数据组成:
- 第一组是父区块(前一个区块)的哈希值,父哈希值用来将该区块与它的前一区块相连接。
- 第二组数据和矿工竞争挖矿有关,即难度、时间戳和 Nonce 随机值。
- 第三组是由区块体中计算出来的根哈希值,即默克尔树根(又叫哈希树根)。
区块体内包含的是一条条的交易数据,并且形成一种特别的树形数据结构。
比如说区块体有4条交易数据,那就产生了4个哈希值,再两两相配再继续产生新的哈希值,成为树的一个节点,不断的重复这个计算过程,最终得到了一个根哈希值,也就是最顶层的一个哈希值,从而得到了一颗哈希树。
区块链中的每个区块都包含三个主件:
- 首先,区块包含存储的交易数据。例如,货币交易的数据,包括付款人电子钱包的识别、收款人的电子钱包和转账金额。
- 其次,每个区块都包含一个哈希。这个代码是基于当前区块中的数据生成的,就像是每个区块的唯一指纹。
- 第三,每个区块都包含对它所连接的前一个区块(父区块)的哈希。先前的哈希值是将区块彼此连接起来的链。在交易完成并添加到链中之前,链中的每个新区块都由分类帐上的计算机共识确认。
区块的结构
在这个简化的示例区块中,我们可以看到其列表包含四个交易数据。
回顾我们过去在纸质区块链 的帖子中所述,每个区块就是一张记账纸,以分类帐格式列出每一天的交易数据。
其实比特币区块每个区块包含 1,500 至 2,000 笔交易数据,但是这个数目在不同的区块链之间有所不同,并且取决于区块大小的限制。
区块大小通常是有限制的,以避免造成网络的堵塞。
目前比特币区块的大小限制为 1 兆字节,这是为了减少垃圾邮件的威胁和网络上潜在的拒绝服务(DoS)攻击。
每个区块都有一个唯一的数字,或称为其高度。区块高度 是指区块链中的特定位置,以它之前有多少已确认的区块来衡量。
以上示例区块中的数字 47114 即为其高度。由于区块链是线性的,下一个区块的高度可以再次递增。所以,在给定的高度上只能拥有一个区块。
区块还包含一个时间戳,一个叫做 Nonce 的随机值,其他一些信息和链中父区块的哈希值,我们将会一一详细讨论。
区块的有效性与矿工
首先我们需要讨论区块链中最重要的概念之一,有效性。
实际上,并不是所有的区块都是相等的,绝大多数区块是无效的。
但这究竟是什么意思?
那么我们需要讨论什么是比特币矿工。
找到一个有效的区块就是那些矿工在挖矿时所做的艰苦工作。区块链所谓的难度,本质上只是一个任意的设置,以确定创建一个新区块的难度。
这就是所有新区块价值的来源!
假设任何人也可以创建新区块并将它链接到区块链上,那么创建新区块将是毫无任何价值可言。并且网络上也永远不会就哪些区块应该放在区块链上达成一致的共识。
创建新区块意味着矿工们必须完成大量工作,这就是所谓的工作量证明(Proof-of-Work)。通过找到一个有效的区块,矿工们证明其工作已经完成。
对于像比特币和以太坊这样的区块链,难度级别可以改变,以便确保能定期创建新的区块。
那么,这一切是如何运作的呢?
一个区块只有在整个区块的哈希值一致时才被定义为有效,哈希值只是一个数值,其数值必须低于由区块链难度所设定的阈值数(Threshold Number)。
当我们对整个区块进行哈希处理时,我们会得到它包含的所有数据的唯一签名。如果您更改任何区块里的数据,它必然会改变原来的哈希值,就像我们在之前的哈希函数 帖文中提到的一样。
您要确定此区块是否有效的方式,您只需查看这个区块的哈希值是否低于难度阈值?
我们可以看到上图区块的哈希值 – “02ef0ab2da” 大于设定的难度阈值 – “0010000000”,所以这个区块是无效的。
在我们的示例中,我们需要散列的前三位数字为零以使区块被认为是有效的。就像我们在前一个示例区块的哈希中看到的一样 – “0008df23e5” 。
难度越大,要使区块有效,哈希输出数必须越低。由于哈希实际上是随机的,较低的值更难找到。这就像掷骰子一样,掷出 2 或以下比掷出 3 或以上更加困难。
您可以将每个哈希数字视为一个滚动的 16 面骰子。为了得到我们所需要的三个零,你必须掷三个 16 面的骰子,然后得到三个 1(因为骰子上没有零)。你可以想象你必须掷无数次的骰子,大约 4,000 次才能发生这种情况。
为了使区块达到这个目的,我们只能改变区块的数据,并只能一遍又一遍地重复改变数据,看看我们是否碰巧得到一个有效的哈希值。
但是您可以更改块中的哪些数据?它包含您无法更改的所有重要交易数据!
NONCE 随机值
哈希的有效性跟难度阈值密切相关,只有小于难度阈值的哈希才是有效的,否则哈希无效,必须重算。
由于难度阈值非常小,哈希小于该值的机会极其渺茫,可能计算 10 亿次,才算中一次。这就是采矿如此之慢的根本原因。
前面说过,当前区块的哈希由区块头所决定。如果要对同一个区块反复计算哈希,就意味着,区块头必须不停地变化,否则不可能算出不一样的哈希。
区块头里面所有的数值都是固定的,为了让区块头产生变化,中本聪故意增加了一个随机项,叫做 Nonce。
Nonce 就是一个随机值,也是工作量证明的关键部分。它唯一存在的作用就是让矿工们可以在当前区块里任意更改区块头的数值。矿工们不停地改变 Nonce 值,希望走运并使得区块头输出的哈希可以小于难度阈值。
一旦矿工们找到了导致区块哈希低于难度阈值的 Nonce 值,该区块最终被认为是有效的并且可以连接到当前区块链上。
区块有效性的验证
区块链中的节点如何验证新区块的有效性?
当网络上的其他节点收到有效区块 X 时,他们可以通过使用哈希函数来检查它的有效性,并确保其哈希低于难度阈值。
一旦证实其有效性,区块 X 会被添加到区块链中 X 的高度,并从下一个区块 X+1 开始工作,下一个区块 X+1 将包括父区块 X 的哈希在其数据中,这确保了区块链的连续性。
父区块哈希值的引用参考可防止区块被篡改!
举个例子,区块 X 和区块 X+1 是某个区块账本中顺序排列的区块。区块 X 的哈希值为“xyz”,区块 X+1 的哈希值为“abc”,参考(父区块)哈希值为“xyz”。
如果有人修改了区块 X 中的数据,它将生成一个新的哈希“def”。然而,由于区块 X+1 的参考哈希仍然记录区块 X 的旧哈希“xyz”,因此区块 X+1 的参考哈希与现今的区块 X 的哈希不一致,因此表明此链已被更改。
这一点对区块链有重大意义。如果有人修改了一个区块 X,该区块 X 的哈希就改变了。为了让后面的区块 X+1(子区块)还能连到修改后的区块 X(因为子区块 X+1 包含父区块 X 的哈希),该人必须依次修改后面所有的区块( X+1, X+2, …),否则被改掉的区块 X 就脱离区块链了。
由于前面提到的原因,哈希的计算很耗时,除非有人掌握了全网 51% 以上的计算能力,否则无法在短时间内同时修改多个区块,所以这是几乎不可能发生的事情。
在我们之前的帖子中,我们提到了去中心化账本及其共识机制 。
正是依靠这种共识机制,区块链保证了自身的安全与可靠性,新区块一旦添加到区块链中,就无法被篡改。
矿工之间的竞争和利润
在我们的例子中,我们只需要找到一个以三个零开头的哈希值。
实际上,目前在比特币区块链上,矿工必须找到以 19 个零开头的哈希值。这与掷 36 面骰子并得到所有 6 点一样的困难。
Nonce 是非常难找的,目前只能通过穷举法一个个试错。根据协议,Nonce 是一个 32 位的二进制值,即最大可以到21.47 亿。
为了比其他矿工更快地完成区块的验证,矿工使用大量哈希算力的竞争方式来争夺挖矿权。可以理解为,矿工从 0 开始,一直在计算几百万次,才能满足条件算出一个有效的 Nonce 值。
一旦找到有效的 Nonce 随,该区块就会被验证并添加到区块链中,矿工也获得挖矿奖励。
挖矿的回报是可观的,从 2020 年 5 月起,在比特币网络中找到一个区块的奖励是 6.25 比特币,或是约为 250,000 美元。所以竞争激烈也就不足为奇了。