主页 > imtoken钱包官网版最新 > 区块链教程系列:比特币的共识

区块链教程系列:比特币的共识

imtoken钱包官网版最新 2023-06-19 07:55:02

介绍

比特币 P2P 网络如何达成共识? 需要验证哪些交易才能达成共识? 交易和区块如何传播到整个区块链网络? 看完这篇文章你就会明白了。

比特币共识

之前讲分布式系统的时候讲了几种分布式系统的共识算法,包括raft、Paxos和拜占庭容错算法。

比特币的共识和我之前说的不一样,它使用的是工作量证明(POW)算法。

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

▷ 每个全节点根据综合标准独立验证每笔交易

▷ 通过完成工作量证明算法的验证,挖矿节点自主将交易记录打包到新区块中

▷ 每个节点独立验证新区块并组装到区块链中

▷ 每个节点独立选择区块链,在工作量证明机制下选择累计工作量最大的区块链

更多精彩内容请看:

交易验证

在比特币网络中,交易由网络中的节点独立验证。

在交易被传递到相邻节点之前,每个接收到交易的比特币节点都会先对交易进行验证,这将确保只有有效的交易才会在网络中传播,无效的交易将被发送到第一个被放弃的节点。

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

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

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

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

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

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

▷nLockTime 小于或等于 INT_MAX。

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

▷ 一笔交易的签名数应小于签名操作数上限。

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

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

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

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

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

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

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

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

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

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

经过如此多的长时间检查,交易已准备好写入区块。

砌块施工

验证交易后比特币系统接收区块链流程,比特币节点将这些交易添加到它们的内存池中。 内存池又称交易池,用于暂存尚未加入区块的交易记录。 与其他节点一样,挖矿节点收集、验证和中继新交易。 与其他节点不同,挖矿节点会将这些交易整合到一个候选区块中。

比特币节点需要为内存池中的每笔交易分配一个优先级,并选择更高优先级的交易记录来构建候选区块。 交易的优先级由交易输入花费的 UTXO 的“区块年龄”决定。 具有高交易输入值和大“区块年龄”的交易比那些输入值较小的新交易具有更高的优先级。 如果区块中有足够的空间,高优先级交易将不需要 gas 费。

然后,挖矿节点会选择那些包含最小矿工费的交易,并按照“每千字节矿工费”排序,选择矿工费最高的交易填充剩余的区块。 块大小的上限是 MAX_BLOCK_SIZE 。

如果区块中还有剩余空间,挖矿节点可以选择那些不包含gas费的交易。 一些矿工会竭尽全力将不包含 gas 费用的交易包含在区块中,而其他矿工可能会选择忽略这些交易。

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

区块验证

交易被打包到区块中后,将广播该区块,接收到该区块的节点将对该区块进行验证。

当一个节点收到一个新块时,它会根据一长串标准验证该块,如果验证失败,该块将被拒绝。

这些标准在 Bitcoin Core 客户端的 CheckBlock 函数和 CheckBlockHead 函数中可用,其中包括:

▷ 块数据结构在语法上是有效的

▷ 区块头的哈希值小于目标难度(确认包含足够的工作量证明)

▷ 区块时间戳比验证时间早两个小时(允许时间误差)

▷ 块大小在长度限制内

▷ 第一笔交易(而且只有第一笔)是 coinbase 交易

▷ 使用清单来验证区块内的交易并确保其有效性

区块链分叉

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

在第一个图中,网络对区块链有一个统一的看法,以蓝色区块作为主链的“顶点”

比特币等于区块链吗_区块链与比特币的联系_比特币系统接收区块链流程

当有两个候选块同时想要扩展最长的区块链时,就会发生分叉事件。 通常,当两个矿工在短时间内各自拥有工作量证明解决方案时,就会出现分叉。

一旦两个矿工在各自的候选区块中找到解决方案,他们就会立即将他们的“获胜”区块传播到网络,首先传播到相邻节点,然后传播到整个网络。

每个接收到有效块的节点都将合并它并扩展区块链。 如果该节点随后收到另一个具有相同父块的候选块,该节点将把这个块连接到候选链。

结果,一些节点收到一个候选块,一些节点收到另一个候选块,两个不同版本的区块链就出现了。

比特币系统接收区块链流程_比特币等于区块链吗_区块链与比特币的联系

如果在“绿色”区块上工作的矿工发现了一个扩展区块链的“粉色”区块(蓝-绿-粉),他们将立即传播新区块,整个网络将认为这个区块是有效的。

比特币系统接收区块链流程_区块链与比特币的联系_比特币等于区块链吗

所有在上一轮中选择“绿色”区块作为获胜者的节点将直接将链延长一个区块。

然而比特币系统接收区块链流程,那些选择“红色”块作为赢家的节点现在将看到两条链:“蓝-绿-粉”和“蓝-红”。

如图所示,这些节点会根据结果将“蓝-绿-粉”链设置为主链,将“蓝-红”链设置为备链。 这些节点接受了新的和更长的链,并被迫改变了他们对区块链的原有看法。 这称为链的重新共识。

因为“红色”区块不再作为父区块在最长链上,他们的候选区块就变成了“孤块”,所以现在任何原本想在“蓝-红”链上扩展区块的矿工们区块链将停止。

全网将“蓝-绿-粉”链作为主链,“粉”区块是这条链的最后一个区块。 所有矿工立即将其候选块的父块切换为“粉红色”以扩展“蓝-绿-粉”链。

比特币等于区块链吗_区块链与比特币的联系_比特币系统接收区块链流程

区块链分叉的类型

一般来说,区块链分叉可以分为两种:

硬分叉是指比特币协议的规则发生变化,旧节点拒绝接受新节点创建的区块。 违反规则的区块将被忽略,矿工将遵循他们的规则集并在他们看到的最后一个区块之后创建区块。

软分叉是当比特币协议的规则发生变化时,旧节点不会意识到规则不同,它们会遵循改变后的规则集,继续接受新节点创建的区块。 矿工们可能正在处理他们根本不了解或尚未验证的区块。

通过硬分叉,区块链不再是原来的区块链。

区块链与比特币的联系_比特币等于区块链吗_比特币系统接收区块链流程

从上图可以看出,比特币从原始版本发展了很多分叉,它们的本质是一样的。 问题是你认可哪条链。

总结

本文介绍了区块链的共识机制,以及交易的验证步骤,最后讲解了区块链的分叉。 希望大家喜欢。