主頁 > 區塊鏈 > 以太坊POA共識演算法決議

以太坊POA共識演算法決議

2021-10-22 08:29:52 區塊鏈

1.clique中的概念和定義

  • EPOCH_LENGTH : epoch長度是30000個block, 每次進入新的epoch,前面的投票都被清空,重新開始記錄,這里的投票是指加入或移除signer
  • BLOCK_PERIOD : 出塊時間, 默認是15s
  • UNCLE_HASH : 總是 Keccak256(RLP([])) ,因為沒有uncle
  • SIGNER_COUNT : 每個block都有一個signers的數量
  • SIGNER_LIMIT : 等于 (SIGNER_COUNT / 2) + 1 . 每個singer只能簽名連續SIGNER_LIMIT個block中的1個
    • 比如有5個signer:ABCDE, 對4個block進行簽名, 不允許簽名者為ABAC, 因為A在連續3個block中簽名了2次
  • NONCE_AUTH : 表示投票型別是加入新的signer; 值= 0xffffffffffffffff
  • NONCE_DROP : 表示投票型別是踢除舊的的signer; 值= 0x0000000000000000
  • EXTRA_VANITY : 代表block頭中Extra欄位中的保留欄位長度: 32位元組
  • EXTRA_SEAL : 代表block頭中Extra欄位中的存盤簽名資料的長度: 65位元組
  • IN-TURN/OUT-OF-TURN : 每個block都有一個in-turn的signer, 其他signers是out-of-turn, in-turn的signer的權重大一些, 出塊的時間會快一點, 這樣可以保證該高度的block被in-turn的signer挖到的概率很大.
  • 創世塊中的Extra欄位包括:
    • 32位元組的前綴(extraVanity)
    • 所有signer的地址
    • 65位元組的后綴(extraSeal): 保存signer的簽名
  • 其他block的Extra欄位只包括extraVanity和extraSeal
  • Time欄位表示產生block的時間間隔是:blockPeriod(15s)
  • Nonce欄位表示進行一個投票: 添加( nonceAuthVote: 0xffffffffffffffff )或者移除( nonceDropVote: 0x0000000000000000 )一個signer
  • Coinbase欄位存放 被投票 的地址
    • 舉個栗子: signerA的一個投票:加入signerB, 那么Coinbase存放B的地址
  • Difficulty欄位的值: 1-是 本block的簽名者 (in turn), 2- 非本block的簽名者 (out of turn)

2. PoA的特點

  • PoA是依靠預設好的授權節點(signers),負責產生block,
  • 可以由已授權的signer選舉(投票超過50%)加入新的signer,
  • 即使存在惡意signer,他最多只能攻擊連續塊(數量是 (SIGNER_COUNT / 2) + 1) 中的1個,期間可以由其他signer投票踢出該惡意signer,
  • 可指定產生block的時間,

3. PoA的作業流程及介面

  1. 在創世塊中指定一組初始授權的signers, 所有地址 保存在創世塊Extra欄位中
  2. 啟動挖礦后, 該組signers開始對生成的block進行 簽名并廣播.
  3. 簽名結果 保存在區塊頭的Extra欄位中
  4. Extra中更新當前高度已授權的 所有signers的地址 ,因為有新加入或踢出的signer
  5. 每一高度都有一個signer處于IN-TURN狀態, 其他signer處于OUT-OF-TURN狀態, IN-TURN的signer簽名的block會 立即廣播 , OUT-OF-TURN的signer簽名的block會 延時 一點隨機時間后再廣播, 保證IN-TURN的簽名block有更高的優先級上鏈
  6. 如果需要加入一個新的signer, signer通過API介面發起一個proposal, 該proposal通過復用區塊頭 Coinbase(新signer地址)和Nonce("0xffffffffffffffff") 欄位廣播給其他節點. 所有已授權的signers對該新的signer進行"加入"投票, 如果贊成票超過signers總數的50%, 表示同意加入
  7. 如果需要踢出一個舊的signer, 所有已授權的signers對該舊的signer進行"踢出"投票, 如果贊成票超過signers總數的50%, 表示同意踢出

signer對區塊頭進行簽名

  1. Extra的長度至少65位元組以上(簽名結果是65位元組,即R, S , V, V是0或1)
  2. 對blockHeader中所有欄位除了Extra的 后65位元組 外進行 RLP編碼
  3. 對編碼后的資料進行 Keccak256 hash
  4. 簽名后的資料(65位元組)保存到Extra的 后65位元組

clique.go中實作了consensus中的所有介面完成POA演算法的實作

Clique.Prepare(chain , header)

Prepare是共識引擎介面之一. 該函式配置header中共識相關的引數(Cionbase, Difficulty, Extra, MixDigest, Time)

  • 對于非epoch的block( number % Epoch != 0 ):
  1. 得到Clique.proposals中的投票資料(例:A加入C, B踢除D)
  2. 根據snapshot的signers分析投票數否有效(例: C原先沒有在signers中, 加入投票有效, D原先在signers中,踢除投票有效)
  3. 從被投票的地址串列(C,D)中, 隨機選擇一個地址 ,作為該header的Coinbase,設定Nonce為加入( 0xffffffffffffffff )或者踢除( 0x0000000000000000 )
  4. Clique.signer 如果是本輪的簽名者(in-turn), 設定header.Difficulty = diffInTurn(1), 否則就是diffNoTurn(2)
  5. 配置header.Extra的資料為[ extraVanity + snap中的全部signers + extraSeal ]
  6. MixDigest需要配置為nil
  7. 配置時間戳:Time為父塊的時間+15s

共識引擎clique的初始化

Ethereum.StartMining 中,如果Ethereum.engine配置為clique.Clique, 根據當前節點的礦工地址(默認是acounts[0]), 配置clique的 簽名者 : clique.Authorize(eb, wallet.SignHash) ,其中 簽名函式 是SignHash,對給定的hash進行簽名.

