1. 程式人生 > >RChain的Casper共識算法

RChain的Casper共識算法

減少 余額 失敗 其他 就會 相同 mic gho 自然

RChain的Casper共識算法是基於Vlad Zamfir的correct-by-construction共識協議和CTO Greg Meredith和其他RChain成員討論而來的。他們還為Casper開發了一個模擬器:https://github.com/rchain/Casper-Proof-of-Stake/tree/simulation-dev。

1、通用預估安全協議

一個預估安全協議需要以下內容:

1)一個可能共識的值的集合C

2)一個邏輯Lc,用來判斷集合C中的元素聲明的命題是正確或者是錯誤

3)一個分類,∑代表協議,∑中的對象是協議狀態和態射的協議執行

4)一個調用評估器的函數ε,用於把協議狀態映射到邏輯中的命令

技術分享圖片

我們假設這麽一個命題:P是一個已經預估過安全的協議狀態,Q是所有可能的未來狀態都被預估器標明是P。

在邏輯中給定少數合理的約束以及預估器,我們可以得到以下的安全共識結果:

1) 如果Q1和Q2有共同的未來狀態,那麽它們的安全預估就不可能相互矛盾(如果P是安全的,非P肯定是不安全的)。因此如果節點按照預估器的行為,就不可能到達不可調和的狀態,因此達成共識是可能的。再者,一旦一個節點看到一個命題是安全的,它知道最終的公示結果也會保持是正確的。

2、RChain的預估安全協議

RChain在通用預估安全協議上擴展以滿足自身的需求,同時仍然保留上面所希望的一致安全結果。

2.1 The Consensus Values

集合C會包括所有可能的塊DAG(blockDAGs) 。與鏈結構相反,DAG結構的原因在於共識協議的某些部分需要多個父塊指針。

在區塊的上下文中需要有以下的屬性:

1)父區塊的指針

2)政治資本(PC)

3)數據

4)原則 (指向其他區塊的指針,那些在創建的時候就被驗證器看到的區塊)

一個區塊包含的數據取決於它是什麽類型的區塊,與用戶最相關的將是運行在RhoVM上包含計劃交易的區塊,但是與當前討論最相關的將是包含DAG中其他區塊的“確認”的區塊。這些區塊在共識協議當中扮演者重要的角色。這些數據還可能會強制執行“削減條件”,從而懲罰生成無效塊的驗證人。

2.2 The Logic and Propositions

其次,我們需要定義我們用來談論blockDAG的邏輯Lc。 在這裏,想想自然陳述是真的還是假的,似乎是最簡單也是最明智的。例如,“區塊在DAG中”或“區塊有父母”。 最終,我們最關心的聲明將是前者,因為這是我們的“分岔選擇規則”。 (對於嚴格的數學處理,我們需要對邏輯細節做更精確的描述,但上面的直覺對我們來說已經足夠了。)

2.3 The Protocol‘s Specification

現在我們要給定一個明確的協議規範,這在數學上我們認為是一個類別∑。協議的狀態是來自一個元組的集合中的{A, P, H}. A∈{"propose", "acknowledge"}是預期的行為,P∈R 是政治資本的平衡條件,H是接收過的歷史消息。 消息裏面包括用戶執行智能合約的請求和來自其它驗證器的區塊。那些包含區塊的消息必須只有創建它的驗證器的簽名。協議執行的操作是“更改意圖”、“執行”和“接收消息”(以及“不做任何事”的動作和各種動作的任何組合,因為這是一個類別的需求)。

在給出每個協議執行如何更新協議狀態的細節之前,我們需要定義預估器ε。前面提到過,估計器最關心的是那些與DAG中哪些塊有關的邏輯命題。ε是分叉選擇規則,它選擇多個可能的替代塊中的選出區塊來繼續結構。在工作證明的區塊鏈協議它的是最大工作量的鏈的頭部。這裏我們選擇的是greedy heaviest observed sub-tree (GHOST) 算法,它會選擇得分最高的區塊來繼續這個結構。一個區塊的得分b,關於消息歷史,H,它是DAG中來自其發送者的最近消息中的區塊的權重的總和。

