極客技術(shù)流 | 人們常說的“拜占庭將軍”問題究竟是啥阀溶?


大家好,我是EKT周迅鸦泳。

今天為大家簡單解釋一下银锻,EKT系統(tǒng)中如何解決“拜占庭將軍問題”

#EKT


第一,何謂“拜占庭將軍問題”做鹰?

拜占庭將軍問題首先是由Leslie Lamport等人在1982年提出击纬,被稱為The Byzantine Generals Problem或者Byzantine Failure。這個(gè)問題是這樣描述的:

拜占庭帝國想要進(jìn)攻一個(gè)強(qiáng)大的敵國钾麸,為此帝國派出了10支軍隊(duì)去包圍這個(gè)帝國更振。這個(gè)敵人雖然不如拜占庭帝國強(qiáng)大,但也足以抵御5支常規(guī)拜占庭軍隊(duì)的同時(shí)襲擊饭尝。由于某些原因肯腕,這10支軍隊(duì)無法聚合在一起進(jìn)行攻擊,必須分散然后根據(jù)統(tǒng)一的指令一起進(jìn)攻或者撤退钥平。他們?nèi)我恢к婈?duì)單獨(dú)進(jìn)攻都毫無勝算实撒,除非有至少6支軍隊(duì)同時(shí)襲擊才能攻下敵國。他們分散在敵國的四周,依靠通信兵相互通信來協(xié)商進(jìn)攻意向及進(jìn)攻時(shí)間知态。

軍中可能有叛徒捷兰,可能向其他的將軍發(fā)送錯(cuò)誤的指令。在這種情況下如何保持戰(zhàn)爭指令的統(tǒng)一性進(jìn)而獲取勝利便成為了一個(gè)問題负敏。

進(jìn)一步講贡茅,拜占庭將軍的問題可以描述為:

一個(gè)發(fā)送命令的將軍要發(fā)送一個(gè)命令給其余n-1個(gè)將軍,使得所有忠誠的接收命令的將軍遵守相同的命令如果發(fā)送命令的將軍是忠誠的其做,那么所有忠誠的接收命令的將軍遵守所接收的命令這個(gè)問題發(fā)展到計(jì)算機(jī)領(lǐng)域顶考,就是拜占庭容錯(cuò)問題。區(qū)塊鏈需要解決的一個(gè)核心問題就是如何保證在分布式環(huán)境下庶柿,各個(gè)節(jié)點(diǎn)(即使存在惡意節(jié)點(diǎn))的數(shù)據(jù)能夠達(dá)成最終的一致性和正確性村怪。

EKT的共識(shí)算法是DPoS,在DPoS的共識(shí)基礎(chǔ)上浮庐,我們也引入了基于路由策略進(jìn)行拜占庭容錯(cuò)的方案甚负。


第二,“拜占庭容錯(cuò)”方案如何實(shí)現(xiàn)审残?

在EKT中梭域,我們使用公私鑰加密和路由策略的機(jī)制實(shí)現(xiàn)拜占庭容錯(cuò)。這個(gè)是怎么實(shí)現(xiàn)的呢搅轿?

EKT主鏈上每個(gè)DPoS節(jié)點(diǎn)的公鑰都是公開的病涨,具體路由策略為:

1. 區(qū)塊廣播

當(dāng)一個(gè)節(jié)點(diǎn)完成打包之后,會(huì)對(duì)區(qū)塊進(jìn)行簽名璧坟。簽名完以后節(jié)點(diǎn)會(huì)把區(qū)塊和簽名廣播給網(wǎng)絡(luò)中的其他節(jié)點(diǎn)既穆。當(dāng)另外一個(gè)節(jié)點(diǎn)收到區(qū)塊和簽名之后會(huì)對(duì)簽名信息進(jìn)行校驗(yàn),以此來確認(rèn)這個(gè)區(qū)塊是從打包節(jié)點(diǎn)廣播出去的雀鹃。其他節(jié)點(diǎn)確認(rèn)完成后幻工,會(huì)判斷自己節(jié)點(diǎn)與打包節(jié)點(diǎn)在當(dāng)前輪的距離,如果滿足條件 (currentIndex - miningIndex + len(DPoSNodes)) % len(DPoSNodes) <len(DPoSNodes) / 2黎茎,則將自己收到的區(qū)塊和簽名繼續(xù)廣播給其他節(jié)點(diǎn)囊颅。 當(dāng)一個(gè)節(jié)點(diǎn)收到兩個(gè)不同的打包節(jié)點(diǎn)的區(qū)塊和簽名之后,會(huì)將兩個(gè)不同的區(qū)塊和簽名發(fā)送給所有其他節(jié)點(diǎn)傅瞻。而所有節(jié)點(diǎn)則放棄當(dāng)前區(qū)塊踢代,進(jìn)入下一個(gè)區(qū)塊的打包并對(duì)當(dāng)前打包節(jié)點(diǎn)的作惡行為進(jìn)行記錄。

2. 區(qū)塊的校驗(yàn)與投票

