Nervos 研究員張韌聊 PoW 公鏈共識協議安全性與 Nervos NC-Max 方案的設計考量。

原文標題:《萬字實錄 | 張韌做客 Zero Knowledge 播客,暢聊共識協議安全性和 NC-Max 那些事》
受訪者:張韌,Nervos 研究員

Zero Knowledge 是業內著名的專注於零知識證明的英文播客,深入探討新興 Web 3 技術,與正在構建它的社區成員們。該播客的聽衆爲同行開發者和希望瞭解該區塊鏈內部運作的人們。播客的創建者 Fredrik Harrysson 與 Anna Rose 表示,他們不投機,不多談交易,更多專注於技術本身。

最近的播客邀請到了 Nervos 研究員張韌。張韌和主持人一起聊了聊他在共識算法上的研究工作,並從 Ren 之前做的關於評估 PoW 共識協議安全性的研究開始,討論到了他爲 Nervos 設計的共識協議 NC-Max。Nervos 中文社區爲大家整理了播客的內容文稿,供小夥伴們查看。

更多精彩內容,歡迎收聽 完整播客


播客創建者 Anna:歡迎張韌做客 Zero Knowledge 播客。在今年四月份,我們和 Ittai Abraham (注:VMware Research 研究員)有一集關於共識的話題。在那期節目之後,之前上過我們節目的 Alan Szepieniec (Nervos 哈希算法的作者)聯繫我說:「嘿,我在 Nervos 有一位同事,如果你們正在探討有關共識的話題,你真的應該和他聊聊。」這就是張韌。我們早就想請你來我們節目聊一聊共識協議這個話題,也很開心你今天終於能加入我們的節目!

播客創建者 Fredrik:所以我們今天有一些非常有趣的話題, 深入挖掘共識的東西。但是在我們挖掘之前,讓我們先來談談你吧,你是怎樣進入這個領域的,是什麼讓你對這方面的研究感到興奮?

Ren:我在讀碩的時候就在做點對點網絡的研究。我在 COSIC 攻讀博士學位期間,開始四處尋找有趣的課題,這個歷程大約花了兩年時間,我不得不說我失敗了。所以最後我準備了幾個研究課題,去問了一些組裏的資深成員。比如說,你覺得哪個研究課題是最有意思的?而他們都推薦我去研究比特幣,他們說「研究加密貨幣的最佳時機已經過去了,但也許你還是會因此得到一個 PHD:)」那是 2014 年的事了。

我從 2014 年開始從事比特幣和加密貨幣的研究,結果發現這個領域比他們預期的要持久的多。

Anna:當他們說這句話的時候,他們實際上是想說最激動人心的部分已經過去了,還是暗示說整個趨勢將會消失?

Ren:我想在那個時候,整個趨勢似乎正在消失。比特幣的價格每天都在下跌,領域裏關於比特幣的論文也越來越少,但誰知道以後會發生什麼呢?

Fredrik:這是有道理的 , 因爲比特幣其實很簡單,它的概念很簡單。你不會覺得對於這樣一個簡單的東西,有幾十年的研究要做。但是我們現在已經過了十年了,人們還在不斷地發表論文。

Ren:特別是當時比特幣網絡還比較小,大概只有 600 個節點,當網絡越大,你就能在裏面找到更多有趣的研究問題。所以當時大家認爲比特幣網絡不是一個很令人興奮的研究對象。之所以還是決定要研究它,就是因爲它是有些混亂,混亂的地方通常就有機會。

Fredrik:我們今天要談的第一篇論文,就是你與 Bart Preneel 合寫的那篇論文《Lay Down the Common Metrics:評估 PoW 共識協議的安全性》。我還沒有讀過論文, 但我讀了摘要,它的內容相當有趣,最有意思的是它裏面談到人們通常會如何分析共識算法以及爲什麼有些分析方式是錯誤的。那你能不能談一下這篇論文是關於什麼的,你在裏面發現了什麼?

Ren:有一段時間我對自私挖礦攻擊很着迷,所以我試圖找到解決這種攻擊的方法,找到一種對這種攻擊免疫的共識協議。我試着設計了十幾個協議來評估它們的安全性,所有的協議都不完美。我對這些方案都不滿意,所以我沒有公佈任何一個方案。幾年後,我發現這些我認爲是欺詐的想法由其他人陸續發表出來了,而且他們聲稱他們的協議是安全的,比中本聰共識好,比比特幣的共識協議好。我覺得這是不對的。人們需要被告知,這些想法是有缺陷的。他們開闢了新的攻擊載體,而設計者並沒有意識到這一點。

Anna:他們並不瞭解你的研究,他們並不是看到了你的研究,然後就拿去用了,這些應該是他們自己得出的結論,對吧?

Ren:對。因爲這些想法都是比較簡單直接的,就是你第一眼看覺得是有道理的。但是如果你深挖一下,真正地去分析他們的安全性,你會發現問題。

尤其讓我感到生氣的是,很多論文都是通過模擬,針對某些攻擊策略來論證其共識系統的安全性。2013 年有這樣一篇論文,叫《Majority is not Enough》,裏面針對自私挖礦攻擊分析了其協議的安全性,並號稱這個新的共識協議要優於中本聰共識。然而,我認爲這並不是一個安全證明。爲什麼呢?也許你的系統、你的新設計會激發新的、專門針對你的攻擊方法。

