Vitalik:區塊鏈可擴充套件性的限制

買賣虛擬貨幣

來源 | vitalik.ca

作者 | Vitalik Buterin

感謝Felix Lange, Martin Swende, Marius van der Wijden 和 Mark Tyneway的反饋和校對。

我們能將區塊鏈的可擴充套件性提升到多少?是否真的能像 Elon Musk 所說的那樣“區塊時間加速十倍,區塊大小增長十倍並且手續費降低一百倍”,而不會導致極度中心化並違背區塊鏈的本質屬性?如果答案是否定的,那我們能達到什麼程度?改變公式演算法會怎樣?更重要的是,如果引入類似 ZK-SNARK 或分片的功能會怎樣?一個分片型的區塊鏈在理論上能夠不斷新增分片,那麼是否真的可以這麼做呢?

事實證明,無論是否使用分片,都有重要且非常微妙的技術因素限制了區塊鏈的可擴充套件性。許多情況都有解決方案,但是即使有了解決方案,也存在侷限性。這篇文章將探討其中的許多問題。

如果只是簡單地拔高引數,問題似乎就能得到解決。但是我們會因此付出什麼代價?

普通使用者能夠執行節點對於區塊鏈的去中心化至關重要

想象一下凌晨兩點多,你接到了一個緊急呼叫,來自世界另一端幫你執行礦池 (質押池) 的人。從大約 14 分鐘前開始,你的池子和其他幾個人從鏈中分離了出來,而網路仍然維持著 79% 的算力。根據你的節點,多數鏈的區塊是無效的。這時出現了餘額錯誤:區塊似乎錯誤地將 450 萬枚額外代幣分配給了一個未知地址。

一小時後,你和其他兩個同樣遭遇意外的小礦池參與者、一些區塊瀏覽器和交易所方在一個聊天室中,看見有人貼出了一條推特的連結,開頭寫著“宣佈新的鏈上可持續協議開發基金”。

到了早上,相關討論廣泛散佈在推特以及一個不審查內容的社羣論壇上。但那時 450 萬枚代幣中的很大一部分已經在鏈上轉換為其他資產,並且進行了數十億美元的 defi 交易。79%的共識節點,以及所有主要的區塊鏈瀏覽器和輕錢包的端點都遵循了這條新鏈。也許新的開發者基金將為某些開發提供資金,或者也許所有這些都被領先的礦池、交易所及其裙帶所吞併。但是無論結果如何,該基金實際上都成為了既成事實,普通使用者無法反抗。

或許還有這麼一部主題電影。或許會由 MolochDAO 或其他組織進行資助。

這種情形會發生在你的區塊鏈中嗎?你所在區塊鏈社羣的精英,包括礦池、區塊瀏覽器和託管節點,可能協調得很好,他們很可能都在同一個 telegram 頻道和微信群中。如果他們真的想出於利益突然對協議規則進行修改,那麼他們可能具備這種能力。以太坊區塊鏈在十小時內完全解決了共識失敗,如果是隻有一個客戶端實現的區塊鏈,並且只需要將程式碼更改部署到幾十個節點,那麼可以更快地協調客戶端程式碼的更改。能夠抵禦這種社會性協作攻擊的唯一可靠方式是“被動防禦”,而這種力量來自去一箇中心化的群體:使用者。

想象一下,如果使用者執行區塊鏈的驗證節點 (無論是直接驗證還是其他間接技術),並自動拒絕違反協議規則的區塊,即使超過 90% 的礦工或質押者支援這些區塊,故事會如何發展。

如果每個使用者都執行一個驗證節點,那麼攻擊很快就會失敗:有些礦池和交易所會進行分叉,並且在整個過程中看起來很愚蠢。但是即使只有一些使用者執行驗證節點,攻擊者也無法大獲全勝。相反,攻擊會導致混亂,不同使用者會看到不同的區塊鏈版本。最壞情況下,隨之而來的市場恐慌和可能持續的鏈分叉將大幅減少攻擊者的利潤。對如此曠日持久的衝突進行應對的想法本身就可以阻止大多數攻擊。

