作者:晏文春 / 來源:白話區塊鏈
白話區塊鏈在《比特幣礦工一天賺多少錢?》一文介紹過:比特幣出塊獎勵包括兩部分:系統獎勵(也稱Coinbase獎勵)和交易手續費獎勵(也稱礦工費)。礦工打包交易到所挖出的區塊里,才能得到該筆交易的手續費。
我們做一個類比,這個問題就非常好理解了:
挖出區塊的礦工相當于是客車司機,除了系統會給客車司機獎勵以外,客車司機每招攬一名乘客,就能得到一筆乘車費,客車司機好不容易搶到一次發車權,會拼命往車里塞乘客,直到滿座(車的容量是有有限的)。
礦工都是理智的,按理說礦工為了利益最大化,在待確認的交易足夠多的情況下,每個區塊都會被礦工盡可能多地填充交易。為什么有的區塊里,除了Coinbase獎勵以外沒有其他交易呢?事出反常必有妖,我們今天就來“捉妖”吧。
01
天下武功唯快不破
白話區塊鏈在《如果兩名礦工同時挖出新區塊,出塊獎勵該給誰呢?》一文介紹了,當礦工挖出區塊后,越快將區塊發布出去對礦工越有利。
白話區塊鏈在《一個經典的故事,讓你3分鐘搞懂比特幣挖礦》一文介紹了區塊的構造:一個區塊主要由區塊頭和區塊體兩部分組成。區塊頭的大小,僅占80個字節,一個滿載的區塊為1M大小,是區塊頭的12500倍。
我們知道,數據越小,傳播和接收就越快,所以挖出新區塊的礦工,為了讓區塊能更快地在全網發布,會把區塊頭和區塊體的信息分開發布,只有80字節的區塊頭就能以更快的速度傳播給其他礦工。
根據上面的介紹,我們知道,當一個新區塊被挖出,礦工會更快接收到區塊頭信息,然后再接收到區塊體信息。
02
挖礦爭分奪秒
這時候礦工有兩種選擇:
接收到區塊頭后,馬上構造區塊開始挖礦;
繼續等待接收區塊體,驗證區塊內所有的交易后,才開始挖礦。
從接收到區塊頭到接收并驗證區塊體內所有交易,這中間是有時間差的,我們假設這個時間差是10秒鐘。如果這10秒鐘選擇等待,一方面礦機在空跑,需要耗能;另一方面挖礦是一場競賽,“時間就是金錢”,礦工會爭取這10秒鐘時間,如果在這段時間內,找到了合適的隨機數,就能挖出新的區塊,得到比特幣獎勵。
選擇在這個時間差內挖礦,就必須放棄打包交易。這是因為礦工沒有驗證上一個區塊內的交易,無法確定上一個區塊內打包了哪些交易,如果打包的交易和上一個區塊重復了,那么即使礦工挖出了新的區塊,也會因為重復打包已確認的交易而被判無效。這就是為什么有的區塊鏈只有Coinbase一條交易(就是系統給礦工獎勵的那條交易)的原因。
03
總結
我們總結一下:礦工打包空塊主要的原因是,礦工為了充分利用礦機,在接收到新區塊的區塊頭信息且還沒來得及驗證該區塊內的交易,在這個時間差內,礦工進行挖礦,如果在這個時間窗口內,剛好挖到區塊,礦工就會選擇打包空塊,發布區塊。因為在不清楚上一個區塊打包了哪些交易的情況下,礦工打包交易,可能會與前一個區塊打包的交易相同,這將導致礦工挖出的區塊被判無效(非法),有撿了芝麻丟了西瓜的風險。
礦工挖出區塊后,如果明確某一筆交易沒有被之前的區塊打包,可以將這筆交易添加到當前挖出的區塊,然后再發布嗎?歡迎到留言區分享你的觀點。