當我們在論證一個共識協議的安全性時,通常需要找到一個更爲嚴謹的方式:比如要麼你能證明在新的共識協議下,無論攻擊者採取何種攻擊策略,他都不能獲得更多的利潤或者造成更多的損失;要麼你設法分析攻擊者所有可能會採取的策略,無論該攻擊者在某個策略空間內做什麼,他都不能造成更多的損失。我認爲這樣纔是正確的分析一個共識協議安全性的方式。

Fredrik:這是一個常見的問題,人們不會老老實實、直截了當地談論他們的取捨,只會說,我們發明了這個新東西,它比另一個東西更安全,但是對可能產生的新問題避而不談。

Ren:是啊,所以我集合了一組這類新的共識協議,通過馬爾科夫(Markov)決策過程來分析它們的安全性,然後寫了這篇論文。

Anna:好的。你在論文中提到的那些新的共識協議都是已經存在的對嗎?我們可以討論一下。

Ren:是的,有一個協議叫統一平局協議(Uniform tie-breaking protocol),是在 Ethereum 中實現的,但是我想所有的 Ethereum 開發者和研究者,他們都知道這個協議的漏洞。所以這不是一個很大的問題。而且還有一個協議叫作 Rootstock,是一個和我論文中提到的 Reward Spitting protocol 非常相似的協議。另外一個比較著名的協議是 FruitChains

FruitChains 是由 Elaine Shi 設計的,聲稱與激勵相容,可以抵抗自私挖礦攻擊。但是我發現它只是比中本聰共識對自私挖礦攻擊的抵抗力更強。如果每個區塊都是經過 100 個區塊確認的、如果你只用 6 個區塊信息,和比特幣的中本共識一樣,那麼 FruitChains 其實更容易受到自私挖礦的攻擊。

所以在中本共識上的問題就像 Fredrik 問的那樣,就是它沒有完美的鏈質。也就是說,一個攻擊者擁有不到 50% 的挖礦能力,就可以安全地讓區塊鏈中最後幾個區塊失效。這也是爲什麼中本聰共識只能提供概率意義上的安全保障。

而對於這種號稱比中本聰共識更安全的新設計,我們認爲它需要滿足兩個要求之一:要麼它能實現更好的鏈質量,要麼它們能更好地抵禦三種攻擊:

  • 自私挖礦攻擊
  • 雙花攻擊
  • 進一步分叉攻擊(審查攻擊)

相應的我們將所有這些新的共識協議分爲兩組:第一組聲稱能實現更好的鏈質量,第二組則聲稱能實現更強的抗攻擊能力,我們據此分析他們的安全性。

我採用了馬爾科夫決策過程(Markov Decision Process)作爲分析框架,它可以讓我們在一個部分隨機的環境中模擬一個戰略參與者的行爲。

戰略玩家指的是攻擊者,部分隨機環境指的是環境相對固定(它以已知的方式響應攻擊者):如果攻擊者這樣做,在什麼概率下,會發生某些情況,在什麼概率下,會發生另外一些情況。攻擊者可以任意選擇挖哪條鏈以及任意時間發佈他挖到的任意個區塊。攻擊者在攻擊鏈質量或者進行我提到的這三種攻擊方面能做的最好的是什麼。

Anna:所以你的模型中,你實際上分析了兩種情況。

Ren:第一類叫「更好的鏈質量協議」。而另一個是三種抗攻擊協議。

Anna:所以要麼是更好的鏈質量,要麼就是這些具體的攻擊矢量,但在你的模型中,你是在做這些東西的組合,還是你總是專注於其中之一?

Ren:我覺得有兩個不同的標準。你可以從兩個不同的維度來考慮。只要你能在其中一個維度打敗中本聰共識,就算你贏。

Anna:我明白了,但是基於新的共識協議,可能會引起一些新的攻擊方式,最後你可能會有一個不太安全的鏈,對吧?

Ren:如果你的鏈質量比中本共識好 , 那麼你自然有更好的抗攻擊能力。因爲中本共識的根本問題在於,它的 Chain Quality 並不完美。然而,如果你不能達到更好的鏈質量,一些協議聲稱,他們仍然可以比中本共識更好,因爲他們更能夠抵抗所有已知的攻擊方式。所以我們把協議分成兩組,第一組聲稱他們在鏈質量上比基於中本聰共識的鏈好,所以我們也就不需要分析他們如何應對攻擊了。

Anna:有哪些共識協議聲稱鏈質量更好呢?

Ren:有一些協議聲稱他們更好,但是並沒有聲稱他們在所有方面都更爲優越,爲了方便,我們把他們歸爲第一類協議。但第二類協議通常聲稱自己採用了新的激勵機制,但是與中本聰共識擁有相同的鏈質量。基本上他們使用的是相同的比特幣主幹協議,但是聲稱可以更好地抵禦各類攻擊。所以我想看看是不是真的這樣。

