Nervos CKB 共識協議白皮書


Nervos CKB 共識協議白皮書


​作者 | Ren Zhang

來源 | Nervos 中文社區

Nervos CKB 共識協議白皮書

摘要

BTC的中本聰共識(Nakamoto Consensus,簡稱 NC) 因其簡單性和低通信開銷的特點而廣受好評。然而,NC 有兩大缺陷:第一,其交易吞吐量遠遠無法滿足現實需求;第二,NC 容易遭受自私挖礦攻擊,在這一類攻擊中,攻擊者能夠採用非協議規定的行為獲得更多的出塊獎勵。

Nervos CKB 的共識協議是 NC 的變體,在保留 NC 優點的同時,提升了其性能極限和抵抗自私挖礦攻擊的能力。通過研究發現消除 NC 區塊廣播延時的瓶頸,我們的協議能夠在不犧牲安全性的情況下,支持非常短的出塊間隔。縮短的出塊間隔不僅提高了吞吐量,也降低了交易確認時長。通過在難度調節時考慮所有有效區塊,在我們的協議中自私挖礦將不再有利可圖。


Nervos CKB 共識協議白皮書


動機

儘管目前市面上已經提出了許多非 NC 共識機制,但 NC 和這些替代方案相比,有以下三重優勢:

  • 首先,它的安全性已經經過仔細地審查並被廣泛理解,但其它的替代協議常常引入了新的攻擊維度,或無意或依賴於實踐中難以達到的安全性前提。
  • 第二,NC 最大程度地降低了共識協議的通信開銷。最理想的情況下,在BTC網絡中廣播 1MB 的區塊和廣播一個大約 13KB 的緻密區塊信息是等價的;有效區塊會立刻被所有誠實節點接受。相比之下,其它替代性協議通常需要不可忽視的通信開銷來確認一個節點見證了一個區塊。舉例來說,Algorand 要求每一個區塊要附帶一個 300KB 的區塊認證。
  • 第三,NC 基於鏈的拓撲結構確保了其在區塊生成的時候,就能確認全局交易排序,這和所有智能合約編程模型兼容。採用其它拓撲結構的協議要麼放棄了全局交易排序,要麼在很長的確認延遲之後才對交易進行排序,這樣會限制它們的效率或者性能。

儘管 NC 有很多優點,但其可擴展性的問題使得它每秒僅能處理少數交易。採用 NC 協議的網絡,其吞吐量會受到兩個參數的共同限制:

  • 最大區塊容量,
  • 預期出塊間隔。

舉例來說,BTC的區塊大小上限約為 4MB,通過難度調節機制,其目標出塊間隔被設定為大約 10 分鐘,換算過來吞吐量(TPS)大約為每秒 10 筆交易。提高區塊容量或縮短出塊間隔分別會導致更長的區塊廣播延時或生成更多的區塊。這兩種方法都會提升在其它區塊廣播過程中,區塊生成的概率,從而會增大競爭塊出現的概率。由於在諸多競爭塊之間,最多隻有一個區塊能夠為交易確認作出貢獻,因此浪費了廣播其它孤塊的節點帶寬,從而限制了系統的有效吞吐量。此外,孤塊率的提高會降低雙花攻擊的難度,這會導致系統的安全性降低。

另外,NC 的安全性也會遭到自私挖礦攻擊的破壞,自私挖礦攻擊者可以通過故意地孤立其它礦工的區塊,來獲得不合理的區塊獎勵。研究人員發現,這種不公平盈利機會的根源在於 NC 的難度調整機制,它在估算網絡計算能力時忽略了孤塊。通過這種機制設計,自私挖礦攻擊會提升孤塊率,從而導致挖礦難度降低,這會讓攻擊者在單位時間內獲得高於平均值的區塊獎勵。

在這個 RFC 中,我們提出了 CKB 的共識協議,它能夠提升 NC 的性能限制和抗自私挖礦能力,同時保留 NC 所有的優點。我們的協議通過降低區塊廣播延時來支持非常短的出塊間隔。更短的出塊間隔不僅可以增加吞吐量,還能夠在不犧牲安全性的前提下,降低交易確認延遲(因為孤塊率保持在較低的水平)。由於在估計全網算力時,我們會將所有區塊(包括叔塊)納入到難度調節中,因此新的難度和孤塊率是不相關的,這讓自私挖礦不再有利可圖。


Nervos CKB 共識協議白皮書


技術概要

我們的共識協議在 NC 的基礎上做了三個改進。

  • 消除區塊廣播瓶頸


