主页 > imtoken钱包和tp钱包对比 > 比特币挖矿和共识

比特币挖矿和共识

imtoken钱包和tp钱包对比 2023-06-29 14:45:33

很多人都知道比特币,即区块链。但是整个网络如何保证这种去中心化呢?可能很多人不知道,或者想知道却不知道从何下手。其实,从挖矿的角度去理解区块链,会更好的把握关键点。懂挖矿,就懂区块链和去中心化。

简介

区块链可以被认为是所有交易的公共分类账(列表),比特币网络中的每个参与者都将其视为所有权的权威记录。

比特币没有中央权威,几乎所有全节点都有公共账本的备份副本,可以认为是经过身份验证的记录。

到目前为止,对主链区块链的攻击还没有一次成功,甚至一次也没有。

通过创建新区块,比特币以确定性但不断下降的速度铸造。大约每十分钟产生一个新区块,每个新区块都伴随着一定数量的全新比特币,这些比特币是从零开始创建的。每挖出 210,000 个区块,大约需要 4 年,货币发行率下降 50%。

在 2016 年的某个时候,在第 420,000 个区块被“开采”后,它下降到 12.5 个比特币/块。在第 13,230,000 个区块(大约在 2137 年开采)之前,新币的发行率呈指数级“减半”64 倍。届时,每块发行的比特币数量成为比特币的最小货币单位——1聪。最终,在 1344 万个区块之后,所有 20,999,999.9769 satoshis 将被发行。换句话说,到 2140 年左右,将有接近 2100 万比特币。之后,新区块不再包含比特币奖励,矿工的所有收入都来自交易费用。

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

1、独立验证

每个节点收到交易后,会在全网广播之前验证这些交易,并按照相应的接收顺序建立一个有效的新交易池(交易池)。

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

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

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

▷交易的字节大小小于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)。

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

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

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

2、将交易记录独立打包到新区块中

以下挖矿节点命名为挖矿节点A

挖矿节点一直在监控传播到比特币网络的新区块。而这些新增的区块对于挖矿节点来说是非常重要的。有着特殊的意义。矿工之间的竞争以新区块的传播结束,仿佛在宣布谁是最终的赢家。对于矿工来说,获得一个新区块意味着一个参与者获胜,而他们输掉了这个。但是,一轮比赛的结束也标志着下一轮比赛的开始。

验证交易后,比特币节点将这些交易添加到自己的内存池中。 mempool也叫作交易池,用来临时存放尚未加入区块的交易记录。

2.1个交易区块年龄、矿工费和优先级

节点A需要为内存池级别的每笔交易分配一个优先级,并选择优先级更高的交易记录来构建候选区块。

要让一笔交易成为“更高优先级”,必须满足的条件:优先级值大于 57,600,000,而这个值的产生取决于 3 个参数:一个比特币(即 1 亿聪), age 一天(144 个区块),交易大小为 250 字节:

高优先级 > 100,000,000 satoshis * 144 块 / 250 字节 = 57,600,000

在块中使用 存储事务的前 50K 字节保留给更高优先级的事务。节点在填充 50K 字节时会优先处理这些最高优先级的交易,无论是否包含矿工费。即使矿工费用为零,这种机制也允许首先处理高优先级交易。

然后,挖矿节点A会选择那些矿工费最小的交易,按照“每千字节的矿工费”排序,优先让矿工费最高的交易填满剩余区域。元。

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

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

UTXO(Unspent Transaction Output):每笔交易都有若干个交易输入,即资金来源,也有若干个交易输出,即资金去向。一般来说,每笔交易都会花费一个输入并产生一个输出,而产生的输出就是“未花费的交易输出”,也就是UTXO。

块龄:一个UTXO的“块龄”是自UTXO被记录在区块链以来所经历的块数,即UTXO在区块链中的深度。

2.2 Coinbase 交易

区块中的第一笔交易是一种特殊的交易,称为 coinbase 交易或 coinbase 交易。该交易由挖矿节点构建,用于奖励矿工的贡献。假设此时一个区块的奖励是25比特币,节点A挖矿会创建“向A的地址支付25.1比特币(包括矿工费0.1比特币)”这样的交易它将生成交易的奖励发送到自己的钱包。 A挖出一个区块所获得的奖励金额是coinbase奖励(25个全新比特币)和该区块所有交易的矿工费之和。

3 构建块

节点 A 已经构建了一个候选区块,然后轮到 A 的矿工“挖掘”这个新区块并解决工作量证明算法以使该区块有效。比特币挖矿过程使用SHA256哈希函数。

