主页 > 怎么在华为下imtoken > 区块链教程系列:比特币共识

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

怎么在华为下imtoken 2023-01-17 03:14:38

简介

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

比特币共识

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

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

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

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

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

▷ 每个节点独立验证新块并将它们组装成新块。区块链

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

交易验证

p>

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

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

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

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

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

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

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

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

▷nLockTime 小于或等于 INT_MAX。

▷以字节为单位的事务大小大于或等于100。

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

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

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

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

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

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

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

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

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

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

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

经过这么多长时间的检查,交易就可以被写入区块了。

方块构造

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

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

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

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

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

区块验证

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

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

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

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

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

▷ 区块时间戳比验证时间提前两个小时(考虑到时间错误)

▷ 块大小在长度限制内

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

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

区块链分叉

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

在第一张图中,网络有一个统一的区块链视角,蓝色区块作为主链的“顶点”

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

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

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

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

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

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

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

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

因为作为父区块的“红色”区块不再位于最长链上,它们的候选区块已成为“孤立区块”,所以现在任何原本想在“蓝色”中的区块 - 红色的矿工" 延伸区块链的链将全部停止。

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

区块链分叉的类型

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

p>

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

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

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

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

总结

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