主页 > imtoken钱包苹果手机怎么下载 > 比特币挖矿和共识

比特币挖矿和共识

很多人都知道比特币,区块链。但是整个网络如何保证这种去中心化呢?可能很多人不知道,或者想知道却不知道从何下手。其实,从挖矿的角度去理解区块链,会更好的把握关键点。如果你了解挖矿,你就会了解区块链和去中心化。

介绍

区块链可以被认为是所有交易的公共分类账(列表),比特币网络中的每个参与者都将其视为所有权的权威记录。

比特币没有中央权威,几乎所有全节点都有公共账本的备份副本,可以认为是经过身份验证的记录。

到目前为止,对主链区块链的攻击还没有一次成功,甚至一次也没有。

通过创建新块,比特币以确定性但不断减慢的速度铸造。大约每十分钟产生一个新区块,每个新区块都伴随着一定数量的全新比特币,这些比特币是从零开始创建的。每挖出 210,000 个区块,大约需要 4 年,货币发行率下降 50%。

在 2016 年的某个时候,在第 420,000 个区块被“开采”后,它跌至 12.5 BTC/区块。在第 13,230,000 个区块(大约在 2137 年开采)之前,新币的发行率呈指数级“减半”64 倍。届时,每块发行的比特币数量成为比特币的最小货币单位——1聪。最终,在 1344 万个区块之后,所有 20,999,999.9769 satoshis 将被发行。换句话说,到 2140 年左右,将有接近 2100 万比特币。之后,新区块不再包含比特币奖励,矿工的所有收入都来自交易费用。

比特币的去中心化共识是所有网络节点的 4 个独立进程交互作用的结果:

1、独立验证

每个节点收到交易后,会在全网广播之前对这些交易进行验证,并建立一个池(transaction pool),用于接收到的新交易按照相应的顺序进行。

在验证每笔交易时,每个节点都需要比较一长串标准:

▷ 交易的语法和数据结构必须正确。

▷ 输入和输出列表都不能为空。

▷交易的字节大小小于MAX_BLOCK_SIZE。

▷每个输出值,以及总金额,必须在规定的数值范围内(小于2100万币,大于0)。

▷ 没有哈希等于 0 和 N 等于 -1 的输入(coinbase 交易不应该被中继)。

▷nLockTime 小于或等于 INT_MAX。

▷交易的字节大小大于等于100。

▷ 一笔交易的签名次数应小于最大签名操作次数。

▷ 解锁脚本(scriptSig)只能将数字压栈,锁定脚本(scriptPubkey)必须符合isStandard格式(会拒绝非标准交易)。

▷ 池中或主分支块中必须存在匹配的交易。

▷ 对于每个输入,如果引用的输出存在于池中的任何交易中,则该交易将被拒绝。

▷ 对于每个输入,在主分支和事务池中查找引用的输出事务。如果输出交易缺少任何输入,则该交易将成为孤立交易。如果匹配的交易尚未出现在池中,它将被添加到孤立交易池中。

▷ 对于每个输入,如果引用的输出交易是 coinbase 输出,输入必须至少收到 COINBASE_MATURITY (100) 个确认。

▷ 对于每一个输入,引用的输出必须存在且不被花费。

▷ 使用引用的输出交易获取输入值,检查每个输入值和总值是否在指定值范围内(小于2100万币,大于0)。

▷ 如果输入值之和小于输出值之和,则交易中止。

▷ 如果交易费用太低,无法进入空区块,交易将被拒绝。

▷每个输入解锁脚本都必须根据对应的输出锁定脚本进行验证。

2、将交易记录独立打包到新区块中

以下挖矿节点命名为A挖矿节点

挖矿节点不断监听传播到比特币网络的新区块。这些新增的区块对于挖矿节点具有特殊的意义。矿工之间的竞争以新区块的传播结束,仿佛在宣布谁是最终的赢家。对于矿工来说,获得一个新区块意味着一些参与者赢了,而他们输掉了比赛。但是,一轮比赛的结束也代表着下一轮比赛的开始。

验证交易后,比特币节点将这些交易添加到自己的内存池中。mempool,也称为交易池,用于临时存储尚未加入区块的交易记录。

2.1个交易区块年龄、矿工费和优先级