Anna:在這種情況下,你是在分析他們的鏈質量是否相同,還是在分析他們是否真的能抵禦這些攻擊?因爲我的理解是,如果他們試圖在某一個方向上改進,他們就可能面臨新的攻擊?

Ren:這是在抗攻擊協議的範圍內。所以有兩組情況:第一組是「更好的鏈質量協議」,第二組是「抗攻擊協議」。

關於「更好的鏈質量協議」,他們對中本聰共識進行了修改。中本聰共識簡單來說,由兩個基本規則組成:第一個是礦工只認最長的鏈,第二個是如果礦工看到兩條在競爭的、長度相同的鏈,會在先收到的那條鏈上進行挖礦。

如果你按照這兩個規則走,你會和中本聰共識有同樣的鏈質量;如果你修改這兩條基本的規則,那我就把你放在「更好的鏈質量協議」裏。如果你不修改這兩個基本規則,而是修改獎勵機制,你用新的機制來鼓勵大家不做自私挖礦、不做審查攻擊,那麼我相信你是一個「抗攻擊協議」

Fredrik:更具體地說,有哪些協議是可以做到改進鏈質量的?

Ren:我覺得最有趣的例子(對有些人來說是最反常的例子)是有一個協議,我叫它「最小的 Hash Tie-Breaking 協議」。

我起這個名字是因爲我不想說出任何具體的項目。在這個最小哈希平局打破協議中,設計者認爲如果我總是在最新的一個區塊哈希值最小的鏈上挖礦,那麼所有誠實的礦工都會自然而然地在同一條鏈上挖礦,算力永遠不會被分割,鏈變得更加安全。

這是他們的直覺。所以這是一個「更好的鏈質量協議」,因爲它修改了中本聰共識中的首接策略(當兩條鏈長度相同時,要求礦工在他們更早接收的鏈上挖礦)。

Fredrik:直覺讓我覺得很有道理,因爲就像你一樣, 在編程中任何時候我們談論時間,都會出錯。如果你說的是「更先收到」,那顯然對每個人來說都會不同,因爲網絡延遲或者什麼其他的原因,它基本上只是一個隨機的偏差。那麼最小哈希值平分協議又有什麼問題嗎,或者說直覺其實就是正確的?

Ren:直覺是不對的。在一些極端的情況下,最小哈希值平分協議的表現比中本聰共識略好。但是,對於我們分析的大多數參數來說,它的表現其實比中本聰共識更差,因爲它會面臨兩種新的攻擊:第一個我稱之爲「後發趕超」,比如說,如果你是一個攻擊者,你在挖一條祕密鏈有一個區塊,誠實鏈有兩個區塊,那麼在中本聰共識裏,你通常會直接放棄,因爲誠實鏈比較長,你沒辦法追上。

但是,在最小哈希值平分協議中,如果你的鏈比較短,而較長的那條鏈尖有非常大的哈希值,那麼你可以繼續挖礦,因爲你知道,如果你發現你的祕密鏈有下一個區塊,你就會放出兩個區塊,儘管你放出的時間比誠實鏈晚,但你的哈希值比誠實鏈尖小的概率非常大。

所以所有的誠實礦工都會轉回你的鏈,他們會放棄之前的鏈,在你的鏈上挖礦。所以這個最小哈希值平分協議啓用了這種新的攻擊行爲,攻擊者可以選擇何時採用這種行爲。這就像是在攻擊者的工具箱裏放了一個新的工具,這也是爲什麼它會削弱協議安全性。

第二種攻擊方式是,假設你有一個祕密區塊,這個區塊的哈希值非常小。你是一個非常小的礦工,區塊的哈希值非常小,這樣你就可以確定,在 99% 的概率下,下一個誠實區塊的哈希值會比你的哈希值大。那麼你可以說,好吧,現在我扣下這個區塊是安全的,我會祕密地進行挖礦。

另一方面,如果你是一個小礦工,你發現一個區塊的哈希值比較大,這樣你知道有非常大的概率,如果你扣下一個區塊,你會輸掉區塊競賽,那麼你可能會選擇釋放區塊。因爲最小哈希值平分協議,你可以準確估計自私挖礦攻擊的成功率。它給攻擊者提供了更多的信息來選擇什麼時候扣塊,什麼時候放塊。所以這也給攻擊者的工具箱裏放了一個新的工具,因爲攻擊者擁有了幾個新的工具,可以更有把握地進行攻擊。這就削弱了鏈的安全性。

Anna:我想這是一個「更好的鏈質量協議」的例子,但我還是有點困惑,因爲你之前不是說過如果有「更好的鏈質量」,那麼它就是安全的嗎?就像你剛纔說的,我覺得我有點回到之前你有這兩類,那些你沒有分析的,但是你一直說如果他們有更好的鏈質量比你沒有分析,我就很困惑。

Ren:是的。如果他們有「更好的鏈質量」,我們就不去分析他們的激勵機制。

Anna:是的,我們不分析他們的激勵機制。但在這種情況下它有什麼呢?它沒有更好的鏈質量,還是它有更好的鏈質量?

Ren:這個協議聲稱有更好的鏈質量,但它失敗了。

