早期比特幣等加密貨幣系統網路處於初始階段,各項技術漏洞較多,甚至有一些礦機公司利用演算法上的缺陷做出“搶塊”礦機。這種礦機可以在不記錄任何交易的情況下,快速搶挖出下一個區塊,從而獲得系統爆塊獎勵。這個快速被挖到且沒有打包交易資訊的區塊,就是我們所說的空塊。
我們知道,加密貨幣挖礦其實是一個計算打包的過程,誰先計算出符合系統網路的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上打包任何交易。
這麼來看在區塊鏈網路中出現眾多空塊,也可以看成是眾多礦工競爭的一種方式。