一個區塊的權重的公司可以用下面的公司來定義:

技術分享圖片

其中f是參數的一個協議,0<f<1, ack(b)是確認b的區塊,pca(b)是連接到b的政治資本的數量。

下面是一個具體的例子:

假設有3個驗證器:A, B, C,讓我們以A的角度來看,假設她有一個與下圖一致的消息歷史:

技術分享圖片

在圖中,區塊在其創建者之上對齊。每個區塊上都標有它的名字還有政治資本的數量,箭頭指示父區塊指針。

此外,標有“ACK”的標記還表示目標區塊中的確認數據存在於來源區塊中。消息歷史記錄顯示來自每個發件人的最新消息是 A - b6, B - b5, C - b4。

因此只有這些塊有非0的得分,按照上面的公司,W(b6) = 3, W(b5) = 4f2, and W(b4) = 2f。然後遍歷整個DAG,我們計算出來得分:

Score(b6) = 3 +4f2 + 2f, Score(b5) = 4f2 + 2f, Score(b4) = 2f。因此b6有最高的得分,未來通過A創建的區塊必須從b6構建,除非它收到一條改變得分的消息。

註意,如果我們回顧一條消息(在創建B6之前),Score(b5) = 4f2 + 2f + 2(+2是來自b1,它具有A最近的消息,b6沒有)它的得分是最高的,這是為什麽b6是建立在b5之後的原因。

還要註意的是,b3和b4可以被認為是另外“促進”A的區塊兩個驗證人,b5充當前兩個非沖突塊的區塊“連接”成一個區塊,這樣就可以使結構繼續擴展,又不留下任何已經確認一致的塊。

我們再回到指定協議執行上,更改意向協議執行只是改變了預期的行為,而行為觸發了當前的預期行動。這裏有兩種可能采取的行動:

1、提議(Propose),根據消息歷史記錄中的一個或多個未處理的智能合同請求創建交易計劃,創建一個區塊需要根據合約中涉及的父區塊的名字、GHOST分叉規則、政治資本的數量(由驗證器選擇,需要註意的的是政治中心越多區塊的權重越高,這以為著它更可能被GHOST分叉規則選出來)、作為數據創建的計劃、從消息歷史記錄中可作為理由的所有區塊(這裏可以做的一個喲優化是,只選擇那些相關的區塊)。

2、承認(Acknowledge),促進或者連接。從發件人中選擇消息歷史記錄中最新消息的任意數量的獨立塊(一個區塊是一個選項,它將是"promoting")。獨立性的含義是既不能通過DAG連接從另一個達到,並且包含在它們的未連接的DAG的部分中的任何數據不沖突。然後創建一個新的區塊,需要的東西和提議是一樣。

兩種執行對協議狀態的影響是將生成的塊添加到消息歷史中(驗證器立即收到所有發送給網絡的消息),減少區塊的政治資本的余額。政治資本的余額的增加是根據遞歸公式在區塊中確認的。

技術分享圖片

pce(b)是區塊b掙到的政治資本數量。需要註意的是,最新的消息的約束會組織它去增加舊的區塊的政治資本。
單一確認規則同樣可以防止重復提交同一區塊進行的快速“政治資本挖掘”。

最後的協議執行,接受消息,並沒有像它剛開始表現的那麽簡單。當然,它把新消息添加到消息歷史中,但同樣重要的是這條消息是在這個動作當中驗證。
這一步是必要的,以確保blockDAG的完整性。實際上,因為這是一個不信任的系統,所有驗證人都需要獨立的驗證它所受到的所有消息。
收到新消息時,有幾個不同的事情需要驗證:

1)消息不產生歧義。歧義的定義是,來自同一個發送方的兩條消息沒法證明另外一條消息。也就是說,這兩個消息都不出現在另一條消息的理由(或遞歸地在這些理由中)。這是一種拜占庭式的故障,因為它表明發送方的行為就像在運行協議的兩個獨立版本。否則,發件人的最新消息將包含發件人在其理由中的所有過去消息。

