POW挖空塊的原理及解決辦法
比特幣的挖礦收益包含兩部分,第一是區(qū)塊獎(jiǎng)勵(lì);第二是交易手續(xù)費(fèi)。如果打空塊,就收不到交易手續(xù)費(fèi),為什么有礦池會(huì)不要手續(xù)費(fèi)來(lái)打空塊呢?
?
工作量證明POW挖礦就是區(qū)塊鏈生成新的區(qū)塊的過(guò)程。包括BTC、BCH、ETH、LTC……在內(nèi),POW挖礦都是按以下邏輯來(lái)。
挖礦是這樣的,系統(tǒng)會(huì)給出一個(gè)目標(biāo)值,這是一個(gè)數(shù),比如前面有18個(gè)零。挖礦就是找出一個(gè)小于這個(gè)目標(biāo)值的隨機(jī)數(shù),比如前面有19個(gè)零。找到了,就挖到了區(qū)塊。關(guān)鍵字:隨機(jī)數(shù)。關(guān)鍵問(wèn)題:這個(gè)隨機(jī)是怎么計(jì)算?
這個(gè)隨機(jī)數(shù)是對(duì)礦池對(duì)最新高度的區(qū)塊鏈進(jìn)行哈希得來(lái)的。關(guān)鍵字:最新高度。關(guān)鍵問(wèn)題:什么是最新高度?
現(xiàn)在有一個(gè)礦池挖到了一個(gè)區(qū)塊,并且廣播出去,我們假定這個(gè)區(qū)塊高度是50W高度。接下來(lái)所有礦池就會(huì)在這個(gè)50W高度后面繼續(xù)挖礦,具體動(dòng)作是礦池先組裝一個(gè)新的區(qū)塊,這個(gè)新的區(qū)塊包含了“區(qū)塊頭”和“填充交易的區(qū)塊體”。區(qū)塊頭里有兩個(gè)需要特別說(shuō)明的,第一個(gè)是父塊哈希值,這里是50W高度的hash值;第二個(gè)是Nonce,這是一個(gè)數(shù),一個(gè)可以調(diào)整的數(shù),從0開始。
組裝好這個(gè)新的區(qū)塊后,礦機(jī)就對(duì)這個(gè)新區(qū)塊(“50W+1”高度)加上前面50W高度的區(qū)塊進(jìn)行哈希。這個(gè)新的區(qū)塊就是上面的“最新高度”。
礦機(jī)執(zhí)行哈希一次,就得到一個(gè)哈希值,這是一個(gè)二進(jìn)制數(shù)。礦池會(huì)拿這個(gè)值和目標(biāo)值對(duì)比,如果小于目標(biāo)值,就恭喜你,成功挖到礦,否則就將Nonce加1,再哈希,再對(duì)比,……
顯然一臺(tái)礦機(jī)來(lái)哈希,你要試出滿足目標(biāo)值的Nounce值,那真是要慢死了。但礦池可以將不同的Nounce劃分給不同的礦機(jī)來(lái)試。比如礦池一共有1000臺(tái)礦機(jī),將0到1000,給第1臺(tái)試;10001到2000給第2臺(tái)試……這就是挖礦的并行。
POW挖空塊的原理針對(duì)上面50W高度和最新高度區(qū)塊,我們需要進(jìn)一步詳說(shuō)。在礦池在對(duì)最新高度區(qū)塊鏈進(jìn)行挖礦之前,是要對(duì)50W高度這個(gè)區(qū)塊進(jìn)行驗(yàn)證的。如果驗(yàn)證成功,在“50W+1”這個(gè)新組裝的區(qū)塊高度上挖礦才是合法的,如果50W高度是一個(gè)非法的區(qū)塊,那所有的礦池是要回到“50W”高度去挖礦的。
但驗(yàn)證區(qū)塊是需要時(shí)間的,因?yàn)楦鱾€(gè)礦池的軟硬件不同,我們假定一個(gè)平均時(shí)間,10秒鐘驗(yàn)證1M的區(qū)塊。在驗(yàn)證結(jié)束之前,礦池是無(wú)法確認(rèn)這個(gè)區(qū)塊是不是合法,也就無(wú)法確認(rèn)是否應(yīng)該添加“50W+1”高度的最新區(qū)塊。
而組裝一個(gè)最新高度的區(qū)塊也是需要時(shí)間的,拿到一個(gè)區(qū)塊模板開始組裝,往里填寫父區(qū)塊哈希值和在內(nèi)存池里挑選交易填充進(jìn)區(qū)塊體,這都是需要時(shí)間,我們假定需要0.1秒。
在驗(yàn)證“50W”高度區(qū)塊時(shí),和填充交易進(jìn)“50W+1”區(qū)塊里,有一個(gè)提前,填充的交易是絕對(duì)不能和50W高度里已經(jīng)打包的交易相重的。不然你這個(gè)最新高度區(qū)塊就會(huì)是非法的。
而“50W”高度這個(gè)區(qū)塊從挖出到廣播到所有的礦池中也是需要時(shí)間的,廣播區(qū)塊有分兩步。第一步是廣播區(qū)塊頭;第二步是廣播區(qū)塊體。區(qū)塊體非常小,只有80字節(jié),比一筆交易還小,廣播特別快,所有礦池可以非??炷玫絽^(qū)塊頭。有了區(qū)塊頭就可以拿到組裝新高度區(qū)塊的“父哈希值”。區(qū)塊體是包含所有交易的那部分,一般非常大,比如2500筆交易就接近1M了。BTC最大可以接近1M,加外3M的隔離見(jiàn)證區(qū)塊。而BCH曾經(jīng)打包出21M的區(qū)塊體。所有礦池收到區(qū)塊體就要時(shí)間更長(zhǎng)了,這叫網(wǎng)絡(luò)延遲。我們假定網(wǎng)絡(luò)延遲平時(shí)是0.5秒。
礦池挖礦最簡(jiǎn)單的做法是:一個(gè)礦池只要在拿到區(qū)塊體,才能確認(rèn)區(qū)塊體里有哪些交易。而只有驗(yàn)證完整個(gè)區(qū)塊,才能知道這個(gè)“50W”高度的區(qū)塊是否合法。然后再開始組裝最新高度區(qū)塊,然后再挖礦計(jì)算小于目標(biāo)值的哈希值。那在拿到區(qū)塊體,和驗(yàn)證完整個(gè)區(qū)塊,再加上組裝最新高度區(qū)塊,的時(shí)間長(zhǎng)度是多少?0.5+10+0.1=10.6秒。
如果一個(gè)礦池按上述過(guò)程來(lái)挖礦,那就在這10.6秒鐘的時(shí)間內(nèi)是無(wú)法挖礦的,礦機(jī)是無(wú)效工作時(shí)間。而且礦機(jī)還是在開機(jī)耗電的。
如果一個(gè)礦池按下面的過(guò)程來(lái)工作:拿到區(qū)塊頭,就開始組裝一個(gè)新的“50W+1”高度的區(qū)塊,但因?yàn)闊o(wú)法確認(rèn)這個(gè)50W高度區(qū)塊里的交易和是整個(gè)區(qū)塊是否合法,所以這個(gè)“50W+1”高度的區(qū)塊,礦池并不對(duì)區(qū)塊體填充額外的交易,只填充一個(gè)Coinbase獎(jiǎng)勵(lì)交易。這個(gè)“50W+1”高度的區(qū)塊,只有區(qū)塊頭,外加一個(gè)Coinbase獎(jiǎng)勵(lì)交易——這就是一個(gè)空塊——然后就直接開始挖礦。這樣操作,在全網(wǎng)出現(xiàn)一個(gè)新塊時(shí),礦也只需要等待拿到區(qū)塊頭和組裝空塊的時(shí)間,就可以開始挖礦。這個(gè)時(shí)間就非常短了,平時(shí)不到0.5秒。這樣就比10.6秒,節(jié)省了10秒多的時(shí)間。
而按上述過(guò)程挖礦,礦池在收到完整50W高度區(qū)塊體和驗(yàn)證完50W高度區(qū)塊,這個(gè)過(guò)程是10.6秒。在上述0.5秒到10.6秒的時(shí)間里,礦機(jī)如果計(jì)算出了一個(gè)隨機(jī)數(shù)小于目標(biāo)值,那礦池就成功挖到了一個(gè)空塊。如果礦機(jī)沒(méi)有計(jì)算出小于目標(biāo)值的隨機(jī)數(shù),那礦池就會(huì)放棄這10.1秒的挖礦時(shí)間,然后改成組裝一個(gè)填充了交易的“50W+1”高度的最新高度區(qū)塊進(jìn)行挖礦。
上述就是挖空塊的全部邏輯。
優(yōu)化挖礦原理上述挖空礦的原理中,確認(rèn)“50W”高度區(qū)塊里的交易是一個(gè)重要的工作,如果能夠提前知道這些交易,那組裝“50W+1”高度的區(qū)塊,不就可以避開這些交易,去組裝另外一些交易了嗎,這樣就可以不用打空塊了。
現(xiàn)在BTC和BCH網(wǎng)絡(luò)有兩個(gè)技術(shù)可以優(yōu)化這個(gè)區(qū)塊體的傳播,也就可以讓所有礦池更快知道“50W”高度里有哪些交易。第一個(gè)技術(shù)叫布隆過(guò)濾器;第二個(gè)叫致密區(qū)塊(Compact block)和瘦區(qū)塊(Xthin block)。(compact block是Core dev開發(fā)的,Xthin是unlimited dev開發(fā)的,兩者功能一樣。)
布隆過(guò)濾器是用來(lái)標(biāo)記“50W”高度的區(qū)塊有哪些交易的,只是標(biāo)識(shí)。礦池拿到這個(gè)標(biāo)記就知道了里面有哪些交易,然后礦池會(huì)去自己的內(nèi)存池查找這些交易,并列出自己沒(méi)有的交易,然后向其他節(jié)點(diǎn)索要自己沒(méi)有的交易。要到這些沒(méi)有的交易后,就在本地重新組裝一個(gè)“50W”高度的區(qū)塊,而不是從網(wǎng)絡(luò)上下載一個(gè)“50W”高度區(qū)塊。這個(gè)過(guò)程就是Compact block和Xthin block的原理。
通過(guò)這兩個(gè)技術(shù)就可以壓縮網(wǎng)絡(luò)延遲時(shí)間,但依然壓縮不了驗(yàn)證“50W”高度區(qū)塊的時(shí)間,而前者只有0.5秒,后者有10秒。
這樣的時(shí)間差距,礦池還是要去挖空塊,不然整個(gè)礦機(jī)就在白白浪費(fèi)電,要知道這個(gè)浪費(fèi)10秒對(duì)全網(wǎng)來(lái)說(shuō)是無(wú)比巨大的能源。
那怎么辦?
徹底解決挖空塊的辦法上述分析了挖空塊的原理和優(yōu)化挖礦的原理,挖空塊的核心原因是礦池不敢往“50W+1”這個(gè)空塊中填充和“50W”高度里已經(jīng)有的交易。
如果有一種辦法可以保證礦池組裝的“50W+1”高度的空塊里絕對(duì)沒(méi)有“50W”高度里出現(xiàn)過(guò)的交易,不就可以解決問(wèn)題了嗎?
一種辦法是,礦池自己生成一些交易,不廣播,只保存在自己的內(nèi)存池里,用來(lái)填充“50W+1”高度的空塊區(qū)塊,就可以了。
但礦池不能生成一些無(wú)意義的交易,不然就是一些垃圾交易,這是對(duì)網(wǎng)絡(luò)的浪費(fèi)。打包用戶發(fā)的交易肯定是有意義的,但用戶發(fā)的交易往往都是經(jīng)過(guò)廣播的,打包就和“50W”高度區(qū)塊里的交易相沖突的風(fēng)險(xiǎn)。
一定要找那些沒(méi)有經(jīng)過(guò)廣播的交易。
一種方法是礦池和交易所合作,用戶在交易所發(fā)起的提現(xiàn)交易,交易所不去廣播,而是通過(guò)IP到IP的方式,以加密的方法直接發(fā)給礦池,這些交易絕對(duì)不會(huì)被“50W”高度區(qū)塊打包的。這些交易就可以100%沒(méi)有沖突的打進(jìn)“50W+1”高度。
如果有交易所和礦池是同一個(gè)公司主體,那這種方法就非常好執(zhí)行了。不是同一個(gè)主體,礦池還是怕被交易所坑,萬(wàn)一交易所塞一個(gè)經(jīng)過(guò)廣播的交易就可能被浪費(fèi)掉一個(gè)空塊的區(qū)塊獎(jiǎng)勵(lì)。
但這種方法會(huì)讓交易所的用戶體驗(yàn)有所下降,因?yàn)榇蚩諌K的概率低啊,這些交易得何年馬月才能被打包,雖然礦池可以在挖非空塊中打包,但用戶也得等這個(gè)礦池出塊才有確認(rèn),這和全網(wǎng)有出塊是差好長(zhǎng)的時(shí)間的。
另一種方法是讓交易所給礦池提交的保密交易不是用戶的提現(xiàn)交易,而是一些零散UTXO拼湊成大UTXO的交易。這種交易是對(duì)整個(gè)UTXO體積有很大的優(yōu)化的,而且這些交易都沒(méi)有非常強(qiáng)烈的時(shí)間要求。適合被空塊打包。
結(jié)束語(yǔ)
只需要考慮經(jīng)濟(jì)因?yàn)榈腜OW挖礦機(jī)制是最優(yōu)的設(shè)定,道德不應(yīng)該被摻進(jìn)來(lái)。所有批評(píng)礦池打空塊的言論,都是對(duì)POW挖礦機(jī)制沒(méi)有信心的。