天天看點

以太坊-GHOST協定

一 為什麼要引入GHOST協定?

在區塊鍊中為了提高交易速度,需要減少出塊時間進而加快出塊速度;區塊時間的減少會導緻網絡安全性下降,而且對大的礦池有利,對小的礦池或單個礦工不利。在以太坊中引入GHOST協定,來解決這個問題。關于為什麼出塊時間縮短後,會出現安全性下降和對小礦池不利可以參考《以太坊原理簡介》中叔塊部分内容。

另外,在以太坊中,區塊分叉非常常見,是以在發生分叉之後應盡快合并分叉以維護區塊鍊的統。

二 示例解釋Ghost協定

1  場景示例

假設目前以太坊網絡中所有礦工都是基于A來挖礦,當一個礦工(w0)打包出一個區塊B,并将B廣播出去,告訴其他礦工B已經被挖掘出來了,你們可以來基于B來挖礦了。目前以太坊的處快時間是15s,而在15s内,這個區塊B可能還沒有傳遍整個區塊鍊網絡,在收到廣播前礦工們還是基于A來繼續挖礦;假設有四個礦工w1、w2、w3、w4在收到廣播前基于A分别挖出了B1、B2、B3、B4,并廣播的網絡中。

以太坊-GHOST協定

此時将面臨這樣幾個問題:

 - 礦工w0、w1、w2、w3、w4都希望自己挖出的區塊能放到主鍊上。

 - 因為w0最早廣播,是以也就最可能成為主鍊上的區塊。

 - 如果w0是一個大礦池(p0)中的一個礦工,因為同一個礦池中,是以這個礦池的礦工幾乎能夠在w0挖出B塊以後,立即基于B0開始挖礦;而其他節點因為受到廣播的時間比較晚,這樣在挖礦中處于劣勢,也就很難獲得挖礦獎勵,礦工們也就失去和p0在同一個網絡中挖礦的動力。[傳播時間/出塊時間]比值越大,那麼這種劣勢越明顯。

區塊鍊的主鍊隻有一條,如何讓大家都願意在同一個條主鍊上挖礦,并且有動力的挖礦呢?即對于小礦工們而言,願意接受大礦池挖出來的區塊成為主鍊的區塊,并且自己挖出新塊以後也能得到一定的獎勵,而不會因為廣播的時間差而盡做無用功?

2  GHOST協定解決方案

以太坊-GHOST協定

如上圖所示;礦池p0中的礦工基于B挖礦的時候,可以接納其他礦工挖出來的區塊(B1、B2)作為叔塊。因為p0是大礦池,假設p0礦池很快挖出C塊并廣播出去,因為接納了兩個分叉區塊B1、B2,那麼B1、B2對應的礦工w1、w2分别獲得出塊獎勵的7/8;另外,p0因為接納了兩個分叉區塊,除了出塊獎勵之外,可以額外得到出塊獎勵的1/32*2(2指的是接納的叔塊數量)。

還在繼續挖C塊的礦工,在收到C塊資訊以後廣播後,檢驗發現p0釋出的C塊确實是最長鍊。而挖出B1、B2的礦工w1、w2如果繼續在自己的分叉鍊上繼續挖礦,而競争讓自己的分叉鍊競争成為主鍊的可能性很低,這樣自己将一無所獲;如果接受C對應的鍊,則可獲得區塊獎勵的7/8作為回報,兩相對比很容易選擇接納C對應的鍊作為主鍊。如此對于礦池p0和礦工w1、w2都是有益的,如此也能讓整個以太坊網絡分叉迅速收斂。

因為C區塊接納了B1、B2作為叔塊,響應的w1、w2獲得了出塊獎勵;但是對于其他的分叉(B3、B4)來說确實什麼都沒獲得,那麼w3、w4能願意放棄自己挖出來區塊麼?如何讓他們放棄自己所在的分叉,轉而擁抱最長的主鍊?GHOST協定規定,如果D接納B3、B4,那麼B3、B4對應的礦工w3、w4分别能獲得出塊獎勵的6/8,因為D接納了分叉區塊,除了出塊獎勵以外,還能獲得出塊獎勵的1/32*2。

為什麼B3、B4被D接納時,礦工獲得的獎勵是6/8,而B1、B2被C接納時,礦工獲得的獎勵是7/8呢?那是因為D距離B3、B4的路徑更遠,B3、B4競争成為主鍊的希望更加渺茫,是以獎勵自然會少一些。

當然如果基于A挖出來的子塊遠遠不止B、B1、B2、B3、B4,那麼接下來一個區塊同樣可以引用這些B級叔塊,不過最大的深度不超過6。

三 GHOST協定

1   GHOST協定

區塊可以不引用叔塊,但最多引用兩個叔塊。

叔塊必須是區塊的前2層~前7層的祖先的直接的子塊。

被引用過的叔塊不能被重複引用。

引用叔塊的區塊,可以獲得挖礦報酬的1/32,也就是5*1/32=0.15625 Ether。最多獲得2*0.15625=0.3125 Ether

被引用的叔塊,其礦工的報酬和叔塊與區塊之間的間隔層數有關系。

2  報酬與間隔層數

間隔層數 報酬比例 報酬(ether)
1 7/8 4.375
2 6/8 3.75
3 5/8 3.125
4 4/8 2.5
5 3/8 1.875
6 2/8 1.25

繼續閱讀