Nervos CKB 共識協議白皮書

買賣虛擬貨幣
作者簡介:Ren Zhang,Nervos 研究員,魯汶大學 COSIC 研究小組(目前所有智慧手機使用的領先加密標準 AES 的發源地)的博士生,導師為 Bart Preneel (比特幣公鑰轉化為比特幣地址的雜湊演算法 RIPEMD 160 的設計者)。2017 年,在完成《Bitcoin Unlimited 擴容方案中的設計漏洞》的研究後,Ren 被 Blockstream 邀請實習,與 Pieter Wullie 和 Gregory Maxwell 一起工作。今年 3 月,Ren 的論文《制定通用的標準:分析工作量證明共識機制的安全性》被電腦保安領域最高階別會議 IEEE S&P Oakland 收錄。摘要比特幣的中本聰共識(Nakamoto Consensus,簡稱 NC) 因其簡單性和低通訊開銷的特點而廣受好評。然而,NC 有兩大缺陷:第一,其交易吞吐量遠遠無法滿足現實需求;第二,NC 容易遭受自私挖礦攻擊,在這一類攻擊中,攻擊者能夠採用非協議規定的行為獲得更多的出塊獎勵。Nervos CKB 的共識協議是 NC 的變體,在保留 NC 優點的同時,提升了其效能極限和抵抗自私挖礦攻擊的能力。透過研究發現消除 NC 區塊廣播延時的瓶頸,我們的協議能夠在不犧牲安全性的情況下,支援非常短的出塊間隔。縮短的出塊間隔不僅提高了吞吐量,也降低了交易確認時長。透過在難度調節時考慮所有有效區塊,在我們的協議中自私挖礦將不再有利可圖。動機
儘管目前市面上已經提出了許多非 NC 共識機制,但 NC 和這些替代方案相比,有以下三重優勢:首先,它的安全性已經經過仔細地審查並被廣泛理解,但其它的替代協議常常引入了新的攻擊維度,或無意或依賴於實踐中難以達到的安全性前提。第二,NC 最大程度地降低了共識協議的通訊開銷。最理想的情況下,在比特幣網路中廣播 1MB 的區塊和廣播一個大約 13KB 的緻密區塊資訊是等價的;有效區塊會立刻被所有誠實節點接受。相比之下,其它替代性協議通常需要不可忽視的通訊開銷來確認一個節點見證了一個區塊。舉例來說,Algorand 要求每一個區塊要附帶一個 300KB 的區塊認證。第三,NC 基於鏈的拓撲結構確保了其在區塊生成的時候,就能確認全域性交易排序,這和所有智慧合約程式設計模型相容。採用其它拓撲結構的協議要麼放棄了全域性交易排序,要麼在很長的確認延遲之後才對交易進行排序,這樣會限制它們的效率或者效能。儘管 NC 有很多優點,但其可擴充套件性的問題使得它每秒僅能處理少數交易。採用 NC 協議的網路,其吞吐量會受到兩個引數的共同限制:1)最大區塊容量,2)預期出塊間隔。舉例來說,比特幣的區塊大小上限約為 4MB,透過難度調節機制,其目標出塊間隔被設定為大約 10 分鐘,換算過來吞吐量(TPS)大約為每秒 10 筆交易。提高區塊容量或縮短出塊間隔分別會導致更長的區塊廣播延時或生成更多的區塊。這兩種方法都會提升在其它區塊廣播過程中,區塊生成的概率,從而會增大競爭塊出現的概率。由於在諸多競爭塊之間,最多隻有一個區塊能夠為交易確認作出貢獻,因此浪費了廣播其它孤塊的節點頻寬,從而限制了系統的有效吞吐量。此外,孤塊率的提高會降低雙花攻擊的難度,這會導致系統的安全性降低。
另外,NC 的安全性也會遭到自私挖礦攻擊的破壞,自私挖礦攻擊者可以透過故意地孤立其它礦工的區塊,來獲得不合理的區塊獎勵。研究人員發現,這種不公平盈利機會的根源在於 NC 的難度調整機制,它在估算網路計算能力時忽略了孤塊。透過這種機制設計,自私挖礦攻擊會提升孤塊率,從而導致挖礦難度降低,這會讓攻擊者在單位時間內獲得高於平均值的區塊獎勵。在這個 RFC 中,我們提出了 CKB 的共識協議,它能夠提升 NC 的效能限制和抗自私挖礦能力,同時保留 NC 所有的優點。我們的協議透過降低區塊廣播延時來支援非常短的出塊間隔。更短的出塊間隔不僅可以增加吞吐量,還能夠在不犧牲安全性的前提下,降低交易確認延遲(因為孤塊率保持在較低的水平)。由於在估計全網算力時,我們會將所有區塊(包括叔塊)納入到難度調節中,因此新的難度和孤塊率是不相關的,這讓自私挖礦不再有利可圖。技術概要我們的共識協議在 NC 的基礎上做了三個改進。消除區塊廣播瓶頸比特幣協議開發者研究發現,當出塊間隔降低的時候,區塊傳播延時的瓶頸是新交易的傳播。新交易是指在最新的區塊中包含的、尚未被傳播到網路中的交易。沒有收到過這些交易的節點必須要在向相鄰節點廣播收到的這個區塊之前,請求這些新交易。由此產生的延遲不僅限制了區塊鏈的效能,而且還會在實際自私挖礦攻擊中被利用。在這類攻擊中,攻擊者會故意將新的交易併入在他們自己的區塊中,這會為他們帶來更長的廣播延時,因此,他們能夠在尋找下一個區塊的競爭中取得一定優勢,從而獲得更多獎勵。
從這個研究結果出發,我們的共識協議透過將 NC 的交易確認分解為兩個步驟來消除區塊傳播瓶頸:1)交易提交(Propose);2)交易確認(Commit)。如果一個交易的短雜湊(稱為 txpid)出現在一個區塊或其中一個叔塊(被區塊引用的孤塊)的「交易提交區」(Proposal Zone),則該交易被提交。新提交的交易既不會影響區塊有效性,也不會影響區塊的廣播,因為一個節點在收到這些交易之前,就可以開始向相鄰節點傳播包含這些被提出的交易區塊。在交易被提交之後需要經過數個區塊的時間視窗,如果這個交易出現在區塊的「交易確認區」(Commitment Zone)中,則該交易被打包。這樣的兩步交易確認機制消除了區塊傳播瓶頸,因為一個新塊的確認交易在被提出時就已經被所有節點接收和驗證。透過限制攻擊時間視窗,新的機制也有效地減少了實際自私挖礦攻擊。利用縮短的延遲來提高吞吐量我們的協議將區塊鏈中所有引用孤塊的區塊稱為叔塊。這讓我們能夠很好地估算當前區塊傳播的延時,並動態地調節期望的出塊間隔,從而在延時得到改善時,提升吞吐量。因此,我們設定固定的孤塊率作為難度調節目標,它讓我們在不犧牲安全性的情況下,能夠利用更短的延遲。協議中硬編碼了出塊間隔的上下限來防止 DoS 攻擊,和避免節點超載。此外,在每個難度調節週期(Epoch)中,區塊獎勵會根據預期出塊間隔,成比例地進行調節,因此預期的平均時間獎勵和出塊間隔並不相關。
減少自私挖礦攻擊根據 Vitalik,Grunspan 和 Perez-Marco 的建議,我們的協議在估計網路算力時,會將所有區塊(包括叔塊)納入到難度調節中,因此新的難度和孤塊率是不相關的。此外,我們證明了在我們的協議中,自私挖礦不再有利可圖。這個證明是非常有意義的,因為在 Vitalik,Grunspan 和 Perez-Marco 的非正式論證中,並沒有排除攻擊者在新的協議機制下,仍然獲得不公平獎勵的可能性,而我們的協議證明了這一點。舉例來說,攻擊者可能會在第一個難度調節週期中暫時關閉一些礦機,這樣就會導致修改後的難度調節演算法會低估全網算力,在第二個難度調節週期時,這些攻擊者便開始自私挖礦,以在整體上獲得更高的平均時間收益。我們證明了在我們的協議中,不論攻擊者在誠實挖礦、自私挖礦、關閉礦機這三種策略中如何分配算力,不論他的策略覆蓋多少個難度調節週期,自私挖礦都是無利可圖的。證明的細節我們會在接下來的部分公佈。規範兩步交易確認
在我們的協議中,我們採用了兩步交易確認機制來消除上述的區塊廣播瓶頸(無論出塊間隔多短)。我們首先來定義一下這兩個步驟和區塊結構,之後會介紹新的區塊傳播協議。定義定義 1:一筆交易的提交 id txpid 被定義為這筆交易雜湊 txid 的前 l 位位元。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 時間間隔帶來的額外延遲被抵消,因此實用性並不會受到影響。區塊和緻密區塊結構

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

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