在每個(gè)區(qū)塊頭上嗅骄,都會(huì)有區(qū)塊body的Hash校驗(yàn)值胳挎。節(jié)點(diǎn)可以向其他節(jié)點(diǎn)獲取區(qū)塊body,對(duì)body進(jìn)行處理之后掸读,對(duì)當(dāng)前打包的區(qū)塊進(jìn)行投票串远,所有節(jié)點(diǎn)都會(huì)把區(qū)塊的校驗(yàn)結(jié)果進(jìn)行簽名宏多,發(fā)送給滿足 (currentIndex - miningIndex + len(DPoSNodes)) % len(DPoSNodes) <len(DPoSNodes) / 2條件的節(jié)點(diǎn)進(jìn)行唱票。 當(dāng)任何一個(gè)節(jié)點(diǎn)收到超過半數(shù)對(duì)同一個(gè)區(qū)塊的投票之后即可認(rèn)為當(dāng)前的區(qū)塊可寫入?yún)^(qū)塊鏈中澡罚,并將區(qū)塊和投票結(jié)果發(fā)送給所有的節(jié)點(diǎn)伸但,所有節(jié)點(diǎn)對(duì)區(qū)塊進(jìn)行記錄。如果投票的數(shù)量不足半數(shù)則在一定時(shí)間內(nèi)停止唱票留搔,節(jié)點(diǎn)將自己的唱票結(jié)果發(fā)送給其他節(jié)點(diǎn)更胖,所有節(jié)點(diǎn)在收到其他節(jié)點(diǎn)的投票結(jié)果之后對(duì)結(jié)果進(jìn)行合并,判斷最后的投票結(jié)果并執(zhí)行響應(yīng)的操作隔显。?

3. 節(jié)點(diǎn)宕機(jī)

當(dāng)一個(gè)節(jié)點(diǎn)超過一定時(shí)間沒有出塊却妨,當(dāng)前輪的下一個(gè)節(jié)點(diǎn)會(huì)在 3*interval/2 的時(shí)間點(diǎn)開始打包下一個(gè)區(qū)塊,進(jìn)入下一個(gè)區(qū)塊的打包流程括眠。同理彪标,如果節(jié)點(diǎn)連續(xù)宕機(jī),判斷當(dāng)前節(jié)點(diǎn)是否需要打包的條件是 currentTime - lastBlockTime > (2*(currentIndex -LastIndex)+1)*interval/2掷豺,一旦滿足當(dāng)前條件捞烟,則當(dāng)前節(jié)點(diǎn)開始打包。如果是最后n個(gè)區(qū)塊連續(xù)宕機(jī)当船,則按照當(dāng)前輪的最后一個(gè)區(qū)塊的hash值判斷下一輪的順序题画,按照遞增每個(gè)區(qū)塊加一個(gè)出塊interval的算法進(jìn)行計(jì)算,判斷當(dāng)前打包的節(jié)點(diǎn)并進(jìn)行打包德频。當(dāng)超過n/2的節(jié)點(diǎn)宕機(jī)的時(shí)候苍息,所有節(jié)點(diǎn)會(huì)自動(dòng)停止出塊,直到超過1/2的節(jié)點(diǎn)存活壹置。

這種方案的復(fù)雜度在最好情況下是:消息復(fù)雜度O(n^2), 時(shí)間復(fù)雜度O(1)竞思。在最差情況也可以達(dá)到:消息復(fù)雜度O(n^2), 時(shí)間復(fù)雜度O(n)〕ぃ基于這種路由策略的拜占庭容錯(cuò)機(jī)制衙四,系統(tǒng)可以保證在少于n/2的節(jié)點(diǎn)宕機(jī)或者叛變的情況下,系統(tǒng)不會(huì)出現(xiàn)分叉患亿,是一種用計(jì)算資源換容錯(cuò)性的方案。


Ending

好了押逼,今天關(guān)于“拜占庭將軍”的文章就到這里了步藕。

如果大家有任何關(guān)于技術(shù)上的問題想與我討論,

歡迎加入我的公鏈開發(fā)QQ群:699726921

項(xiàng)目交流可進(jìn)項(xiàng)目QQ群:173806202

如想關(guān)注EKT的項(xiàng)目進(jìn)展挑格,歡迎關(guān)注微信公眾號(hào):EKT通用積分




官方網(wǎng)址

https://ekt8.io

Telegram

中文群:http://0.plus/ektcoin

國際群:?https://0.plus/ektofficial

Twitter:@EKTcoin

https://twitter.com/EKTcoin

GITHUB

https://github.com/EducationEKT/EKT

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咙冗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子漂彤,更是在濱河造成了極大的恐慌雾消,老刑警劉巖灾搏,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異立润,居然都是意外死亡狂窑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門桑腮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泉哈,“玉大人,你說我怎么就攤上這事破讨〈曰蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵提陶,是天一觀的道長烫沙。 經(jīng)常有香客問我,道長隙笆,這世上最難降的妖魔是什么锌蓄? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮仲器,結(jié)果婚禮上煤率,老公的妹妹穿的比我還像新娘。我一直安慰自己乏冀,他們只是感情好蝶糯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辆沦,像睡著了一般昼捍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肢扯,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天妒茬,我揣著相機(jī)與錄音,去河邊找鬼蔚晨。 笑死乍钻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铭腕。 我是一名探鬼主播银择,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼累舷!你這毒婦竟也來了浩考?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤被盈,失蹤者是張志新(化名)和其女友劉穎析孽,沒想到半個(gè)月后搭伤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年怜俐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吞滞。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佑菩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裁赠,到底是詐尸還是另有隱情殿漠,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布佩捞,位于F島的核電站绞幌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏一忱。R本人自食惡果不足惜莲蜘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帘营。 院中可真熱鬧票渠,春花似錦、人聲如沸芬迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禀梳。三九已至杜窄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間算途,已是汗流浹背塞耕。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘴瓤,地道東北人扫外。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像廓脆,于是被迫代替她去往敵國和親畏浆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容