突破中本聰共識!公鏈 CKB 公佈 NC-Max 共識協議

本期祕猿科技區塊鏈小課堂將會就 PoW 共識的突破進行展開。帶寬實際上是區塊鏈吞吐量的最大限制,在美國舊金山舉辦的 Scaling Bitcoin Meetup 中,祕猿科技研究員張韌從「帶寬利用率」角度分析了諸多共識協議的效率和可行性。

理解本文需要以下知識儲備:
比特幣共識協議(也就是 Nakamoto Consensus)基本概念
以太坊共識協議基本概念
孤塊、叔塊、自私挖礦等概念

祕猿科技區塊鏈小課堂第 29 期


圖片描述

自我介紹一下,我是張韌,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 的設計思路。

圖片描述

爲什麼我們喜歡比特幣的 NC?

先來回答一個問題,爲什麼我們喜歡比特幣的 Nakamoto Consensus(NC)?

有很多的理由,首先 NC 的性能優化做的非常好,它能夠節約每一個傳輸的每一個字節,以及每個計算週期。舉例來說,它使用Compact Block來加快區塊的傳播,可能在未來使用 Minisketch (一個用於在分佈式系統不同節點之間同步信息時,降低帶寬需求的軟件庫)來節省交易廣播所需要的帶寬資源。同時比特幣的開發者提出了 Graftroot(關係到比特幣上開發智能合約以及隱私性的一項提案),你可以認爲它能夠通過壓縮比特幣上的智能合約從而獲得更好的隱私性和更好的性能。或許我們還能夠看到簽名聚合技術(Signature Aggregation)應用在比特幣之上。

知識點:Compact Block Relay,在比特幣改進協議(BIP)152 中提出,能夠減少 P2P 網絡節點廣播區塊所需的帶寬數量。Compact block 是完整區塊的「概要」,包含下面三部分信息:
1、新區塊的區塊頭
2、交易 ID
3、發送方節點預測的但是接收節點不具備的完整交易
接收方會嘗試根據收到的信息以及在其內存池中的交易來重新構建完整區塊。若仍然缺失某些交易,它將會請求廣播節點。

喜歡 NC 的另一個理由是它的通用性。UTXO 模型加上全局交易順序能夠支持各種分片技術和 Layer 2 方案,以及複雜的智能合約。

相比來看,以太坊的 Account 模型進行分片的難度更高;並且如果你沒有一個全局交易順序的話,比如像許多 DAG 類型協議那樣,那麼就很難支持複雜的智能合約,關於這一部分會在後面談 DAG 的時候詳細描述。

圖片描述

我們也喜歡比特幣 NC 的安全性。比特幣網絡經歷了很多的攻擊,還是穩定運行了十年。而且嚴格意義上來說,目前沒有任何一個已知的工作量證明共識機制在整體上超越 NC。如果你對這個話題感興趣,可以看這裏。

然而在 NC 中有兩個地方我們希望做出一些改變。首先在帶寬利用方面,比特幣的 NC 在採用隔離見證之後,人爲設定了最大爲每十分鐘 4Mb 的吞吐量,然而現實情況是,比特幣公共節點的帶寬水平在過去的幾年裏獲得了大幅度的提升。

對於 NC 我們有哪些地方需要做出改變?

圖片描述

如同上圖中這個研究所指出的,鏈接到網絡中的比特幣 IPv4 節點在 2016 年時帶寬中位數爲 33Mbit/s,在 2017 年 2 月,這個數字達到了 56Mbit/s。

我們很容易想到的改進方式就是,協議自身是否能夠動態地調節吞吐量來適應帶寬水平的變化?

圖片描述

Bitcoin Unlimited 做了一個糟糕的嘗試,它希望能夠動態地調節比特幣的吞吐量,但是它失敗了,引入了多種新的攻擊方式讓它的協議變得不安全。上面是在 Coindesk 上發佈的一篇關於 Bitcoin Unlimited 安全性研究(鏈接:https://www.coindesk.com/etf-...),我也是這項研究的參與者之一。

圖片描述

另一個我們希望在 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 感興趣可以點擊「閱讀原文」在論壇進一步討論 )。

圖片描述

聲稱的 TPS?

所有采用這些替代性共識協議的項目都聲稱它們有很高的吞吐量,那麼這些項目的吞吐量究竟如何呢?(下面這一段建議觀看視頻,約在 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,能夠做的只有兩件事。

1、降低共識協議佔用的帶寬比例
2、降低未被利用部分的帶寬比例

能做的只有這兩件事情,對,沒有其他的方式了,並且對於 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 協議設計中,出塊難度會根據所有區塊來計算,包括孤塊,攻擊者讓誠實礦工的區塊成爲孤塊,卻並不能「迫使」協議降低出塊難度,以在單位時間內獲得更高獎勵。

圖片描述

最後總結一下,我們的協議會很好地利用孤塊:

我們希望能夠通過兩步交易驗證來降低孤塊數量,在孤塊數量降低之後,我們利用孤塊率作爲一個帶寬利用水平的指標來動態地調節吞吐量。

並且孤塊信息被寫在了區塊鏈中,我們在挖礦難度調整算法中利用這個信息從而讓自私挖礦無利可圖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章