因爲它通過模擬分析了它的安全性。我明白了。有一個主要的信息,你不應該,你永遠不應該通過模擬來分析你的安全性,我想是一個特定的攻擊者策略。因爲你的協議可能會激發新的針對協議的攻擊策略。

Fredrik:那麼,第二類的例子是什麼,你改變了激勵機制。

Ren:第二個我可以舉出幾個例子,我將談論「子鏈(Subchains)」。這是 Peter Rizun 博士在一個叫 The Ledger 雜誌上發表的一個協議。在這個協議中,礦工被允許發佈具有較小哈希值的區塊。

這裏有兩個哈希目標,一個更大的目標和一個較小的目標。在比特幣共識協議中,如果區塊小於一個預定義的閾值,你才能發佈你的區塊,就是較小目標。但是在 Subchains 中,如果你沒有找到一個區塊,但是你的備選區塊的哈希結果小於大目標,你也可以發佈這個備選區塊(我們把它叫做「弱區塊」)。這樣做的好處是,他們希望在將其納入正式區塊之前,可以更快地確認交易。

因爲弱區塊的加入,所以出塊間隔實際上變小了。正式區塊可以獲得所有的區塊獎勵,而弱區塊只是一個用來同步交易的工具,得不到任何區塊獎勵。

然而每當有兩條競爭鏈時,還是會通過比較這兩條鏈的長度來解決分叉問題,正式區塊和弱區塊都會被計算在鏈的長度中。這種協議我們稱之爲「獎勵幸運協議」,他們並不關心哪個區塊是誠實的、哪個區塊是惡意的。他們關心的是哪個區塊是最幸運的(哈希值更小),並且只獎勵那些哈希值較小的區塊 。雖然弱區塊參與了共識協議的過程,但是得不到任何獎勵,這類「獎勵幸運協議」的問題在於,幸運的弱區塊不一定是好的區塊。所以這種在獎勵發放方面的歧視產生了一種新的攻擊方式。

攻擊的方式是這樣的:每當攻擊者發現一個弱區塊 , 它就會扣留一個區塊, 希望誠實的礦工可以發現一個正式區塊,這樣我就可以用我的弱區塊來使誠實礦工開採的正式區塊無效。因爲反正弱區塊是得不到任何獎勵的,所以扣下這個弱區塊沒有任何風險。這就好比,我有了一個新的工具來攻擊系統,而且這個工具是沒有成本的。

每當攻擊者發現一個區塊時,如果攻擊者不想承擔任何經濟風險,他可以作爲一個誠實的礦工發佈這個區塊。所以,這個協議又可以讓攻擊者校準成功率,選擇更合理、更準確的策略來攻擊系統。

Fredrik:有意思。在這兩個例子中,就像你所說的那樣,你在攻擊者的工具箱中又放了一個工具,人們是如何通過引入更多的複雜性來實現的呢?他們就像,「哦,我想簡化這個,或者我想讓這個路徑更復雜。或者我想讓這個路徑更優化,或者我想引入這些其他的概念,讓 X、Y 或 Z 更簡單」。但其實通過引入這個新的東西,那其實是攻擊者可以利用的另一個東西,這是一件他們可以隱瞞的事情,這是一件他們可以獲得更多信息的事情。這樣他們的攻擊就有可能更成功。

Ren:是的,我完全同意,複雜是安全的敵人,如果你想要一個更安全的協議,通常應該做的第一件事就是嘗試去簡化協議,看看可以削減掉哪些東西,這就是爲什麼 NC-Max 是基於中本聰共識(Nakamoto Consensus)而設計的,我們試圖從最開始着手,不引入任何新的攻擊變量。

Anna:創建這個評估共識協議安全性的模型過程中,你有什麼其他的收穫或想法嗎 ?

Ren:通過這個研究,我們有幾點想強調:

第一點有關如何分析安全性。

你永遠不應該只通過模擬單一攻擊者的攻擊方式來分析協議的安全性,那樣是很危險的。另外,不要設計一個太過複雜的協議,如果連協議設計者都無法分析它,那情況也會變得很危險,因爲複雜是安全的敵人。

而有關我們在激勵機制上的測試結果,我們發現,沒有一種激勵機制可以阻止這三種攻擊。

如果你獎勵所有的區塊候選人,不管他們是誠實還是惡意的,這就會讓雙花行爲沒有風險可言。對於一個攻擊者來說,既然我總會得到獎勵,那我爲什麼不嘗試雙花呢,即使我失敗了,我也可以得到獎勵。

如果你沒收所有可疑挖礦者的獎勵,比方說無論什麼時候,只要他們和最長鏈進行競爭,就不會得到任何區塊獎勵。這實際上是爲攻擊者引入了一個審查網絡的工具,就是說,如果你把這些交易包含進區塊裏,我會嘗試讓你的區塊變得無效。即使我失敗了,只要我發現了點什麼,我還可以通過可以沒收你的獎勵,以迫使理性的礦工加入審查攻擊,以避免經濟損失。

如果你只獎勵幸運區塊,而幸運區塊不一定是誠實區塊,如此一來,就給了攻擊者機會,他們可以在「幸運」的時候老老實實執行,而在「不幸運」的時候進行作惡。