Snapshot.apply(headers)

創建一個新的授權signers的快照, 將從上一個snapshot開始的區塊頭中的proposals更新到最新的snapshot上

  1. 對入參headers進行完整性檢查: 因為可能傳入多個區塊頭, block號必須連續
  2. 遍歷所有的header, 如果block號剛好處于epoch的起始(number%Epoch == 0),將snapshot中的Votes和Tally復位( 丟棄歷史全部資料 )
  3. 對于每一個header,從簽名中恢復得到 signer
  4. 如果該signer在snap.Recents中, 說明 最近已經有過簽名 , 不允許再次簽名, 直接 回傳 結束
  5. 記錄 該signer是該block的簽名者: snap.Recents[number] = signer
  6. 統計header.Coinbase的投票數,如果 超過signers總數的50%
  7. 執行加入或移除操作
  8. 洗掉snap.Recents中的一個signer記錄: key=number- (uint64(len(snap.Signers)/2 + 1)), 表示釋放該signer,下次可以對block進行簽名了
  9. 清空被移除的Coinbase的投票
  10. 移除snap.Votes中該Conibase的所有投票記錄
  11. 移除snap.Tally中該Conibase的所有投票數記錄

Clique.Seal(chain, block , stop)

Seal也是共識引擎介面之一. 該函式用clique.signer對block的進行簽名. 實作共識,引擎,嘗試使用創建密封塊

  • 如果signer沒有在snapshot的signers中,不允許對block進行簽名
  • 如果不是本block的簽名者,延時一定的時間(隨機)后再簽名, 如果是本block的簽名者, 立即簽名.
  • 簽名結果放在Extra的extraSeal的65位元組中
  • 不支持密封genesis區塊

Clique.VerifySeal(chain, header)

VerifySeal也是共識引擎介面之一.

  1. 從header的簽名中恢復賬戶地址,改地址要求在snapshot的signers中
  2. 檢查header中的Difficulty是否匹配(in turn或out of turn)

Clique.Finalize

Finalize也是共識引擎介面之一. 該函式生成一個block, 沒有叔塊處理,也沒有獎勵機制

  1. header.Root : 狀態根保持原狀
  2. header.UncleHash : 為nil
  3. types.NewBlock(header, txs, nil, receipts) : 封裝并回傳最終的block

API.Propose(addr, auth)

添加一個proposal: 呼叫者對addr的投票, auth表示加入還是踢出

verifyUncles(chain,block)

判斷block中的叔伯塊是否大于零,由于這個共識中不允許有叔伯塊

ecercover(header,sigcache)

從簽名頭中提取以太坊帳戶地址

CalcDifficulty(chain,time,parent)

回傳區塊的計算難度,計算難度是難度調整演算法

Difficulty欄位的值: 1-是 本block的簽名者 (in turn), 2- 非本block的簽名者 (out of turn)

投票策略

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

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

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

  • 加入和踢除新的signer的投票都是立即生效的,參與下一次投票計數
  • 加入和踢除都需要 超過當前signer總數的50% 的signer進行投票
  • 可以踢除自己(也需要超過50%投票)
  • 可以并行投票(A,B交叉對C,D進行投票), 只要最終投票數操作50%
  • 再沒進入新的epoch對于以一個signer的投票未被通過時,后面有其他signer對該signer的投票也算入判斷中
  • 進入一個新的epoch, 所有之前的pending投票都作廢, 重新開始統計投票

投票場景舉例

  • ABCD, AB先分別踢除CD, C踢除D, 結果是剩下ABC
  • ABCD, AB先分別踢除CD, C踢除D, B又投給C留下的票, 結果是剩下ABC
  • ABCD, AB先分別踢除CD, C踢除D, 即使C投給自己留下的票, 結果是剩下AB
  • ABCDE, ABC先分別加入F(成功,ABCDEF), BCDE踢除F(成功,ABCDE), DE加入F(失敗,ABCDE), BCD踢除A(成功, BCDE), B加入F(由于DE加入F還存在,此時BDE加入F,滿足超過50%投票), 結果是剩下BCDEF

4. PoA中的攻擊及防御

  • 惡意簽名者(Malicious signer). 惡意用戶被添加到簽名者串列中,或簽名者密鑰/機器遭到入侵. 解決方案是,N個授權簽名人的串列,任一簽名者只能對每K個block簽名其中的1個,這樣盡量減少損害,其余的礦工可以投票踢出惡意用戶,
  • 審查簽名者(Censoring signer). 如果一個簽名者(或一組簽名者)試圖檢查block中其他signer的提議(特別是投票踢出他們), 為了解決這個問題,我們將簽名者的允許的挖礦頻率限制在1/(N/2),如果他不想被踢出出去, 就必須控制超過50%的signers.
  • "垃圾郵件"簽名者(Spamming signer). 這些signer在每個他們簽名的block中都注入一個新的投票提議.由于節點需要統計所有投票以創建授權簽名者串列, 久而久之之后會產生大量垃圾的無用的投票, 導致系統運行變慢.通過epoch的機制,每次進入新的epoch都會丟棄舊的投票
  • 并發塊(Concurrent blocks). 如果授權簽名者的數量為N,我們允許每個簽名者簽名是1/K,那么在任何時候,至少N-K個簽名者都可以成功簽名一個block,為了避免這些block競爭( 分叉 ),每個簽名者生成一個新block時都會加一點隨機延時,這確保了很難發生分叉,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330392.html

標籤:區塊鏈

上一篇:如何在IntelliJ中匯出所需的插件功能?

下一篇:以太坊智能合約開發(四):Solidity轉賬智能合約實驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more