回顾
在上一篇文章比特币的秘密(三)海量的交易中,我阐述了比特币因为优雅的 UTXO 结构能处理海量的交易,也引出了比特币网络中的一个重要的角色——矿工,也称作节点运营商。现在我将从一个矿工的视角来阐述,到底矿工的「挖矿」是在挖什么。
概要
- 回顾
- 区块补贴(也被称为区块奖励)
- 交易手续费
- 悬赏脚本
- 区块成熟度
- 区块的重组——算力之战
区块补贴(也被称为区块奖励)
根据比特币代码中的定义,比特币在代码发布之日起铸造,最初的分发方式是在矿工通过哈希算力解决了区块链工作量证明的哈希谜题之后,可以领取的奖励。众所周知一个区块奖励从最初的 50 比特币开始,每 210000 个区块(大约四年的时间),这个奖励会降低到上一个区块奖励的一半(区块奖励减半)。这也是通常意义上的比特币越挖越少越来越难挖的由来。
同时在交易中输入数量和输出数量的差额部分,被定义为手续费,可以允许矿工在收取区块奖励的同时获取。随着时间的推移,交易的数量逐渐增加,手续费将越来越多,而区块奖励也越来越少。我们把区块奖励看作是在交易数量和手续费还不足够的时候的补贴,来激励节点运营商维持网络。
交易手续费
随着区块补贴的退补,交易手续费将越来越重要。我们将一个区块中的区块补贴和全部交易手续费加在一起作为矿工打包这个区块所获得的总收益,除以总共服务的交易数量或者字节数,来得到平均手续费率(也就是比特币网络用以处理交易的成本),我们可以看到随着交易量的增长,区块补贴占平均手续费的比重在逐渐下降。而在交易数量增长的情况下,单笔交易被打包的成本将趋近于其被处理的边际成本。随着矿工之间的竞争和技术的进步,交易成本最终会逐渐降低。
悬赏脚本
有一个容易被人忽视的部分,是节点运营商可以通过监控每一笔交易,查找其中可能存在的对特定矿工的悬赏。这部分的悬赏可能被设置为只有特定矿工才可以获得,也可以是所有矿工都有机会获得——只要构造了合法的解锁脚本,领取了赏金的交易被打包到合法的区块中。
这些悬赏的脚本,可以使用 SIGHASH 来构造,SIGHASH_NONE|SIGHASH_ANYONECANPAY 的 SIGHASH 指示在执行脚本中的 OP_CHECHSIG / OP_CHECKSIGVERIFY 进行签名校验时不对任何输出进行签名,仅对当前的输入进行签名。
这样,最先拿到交易的人,可以通过执行脚本的方式取走赏金,而将交易扩散到全网并签名,诚实的矿工将如实原样广播这个交易。但交易扩散的速度如此之快,不诚实的矿工难以通过改变输出的方式领走赏金。
区块成熟度
交易处理商成功打包了一个区块,并不能马上领取(花费)其中的收益。需要经过100个区块的(成熟度)之后,才可以允许铸币交易被花费。这种做法是为了防止在短时间的区块分叉过程中,因为接收了最后被孤立的新铸币而带来损失。
但是,有的人会觉得,那岂不是说要等支付安全,至少要等待区块成熟的 100 个区块确认才算安全?我们认真想一下这个问题,在之前我提到过,比特币交易是数字签名链。交易由背后的数字签名保证而不是由账本所保证,因此如果交易出现了双花,只有可能是拥有私钥的持有者的问题。正常的交易在私钥持有者不协助的情况下,是没有办法被节点运营商所双花的。双花是可以被立刻检测出来,表现为区块的回退和重组。节点运营商因为对能源的巨大需求,是无法在众人不知道的情况下,悄悄地完成这个事情。但区块却有可能在短时间内发生非双花的正常重组,重组后的正常交易将不受影响,因此,区块成熟度的保护是必要的。
区块的重组——算力之战
之前我们提到了短时间的区块分叉,因为全网针对比特币交易的顺序存在不同的视角,在极短的时间内达成共识的成本高。因此比特币的十分钟一个区块,并不是完全精确的十分钟。是有可能在几秒内出现下一个区块的,在这个时候就会出现短时间的区块分叉,并迅速的决出胜负后达成共识。但区块也有可能出现长时间的重组甚至超过了区块成熟度长度的更为不可逆的分叉。暂先卖个关子,我们下回说说节点运营商之间的惨烈竞争。