在比特币协议中,最长的链被认为是绝对的正确。如果一个块不是最长链的一部分,那么它被称为是“孤块”。一个孤立的块是一个块,它也是合法的,但是发现的稍晚,或者是网络传输稍慢,而没有能成为最长的链的一部分。在比特币中,孤块没有意义,随后将被抛弃,发现这个孤块的矿工也拿不到采矿相关的奖励。
简介如果节点收到了一个有效的区块,而在现有的区块链中却未找到它的父区块,那么这个区块被认为是“孤块”。孤块会被保存在孤块池中,直到它们的父区块被节点收到。一旦收到了父区块并且将其连接到现有区块链上,节点就会将孤块从孤块池中取出,并且连接到它的父区块,让它作为区块链的一部分。当两个区块在很短的时间间隔内被挖出来,节点有可能会以相反的顺序接收到它们,这个时候孤块现象就会出现。选择了最大难度的区块链后,所有的节点最终在全网范围内达成共识。随着更多的工作量证明被添加到链中,链的暂时性差异最终会得到解决。挖矿节点通过“投票”来选择它们想要延长的区块链,当它们挖出一个新块并且延长了一个链,新块本身就代表它们的投票。当然,试图扭转交易数据的算力攻击(需要足够的哈希算力)也能引发孤块。
最重的链Ethereum的GHOST协议,不认为孤块没有价值,而是会给与发现孤块的矿工以回报。在以太坊中,孤块被称为“叔块”(uncle block),它们可以为主链的安全作出贡献。相对来说,比特币有很长的块间隔时间。在比特币区块中,平均约10分钟可以得到一个确认(也就是发现一个新的后续区块)。但是自从比特币成立以来,大量关于块链技术的研究已经发展起来。这些研究表明,更短的块间隔确实是可能的,而且在很多应用场景下是需要的。然而,随着拥有更快的出块速度,孤块的增加而带来的昂贵的成本和浪费也随之增加。GHOST协议支付报酬给叔块,这激励了矿工在新发现的块中去引用叔块。引用叔块使主链更重。在比特币,最长的链是主链。在以太坊中,主链是指最重的链。叔块的好处,解决了两个问题:
1. 以太坊十几秒的出块间隔,大大增加了孤块的产生,并且降低了安全性。通过鼓励引用叔块,使引用主链获得更多的安全保证(因为孤块本身也是合法的)
2. 比特币中,采矿中心化(大量的集中矿池)成为一个问题。给与叔块报酬,可以一定程度上缓解这个问题。
区块区块是比特币中用来记录和确认交易信息的数据结构。它是由比特币系统中一些称为矿工的节点产生的,而矿工构造区块的过程被称为挖矿。主要可以分为区块头部和交易数据两大部分。在一笔交易被创建后,用户会通过点对点网络向全网广播这笔交易,而矿工们则会收集并验证这些交易数据,并将其中合法的交易信息存储在本地交易池中。在交易数目达到一定量后,矿工开始用这些交易数据构造区块。矿工首先会确定要产生的区块应该包含哪些交易数据,并计算交易数据的 Merkle值作为区块交易数据的校验。一般来说,矿工会尽可能多地优先选择交易费较高的交易,因为一旦矿工挖矿成功, 这些交易费都将由他获得。 随后,
矿工会根据自己的挖矿协议以及前一个区块数据,填充区块头部的版本、前驱区块哈希值以及区块时间。随后,矿工会获取系统当前的难度值,填入 nBits 字段。这一数值是由系统设定用于调整挖矿难度的数值。一个合法区块的哈希必须符合难度值的要求,在后面介绍影响分叉产生因素时将详细解释这一数值。最后,矿工开始遍历随机数Nonce,试图获得哈希符合当前系统难度值的区块。这一步是挖矿环节最主要的工作。比特币挖矿采用 sha256 算法作为区块的哈希算法,这一算法没有明显的攻击策略和漏洞,矿工们只有通过暴力搜索来寻找符合系统难度值的区块哈希值,这要求矿工具有非常强大的计算能力。而在某些难度值较大的情况下,矿工甚至不得不去调整一些交易数据的组合,以获得更大的哈希搜索范围。
矿工挖矿成功后, 会向全网广播其构建的区块。系统中的节点会验证和确认这个区块,并将合法的区块添加到区块链的尾部,并把它继续向外传播。挖矿成功的矿工除了获得区块中所有包含的交易费外,还会额外获得一个系统设定的奖励费,用作挖矿工作的回报。奖励费是通过一个没有输入的特殊交易来实现的,这种交易也被称为 Coinbase 交易。在交易费和奖励费的激励下,矿工会不断投入计算力量争取成功挖矿,区块链也得以不断延伸,从而记录下更多的交易信息。假设比特币的网络是同步的,且不存在多个矿工同时挖出一个合法区块的情况,那么系统中的区块会依次不断产生并添加到区块链尾部。在这种状态下,系统中的所有节点所存储的区块链数据一致。在验证一笔交易的时候,节点可以通过遍历搜索区块链的数据来确认交易中的 UTXO 是确实存在且没有被重复使用,而攻击者几乎没有方法能够修改或是伪造数据。然而,比特币是基于点对点网络建立的系统,区块的传播必然存在延时,且矿工之间的挖矿工作相互独立,存在同时挖矿成功的可能。在这种情况下,系统将不再处于理想状态。分叉是区块链必须解决的问题,因为如果任由分叉不断延伸,那么攻击者可以分别在 chain a和 chain b 上同时使用 b 区块以及之前区块交易中的UTXO 进行重复消费。不仅如此,分叉状况下,只有少数中间节点能够察觉到分叉的存在,大部分不知情的节点会继续在各自的链上挖矿。对于全网而言,节点的计算能力实际上被割裂,这将直接降低区块的产生速率,影响系统性能。比特币处理区块链分叉方法是先让节点继续在两条链上继续挖矿,一旦有一条链的高度超过了其他支链,那么这条链就会胜出成为主链,而其他支链将会被抛弃。这些被抛弃链上的区块不再有任何意义,被称为孤块。这种处理分叉的方法实际上就是比特币的共识,即所有节点都遵循的一个公开规范。共识也是去中心化系统解决竞争问题的主要方式之一。由于分叉的存在,区块链中尾部的一些区块并不是绝对安全的,因为它们存在着被新的分支超越的可能。但是,随着后续新区块的不断追加,它们被新的分叉超越的可能性会呈指数式下降。基于这一情况,比特币中一笔交易的确认往往需要等待该交易所在区块能够有一定数量的后续区块,这导致了比特币中的交易确认并不是实时的,其过程通常需要几个区块产生的时间1。
本词条内容贡献者为:
李嘉骞 - 博士 - 同济大学