RChain的Casper共識算法是基於Vlad Zamfir的correct-by-construction共識協議和CTO Greg Meredith和其餘RChain成員討論而來的。他們還爲Casper開發了一個模擬器:https://github.com/rchain/Casper-Proof-of-Stake/tree/simulation-dev。git
一個預估安全協議須要如下內容:github
1)一個可能共識的值的集合C 算法
2)一個邏輯Lc,用來判斷集合C中的元素聲明的命題是正確或者是錯誤api
3)一個分類,∑表明協議,∑中的對象是協議狀態和態射的協議執行安全
4)一個調用評估器的函數ε,用於把協議狀態映射到邏輯中的命令網絡
咱們假設這麼一個命題:P是一個已經預估過安全的協議狀態,Q是全部可能的將來狀態都被預估器標明是P。ide
在邏輯中給定少數合理的約束以及預估器,咱們能夠獲得如下的安全共識結果:函數
1) 若是Q1和Q2有共同的將來狀態,那麼它們的安全預估就不可能相互矛盾(若是P是安全的,非P確定是不安全的)。所以若是節點按照預估器的行爲,就不可能到達不可調和的狀態,所以達成共識是可能的。再者,一旦一個節點看到一個命題是安全的,它知道最終的公示結果也會保持是正確的。oop
RChain在通用預估安全協議上擴展以知足自身的需求,同時仍然保留上面所但願的一致安全結果。區塊鏈
集合C會包括全部可能的塊DAG(blockDAGs) 。與鏈結構相反,DAG結構的緣由在於共識協議的某些部分須要多個父塊指針。
在區塊的上下文中須要有如下的屬性:
1)父區塊的指針
2)政治資本(PC)
3)數據
4)原則 (指向其餘區塊的指針,那些在建立的時候就被驗證器看到的區塊)
一個區塊包含的數據取決於它是什麼類型的區塊,與用戶最相關的將是運行在RhoVM上包含計劃交易的區塊,可是與當前討論最相關的將是包含DAG中其餘區塊的「確認」的區塊。這些區塊在共識協議當中扮演者重要的角色。這些數據還可能會強制執行「削減條件」,從而懲罰生成無效塊的驗證人。
其次,咱們須要定義咱們用來談論blockDAG的邏輯Lc。 在這裏,想一想天然陳述是真的仍是假的,彷佛是最簡單也是最明智的。例如,「區塊在DAG中」或「區塊有父母」。 最終,咱們最關心的聲明將是前者,由於這是咱們的「分岔選擇規則」。 (對於嚴格的數學處理,咱們須要對邏輯細節作更精確的描述,但上面的直覺對咱們來講已經足夠了。)
如今咱們要給定一個明確的協議規範,這在數學上咱們認爲是一個類別∑。協議的狀態是來自一個元組的集合中的{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充當前兩個非衝突塊的區塊「鏈接」成一個區塊,這樣就可使結構繼續擴展,又不留下任何已經確認一致的塊。
咱們再回到指定協議執行上,更改意向協議執行只是改變了預期的行爲,而行爲觸發了當前的預期行動。這裏有兩種可能採起的行動:
一、提議(Propose),根據消息歷史記錄中的一個或多個未處理的智能合同請求建立交易計劃,建立一個區塊須要根據合約中涉及的父區塊的名字、GHOST分叉規則、政治資本的數量(由驗證器選擇,須要注意的的是政治中心越多區塊的權重越高,這覺得着它更可能被GHOST分叉規則選出來)、做爲數據建立的計劃、從消息歷史記錄中可做爲理由的全部區塊(這裏能夠作的一個喲優化是,只選擇那些相關的區塊)。
二、認可(Acknowledge),促進或者鏈接。從發件人中選擇消息歷史記錄中最新消息的任意數量的獨立塊(一個區塊是一個選項,它將是"promoting")。獨立性的含義是既不能經過DAG鏈接從另外一個達到,而且包含在它們的未鏈接的DAG的部分中的任何數據不衝突。而後建立一個新的區塊,須要的東西和提議是同樣。
兩種執行對協議狀態的影響是將生成的塊添加到消息歷史中(驗證器當即收到全部發送給網絡的消息),減小區塊的政治資本的餘額。政治資本的餘額的增長是根據遞歸公式在區塊中確認的。
pce(b)是區塊b掙到的政治資本數量。須要注意的是,最新的消息的約束會組織它去增長舊的區塊的政治資本。
單一確認規則一樣能夠防止重複提交同一區塊進行的快速「政治資本挖掘」。
最後的協議執行,接受消息,並無像它剛開始表現的那麼簡單。固然,它把新消息添加到消息歷史中,但一樣重要的是這條消息是在這個動做當中驗證。
這一步是必要的,以確保blockDAG的完整性。實際上,由於這是一個不信任的系統,全部驗證人都須要獨立的驗證它所受到的全部消息。
收到新消息時,有幾個不一樣的事情須要驗證:
1)消息不產生歧義。歧義的定義是,來自同一個發送方的兩條消息無法證實另一條消息。也就是說,這兩個消息都不出如今另外一條消息的理由(或遞歸地在這些理由中)。這是一種拜占庭式的故障,由於它代表發送方的行爲就像在運行協議的兩個獨立版本。不然,發件人的最新消息將包含發件人在其理由中的全部過去消息。
2)若是一條消息是一個包含交易的區塊,那麼它的全部交易都是合法的。即智能合約尚未被前面的區塊執行,而且使用事務來更新虛擬機狀態成功沒有錯誤。 例如。 致使雙重花費的交易應該是錯誤的,所以是無效的。
3)若是消息是鏈接類型的確認,那麼區塊是相互獨立的,而且以前沒有被相同的發送方確認過。 一樣的事務不會存在於多個確認區塊中。
4)若是消息是一個削減區塊,它確實對應於一個真正的違反行爲。
5)若是消息是任何類型的確認,那麼確認的全部區塊都是有效的。也就是說,這個子彈使驗證成爲一個遞歸過程。
若是上述的任何條件違反了,那麼這條消息就是無效的。這種違規行爲就會被報告。在這種狀況下,將建立一個新的「削減」塊,懲罰無效消息的違規發件人。
協議的最後一部分是終結的概念,即咱們怎麼知道這個區塊會永久的存在於DAG當中?目前的區塊鏈使用區塊的深度做爲最終的代理,而且在技術上沒有區塊是結束了。這裏用一個區塊的深度以便了解一個區塊是否仍然是主DAG的一部分的可能性,然而咱們也能夠引入合理的「同步約束」來具備真正的結束。一個驗證人(或者用戶)在消息已經存在它的歷史當中有一段時間T(假設說是1星期),就會認爲一個區塊已經結束了。這表示終結的概念是相對的,它取決於消息的接收,但實際上,在時限足夠長的時候,這並不構成太大的問題。若是兩個節點完成相互排斥的區塊,這確實容許共識失敗的可能性,可是當時間窗口很長而且因爲下面討論的激勵時,這種狀況也是不可能的。
與其餘區塊鏈同樣,提出交易塊的驗證人也包括反映驗證人爲執行計算而得到的「費用」(以REV的形式)的一些交易。所以,驗證人被激勵來確保他們建立的區塊保留在主DAG中,不然他們被獎勵的交易將會丟失。GHOST分支選擇規則會致使更多權重的區塊更可能在主DAG中結束,所以,將大量政治資本附加到他們建立的去塊上的驗證人更可能保留他們得到小費。所以,在提出區塊時花費政治資本是經濟上的激勵。並且,因爲政治資本被歸入共識協議,花費以後賺取政治資本的惟一途徑就是認可其餘區塊。被別人認可的區塊(本身提議的區塊沒有政治資本,得分會比原來的要低,由於f<1,而且GHOST只會考慮最近的消息)是最有可能用於擴展DAG的,由於他們的得分比較高。所以,推進區塊對於每一個人都是有利的,由於推進者可得到政治資本供將來使用,而推廣者可有可能得到小費。所以,鏈接區塊是更加激勵,由於它把全部我的促銷的好處的進行了加和。
我的行爲的好處:
一、自動輪流驗證人。最好賺取政治資本的方式是從別的驗證人花費的,政治資本的流動(以及所以提出障礙的能力)在不一樣的驗證人之間;
二、減小分叉。推進區塊和合並區塊工做,以保持單一的主要DAG。
產生無效塊的驗證人應該避免他再次這樣作,所以懲罰應該包括減小他們的政治資本。事實上,容許經過懲罰減小政治資本,能夠防止一個壞的驗證人。然而,和解原則上老是可能的,由於驗證人仍然能夠得到政治資本,而且若是須要的話,慢慢地將他們的餘額回到零以上。
有關各類違規行爲的確切數額的細節還沒有制定出來。
f的值應該是多少呢?f的值會不會由於網絡中的參與者數量的變化而隨時間改變?這些問題還須要經過模擬器進行更多的驗證。
因爲政治資本只能經過已經擁有政治資本的區塊來推進,因此一個天然的問題是第一個政治資原本自哪裏。一個解決辦法是讓創世紀塊有必定的政治資本附在他們身上。
全部的驗證人須要推動至少一個區塊,爲了增長政治資本(初始值爲0)。單一認可規則防止這種剝削得到無限量的政治資本。請注意, 即便一個驗證器人建立了一個無限鏈,它從創世區塊開始不斷的推動區塊, 可是幾何系列將收斂到一個有限的值。此外, 單一確認規則可防止建立多個此類鏈。
一個相關的問題是,誰會成爲驗證人?一個簡單的答案,任何人。每個用戶加入網絡以後,它的政治資本是0,他們不能提出建立新的區塊,可是他們能夠參與驗證的過程。只有參與共識過程的用戶才能得到政治資本。咱們確保只有那些真正對網絡感興趣的人才能貢獻將來的區塊,同時仍然讓任何人都有機會達到這個水平。
一、提出一個區塊,本身立刻去推銷它。這能夠防止別人立刻認可了你提出的區塊。這能夠減小對手從你的提議裏面得到的政治資本。確實減小了你正在構建的分支的分數(由於得分只考慮了最近的消息,而升級區塊的權重將低於原來的),所以有一種可能性,你的的區塊將錯過叉選擇規則。所以,目前尚不清楚在這種狀況下壟斷政治資本的策略是否會成功。
二、用毫無心義的確認淹沒網絡,試圖崩潰更小的節點。例如,寫一個腳本,在創世區塊的基礎上建立一個全是確認區塊的無限鏈,相似於DDOS攻擊。如上所述,這種攻擊行爲是不被系統自己鼓勵的,可是出於一些外部的緣由,有人想搞垮RChain的話,這是一種能夠想到的方法。
一個簡單的(雖然不方便)的方式去這將驗證人在發出確認以前要出入一個驗證碼。另一個選項是內置一個防火牆,在檢測到這種攻擊的時候能自動的屏蔽掉另外的驗證人。
容許衝突區塊的鏈接,解決衝突的一個方案是在提出區塊的同時確認獨立區塊的分片。
一、一個驗證人離開了幾個月,而後又回來怎麼辦?怎麼樣在保證網絡不受攻擊的狀況下從新創建信任?
政治資本是經過在達成共識的過程當中積極活動而得到的,所以是信任的表明。這個問題是政治資本有某種「半衰期」的一個很好的論據。這就意味着當驗證人離開以後,他須要從新努力才能回到之前的地位。關於這個半衰期是多久,這個還在討論中。
二、咱們有沒有解決囚徒困境的方法?
交易收入(代替驗證人驗證每一個共享跨分片狀態的分片)就是一個囚徒困境。囚徒困境,做爲一個無限重複博弈的遊戲。它有一個最優的默認合做策略,甚至在失去信任以前原諒一次背叛。咱們簡化了這個遊戲,值得信任的名稱空間將獲得很好的處理,而不可信的命名空間與網絡的其餘部分隔離開來。咱們還會有一些跨名字空間的驗證人,確保不會被一些垃圾玩家把整個網絡都搞臭了。
三、有沒有可能操縱共識協議來得到免費的存儲?也就是說,由於共識的歷史須要做爲證據永久存儲,那這些信息是否能夠由客戶端使用,而不須要支付適當的存儲費用。
這是可能的,能夠經過設定確認區塊中的數據格式來避免這種狀況。
該文章翻譯自:https://rchain.atlassian.net/wiki/spaces/CORE/pages/92536846/Casper+for+RChain
翻譯水平有限,我自己對區塊鏈的瞭解也有限,若有錯誤,請及時聯繫我,你們一塊兒提升,謝謝!
相關文章:
一、https://medium.com/rchain-cooperative/a-visualization-for-the-future-of-blockchain-consensus-b6710b2f50d6
二、https://github.com/ethereum/research/blob/master/papers/cbc-consensus/AbstractCBC.pdf
三、https://github.com/ethereum/research/blob/master/papers/CasperTFG/CasperTFG.pdf
對區塊鏈技術感興趣的童鞋能夠添加QQ羣:711399035。你們一塊兒研究區塊鏈技術,投資好的區塊鏈項目。
岑玉海
轉載請註明出處,謝謝!