1. 程式人生 > 其它 >ETH-以太坊的GHOST協議(區塊鏈技術與應用)

ETH-以太坊的GHOST協議(區塊鏈技術與應用)

GHOST協議

比特幣由於十分鐘出一次塊,而傳播到其他節點大概需要十幾秒,所以分叉情況少;但是以太坊出塊時間十幾秒,所以就導致了分叉情況很常見。

GHOST最初版本

如圖,假定以太坊系統存在以下情況,A、B、C、D在四個分支上,最後,隨著時間推移B所在鏈成為最長合法鏈,因此A、C、D區塊都作廢(orphan block/stale block),但為了補償這些區塊所屬礦工所作的工作,給這些區塊一些“補償”,並稱其為"Uncle Block"(叔父區塊)。

規定E區塊在釋出時可以將A、C、D叔父區塊包含進來,A、C、D叔父區塊可以得到出塊獎勵的7/8,而為了激勵E包含叔父區塊,規定E每包含一個叔父區塊可以額外得到1/32的出塊獎勵。為了防止E大量包含叔父區塊,規定一個區塊只能最多包含兩個叔父區塊,因此E在A、C、D中最多隻能包含兩個區塊作為自己的出塊獎勵

缺陷:

  1. 因為叔父區塊最多隻能包含兩個,如圖出現3個怎麼辦?
  2. 礦工自私,故意不包含叔父區塊,導致叔父區塊7/8出塊獎勵沒了,而自己僅僅損失1/32。如果甲、乙兩個大型礦池存在競爭關係,那麼他們可以採用故意不包含對方的叔父區塊,因為這樣對自己損失小而對對方損失大。

GHOST協議新版本

如下圖中1為對上面例子的補充,F為E後面一個新的區塊。因為規定E最多隻能包含兩個叔父區塊,所以假定E包含了C和D。此時,F也可以將A認為自己的的叔父區塊(實際上並非叔父輩的,而是爺爺輩的)。如果繼續往下挖,F後的新區塊仍然可以包含B同輩的區塊(假定E、F未包含完)。這樣,就有效地解決了上面提到的最初Ghost協議版本存在的缺陷。

但這樣仍然存在一定的問題。

我們將“叔父”這個概念進行擴充套件,但問題在於,“叔父”這一定義隔多少代才好呢

如下圖所示,M為該區塊鏈上一個區塊,F為其嚴格意義上的叔父,E為其嚴格意義上的“爺爺輩”。以太坊中規定,如果M包含F輩區塊,則F獲得7/8出塊獎勵;如果M包含E輩區塊,則F獲得6/8出塊獎勵,以此類推向前。直到包含A輩區塊,A獲得2/8出塊獎勵,再往前的“叔父區塊”,對於M來說就不再認可其為M的"叔父"了。

對於M來說,無論包含哪個輩分的“叔父”,得到的出塊獎勵都是1/32出塊獎勵。

也就是說,叔父區塊的定義是和當前區塊在七代之內有共同祖先才可(合法的叔父只有6輩)。

這樣,就方便了全節點進行記錄,此外,也從協議上鼓勵一旦出現分叉馬上進行合併。

以太坊中的獎勵

block reward(靜態獎勵) tx fee(動態獎勵) gas fee(汽油費)

BTC:靜態獎勵(出塊獎勵)+動態獎勵(交易費,佔據比例很小)

ETH:靜態獎勵(出塊獎勵+包含叔父區塊的獎勵)+動態獎勵(汽油費,佔據比例很小,叔父區塊沒有)

BTC中為了人為製造稀缺性,比特幣每隔一段時間出塊獎勵會降低,最終當出塊獎勵趨於0後會主要依賴於交易費運作。而以太坊中並沒有人為規定每隔一段時間降低出塊獎勵。

  • 以太坊中包含了叔父區塊,要不要包含叔父區塊中的交易?

不應該,叔父區塊和同輩的主鏈上區塊有可能包含有衝突的交易。而且我們前文也提到,叔父區塊是沒有動態獎勵的。因此,一個節點在收到一個叔父區塊的時候,只檢查區塊合法性而不檢查其中交易的合法性,也就是是不是符合挖礦難度。

叔父區塊上的交易是不執行的,主鏈上的節點收到這個交易還是會執行,只是可能多等幾個區塊。

  • 怎麼檢測前面的鏈上有多少叔父區塊?

每個釋出區塊需要說明父區塊是誰,所以可以檢測到父區塊跟當前區塊是不是有共同祖先。

對於分叉後的堂哥區塊怎麼辦?例如下圖所示,A->F該鏈並非一個最長合法鏈,所以B->F這些區塊怎麼辦?該給挖礦補償嗎?

如果規定將下面整條鏈作為一個整體,給予出塊獎勵,這一定程度上鼓勵了分叉攻擊(降低了分叉攻擊的成本,因為即使攻擊失敗也有獎勵獲得)。因此,ETH系統中規定,只認可A區塊為叔父區塊,給予其補償,而其後的區塊全部作廢。

以太坊的真實資料

Etherscan網站,該網站可以實時觀看以太坊的資料。