专栏首页程序那些事比特币中的共识

比特币中的共识

简介

在比特币的P2P网络中是怎么达成共识的呢?达成共识需要做哪些交易的校验呢?交易和区块是怎么传播到整个区块链网络的呢?看完这篇文章你就明白了。

比特币中的共识

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

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

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

▷ 每个全节点依据综合标准对每个交易进行独立验证

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

▷ 每个节点独立的对新区块进行校验并组装进区块链

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

交易的校验

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

在交易传递到临近的节点前,每一个收到交易的比特币节点将会首先验证该交易,这将确保只有有效的交易才会在网络中传播,而无效的交易将会在第一个节点处被废弃。

每一个节点在校验每一笔交易时,都需要对照一个长长的标准列表:

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

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

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

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

▷没有哈希等于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-tech),作者:程序那些事

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Libra教程之:Transaction的生命周期

    本文会以一个提交到Libra validator的transaction为例,来讲解Transaction和其他组件的交互,和具体的状态变化过程。

    程序那些事
  • Libra教程之:Libra协议的关键概念

    Libra协议是Libra区块链的基础,本文主要讲解Libra协议的一些关键概念。

    程序那些事
  • 在java中构建高效的结果缓存

    缓存是现代应用服务器中非常常用的组件。除了第三方缓存以外,我们通常也需要在java中构建内部使用的缓存。那么怎么才能构建一个高效的缓存呢? 本文将会一步步的进行...

    程序那些事
  • 加米谷大数据携手成都商报财富沙龙第四期:区块链技术专题沙龙如期举行

    6月28日下午,由成都商报主办、加米谷大数据机构和茂烨智能控股公司共同承办的大型全民公益活动——“商报财富沙龙”第四期如期顺利举行。

    加米谷大数据
  • 深圳区块链技术开发公司,区块链技术受到热议,区块链应用领域有哪些?

    区块链说到底更是一种观念,用技术设计取代权威控制和情感信任,以此建立一种网络结构,所有人都可以参与成为无数节点之一,进行认证、确权、交易、追溯和调整等一系列动作...

    qq-2723379296
  • 敬畏技术:欧科云链OKLink如何重塑区块链?

    最近,区块链行业有两个蛮有意思的事情,可以对照着看。一个是沉寂了三年的薛蛮子重新出山投资了阿波罗APOLLO公链,一个是OKLink推出“起源计划”布局生态战略...

    晓枫说
  • 欧科云链“掘金”新基建:区块链+时代要来了

    区块链在中国已有近十年的发展历史。在大众眼里,区块链一度等同于炒币,那是一个稍显混乱的代名词,也是对懵懂奔跑中的区块链的短暂误解。

    晓枫说
  • 腾讯区块链加速器复试开启

    今年4月,区块链被正式纳入新基建“国家队”,在国家政策和技术演化的双轮驱动下,呈现出井喷之势。

    腾讯云区块链
  • 精耕技术,区块链回归实体经济的破局点

    中本聪真正给我们带来的其实是数字货币,只不过是建构在数字货币之下的是一种全新的技术类型,它便是区块链。正是因为如此,我们才会始终都将数字货币与区块链进行密切关联...

    孟永辉
  • 正在成熟的区块链,正在转变的竞争态势

    区块链与产业的深度融合才是它能够行稳致远的关键所在,这是产业互联网之所以出现的根本原因所在。从深层次的逻辑上来看,这同样是区块链技术开始成熟的重要标志。因为只有...

    孟永辉

扫码关注云+社区

领取腾讯云代金券