节点 A 需要为内存池中的每笔交易分配一个优先级,并选择优先级更高的交易记录来构建候选区块。

一笔交易要成为“更高优先级”,必须满足的条件:优先级值大于 57,600,000,而这个值的产生取决于 3 个参数:一个比特币(即 1 亿聪)和年龄是一天(144 个区块)。),事务的大小为 250 字节:

高优先级 > 100,000,000 satoshis * 144 块 / 250 字节 = 57,600,000

用于存储交易的块的前 50K 字节保留给更高优先级的交易。节点在填充 50K 字节时会优先处理这些最高优先级的交易,无论是否包含矿工费。即使矿工费用为零,这种机制也允许首先处理高优先级交易。

然后,A 挖矿节点会选择那些矿工费最小的交易,按照“每千字节的矿工费”进行排序,优先选择矿工费最高的交易来填充剩余的区块。

如果区块中还有剩余空间,则挖矿节点 A 可以选择那些不收取矿工费的交易。一些矿工会竭尽全力将不包含费用的交易合并到区块中,而另一些矿工可能会选择忽略它们。

块被填充后,内存池中剩余的交易成为下一个块的候选者。因为这些交易保留在内存池中,随着新块被添加到链中,这些交易作为输入引用的 UTXO 的深度(交易“块年龄”)也会增加。由于一笔交易的优先级值取决于其交易输入的“区块年龄”,因此该笔交易的优先级值相应增加。最后,零费用交易的优先级值可能会达到高优先级阈值,并免费进入区块。

UTXO(Unspent Transaction Output):每笔交易都有多个交易输入,即资金来源,也有多个交易输出,即资金去向。一般来说,每笔交易都会花费一个输入并产生一个输出,而产生的输出就是“未花费的交易输出”,也就是UTXO。

区块年龄:一个UTXO的“区块年龄”是自UTXO被记录在区块链以来所经历的区块数,即UTXO在区块链中的深度。

2.2 创币交易

区块中的第一笔交易是一种特殊的交易,称为 coinbase 交易或 coinbase 交易。该交易由挖矿节点构建,用于奖励矿工的贡献。假设此时一个区块的奖励是25比特币,节点A挖矿会创建“向A的地址支付25.1比特币(包括矿工费0.1比特币)”这样的交易它将生成交易的奖励发送到自己的钱包。A 挖出一个区块所获得的奖励金额是 coinbase 奖励(25 个全新比特币)和该区块所有交易的矿工费之和。

3 积木

节点 A 已经构建了一个候选区块,然后轮到 A 的矿工“挖掘”这个新区块并解决工作量证明算法以使该区块有效。比特币挖掘过程使用 SHA256 哈希函数。

用最简单的术语来说,挖掘节点不断重复尝试,直到找到一个随机调整来产生低于某个目标的哈希值。哈希函数的结果是无法提前知道的,也不存在导致特定哈希值的模式。比如你一个人在家里打台球,白球从A点到B点,但是一个人推门看到B点的白球,却不知道怎么从A点到B点反正。散列函数的这一特性意味着获得散列值的唯一方法是不断尝试,每次随机修改输入,直到出现合适的散列值。

以下参数是必需的

• 块的版本

• 前一个区块的哈希值:prev_hash

• 待写入交易记录的哈希树值:merkle_root

• 更新时间:ntime

• 当前难度:nbits

挖掘的过程是找到 x 使得

SHA256(SHA256(版本 + prev_hash + merkle_root + ntime + nbits + x )) \< 目标

上式中x的范围是0~2^32,TARGET可以根据当前难度计算。

作为一个简单的类比,想象一个游戏,人们不断掷骰子以获得少于一定数量的点数。在第一局中,目标是 12。只要你没有掷出两个 6,你就赢了。那么接下来的游戏目标是11。玩家只能通过折腾10分或更少才能获胜,但这很简单。假设目标在几轮后减少到 5。现在有一半的机会掷出的骰子加起来超过5分,所以无效。随着目标变小,掷骰子的次数会成倍增加以赢得胜利。最后,当目标是 2(可能的最小点数)时,一个人只有平均投掷 36 次或 2% 的次数才能获胜。

3.1 难度调整