BTC協議開發者研究發現,當出塊間隔降低的時候,區塊傳播延時的瓶頸是新交易的傳播。新交易是指在最新的區塊中包含的、尚未被傳播到網絡中的交易。沒有收到過這些交易的節點必須要在向相鄰節點廣播收到的這個區塊之前,請求這些新交易。由此產生的延遲不僅限制了區塊鏈的性能,而且還會在實際自私挖礦攻擊中被利用。在這類攻擊中,攻擊者會故意將新的交易併入在他們自己的區塊中,這會為他們帶來更長的廣播延時,因此,他們能夠在尋找下一個區塊的競爭中取得一定優勢,從而獲得更多獎勵。

從這個研究結果出發,我們的共識協議通過將 NC 的交易確認分解為兩個步驟來消除區塊傳播瓶頸:

  • 交易提交(Propose);
  • 交易確認(Commit)。

如果一個交易的短哈希(稱為 txpid)出現在一個區塊或其中一個叔塊(被區塊引用的孤塊)的「交易提交區」(Proposal Zone),則該交易被提交。新提交的交易既不會影響區塊有效性,也不會影響區塊的廣播,因為一個節點在收到這些交易之前,就可以開始向相鄰節點傳播包含這些被提出的交易區塊。在交易被提交之後需要經過數個區塊的時間窗口,如果這個交易出現在區塊的「交易確認區」(Commitment Zone)中,則該交易被打包。這樣的兩步交易確認機制消除了區塊傳播瓶頸,因為一個新塊的確認交易在被提出時就已經被所有節點接收和驗證。通過限制攻擊時間窗口,新的機制也有效地減少了實際自私挖礦攻擊。

  • 利用縮短的延遲來提高吞吐量


我們的協議將區塊鏈中所有引用孤塊的區塊稱為叔塊。這讓我們能夠很好地估算當前區塊傳播的延時,並動態地調節期望的出塊間隔,從而在延時得到改善時,提升吞吐量。因此,我們設定固定的孤塊率作為難度調節目標,它讓我們在不犧牲安全性的情況下,能夠利用更短的延遲。協議中硬編碼了出塊間隔的上下限來防止 DoS 攻擊,和避免節點超載。此外,在每個難度調節週期(Epoch)中,區塊獎勵會根據預期出塊間隔,成比例地進行調節,因此預期的平均時間獎勵和出塊間隔並不相關。

  • 減少自私挖礦攻擊


根據 Vitalik,Grunspan 和 Perez-Marco 的建議,我們的協議在估計網絡算力時,會將所有區塊(包括叔塊)納入到難度調節中,因此新的難度和孤塊率是不相關的。

此外,我們證明了在我們的協議中,自私挖礦不再有利可圖。這個證明是非常有意義的,因為在 Vitalik,Grunspan 和 Perez-Marco 的非正式論證中,並沒有排除攻擊者在新的協議機制下,仍然獲得不公平獎勵的可能性,而我們的協議證明了這一點。

舉例來說,攻擊者可能會在第一個難度調節週期中暫時關閉一些礦機,這樣就會導致修改後的難度調節算法會低估全網算力,在第二個難度調節週期時,這些攻擊者便開始自私挖礦,以在整體上獲得更高的平均時間收益。我們證明了在我們的協議中,不論攻擊者在誠實挖礦、自私挖礦、關閉礦機這三種策略中如何分配算力,不論他的策略覆蓋多少個難度調節週期,自私挖礦都是無利可圖的。證明的細節我們會在接下來的部分公佈。


Nervos CKB 共識協議白皮書


規範


兩步交易確認

在我們的協議中,我們採用了兩步交易確認機制來消除上述的區塊廣播瓶頸(無論出塊間隔多短)。我們首先來定義一下這兩個步驟和區塊結構,之後會介紹新的區塊傳播協議。

定義

定義 1:一筆交易的提交 id txpid 被定義為這筆交易哈希 txid 的前 / 位比特。

txpid 用於標識幾個相鄰區塊之間的交易,所以在我們的協議中,txpid 不需要和 txid 那樣具有全局唯一性。另外,由於我們在區塊和緻密區塊中都嵌入了 txpid,因此只發送縮短的 txid 可以減少帶寬消耗。


當出現多筆交易使用相同的 txpid 時,那麼所有的這些交易都會被認為是已經提交的。實際上,我們可以將 l 設置得足夠大,這樣查找碰撞所需的計算量會是較為合理的。

