欄目介紹

「知礦大學問答」是以問答的形式,邀請行業資深從業者,解答用戶挖礦相關的提問。提出好問題並被採納的用戶,將會獲得知礦大學精美周邊一份。

來自@地攤小王子 的提問:

打包交易有手續費收入,為什麼會有礦工打包空塊呢?有人說打包空塊的礦工是製造比特幣網絡擁堵的壞礦工,這種說法對嗎?

知礦大學小編@OWEN 的回答:

比特幣的空塊是指,區塊中僅打包了創幣交易的區塊。在《如果區塊鏈會說話》一文介紹過,截止到目前,大約有9萬空塊,約佔目前區塊數量的14%。這其中很多空塊是在比特幣早期產生的,那時候用比特幣的用戶極少,鏈上幾乎沒有交易產生,所以礦工也只能打包空塊了。

後來比特幣鏈上交易多了起來,內存池一直有等待礦工打包的交易,這種情況下,為什麼礦工還會打包空塊? @地攤小王子提問是針對這種情況的,以下的回答也是針對這種情況的。

01 陰謀論

首先,打包空塊的礦工是製造比特幣網絡擁堵的壞礦工,這是徹徹底底的陰謀論。

假設真的有攻擊者通過打包空塊的方式來造成比特幣網絡擁堵,這種攻擊非常低效,而且需要投入大量的成本。

目前比特幣全網算力超過100E,全網礦工每天(24小時)大約挖出144個塊,每個塊打包交易的上限在4000筆左右。假設惡意礦工想控制10%的算力來進行“空塊攻擊”,他們需要控制超過10E的算力,這麼大的算力規模,不管是通過租用算力,還是買礦機來實現,都是一筆非常巨大的成本支出。

參考crypto51的即時(6月17日)數據來計算發起攻擊的成本,crypto51給出了對比特幣進行51%算力攻擊每小時需要的成本,我們假設的是10%的算力,也就是這個攻擊成本的五分之一,每小時大約需要花費¥53萬,攻擊成本非常高。當然這種攻擊,還是可以得到區塊獎勵回報的。

▲https://www.crypto51.app/?ref=block123

再來說“空塊攻擊”對比特幣網絡破壞效果。

空塊攻擊難以對比特幣造成實質性的傷害,最終結果是損人利己、自討沒趣。

假設比特幣網絡已經很擁堵了,用10%算力進行“空塊攻擊”,相當於區塊大小被惡意礦工人為“縮小“了10%,實際效果是平均每個區塊能打包交易數量的上限”下降“了10%。比特幣網絡如果實在太擁堵,又會反過來降低人們鏈上交易的需求,網絡就變得不再擁堵了,這樣一來,“空塊攻擊”的效果就難以起到持續性效果。

綜上,“空塊攻擊”需要付出高昂的成本代價,在攻擊效果上也很難持續,打包空塊是礦工發起“空塊攻擊”的這種言論是不明真相者的陰謀論。

礦工打包空塊的真相是什麼呢?

02 真相

礦工挖礦是一場比拼速度的競賽。不僅要看誰先找到了符合系統要求的解,還要把找到的解,盡快廣播出去。快,對於礦工來說是一件貫穿始終的事情。

一個區塊包含兩部分,區塊頭和區塊體。比特幣客戶端在對區塊廣播時,是將區塊頭和區塊體分開傳播的。區塊頭包含了版本號、父區塊頭哈希值、時間戳、默克爾樹根哈希值、難度目標、隨機數等6部分,它的大小只有80字節。交易信息被打包在區塊體裡。一個滿載的區塊大小為1M,它是區塊頭大小的12500倍。

越多的信息量,傳播延時越長。區塊頭和區塊體的大小差異,造成其他礦工會先接收到新區塊頭數據,一段時間(一般在10秒之內)之後,再收到區塊體的數據。

收到區塊頭數據還沒收到區塊體數據的這段時間,對於礦工來說,也是有成本的,礦機依舊在運行。

礦工為了充分利用這段時間進行挖礦,就不能往區塊裡填充交易,也就說礦工只能嘗試挖空塊。這是因為礦工沒有收到父區塊打包的交易數據,不知道父區塊打包了哪些交易,如果礦工往區塊裡填充交易,可能會把已經被父區塊打包的交易再次打包,這會造成區塊數據不合法,之前為此付出努力都變成了無用功。為了避免這種情況發生,在這段時間,礦工明智的做法是不打包交易挖空塊。如果這段時間剛好挖到新區塊,那麼挖出的塊就是空塊。

粗略統計了一下,在待確認交易內存池持續不空的情況下(從第二次減半之後至今),21萬多個區塊中,大約有0.75%的空塊。另外這部分空塊的出塊時間,與其父區塊的時間間隔基本都在幾十秒之內,這樣很好印證了我們前面給出的信息延遲的解釋。

03 總結

礦工打包空塊是出於經濟利益的考量,這樣做是礦工最明智的選擇。礦工為了充分利用這段時間進行挖礦,且避免與父區塊中打包的交易發生衝突,就不能往區塊裡填充交易,也就是說礦工只能嘗試挖空塊。打包空塊是惡意礦工為了對比特幣發起“空塊攻擊”,這是典型的陰謀論。