最近,比特币和以太坊的“空块”数量都有所增加,引起社区热议,人们也十分好奇为什么矿池要挖空块。
空块是什么?
我们经常说区块链就是一个分布式账本,挖矿就是竞争这个账本的记账权,获得奖励。大多数的时候,当矿工挖出一个区块时,区块是填满待确认交易的,矿工得到12.5BTC的系统奖励和这个区块的手续费奖励。
不过,挖出来的区块不仅有填满交易的区块,还有空区块。空块并不是说完全是空的,它里面包含一笔交易:coinbase交易,位于每个区块的第一部分,这笔交易将挖矿奖励分配给矿工(目前为12.5BTC)。
正常的区块,除了一笔CoinBase交易,还包含上千笔交易, 里面的打包交易费大约加起来,目前也能有0.15BTC的样子,高峰期甚至能达到12BTC,赶得上系统奖励了。
最近三个月产生空快占比
所以,很多人认为出空块这种相当于开空车不载客的行为,不仅不利于解决比特币网络交易效率低下问题,连真金白银的手续费也挣不到,完全是恶意的损人不利己的行为。那为什么矿池还要打空块?
为什么会存在空块?
矿工挖一个空块投入的工作量与填满区块达到最大容量投入的工作量是一样的,空块的出现其实是协议层的区块传播问题。
比特币网络中,区块的传输需要时间。一个新块N发布了,所有的矿池开始检验新块,没有问题后,才会开始在此基础上构建新块n+1。
验证新块、构建新的账单需要时间(比如1M区块需要6秒传完),这个时间里,矿池巨大的算力是停摆的,而挖矿的竞争十分激烈,大型矿池不是争分夺秒,是争毫秒夺微秒,停摆会带来很大的损失。
合理的做法是利用区块传输的这段时间,继续寻找到下一个块。方法是,只要发现了新的区块发布,矿工可以在没有拿到块N完整数据时,只进行最简单的验证,先拿到区块N的哈希值,直接跟在后面继续HASH。
这样一下子把“验证新块、构建新的账单"的时间给抢了回来,矿池就有1%的概率(6秒/区块间隔600秒),在传输区块N的过程中又挖出了一个块N+1。
这种虽然概率比较小,但是矿工却面临一个问题:在块N还没有传完,不知道别人打包什么交易的情况下,此时虽然有大量交易正在他的队列中等待打包,却无法检查哪些已经在块N中。
如果块N+1打包这些交易,那极有可能打包到N块已打包的交易,就冲突了,N+1块会被抛弃,什么奖励都得不到。所以,矿工只能选择不放任何交易直接打空块。
可见,空块是因为两个块时间差太小导致的,是在上一个区块传输的过程中,恰好计算出了下一个nonce值(概率事件),一般不是恶意产生的。毕竟打包交易收点手续费不耗费额外的成本。
空块会威胁网络安全?
比特币网络的整个重点在于处理交易。空块行为,经常被认为是刻意制造拥堵和从‘诚实’矿工那里窃取劳动果实,为网络创造的价值非常小。其实并非如此。
从网络拥堵方面而言,打空块本身就是一个小概率事件,即使出现了,这6秒内出的空块,时间极短,影响有限。因此刻意制造拥堵甚至威胁网络安全的言论被夸大了。
从去中心化方面而言,打包当前块N的矿池,已经知道哪些交易被包含在区块N中,因此可以立即开始下一个区块的挖掘工作。而其他矿工首先要下载这个区块,然后才进行新区块挖掘。
两者不是在同一时间竞争,出块N的矿池一直会存在先发优势,强者越强。空块可以很好的改变这种情况,从挖矿时间上可被视为限制了这种中心化的局面出现。
怎么解决空块问题?
事实上,解决空块问题是有办法的,空块的核心是挖空块时,不敢打包交易,以防止这些交易在上一个区块中出现过。那就构造一些不可能出现在上一个区块上的交易就可以了。
比如自己找一些零散的UTXO来整合,比如和交易所合作,交易所使用IP到IP提供一些交易,这些交易不被广播,只可能出现在挖空块的矿池里,这样空块就不会“空”了。