早期比特币等加密货币系统网络处于初始阶段,这一增长微乎其微。举报/反馈,各项技术漏洞较多,甚至有一些矿机公司利用算法上的缺陷做出“抢块”矿机。这种矿机可以在不记录任何交易的情况下,快速抢挖出下一个区块,从而获得系统爆块奖励。这个快速被挖到且没有打包交易信息的区块,就是我们所说的空块。
我们知道,加密货币挖矿其实是一个计算打包的过程,谁先计算出符合系统网络的Hash谁就能获得区块记账权,获得记账权的矿工通常会将用户广播出来的交易信息打包到这个区块中,随后再放到区块链上传递下去,这样他们还能获得不少的打包交易手续费。
而如果矿工获得记账权后,并没有在该区块打包交易信息,我们就将这个区块称为空块。空块上不包含用户交易信息,矿工只利用它来获得区块奖励。这种情况下,矿工也就无法获得相应的交易矿工费/Gas费奖励。
空块中没有打包任何交易信息,但它实际上包含一笔把爆块所得奖励分配给矿工的交易,这笔交易我们称为Coinbase交易。正常的区块,除了一笔Coinbase交易,还包含上百笔交易, 里面的打包交易费加起来,也能有零点几个以太坊,高峰期甚至能达到1个以太坊,都赶得上系统奖励的一半了。
比特币等加密货币网络中有正常区块,但也会有空块产生,而空块率就是反映该网络空块与正常区块所占比例的数据指标。像以太坊网络上的空块率正常范围是5%左右,来看看目前以太坊网络上的空块率情况。
截止到10月9日上午10点
可以看到分矿池的空块率都在5%以下,只有NanoPool以及一个来自个人地址的矿工超过了这个正常范围。
既然打包交易是有手续费奖励的,而且空块越多比特币等加密货币网络上的交易也就越拥堵,那么为什么还会出现挖空块的情况?
其实在加密货币网络技术越发完善的情况下,矿工挖一个空块投入的工作量与填满区块达到最容量投入的工作量并没有多少差别,空块的出现实际上是协议层的区块传播问题。
例如在比特币网络中,区块的传输需要时间。一个新块N广播出来,所有的矿池开始检验新块,没有问题后,才会在此基础上构建新块N+1。而验证新块、打包新的交易信息需要时间(假设1M区块需要6s传完),这个时间里矿池巨的算力是停摆的,而挖矿的竞争却十分激烈,型矿池不是争分夺秒,是争毫秒夺微秒,停摆会带来很的算力浪费。
通常的做法是利用区块传输的这段时间,继续寻找到下一个块。具体方法是,只要发现了新的区块广播,矿工可以在没有拿到块N完整数据时,只进行最简单的验证,先拿到块N的哈希值,直接跟在后面继续计算下一个区块的Hash。
这样一下子把验证新块、打包新的交易信息的时间给抢了回来,矿池就有1%的概率(6s/区块间隔600s),在传输区块N的过程中又挖出了一个块N+1。
虽然这种情况概率很小,但如果发生了矿工就面临一个问题:在块N还没有传完,不知道其他矿工打包哪笔交易的情况下,此时虽然有量交易正在他的队列中等待打包,却无法检验出哪些已经在块N中。如果块N+1打包这些交易,那极有可能打包到N块已打包的交易,这就冲突了。所以,矿工只能放弃在块N+1上打包任何交易。
这么来看在区块链网络中出现众多空块,也可以看成是众多矿工竞争的一种方式。