2)如果一條消息是一個包含交易的區塊,那麽它的所有交易都是合法的。即智能合約還沒有被前面的區塊執行,並且使用事務來更新虛擬機狀態成功沒有錯誤。 例如。 導致雙重花費的交易應該是錯誤的,因此是無效的。

3)如果消息是連接類型的確認,那麽區塊是相互獨立的,並且之前沒有被相同的發送方確認過。 同樣的事務不會存在於多個確認區塊中。

4)如果消息是一個削減區塊,它確實對應於一個真正的違反行為。

5)如果消息是任何類型的確認,那麽確認的所有區塊都是有效的。也就是說,這個子彈使驗證成為一個遞歸過程。

如果上述的任何條件違反了,那麽這條消息就是無效的。這種違規行為就會被報告。在這種情況下,將創建一個新的“削減”塊,懲罰無效消息的違規發件人。

協議的最後一部分是終結的概念,即我們怎麽知道這個區塊會永久的存在於DAG當中?目前的區塊鏈使用區塊的深度作為最終的代理,並且在技術上沒有區塊是結束了。這裏用一個區塊的深度以便了解一個區塊是否仍然是主DAG的一部分的可能性,然而我們也可以引入合理的“同步約束”來具有真正的結束。一個驗證人(或者用戶)在消息已經存在它的歷史當中有一段時間T(假設說是1星期),就會認為一個區塊已經結束了。這表示終結的概念是相對的,它取決於消息的接收,但實際上,在時限足夠長的時候,這並不構成太大的問題。如果兩個節點完成相互排斥的區塊,這確實允許共識失敗的可能性,但是當時間窗口很長並且由於下面討論的激勵時,這種情況也是不可能的。

2.4 Economic Considerations:

與其他區塊鏈一樣,提出交易塊的驗證人也包括反映驗證人為執行計算而獲得的“費用”(以REV的形式)的一些交易。因此,驗證人被激勵來確保他們創建的區塊保留在主DAG中,否則他們被獎勵的交易將會丟失。GHOST分支選擇規則會導致更多權重的區塊更可能在主DAG中結束,因此,將大量政治資本附加到他們創建的去塊上的驗證人更可能保留他們獲得小費。因此,在提出區塊時花費政治資本是經濟上的激勵。而且,由於政治資本被納入共識協議,花費之後賺取政治資本的唯一途徑就是承認其他區塊。被別人承認的區塊(自己提議的區塊沒有政治資本,得分會比原來的要低,因為f<1,並且GHOST只會考慮最近的消息)是最有可能用於擴展DAG的,因為他們的得分比較高。因此,推動區塊對於每個人都是有利的,因為推動者可獲得政治資本供未來使用,而推廣者可有可能獲得小費。因此,連接區塊是更加激勵,因為它把所有個人促銷的好處的進行了加和。

個人行為的好處:

1、自動輪流驗證人。最好賺取政治資本的方式是從別的驗證人花費的,政治資本的流動(以及因此提出障礙的能力)在不同的驗證人之間;

2、減少分叉。推動區塊和合並區塊工作,以保持單一的主要DAG。

2.5 Slashing: Punishments for invalid blocks

產生無效塊的驗證人應該避免他再次這樣做,因此懲罰應該包括減少他們的政治資本。事實上,允許通過懲罰減少政治資本,可以防止一個壞的驗證人。然而,和解原則上總是可能的,因為驗證人仍然可以獲得政治資本,並且如果需要的話,慢慢地將他們的余額回到零以上。

有關各種違規行為的確切數額的細節尚未制定出來。

2.6 The one free parameter in the protocol f

f的值應該是多少呢?f的值會不會因為網絡中的參與者數量的變化而隨時間改變?這些問題還需要通過模擬器進行更多的驗證。

2.7 Initiating the protocol: Where do the first validators and political capital come from?

由於政治資本只能通過已經擁有政治資本的區塊來推動,所以一個自然的問題是第一個政治資本來自哪裏。一個解決辦法是讓創世紀塊有一定的政治資本附在他們身上。

