摘要:最后,在中采用了一個(gè)的變體作為共識(shí)協(xié)議,擁有更高的吞吐量。知識(shí)點(diǎn),在比特幣改進(jìn)協(xié)議中提出,能夠減少網(wǎng)絡(luò)節(jié)點(diǎn)廣播區(qū)塊所需的帶寬數(shù)量。下面我們來(lái)進(jìn)一步分析這些協(xié)議的安全性功能性和吞吐量。當(dāng)這些安全性假設(shè)被違反,會(huì)為這些協(xié)議帶來(lái)災(zāi)難性的后果。
帶寬實(shí)際上是區(qū)塊鏈吞吐量的最大限制,在美國(guó)舊金山舉辦的 Scaling Bitcoin Meetup 中,Nervos & Cryptape 研究員張韌從「帶寬利用率」角度分析了諸多共識(shí)協(xié)議的效率和可行性。
Algorand 的帶寬利用效率如何?Cardano 的 Ouroboros 怎么樣?Solana、NKN 為什么能有那么高的TPS?以太坊將出塊間隔縮短到 15 秒,為什么并沒(méi)有比比特幣吞吐量高出很多?
這些問(wèn)題,張韌博士都會(huì)在分享中一一回答。以下為韌博士演講稿整理,如若希望和韌博士進(jìn)行進(jìn)一步討論,歡迎點(diǎn)擊:https://talk.nervos.org/t/ner...,我們?cè)?Nervos Talk 共同探討。
閱讀本文對(duì)讀者的區(qū)塊鏈基礎(chǔ)知識(shí)儲(chǔ)備有一定要求:
比特幣共識(shí)協(xié)議(也就是 Nakamoto Consensus)基本概念
以太坊共識(shí)協(xié)議基本概念
孤塊、叔塊、自私挖礦等概念
整理:Ryan、萬(wàn)涔涔
視頻鏈接:https://v.qq.com/x/page/g0837...
自我介紹一下,我是張韌,Nervos & Cryptape 的研究員,目前我在魯汶大學(xué) COSIC (Computer Security and Industrial Cryptography group) 讀博士,師從 Bart Preneel。 如果你對(duì) COSIC 不熟悉的話,不知道你是否聽(tīng)說(shuō)過(guò) AES,它是我們所有人的手機(jī)中使用的加密標(biāo)準(zhǔn)。
當(dāng)然如果你熟悉 Bart Preneel 的話,會(huì)知道他是 RIPEMD 160 的設(shè)計(jì)者。RIPEMD 160 是比特幣公鑰轉(zhuǎn)化為比特幣地址時(shí)使用的哈希算法。
Nervos CKB 是一個(gè)公有鏈,能夠支持各種編程語(yǔ)言的智能合約,以及各種各樣的 Layer 2 協(xié)議。在 Nervos CKB 上你可以用任意資產(chǎn)支付交易手續(xù)費(fèi)。在 Nervos CKB 中智能合約的執(zhí)行和驗(yàn)證是分離的,從而達(dá)到更好的隱私和性能。最后,在 Nervos CKB 中采用了 NC-Max ——一個(gè) Nakamoto Consensus 的變體——作為共識(shí)協(xié)議,擁有更高的吞吐量。
聲明:本次分享內(nèi)容僅著眼于 Layer 1 共識(shí)協(xié)議的分析,我將不會(huì)談到 Lightning Network 這樣的 Layer 2 方案。
這里是我本次分享的大綱,首先我會(huì)告訴你為什么我們會(huì)那么喜歡 Nakamoto Consensus(也就是比特幣的共識(shí)協(xié)議,以下簡(jiǎn)稱(chēng) NC,包含一組規(guī)則,如最長(zhǎng)鏈規(guī)則、激勵(lì)規(guī)則、增發(fā)規(guī)則等)。然后我會(huì)給出我們?yōu)槭裁床徊捎闷渌沧R(shí)協(xié)議的理由。最后我會(huì)給出我們 Nervos CKB 的共識(shí)協(xié)議 NC-Max 的設(shè)計(jì)思路。
為什么我們喜歡比特幣的 NC?先來(lái)回答一個(gè)問(wèn)題,為什么我們喜歡比特幣的 Nakamoto Consensus(NC)?
有很多的理由,首先 NC 的性能優(yōu)化做的非常好,它能夠節(jié)約每一個(gè)傳輸?shù)拿恳粋€(gè)字節(jié),以及每個(gè)計(jì)算周期。舉例來(lái)說(shuō),它使用Compact Block來(lái)加快區(qū)塊的傳播,可能在未來(lái)使用 Minisketch (一個(gè)用于在分布式系統(tǒng)不同節(jié)點(diǎn)之間同步信息時(shí),降低帶寬需求的軟件庫(kù))來(lái)節(jié)省交易廣播所需要的帶寬資源。同時(shí)比特幣的開(kāi)發(fā)者提出了 Graftroot(關(guān)系到比特幣上開(kāi)發(fā)智能合約以及隱私性的一項(xiàng)提案),你可以認(rèn)為它能夠通過(guò)壓縮比特幣上的智能合約從而獲得更好的隱私性和更好的性能。或許我們還能夠看到簽名聚合技術(shù)(Signature Aggregation)應(yīng)用在比特幣之上。
知識(shí)點(diǎn):Compact Block Relay,在比特幣改進(jìn)協(xié)議(BIP)152 中提出,能夠減少 P2P 網(wǎng)絡(luò)節(jié)點(diǎn)廣播區(qū)塊所需的帶寬數(shù)量。
Compact block 是完整區(qū)塊的「概要」,包含下面三部分信息:
1、新區(qū)塊的區(qū)塊頭
2、交易 ID
3、發(fā)送方節(jié)點(diǎn)預(yù)測(cè)的但是接收節(jié)點(diǎn)不具備的完整交易
接收方會(huì)嘗試根據(jù)收到的信息以及在其內(nèi)存池中的交易來(lái)重新構(gòu)建完整區(qū)塊。若仍然缺失某些交易,它將會(huì)請(qǐng)求廣播節(jié)點(diǎn)。*
喜歡 NC 的另一個(gè)理由是它的通用性。UTXO 模型加上全局交易順序能夠支持各種分片技術(shù)和 Layer 2 方案,以及復(fù)雜的智能合約。
相比來(lái)看,以太坊的 Account 模型進(jìn)行分片的難度更高;并且如果你沒(méi)有一個(gè)全局交易順序的話,比如像許多 DAG 類(lèi)型協(xié)議那樣,那么就很難支持復(fù)雜的智能合約,關(guān)于這一部分會(huì)在后面談 DAG 的時(shí)候詳細(xì)描述。
我們也喜歡比特幣 NC 的安全性。比特幣網(wǎng)絡(luò)經(jīng)歷了很多的攻擊,還是穩(wěn)定運(yùn)行了十年。而且嚴(yán)格意義上來(lái)說(shuō),目前沒(méi)有任何一個(gè)已知的工作量證明共識(shí)機(jī)制在整體上超越 NC。如果你對(duì)這個(gè)話題感興趣,可以看這里。
然而在 NC 中有兩個(gè)地方我們希望做出一些改變。首先在帶寬利用方面,比特幣的 NC 在采用隔離見(jiàn)證之后,人為設(shè)定了最大為每十分鐘 4Mb 的吞吐量,然而現(xiàn)實(shí)情況是,比特幣公共節(jié)點(diǎn)的帶寬水平在過(guò)去的幾年里獲得了大幅度的提升。
對(duì)于 NC 我們有哪些地方需要做出改變?如同上圖中這個(gè)研究所指出的,鏈接到網(wǎng)絡(luò)中的比特幣 IPv4 節(jié)點(diǎn)在 2016 年時(shí)帶寬中位數(shù)為 33Mbit/s,在 2017 年 2 月,這個(gè)數(shù)字達(dá)到了 56Mbit/s。
我們很容易想到的改進(jìn)方式就是,協(xié)議自身是否能夠動(dòng)態(tài)地調(diào)節(jié)吞吐量來(lái)適應(yīng)帶寬水平的變化?
Bitcoin Unlimited 做了一個(gè)糟糕的嘗試,它希望能夠動(dòng)態(tài)地調(diào)節(jié)比特幣的吞吐量,但是它失敗了,引入了多種新的攻擊方式讓它的協(xié)議變得不安全。上面是在 Coindesk 上發(fā)布的一篇關(guān)于 Bitcoin Unlimited 安全性研究(鏈接:https://www.coindesk.com/etf-...),我也是這項(xiàng)研究的參與者之一。
另一個(gè)我們希望在 NC 中做出改變的是它的激勵(lì)問(wèn)題,也就是出現(xiàn)自私挖礦攻擊的問(wèn)題。自私挖礦攻擊者會(huì)扣留發(fā)現(xiàn)的區(qū)塊,希望在網(wǎng)絡(luò)中獲得更大的領(lǐng)先優(yōu)勢(shì)。當(dāng)其他誠(chéng)實(shí)礦工發(fā)現(xiàn)區(qū)塊的時(shí)候,攻擊者會(huì)向網(wǎng)絡(luò)廣播這個(gè)被扣留的區(qū)塊,寄希望于這個(gè)被廣播的扣留區(qū)塊會(huì)在誠(chéng)實(shí)區(qū)塊之前,被大部分誠(chéng)實(shí)礦工接收到。如果攻擊者足夠幸運(yùn),下一個(gè)塊是在攻擊者的塊上面進(jìn)行挖礦的,那么誠(chéng)實(shí)的塊將會(huì)成為孤塊。如果攻擊者運(yùn)氣好到能夠連續(xù)挖到多個(gè)區(qū)塊,那么它將能夠非常安全地讓一個(gè)誠(chéng)實(shí)礦工的區(qū)塊失效,因?yàn)楣粽邥?huì)有更長(zhǎng)的鏈。
為什么自私挖礦是有利可圖的呢?我們舉一個(gè)具體的例子,假設(shè)自私挖礦攻擊者有全網(wǎng) 30% 的算力,誠(chéng)實(shí)礦工控制剩下的 70%。如果沒(méi)有自私挖礦攻擊出現(xiàn),那么攻擊者在 10 個(gè)區(qū)塊中能夠找到 3 個(gè),誠(chéng)實(shí)礦工找到 7 個(gè),大家都拿到應(yīng)有的報(bào)酬。如果攻擊者發(fā)動(dòng)自私挖礦攻擊,那么它能夠找到 3 個(gè)區(qū)塊,誠(chéng)實(shí)礦工只能找到 4 個(gè)區(qū)塊,因?yàn)榱硗?3 個(gè)誠(chéng)實(shí)礦工找到的區(qū)塊經(jīng)過(guò)前面提到的攻擊方式變成了孤塊,原本能夠產(chǎn)生 10 個(gè)區(qū)塊的時(shí)間現(xiàn)在只產(chǎn)生了 7 個(gè)區(qū)塊,主鏈增長(zhǎng)速度減慢。
在下一個(gè)難度調(diào)整周期,由于協(xié)議發(fā)現(xiàn)主鏈增長(zhǎng)速度減慢,會(huì)降低挖礦難度,從而攻擊者能夠用同樣大的算力獲得更多的獎(jiǎng)勵(lì),這是自私挖礦有利可圖的原理。要注意的是,礦工獲得的收益是根據(jù)單位時(shí)間內(nèi)獲得的幣的數(shù)量而不是獲得幣的比例來(lái)計(jì)算的。在下一個(gè)難度調(diào)整周期,由于鏈增長(zhǎng)的速度下降,協(xié)議會(huì)降低挖礦難度,此時(shí)礦工在單位時(shí)間能夠獲得更多的幣,才有收益。因此,自私挖礦在第一個(gè)難度調(diào)整周期中是沒(méi)有收益的,只有在挖礦難度調(diào)整之后自私挖礦才會(huì)有收益。
其他替代性共識(shí)協(xié)議那我們?yōu)槭裁床贿x擇其他替代性的共識(shí)協(xié)議呢?
目前有三種替代 NC 的方式,它們分別是 PoS(Proof of Stake,權(quán)益證明),DAG 和兩種區(qū)塊類(lèi)型的共識(shí)協(xié)議。注意這三種方式并不是相互排斥的,是有可能同時(shí)應(yīng)用它們之中的 2-3 種的。下面我們來(lái)進(jìn)一步分析這些協(xié)議的安全性、功能性和吞吐量。
首先是 PoS,實(shí)際上所有的 PoS 協(xié)議引入了新的安全前提。拿 Algorand 舉例來(lái)說(shuō),它要求大部分誠(chéng)實(shí)用戶發(fā)送的消息能夠被大部分其他誠(chéng)實(shí)用戶在一個(gè)已知的時(shí)間范圍內(nèi)里面接收到。這意味著當(dāng)你持有 Algorand 的 Token 時(shí),根據(jù)協(xié)議最初的設(shè)計(jì)你需要時(shí)刻保持在線來(lái)接收消息。如果你不在線你就不是一個(gè)合格的 Token 持有者。
Cardano 的共識(shí)協(xié)議 Ouroboros 則假設(shè)所有用戶有一個(gè)弱同步的時(shí)鐘,并且所有消息都能夠在一定時(shí)間間隔內(nèi)被送達(dá)。這實(shí)際上是提出了一個(gè)非常強(qiáng)的假設(shè)。有很多攻擊方式能夠讓你的挖礦設(shè)備,你的公共節(jié)點(diǎn)或者手機(jī)上的時(shí)鐘產(chǎn)生偏差。并且這個(gè)方案在現(xiàn)實(shí)環(huán)境中實(shí)現(xiàn)起來(lái)也非常困難。
另外 Sleepy Protocol 也要求用戶擁有大致同步的時(shí)鐘。
當(dāng)這些安全性假設(shè)被違反,會(huì)為這些 PoS 協(xié)議帶來(lái)災(zāi)難性的后果。并且 PoS 協(xié)議引入了一些新的攻擊方式,如 Nothing-at-stake Attack,Grinding Attack,Long-range Attack,這些攻擊方式在 PoW 協(xié)議中是不存在的,在這里我不對(duì)這些攻擊方式進(jìn)行詳細(xì)描述。
那么 DAG 協(xié)議怎么樣呢?
所有 DAG 協(xié)議都有交易排序的問(wèn)題,如像 DAG 協(xié)議那樣讓區(qū)塊同步產(chǎn)生,那么不同的礦工或不同的公共節(jié)點(diǎn)對(duì)交易順序的判斷會(huì)有不一致:我認(rèn)為這一些交易被確認(rèn)了,但是其他人可能認(rèn)為另一組交易是被確認(rèn)的。這時(shí)候你會(huì)有兩種解決問(wèn)題的思路。
一種是在區(qū)塊鏈拓?fù)渑判蛲瓿芍髮?duì)交易進(jìn)行排序,這意味著你需要等待很長(zhǎng)的交易確認(rèn)時(shí)間。
另一種是不去確認(rèn)交易順序。合約的輸入需要全局的交易順序,如果不同礦工判斷的交易順序不同,那么每個(gè)礦工對(duì)合約邏輯執(zhí)行順序的理解就是不一樣的,特別是對(duì)于復(fù)雜的合約。這會(huì)限制合約的功能性,復(fù)雜合約不能執(zhí)行,合約中包含的 Token 會(huì)卡在合約中。
那么那些有兩種區(qū)塊類(lèi)型的協(xié)議如何呢??jī)煞N區(qū)塊類(lèi)型的協(xié)議,顧名思義,它采用一種和 NC 中的區(qū)塊一樣的關(guān)鍵區(qū)塊(Key Block)來(lái)保障交易確認(rèn)的安全,同時(shí)在兩個(gè)關(guān)鍵區(qū)塊之間廣播微區(qū)塊(Micro Block)來(lái)提高吞吐量。
這些協(xié)議通常和 DAG 協(xié)議一樣會(huì)有較長(zhǎng)的確認(rèn)延遲。Bitcoin NG 就采用了上述的方案。在 Bitcoin NG 的論文中明確表明,若用戶需要確保交易確認(rèn),在 Bitcoin NG 中他們就需要等待數(shù)個(gè)關(guān)鍵區(qū)塊的確認(rèn),忍受較長(zhǎng)的交易延遲。
(原本在分享過(guò)程中張韌提到 Byzcoin 也有類(lèi)似的問(wèn)題。但是經(jīng)過(guò)進(jìn)一步分析發(fā)現(xiàn)問(wèn)題并不類(lèi)似,若對(duì) Byzcoin 感興趣可以在論壇:https://talk.nervos.org/t/ner... 進(jìn)一步討論 )。
聲稱(chēng)的 TPS?所有采用這些替代性共識(shí)協(xié)議的項(xiàng)目都聲稱(chēng)它們有很高的吞吐量,那么這些項(xiàng)目的吞吐量究竟如何呢?(下面這一段建議觀看視頻,約在 15:30 部分,現(xiàn)場(chǎng)非常精彩 )
Solana 聲稱(chēng)能夠每秒能夠處理 710000 筆交易。如果你能夠有這么大的突破,理應(yīng)獲得圖靈獎(jiǎng)。我迫不及待地想聽(tīng)到他們獲獎(jiǎng)的消息。
還有這個(gè)名為 NKN 的協(xié)議,他們聲稱(chēng)他們能夠在全網(wǎng)擁有 10000 個(gè)節(jié)點(diǎn)的同時(shí)每秒處理 100 萬(wàn)筆交易,目前我還不知道他們是如何做到的,但是我對(duì)他們實(shí)現(xiàn)的方式非常好奇。
我也很好奇為什么 Stellar 和 Ripple 也將自己的協(xié)議歸類(lèi)為 NC,我也非常好奇 10000 個(gè)節(jié)點(diǎn)如何實(shí)現(xiàn)每秒處理 100 萬(wàn)筆交易的。
而如果你想做個(gè)夢(mèng)的話,你最好做一個(gè)偉大的夢(mèng),比如這個(gè)協(xié)議。它聲稱(chēng)能夠在低于 1 秒的最終確認(rèn)時(shí)間內(nèi)擁有 1000000000000TPS 。
嗯,我真的覺(jué)得地球?qū)λ麄兌砸呀?jīng)不夠大了,他們真的需要另找一個(gè)更大的星球來(lái)部署他們的協(xié)議。
我們要注意的是,自稱(chēng)的 TPS 是沒(méi)有可比性的。因?yàn)樗鼈兪窃诓煌木W(wǎng)絡(luò)環(huán)境中做模擬,某些模擬甚至使用 1Gbit/s 的帶寬,顯然這和現(xiàn)實(shí)網(wǎng)絡(luò)情況相差甚遠(yuǎn)。
并且這些協(xié)議都忽略了真實(shí)的情況。他們之中沒(méi)有一個(gè)考慮到交易的同步。對(duì)它們來(lái)說(shuō)似乎所有的交易都是已經(jīng)在區(qū)塊中同步好的一樣,共識(shí)協(xié)議只是用來(lái)對(duì)交易進(jìn)行排序的。而且一些模擬假設(shè)委員會(huì)成員(節(jié)點(diǎn))之間有直接的連接,但事實(shí)是,在公有鏈網(wǎng)絡(luò)中所有的消息都是通過(guò)廣播進(jìn)行的,而廣播消息會(huì)占用公共節(jié)點(diǎn)的帶寬。
知識(shí)點(diǎn):Fresh Transaction,為什么說(shuō)要考慮交易的同步呢?要認(rèn)識(shí)到,在比特幣中一個(gè)用戶從錢(qián)包客戶端發(fā)起的交易并不是被所有礦工都接受到,而是相鄰的幾個(gè)礦工。這些礦工在接受到用戶發(fā)起的交易的時(shí)候會(huì)對(duì)交易進(jìn)行驗(yàn)證才能放到交易池中,以便在未來(lái)將這些交易打包出塊。因此若一個(gè)礦工成功挖到一個(gè)塊并廣播 Compact Block,其他礦工在檢查 Compact Block 中交易 ID 的時(shí)候若發(fā)現(xiàn)對(duì)應(yīng)的有些交易并不在自己的交易池中,則需要向發(fā)送方請(qǐng)求完整交易進(jìn)行驗(yàn)證來(lái)保障區(qū)塊中所有交易都是合法的,這些交易就是「Fresh Transaction」。若不進(jìn)行驗(yàn)證就在收到區(qū)塊之后挖礦,一旦完整區(qū)塊廣播后被發(fā)現(xiàn)有非法交易,將不會(huì)被礦工認(rèn)可,在這個(gè)非法區(qū)塊之后挖出的區(qū)塊都會(huì)作廢。Fresh Transaction 的概念我們會(huì)在后面用到。
比較吞吐量的簡(jiǎn)易模型這里我們有一個(gè)評(píng)估 TPS 的模型。如圖所示,首先我們相信所有公共節(jié)點(diǎn)的帶寬是有一個(gè)上限的,最多能夠使用 100% 的帶寬,你不能使用超過(guò) 100% 的帶寬。在這里帶寬的占用有三個(gè)組成部分。
如上圖所示,第一部分是用于同步最終確認(rèn)的交易所占用的帶寬比例,這一部分是真正的 TPS(This is the real TPS)。交易首先要被同步,之后才能進(jìn)行交易確認(rèn)。第二部分是被共識(shí)協(xié)議「浪費(fèi)」的帶寬所占的比例。第三部分是未被利用的帶寬。
所以如果想要提高 TPS,能夠做的只有兩件事。
1、降低共識(shí)協(xié)議占用的帶寬比例
2、降低未被利用部分的帶寬比例
能做的只有這兩件事情,對(duì),沒(méi)有其他的方式了,并且對(duì)于 Layer 1 的協(xié)議帶寬占用不能超過(guò) 100%。
那我們先來(lái)看看其他替代性共識(shí)協(xié)議的帶寬占用。
事實(shí)上,很多協(xié)議將它們珍貴的帶寬資源浪費(fèi)在委員會(huì)成員之間的通信上。
Algorand 存儲(chǔ)區(qū)塊證書(shū)以此來(lái)向新用戶證明一個(gè)區(qū)塊被提交。每個(gè)區(qū)塊證書(shū)的大小是 300KB ,獨(dú)立于區(qū)塊容量限制之外。如果你按照一個(gè)區(qū)塊 1MB 的大小來(lái)計(jì)算,那么這意味著大約 25% 的帶寬會(huì)永遠(yuǎn)被用于同步這些證書(shū)。因此我非常好奇為什么它們聲稱(chēng)他們的吞吐量比 NC 更好,這根本不合理。
另外一種在共識(shí)協(xié)議中浪費(fèi)帶寬的方式是區(qū)塊型 DAG 和孤塊中的冗余交易。如上圖的論文中所說(shuō),如果所有的節(jié)點(diǎn)在區(qū)塊中選擇包含同樣的一組子交易,任何兩個(gè)平行創(chuàng)建的區(qū)塊將可能出現(xiàn)沖突,并且吞吐量就不會(huì)很高。
而目前所有的區(qū)塊型 DAG 協(xié)議對(duì)這種情況視若罔聞。
如何突破中本聰共識(shí)困境?從上面的分析中看到,顯然目前的吞吐量不能滿足我們,因此,Nervos CKB 的共識(shí)協(xié)議 NC-Max 對(duì) NC 做了一些改進(jìn):
NC-Max 有三個(gè)主要的創(chuàng)新
采用兩步交易確認(rèn)來(lái)降低孤塊率
動(dòng)態(tài)調(diào)整區(qū)塊間隔和區(qū)塊獎(jiǎng)勵(lì)來(lái)更好的提升帶寬利用率
在難度調(diào)整的時(shí)候考慮周期中的所有區(qū)塊,來(lái)抵御自私挖礦攻擊。
接下來(lái)我會(huì)進(jìn)行詳細(xì)解釋。
NC 有一個(gè)天然的吞吐量限制,因?yàn)橄胍岣?NC 中的吞吐量,只能做兩件事情:
第一件是更大的區(qū)塊,就如 Bitcoin Unlimited 和 Bitcoin Cash 那樣,還有很多其他的項(xiàng)目也這樣做;
第二件是降低出塊間隔。
但是由于區(qū)塊廣播需要時(shí)間,廣播期間若其他節(jié)點(diǎn)發(fā)現(xiàn)區(qū)塊并廣播,會(huì)和正在廣播的區(qū)塊產(chǎn)生競(jìng)爭(zhēng),其中之一會(huì)成為孤塊。更大的區(qū)塊會(huì)需要更長(zhǎng)時(shí)間廣播,降低出塊間隔實(shí)際上是降低出塊難度,節(jié)點(diǎn)更容易發(fā)現(xiàn)區(qū)塊。這兩種方案容易帶來(lái)的結(jié)果是孤塊率變高了。這些孤塊占用更多的帶寬,但是它們并不為交易確認(rèn)做出貢獻(xiàn)。當(dāng)孤塊率提高時(shí),系統(tǒng)的安全性會(huì)降低并且吞吐量也會(huì)降低。因此對(duì)于這兩種方案最終會(huì)達(dá)到一個(gè)平衡,當(dāng)區(qū)塊大小或出塊間隔調(diào)節(jié)到一定程度時(shí),孤塊率會(huì)高到一定程度,即使你進(jìn)一步增加區(qū)塊大小或者降低出塊間隔,吞吐量也不會(huì)得到提高。
為什么太多的孤塊會(huì)對(duì)網(wǎng)絡(luò)的安全和性能產(chǎn)生負(fù)面影響呢?在上圖中我們能夠看到,當(dāng)孤塊率非常高時(shí),攻擊者能夠非常輕易地私自構(gòu)建一條更長(zhǎng)鏈。攻擊者只需要擁有比全網(wǎng)算力的 51% 低很多的算力,就能夠覆蓋掉區(qū)塊鏈。并且孤塊會(huì)消耗公共節(jié)點(diǎn)大量的帶寬,這會(huì)對(duì)整個(gè)系統(tǒng)的吞吐量造成很大的負(fù)面影響。
那我們?nèi)绾未蚱?NC 吞吐量的限制呢?經(jīng)過(guò)上面分析,如果我們想要打破這個(gè)限制,就必須降低孤塊率。如果孤塊率下降,那么網(wǎng)絡(luò)的安全性和吞吐量都能夠提高。
如何降低孤塊率呢?孤塊的出現(xiàn)是由于區(qū)塊廣播的延遲,若在一個(gè)區(qū)塊廣播的過(guò)程中,有另一個(gè)區(qū)塊被發(fā)現(xiàn),那么其中一個(gè)區(qū)塊就注定會(huì)成為孤塊。如果區(qū)塊廣播能夠瞬間完成,自然不會(huì)有孤塊出現(xiàn)。那我們?nèi)绾未_保區(qū)塊能夠足夠快速地被廣播出去呢?
比特幣的開(kāi)發(fā)者已經(jīng)投入了非常多的資源和精力來(lái)加快區(qū)塊的廣播速度,我們需要進(jìn)一步找出哪些區(qū)塊的廣播速度較慢,或是出了問(wèn)題。
我們來(lái)詳細(xì)看看這是如何發(fā)生的,請(qǐng)看下圖。
目前的比特幣網(wǎng)絡(luò),如果一切順利的話,一個(gè)區(qū)塊是通過(guò)一個(gè)Compact Block 中繼協(xié)議來(lái)廣播的。
在 Compact Block 中,并不會(huì)將整個(gè)交易(比特幣每個(gè)交易大約 250Bytes)廣播出去,而是廣播 Compact Block 中的交易 ID。這些交易 ID 組成了 Compact Block,這些 Compact Block 比實(shí)際的區(qū)塊小很多,因此速度會(huì)快很多。
當(dāng)節(jié)點(diǎn) A 廣播 Compact Block 給節(jié)點(diǎn) B 的時(shí)候,節(jié)點(diǎn) B 檢查這些交易 ID ,如果對(duì)于節(jié)點(diǎn) B 這些交易都不是 Fresh Transaction(也就是節(jié)點(diǎn) B 的交易池中包含這些交易),節(jié)點(diǎn) B 能夠立刻轉(zhuǎn)發(fā)這些 Compact Block 給相鄰節(jié)點(diǎn),這種情況非常棒,過(guò)程很順利。
然而如果在 Compact Block 中有 Fresh Transaction,節(jié)點(diǎn) B 將首先需要從節(jié)點(diǎn) A 那邊同步 Fresh Transaction,然后驗(yàn)證這些交易的簽名,這些步驟都很耗費(fèi)時(shí)間。只有當(dāng)整個(gè)區(qū)塊都經(jīng)過(guò)驗(yàn)證無(wú)誤之后,節(jié)點(diǎn) B 才能繼續(xù)廣播這個(gè)區(qū)塊。這個(gè)過(guò)程避免收到的區(qū)塊非法,這樣礦工才會(huì)在這個(gè)區(qū)塊之后挖礦并廣播,若不經(jīng)過(guò)驗(yàn)證萬(wàn)一之后發(fā)現(xiàn)是非法區(qū)塊,那么在這個(gè)非法區(qū)塊之后的區(qū)塊都是無(wú)效的。同步 Fresh Transaction 的過(guò)程是比特幣區(qū)塊廣播延遲的主要原因。
所以,以太坊是一個(gè)糟糕的嘗試,我來(lái)分析一下他們是怎么做的。以太坊簡(jiǎn)單地縮短了出塊間隔,但是以太坊有一個(gè)問(wèn)題,就是它不能夠在收到區(qū)塊之前驗(yàn)證交易的有效性。因?yàn)樵谝蕴恢幸粋€(gè)交易的有效性依賴(lài)于區(qū)塊中交易的順序,因此如果你想要驗(yàn)證一個(gè)交易的有效性你必須等到整個(gè)區(qū)塊都被接收到才行,這樣的話每一個(gè)區(qū)塊實(shí)際上都是 Fresh Transaction。
并且以太坊的網(wǎng)絡(luò)協(xié)議維護(hù)得非常差,自從 2015 年開(kāi)始就沒(méi)有任何的迭代。
而且在交易廣播過(guò)程中也有大量的冗余。以太坊客戶端會(huì)將同一筆交易向不同的節(jié)點(diǎn)廣播 7 次,這意味著每一個(gè)節(jié)點(diǎn)將會(huì)收到同一筆交易 7 次。(以太坊有不同的客戶端,如 Parity Ethereum,Geth 等)而且不同類(lèi)型的客戶端之間有不一致性,兩個(gè)主要的以太坊客戶端之間基本都是獨(dú)立的。
因此能夠鏈接兩個(gè)不同的網(wǎng)絡(luò)的節(jié)點(diǎn)非常少,這也是為什么以太坊孤塊率有時(shí)會(huì)高達(dá) 30%,并且交易吞吐量非常低。
而且大礦工沒(méi)有加快區(qū)塊廣播速度的激勵(lì)。因?yàn)槿绻业膮^(qū)塊能夠更慢地廣播出去,意味著我實(shí)際上能夠?qū)崿F(xiàn)「自私挖礦」(這里大礦工并不扣留區(qū)塊,只是區(qū)塊廣播比較慢,在這個(gè)過(guò)程中出現(xiàn)了其他的競(jìng)爭(zhēng)塊,而因?yàn)槲沂谴蟮V工有較大的概率在和其他競(jìng)爭(zhēng)塊競(jìng)爭(zhēng)過(guò)程中勝出)。這對(duì)我來(lái)講是好事,為什么我要加速區(qū)塊廣播呢?
以太坊中的叔塊獎(jiǎng)勵(lì)也沒(méi)有提供任何幫助,畢竟如果產(chǎn)生了的孤塊,礦工還是能夠獲得獎(jiǎng)勵(lì)。因此小礦工會(huì)采用先廣播區(qū)塊頭和空塊的方式,因?yàn)閺V播區(qū)塊頭的速度會(huì)快很多。并且由于不知道下一個(gè)區(qū)塊中會(huì)包含哪些交易,因此礦工通常會(huì)挖一個(gè)空塊來(lái)確保區(qū)塊中不會(huì)包含和之前區(qū)塊交易產(chǎn)生沖突的交易。這非常糟糕,因?yàn)榭諌K并不為交易確認(rèn)做出貢獻(xiàn)。
下面是我們的設(shè)計(jì),來(lái)緩解上面提到的一些問(wèn)題。
這張圖是區(qū)塊的結(jié)構(gòu),我們?cè)诒忍貛艆^(qū)塊結(jié)構(gòu)的基礎(chǔ)上增加了幾個(gè)字段。
上圖是我們的完整區(qū)塊的區(qū)塊結(jié)構(gòu)。首先我們有一個(gè)交易提案區(qū)(青色區(qū)域)。只有交易提案區(qū)可包含 Fresh Transaction,而傳統(tǒng)的交易確認(rèn)區(qū)(橙色區(qū)域)只能包含前幾個(gè)區(qū)塊的交易提案區(qū)的交易,若當(dāng)前區(qū)塊高度是 h 的話,那么就是 h-m 到 h-n 區(qū)塊的交易提案區(qū)內(nèi)的交易。只有這些交易能夠被確認(rèn),F(xiàn)resh Transaction 不能被交易確認(rèn)區(qū)確認(rèn)。交易提案區(qū)不包含完整的交易,只包含交易 ID(Truncated Transaction ID),因此交易提案區(qū)會(huì)非常小。
在叔塊頭區(qū)可以包含任意數(shù)量的叔塊(紫色區(qū)域),叔塊應(yīng)該包含它們的區(qū)塊頭和交易提案區(qū)。叔塊頭區(qū)不計(jì)入?yún)^(qū)塊大小,因而不受區(qū)塊大小的限制,所以不會(huì)限制礦工添加叔塊。
下面我進(jìn)一步來(lái)解釋交易提案區(qū)。這個(gè)區(qū)域非常小,因?yàn)樗话灰?ID。完整的交易與區(qū)塊同步廣播,因?yàn)檫@是一個(gè)并行的過(guò)程,所以交易的廣播不會(huì)影響到區(qū)塊的廣播。并且節(jié)點(diǎn)在收到廣播的交易后只需要驗(yàn)證哈希,不會(huì)影響區(qū)塊的驗(yàn)證過(guò)程。
盡管這意味著在交易提案區(qū)可能會(huì)有無(wú)效的交易,雙花交易以及礦工可能不愿意接受的交易,但是這都沒(méi)有關(guān)系。
類(lèi)比之前提到的比特幣區(qū)塊廣播過(guò)程,在我們的協(xié)議中,發(fā)現(xiàn)區(qū)塊的節(jié)點(diǎn)會(huì)先廣播 Compact Block(也就是區(qū)塊頭和交易的 ID),Compact Block 較比特幣的稍微大一點(diǎn),包含交易提案區(qū)和若干叔塊的區(qū)塊頭和叔塊的交易提案區(qū)。但由于 Compact Block 本身足夠小通常會(huì)立刻廣播給相鄰的節(jié)點(diǎn)。
新提出的交易,如果有一部分不在節(jié)點(diǎn)的交易池中,它們會(huì)在發(fā)出 Compact Block 之后進(jìn)行廣播。這些都是并行過(guò)程,不會(huì)相互影響。節(jié)點(diǎn)收到交易,經(jīng)過(guò)哈希驗(yàn)證后廣播給相鄰的節(jié)點(diǎn)。
這很自然地會(huì)有幾個(gè)問(wèn)題:
如果礦工拒絕提供提案交易的完整版本怎么辦?
我把這個(gè)交易放到我的交易提案區(qū),但是當(dāng)你問(wèn)我要完整的交易的時(shí)候,我裝作不知道。
實(shí)際上這個(gè)對(duì)區(qū)塊廣播不會(huì)有影響,因?yàn)椴徽摻灰滋岚竻^(qū)是否有 Fresh Transaction,區(qū)塊都能夠廣播。
并且其他礦工也會(huì)繼續(xù)挖礦,因?yàn)榭偸怯凶銐虻奶岚附灰仔枰_認(rèn)。該礦工也沒(méi)有必要挖空塊,因?yàn)橹皡^(qū)塊的交易提案區(qū)包含了它將打包的這些交易 ID,已經(jīng)被發(fā)現(xiàn)的區(qū)塊在 Compact Block 中都廣播了打包進(jìn)的交易確認(rèn)區(qū)的交易 ID,礦工都知道哪些交易被打包了哪些沒(méi)有,不會(huì)選擇和被發(fā)現(xiàn)區(qū)塊交易確認(rèn)區(qū)內(nèi)相沖突的交易,因此礦工會(huì)選擇繼續(xù)打包交易出塊并獲得手續(xù)費(fèi),為交易確認(rèn)做貢獻(xiàn)。
那么如果礦工在他們最新的區(qū)塊中包含了這些提出但未廣播的交易,以獲得一個(gè)類(lèi)似自私挖礦的優(yōu)勢(shì)怎么辦?
在比特幣的 NC 中,礦工減慢區(qū)塊廣播速度可以獲得挖礦優(yōu)勢(shì)。礦工通常能夠在挖出一個(gè)區(qū)塊時(shí),只廣播區(qū)塊頭,而在廣播完整區(qū)塊的時(shí)候放慢動(dòng)作。在這個(gè)過(guò)程中只有該礦工能夠挖礦(因?yàn)橹挥兴老乱粋€(gè)區(qū)塊的信息,能夠基于這個(gè)新塊挖礦,這個(gè)過(guò)程類(lèi)似扣留區(qū)塊)。
但是在我們的協(xié)議中,采用這種方式只會(huì)減慢 n 個(gè)區(qū)塊之后的區(qū)塊廣播速度。因?yàn)樘岢龅磸V播的交易只有自私礦工知道,也只有自私礦工能以此作為優(yōu)勢(shì)。然而這個(gè)不能被用在下一個(gè)區(qū)塊中,因?yàn)樵谖覀兊膮f(xié)議中只能挖 n 個(gè)區(qū)塊之前提案區(qū)中包含交易,中間需要有一個(gè)間隔。
礦工只能夠挖 h-m 至 h-n 個(gè)區(qū)塊內(nèi)的提案交易,但是不能挖前一個(gè)區(qū)塊的提案交易,除非這個(gè)區(qū)塊也是被攻擊者挖到的。
如圖所示,這是我們的共識(shí)協(xié)議和比特幣 NC 的對(duì)比。在比特幣 NC 中當(dāng)自私的礦工找到區(qū)塊 h, 它能夠立刻開(kāi)始挖區(qū)塊 h+1,此時(shí)誠(chéng)實(shí)礦工只能夠在收到完整的區(qū)塊 h 之后才能開(kāi)始挖礦,因?yàn)槠渌V工需要知道區(qū)塊包含的完整的交易并驗(yàn)證來(lái)確定區(qū)塊是合法的,而自私礦工能夠通過(guò)減慢區(qū)塊 h 傳輸?shù)乃俣葋?lái)讓其他礦工更晚收到區(qū)塊。在區(qū)塊廣播期間就是自私挖礦者的優(yōu)勢(shì)期。
然而在我們的協(xié)議中當(dāng)一個(gè)自私礦工找到一個(gè)區(qū)塊 h,廣播了包含區(qū)塊頭和交易 ID 的 Compact Block,誠(chéng)實(shí)礦工能夠立刻開(kāi)始挖 h+1。如果自私礦工想要利用這些提出但未廣播的交易,它必須找到 n 個(gè)區(qū)塊之后的區(qū)塊(這些區(qū)塊才能包含這些提出但未廣播的交易),這樣他們才能利用這個(gè)優(yōu)勢(shì)。然而這很難發(fā)生,你不能確定在 n 個(gè)塊之后的那個(gè)塊是你挖出來(lái)的,這個(gè)非常難預(yù)測(cè)。
為了更好地利用帶寬,我們的協(xié)議使用了另一種不同的難度調(diào)整機(jī)制,設(shè)定一個(gè)固定的孤塊率(根據(jù)上一個(gè)難度調(diào)節(jié)期的叔塊數(shù)來(lái)計(jì)算)。
如果孤塊率在上一個(gè)難度調(diào)整周期低于設(shè)定的孤塊率,挖礦難度會(huì)降低,出塊間隔將降低,吞吐量會(huì)提高。也就是說(shuō),更少的孤塊意味著當(dāng)前的網(wǎng)絡(luò)狀態(tài)實(shí)際上有能力更快地同步交易,我們能夠在提高吞吐量的同時(shí)不損害網(wǎng)絡(luò)的去中心化。
反過(guò)來(lái)看如果難度提高,那么出塊間隔會(huì)增加,吞吐量也會(huì)降低。如果孤塊率很高那么意味著當(dāng)前的網(wǎng)絡(luò)在這個(gè)難度調(diào)整周期內(nèi)并不能處理那么多的交易,那么協(xié)議就會(huì)降低吞吐量。
同時(shí)出塊獎(jiǎng)勵(lì)會(huì)和 1/(預(yù)期出塊間隔)成正比,因此在每個(gè)難度調(diào)整周期中預(yù)期的總出塊獎(jiǎng)勵(lì)是固定的。
這意味著假設(shè)我們每十分鐘出一個(gè)塊,每個(gè)塊中有 12.5 個(gè)比特幣,如果難度調(diào)節(jié)變成每 5 分鐘出一個(gè)塊的時(shí)候,每個(gè)塊會(huì)有 6.125 個(gè)比特幣。因此貨幣的發(fā)行率也是保持恒定的。
最后,抵抗自私挖礦攻擊。前面我們提到我們的協(xié)議和 NC 的一個(gè)區(qū)別在于,我們的難度調(diào)整機(jī)制是根據(jù)難度調(diào)整區(qū)間中出現(xiàn)的所有區(qū)塊來(lái)計(jì)算的,在估計(jì)總算力的時(shí)候也會(huì)包含叔塊。
在 NC-Max 中,假設(shè)攻擊者占總算力的 30%,誠(chéng)實(shí)礦工 70%,如果沒(méi)有自私挖礦攻擊,在 10 個(gè)區(qū)塊中攻擊者能夠找到 3 個(gè)區(qū)塊,誠(chéng)實(shí)礦工找到 7 個(gè)。如果進(jìn)行自私挖礦,攻擊者在 7 個(gè)區(qū)塊中能夠找到 3 個(gè)區(qū)塊,誠(chéng)實(shí)礦工找到 4 個(gè),3 個(gè)誠(chéng)實(shí)區(qū)塊會(huì)成為孤塊,主鏈會(huì)增長(zhǎng)緩慢。
前面也提到自私挖礦在第一個(gè)難度調(diào)整周期內(nèi)是沒(méi)有收益的,那么在第二個(gè)難度調(diào)整周期會(huì)出現(xiàn)什么?
在下一個(gè)難度調(diào)整周期,難度會(huì)保持不變(因?yàn)殡y度會(huì)根據(jù)所有區(qū)塊計(jì)算,包含孤塊),攻擊者并不能用同樣的算力找到更多的區(qū)塊,因此自私挖礦不再有利可圖。
也就是說(shuō),我們假設(shè)幣價(jià)在短時(shí)間內(nèi)維持穩(wěn)定,由于自私挖礦攻擊者是短視的,他們的獎(jiǎng)勵(lì)是根據(jù)單位時(shí)間內(nèi)獲得的獎(jiǎng)勵(lì)來(lái)定義,可以等價(jià)于同樣的電力消耗能夠獲得的獎(jiǎng)勵(lì)。在比特幣中,自私挖礦攻擊者能夠通過(guò)降低鏈增長(zhǎng)速度,「迫使」協(xié)議降低出塊難度,從而在難度調(diào)整之后單位時(shí)間內(nèi)能夠獲得更多的獎(jiǎng)勵(lì)。而在 NC-Max 協(xié)議設(shè)計(jì)中,出塊難度會(huì)根據(jù)所有區(qū)塊來(lái)計(jì)算,包括孤塊,攻擊者讓誠(chéng)實(shí)礦工的區(qū)塊成為孤塊,卻并不能「迫使」協(xié)議降低出塊難度,以在單位時(shí)間內(nèi)獲得更高獎(jiǎng)勵(lì)。
最后總結(jié)一下,我們的協(xié)議會(huì)很好地利用孤塊:
我們希望能夠通過(guò)兩步交易驗(yàn)證來(lái)降低孤塊數(shù)量,在孤塊數(shù)量降低之后,我們利用孤塊率作為一個(gè)帶寬利用水平的指標(biāo)來(lái)動(dòng)態(tài)地調(diào)節(jié)吞吐量。
并且孤塊信息被寫(xiě)在了區(qū)塊鏈中,我們?cè)谕诘V難度調(diào)整算法中利用這個(gè)信息從而讓自私挖礦無(wú)利可圖。
NC-Max 是 Nervos CKB 的 PoW 共識(shí)協(xié)議。NC 是 Nakamoto Consensus 的簡(jiǎn)稱(chēng),也就是比特幣的共識(shí)協(xié)議。如果讀完這篇文章,你覺(jué)得這個(gè)共識(shí)協(xié)議應(yīng)該有一個(gè)更好的名字,歡迎告訴我們,或許我們能夠采納:)歡迎討論:https://talk.nervos.org/t/ner...。
推薦閱讀:張韌博士的共識(shí)安全性分析文章《制定通用的標(biāo)準(zhǔn):評(píng)估 PoW 共識(shí)協(xié)議的安全性》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/24565.html
摘要:最后,在中采用了一個(gè)的變體作為共識(shí)協(xié)議,擁有更高的吞吐量。知識(shí)點(diǎn),在比特幣改進(jìn)協(xié)議中提出,能夠減少網(wǎng)絡(luò)節(jié)點(diǎn)廣播區(qū)塊所需的帶寬數(shù)量。 本期秘猿科技區(qū)塊鏈小課堂將會(huì)就 PoW 共識(shí)的突破進(jìn)行展開(kāi)。帶寬實(shí)際上是區(qū)塊鏈吞吐量的最大限制,在美國(guó)舊金山舉辦的 Scaling Bitcoin Meetup 中,秘猿科技研究員張韌從「帶寬利用率」角度分析了諸多共識(shí)協(xié)議的效率和可行性。理解本文需要以下知...
摘要:老師周四分享程序員中的專(zhuān)業(yè)區(qū)塊鏈講解員老師每周四晚的千聊直播分享,最近兩周帶來(lái)了期有關(guān)比特幣白皮書(shū)圖解的內(nèi)容,第一部分主要講的是比特幣的基本情況及比特幣網(wǎng)絡(luò)的基本組成,第二部分深入解析了比特幣的交易及共識(shí)機(jī)制。 showImg(https://segmentfault.com/img/bVbpdhy?w=1080&h=460); 這一期,有些激動(dòng)有些慌!為什么呢? 在正式發(fā)布 CKB ...
摘要:近日,研究員張韌發(fā)表的被接收,這也是中國(guó)大陸的區(qū)塊鏈團(tuán)隊(duì)第一次在區(qū)塊鏈行業(yè)核心會(huì)議上發(fā)表相關(guān)論文。關(guān)于論文張韌是魯汶大學(xué)在讀博士,前研究員,長(zhǎng)期專(zhuān)注于區(qū)塊鏈共識(shí)協(xié)議安全和隱私研究。 showImg(https://segmentfault.com/img/bVbpmou?w=2779&h=1179); 近日,Nervos & Cryptape 研究員張韌發(fā)表的《Lay Down the...
摘要:月日,的專(zhuān)區(qū)悄悄上線了共識(shí)協(xié)議提案,這份提案由研究員張韌提交,暫命名為。以上活動(dòng)可同時(shí)參與,不影響獲獎(jiǎng)資格。 6 月 19 日,Nervos Network 的 RFC 專(zhuān)區(qū)悄悄上線了共識(shí)協(xié)議提案,這份 RFC 提案由 Nervos 研究員張韌提交,暫命名為 NC-Max。 NC-Max 在比特幣的 Nakamoto Consensus 的基礎(chǔ)上,主要有三大創(chuàng)新: 1.通過(guò)兩步交易確認(rèn)...
摘要:距離我們首次發(fā)布項(xiàng)目發(fā)展路線圖已經(jīng)有六個(gè)多月的時(shí)間。當(dāng)我們有新的變化時(shí),會(huì)及時(shí)更新項(xiàng)目發(fā)展路線圖,以便讓大家了解項(xiàng)目進(jìn)程。 距離我們首次發(fā)布項(xiàng)目發(fā)展路線圖已經(jīng)有六個(gè)多月的時(shí)間。現(xiàn)在,我們將更新項(xiàng)目最新的進(jìn)展及規(guī)劃,包括過(guò)去已實(shí)現(xiàn)的、未實(shí)現(xiàn)的,以及未來(lái)將會(huì)發(fā)生的一些變化。 showImg(https://segmentfault.com/img/bVbqetb?w=4001&h=2251...
閱讀 750·2021-07-25 21:37
閱讀 3662·2019-08-30 15:55
閱讀 2578·2019-08-30 15:54
閱讀 1727·2019-08-30 15:44
閱讀 3128·2019-08-30 15:44
閱讀 865·2019-08-30 15:43
閱讀 1034·2019-08-29 15:36
閱讀 3045·2019-08-29 10:58