如前所述,目标决定难度,进而影响解决工作量证明算法所需的时间。那么问题来了:为什么这个难度值是可调的?谁来调整?如何调整?

比特币区块平均每 10 分钟生成一次。这是比特币的心跳,是货币发行速度和交易速度的基础。不仅在短期内,而且必须在几十年内保持不变。在此期间,计算机性能将迅速提高。此外,参与挖矿的人和计算机也在不断变化。为了保持 10 分钟的出块率,必须根据这些变化调整挖矿难度。事实上,难度是一个动态参数,它会定期调整,以达到每 10 分钟一个新区块的目标。简而言之,难度设置为使新块的速率保持在每 10 分钟一个,而与挖矿能力无关。

那么,在一个完全去中心化的网络中,如何进行这样的调整呢?难度调整在每个完整节点中独立且自动发生。所有节点每 2,016 个区块(2 周产生的区块)调整难度。难度调整公式是通过将最近的 2,016 个区块的经过时间与 20,160 分钟(两周,即这些区块以 10 分钟的速度预计需要多长时间)进行比较来计算的。根据实际持续时间与所需持续时间的比率调整难度(更难或更容易)。简单来说,如果网络发现出块速度快于 10 分钟,就会增加难度。如果你发现它慢于 10 分钟,请降低难度。

为了防止难度变化过快,每个周期的调整幅度必须小于一个因子(值 4))。如果调整大于4倍,则调整4倍。由于在下一个周期2016个区块的不平衡会继续,所以在下一个周期会进行进一步的难度调整。因此,可能需要几个 2,016 个区块周期才能平衡哈希算力和难度的巨大差异。

3.2 成功构建块

例如,当前节点 A 正在挖掘 277,316 个区块。一旦挖矿节点 A 完成计算,它会立即将此块发送给它的所有相邻节点。在接收和验证这个新块之后最后一个比特币,这些节点也继续传播这个块。当这个新区块在网络中扩散时,每个节点会将其作为第 277,316 个区块(父区块为 277,315))添加到自己节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,他们放弃之前的计算来构建这个相同高度的区块,并立即开始计算区块链中的下一个区块。

3.3 验证新块

比特币共识机制的第三步是由网络中的每个节点独立验证每个新区块。当一个新块在网络中传播时,每个节点都会运行一系列测试来验证它,然后再将其转发给它的对等节点。这确保了只有有效的块才能通过网络传播。

每个节点对每个新区块的独立验证确保矿工无法作弊。在前面的章节中,我们看到了矿工如何记录交易以接收新的比特币以及在该区块中创建的交易费用。为什么矿工不为自己记录一笔交易以获得数千比特币?这是因为每个节点都根据相同的规则验证块。一个无效的 coinbase 交易将使整个区块失效,这将导致该区块被拒绝,因此该交易不会成为分类账的一部分。

4、区块链组装与选择

比特币去中心化共识机制的最后一步是将区块聚合到具有最大工作量证明的链中。一旦一个节点验证了一个新区块,它就会尝试将新区块连接到现有区块链,并组装它们。

节点维护三种类型的块:

有时,新区块扩展的区块链不是主链,我们将在下面的“区块链分叉”中看到。

如果一个节点在现有区块链中没有找到它的父节点接收到一个有效块,则该块被认为是一个“孤儿”。孤立块被保存在孤立块池中,直到它们的父块被节点接收。一旦收到父块并将其附加到现有区块链,节点就会从孤立池中取出孤立块并将其附加到其父块,使其成为区块链的一部分。当两个区块在很短的时间间隔内被挖出时,节点有可能以相反的顺序接收它们,此时就会出现孤块现象。

在选择难度最大的区块链后,所有节点最终在全网达成共识。随着更多工作量证明添加到链中,链中的临时差异最终将得到解决。挖矿节点“投票”选择他们想要扩展的区块链,当他们挖掘一个新区块并扩展一条链时,新区块本身就代表了他们的投票。

4.1 区块链分叉

因为区块链是去中心化的数据结构,所以它们在副本之间并不总是一致的。块可能在不同的时间到达不同的节点,从而导致节点具有不同的区块链视角。解决方案是每个节点总是选择并尝试扩展代表最大累积工作量证明的区块链,即具有最长或最大累积难度的链。