Hasu 關於這一點的看法:

“我們要明確一件事,我們之所以能夠抵禦惡意的協議更改,是因為擁有使用者驗證區塊鏈的文化,而不是因為 PoW 或 PoS。”

假設你的社羣有 37 個節點執行者,以及 80000 名被動監聽者,對簽名和區塊頭進行檢查,那麼攻擊者就獲勝了。如果每個人都執行節點的話,攻擊者就會失敗。我們不清楚針對協同攻擊的啟動群體免疫的確切閾值是多少,但有一點是絕對清楚的:好的節點越多,惡意的節點就越少,而且我們所需的數量肯定不止於幾百幾千個。

那麼全節點工作的上限是什麼?

為了使得有儘可能多的使用者能夠執行全節點,我們會將注意力集中在普通消費級硬體上。即使能夠輕鬆購買到專用硬體,這能夠降低一些全節點的門檻,但事實上對可擴充套件性的提升並不如我們想象的那般。

全節點處理大量交易的能力主要受限於三個方面:

算力:在保證安全的前提下,我們能劃分多少 CPU 來執行節點?

頻寬:基於當前的網路連線,一個區塊能包含多少位元組?

儲存:我們能要求使用者使用多大的空間來進行儲存?此外,其讀取速度應該達到多少?(即,HDD 足夠嗎?還是說我們需要 SSD?)

許多使用“簡單”技術對區塊鏈進行大幅擴容的錯誤看法都源自於對這些數字過於樂觀的估計。我們可以依次來討論這三個因素:

算力

錯誤答案:100% 的 CPU 應該用於區塊驗證

正確答案:約 5-10% 的 CPU 可以用於區塊驗證

限制之所以這麼低的四個主要原因如下:

我們需要一個安全邊界來覆蓋 DoS 攻擊的可能性 (攻擊者利用程式碼弱點製造的交易需要比常規交易更長的處理時間)

節點需要在離線之後能夠與區塊鏈同步。如果我掉線一分鐘,那我應該要能夠在幾秒鐘之內完成同步

執行節點不應該很快地耗盡電池,也不應該拖慢其他應用的執行速度

節點也有其他非區塊生產的工作要進行,大多數是驗證以及對 p2p 網路中輸入的交易和請求做出響應

請注意,直到最近大多數針對“為什麼只需要 5-10%?”這一點的解釋都側重於另一個不同的問題:因為 PoW 出塊時間不定,驗證區塊需要很長時間,會增加同時建立多個區塊的風險。這個問題有很多修復方法,例如 Bitcoin NG,或使用 PoS 權益證明。但這些並沒有解決其他四個問題,因此它們並沒有如許多人所料在可擴充套件性方面獲得巨大進展。

並行性也不是靈丹妙藥。通常,即使是看似單執行緒區塊鏈的客戶端也已經並行化了:簽名可以由一個執行緒驗證,而執行由其他執行緒完成,並且有一個單獨的執行緒在後臺處理交易池邏輯。而且所有執行緒的使用率越接近 100%,執行節點的能源消耗就越多,針對 DoS 的安全係數就越低。

頻寬

錯誤答案:如果沒 2-3 秒都產生 10 MB 的區塊,那麼大多數使用者的網路都大於 10 MB/秒,他們當然都能處理這些區塊

正確答案:或許我們能在每 12 秒處理 1-5 MB 的區塊,但這依然很難

如今,我們經常聽到關於網際網路連線可以提供多少頻寬的廣為傳播的統計資料:100 Mbps 甚至 1 Gbps 的數字很常見。但是由於以下幾個原因,宣稱的頻寬與預期實際頻寬之間存在很大差異:

“Mbps”是指“每秒數百萬 bits”;一個 bit 是一個位元組的 1/8,因此我們需要將宣稱的 bit 數除以 8 以獲得位元組數。

網路運營商,就像其他公司一樣,經常編造謊言。

總是有多個應用使用同一個網路連線,所以節點無法獨佔整個頻寬。

P2P 網路不可避免地會引入開銷:節點通常最終會多次下載和重新上傳同一個塊 (更不用說交易在被打包進區塊之前還要透過 mempool 進行廣播)。

當 Starkware 在 2019 年進行一項實驗時,他們在交易資料 gas 成本降低後首次釋出了 500 kB 的區塊,一些節點實際上無法處理這種大小的區塊。處理大區塊的能力已經並將持續得到改善。但是無論我們做什麼,我們仍然無法獲取以 MB/秒為單位的平均頻寬,說服自己我們可以接受 1 秒的延遲,並且有能力處理那種大小的區塊。

儲存

錯誤答案:10 TB

正確答案:512 GB

正如大家可能猜到的,這裡的主要論點與其他地方相同:理論與實踐之間的差異。理論上,我們可以在亞馬遜上購買 8 TB 固態驅動 (確實需要 SSD 或 NVME;HDD 對於區塊鏈狀態儲存來說太慢了)。實際上,我用來寫這篇博文的膝上型電腦有 512 GB,如果你讓人們去購買硬體,許多人就會變得懶惰 (或者他們無法負擔 800 美元的 8 TB SSD) 並使用中心化服務。即使可以將區塊鏈裝到某個儲存裝置上,大量活動也可以快速地耗盡磁碟並迫使你購入新磁碟。

一群區塊鏈協議研究員對每個人的磁碟空間進行了調查。我知道樣本量很小,但仍然...

此外,儲存大小決定了新節點能夠上線並開始參與網路所需的時間。現有節點必須儲存的任何資料都是新節點必須下載的資料。這個初始同步時間 (和頻寬) 也是使用者能夠執行節點的主要障礙。在寫這篇博文時,同步一個新的 geth 節點花了我大約 15 個小時。如果以太坊的使用量增加 10 倍,那麼同步一個新的 geth 節點將至少需要一週時間,而且更有可能導致節點的網際網路連線受到限制。這在攻擊期間更為重要,當使用者之前未執行節點時對攻擊做出成功響應需要使用者啟用新節點。

互動效應

此外,這三類成本之間存在互動效應。由於資料庫在內部使用樹結構來儲存和檢索資料,因此從資料庫中獲取資料的成本隨著資料庫大小的對數而增加。事實上,因為頂級 (或前幾級) 可以快取在 RAM 中,所以磁碟訪問成本與資料庫大小成正比,是 RAM 中快取資料大小的倍數。

不要從字面上理解這個圖,不同的資料庫以不同的方式工作,通常記憶體中的部分只是一個單獨 (但很大) 的層 (參見 leveldb 中使用的 LSM 樹)。但基本原理是一樣的。

例如,如果快取為 4 GB,並且我們假設資料庫的每一層比上一層大 4 倍,那麼以太坊當前的 ~64 GB 狀態將需要 ~2 次訪問。但是如果狀態大小增加 4 倍到 ~256 GB,那麼這將增加到 ~3 次訪問。因此,gas 上限增加 4 倍實際上可以轉化為區塊驗證時間增加約 6 倍。這種影響可能會更大:硬碟在已滿狀態下比空閒時需要花更長時間來讀寫。

這對以太坊來說意味著什麼?

現在在以太坊區塊鏈中,執行一個節點對許多使用者來說已經是一項挑戰,儘管至少使用常規硬體仍然是可能的 (我寫這篇文章時剛剛在我的膝上型電腦上同步了一個節點!)。因此,我們即將遭遇瓶頸。核心開發者最關心的問題是儲存大小。因此,目前在解決計算和資料瓶頸方面的巨大努力,甚至對共識演算法的改變,都不太可能帶來 gas limit 的大幅提升。即使解決了以太坊最大的 DoS 弱點,也只能將 gas limit 提高 20%。

對於儲存大小的問題,唯一解決方案是無狀態和狀態逾期。無狀態使得節點群能夠在不維護永久儲存的情況下進行驗證。狀態逾期會使最近未訪問過的狀態失活,使用者需要手動提供證明來更新。這兩條路徑已經研究了很長時間,並且已經開始了關於無狀態的概念驗證實現。這兩項改進相結合可以大大緩解這些擔憂,併為顯著提升 gas limit 開闢空間。但即使在實施無狀態和狀態逾期之後,gas limit 也可能只會安全地提升約 3 倍,直到其他限制開始發揮作用。

另一個可能的中期解決方案使使用 ZK-SNARKs 來驗證交易。ZK-SNARKs 能夠保證普通使用者無需個人儲存狀態或是驗證區塊,即使他們仍然需要下載區塊中的所有資料來抵禦資料不可用攻擊。另外,即使攻擊者不能強行提交無效區塊,但是如果執行一個共識節點的難度過高,依然會有協調審查攻擊的風險。因此,ZK-SNARKs 不能無限地提升節點能力,但是仍然能夠對其進行大幅提升 (或許是 1-2 個數量級)。一些區塊鏈在 layer1 上探索該形式,以太坊則透過 layer2 協議 (也叫 ZK rollups) 來獲益,例如 zksync, Loopring 和 Starknet。

分片之後又會如何?

分片從根本上解決了上述限制,因為它將區塊鏈上包含的資料與單個節點需要處理和儲存的資料解耦了。節點驗證區塊不是透過親自下載和執行,而是使用先進的數學和密碼學技術來間接驗證區塊。

因此,分片區塊鏈可以安全地擁有非分片區塊鏈無法實現的非常高水平的吞吐量。這確實需要大量的密碼學技術來有效替代樸素完整驗證,以拒絕無效區塊,但這是可以做到的:該理論已經具備了基礎,並且基於草案規範的概念驗證已經在進行中。

以太坊計劃採用二次方分片 (quadratic sharding),其中總可擴充套件性受到以下事實的限制:節點必須能夠同時處理單個分片和信標鏈,而信標鏈必須為每個分片執行一些固定的管理工作。如果分片太大,節點就不能再處理單個分片,如果分片太多,節點就不能再處理信標鏈。這兩個約束的乘積構成了上限。

可以想象,透過三次方分片甚至指數分片,我們可以走得更遠。在這樣的設計中,資料可用性取樣肯定會變得更加複雜,但這是可以實現的。但以太坊並沒有超越二次方,原因在於,從交易分片到交易分片的分片所獲得的額外可擴充套件性收益實際上無法在其他風險程度可接受的前提下實現。

那麼這些風險是什麼呢?

最低使用者數量

可以想象,只要有一個使用者願意參與,非分片區塊鏈就可以執行。但分片區塊鏈並非如此:單個節點無法處理整條鏈,因此需要足夠的節點以共同處理區塊鏈。如果每個節點可以處理 50 TPS,而鏈可以處理 10000 TPS,那麼鏈至少需要 200 個節點才能存續。如果鏈在任何時候都少於 200 個節點,那可能會出現節點無法再保持同步,或者節點停止檢測無效區塊,或者還可能會發生許多其他壞事,具體取決於節點軟體的設定。

在實踐中,由於需要冗餘 (包括資料可用性取樣),安全的最低數量比簡單的“鏈 TPS 除以節點 TPS”高几倍,對於上面的例子,我們將其設定位 1000 個節點。

如果分片區塊鏈的容量增加 10 倍,則最低使用者數也增加 10 倍。現在大家可能會問:為什麼我們不從較低的容量開始,當使用者很多時再增加,因為這是我們的實際需要,使用者數量回落再降低容量?

這裡有幾個問題:

區塊鏈本身無法可靠地檢測到其上有多少唯一使用者,因此需要某種治理來檢測和設定分片數量。對容量限制的治理很容易成為分裂和衝突的根源。

如果許多使用者突然同時意外掉線怎麼辦?

增加啟動分叉所需的最低使用者數量,使得防禦惡意控制更加艱難。

最低使用者數為 1,000,這幾乎可以說是沒問題的。另一方面,最低使用者數設為 100 萬,這肯定是不行。即使最低使用者數為 10,000 也可以說開始變得有風險。因此,似乎很難證明超過幾百個分片的分片區塊鏈是合理的。

歷史可檢索性

使用者真正珍視的區塊鏈重要屬性是永久性。當公司破產或是維護該生態系統不再產生利益時,儲存在伺服器上的數字資產將在 10 年內不再存在。而以太坊上的 NFT 是永久的。

是的,到 2372 年人們仍能夠下載並查閱你的加密貓。

但是一旦區塊鏈的容量過高,儲存所有這些資料就會變得更加困難,直到某時出現巨大風險,某些歷史資料最終將……沒人儲存。

要量化這種風險很容易。以區塊鏈的資料容量 (MB/sec) 為單位,乘以 ~30 得到每年儲存的資料量 (TB)。當前的分片計劃的資料容量約為 1.3 MB/秒,因此約為 40 TB/年。如果增加 10 倍,則為 400 TB/年。如果我們不僅希望可以訪問資料,而且是以一種便捷的方式,我們還需要後設資料 (例如解壓縮彙總交易),因此每年達到 4 PB,或十年後達到 40 PB。Internet Archive (網際網路檔案館) 使用 50 PB。所以這可以說是分片區塊鏈的安全大小上限。

因此,看起來在這兩個維度上,以太坊分片設計實際上已經非常接近合理的最大安全值。常數可以增加一點,但不能增加太多。

結語

嘗試擴容區塊鏈的方法有兩種:基礎的技術改進和簡單地提升引數。首先,提升引數聽起來很有吸引力:如果您是在餐紙上進行數學運算,這就很容易讓自己相信消費級膝上型電腦每秒可以處理數千筆交易,不需要 ZK-SNARK、rollups 或分片。不幸的是,有很多微妙的理由可以解釋為什麼這種方法是有根本缺陷的。

執行區塊鏈節點的計算機無法使用 100%的 CPU 來驗證區塊鏈;他們需要很大的安全邊際來抵抗意外的 DoS 攻擊,他們需要備用容量來執行諸如在記憶體池中處理交易之類的任務,並且使用者不希望在計算機上執行節點的時候無法同時用於任何其他應用。頻寬也會受限:10 MB/s 的連線並不意味著每秒可以處理 10 MB 的區塊!也許每 12 秒才能處理 1-5 MB 的塊。儲存也是一樣,提高執行節點的硬體要求並且限制專門的節點執行者並不是解決方案。對於去中心化的區塊鏈而言,普通使用者能夠執行節點並形成一種文化,即執行節點是一種普遍行為,這一點至關重要。

然而,基礎的技術改進是可行的。當前,以太坊的主要瓶頸是儲存大小,而無狀態性和狀態逾期可以解決該問題,並使其能夠最多增長約 3 倍,但不能再多,因為我們希望執行節點比當前更容易。採用分片的區塊鏈可以進一步擴充套件,因為分片區塊鏈中的單個節點不需要處理每筆交易。但即使是分片區塊鏈,容量也有侷限性:隨著容量的增加,最低安全使用者數增加,歸檔區塊鏈的成本 (以及如果沒有人歸檔鏈,資料存在丟失的風險) 就會上升。但是我們不必過於擔心:這些限制足以我們在保證區塊鏈完全安全性的同時每秒處理一百萬筆交易以上。但是要在不損害區塊鏈最寶貴的去中心化特性的前提下實現這一點,我們需要付出更多努力。

原文連結:https://vitalik.ca/general/2021/05/23/scaling.html

ECN的翻譯工作旨在為中國以太坊社羣傳遞優質資訊和學習資源,文章版權歸原作者所有,轉載須註明原文出處以及ETH中文站。若需長期轉載,請聯絡[email protected]進行授權。

免責聲明:

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

推荐阅读