綜上所述,我們發現了一個取捨,我們稱之爲「獎勵壞的人還是懲罰好的人」

Anna:好的,你剛剛只是舉了兩個例子,但顯然你已經分析了很多其他例子,在這篇論文裏面我們可以看到嗎?或者說你是否還有使用這個模型去分析其他共識協議的工作?

Ren:這篇通用指標論文中涉及到了七個不同的協議,在這之後,這部分的工作其實還一直進行着。

有一篇論文叫 SquirRL,它基於馬爾科夫決策過程(Markov Decision Process)的方法進行了擴展,馬爾科夫決策過程的問題是,它只能對有少量狀態的協議進行建模,如果協議變得越來越複雜,那麼它就超出了馬爾科夫決策過程的計算能力。

注:SquirRL 論文爲 SquirRL: Automating Attack Analysis on Blockchain Incentive Mechanisms with Deep Reinforcement Learning:
https://arxiv.org/abs/1912.01798

所以這些研究人員就採用深度學習來模擬更復雜的協議,深度學習是著名的圍棋遊戲 AlphaGo 使用的一種技術,它使我們能夠對更復雜的協議進行建模,他們也得到了一些有趣的結果。

Anna:我意識到這是一個與 PoS 非常不同的模型,但我想知道,你發現的這些工具或分析方法可以應用於 PoS 這種模型嗎?我們能它們歸在同一類別嗎?

Ren:我認爲它是相關的。

一般來說,我覺得應用馬爾科夫決策過程或者深度學習來分析 PoS 協議不存在什麼困難,但分析 PoS 協議的問題是,你無法直接集合一組協議,讓他們彼此競爭,知道誰是第一,誰是第二,沒有這種簡單的結果。

你無法把它們放在同一個約束當中,對不同 PoS 協議來說,它們通常有着不同的安全假設,這意味着每個協議都在自己的規則中進行遊戲,所以你不能只是統一規則,強行把它們放到同一個領域。

所以在這方面會有一些複雜度,但總的來說,我認爲在分析 PoS 協議時,應用馬爾科夫決策過程或深度學習是很有意思的一件事。

Anna:在你自己的研究中,你是否真正探索過這一點?

Ren:也許以後會,但不是現在。

Fredrik:我很想深入瞭解更多有關馬爾科夫決策過程或深度學習方面的內容,但這樣的話,我們可能需要另外一小時的時間了(笑)。

所以,我們應該繼續談談你之前預告的內容——NC-Max,這是你和其他人一起設計的一個共識算法對吧?這是我們今天要講的第二篇論文,能不能請你高屋建瓴的和我們聊聊,什麼是 NC-Max?它想做什麼?

Ren:當然沒問題,我應該從後面的故事說起。

我們都很喜歡「中本聰共識」(Nakamoto consensus,簡稱 NC),其中有三個原因。

首先,它只有一系列最低要求的安全假設。與通常有不同很多安全假設的 PoS 協議不同,中本聰共識的安全假設非常少,而這樣的好處是,協議很好理解。到目前爲止,工業學術界有許多篇論文對中本聰共識進行了詳細的分析,所以我們完全知道它的優點和缺點。

中本聰共識的第二個優點是,它將通信開銷降到了最低。在中本聰共識中,特別是在比特幣中,如果你發現了一個新的區塊,你可以把它作爲一個 13 千字節左右的緻密區塊傳播,就這樣,一條消息確認一組交易,這是理論的極限,你不可能做的比這更好,因爲一條消息來自一組交易,而其他所有的協議在通信開銷方面都更貴。

我們喜歡中本聰共識的第三點原因是,它是基於鏈的,也就是說所有的交易有一個全局順序,它不會像 DAG 協議那樣存在重複打包的問題。如果你用的是 DAG 協議,那麼很有可能區塊中會同時包含很多重複的交易,而要想去除這些重複的交易,要麼需要一定的計算能力,要麼需要一定的通信成本。

中本聰共識的問題在於它的吞吐量非常低,這也是爲什麼很多協議設計者爲了實現更高的吞吐量而放棄中本聰共識甚至放棄工作量證明的原因。

Anna:你說吞吐量提高,是不是指的就是,實際處理交易速度的性能擴展?

Ren:性能擴展有兩個指標,第一個是吞吐量,一秒鐘可以確認多少筆交易;第二個是延遲,指的是交易廣播時間和交易確認時間之間的時間差,中本聰共識的主要問題是吞吐量。

所以從我的角度來說,在你放棄中本聰共識之前,先檢查一下網絡的情況。我們來看一下低吞吐量的瓶頸是什麼,我們能不能在這個瓶頸上做一些事情,而不是完全放棄基於鏈的結構。

所以我認爲,我和其他共識協議設計者的主要區別在於,他們沒有計算機網絡的背景。當我在 Blockstream 和 Peter Wuille 以及 Gregory Maxwell 一起實習的時候,我們討論了很多關於比特幣如何傳播區塊和交易的問題,而這最終導致了這個研究的誕生。

一般而言,我們看一個節點帶寬時,可以把它分成三個不同的部分,第一部分是用來同步交易的,這其實是我們想要的部分,我們要把這部分最大化,我們每秒能夠同步的交易越多,吞吐量就越高。第二部分是共識本身消耗的帶寬。我們希望把這部分降到最低,中本聰共識已經做到了,第三部分是閒置的帶寬,有一部分時間,我們沒有傳輸任何交易,也沒有傳輸任何區塊。

Anna:你剛纔用的詞是閒置,像是某個時候,什麼都沒發生。

Ren:對的。中本聰共識的問題在於爲了維持它的安全性, 孤塊率必須很低,而由於所有的區塊時間間隔都遵循指數分佈,如果我們想要一個非常低的孤塊率,那我們就需要很長的平均區塊間隔時間。

平均區塊間隔時間長,就會導致閒置時間變長,所以儘管網絡實際上可以每秒傳輸 2500 筆交易,但大部分時間網絡都是閒置的,因爲如果我們減少區塊時間間隔,網絡孤塊率會更高,協議的安全性會變差。

Fredrik:就在最近一期的 Podcast 裏, 我們談到了這個點,不過是在以太坊語境下的。我們談到了 mempool (待處理、未確認的交易集)是如何工作以及交易是如何分佈的,以及我們看到實際挖礦節點時,mempool 是什麼樣的。

它們實際上是在推送交易,在網絡方面,它們每秒推送數千筆交易,但它們並不是都被包含在一個區塊裏,就像競爭性交易,人們在 DEX 上互相出價,諸如此類。因此,這並不是解決交易中的網絡問題,它會將它們包含在一個區塊中,並給礦工足夠的時間來處理該區塊,並且希望在下一個區塊上繼續。

Ren:對的,在 Ethereum 中,計算是一個瓶頸,這也是爲什麼 Nervos 選擇使用 UTXO 模型的原因,我後面會詳細介紹。

我們解決比特幣閒置時間過長的方法,就是要找到導致高孤塊率的瓶頸所在。我們要加速區塊傳播,降低區塊時間間隔,增加區塊大小,但這並不是說我們要無限地增加區塊大小或者降低區塊時間間隔,只要我們設法找到一個平衡點,即區塊間隔足夠低,區塊足夠大,所有的節點帶寬都被耗盡,那麼,我們就完成了任務。如果我們能夠把節點帶寬用完,那麼我們就不用引入 DAG 協議了。

那,區塊傳播延遲的瓶頸是什麼?我們發現,區塊傳播的瓶頸其實是區塊中的新的交易。「新的交易」的定義是指還沒有完成傳播就被包含到區塊中的交易。

交易通常會在 15 秒內傳播至整個網絡。假設區塊間隔是 10 分鐘,在前 9 分 45 秒內的交易,都在包含到區塊之前,就已經得到了傳播。但是,如果有一些交易是在最後 15 秒才首次廣播,並且它們被包含到了下一個區塊中,那麼這些交易中有可能有一些沒有被同步到網絡中。

它們必須和區塊一起傳播,這樣做的問題是,如果我是一個節點,當我收到緻密區塊時(緻密區塊中包含着刪減的交易哈希,可以把它看作是交易的壓縮版),如果沒有「新的交易」,你可以直接把這個緻密區塊轉發給下面的節點。

但是,如果有一些「新的交易」,你必須先向之前的節點查詢這個交易,只有在等到他們回覆之後,你才能把這個緻密區塊轉發給下面的節點,所以額外同步這個新的交易的往返,其實就構成了提高區塊傳播速度的主要障礙。

Anna:這是業界廣爲流傳的研究結論了,還是說是你在研究過程中想要弄清楚的東西?

Ren:它被比特幣核心開發者所熟知,但這在比特幣中並不是一個太大的問題,因爲在比特幣中,大多數區塊都沒有「新的交易」。

它被比特幣核心開發者所熟知,但這在比特幣中並不是一個太大的問題,因爲在比特幣中,大多數區塊都沒有「新的交易」。

在比特幣裏,當一個區塊第一次廣播時,它可以在 600 毫秒內同步到網絡中 90% 的節點。這點非常好,但是,如果區塊比較大,或者區塊間隔比較短,那區塊中的新的交易就會比較多。

那,我們如何消除這些新的交易呢?

我們的解決方案是:首先,我們把交易同步和交易確認解耦。比如說,在每個區塊裏面,有一個字段,我們叫它交易提案區,所有的交易必須先出現在這個交易提案區裏面(以刪減哈希的形式)。而之前的交易區,或者我們叫它交易承諾區。

交易必須先出現在交易提案區,只有在兩個區塊之後,才能被嵌入到到交易承諾區。

因此這樣做的好處是,每當你作爲節點收到到新的區塊時,所有提交的交易都已同步,你可以直接將緻密區塊轉發給下面的節點,這樣,同步這些新的交易的額外往返就從區塊傳播的關鍵路徑中移除了。

並且,交易提案區中的交易有效性並不影響區塊的有效性,交易提案區可以有缺失的交易、畸形的交易、甚至雙花的交易。這些都沒關係,後來的礦工可以直接跳過這些交易,只認可那些有效的交易,這樣,他們收到的交易已經是通過兩步確認機制了。我們設法消除新的交易,確保所有的區塊在 600 毫秒內同步整個網絡。

所以這就使得我們能夠把平均區塊間隔縮短到兩三秒,同時保持一個很低的孤塊率。

Fredrik:這聽起來很有趣,我簡單總結一下。

一個比特幣的區塊時間是 10 分鐘,你可以提交交易,它會被傳遞到整個網絡,如果你的交易是在那個時間段內提交的(9 分 45 秒內),並且被包括在內,那對任何人來說,這都不是一個「新的交易」,因爲在區塊出現的時候,每個人都已經看到了它,對吧?

所以本質上你所做的是將礦工可以選擇的交易集限制在這個區域內,在這個區域內,它將被傳遞到整個網絡中。就像在比特幣的例子中,比特幣礦工只允許包含在前 9 分 45 秒內收到的交易。

Ren:對,礦工只會認可在兩個區塊之前提出的交易。

Fredrik:我明白了。

還有一件事,我覺得它和 PBFT (Practical Byzantine Fault Tolerance) 非常相似,在 PBFT 中,有預準備、準備和提交這三個階段,聽起來非常相似。

Ren:這就是爲什麼我說,可以把它看作是 HotStuff 的工作量證明版本,HotStuff 是一個更明顯的流水線式協議,在任何共識協議中,其實有兩種技術可以用來並行處理事務。第一種叫做流水線式操作,它在 NC-Max 中使用,同樣,在 HotStuff 中也是如此。

第二種類型叫做併發操作。

流水線式操作相對併發操作的好處是,安全分析要簡單得多,因爲它沒有那麼多同時在挖的區塊,你可以只需用以前的技術來分析安全性,一切都不變。而且它的功能更強,因爲網絡仍然保持着一個全局的交易順序。

Anna:另外,有點想問問同步和異步的問題

Ren:一般來說,所有的工作量證明協議都是同步協議。

Anna:好的,明白了。

我只是在想說,節目之前有好幾期節目,我們談了些這部分的東西,網絡範圍和部分同步,但在這個情況下,它是同步的。那麼,對於 NC-Max,它是同步協議嗎?鑑於你已經對流水線式操作和併發操作有了一些研究。

Ren:其實我最喜歡 NC -Max 的部分是有其他協議可以將交易同步和交易確認解耦,比如 Prism,Prism 是另一個將這兩件事解耦的例子

論文爲 Prism: Deconstructing the Blockchain to Approach Physical Limits:
https://dl.acm.org/doi/10.1145/3319535.3363213

但 NC-Max 的好處是,交易承諾區和交易提案區被重新耦合在同一個區塊結構中,這大大簡化了安全分析,因爲 NC-Max 仍然遵循比特幣主幹協議,使用的是「最長鏈」原則。

所以之前所有對中本聰共識進行的安全分析都可以直接適用於 NC-Max,不需要我們證明其他額外的東西,所有的安全證明都是成立的。除此之外,我們還有一個額外的安全改進,就是在 NC-Max 中,自私挖礦是不賺錢的。

但這需要一個相對較大的安全證明,如果你感興趣的話,可以看論文了解更多細節。

Anna:我其實是想問的是,鑑於你之前的工作都是在尋找協議新的一些威脅點, 那麼,你能找到 NC -Max 引入的新的威脅點嗎?

我其實是想問的是,鑑於你之前的工作都是在尋找協議新的一些威脅點, 那麼,你能找到 NC -Max 引入的新的威脅點嗎 ?

Ren:實際上,是有一個威脅的。

有一個被之前的工作所忽略,但 NC-Max 能夠緩解的威脅,它叫做「交易扣留攻擊」,攻擊的原理是這樣的,如果你是一個礦工,你想進行自私挖礦但不想讓任何人發現,你可以做一個全是新的交易的區塊,你的區塊實際上比其他所有的區塊傳播得慢,這就給了你一些時間來進行自私挖礦,但沒有人可以指責你,因爲你可以說:「好吧,我在區塊被挖出來之後,馬上就發佈了,只是,交易同步的速度比其他區塊慢而已」。

在 NC-Max 中,這種攻擊更難發起,因爲如果你想發起這種攻擊,你必須先傳播這些新的交易,然後在兩個區塊之後,你能找到一個區塊包含這些交易。而且你還不能立即發起攻擊,只有當你在特定距離上有兩個區塊被開採出來後,你才能發起攻擊,這就是爲什麼這種攻擊在 NC-Max 中比在中本聰共識中更難發起的原因。

Anna:我進一步的問題是,有沒有新的攻擊是你不能減輕的?

Ren:我覺得不會。

因爲 NC -Max 遵循比特幣主幹協議,使用的是「最長鏈」原則,以及相對相同的區塊結構,它符合中本聰共識的所有安全假設。

Anna:明白了, 我們剛纔詳細介紹了 NC-Max 。

現在我想知道的是,你在 Nervos 這個項目工作,這是一個網絡。NC-Max 的工作和 Nervos 有什麼關係?我們過去還請了 Alan (Nervos 密碼學研究員) 上過節目,也許你可以給我們多講講 NC-Max 是如何和 Nervos 這個網絡相整合的。

Ren:其實很簡單,Nervos CKB 使用 NC-Max 作爲它的共識機制。而 Alan 的工作和 Nervos CKB 之間的關係也很簡單,Alan 設計了 EagleSong,它被用作工作量證明算法的哈希函數。

這就是我們和 Nervos 的關係,但我認爲共識協議是 Nervos CKB 最無聊的部分,它有一些更讓人興奮的功能。

Anna:是啊,如果你願意的話,請多告訴我們一些有關 Nervos CKB 的東西,因爲我們實際上從來沒有在節目中談論過它。

Ren:當然,Nervos 的設計有三件事我覺得值得一提。

第一點是,Nervos CKB 使用的是 UTXO 模型,UTXO 模型對用戶自定義代幣來說更容易,在以太坊裏,很多安全漏洞來源之一就是所有的用戶自定義代幣都存在 ERC20 合約裏面,像是用戶的所有賬戶餘額都存儲在同一個合約中,所以,如果黑客破解了這個合約,那基本上就可以任意修改用戶的餘額。

而 UTXO 模型可以讓我們把訪問控制權還給用戶,你的資產存在你自己的 UTXO 裏,你可以決定用什麼簽名算法來解鎖這些資產,所以,在智能合約方面不存在單點故障。

Anna:等等,你可以在 Nervos CKB 上運行智能合約, 但它使用的是 UTXO 模型,那還有其他項目可以這樣做嗎?

因爲我主要了解的是以太坊,我一直以爲你需要有一個賬戶模型才能做智能合約的東西,但我猜,好像不是 ......。

Ren:不, 其實你不需要一個賬戶模型才能支持智能合約,有其他產品也可以做到這一點,但我想我們是最早的一個。

Anna:明白了,我在想那是什麼樣子,智能合約到底是如何在 UTXO 上運行的?

Ren:我稍後就會談到這部分。

在 Nervos 中 script 分爲兩種,第一種叫做 lock script,你可以把它想象成你公寓的鎖,第二種叫做 type script。你可以把它想象成你公寓裏的傢俱。你正在運行的實際代碼是爲了執行智能合約,而將 lock script 和 type script 分開的好處是,它可以消除很多安全漏洞。

在以太坊裏面,基本上誰能修改智能合約,誰就能修改變量,它與執行功能的代碼混合在一起,而在 Nervos CKB 中,這兩種腳本是分開的,這樣就很難被攻擊。

另外,用戶可以定義自己的 lock script,你可以說我更喜歡 Schnorr 簽名,也可以說更喜歡 ECDS 簽名,這些都是很靈活的,這是 Nervos 的 UTXO 模型。

Nervos 的第二個新東西是它的經濟模型,原生代幣 CKB 代表了存儲空間。在以太坊裏面,你只需支付一次性費用,而無論佔用存儲空間有多大,它都永遠不收取任何鏈上存儲的費用。

在 Nervos CKB 中,我們使用了不同的經濟模型,每個 UTXO 都有一定數量的存儲空間,所有的空間都有利息,如果你使用了這個存儲空間,那麼利息就歸礦工所有,如果你不使用那個存儲空間,那麼你可以保留這個利息。

Anna:所以用戶要爲存儲付費,對嗎?

Fredrik:是的,沒錯,就像是狀態租賃,但它不需要讓我的智能合約一直活躍,我必須不斷地把合約的錢送來,而 Nervos CKB 的付款像是通過通脹來付款。

Ren:是的,而且有交易費。

有意思的是,你可以用任意一種資產來支付交易費,並沒有 Gas 機制。你可能知道,以太坊的許多攻擊就是來自於費用估算和共識機制之間的緊密耦合,而我們認爲這是沒有必要的,我們把它去掉,看看它的效果如何。

Nervos 設計的第三個亮點是,它使用 RISC-V 來打造虛擬機,RISC-V 是一個硬件指令集,這意味着它非常強大,你可以用任何你想要的編程語言來編程,包括 Solidity,你可以實現任何你想要的密碼學原語,而這就方便了跨鏈操作和算法更新,因爲在很多跨鏈操作中,不同的鏈使用不同的簽名算法,但在 Nervos 中,這不是個問題,因爲你可以隨時從密碼學庫中調用。

Fredrik:有沒有一種有效的方法可以將 RISC-V 編譯成 x86?或者這是否意味着你的礦工需要購買 RISC-V 的 CPU?

Ren:我不是這方面的專家,目前爲止我被告知,目前它的速度比 EVM 稍慢,但他們正在優化它。

Fredrik:好的,我認爲那應該是在仿真模式下跑的,因爲如果在實際的硬件上運行 RISC-V,它會很快。

Ren:對,這個環境下運行的 RISC -V 預計比在硬件上運行要慢 50 倍,而且有人告訴我,相對 Web Assembly,RISC-V 指令集實現起來更簡單。

Anna:總結一下,我很好奇你現在在做什麼研究?你有什麼正在進行的工作嗎?

Ren:有一件大事我真的很想做,就是寫一篇論文,叫做「Lay down the Common Metrics 2.0」

近些年有很多新的協議出來,但有些協議還是犯了同樣的錯誤,就是把模擬作爲安全分析,我想分析它們的安全性,找出這些協議中新的攻擊方式。