作者:林冠巨集 / 指尖下的幽靈
GitHub : github.com/af913337456…
前序
本人版暫名為
《區塊鏈以太坊DApp實戰開發》
一書,即將完成,是一本廢話少、講解通俗、實操性強的技術書籍。本文為書中的小節的部分內容。想涉足這個區塊鏈領域技術開發的同僚可以留意我的部落格,屆時會發布。
目錄
- PoW 共識機制
- 以太坊目前所使用的共識演算法
- Ghost 協議
- 選擇最優鏈
- 分叉塊處理
- Casper PoS變種共識機制
- 如何成為驗證人
- 驗證人如何獲取保證金
- 候選區塊如何產生
- 按照什麼規則輪著出塊
- 如何判斷勝出區塊
- 驗證人聯盟投注的作弊問題
PoW 與 PoS 共識機制
如果對PoW PoS共識機制
還不瞭解的朋友,可以看下我之前的兩篇文章
以太坊目前所使用的共識演算法
如果別人問你“以太坊
目前所使用的共識演算法”是什麼?而你此時去瀏覽器搜尋就會發現有些文章說是PoS
,又有些說是PoW
。
完整且正確的說法應該是這樣的,首先以太坊的原始碼是分有階段,不同階段所使用的共識演算法要分開來說。這其實也是PoW共識機制
與以太坊
的關係。所分的階段有:
Frontier
(前沿)。這個階段的版本是以太坊的基礎,此時的以太坊具備了挖礦
、交易
以及智慧合約
功能模組。但是沒有供普通使用者使用的圖形化介面
,僅適合於開發者使用。所使用的共識演算法是“PoW”。Homestead
(家園)。這個階段的以太坊網路變得更加穩定,且具備了圖形介面的錢包軟體。所使用的共識演算法還是是“PoW”。Metropolis
(大都會)。分有下面兩個子版本:拜占庭
。釋出了集合錢包功能以及合約釋出等豐富功能的圖形化介面軟體“Mist
”,同時也引入了很多新的技術,例如零知識證明
,抽象賬號等。使用的共識演算法仍然是“PoW”。君士坦丁堡
。使用混合共識演算法“PoW + PoS”,為“寧靜”做鋪墊。
Serenity
(寧靜)。將把以太坊的共識演算法全部換成基於“PoS”的變種演算法–“Casper投注共識
”,它屬於PoS
系列。
截至2018-12-14
,目前以太坊的最新發布版本是Metropolis
大都會的拜占庭
。由上述可知,在以太坊發展的過程中,它的共識演算法對於不同的階段,分別是:PoW共識
,PoW + PoS 共識
和PoS
Ghost 協議
Ghost 協議
的全稱是“Greedy Heaviest-Observed Sub-Tree protocol
”,貪婪子樹協議,又稱幽靈協議
,它屬於主鏈選擇協議
範疇。
首先在比特幣公鏈
中,它是根據最長鏈規則
來解決區塊鏈分叉問題的。請注意,並不是所有的區塊鏈公鏈解決分叉問題都是使用最長鏈規則
,以太坊就不是。
選擇最優鏈
以太坊解決區塊鏈分叉問題目前所使用的是Ghost 協議
,所以Ghost
協議的真實作用是用來進行主鏈選擇
的。不同於比特幣的最長鏈規則
,它在選擇最長鏈的時候不以哪條鏈區塊連續最長為標準,而是將分叉區塊
也考慮了進去,選擇出一條包含了分叉區塊在內區塊數目最多的鏈作為最長鏈。例如下圖所示:
在上圖的分叉情況中,在比特幣公鏈中,最終勝出的是鏈:0 <- 1A <- 2C <- 3F <- 4B <- 5A,一條由最長鏈規則
選擇的鏈。而在以太坊公鏈中,由幽靈協議得出的最終勝出的是:0 <- 1A <- 2B <- 3D <- 4A 。
原因就是在上面的分叉情況中,幽靈協議把分叉區塊
也考慮進去了,統計總的區塊數,發現在包含了區塊: 0,1A,2B,3E,3D,3C,4A 的鏈是含有區塊數最多的。因此該鏈勝出,這就是幽靈協議選擇最優鏈的機制。
分叉塊處理
此外,對於在最長鏈中
被包含進去了的造成鏈分叉
的塊,例如上圖中的3E
和3C
,Ghost 協議
對它們也有一套對應的處理機制,這些區塊會被根據規則處理為:
- 孤塊,完全沒用的塊,挖出的礦工沒任何收益。
比特幣鏈中的分叉塊都是孤塊
。 - 叔塊,被一定範圍內的後續子塊所打包收納的塊,挖出叔塊的礦工會按照一定演算法給予收益。
關於叔塊方方面面的通俗詳細介紹,在我書裡,這裡就不展開說了。
我們總結一下,Ghost
幽靈協議在以太坊中主要起到了下面兩點作用:
- 選擇出最優鏈
- 對最優鏈中分叉塊進行處理
Casper PoS變種共識機制
前提:Casper 目前還沒完全公佈,還處於開發中,下面內容是根據目前現有的知識總結出的。
作為以太坊第四階段版本的共識機制,Casper投注共識
增加了懲罰機制
,並基於PoS
的思想在記賬節點中選取驗證人
,能夠投注的角色是:驗證人
。可以將這類角色理解為新一代以太坊礦工。
在casper共識機制中,驗證人
要拿出保證金
的一部分對它認為的大概率勝出的區塊進行下注:
- 如果賭對了,它們就可以拿回保證金外加區塊中的交易費用,也許還會有一些新發的貨幣;
- 如果下注沒有迅速達成一致,下注太慢,它們只能拿回部分下注金,相當於損失了一些下注金;
- 因此數個回合之後下注的結果出來,那些選錯了的驗證人就會輸掉它們的下注金;
- 此外如果驗證人過於顯著的改變下注,例如先是賭某個塊有很高概率勝出,然後又改賭另外一個塊有高概率勝出,它將被懲罰。
如何成為驗證人
想成為驗證人,是要進行交保證金
進行申請的,同時也可以在進入後選擇退出,加入和退出都會將是以太坊網路中的一種特殊的交易型別
,目前最常見的交易就是轉賬ETH代幣
。也就是說,到時候可能要呼叫一定的以太坊介面來進行申請成為驗證人
。保證金很有可能就是以太坊ETH代幣,它將會被用來投注,或被因被以太坊懲罰而沒收掉。
目前Casper
的驗證人邏輯將會通過一個名稱為Casper合約
的東西來實現,合約它提供投注,加入,取款和獲取共識資訊等一系列功能,因此通過簡單的呼叫Casper合約我們就能提交投注或者進行其他操作。Casper合約的內部狀態如下:
這個合約
會記錄當前的驗證人集合,對於每位驗證人的6項主要欄位解析如下:
Return address
,驗證人保證金的返還地址Deposit size
,當前驗證人保證金的數量(注意驗證人的投注會使這個值增加或減少)Validation code
,驗證人的驗證程式碼Seq
,最近一次投注的序號Prevhash
,最近一次投注的hash- 驗證人的每次投注的表格
驗證人如何獲取保證金
別人轉賬給驗證人的錢包地址,或者在早期版本基於PoW
挖礦收穫。
候選區塊如何產生
驗證人出塊,出塊是一個獨立於其它所有事件而發生的過程:驗證人收集交易,當輪到
他們的出塊時間時,他們就製造一個區塊,簽名,然後傳送到網路上。
按照什麼規則輪著出塊
由Casper
機制提供規則。
如何判斷勝出區塊
當驗證人中的絕大多數,滿足協議定義閾值的一群驗證人的總保證金比例達到67%到90%之間某個百分比以非常高的概率,下注某個塊勝出的時候,此區塊勝出。
驗證人聯盟投注的作弊問題
不難看出Casper
投注方式是存在有驗證人聯盟在一起,共同投注某個區塊使之勝出的問題的,對於這個問題的解決方案,目前以太坊還沒完整公佈,處於進一步的研究之中。