区块链网站|NFTS BTC教学指南 区块链系列教程1:比特币中的共识

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

广告位

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

比特币的P2P网络,你们是如何达成共识的?需要核实哪些交易才能达成共识?交易和阻止如何扩散到整个区块链网络?看完这篇文章你就明白了。

比特币中的共识在讲分布式系统之前,我讲过几种分布式系统的共识算法,包括raft,Paxos,拜占庭容错算法。

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

比特币去中心化的共识是由所有网络节点的四个独立过程相互作用产生的:

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

通过检查工作量证明算法,挖掘节点独立地将事务记录打包到新块中。

每个节点独立检查新块,并将其组装到区块链中。

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

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

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

在验证每笔交易时,每个节点都需要对照一长串标准进行检查:

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

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

事务的字节大小小于MAX_BLOCK_SIZE。

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

没有hash等于0且n等于-1的输入(不应中继coinbase事务)。

nLockTime小于或等于INT_MAX。

事务的字节大小大于或等于100。

事务中的签名数应小于最大签名操作数。

解锁脚本(scriptSig)只能将数字推入堆栈,锁脚本(scriptPubkey)必须符合isStandard的格式(会拒绝不标准的事务)。

池或主分支块中必须存在匹配的事务。

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

对于每个输入,在主分支和事务池中找到被引用的输出事务。如果输出事务缺少任何输入,它将成为一个孤立的事务。如果匹配的事务没有出现在池中,它将被添加到隔离事务池中。

对于每个输入,如果引用的输出事务是coinbase输出,则输入必须至少获得COINBASE_MATURITY (100)确认。

对于每个输入,引用的输出必须存在并且不被消耗。

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

如果输入值的总和小于输出值的总和,事务将被中止。

如果交易成本太低,无法进入空区块,交易将被拒绝。

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

经过这么多长时间的检查后,事务就可以写入块中了。

在构造块验证交易后,比特币节点会将这些交易添加到自己的内存池中。内存池,也称为事务池,用于临时存储尚未添加到块中的事务记录。像其他节点一样,挖掘节点收集、验证和中继新的事务。与其他节点不同,挖掘节点会将这些事务集成到一个候选块中。

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

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

如果块中还有剩余空间,挖掘节点可以选择那些不包括矿工费用的事务。一些矿商会尽力将那些没有矿商费用的交易整合到区块中,而另一些矿商可能会选择忽略这些交易。

在一个块被填满之后,内存池中剩余的事务将成为下一个块的候选事务。因为这些事务仍然在内存池中,所以随着新的块被添加到链中,这些事务引用的UTXO的深度(即事务“块年龄”)也会增加。因为事务的优先级值取决于它输入的“块年龄”,所以这个事务的优先级值也增加了。最后,零矿工费交易的优先级值可能满足高优先级的阈值,并被免费打包到块中。

将事务打包到块中后,将广播该块,接收该块的节点将检查该块。

当一个节点接收到一个新的块时,它将对照一长串标准来验证该块。如果未能通过验证,该块将被拒绝。

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

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

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

数据块时间戳比验证时间早两个小时(允许的时间误差)

块大小在长度限制内。

第一个事务(也只有第一个)是coinbase事务。

使用核对表核实区块内的交易并确保其有效性。

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

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

当两个候选块想要同时扩展最长的区块链时,就会发生分叉。在正常情况下,当两个矿工在短时间内制定出工作量证明解决方案时,就会出现分叉。

两个矿工一在各自的候选块中找到解,就立刻把自己的“获胜”块传播到网络,先传播到邻居节点,再传播到整个网络。

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

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

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

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

然而,那些选择“红色”块作为获胜者的节点现在将看到两个链:“蓝绿色粉红色”和“蓝红色”。

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

因为作为父区块的“红色”区块已经不在最长的链上,他们的候选区块已经成为“孤儿区块”,所以现在任何原本想在“蓝红色”链上延长区块链的矿工都会止步。

全网公认“蓝-绿-粉”链为主链,“粉”块是这个链的最后一块。所有矿工立即将他们生成的候选块的父块切换到“粉色”,以延长“蓝绿色粉色”链。

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

硬分叉是当比特币协议规则改变时,旧节点拒绝接受新节点创建的块的情况。违反规则的块将被忽略,矿工将根据他们的规则集在他们最后见证的块之后创建块。

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

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

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

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

本文作者:关于flydean计划的那些事

本文链接:http://www.flydean.com/bitcoin-consensus/

来源:flydean的博客

欢迎关注我的微信官方账号:节目,更多精彩等着你!

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/btb/btbjiaoxue/48557.html
上一篇
下一篇

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

返回顶部