主页 > imtoken不让安装 > 8. 挖矿与共识——精通比特币纸币
8. 挖矿与共识——精通比特币纸币
介绍
挖矿是增加比特币货币供应的过程。 这个过程也保证了比特币系统的安全和支付的安全,避免了双重支付。 双花是指多次花费同一个比特币。 比如我有一张一元的钞票。 我先买了一个冰淇淋,然后偷偷把钱拿回来,然后用这张一元钱买了一堆烤肉。
矿工验证每笔交易并将其写入区块。 基本上,每 10 分钟就会“挖出”一个新区块,新区块包含从前一个区块产生到新区块产生时间的所有交易。 这些交易又被打包成新的区块,然后添加到区块链中。 我们将区块写入区块链的过程称为交易确认,也称为挖矿。 一笔交易被确认,说明这笔交易已经被添加到区块链中。 只有在交易被确认后,新的所有者才能使用交易(或 UTXO)。
挖矿过程(将交易打包成块并将块添加到区块链)将产生两种收益。 一种是比特币系统在区块成功写入区块链时提供的比特币。 奖。 另一个好处是交易发起者提供的交易费用。
比特币系统以确定的、不断下降的速度创造比特币。 矿工大约每 10 分钟可以创建一个新区块,同时伴随着一定数量的比特币从比特币系统中诞生。 每创建210,000个区块,大约需要4年时间,比特币奖励数量减半。 一开始一个区块奖励50个比特币,4年后变成25个,以此类推。 现在是 12.5 个比特币。 比特币总数为2100万枚。 当比特币全部发行后,挖矿将不再获得系统奖励的比特币,而只会获得交易手续费。 所以,比特币也是一种通缩货币。
去中心化共识
去中心化共识是由比特币节点的四个独立执行过程交互产生的。
交易区块年龄、gas 费和优先级
矿工在将交易包含在块中之前对交易进行优先级排序。 计算优先级的方法是用交易的输入值和区块年龄的乘积除以交易的总长度(字节)
优先级 = 输入值 * 输入年龄 / 交易规模
块龄是指当前 UTXO 被记录到块中之前经历的块数。
当一个挖矿节点创建一个区块时,区块中用于存储交易信息的前50k字节被保留给优先级更高的交易,而不管这些交易是否包含手续费(随着时间的推移,区块的年龄会越来越老,并且那些先前优先级较低的事务将具有更高的优先级)。 然后节点会选择手续费最小的交易比特币为什么不会通货紧缩呢,按照“每千字节矿工费”排序,选择手续费高的交易,加入区块。 如果此时这些交易还没有填满区块,节点会选择不包含交易手续费的交易。 有的矿工会把这些没有手续费的交易打包,有的矿工会忽略没有手续费的交易。 可以配置这些策略。 如果此时节点的交易池中还有交易没有被添加到区块中,而区块已经被交易填充,则在下次打包区块时将交易池中的交易添加到区块中时间。
代币交易
区块中的第一笔交易是一种特殊交易,称为创建交易或 coinbase 交易。 这是一种用比特币奖励矿工的交易。
造币交易不包含上文提到的解锁脚本字段(scriptSig),也就是说交易的签名不需要验证。 相反,coinbase 字段最小为 2 个字节,最大为 100 个字节。 除了比特币系统填充的前几个字节外,其余字节可以由矿工随意填充。
工作量证明算法
区块中有一个字段nonce,我们需要找到满足算法条件的nonce。 举个简单的例子,假设我们玩一对骰子。 第一轮,我们的目标(nonce)是骰子的总和小于12,只要不丢出两个6,你就赢了。 第二局,目标小于11,获胜的概率比较大。 以此类推,当target小于2时,难度很大。 这就是工作量证明算法的简单原理。 我们只有不断尝试寻找目标,才能完成挖矿工作。
难度调整
刚才我们谈到了掷骰子游戏的目标。 目标值越小,我们就越难。 在比特币系统中,工作量证明算法的难度由比特币系统动态调整。 这样做是为了保证无论有多少节点参与,以及系统的总算力,一个区块的挖掘都必须维持10分钟左右。 我的速度。 难度调整是通过比较最新的2016个区块的时长与20160分钟的时长,即实际出块时间与预期出块时间的比值进行相应调整。如果超过预期时间,则该难度算法会减少,如果小于预期时间,算法的难度会增加
验证新区块
比特币共识的第三步是通过网络中的节点独立验证新区块。 区块验证过程也有一套通用的规则。
这种独立检查可确保矿工无法作弊。 任何节点独立验证,与其他节点无关,验证方式统一。 任何节点伪造的任何区块都会被其他节点识破并丢弃。 如果你一定要作弊,你需要所有其他节点都认可你的区块,这是非常困难的。
区块链选择和组装
比特币共识的最后一步是将区块组装成最大工作量证明链。 一旦一个节点发现了一个新区块,它将尝试将新区块链接到现有区块链。
节点维护三种类型的块,第一种是链接到主链,第二种是从主链生成的分支,最后一种是在已知链中找不到其父块的块。
在任何时候,主链都是累计工作量证明最大的链,也是最长的链,除非两条链等长,其中一条有更大的累计工作量证明。 主链也会有分支,分支中的区块和主链区块是“兄弟区块”。 这些“兄弟区块”是有效的,但不包含在主链中。 保留它们的原因是在未来的某个时刻,它们所在的链被延伸,工作量证明的积累大于主链,那么主链的后续将是它们,这是主链的分叉行为。
由于网络延迟等原因,不能保证各点保存的区块链在同一时间完全一致,可能会导致节点间区块链不一致。但是由于节点总是会采用最大的链累积工作量证明,不同节点的链最终会汇聚到主链
矿池
随着工作量证明算法难度的增加,单人挖比特币几乎是不可能的。 因此,多个矿工合伙挖一个区块是自然而然的选择,矿池应运而生。
任何节点都可以加入矿池。 一旦矿池挖出一个区块,获得的比特币将根据不同节点的贡献分成一定数量的比特币,比单人挖矿风险低很多。
矿池也分为托管矿池和P2P矿池,即中心化矿池和去中心化矿池。 前者是由人控制的。 矿池中有中央服务器负责调度矿工,矿池管理员存在作弊的可能。 去中心化矿池不需要中央服务器来管理矿池,矿池是自治的。
共识攻击
比特币的共识机制使得矿工或矿池很难对比特币系统发起共识攻击,至少在理论上是这样。 从矿工自身利益的角度来看,不太可能对比特币发起攻击。 一旦比特币共识机制出现问题,攻击者手中的比特币就一文不值。 但是一次共识攻击只会影响区块链未来的共识,最多也就是过去的10个区块。 随着区块链的长度随着时间的推移而增加,整个比特币区块链被篡改的可能性越来越小。 理论上,一条包含恶意区块的区块链的分叉可能会很长,超过主链,从而达到篡改的目的比特币为什么不会通货紧缩呢,但是构建这样一条包含恶意区块超过主链的链,需要非常非常大的计算量力量。 共识攻击无法窃取他人的比特币并改变过去的交易。 共识攻击可能产生的唯一影响是最后 10 个区块,并且可以通过拒绝服务攻击来阻止区块生成。
一个典型的共识攻击的攻击场景是这样的:一个矿池拥有整个比特币网络51%的算力,这个矿池里的人用比特币购买一些物品,这笔比特币交易被写入到区块中同时,他正在生成一个包含他将这个比特币转给自己的交易的区块,然后发布正常区块,同时发布有问题的区块,然后通过51%的算力,疯狂挖矿延长问题区块的链,让其他节点接收到问题区块的链,这样一个比特币就被使用了两次,即转给商家,又转回给自己。 为了避免此类攻击,交易通常在达到 6 次确认(6 名矿工验证区块的有效性)后才被认为是成功的。
另外,51%攻击理论上是控制全网51%的算力。 事实上,据安全机构统计,只要算力超过30%,就可以发起共识攻击。 51%的算力,就是为了保证这样的攻击几乎总能成功。