当有两个候选块想要同时扩展最长的链时,就会发生分叉事件。通常,当两个矿工在相对较短的时间内各自拥有工作量证明解决方案时,就会发生分叉。一旦两个矿工在各自的候选区块中找到解决方案,他们就会立即将他们的“获胜”区块传播到网络,首先传播到相邻节点,然后传播到整个网络。每个接收到有效块的节点都会合并它并扩展区块链。如果该节点随后收到另一个候选块,并且该块具有相同的父块,则该节点将该块连接到候选链。结果,一些节点收到一个候选块,而另一些节点收到另一个候选块,此时出现了两个不同版本的区块链。

前叉

分叉开始

我们看到两个矿工几乎同时开采两个不同的区块。为了便于跟踪这个分叉事件,我们将一个来自加拿大的区块标记为红色,一个来自澳大利亚的区块标记为绿色。

假设有这样一种情况,加拿大的矿工找到了“红色”区块的工作量证明解决方案,将链延伸到“蓝色”父区块上。大约在同一时间,一位澳大利亚矿工找到了“绿色”区块的解决方案,并且还扩展了“蓝色”区块。所以现在我们有两个区块:一个是来自加拿大的“红色”区块;另一个是源自澳大利亚的“绿色”区块。两个块都是有效的,都包含有效的工作证明解决方案并扩展了相同的父块。这两个区块可能包含几乎相同的交易,交易的顺序略有不同。

分叉导致网络分裂

比特币网络中与加拿大相邻(拓扑相邻,而非地理相邻)的节点将首先收到“红色”区块,并创建一个累积难度最大的区块。“红色”块是链的块。最后一个块(蓝红色),同时忽略稍后到达的“绿色”块。相比之下最后一个比特币,更接近澳大利亚的节点将决定“绿色”区块获胜并将区块链(蓝绿色)作为最后一个区块,忽略几秒钟后到达的“红色”区域元。那些最先收到“红色”块的节点会立即使用这个块作为父块来生成一个新的候选块,并尝试为这个候选块找到一个工作量证明的解决方案。同样,接受“绿色”的节点

新区块扩展分支

分叉几乎总是在一个块内解决。网络的一部分计算能力专用于“红色”块,它们是构建新块的父块;计算能力的另一部分专用于“绿色”块。即使计算能力在两个阵营之间平分,一个阵营总是会在另一个阵营之前找到并传播工作量证明解决方案。在这个例子中我们可以打个比方,如果矿工在一个“绿色”区块上工作,发现一个“粉色”区块扩展了区块链(蓝-绿-粉色),他们会立即传播这个新区块,整个网络都会考虑这个区块有效,如上图所示。

重新共识

在上一轮中选择“绿色”区块作为获胜者的所有节点将简单地将链扩展一个区块。然而,那些选择“红色”区块作为获胜者的节点现在将看到两条链:“蓝-绿-粉”和“蓝-红”。如上图所示,这些节点会根据结果将“blue-green-pink”链设置为主链,将“blue-red”链设置为备用链。这些节点接受新的更长的链,并被迫改变他们对区块链的原始看法,这被称为链重新共识。因为作为父块的“红”块不再在最长链上,它们的候选块变成了“孤块”,所以现在谁本来想扩展“蓝红”上的块 chain 区块链的矿工全部停止。全网将“蓝-绿-粉红”链识别为主链,“粉红”区块是这条链的最后一个区块。所有矿工立即将其候选区块的父区块切换为“粉红色”,以扩展“蓝-绿-粉”链。

从理论上讲,两个区块的分叉是可能的,当矿工因为前一个分叉而相互反对时,几乎同时发现两个不同区块的解决方案时,就会发生这种情况。但是,这种情况发生的可能性非常低。每周都会发生单块分叉,而双块分叉非常罕见。

比特币的出块间隔设计为 10 分钟,这是更快的交易确认和更低的分叉概率之间的折衷。更短的区块生成间隔将导致更快的交易结算和更频繁的区块链分叉。相反,更长的时间间隔会减少分叉的数量,但会导致更长的清算时间。

参考:

什么是 UTXO

默克尔树在区块链中的应用