定義 2:當滿足所有下述條件時,區塊 B1 就被認為是另一個區塊 B2 的叔塊:

(1)在同一個難度調節週期中,B1 和 B2有相同的出塊難度;

(2)B2 的區塊高度大於 B1 的區塊高度;

(3)B2 是在鏈上第一個引用 B1 的區塊。

我們對叔塊的定義不同於以太坊,我們不考慮兩個區塊距離它們第一個共同的起始區塊有多遠,只要兩個區塊在同一個難度調節週期即可。

定義 3:如果一筆交易的 txpid 被包含在區塊高度為 hp 的主鏈區塊(或者該區塊的叔塊)的提交區中,則這筆交易在高度 hp 被提交。

這裡有可能會出現這樣的情況,一筆提案的交易可能是以前提出的,這與其它交易衝突,甚至出現異常。由於交易提交區只是用來促成交易同步,因此這些情況不會影響區塊的有效性。

定義 4:當滿足所有下述條件時,則一筆非幣基交易在區塊高度 hc 上被確認:

(1)該交易在同一條鏈上的區塊高度 hp 上被提交,並且 wclose ≤ hc−hp ≤ wfar;

(2)該交易位於區塊高度為 hc 的主鏈區塊交易確認區;

(3)該交易沒有和主鏈上任何之前確認的交易衝突。如果是幣基交易,那麼滿足條件(2)就會在區塊高度 hc 被確認。


wclose 和 wfar 分別定義了交易提交和確認的最近及最遠的鏈上距離。我們要求 wclose 足夠大,這樣才能使得 wclose 的區塊間隔足夠長,以便將交易廣播到整個網絡。

這兩個參數還會根據節點內存中交易提案池能夠保存的最大交易數量來設定。由於提交交易的總量有限,所以可以將它們保存在內存中,因此在大多數情況下不需要從硬盤中抓取最新提交的交易。

只有在交易確認之後,一筆交易才算被記錄在區塊鏈中。因此,在要求 σ 個區塊確認的情況下,一個接收者在區塊廣播之後需要等待至少 wclose + σ 個區塊,才能確保交易有效。

在實踐中,由於我們的協議有更短的出塊間隔,wclose 時間間隔帶來的額外延遲被抵消,因此實用性並不會受到影響。


Nervos CKB 共識協議白皮書


區塊和緻密區塊結構


在我們的協議中,區塊包含如下幾個字段:

Nervos CKB 共識協議白皮書

與 NC 類似,在我們的協議中,緻密區塊會使用交易的 shortid 替代區塊的確認區,裡面是預先提交的交易列表和 Salt。緻密區塊的其它所有字段保持不變。


其它區塊結構規則:

  • 前四個字段的總大小不能大於硬編碼的區塊大小限制。設定區塊大小限制的主要目的是避免公共節點帶寬過載。由於叔塊的提交區通常在出塊時就已經被同步,所以它們不會被計入在區塊容量限制內。
  • 提交區中 txpid 的數量也會有硬編碼的上限。

兩個啟發式的要求能夠幫助實踐者選擇參數。首先,在交易提交區 txpid 的上限不會小於一個區塊中確認交易的最大數量,因此即使 wclose=wfar,這個限制也不會成為協議吞吐量的瓶頸。其次,理想情況下,緻密區塊的大小不會超過 80KB。Croman 等人 在 2016 年的研究表明,不大於 80KB 的消息在BTC網絡中的廣播延遲較為相似;更大信息的廣播速度會因為網絡吞吐量這個瓶頸而變慢。當然,這個數字會隨著網絡條件的提升而改變。


Nervos CKB 共識協議白皮書


區塊廣播協議

根據一些研究表明,節點應該廣播所有帶有有效工作量證明的區塊,包括孤塊,它們可能是被主鏈引用的叔塊。由於構建有效的工作量證明會消耗大量時間,因此這些證明不會用於敗壞網絡。

我們協議的區塊傳播協議在大多數情況下能夠消除新交易的額外一輪廣播。當它不可避免時,我們的協議會確保新交易在往返廣播中僅持續一次反射。這是通過以下三個規則實現的:

1、如果一些已經確認的交易對發送的節點來說是未知的,他們將會被放在預先填寫的交易列表和緻密區塊中一同發送。這隻會在實際自私挖礦攻擊中發生,在其它情況下交易會在提交的時候就被同步。如果接收方和發送方共享同一份提交列表,但是沒有廣播的交易列表,這項改進就能夠移除額外的一輪通信。

