Zilliqa 的设计构思 第3部分:使共识更有效
Zilliqa博客發(fā)布,Rita譯
Nakamoto共識(shí)協(xié)議(或PoW)不理想以及為什么Zilliqa需要一個(gè)不同的共識(shí)協(xié)議。Zilliqa使用的共識(shí)協(xié)議被稱(chēng)為實(shí)用拜占庭容錯(cuò)(PracticalByzantine Fault Tolerance),簡(jiǎn)稱(chēng)pBFT,該協(xié)議具有計(jì)算成本低、在低能耗的情況下即可賦予交易最終性、提出下個(gè)區(qū)塊無(wú)需確認(rèn)等多個(gè)優(yōu)點(diǎn)。
然而,卡斯特羅和利斯科夫(Castroand Liskov)在其論文(鏈接https://dl.acm.org/citation.cfm?id=296824)中設(shè)計(jì)的經(jīng)典pBFT 只有在共識(shí)組(在Zilliqa中指一個(gè)分片)較小時(shí),例如少于50個(gè)節(jié)點(diǎn),才具有較高的通信效率。當(dāng)共識(shí)組變大,節(jié)點(diǎn)之間的通信成本將驟升從而成為效率的障礙。而我們此前的文章提到,Zilliqa中任何分片都必須有至少600個(gè)節(jié)點(diǎn)才能確保其中拜占庭節(jié)點(diǎn)(即惡意節(jié)點(diǎn))的比例低于三分之一的概率非常低。
本文是此系列文章的終篇,我們將討論經(jīng)典pBFT協(xié)議對(duì)通信的要求有多高以及我們?nèi)绾问褂枚嘀睾灻姆椒▉?lái)降低這個(gè)要求。
在本文中,我們將用n來(lái)表示共識(shí)組的大小, Zilliqa中n假設(shè)等于600。
pBFT的通信成本
在此前提到的論文中,經(jīng)典pBFT要求每個(gè)節(jié)點(diǎn)與所有其他節(jié)點(diǎn)通信共享協(xié)議消息,從而對(duì)系統(tǒng)狀態(tài)達(dá)成一致。這意味著每個(gè)節(jié)點(diǎn)都必須發(fā)送n條消息,因此總的通信數(shù)量為n2,這一通訊成本是很高的。
認(rèn)證消息的成本
此外,在拜占庭網(wǎng)絡(luò)中僅僅發(fā)送消息是不夠的。特別是在一個(gè)公開(kāi)的拜占庭網(wǎng)絡(luò)中,當(dāng)節(jié)點(diǎn)A接收到來(lái)自節(jié)點(diǎn)B的消息時(shí),A必須確定該消息確實(shí)由B發(fā)送,且該消息在傳輸過(guò)程中未被修改,沒(méi)有這種保證,節(jié)點(diǎn)就很難確保消息的真實(shí)性,因?yàn)楹诳涂梢栽谥虚g環(huán)節(jié)修改消息并給節(jié)點(diǎn)提供不正確的信息。
一種驗(yàn)證消息傳輸?shù)慕鉀Q方案是在A和B之間生成保密的密鑰,然后可以使用該密鑰為每個(gè)傳出的消息生成“標(biāo)簽”。由于只有A和B知道密鑰,所以標(biāo)簽只能由A或B生成,從而他們可以驗(yàn)證消息的來(lái)源。
消息認(rèn)證碼(MessageAuthentication Code,簡(jiǎn)稱(chēng) MAC)是可以生成這種標(biāo)簽的加密方法。構(gòu)建MAC的一種可能方式是使用加密散列函數(shù)(cryptographichash function),該函數(shù)將密鑰和消息作為輸入并生成標(biāo)簽作為輸出。
下圖顯示了發(fā)送者和接收者使用MAC的方式。發(fā)送者用消息和密鑰通過(guò)MAC生成標(biāo)簽,并將其與消息一起發(fā)送給接收者。接收者再次計(jì)算MAC得到一個(gè)標(biāo)簽,將之與收到的信息進(jìn)行比對(duì),確認(rèn)兩者是否吻合,如吻合則該消息未被篡改。
然而,MAC和大多數(shù)對(duì)稱(chēng)密鑰方法的問(wèn)題在于,如果我們有n個(gè)節(jié)點(diǎn),每對(duì)節(jié)點(diǎn)都需要一個(gè)密鑰。因此,如果我們有n個(gè)節(jié)點(diǎn),總共需要n(n-1)/ 2個(gè)密鑰。
那么MAC的通信成本到底是多少?如果我們?cè)诰W(wǎng)絡(luò)中有4個(gè)節(jié)點(diǎn)A、B、C、D,當(dāng)A要向整個(gè)網(wǎng)絡(luò)即向B、C、D發(fā)送消息時(shí),A要?jiǎng)?chuàng)建3個(gè)不同的標(biāo)簽因?yàn)锳與B、C、D分別有不同的密鑰。現(xiàn)在,假設(shè)A用B作為中繼(relay)將標(biāo)簽傳送到C和D,那么A將需要向B發(fā)送3個(gè)標(biāo)簽(參見(jiàn)下圖)。B在收到它的標(biāo)簽后,用C作為中繼將A的標(biāo)簽轉(zhuǎn)發(fā)給C和D時(shí),它只會(huì)向C發(fā)送2個(gè)標(biāo)簽。以此類(lèi)推,使用這種簡(jiǎn)單的基于中繼的廣播機(jī)制分發(fā)的消息總數(shù)為3 + 2 + 1 = 6。
此圖顯示出一條消息在網(wǎng)絡(luò)中傳輸?shù)姆绞健HN不同的顏色顯示出A創(chuàng)建的三個(gè)不同的標(biāo)簽,A先將三個(gè)標(biāo)簽發(fā)送給B,B再將兩個(gè)標(biāo)簽發(fā)送給C,最后C轉(zhuǎn)發(fā)最后一個(gè)標(biāo)簽給D。
對(duì)于具有n個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò),如果我們使用MAC,則以標(biāo)簽形式發(fā)送的消息總數(shù)為:(n-1)+(n-2).. + 1 = n(n-1)/2。
采用公鑰密碼學(xué)提高效率
因?yàn)轵?yàn)證消息上的簽名也可以確保該消息確實(shí)是由合法的發(fā)送者簽發(fā)的,因此MAC實(shí)際上可以用數(shù)字簽名來(lái)替代。卡斯特羅和利斯科夫之所以沒(méi)有使用數(shù)字簽名是因?yàn)?#xff0c;當(dāng)時(shí)計(jì)算MAC比生成數(shù)字簽名計(jì)算量便宜得多。如今,數(shù)字簽名的計(jì)算量已經(jīng)相當(dāng)便宜。
而且,公鑰密碼學(xué)自身有很多優(yōu)點(diǎn)。為了理解這一點(diǎn),我們繼續(xù)使用前面的例子。現(xiàn)在,我們假設(shè)A、B、C、D節(jié)點(diǎn)使用數(shù)字簽名。因此當(dāng)A發(fā)送消息時(shí),它將簽署消息并由此產(chǎn)生簽名。請(qǐng)注意,A在這里不需要?jiǎng)?chuàng)建三個(gè)簽名,只有一個(gè)就夠了。然后簽名被發(fā)送到下一個(gè)節(jié)點(diǎn)B,B在此只收到一條消息和相應(yīng)的簽名,B再發(fā)給下一個(gè)節(jié)點(diǎn)C。以此類(lèi)推,在每個(gè)節(jié)點(diǎn),只有一個(gè)簽名被轉(zhuǎn)發(fā),在這種情況下分發(fā)的消息總數(shù)將為1 + 1 + 1 = 3。
使用數(shù)字簽名的傳輸模式時(shí)。A只需要為每個(gè)消息生成一個(gè)簽名。
對(duì)于具有n個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò),如果我們使用數(shù)字簽名,則所傳遞的消息總數(shù)將為:1 + 1 +1 …(n-1)次= n-1。
最近有篇學(xué)術(shù)論文提出了用數(shù)字簽名取代MAC的想法
鏈接:
https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/kogias
使用數(shù)字簽名而不是MAC將發(fā)送消息的數(shù)量從二次方數(shù)量級(jí)減少到線(xiàn)性,當(dāng)n很大時(shí)這種減少會(huì)產(chǎn)生重要影響。以600個(gè)節(jié)點(diǎn)為例,其中傳播的消息數(shù)量可以從17.97萬(wàn)減少到599。
使用多重簽名方案減少每個(gè)消息的大小
講到這兒,你應(yīng)該相信使用數(shù)字簽名比MAC能更好地減少網(wǎng)絡(luò)中需傳輸消息的數(shù)量了吧,那么接下來(lái)就讓我們用數(shù)字簽名來(lái)替換傳統(tǒng)pBFT協(xié)議中的MAC。
現(xiàn)在的問(wèn)題是,我們是否找到比數(shù)字簽名更好的方法呢?答案是肯定的!數(shù)字簽名確實(shí)還有一定的改進(jìn)空間,我們會(huì)在未來(lái)的博客中更多地介紹這個(gè)內(nèi)容。現(xiàn)在先讓我們看一下數(shù)字簽名有哪些可以改進(jìn)的地方。
我們知道,pBFT賦予了交易最終性,這意味著一旦交易被提交到區(qū)塊鏈,那么它就是最終的了且不會(huì)有臨時(shí)分叉,因此不需要確認(rèn)。交易之所以有最終性是因?yàn)?#xff0c;pBFT協(xié)議本身已要求每個(gè)區(qū)塊必須由共識(shí)組中的絕對(duì)多數(shù)誠(chéng)實(shí)節(jié)點(diǎn)簽署。每個(gè)誠(chéng)實(shí)的節(jié)點(diǎn)通過(guò)簽名確認(rèn)它已經(jīng)驗(yàn)證了塊的內(nèi)容,確保交易有效。而在基于PoW的共識(shí)中,每個(gè)節(jié)點(diǎn)都可以生成一個(gè)區(qū)塊,而網(wǎng)絡(luò)的其他節(jié)點(diǎn)或接受或拒絕它,這就會(huì)導(dǎo)致臨時(shí)分叉的產(chǎn)生。
具體的簽名方法是:每個(gè)節(jié)點(diǎn)簽署一個(gè)區(qū)塊,然后將簽過(guò)名的區(qū)塊轉(zhuǎn)發(fā)到網(wǎng)絡(luò)的其余部分,之后其余節(jié)點(diǎn)都將自己的簽名附加在這個(gè)區(qū)塊上,最終在廣泛傳播后,這個(gè)區(qū)塊就會(huì)獲得絕大多數(shù)誠(chéng)實(shí)節(jié)點(diǎn)的簽名。如果網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)(包括惡意節(jié)點(diǎn))都對(duì)該區(qū)塊進(jìn)行簽名,那么區(qū)塊的簽名數(shù)量為n,在這里我們就需要引入多重簽名的概念了:多重簽名是一種密碼術(shù)語(yǔ),指的是把一條信息上的n個(gè)節(jié)點(diǎn)簽署的n個(gè)簽名整合到一個(gè)大小固定的簽名上。
簡(jiǎn)化的多重簽名如何工作
在介紹細(xì)節(jié)之前,讓我們先了解一下背景:在多重簽名方案中,我們有n個(gè)簽名者,每個(gè)簽名者都有一對(duì)密鑰(公鑰和私鑰)、一個(gè)驗(yàn)證簽名的驗(yàn)證者和一個(gè)匯總各方“簽名”的聚合者(aggregator)。為了便于理解,我們現(xiàn)在簡(jiǎn)單假設(shè)所有節(jié)點(diǎn)都是誠(chéng)實(shí)的,并且會(huì)配合簽署消息。
驗(yàn)證者在檢驗(yàn)匯總后的簽名時(shí),會(huì)檢查所有簽名者是否都正確地簽了名。僅當(dāng)驗(yàn)證者確認(rèn)所有簽名者都正確地簽了名之后,驗(yàn)證才算通過(guò),反之則驗(yàn)證失敗。
接下來(lái)讓我們深入細(xì)節(jié),請(qǐng)做好準(zhǔn)備,因?yàn)檫@有些偏技術(shù)性。
多重簽名方案基本上分兩步進(jìn)行。在協(xié)議的第一步中,每個(gè)節(jié)點(diǎn)將其公鑰發(fā)送給聚合者,聚合者根據(jù)公鑰的數(shù)學(xué)形式,通過(guò)簡(jiǎn)單的加法或乘法將之聚合為一個(gè)單一的公鑰。
例如,聚合公鑰= 公鑰_1 + 公鑰_2 + …+公鑰_n。
然后聚合者將聚合公鑰轉(zhuǎn)發(fā)給驗(yàn)證者從而可以使后者驗(yàn)證聚合簽名,與此同時(shí)聚合者也將聚合公鑰發(fā)送給每個(gè)簽名者讓所有人簽名。
在第二步中,聚合者啟動(dòng)與每個(gè)簽名者的交互協(xié)議(interactiveprotocol)。這個(gè)交互協(xié)議總分包含三個(gè)階段:
1、提交階段(Commit phase):此階段每個(gè)節(jié)點(diǎn)生成一些隨機(jī)內(nèi)容并提交給交互協(xié)議。如果你不了解什么是加密提交(cryptographiccommitment),那么可以通過(guò)這種類(lèi)比的方式理解:每個(gè)節(jié)點(diǎn)都秘密地?cái)S骰子,然后將結(jié)果寫(xiě)在一張紙上并將其放在一個(gè)盒子中鎖好,最后發(fā)送給聚合者。聚合者無(wú)權(quán)打開(kāi)盒子。
2、挑戰(zhàn)階段(Challenge phase):此階段聚合者首先使用加法或乘法將所有的提交聚合為一個(gè)聚合提交,然后使用它以及聚合公鑰、消息生成一個(gè)挑戰(zhàn),再將挑戰(zhàn)發(fā)送到所有節(jié)點(diǎn)。之后挑戰(zhàn)可用于確認(rèn)所有節(jié)點(diǎn)都知道公鑰對(duì)應(yīng)的私鑰。這與常規(guī)數(shù)字簽名的工作方式類(lèi)似,即由簽名證明簽名人確實(shí)知道私鑰。
3、回應(yīng)階段(Response phase):所有節(jié)點(diǎn)為了應(yīng)對(duì)挑戰(zhàn)會(huì)向挑戰(zhàn)發(fā)送私鑰進(jìn)行回應(yīng),之后聚合者將聚合所有的回應(yīng)。因此回應(yīng)可被視為簽名者知道其公鑰對(duì)應(yīng)的私鑰的證據(jù)。
因此,最后的聚合簽名實(shí)際上是挑戰(zhàn)和聚合回應(yīng)的信息對(duì),并能驗(yàn)證第一步生成的聚合公鑰。
值得注意的是,聚合簽名的大小不取決于簽名者的數(shù)量,它是固定的。
圖中藍(lán)色的節(jié)點(diǎn)是聚合者。H是用于將消息m生成挑戰(zhàn)的密碼散列函數(shù)。聚合簽名就是R和S的信息對(duì)。R的大小等于Ri,S的大小等于Si的。僅在知道私鑰的情況下才能生成有效的回應(yīng)。
當(dāng)驗(yàn)證者檢查聚合簽名時(shí),它檢查的不是每個(gè)單獨(dú)簽名者是否都正確地遵守協(xié)議,而是檢查所有簽名者作為一個(gè)整體是否正確地遵守協(xié)議并知道私鑰。因此,驗(yàn)證者做出的決定是全有或全無(wú)(all-or-nothing)。
目前一種比較流行的多重簽名方案是基于Schnorr數(shù)字簽名技術(shù)的并由于一篇學(xué)術(shù)論文(鏈接https://arxiv.org/abs/1503.08768)得到了關(guān)注,該論文在一些證人需要證明事件發(fā)生的背景下使用了這個(gè)技術(shù)。
結(jié)論
Zilliqa使用了近期一些學(xué)術(shù)論文中的技術(shù)來(lái)提高經(jīng)典pBFT協(xié)議的效率。
本文的主要亮點(diǎn)是多重簽名協(xié)議將簽名數(shù)量從n減少到1,從而減少認(rèn)定后的區(qū)塊的大小。
還有一些問(wèn)題在這篇文章里面沒(méi)有涉及,最重要的一個(gè)問(wèn)題就是如果只是絕對(duì)多數(shù)節(jié)點(diǎn)而不是所有節(jié)點(diǎn)對(duì)信息進(jìn)行了簽名,那么這個(gè)協(xié)議還有效嗎?需要對(duì)協(xié)議做出什么樣的修改?另外,你覺(jué)得有什么方法可以攻擊這個(gè)簡(jiǎn)單版的多重簽名?
要回答這些疑問(wèn),你可以通過(guò)兩種方法:比較難的方法是閱讀 Zilliqa的技術(shù)白皮書(shū),鏈接:
https://docs.zilliqa.com/whitepaper.pdf
?
總結(jié)
以上是生活随笔為你收集整理的Zilliqa 的设计构思 第3部分:使共识更有效的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: volatile,CAS,ABA三个关键
- 下一篇: 代理自动配置文件PAC的使用方法