以太坊PoA共識引擎演算法介紹 1

2021-08-31 16:30:42 字數 3101 閱讀 8174

如果你想用以太坊搭建乙個聯盟/私有鏈, 並要求該鏈交易成本更低甚至沒有, 交易延時更低,併發更高, 還擁有完全的控制權(意味著被攻擊概率更低). 目前以太坊採用pow或後續的casper能否滿足要求?

在已經執行的測試網路ropsten中, 由於pow設定的難度較低,惡意曠工濫用較低的pow難度並將gaslimit擴大到90億(正常是470萬),傳送大量的交易癱瘓了整個網路。而在此之前,攻擊者也嘗試了多次非常長的重組(reorgs),導致不同客戶端之間的分叉,甚至不同的版本。

這些攻擊的根本原因是pow網路的安全性依賴於背後的算力。而從零開始重新啟動乙個新的testnet將不會解決任何問題,因為攻擊者可以一次又一次地進行相同的攻擊。 parity團隊決定採取緊急解決方案,回滾大量的塊,並設定不允許gaslimit超過某一閾值的軟分叉規則。

雖然parity的解決方案可能在短期內有效, 但是這不是優雅的:ethereum本身應該具有動態gaslimit限制; 也不可移植:其他客戶端需要自己實現新的軟分叉邏輯; 並與同步模式不相容, 也不支援輕客戶端; 儘管並不完美,但是parity的解決方案仍然可行。 乙個更長期的替代解決方案是使用poa共識,相對簡單並容易實現.

如何控制挖礦頻率,即出塊時間

如何驗證某個塊的有效性

如何動態調整授權簽名者(signers)列表,並全網動態同步

如何在signers之間分配挖礦的負載或者叫做挖礦的機會

對應的解決辦法如下:

協議規定採用固定的block出塊時間, 區塊頭中的時間戳間隔為15s

先看看block同步的方法,從中來分析poa中驗證block的解決辦法

有兩種同步blockchain的方法

經典方法是從創世塊開始挨個執行所有交易。 這是經過驗證的,但是在ethereum的複雜網路中,計算量非常大。

顯然第二種方法更好. 由於poa方案的塊可以僅由可信任的簽名者來建立, 因此,客戶端看到的每個塊(或塊頭)可以與可信任簽名者列表進行匹配。 要驗證該塊的有效性就必須得到該塊對應的簽名者列表, 如果簽名者在該列表中帶包該塊有效. 這裡的挑戰是如何維護並及時更改的授權簽名者列表? 儲存在智慧型合約中?不可行, 因為在快速輕量級同步期間無法訪問狀態。

因此,授權簽名者列表必須完全包含在塊頭中。那麼需要改變塊頭的結構, 引入新的字段來滿足投票機制嗎? 這也不可行:改變這樣的核心資料結構將是開發者的噩夢。

所以授權簽名者名單必須完全符合當前的資料模型, 不能改變區塊頭中的字段,而是 **復用當前可用的字段: extra欄位. **

extra是可變長陣列, 對它的修改是非侵入操作, 比如rlp,hash操作都支援可變長資料. extra中包含所有簽名者列表和當前節點的簽名者對該區塊頭的簽名資料(可以恢復出來簽名者的位址).

更新乙個動態的簽名者列表的方法是復用區塊頭中的coinbase和nonce欄位,以建立投票方案:

為了避免乙個無限的時間來統計投票,我們設定乙個投票視窗, 為乙個epoch,長度是30000個block。每個epoch的起始清空所有歷史的投票, 並作為簽名者列表的檢查點. 這允許客戶端僅基於檢查點雜湊進行同步,而不必重播在鏈路上完成的所有投票。

目前的方案是在所有signer之間輪詢出塊, 並通過演算法保證同乙個signer只能簽名(signer_count / 2) + 1)個block中第乙個.

綜上, poa的工作流程如下:

在創世塊中指定一組初始授權的signers,所有位址儲存在創世塊extra欄位中

啟動挖礦後, 該組signers開始對生成的block進行簽名並廣播.簽名結果儲存在區塊頭的extra欄位中

extra中更新當前高度已授權的所有signers的位址,因為有新加入或踢出的signer

每一高度都有乙個signer處於in-turn狀態, 其他signer處於out-of-turn狀態, in-turn的signer簽名的block會立即廣播, out-of-turn的signer簽名的block會延時一點隨機時間後再廣播, 保證in-turn的簽名block有更高的優先順序上鏈

如果需要加入乙個新的signer, signer通過api介面發起乙個proposal, 該proposal通過復用區塊頭coinbase(新signer位址)和nonce("0xffffffffffffffff")字段廣播給其他節點. 所有已授權的signers對該新的signer進行"加入"投票, 如果贊成票超過signers總數的50%, 表示同意加入

如果需要踢出乙個舊的signer, 所有已授權的signers對該舊的signer進行"踢出"投票, 如果贊成票超過signers總數的50%, 表示同意踢出

extra的長度至少65位元組以上(簽名結果是65位元組,即r, s, v, v是0或1)

對blockheader中所有字段除了extra的後65位元組外進行rlp編碼對編碼後的資料進行keccak256hash簽名後的資料(65位元組)儲存到extra的後65位元組

以下建議的策略將減少網路流量和分叉

當移除乙個授權的簽名者時,可能會導致其他移除前的投票成立. 例: abcd4個signer, ab加入e,此時不成立(沒有超過50%), 如果abc移除d, 會自動導致加入e的投票成立(2/3的投票比例)

因為blockchain可能會小範圍重組(small reorgs), 常規的投票機制(cast-and-forget, 投票和忘記)可能不是最佳的,因為包含單個投票的block可能不會在最終的鏈上,會因為已有最新的block而被拋棄。

乙個簡單但有效的辦法是對signers配置"提議(proposal)".例如 "add 0x...", "drop 0x...", 有多個併發的提議時, 簽名**"隨機"選擇乙個提議注入到該簽名者簽名的block中,這樣多個併發的提議和重組(reorgs)都可以儲存在鏈上.

該列表可能在一定數量的block/epoch 之後過期,提案通過並不意味著它不會被重新呼叫,因此在提議通過時不應立即丟棄。

以太坊的共識機制

在開始之前,我們補充一點基礎知識。第乙個概念是雜湊。簡單理解,雜湊是乙個函式 它的作用是將 任意長度的資料作為輸入 轉變為 固定長度的乙個字串作為輸出 這個函式有兩個主要特點 過程不可逆 對輸入做微小改動,輸出就會完全不一樣。雜湊函式有好多種,但都滿足上面的特點。幾乎任何加密貨幣都會用到雜湊演算法,...

以太坊原始碼分析 Ethash共識演算法

ethereum當前和bitcoin一樣,採用基於工作量證明 proof of work,pow 的共識演算法來產生新的區塊。與bitcoin不同的是,ethereum採用的共識演算法可以抵禦asic礦機對挖礦工作的壟斷地位,這個演算法叫做ethash。為什麼要反asic pow的的核心是hash運...

以太坊原始碼分析 共識(1)礦工

礦工在pow中負責了產生區塊的工作,把一大堆交易交給它,它生成乙個證明自己做了很多任務作的區塊,然後將這個區塊加入到本地區塊鏈並且廣播給其他節點。接下來我們將從以下角度介紹礦工 角色。礦工不是乙個人,而是一類人,可以把這一類人分成若干角色。通過了解乙個區塊產生的主要流程,掌握礦工的工作流。通過了解礦...