主页 > imtoken钱包版本vf > 探索比特币“挖矿”和“区块”的物理本质

探索比特币“挖矿”和“区块”的物理本质

imtoken钱包版本vf 2023-06-08 06:44:49

注:以下内容可能会引起对区块链一无所知的朋友的不适。建议和我合作,什么是区块链,如何通俗易懂地介绍区块链?阅读下面的文章,会有一些后因果关系。

我花了将近两个月的时间才记住构建这段内容。没有办法拖延。好吧,事不宜迟,让我们研究一下硅基世界中“区块”和“挖矿”的物理性质。相信少数同学会对这个底层技术的实现感兴趣。想了解更多的朋友,我们继续...

块本身就是计算机世界中的容器。从专业上讲,它是一种用于存储交易记录的数据结构。它主要由两部分组成:块头和块体。

在区块头中,有一些结构化的数据,大部分是已知的或者很容易估计的,当然也有例外,后面会提到。计算机节点的所有估计行为实际上都是在对块头中的结构化数据进行操作和操作。

块体只是简单的存储了这段时间形成的有效交易记录(也就是我之前问答中描述的小笔记)。

我们先来描述一下区块头中重要的结构化数据是什么:

上一个块

每个区块都有一个名称,即区块 ID,由以下公式估算:

区块ID = SHA256 (区块头信息)

而 PrevBlock 是当前区块的前一个区块的 ID。正是因为当前区块的形成是基于前一个区块的ID。“内部”和“平行宇宙”的概念。

这里的“区块头信息”就是当前区块的“PrevBlock + MerkleRoot + Nonce + Time + Bits...”最终生成的字符串;SHA256函数在上一个答案中已经解释过了,这里不再赘述。显然,PrevBlock 以当前块而闻名。

默克尔根

Merkle Tree 是一种哈希二叉树,可用于快速校准大规模数据的完整性。在比特币网络中,利用 MerkleTree 的算法和数据结构,可以将所有的交易记录快速压缩汇总成一个统一的哈希值,即 MerkleRoot。

这个估计过程比较复杂。你只需要知道,区块体中交易记录的任何变化都会导致区块头中的 MerkleRoot 发生巨大的变化。显然,基于已知的交易记录,MerkleRoot 是现成的,结果一目了然。

难度和位

在说难度之前,先说一个概念:比如掷骰子,我们规定掷大于等于⑥的数字的难度为1。毫无疑问,这几乎没有难度,而100 % 会抛出一个数字来满足这个条件;那么其实投到③或更大的难度是4,投小于等于①的难度是6。

比特币合约中也有类似的规则。中本先生先定义了一个64位的16进制整数0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(前两个0x代表16进制),当时全网算力的条件下,大概10分钟左右的hash会找到一个大于或等于这个整数。作为创建者,在那个时间点找到那个数字的难度和全网拥有的算力是1;后续以此为标准,根据全网计算能力的变化,动态调整一个与之成正比的Difficulty值的Difficulty,保证全网运行10分钟内能找到需要的数。调整期大约是每两周一次,

位是与难度相对应的另一种数据表示形式。两者本质上表达的目的是一样的,只是转化过程稍微复杂一些,所以不用担心。你只需要知道,当知道全网的算力,那么Difficulty & Bits就很容易知道了。

随机数

从 0 到 N,一个随机数只使用一次。前面讲故事的时候,我们提到“区块埋在广阔的地下”、“巨大的工作量”、“随机结果”等,真正的激励是 Nonce 的随机性。

时间

当前区块形成的大致时间戳。为什么说“大约”?这是因为在去中心化的区块链世界中,这个时间戳是根据与形成区块的节点相关联的其他节点的时间戳的平均值来估计的,这并不完全等同于国际标准。这个值实际上是固定已知的。

以上是我认为比较重要的区块头中的数据字段。如果你已经对上述术语有了基本的了解,我们终于可以进行下一步了——探索“挖矿”的物理本质:

## Step1:根据以下公式计算一个新的Target值

Target = \frac{某一个常量}{Difficulty}

其中,某个常数就是我们上面提到的64位十六进制整数0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。比特币诞生的时候,Difficulty 为 1,多年来依然根据全网算力的周期性动态调整。难度,我在写这篇文章的时候(2018年3月29日16:20),block#515648的难度为3462542391191.563,可以间接推测全网出现在计算比2009年创世纪低3462亿倍!

Target 的计算结果也将最终成为一个包含多个前导零的 64 位十六进制字符串。这个估计过程也比较复杂,不过你只需要简单的了解一下上面的正负关系即可。例如,当全网算力增加时,意味着挖矿难度增加,从公式中可以清楚地看出,Target越小↓,在某种意义上,意味着前导零越多↑(想象一下比特元和复杂美,它大于带有两个前导零的目标“00100”,简单粗暴的方法是找到前导零更多的数字,例如“00011”有3个前导零)

在现有算法中,当前Target值的解不需要每次都执行之前的估计公式,因为中间有一步的消耗,首先需要估计Difficulty,然后进行除法,而难度是根据目前的算力与创世难度1进行比较,步骤比较复杂。其实算法会直接根据前一个区块的Target值求解,虽然两者估计的功效是一样的:

Target_{new} = \frac{T_{2016}}{1,209,600} * Target_{prev}

T_{2016}

是在实际环境中形成2016个块的时间总和;1,209,600是按照比特币标准“每10分钟一个块”生成2016个块所需的秒数(2016*10*60=1,209,600),这是一个固定常数;

Target_{prev}

是上一个区块周期的目标值。

上面的公式很容易理解。2016个区块的平均形成时间为9分钟,这意味着在整个网络环境中更容易挖出区块。难度必须增加10%才能保持十分钟的效率。, 目标将相应增加 10%。因此,我们只需要通过

Target_{new}

调整只能在力所能及的范围内进行,以保持整个网络的平衡。

## Step2:计算当前区块的ID,使其满足如下公式

SHA256\left( PrevBlock + MerkleRoot + Nonce + Bits + … \right) \leq Target

显然比特元和复杂美,上式中除了Nonce外,其他参数都是已知的或者可以通过简单的估计得到。Hash map 操作一般设计为逆向估计,唯一的解决办法就是暴力破解。所以,在比特币的世界里,挖矿的物理本质就是不断地执行上面的公式。通过与这个Nonce随机碰撞,终于满足公式,感觉挖矿成功了!

是不是觉得太容易了?其实就是这么简单。

哦,对了,以上这些其实都是区块链世界中POW共识算法的核心。其算法的优缺点非常显着。