所有的驗證人需要推進至少一個區塊,為了增加政治資本(初始值為0)。單一承認規則防止這種剝削獲得無限量的政治資本。請註意, 即使一個驗證器人創建了一個無限鏈,它從創世區塊開始不斷的推進區塊, 但是幾何系列將收斂到一個有限的值。此外, 單一確認規則可防止創建多個此類鏈。

一個相關的問題是,誰會成為驗證人?一個簡單的答案,任何人。每一個用戶加入網絡之後,它的政治資本是0,他們不能提出創建新的區塊,但是他們可以參與驗證的過程。只有參與共識過程的用戶才能獲得政治資本。我們確保只有那些真正對網絡感興趣的人才能貢獻未來的區塊,同時仍然讓任何人都有機會達到這個水平。

2.8 Bad Behaviour Technically Allowed in Present Protocol Specification

1、提出一個區塊,自己馬上去推銷它。這可以防止別人馬上承認了你提出的區塊。這可以減少對手從你的提議裏面獲得的政治資本。確實減少了你正在構建的分支的分數(因為得分只考慮了最近的消息,而升級區塊的權重將低於原來的),因此有一種可能性,你的的區塊將錯過叉選擇規則。因此,目前尚不清楚在這種情況下壟斷政治資本的策略是否會成功。

2、用毫無意義的確認淹沒網絡,試圖崩潰更小的節點。例如,寫一個腳本,在創世區塊的基礎上創建一個全是確認區塊的無限鏈,類似於DDOS攻擊。如上所述,這種攻擊行為是不被系統本身鼓勵的,但是出於一些外部的原因,有人想搞垮RChain的話,這是一種可以想到的方法。

一個簡單的(雖然不方便)的方式去這將驗證人在發出確認之前要出入一個驗證碼。另外一個選項是內置一個防火墻,在檢測到這種攻擊的時候能自動的屏蔽掉另外的驗證人。

2.9 Future Optimizations

允許沖突區塊的連接,解決沖突的一個方案是在提出區塊的同時確認獨立區塊的分片。

Other Notes

1、一個驗證人離開了幾個月,然後又回來怎麽辦?怎麽樣在保證網絡不受攻擊的情況下重新建立信任?

政治資本是通過在達成共識的過程中積極活動而獲得的,因此是信任的代表。這個問題是政治資本有某種“半衰期”的一個很好的論據。這就意味著當驗證人離開之後,他需要重新努力才能回到以前的地位。關於這個半衰期是多久,這個還在討論中。

2、我們有沒有解決囚徒困境的方法?

交易收入(代替驗證人驗證每個共享跨分片狀態的分片)就是一個囚徒困境。囚徒困境,作為一個無限重復博弈的遊戲。它有一個最優的默認合作策略,甚至在失去信任之前原諒一次背叛。我們簡化了這個遊戲,值得信任的名稱空間將得到很好的處理,而不可信的命名空間與網絡的其他部分隔離開來。我們還會有一些跨名字空間的驗證人,確保不會被一些垃圾玩家把整個網絡都搞臭了。

3、有沒有可能操縱共識協議來獲得免費的存儲?也就是說,因為共識的歷史需要作為證據永久存儲,那這些信息是否可以由客戶端使用,而不需要支付適當的存儲費用。

這是可能的,可以通過設定確認區塊中的數據格式來避免這種情況。

該文章翻譯自:https://rchain.atlassian.net/wiki/spaces/CORE/pages/92536846/Casper+for+RChain

翻譯水平有限,我本身對區塊鏈的了解也有限,如有錯誤,請及時聯系我,大家一起提高,謝謝!

相關文章:

1、https://medium.com/rchain-cooperative/a-visualization-for-the-future-of-blockchain-consensus-b6710b2f50d6

2、https://github.com/ethereum/research/blob/master/papers/cbc-consensus/AbstractCBC.pdf

3、https://github.com/ethereum/research/blob/master/papers/CasperTFG/CasperTFG.pdf

對區塊鏈技術感興趣的童鞋可以添加QQ群:711399035。大家一起研究區塊鏈技術,投資好的區塊鏈項目。

岑玉海

轉載請註明出處,謝謝!

RChain的Casper共識算法