用最简单的术语来说,挖掘节点不断重复尝试,直到找到随机数量的调整,导致哈希低于某个目标。哈希函数的结果是无法提前知道的,也不存在导致特定哈希值的模式。比如你一个人在家里打台球,白球从A点到B点,但是一个人推门看到B点的白球,却不知道怎么从A点到B点反正。散列函数的这一特性意味着获得散列值的唯一方法是不断尝试,每次随机修改输入,直到出现合适的散列值。

以下参数是必需的

• 阻止版本

• 前一个区块的哈希值:prev_hash

• 需要写入交易记录的哈希树的值:merkle_root

• 更新时间:ntime

• 当前难度:nbits

挖掘的过程就是找到x使得

p>

SHA256(SHA256(版本 + prev_hash + merkle_root + ntime + nbits + x )) \<目标

上式中x的取值范围为0~2^32,TARGET可以根据当前请求的难度。

作为一个简单的类比,想象一个游戏,人们不断掷骰子以获得少于一定数量的点数。在第一局中,目标是 12。只要你没有掷出两个 6,你就赢了。那么接下来的游戏目标是11。玩家只能通过折腾10分或更少才能获胜,但这很简单。假设目标在几轮后减少到 5。现在有一半的机会掷出的骰子加起来超过5分,所以无效。随着目标变小,掷骰子的次数会成倍增加以赢得胜利。最后,当目标是 2(可能的最小点数)时,一个人只有平均投掷 36 次或 2% 的次数才能获胜。

3.1 难度调整

如前所述,目标决定难度,进而影响解决工作量证明算法所需的时间。那么问题来了:为什么这个难度值是可调的?谁来调整?如何调整?

比特币区块平均每 10 分钟生成一次。这是比特币的心跳,是货币发行速度和交易速度的基础。不仅在短期内,而且必须在几十年内保持不变。在此期间,计算机性能将迅速提高。此外,参与挖矿的人和计算机也在不断变化。为了保持 10 分钟的出块率,必须根据这些变化调整挖矿难度。事实上,难度是一个动态参数,它会定期调整,以达到每 10 分钟一个新区块的目标。简单地说,难度是这样设置的,不管算力如何,新块的速率保持在每 10 分钟一个。

那么,在一个完全去中心化的网络中,如何进行这样的调整呢?难度调整在每个完整节点中独立且自动发生。所有节点每 2,016 个区块(2 周产生的区块)调整难度。难度调整公式是通过将最近 2,016 个区块的经过时间与 20,160 分钟(两周,即这些区块以 10 分钟的速度预计需要多长时间)进行比较来计算的。根据实际持续时间与所需持续时间的比率调整难度(更难或更容易)。简单来说,如果网络发现出块速度快于 10 分钟,就会增加难度。如果你发现它慢于 10 分钟,请降低难度。

为了防止难度变化过快,每个周期的调整范围必须小于一个因子(值4)。如果调整范围大于4倍,则调整4倍。由于不平衡会在下一个2016个区块的周期中继续,所以下个周期会进一步调整难度。所以可能需要几个2016个区块周期才能平衡哈希算力和难度的巨大差异才能完成。

3.2 成功构建区块

例如凯比特预测,节点 A 当前正在挖掘 277,316 个区块。一旦挖矿节点 A 完成计算,它会立即将这个转换块发送给它的所有邻居。在接收和验证这个新块之后,这些节点也继续传播这个块。当这个新区块在网络中扩散时,每个节点都会把它作为第 277,316 个区块(父区块为 277,315) 添加到自己节点的区块链副本中。当挖矿节点收到并验证这个新区块后,他们将放弃之前构建这个相同高度区域的努力。区块的计算并立即开始计算区块链中下一个区块的工作。

3.3 验证新区块

比特币共识机制的第三部分第一步是由网络中的每个节点独立地验证每个新块。当一个新块在网络中传播时,每个节点都会执行一系列测试来验证它,然后再将其转发给它的对等节点。这确保了这意味着只有有效的块才能通过网络传播。

每个节点对每个新区块的独立验证确保矿工无法作弊。在前面的章节中,我们看到了矿工如何 Go 记录交易以获取新的比特币和在该区块中创建的交易费用。为什么矿工不为自己记录一笔交易以获得数千比特币?这是因为根据 coinbase 的规则,每个节点都基于相同的 Validate 块。无效的 coinbase 交易会使整个区块失效,从而导致区块被拒绝,因此该交易不会成为账本的一部分。

4、区块链组装与选择

比特币去中心化共识机制的最后一步是将区块组装到具有最大工作量证明的链中。一旦一个节点验证了一个新区块,它就会尝试将新区块连接到现有区块链,并组装它们。

节点维护三种类型的块:

有时候,新区块扩展出来的区块链并不是主链,我们会在下面的“区块链分叉”中看到。