2、如果某項確認的交易仍然是缺失的,那麼接收者就會向發送者請求交易,並且發送者必須在很短的時間內返回交易。觸發此機制不僅要求一次成功的實際自私挖礦攻擊,還需要對交易廣播進行攻擊,以使節點之間產生不一致的提案交易池。若未能及時發送這些交易,會導致接收方斷開鏈接並將發送方列入到黑名單。帶有不完整確認區的區塊將不會被進一步廣播。

3、一旦確認區是完整並且有效的,節點就能夠在接收所有新提交的交易之前,開始傳播緻密區塊。在我們的協議中,一個節點需要從上游節點請求新提交的交易,同時將緻密區塊發送給其它節點。由於提交區的交易不會影響區塊的有效性,這項改進不會降低安全性。

前兩條規則保證了因實際自私挖礦攻擊造成的額外通信持續時間,不會超過一次反射。


Nervos CKB 共識協議白皮書


動態難度調節機制

我們改寫了中本聰共識的難度調節機制,因此:

(1)自私挖礦不再有利可圖;

(2)吞吐量會根據網絡帶寬和延遲動態地進行調整。

為了實現(1),我們的協議在每個難度調節週期估計全網哈希率的時候,考慮了所有區塊,以確定下一個難度調節週期每個獎勵單元所需的計算工作量,而不僅僅是主鏈的區塊。

為了實現(2),我們的協議根據最新難度調節週期的孤塊率來計算下一個難度調節週期中主鏈區塊的數量。最後,結合這些結果來計算區塊獎勵和調節目標。

我們還引入了其它約束,來最大化協議的可兼容性:

1、所有的難度調節週期都有相同的預期長度 Lideal,並且在難度調節週期 R(i) 中發放的最大區塊獎勵僅取決於每個難度調節週期數 i,因此動態出塊間隔並不會讓獎勵發放機制複雜化。

2、我們會給主鏈區塊數量和哈希率的預估設定多個上下限,因此我們的協議不會影響網絡的去中心化以及抗攻擊能力。


Nervos CKB 共識協議白皮書


註釋

和中本聰共識類似,我們協議的難度調節算法在每個難度調節週期末執行。該算法需要四個入參:

Nervos CKB 共識協議白皮書

在這些入參中,Ti 和 Ci,m 由上一個難度調節決定;Li 和 Ci,o 在每個難度調節週期結束後取數。孤塊率 oi 由 Ci,o/ Ci,m 得到。為了簡化方程,我們不會將Ci,o 包含在分母中。由於在難度調節週期末期,一些孤塊可能會被攻擊從而不被包含在主鏈中,因此 oi 是實際數據的下限。然而,只要一個難度調節週期足夠長,被故意排除在外的孤塊佔比幾乎可以忽略不計,因為孤立一條鏈的難度會隨著鏈長度的增長呈指數級增長。

該算法會輸出三個值:

Nervos CKB 共識協議白皮書

如果網絡的哈希率和區塊廣播延時保持不變,oi 應該達到理想值 oideal,除非 Ci+1,m 等於其上限Cmmax 或它的下限 Cmmin。難度調節週期 i+1 在達到 Ci+1,m 個主鏈區塊時結束,無論其中包含了多少個叔塊。


Nervos CKB 共識協議白皮書


計算調整後的哈希率估值

調整後哈希率估值,表示為 HPSi,是通過將阻尼因子 τ 作用於上一難度調節週期的實際哈希率

Nervos CKB 共識協議白皮書

來計算的。實際哈希率的計算如下:

Nervos CKB 共識協議白皮書


在這裡:

  • HSpace 是所有哈希空間的大小,如在BTC中就是 2²⁵⁶
  • HSpace / Ti 是找到一個有效區塊預期所需要的哈希運算數量
  • Ci,m+Ci,o 是難度調節週期i中所有的區塊數量
Nervos CKB 共識協議白皮書

是通過預期總哈希運算量除以持續時長 Li 來計算的。


現在我們引入過濾器(Dampening Filter)

Nervos CKB 共識協議白皮書

在這裡, HPSi - 1 表示通過上一次難度調整算法的迭代,所得出的調整後哈希率估值輸出。阻尼因子保證了在兩個連續的難度調節週期中,調整後的哈希率估值變動不會多於 τ 因子。這種調整相當於中本聰共識過濾器的應用。為調節速度設定邊界,可以防止了攻擊者隨意偏置難度並偽造區塊鏈,即使一些受害者的網絡被攻擊者暫時控制。


Nervos CKB 共識協議白皮書


區塊廣播建模

