https://blog.csdn.net/t46414704152abc/article/details/81191804git
寫得超好,終於弄懂了什麼是叔塊,怎麼肯定哪條鏈最長,以太坊與比特幣出塊的差異github
爲了肯定哪一個路徑纔是最有效的以及防止多條鏈的產生,以太坊使用了一個叫作「GHOST協議(GHOST protocol.)」的數學機制。網絡
GHOST = Greedy Heaviest Observed Subtreeide
在比特幣中的出塊時間是10分鐘,說明難度也大;以太坊中將出塊時間提高到了15秒,差異很大,所以也會致使一個問題,就是在這15秒內,並非全部的節點都收到了某一個區塊是新區塊的信息,並且15秒內頗有可能有不少節點都同時挖出了區塊,那麼就會出現一部分人覺得這個區塊最新,一部分人覺得那個區塊最新,這樣就出現了分叉。區塊鏈
在比特幣中,叔塊是不會獲得獎勵的,礦工挖出叔塊將覺得着作了無用功。以前比特幣的區塊獎勵方法是就是若是在一樣的時間裏有多個礦工同時挖出來了一個區塊,這時候就造成了分叉,這時候礦工中算力較大的(即大礦池),將會由於其鏈接的節點更多,地理位置更好而使得其可以更快地在網絡上傳播新區塊信息,這樣就有比較多的其餘節點贊成該區塊爲最新區塊,這樣它所在的分叉成爲主鏈的可能性是更大的,這時候就會致使基本上一直都是該大礦池獲得了大多數的獎勵,這樣子其餘分叉上的礦工就不回願意與這個大礦池的主鏈進行合併了,由於它合併到主鏈並再在主鏈上挖礦是基本上不可能快於大礦池的,那麼它將不可能獲得獎勵,那麼它可能就一直在本身的分叉上挖礦,想着也許會運氣好下一次出塊比大礦池的快,那麼這樣子就不利於區塊鏈在出現分叉後快速合併,會一直到主鏈比分叉更快再挖出下一個區塊後,才逐漸合併,那將浪費不少叔塊的算力。spa
所以該GHOST協議的目的就是怎麼樣才能激勵其餘分叉的叔塊快速地與大礦池的主鏈合併,那就是也給予他們一些獎勵。.net
就好比主鏈上的大區塊將會使用獎勵來招安叔塊的礦口,與此同時,主鏈願意招安也將會獲得必定的獎勵。這樣就會雙向激勵雙方都進行合併。在以太坊中,7代內的叔塊都可以接受招安並獲得獎勵,超過則不行,這樣是爲了不有些礦工專門在以前的鏈上製造分叉後坐等被後面的節點招安狀況。pwa
叔塊的代數離主鏈上下一次出塊的區塊的代數越近,則其被招安可以獲得的獎勵將會也多,根據離的代數越遠,獎勵比例也越小,7/八、6/八、5/八、4/八、3/八、2/八、1/8,獎勵 = 獎勵比例 * 出塊獎勵(即3 eth),只有七代內的叔塊可以獲得獎勵(注:這個招安獎勵不是大礦池給的,是區塊鏈給的)。而大礦池招安可以獲得的獎勵 = 出塊獎勵 + 1/32 *出塊獎勵*招安的區塊數(每一次出塊的最多招安數爲2)。code
注意:規定每一次招安只能招兩個叔塊,即在區塊中存儲該叔塊的hash,以此聲明該爲要招安的叔塊blog
拜占庭分岔以後區塊獎勵的數量已經改變了,目前出塊的獎勵爲3個ETH,叔塊獎勵也已經作出了相應的改變。
有關uncle referencing reward: 假設A被歸入主鏈,A1是接着A被歸入主鏈的下一個區塊,A1會視B爲叔塊,而且在區塊之中存儲B的哈希,在記錄時B收穫叔塊獎勵,A1收到記錄叔塊的獎勵。注意叔塊只有被侄子或者侄孫子打包確認以後纔會被錄入作叔快。
在這裏舉個例子進行說明:
好比在上面的圖中,2-一、2-二、3-一、3-二、3-三、3-4都爲叔塊,中間的一、二、三、4爲主鏈,當3出塊時,且其爲大礦池,那麼若是它想讓其餘的小礦池與其主鏈快速合併,那麼它就要進行招安,好比首先它會先選擇3-一、3-2兩個叔塊(最多兩個),並將這兩個叔塊的hash寫到即將要挖出來的第四個區塊中,即意味着若是成功挖出第四個區塊,這兩個叔塊的挖礦者將會分別獲得出塊獎勵(即3eth)*7/8的獎勵,而大礦池也將獲得出塊獎勵(即3eth)*1/32 * 2(招安的叔塊數)+ 出塊獎勵 的獎勵。修改完區塊上的叔塊hash等信息後,大礦池將開始拼命挖礦,由於其算力高,很快就挖到了第四個區塊而且發送到了網絡中,而後這時候那些還正在挖掘3號塊或者四號塊的節點,特別是3-一、3-2的礦工收到這個區塊後,都會立刻來驗證這個4號區塊的合法性,驗證經過後就會停下手中的挖礦工做。在這個過程當中,3-一、3-2的礦工收到區塊後會發現本身是被招安的叔塊,由於它可以獲得相應的區塊獎勵,並且它繼續挖礦而不合並可以打敗大礦池的可能性並不大,那麼接受招安就是一個十分理智的決定。
可是這個時候3-三、3-4就得不到獎勵了嗎,固然不是,當要挖第5號區塊的時候,咱們就能夠將這兩個叔塊進行招安,可是這裏與上面惟一不一樣的地方就是這裏的比例是6/8,由於他們與第5號區塊的代數相差2,由以前所說的概念咱們也知道,獎勵比例是與間隔代數成反比的。這樣出現的叔塊就會一個個地被招安,直至它超出了7代。
從底層代碼中就能看出:
https://github.com/ethereum/go-ethereum/blob/master/consensus/ethash/consensus.go
// Ethash proof-of-work protocol constants. var ( FrontierBlockReward = big.NewInt(5e+18) // Block reward in wei for successfully mining a block ByzantiumBlockReward = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Byzantium maxUncles = 2 // Maximum number of uncles allowed in a single block allowedFutureBlockTime = 15 * time.Second // Max time from current time allowed for blocks, before they're considered future blocks )
以前的獎勵FrontierBlockReward是5eth,如今的獎勵ByzantiumBlockReward是3eth,一次最多歸入主鏈的叔塊數是2,出塊時間是15秒
注意:
以太坊中的出塊獎勵不會隨着區塊數量的增多而減小,以太坊中不管什麼時候出塊都會得到出塊獎勵,而比特幣中區塊的樹目超過兩千一百萬之後就沒有出塊獎勵,此後礦工挖礦的動力來自於交易費了。