帶寬其實是區塊鏈吞吐量的最大限制,在美國舊金山舉辦的 Scaling Bitcoin Meetup 中,Nervos & Cryptape 研究員張韌從「帶寬利用率」角度分析了諸多共識協議的效率和可行性。html
Algorand 的帶寬利用效率如何?Cardano 的 Ouroboros 怎麼樣?Solana、NKN 爲何能有那麼高的 TPS?以太坊將出塊間隔縮短到 15 秒,爲何並無比比特幣吞吐量高出不少?
這些問題,張韌博士都會在分享中一一回答。如下爲韌博士演講稿整理,如若但願和韌博士進行進一步討論,歡迎點擊文末「閱讀原文」,咱們在 Nervos Talk 共同探討。
閱讀本文對讀者的區塊鏈基礎知識儲備有必定要求:
比特幣共識協議(也就是 Nakamoto Consensus)基本概念算法
以太坊共識協議基本概念編程
孤塊、叔塊、自私挖礦等概念安全
自我介紹一下,我是張韌,Nervos & Cryptape 的研究員,目前我在魯汶大學 COSIC (Computer Security and Industrial Cryptography group) 讀博士,師從 Bart Preneel。 若是你對 COSIC 不熟悉的話,不知道你是否據說過 AES,它是咱們全部人的手機中使用的加密標準。
性能優化
固然若是你熟悉 Bart Preneel 的話,會知道他是 RIPEMD 160 的設計者。RIPEMD 160 是比特幣公鑰轉化爲比特幣地址時使用的哈希算法。網絡
Nervos CKB 是一個公有鏈,可以支持各類編程語言的智能合約,以及各類各樣的 Layer 2 協議。在 Nervos CKB 上你能夠用任意資產支付交易手續費。在 Nervos CKB 中智能合約的執行和驗證是分離的,從而達到更好的隱私和性能。最後,在 Nervos CKB 中採用了 NC-Max ——一個 Nakamoto Consensus 的變體——做爲共識協議,擁有更高的吞吐量。編程語言
聲明:本次分享內容僅着眼於 Layer 1 共識協議的分析,我將不會談到 Lightning Network 這樣的 Layer 2 方案。
這裏是我本次分享的大綱,首先我會告訴你爲何咱們會那麼喜歡 Nakamoto Consensus(也就是比特幣的共識協議,如下簡稱 NC,包含一組規則,如最長鏈規則、激勵規則、增發規則等)。而後我會給出咱們爲何不採用其餘共識協議的理由。最後我會給出咱們 Nervos CKB 的共識協議 NC-Max 的設計思路。分佈式
先來回答一個問題,爲何咱們喜歡比特幣的 Nakamoto Consensus(NC)?
有不少的理由,首先 NC 的性能優化作的很是好,它可以節約每個傳輸的每個字節,以及每一個計算週期。舉例來講,它使用Compact Block來加快區塊的傳播,可能在將來使用 Minisketch (一個用於在分佈式系統不一樣節點之間同步信息時,下降帶寬需求的軟件庫)來節省交易廣播所須要的帶寬資源。同時比特幣的開發者提出了 Graftroot(關係到比特幣上開發智能合約以及隱私性的一項提案),你能夠認爲它可以經過壓縮比特幣上的智能合約從而得到更好的隱私性和更好的性能。或許咱們還可以看到簽名聚合技術(Signature Aggregation)應用在比特幣之上。
性能
知識點:Compact Block Relay,在比特幣改進協議(BIP)152 中提出,可以減小 P2P 網絡節點廣播區塊所需的帶寬數量。區塊鏈
Compact block 是完整區塊的「概要」,包含下面三部分信息:
一、新區塊的區塊頭
二、交易 ID
三、發送方節點預測的可是接收節點不具有的完整交易
接收方會嘗試根據收到的信息以及在其內存池中的交易來從新構建完整區塊。若仍然缺失某些交易,它將會請求廣播節點。
喜歡 NC 的另外一個理由是它的通用性。UTXO 模型加上全局交易順序可以支持各類分片技術和 Layer 2 方案,以及複雜的智能合約。
相比來看,以太坊的 Account 模型進行分片的難度更高;而且若是你沒有一個全局交易順序的話,好比像許多 DAG 類型協議那樣,那麼就很難支持複雜的智能合約,關於這一部分會在後面談 DAG 的時候詳細描述。
咱們也喜歡比特幣 NC 的安全性。比特幣網絡經歷了不少的攻擊,仍是穩定運行了十年。並且嚴格意義上來講,目前沒有任何一個已知的工做量證實共識機制在總體上超越 NC。若是你對這個話題感興趣,能夠看這裏。
然而在 NC 中有兩個地方咱們但願作出一些改變。首先在帶寬利用方面,比特幣的 NC 在採用隔離見證以後,人爲設定了最大爲每十分鐘 4Mb 的吞吐量,然而現實狀況是,比特幣公共節點的帶寬水平在過去的幾年裏得到了大幅度的提高。
如同上圖中這個研究所指出的,連接到網絡中的比特幣 IPv4 節點在 2016 年時帶寬中位數爲 33Mbit/s,在 2017 年 2 月,這個數字達到了 56Mbit/s。
咱們很容易想到的改進方式就是,協議自身是否可以動態地調節吞吐量來適應帶寬水平的變化?
Bitcoin Unlimited 作了一個糟糕的嘗試,它但願可以動態地調節比特幣的吞吐量,可是它失敗了,引入了多種新的攻擊方式讓它的協議變得不安全。上面是在 Coindesk 上發佈的一篇關於 Bitcoin Unlimited 安全性研究(連接:https://www.coindesk.com/etf-tied-to-bitcoin-futures-withdrawn-after-sec-staff-request),我也是這項研究的參與者之一。
另外一個咱們但願在 NC 中作出改變的是它的激勵問題,也就是出現自私挖礦攻擊的問題。自私挖礦攻擊者會扣留髮現的區塊,但願在網絡中得到更大的領先優點。當其餘誠實礦工發現區塊的時候,攻擊者會向網絡廣播這個被扣留的區塊,寄但願於這個被廣播的扣留區塊會在誠實區塊以前,被大部分誠實礦工接收到。若是攻擊者足夠幸運,下一個塊是在攻擊者的塊上面進行挖礦的,那麼誠實的塊將會成爲孤塊。若是攻擊者運氣好到可以連續挖到多個區塊,那麼它將可以很是安全地讓一個誠實礦工的區塊失效,由於攻擊者會有更長的鏈。
爲何自私挖礦是有利可圖的呢?咱們舉一個具體的例子,假設自私挖礦攻擊者有全網 30% 的算力,誠實礦工控制剩下的 70%。若是沒有自私挖礦攻擊出現,那麼攻擊者在 10 個區塊中可以找到 3 個,誠實礦工找到 7 個,你們都拿到應有的報酬。若是攻擊者發動自私挖礦攻擊,那麼它可以找到 3 個區塊,誠實礦工只能找到 4 個區塊,由於另外 3 個誠實礦工找到的區塊通過前面提到的攻擊方式變成了孤塊,本來可以產生 10 個區塊的時間如今只產生了 7 個區塊,主鏈增加速度減慢。
在下一個難度調整週期,因爲協議發現主鏈增加速度減慢,會下降挖礦難度,從而攻擊者可以用一樣大的算力得到更多的獎勵,這是自私挖礦有利可圖的原理。要注意的是,礦工得到的收益是根據單位時間內得到的幣的數量而不是得到幣的比例來計算的。在下一個難度調整週期,因爲鏈增加的速度降低,協議會下降挖礦難度,此時礦工在單位時間可以得到更多的幣,纔有收益。所以,自私挖礦在第一個難度調整週期中是沒有收益的,只有在挖礦難度調整以後自私挖礦纔會有收益。
那咱們爲何不選擇其餘替代性的共識協議呢?
目前有三種替代 NC 的方式,它們分別是 PoS(Proof of Stake,權益證實),DAG 和兩種區塊類型的共識協議。注意這三種方式並非相互排斥的,是有可能同時應用它們之中的 2-3 種的。下面咱們來進一步分析這些協議的安全性、功能性和吞吐量。
首先是 PoS,實際上全部的 PoS 協議引入了新的安全前提。拿 Algorand 舉例來講,它要求大部分誠實用戶發送的消息可以被大部分其餘誠實用戶在一個已知的時間範圍內裏面接收到。這意味着當你持有 Algorand 的 Token 時,根據協議最初的設計你須要時刻保持在線來接收消息。若是你不在線你就不是一個合格的 Token 持有者。
Cardano 的共識協議 Ouroboros 則假設全部用戶有一個弱同步的時鐘,而且全部消息都可以在必定時間間隔內被送達。這其實是提出了一個很是強的假設。有不少攻擊方式可以讓你的挖礦設備,你的公共節點或者手機上的時鐘產生誤差。而且這個方案在現實環境中實現起來也很是困難。
另外 Sleepy Protocol 也要求用戶擁有大體同步的時鐘。
當這些安全性假設被違反,會爲這些 PoS 協議帶來災難性的後果。而且 PoS 協議引入了一些新的攻擊方式,如 Nothing-at-stake Attack,Grinding Attack,Long-range Attack,這些攻擊方式在 PoW 協議中是不存在的,在這裏我不對這些攻擊方式進行詳細描述。
那麼 DAG 協議怎麼樣呢?
全部 DAG 協議都有交易排序的問題,如像 DAG 協議那樣讓區塊同步產生,那麼不一樣的礦工或不一樣的公共節點對交易順序的判斷會有不一致:我認爲這一些交易被確認了,可是其餘人可能認爲另外一組交易是被確認的。這時候你會有兩種解決問題的思路。
一種是在區塊鏈拓撲排序完成以後對交易進行排序,這意味着你須要等待很長的交易確認時間。
另外一種是不去確認交易順序。合約的輸入須要全局的交易順序,若是不一樣礦工判斷的交易順序不一樣,那麼每一個礦工對合約邏輯執行順序的理解就是不同的,特別是對於複雜的合約。這會限制合約的功能性,複雜合約不能執行,合約中包含的 Token 會卡在合約中。
那麼那些有兩種區塊類型的協議如何呢?兩種區塊類型的協議,顧名思義,它採用一種和 NC 中的區塊同樣的關鍵區塊(Key Block)來保障交易確認的安全,同時在兩個關鍵區塊之間廣播微區塊(Micro Block)來提升吞吐量。
這些協議一般和 DAG 協議同樣會有較長的確認延遲。Bitcoin NG 就採用了上述的方案。在 Bitcoin NG 的論文中明確代表,若用戶須要確保交易確認,在 Bitcoin NG 中他們就須要等待數個關鍵區塊的確認,忍受較長的交易延遲。
(本來在分享過程當中張韌提到 Byzcoin 也有相似的問題。可是通過進一步分析發現問題並不相似,若對 Byzcoin 感興趣能夠點擊「閱讀原文」在論壇進一步討論 )。
全部採用這些替代性共識協議的項目都聲稱它們有很高的吞吐量,那麼這些項目的吞吐量究竟如何呢?(下面這一段建議觀看視頻,約在 15:30 部分,現場很是精彩 )
Solana 聲稱可以每秒可以處理 710000 筆交易。若是你可以有這麼大的突破,理應得到圖靈獎。我火燒眉毛地想聽到他們獲獎的消息。
還有這個名爲 NKN 的協議,他們聲稱他們可以在全網擁有 10000 個節點的同時每秒處理 100 萬筆交易,目前我還不知道他們是如何作到的,可是我對他們實現的方式很是好奇。
我也很好奇爲何 Stellar 和 Ripple 也將本身的協議歸類爲 NC,我也很是好奇 10000 個節點如何實現每秒處理 100 萬筆交易的。
而若是你想作個夢的話,你最好作一個偉大的夢,好比這個協議。它聲稱可以在低於 1 秒的最終確認時間內擁有 1000000000000TPS 。
嗯,我真的以爲地球對他們而言已經不夠大了,他們真的須要另找一個更大的星球來部署他們的協議。
咱們要注意的是,自稱的 TPS 是沒有可比性的。由於它們是在不一樣的網絡環境中作模擬,某些模擬甚至使用 1Gbit/s 的帶寬,顯然這和現實網絡狀況相差甚遠。
而且這些協議都忽略了真實的狀況。他們之中沒有一個考慮到交易的同步。對它們來講彷佛全部的交易都是已經在區塊中同步好的同樣,共識協議只是用來對交易進行排序的。並且一些模擬假設委員會成員(節點)之間有直接的鏈接,但事實是,在公有鏈網絡中全部的消息都是經過廣播進行的,而廣播消息會佔用公共節點的帶寬。
知識點:Fresh Transaction,爲何說要考慮交易的同步呢?要認識到,在比特幣中一個用戶從錢包客戶端發起的交易並非被全部礦工都接受到,而是相鄰的幾個礦工。這些礦工在接受到用戶發起的交易的時候會對交易進行驗證才能放到交易池中,以便在將來將這些交易打包出塊。所以若一個礦工成功挖到一個塊並廣播 Compact Block,其餘礦工在檢查 Compact Block 中交易 ID 的時候若發現對應的有些交易並不在本身的交易池中,則須要向發送方請求完整交易進行驗證來保障區塊中全部交易都是合法的,這些交易就是「Fresh Transaction」。若不進行驗證就在收到區塊以後挖礦,一旦完整區塊廣播後被發現有非法交易,將不會被礦工承認,在這個非法區塊以後挖出的區塊都會做廢。Fresh Transaction 的概念咱們會在後面用到。
比較吞吐量的簡易模型
這裏咱們有一個評估 TPS 的模型。如圖所示,首先咱們相信全部公共節點的帶寬是有一個上限的,最多可以使用 100% 的帶寬,你不能使用超過 100% 的帶寬。在這裏帶寬的佔用有三個組成部分。
如上圖所示,第一部分是用於同步最終確認的交易所佔用的帶寬比例,這一部分是真正的 TPS(This is the real TPS)。交易首先要被同步,以後才能進行交易確認。第二部分是被共識協議「浪費」的帶寬所佔的比例。第三部分是未被利用的帶寬。
因此若是想要提升 TPS,可以作的只有兩件事。
一、下降共識協議佔用的帶寬比例
二、下降未被利用部分的帶寬比例
能作的只有這兩件事情,對,沒有其餘的方式了,而且對於 Layer 1 的協議帶寬佔用不能超過 100%。
那咱們先來看看其餘替代性共識協議的帶寬佔用。
事實上,不少協議將它們珍貴的帶寬資源浪費在委員會成員之間的通訊上。
Algorand 存儲區塊證書以此來向新用戶證實一個區塊被提交。每一個區塊證書的大小是 300KB ,獨立於區塊容量限制以外。若是你按照一個區塊 1MB 的大小來計算,那麼這意味着大約 25% 的帶寬會永遠被用於同步這些證書。所以我很是好奇爲何它們聲稱他們的吞吐量比 NC 更好,這根本不合理。
另一種在共識協議中浪費帶寬的方式是區塊型 DAG 和孤塊中的冗餘交易。如上圖的論文中所說,若是全部的節點在區塊中選擇包含一樣的一組子交易,任何兩個平行建立的區塊將可能出現衝突,而且吞吐量就不會很高。
而目前全部的區塊型 DAG 協議對這種狀況視若罔聞。
從上面的分析中看到,顯然目前的吞吐量不能知足咱們,所以,Nervos CKB 的共識協議 NC-Max 對 NC 作了一些改進:
NC-Max 有三個主要的創新
採用兩步交易確認來下降孤塊率
動態調整區塊間隔和區塊獎勵來更好的提高帶寬利用率
在難度調整的時候考慮週期中的全部區塊,來抵禦自私挖礦攻擊。
接下來我會進行詳細解釋。
NC 有一個自然的吞吐量限制,由於想要提升 NC 中的吞吐量,只能作兩件事情:
第一件是更大的區塊,就如 Bitcoin Unlimited 和 Bitcoin Cash 那樣,還有不少其餘的項目也這樣作;
第二件是下降出塊間隔。
可是因爲區塊廣播須要時間,廣播期間若其餘節點發現區塊並廣播,會和正在廣播的區塊產生競爭,其中之一會成爲孤塊。更大的區塊會須要更長時間廣播,下降出塊間隔其實是下降出塊難度,節點更容易發現區塊。這兩種方案容易帶來的結果是孤塊率變高了。這些孤塊佔用更多的帶寬,可是它們並不爲交易確認作出貢獻。當孤塊率提升時,系統的安全性會下降而且吞吐量也會下降。所以對於這兩種方案最終會達到一個平衡,當區塊大小或出塊間隔調節到必定程度時,孤塊率會高到必定程度,即便你進一步增長區塊大小或者下降出塊間隔,吞吐量也不會獲得提升。
爲何太多的孤塊會對網絡的安全和性能產生負面影響呢?在上圖中咱們可以看到,當孤塊率很是高時,攻擊者可以很是輕易地私自構建一條更長鏈。攻擊者只須要擁有比全網算力的 51% 低不少的算力,就可以覆蓋掉區塊鏈。而且孤塊會消耗公共節點大量的帶寬,這會對整個系統的吞吐量形成很大的負面影響。
那咱們如何打破 NC 吞吐量的限制呢?通過上面分析,若是咱們想要打破這個限制,就必須下降孤塊率。若是孤塊率降低,那麼網絡的安全性和吞吐量都可以提升。
如何下降孤塊率呢?孤塊的出現是因爲區塊廣播的延遲,若在一個區塊廣播的過程當中,有另外一個區塊被發現,那麼其中一個區塊就註定會成爲孤塊。若是區塊廣播可以瞬間完成,天然不會有孤塊出現。那咱們如何確保區塊可以足夠快速地被廣播出去呢?
比特幣的開發者已經投入了很是多的資源和精力來加快區塊的廣播速度,咱們須要進一步找出哪些區塊的廣播速度較慢,或是出了問題。
咱們來詳細看看這是如何發生的,請看下圖。
目前的比特幣網絡,若是一切順利的話,一個區塊是經過一個Compact Block 中繼協議來廣播的。
在 Compact Block 中,並不會將整個交易(比特幣每一個交易大約 250Bytes)廣播出去,而是廣播 Compact Block 中的交易 ID。這些交易 ID 組成了 Compact Block,這些 Compact Block 比實際的區塊小不少,所以速度會快不少。
當節點 A 廣播 Compact Block 給節點 B 的時候,節點 B 檢查這些交易 ID ,若是對於節點 B 這些交易都不是 Fresh Transaction(也就是節點 B 的交易池中包含這些交易),節點 B 可以馬上轉發這些 Compact Block 給相鄰節點,這種狀況很是棒,過程很順利。
然而若是在 Compact Block 中有 Fresh Transaction,節點 B 將首先須要從節點 A 那邊同步 Fresh Transaction,而後驗證這些交易的簽名,這些步驟都很耗費時間。只有當整個區塊都通過驗證無誤以後,節點 B 才能繼續廣播這個區塊。這個過程避免收到的區塊非法,這樣礦工纔會在這個區塊以後挖礦並廣播,若不通過驗證萬一以後發現是非法區塊,那麼在這個非法區塊以後的區塊都是無效的。同步 Fresh Transaction 的過程是比特幣區塊廣播延遲的主要緣由。
因此,以太坊是一個糟糕的嘗試,我來分析一下他們是怎麼作的。以太坊簡單地縮短了出塊間隔,可是以太坊有一個問題,就是它不可以在收到區塊以前驗證交易的有效性。由於在以太坊中一個交易的有效性依賴於區塊中交易的順序,所以若是你想要驗證一個交易的有效性你必須等到整個區塊都被接收到才行,這樣的話每個區塊實際上都是 Fresh Transaction。
而且以太坊的網絡協議維護得很是差,自從 2015 年開始就沒有任何的迭代。
並且在交易廣播過程當中也有大量的冗餘。以太坊客戶端會將同一筆交易向不一樣的節點廣播 7 次,這意味着每個節點將會收到同一筆交易 7 次。(以太坊有不一樣的客戶端,如 Parity Ethereum,Geth 等)並且不一樣類型的客戶端之間有不一致性,兩個主要的以太坊客戶端之間基本都是獨立的。
所以可以連接兩個不一樣的網絡的節點很是少,這也是爲何以太坊孤塊率有時會高達 30%,而且交易吞吐量很是低。
並且大礦工沒有加快區塊廣播速度的激勵。由於若是個人區塊可以更慢地廣播出去,意味着我實際上可以實現「自私挖礦」(這裏大礦工並不扣留區塊,只是區塊廣播比較慢,在這個過程當中出現了其餘的競爭塊,而由於我是大礦工有較大的機率在和其餘競爭塊競爭過程當中勝出)。這對我來說是好事,爲何我要加速區塊廣播呢?
以太坊中的叔塊獎勵也沒有提供任何幫助,畢竟若是產生了的孤塊,礦工仍是可以得到獎勵。所以小礦工會採用先廣播區塊頭和空塊的方式,由於廣播區塊頭的速度會快不少。而且因爲不知道下一個區塊中會包含哪些交易,所以礦工一般會挖一個空塊來確保區塊中不會包含和以前區塊交易產生衝突的交易。這很是糟糕,由於空塊並不爲交易確認作出貢獻。
下面是咱們的設計,來緩解上面提到的一些問題。
這張圖是區塊的結構,咱們在比特幣區塊結構的基礎上增長了幾個字段。
上圖是咱們的完整區塊的區塊結構。首先咱們有一個交易提案區(青色區域)。只有交易提案區可包含 Fresh Transaction,而傳統的交易確認區(橙色區域)只能包含前幾個區塊的交易提案區的交易,若當前區塊高度是 h 的話,那麼就是 h-m 到 h-n 區塊的交易提案區內的交易。只有這些交易可以被確認,Fresh Transaction 不能被交易確認區確認。交易提案區不包含完整的交易,只包含交易 ID(Truncated Transaction ID),所以交易提案區會很是小。
在叔塊頭區能夠包含任意數量的叔塊(紫色區域),叔塊應該包含它們的區塊頭和交易提案區。叔塊頭區不計入區塊大小,於是不受區塊大小的限制,因此不會限制礦工添加叔塊。
下面我進一步來解釋交易提案區。這個區域很是小,由於它只包含交易 ID。完整的交易與區塊同步廣播,由於這是一個並行的過程,因此交易的廣播不會影響到區塊的廣播。而且節點在收到廣播的交易後只須要驗證哈希,不會影響區塊的驗證過程。
儘管這意味着在交易提案區可能會有無效的交易,雙花交易以及礦工可能不肯意接受的交易,可是這都沒有關係。
類比以前提到的比特幣區塊廣播過程,在咱們的協議中,發現區塊的節點會先廣播 Compact Block(也就是區塊頭和交易的 ID),Compact Block 較比特幣的稍微大一點,包含交易提案區和若干叔塊的區塊頭和叔塊的交易提案區。但因爲 Compact Block 自己足夠小一般會馬上廣播給相鄰的節點。
新提出的交易,若是有一部分不在節點的交易池中,它們會在發出 Compact Block 以後進行廣播。這些都是並行過程,不會相互影響。節點收到交易,通過哈希驗證後廣播給相鄰的節點。
這很天然地會有幾個問題:
若是礦工拒絕提供提案交易的完整版本怎麼辦?
我把這個交易放到個人交易提案區,可是當你問我要完整的交易的時候,我裝做不知道。
實際上這個對區塊廣播不會有影響,由於不論交易提案區是否有 Fresh Transaction,區塊都可以廣播。
而且其餘礦工也會繼續挖礦,由於老是有足夠的提案交易須要確認。該礦工也沒有必要挖空塊,由於以前區塊的交易提案區包含了它將打包的這些交易 ID,已經被發現的區塊在 Compact Block 中都廣播了打包進的交易確認區的交易 ID,礦工都知道哪些交易被打包了哪些沒有,不會選擇和被發現區塊交易確認區內相沖突的交易,所以礦工會選擇繼續打包交易出塊並得到手續費,爲交易確認作貢獻。
那麼若是礦工在他們最新的區塊中包含了這些提出但未廣播的交易,以得到一個相似自私挖礦的優點怎麼辦?
在比特幣的 NC 中,礦工減慢區塊廣播速度能夠得到挖礦優點。礦工一般可以在挖出一個區塊時,只廣播區塊頭,而在廣播完整區塊的時候放慢動做。在這個過程當中只有該礦工可以挖礦(由於只有他知道下一個區塊的信息,可以基於這個新塊挖礦,這個過程相似扣留區塊)。
可是在咱們的協議中,採用這種方式只會減慢 n 個區塊以後的區塊廣播速度。由於提出但未廣播的交易只有自私礦工知道,也只有自私礦工能以此做爲優點。然而這個不能被用在下一個區塊中,由於在咱們的協議中只能挖 n 個區塊以前提案區中包含交易,中間須要有一個間隔。
礦工只可以挖 h-m 至 h-n 個區塊內的提案交易,可是不能挖前一個區塊的提案交易,除非這個區塊也是被攻擊者挖到的。
如圖所示,這是咱們的共識協議和比特幣 NC 的對比。在比特幣 NC 中當自私的礦工找到區塊 h, 它可以馬上開始挖區塊 h+1,此時誠實礦工只可以在收到完整的區塊 h 以後才能開始挖礦,由於其餘礦工須要知道區塊包含的完整的交易並驗證來肯定區塊是合法的,而自私礦工可以經過減慢區塊 h 傳輸的速度來讓其餘礦工更晚收到區塊。在區塊廣播期間就是自私挖礦者的優點期。
然而在咱們的協議中當一個自私礦工找到一個區塊 h,廣播了包含區塊頭和交易 ID 的 Compact Block,誠實礦工可以馬上開始挖 h+1。若是自私礦工想要利用這些提出但未廣播的交易,它必須找到 n 個區塊以後的區塊(這些區塊才能包含這些提出但未廣播的交易),這樣他們才能利用這個優點。然而這很難發生,你不能肯定在 n 個塊以後的那個塊是你挖出來的,這個很是難預測。
爲了更好地利用帶寬,咱們的協議使用了另外一種不一樣的難度調整機制,設定一個固定的孤塊率(根據上一個難度調節期的叔塊數來計算)。
若是孤塊率在上一個難度調整週期低於設定的孤塊率,挖礦難度會下降,出塊間隔將下降,吞吐量會提升。也就是說,更少的孤塊意味着當前的網絡狀態實際上有能力更快地同步交易,咱們可以在提升吞吐量的同時不損害網絡的去中心化。
反過來看若是難度提升,那麼出塊間隔會增長,吞吐量也會下降。若是孤塊率很高那麼意味着當前的網絡在這個難度調整週期內並不能處理那麼多的交易,那麼協議就會下降吞吐量。
同時出塊獎勵會和 1/(預期出塊間隔)成正比,所以在每一個難度調整週期中預期的總出塊獎勵是固定的。
這意味着假設咱們每十分鐘出一個塊,每一個塊中有 12.5 個比特幣,若是難度調節變成每 5 分鐘出一個塊的時候,每一個塊會有 6.125 個比特幣。所以貨幣的發行率也是保持恆定的。
最後,抵抗自私挖礦攻擊。前面咱們提到咱們的協議和 NC 的一個區別在於,咱們的難度調整機制是根據難度調整區間中出現的全部區塊來計算的,在估計總算力的時候也會包含叔塊。
在 NC-Max 中,假設攻擊者佔總算力的 30%,誠實礦工 70%,若是沒有自私挖礦攻擊,在 10 個區塊中攻擊者可以找到 3 個區塊,誠實礦工找到 7 個。若是進行自私挖礦,攻擊者在 7 個區塊中可以找到 3 個區塊,誠實礦工找到 4 個,3 個誠實區塊會成爲孤塊,主鏈會增加緩慢。
前面也提到自私挖礦在第一個難度調整週期內是沒有收益的,那麼在第二個難度調整週期會出現什麼?
在下一個難度調整週期,難度會保持不變(由於難度會根據全部區塊計算,包含孤塊),攻擊者並不能用一樣的算力找到更多的區塊,所以自私挖礦再也不有利可圖。
也就是說,咱們假設幣價在短期內維持穩定,因爲自私挖礦攻擊者是短視的,他們的獎勵是根據單位時間內得到的獎勵來定義,能夠等價於一樣的電力消耗可以得到的獎勵。在比特幣中,自私挖礦攻擊者可以經過下降鏈增加速度,「迫使」協議下降出塊難度,從而在難度調整以後單位時間內可以得到更多的獎勵。而在 NC-Max 協議設計中,出塊難度會根據全部區塊來計算,包括孤塊,攻擊者讓誠實礦工的區塊成爲孤塊,卻並不能「迫使」協議下降出塊難度,以在單位時間內得到更高獎勵。
最後總結一下,咱們的協議會很好地利用孤塊:
咱們但願可以經過兩步交易驗證來下降孤塊數量,在孤塊數量下降以後,咱們利用孤塊率做爲一個帶寬利用水平的指標來動態地調節吞吐量。
而且孤塊信息被寫在了區塊鏈中,咱們在挖礦難度調整算法中利用這個信息從而讓自私挖礦無利可圖。
NC-Max 是 Nervos CKB 的 PoW 共識協議。NC 是 Nakamoto Consensus 的簡稱,也就是比特幣的共識協議。若是讀完這篇文章,你以爲這個共識協議應該有一個更好的名字,歡迎告訴咱們,或許咱們可以採納:)
推薦閱讀:張韌博士的共識安全性分析文章《制定通用的標準:評估 PoW 共識協議的安全性》