主页 > imtoken钱包苹果手机下载 > 比特币和区块链(3):比特币的共识机制

比特币和区块链(3):比特币的共识机制

imtoken钱包苹果手机下载 2023-04-27 07:55:42

简介

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

比特币共识

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

比特币的共识与之前的不同,它使用了工作量证明(POW)算法。

比特币的去中心化共识是由所有网络节点的4个独立进程交互产生的:

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

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

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

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

交易验证

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

每个收到交易的比特币节点都会先对交易进行验证,然后再将其传递给相邻节点,这将确保只有有效的交易会在网络中传播,而无效的交易会在节点处被丢弃。

加入比特币的流程

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

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

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

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

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

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

▷nLockTime 小于或等于 INT_MAX。

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

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

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

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

加入比特币的流程

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

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

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

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

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

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

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

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

经过这么多长校验和后,交易已准备好写入区块。

构建块

验证交易后,比特币节点将这些交易添加到自己的内存池中。 mempool,也称为交易池,用于临时存储尚未加入区块的交易记录。与其他节点一样加入比特币的流程,挖矿节点收集、验证和中继新交易。与其他节点不同的是,挖矿节点会将这些交易整合到一个候选区块中。

加入比特币的流程

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

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

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

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

区块验证

交易打包到区块后,区块会被广播,收到区块的节点会验证区块。

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

这些标准在比特币核心客户端的 CheckBlock 和 CheckBlockHead 函数中可用,包括:

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

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

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

加入比特币的流程

▷ 块大小在长度限制内

▷ 第一个交易(并且只有第一个)是 coinbase 交易

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

区块链的分叉

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

在第一张图中,网络对区块链有统一的看法,蓝色的块是链的“顶点”

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

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

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

因此,一些节点收到一个候选块,而另一些节点收到另一个候选块,此时出现两个不同版本的区块链。

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

加入比特币的流程

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

但是,那些选择“红色”区块作为获胜者的节点现在将看到两条链:“blue-green-pink”和“blue-red”。

如图所示,这些节点会根据结果将“blue-green-pink”链设置为主链,将“blue-red”链设置为备用链。这些节点接受新的更长的链,并被迫改变他们对区块链的原始看法,这称为链重新共识。

因为作为父区块的“红色”区块不再在最长链上,它们的候选区块都变成了“孤儿区块”加入比特币的流程,所以现在任何原本想在“蓝-红”链上的区块矿工扩展区块链全部停止。

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

区块链分叉的类型

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

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

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

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

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

总结

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