其它區塊結構規則:

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

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

區塊廣播協議

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

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

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

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

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

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

動態難度調節機制

我們改寫了中本聰共識的難度調節機制,因此:(1)自私挖礦不再有利可圖;(2)吞吐量會根據網路頻寬和延遲動態地進行調整。為了實現(1),我們的協議在每個難度調節週期估計全網雜湊率的時候,考慮了所有區塊,以確定下一個難度調節週期每個獎勵單元所需的計算工作量,而不僅僅是主鏈的區塊。為了實現(2),我們的協議根據最新難度調節週期的孤塊率來計算下一個難度調節週期中主鏈區塊的數量。最後,結合這些結果來計算區塊獎勵和調節目標。

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

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

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

註釋

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

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

該演算法會輸出三個值:

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

計算調整後的雜湊率估值

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

來計算的。實際雜湊率的計算如下:

在這裡:

HSpace 是所有雜湊空間的大小,如在比特幣中就是 2²⁵⁶
HSpace / Ti 是找到一個有效區塊預期所需要的雜湊運算數量
Ci,m+Ci,o 是難度調節週期i中所有的區塊數量

是透過預期總雜湊運算量除以持續時長 Li 來計算的。

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

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

區塊廣播建模

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

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

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

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

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

確定目標難度值

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

計算每一個區塊的獎勵

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

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

原文連結:
https://github.com/nirenzang/rfcs/blob/master/rfcs/0020-ckb-consensus-protocol/0020-ckb-consensus-protocol.md
翻譯:Ryan, Orange
校對:Kelly

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;