由於網絡的拓撲結構會隨著時間不斷變化,即使我們有可能為具體的區塊廣播過程建模,那也是非常困難的。幸運的是,對於我們的目標來說,用兩個參數來表達區塊廣播的影響是完全足夠的,這兩個參數會在後面被用來計算 Ci+1,m。

我們假設所有區塊都遵循類似的區塊傳播模型,在上一個難度調節週期中,一個區塊廣播到整個網絡需要花費 d 秒,這個過程中,在該區塊的父節點上的平均挖礦算力佔比為 p。因此,在這 d 秒期間,會有 HPSi×dp 的哈希運算花費在父節點上,而不會為增加區塊鏈作出貢獻,餘下 HPSi×d(1−p) 的哈希算力會花費在新區塊上。結果就是,在上一個難度調節週期,沒有作用於增長區塊率的總哈希數為 HPSi×dp×Ci,m。如果這裡有一部分哈希計算出了一個區塊,那麼其中會有一個競爭塊成為孤塊。被觀察到的孤塊哈希運算數量是 HSpace/Ti×Ci,o。如果我們忽略在同一個高度出現兩個以上競爭塊的小概率事件,可以得出:

Nervos CKB 共識協議白皮書

也就是

Nervos CKB 共識協議白皮書

如果我們將這個公式和公式(2) 聯立,可以得到 dp:


Nervos CKB 共識協議白皮書

在這裡 oi 是上一個難度調節週期的孤塊率。


Nervos CKB 共識協議白皮書


計算下一個難度調節週期的主鏈區塊數

如果下一個難度調節週期的區塊廣播過程和上一個一致,dp 的值就會保持不變。為了能夠得到理想的孤塊率 oideal 和理想的難度調節週期時長 Lideal,推導方式和等式(4)相同。我們應該有:

Nervos CKB 共識協議白皮書

在這裡

Nervos CKB 共識協議白皮書

是下一個難度調節週期中主鏈區塊數量,那麼我們的唯一目標就是獲取 oideal 和 Lideal 值。

通過將等式(4)和(5)聯立起來,我們能夠解出

Nervos CKB 共識協議白皮書

Nervos CKB 共識協議白皮書

現在我們可以設定

Nervos CKB 共識協議白皮書

的上下限,得到 Ci+1,m:


Nervos CKB 共識協議白皮書

設定下限能夠保證攻擊者無法通過故意挖出孤塊來任意提高出塊間隔;設定上限能夠保障我們的協議不會確認超過大多數節點能力的交易數量。


Nervos CKB 共識協議白皮書


確定目標難度值


首先,我們引入一個經過調整的孤塊率估值

Nervos CKB 共識協議白皮書

,它會被用於計算這個難度調節目標:

Nervos CKB 共識協議白皮書

Nervos CKB 共識協議白皮書

而不是 oideal,能夠避免當主鏈區塊數量達到上下限時,出到一些不可控的情況。現在我們能夠計算出 Ti+1:

Nervos CKB 共識協議白皮書

在這裡

Nervos CKB 共識協議白皮書

是總哈希,

Nervos CKB 共識協議白皮書

是區塊總數。

等式(7) 中的分母是找到一個區塊所需要的哈希數量。

注意,如果沒有觸發極端情況,比如

Nervos CKB 共識協議白皮書

Nervos CKB 共識協議白皮書

或者

Nervos CKB 共識協議白皮書

我們能夠聯立等式(2),(6)和(7)並且得到

Nervos CKB 共識協議白皮書

結果和我們的直覺一致。一方面,如果上一個難度調節週期的孤塊率 oi 大於理想值 oideal,那麼目標就會降低,這樣在哈希率不變的情況下會提高找到一個區塊的難度並且增加出塊間隔。因此,由於在一個區塊廣播過程中找到另一個區塊的概率降低了,那麼孤塊率就會降低。另一方面,如果上一個難度調節週期的孤塊率比理想值低,那麼目標難度就會增加,同時降低了出塊間隔,並且提高系統的吞吐量。


Nervos CKB 共識協議白皮書


計算每一個區塊的獎勵

現在我們可以計算每一個區塊的出塊獎勵了:


Nervos CKB 共識協議白皮書

上述兩個情況在極限情況可能非常不一樣。第一個情況保障了在難度調節週期i+1 發行的總獎勵不會超過 R(i+ 1)。


Nervos CKB 共識協議白皮書


Ren Zhang 作者

Roy 排版


內容僅供參考 不作為投資建議 風險自擔



分享到:


相關文章: