简介
挖矿是增加比特币货币供应的过程。这个过程同时还保证了比特币系统的安全以及支付的安全,避免双重支付。双重支付是指多次花费同一笔比特币。例如我有一张一元的钞票,先买了一个冰激凌,然后把钱偷偷拿回来,再用这一张一元钞票买了一串烧烤。
矿工们验证每一笔交易,并把交易写入到区块中。基本上每10分钟就有一个新区块被“挖掘”出来,新区块包含从上一个区块产生时到新区块产生时间段内的所有交易。这些交易依次被打包进新区块,然后新区块会被加入到区块链中。我们把区块被写入到区块链中的过程叫交易确认,也叫做挖矿,一个交易被确认,说明这笔交易已经被加入到区块链中。交易只有经过确认后,新的拥有者才能使用这笔交易(或者说UTXO)。
挖矿的过程(将交易打包成区块,并把区块加入到区块链中)会产生两种收益,一是成功把区块写入到区块链时,比特币系统提供的比特币奖励。另一种收益是交易发起者提供的手续费。
比特币系统以一个确定的,不断减缓的速度创造比特币。大约每10分钟矿工可以创造一个新区块,这就伴随着一定数量的比特币由比特币系统新生出来。每创造出210000个区块,大约耗时4年,比特币奖励的数量减半。最开始挖出一个区块奖励50个比特币,4年后,变成25个,以此类推。现在是12.5个比特币。比特币总数是2100万个,当所有比特币都被发放完后,挖矿将不会再获得系统奖励的比特币,只会得到交易的手续费。所以,比特币也是一种通货紧缩货币。
去中心化共识
去中心化共识由比特币节点的4种独立执行过程相互作用而产生。
- 每个全节点依据通用综合标准对交易进行独立验证
- 通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块
- 每个节点独立的对新区块进行校验并组装进区块链中
- 每个节点对区块链进行独立选择,在工作量证明机制下选择累积工作量最大的区块链
交易块龄,矿工费和优先级
矿工在把交易打包进区块之前,会对交易进行优先级排序。计算优先级的方式是交易的输入值和块龄的乘积除以交易的总长度(字节)
Priority = Value of input * Input age / Transaction size
块龄指的是当前UTXO被记录到区块为止所经历的区块数。
挖矿节点在创造区块时,区块中用来存储交易信息的前50k字节是保留给优先级较高的交易的,不管这些交易是否包含手续费(随着时间的推移,区块块龄会越来越大,那些以前优先级低的交易,优先级会越来越高)。然后节点会选择包含最小手续费的交易,将他们按照“每千字节矿工费”进行排序,选择出手续费较高的交易,加入到区块中。如果此时这些交易还没有填满区块,那么节点就会选择不包含手续费的交易。有些矿工会打包这些不含手续费的交易,而有些矿工则忽略不包含手续费的交易,这些策略都可以配置。如果此时节点的交易池中还有交易没有被加入到区块中,且区块已经被交易填满,那么在交易池中的交易会在下次打包区块时被加入到区块中。
创币交易
在区块中的第一笔交易是特殊的交易,称为创币交易或者coinbase交易。这是奖励给矿工比特币的交易。
创币交易不包含前面提到过的解锁脚本字段(scriptSig),也就是说不需要验证交易的签名,取而代之的是coinbase字段,最小2字节,最长100字节。除了开始的几个字节由比特币系统填充好外,其余的字节可由矿工随意填写。中本聪在创世块中的coinbase字段中就加入了泰晤士报的一段报道
工作量证明算法
区块中有个字段nonce,我们需要找到满足算法条件的nonce。举个简单的例子,比如我们玩儿一对骰子,第一局,我们的目标(nonce)是骰子的和小于12,只要你不扔出两个6,你就赢了。第二局,目标是小于11,赢的概率也比较大,以此类推,当目标是小于2的时候,难度就很大了。这就是工作量证明算法的简单原理,只能通过不停尝试,找到我们的目标,来完成这个挖矿的工作。
难度调整
刚才我们说到扔骰子游戏的目标,这个目标值越小,我们的难度就越大。在比特币系统中,工作量证明的算法难度是由比特币系统动态调整,这么做是为了保证不管有多少节点参与进来,系统的总算力有多大,都要维持10分钟左右一个区块的挖矿速度。难度调整是由最新2016个区块产生的时长与20160分钟比较得出,也就是实际产生区块时长与期望产生区块时长的比值进行相应调整。如果超过期望时长,算法难度降低,少于期望时长,算法难度增加
校验新区块
比特币共识的第三步就是通过网络中的节点独立验证新区块完成。区块验证过程也有一套通用的规则。
- 区块的数据结构在语法上有效
- 区块头的哈希值小于目标难度
- 区块时间戳早于验证时刻未来两小时(允许时差,时间错误)
- 区块大小在规定范围内
- 第一笔交易是coinbase交易(有且只有一个)
- 独立验证区块内的交易有效性
这样的独立校验确保矿工不会有欺诈行为。任何节点都是独立验证的,与其它节点无关,验证方式统一,任何一个节点伪造的区块都会被其它节点识破,并抛弃掉。如果一定要作弊,那需要其它所有节点承认你的区块,这个难度难于上青天。
区块链的选择和组装
比特币共识的最后一步是将区块集合至最大工作量证明的链中。一旦一个节点发现了新区块,他将尝试把新的区块链接到现存的区块链中。
节点维护着3种区块,第一种是链接到主链的,第二种是从主链上产生的分支,最后一种是在已知的链中没有找到父区块的区块。
任何时候,主链都是累积了最大工作量证明的链,也是最长的链,除非两条链等长,其中一个累积的工作量证明更大。主链也会有分支,在分支中的区块与主链区块是“兄弟区块”,这些“兄弟区块”是有效的,但没有包含在主链中,保留他们的原因是在未来的某一时刻,他们所在的链延长了,并在工作量证明累积上大于主链,那么主链的后续就是他们,这就是主链的分叉行为。
由于网络延迟等等原因,并不能保证所有点在同一时间所保存的区块链完全一致,这就可能导致节点之间的区块链不一致。但由于节点总是会采用累积最大工作量证明的链,所以最终不同节点的链会收敛到主链上
矿池
随着工作量证明算法难度的提升,单人挖矿几乎不可能挖到比特币了,为此,多个矿工合伙来挖一个区块就成为了很自然的选择,矿池应运而生。
任何节点都可以加入矿池,一旦矿池挖出了区块,得到的比特币将会按照不同节点的贡献程度分得一定数额的比特币,这比单人挖矿风险低得多。
矿池也分为托管矿池和P2P矿池,也就是中心化矿池和去中心化矿池。前者人为控制,有一个中心服务器来负责调度矿池中的矿工,而矿池的管理员就有了作弊的可能。去中心化矿池不需要一个中心服务器来管理矿池,矿池是自治的。
共识攻击
比特币的共识机制使得矿工或矿池对比特币系统发起共识攻击的难度很大,至少理论上是这样的,从矿工自身利益出发,也不太可能对比特币发起攻击,一旦比特币的共识机制有问题了,攻击者手上的比特币也就不值钱了。但共识攻击只会影响区块链未来的共识,或者说最多只能影响过去的10个区块。随着时间的推移,区块链长度的增加,整个比特币区块链被篡改的可能性越来越低。理论上,一个包含恶意区块区块链的分叉可能很长,长到超过主链,从而达到篡改的目的,但构造这样一个包含恶意区块的超过主链的链,需要非常非常大的算力。共识攻击不能盗走其他人的比特币,改变过去的交易。共识攻击能够造成的唯一影响是最近的10个区块,并可以通过拒绝服务攻击来阻止区块产生。
共识攻击的典型攻击场景是这样的,一个矿池拥有整个比特币网络51%的算力,而在这个矿池中的人用比特币购买了一些物品,这笔比特币交易被写入到了区块,同时他在生成一个包含他把这笔比特币转给了自己的交易的区块,然后把正常的区块发布出去,同时发布有问题的区块,然后通过51%的算力,疯狂挖矿,延长有问题的区块的链,达到让其他节点接收有问题区块的链,从而让一笔比特币使用了两次,即转给了商家,又转回给了自己。为了避免此类攻击,通常在交易达到6个确认(6个矿工验证了这个区块的有效性)以后,才会被认为交易成功。
另外,51%攻击理论上是要掌控全网51%的算力,实际上,有安全组织统计过,只要算力超过30%,就可以发起共识攻击。51%的算力,只是保证这样的攻击几乎都会成功。
网友评论