如果节点收到一个有效区块,并且如果在现有区块链中找不到其父区块,则该区块被视为“孤块”。孤立块被保存在孤立块池中,直到它们的父块被节点接收。一旦收到父块并将其附加到现有区块链,节点就会从孤块池中删除孤块,并连接到其父块,使其成为区块链的一部分。当两个区块在很短的时间间隔内被挖出时,节点有可能以相反的顺序接收它们,此时就会出现孤块现象。

在选择难度最大的区块链后,所有节点最终在全网范围内达成共识。随着更多工作量证明添加到链中,链中的临时差异最终将得到解决。挖矿节点“投票”选择他们想要扩展的区块链凯比特预测,当他们挖掘一个新区块并扩展一个链时,新区块本身就代表了他们的投票。

4.1 区块链分叉

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

当有两个候选块同时想要扩展最长的链时,就会发生分叉事件。通常,当两个矿工在相对较短的时间内各自拥有工作量证明解决方案时,就会发生分叉。一旦两个矿工在各自的候选区块中找到解决方案,他们就会立即将他们的“获胜”区块传播到网络,首先传播到相邻节点,然后传播到整个网络。每个接收到有效块的节点都会合并它并扩展区块链。如果该节点随后收到另一个候选块,并且该块具有相同的父块,则该节点将该块连接到候选链。结果,一些节点收到一个候选块,而另一些节点收到另一个候选块,此时出现了两个不同版本的区块链。

分叉前

分叉的开始

我们看到两个矿工几乎同时开采两个不同的区块。为便于跟踪此分叉事件,我们将来自加拿大的一个区块标记为红色,将来自澳大利亚的一个区块标记为绿色。

假设有这样一种情况,加拿大的矿工为“红色”区块找到了工作量证明解决方案,在“蓝色”父区块上扩展了链。大约在同一时间,一位澳大利亚矿工找到了“绿色”区块的解决方案,并且还扩展了“蓝色”区块。所以现在我们有两个区块:一个是来自加拿大的“红色”区块;另一个是源自澳大利亚的“绿色”区块。两个块都是有效的,都包含有效的工作证明解决方案并扩展了相同的父块。这两个区块可能包含几乎相同的交易,只是交易的顺序略有不同。

分叉导致网络分裂

加拿大在比特币网络中的邻近度(拓扑邻近度,不是地理邻近度)链的节点将首先收到“红色”区块,并构建累积难度最大的区块。 “红色”块是链的最后一个块(蓝-红色),忽略稍后到达的“绿色”块。 “块。相反,靠近澳大利亚的节点将决定“绿色”块获胜并将区块链(蓝绿色)作为最后一个块,忽略几秒钟后到达的“红色”区域元。那些最先收到“红色”区块的节点将立即使用该区块作为父区块来生成新的候选区块,并尝试为该候选区块找到工作量证明解决方案。同样,接受“绿色”区块的节点区块会开始生成新区块,并以此区块为链的顶点,延伸链。

新区块扩展了分叉

分叉问题几乎总是在一个块中解决。网络的一部分计算能力专用于“红色”块,它们是构建新块的父块;计算能力的另一部分专用于“绿色”块。即使计算能力在两个阵营之间平分,一个阵营总是会在另一个阵营之前找到并传播工作量证明解决方案。在这个例子中我们可以打个比方,如果矿工在一个“绿色”区块上工作,发现一个“粉色”区块扩展了区块链(蓝-绿-粉色),他们会立即传播这个新区块,整个网络都会考虑这个区块有效,如上图所示。

重新共识

所有在上一轮中选择“绿色”区块作为获胜者的节点将直接链接该链扩展一个区块。然而,那些选择“红色”区块作为获胜者的节点现在将看到两条链:“蓝-绿-粉”和“蓝-红”。如上图所示,这些节点会根据结果将“blue-green-pink”链设置为主链,将“blue-red”链设置为备用链。这些节点接受新的更长的链,并被迫改变他们对区块链的原始看法,这被称为链重新共识。因为作为父块的“红”块不再在最长链上,它们的候选块变成了“孤块”,所以现在任何原本想在“蓝红”链上扩展区块的矿工区块链全部停止。全网将“蓝-绿-粉红”链识别为主链,“粉红”区块是这条链的最后一个区块。所有矿工立即将其候选区块的父区块切换为“粉红色”,以扩展“蓝-绿-粉”链。

理论上,两个区块的分叉是可能的,当由于前一个分叉而相互反对的矿工几乎同时发现两个不同的区块时,就会发生这种情况。但是,这种情况发生的可能性非常低。每周都会发生单块分叉,而双块分叉非常罕见。

比特币的出块间隔设计为 10 分钟,这是更快的交易确认和更低的分叉概率之间的折衷。更短的区块生成间隔将导致更快的交易结算和更频繁的区块链分叉。相反,更长的时间间隔会减少分叉的数量,但会导致更长的清算时间。

参考:

什么是UTXO

默克尔树在区块链中的应用