原文標題:《The Limits to Blockchain Scalability》
原文作者: 以太坊創辦人Vitalik Buterin
原文編譯:巴比特
區塊鏈的可擴展性究竟能達到什麼程度?真能如Elon Musk(特斯拉CEO)所願「透過將區塊時間縮短10 倍,將區塊大小增加10 倍從而將手續費降低100 倍」,而又不會導致極端中心化並損害區塊鏈本質的基本屬性嗎?如果不能,那麼區塊鏈的可擴展性究竟能達到什麼程度?如果選擇透過更改共識演算法來進行擴展,又會怎麼樣?更重要的是,如果您更改技術以引入諸如 ZK-SNARK 或分片之類的功能,會怎麼樣?從理論上講,分片的區塊鏈可以持續添加更多的分片,這會不會導致添加的東西更多?
事實證明,有一些重要且相當微妙的技術因素限制了區塊鏈的擴展性,即便是採用分片的區塊鏈也面臨這些問題。在許多情況下,我們都會有相應的擴展性解決方案,但是這些解決方案也有其限制。這篇文章將探討這些可擴展性方案中存在的許多問題。

只需增加參數即可解決所有問題。但代價是什麼?
凌晨2:35,您收到來自世界另一端的伙伴的緊急電話,他正在幫助您管理礦池(或者可能是質押池)。您的夥伴告訴您,從大約 14 分鐘前開始,您的池子和其他幾個池子突然從鏈上分裂出來,原始鏈仍舊承載著 79%的網絡算力。根據您的節點,這個多數鏈(原始鏈)生產的區塊是無效的。這出現了餘額錯誤:金鑰區塊似乎錯誤地將 450 萬枚額外代幣分配給了一個未知地址。
一個小時後,您開始與其他兩個像您一樣迷茫的礦池以及一些區塊瀏覽器和交易所在電報群中溝通。最後你看到某人發出了一個推特連結。該推文寫道:「新的鏈上可持續協議發展基金正式發布」。
到了早上,推特上、社群論壇上開始充滿沒有審查過的論點,各種討論無所不在。但這時候,先前新增的 450 萬枚代幣中的很大一部分已經在鏈上轉換為其他資產,進而進行了數十億美元的 DeFi 交易。 79%的共識節點以及所有重要瀏覽器和輕錢包都正在遵循這條新鏈條。也許這個新的開發者基金將為某些開發提供資金,也許所有這些資金都會被領先的礦池,交易所等吞掉。但是,不管結果如何,該基金在所有意圖和目的上都是既成事實,而普通用戶則無力反擊。

好戲即將上映。也許可以由 MolochDAO 或其他機構資助
這種事情能發生在您的區塊鏈上嗎?您的區塊鏈社群的精英,包括礦池,區塊瀏覽器和託管節點,可能協調得很好。他們很可能都在同一個電報群和微信群組。如果他們真的想對協議規則進行突然更改以促進自己的利益,那麼他們可能會這樣做。以太坊區塊鏈曾在十小時內完全解決了一個共識失敗;如果您的區塊鏈只有一個客戶端實現,並且您只需要將代碼更改部署到幾十個節點,那麼協調更改客戶端代碼的速度就可以更快。使這種協調的社會攻擊無效的唯一可靠方法是透過去中心化社群的積極防禦,也就是使用者。
想像一下,如果用戶正在運行驗證區塊鏈的節點(無論是直接還是透過更高級的間接技術),並自動拒絕破壞協議規則的區塊,即使超過90%的礦工或質押者支持該協議,結局會怎麼樣。如果每個用戶都運行一個驗證節點,那麼這種攻擊很快就會失敗:一些礦池和交易所將分叉,但這看起來很愚蠢。但是,即使只是某些用戶運行了驗證節點,該攻擊也不會為攻擊者帶來勝利。相反,這將導致混亂,因為不同的用戶會看到不同的鏈。至少,隨之而來的市場恐慌和可能持續的鏈分裂將大大降低攻擊者所能獲得的利潤。要解決衝突所需的大量時間成本本身就會讓攻擊者放棄攻擊想法。
讓我們弄清楚一點:你對惡意協議更改的抵抗來自於一種由用戶驗證區塊鏈的文化,而不是 PoW 或 PoS。
——Hasu

這一點可以看Hasu 怎麼說的
如果您的社群由37 個節點運行者和80000 個被動聽眾組成,他們負責用於檢查簽名和區塊頭,那麼攻擊者將獲勝。如果您的社區的每個人都在運行節點,那麼攻擊者將會失敗。我們不知道針對協同攻擊的「牛群免疫」的確切閾值是多少,但是有一件事情是絕對清楚的:節點越多越好,節點越少越糟糕,我們肯定需要不止幾十個或幾百個。
為了最大化可以運行節點的使用者數量,我們將專注於常規的消費級硬體。可以透過要求一些容易購買的專用硬體(例如,從 Amazon 購買)來增加一些網路容量,但是實際上這並沒有為擴展性帶來太多增加。
全節點處理大量交易的能力有三個關鍵限制:
運算能力:在安全運行一個節點的情況下,需要佔用多少百分比的CPU 能力?
頻寬:考慮到目前網路連線的現實情況,區塊可以包含多少個位元組?
儲存:我們可以要求使用者儲存多少 GB 磁碟?另外,讀取速度要求多快? (HDD 機械硬碟可以用嗎?還是說需要固態硬碟?)
許多對使用「簡單」技術可將區塊鏈擴展到多遠的錯誤觀點,是由於對這些數字中的每個都過於樂觀。我們可以一一介紹這三個因素:
錯誤: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」是指「每秒數百萬個比特」;比特是位元組的1/8,因此您需要將廣告的比特數字除以8 以獲得廣告中的位元組數。
就像所有公司一樣,網路供應商經常說謊。
總是有多個應用程式使用相同網路連接,因此節點無法佔用整個頻寬。
p2p 網路不可避免地會帶來其自身的開銷:節點經常最終會多次下載並重新上載同一區塊(更不用說在包含在區塊中先前透過mblockquotepool 廣播的交易)。
Starkware 在2019 年進行了一次實驗,他們首次發布了500 kB 的區塊,這是因為交易資料gas 成本的降低首次使這種可能性成為可能,但實際上有幾個節點無法處理該大小的區塊。此後,處理大區塊的能力得到了改善,並將繼續改善。但是,無論我們做什麼,我們仍然無法天真地獲取以 MB / 秒為單位的平均頻寬,讓自己相信我們可以接受 1 s 的延遲,並且能夠擁有如此大小的區塊。
錯誤: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 限制大幅增加。即使解決了以太坊最大的突出 DoS 漏洞,也只能使 gas 限制增加 20%。
解決儲存大小問題的唯一方法是無狀態(Statelessness)和狀態到期(State expiry)。無狀態允許一類節點在不維護永久性儲存的情況下驗證區塊鏈。狀態到期會釋放出最近未造訪的狀態,需要使用者手動提供繼續維護這些狀態的證據。這兩種路徑都已經使用了很長的時間,而關於無狀態的概念驗證實作也已經開始。這兩項改進相結合,可以極大地緩解這些擔憂,並為大幅提高 gas 限制打開空間。但是,即使在實施了無狀態和狀態到期之後,gas 限制可能也只能安全地增加約 3 倍,然後其他限制再次開始主導。
分片(Sharding)從根本上克服了上述限制,因為它使區塊鏈中包含的資料與單一節點需要處理和儲存的資料脫鉤,而不是節點透過親自下載和執行來驗證區塊,而是使用先進的數學和密碼技術來間接驗證區塊。
結果就是,採用分片的區塊鏈可以安全地擁有非分片區塊鏈無法做到的非常高的交易吞吐量。這確實需要很多密碼學上的聰明才智來創建能成功地拒絕無效區塊的完全驗證的有效替代品,但是可以做到這一點:該理論已經建立並且基於規範草案的概念驗證已經在研究之中。

以太坊正計畫使用二次分片,其整體可擴展性受到以下事實的限制:節點必須能夠處理單一分片和信標鏈,而信標鏈必須對每個分片執行一定的管理工作。如果分片太大,則節點將無法再處理單一分片;如果分片太多,則節點將無法再處理信標鏈。這兩個約束的乘積就形成了一種上限。
可以想像,可以透過三次分片甚至指數分片來走得更遠。在這種設計中,資料可用性採樣肯定會變得更加複雜,但可以做到。但是以太坊不會採用比二次分片更高的分片了。原因是,從交易的分片的分片實際上無法實現額外的擴展性增益,除非其他風險開始變得不可接受地高。
可以想像,即使只有一個用戶願意參與其中,非分片的的區塊鏈也可以運行。而分片區塊鏈不是這樣的:沒有單一節點可以處理整個鏈,因此您需要足夠的節點,以便它們可以一起處理至少區塊鏈。如果每個節點可以處理 50 TPS,而整條鏈可以處理 10000 TPS,則該鏈至少需要 200 個節點才能存活。如果該鏈在某個時候少於 200 個節點,則要么節點無法再跟上鏈,要么節點停止檢測無效塊,否則可能會發生其他不良情況,具體取決於節點軟體如何設定的。
實際上,由於需要冗餘(包括用於資料可用性取樣),因此安全的最小節點數量比單純的「鏈TPS 除以節點TPS」高出幾倍;對於上面的範例,我們說是1000 個節點。
如果分片區塊鏈的容量增加 10 倍,則最小用戶數也會增加 10 倍。現在,您可能會問:為什麼我們不從容量很小的時候開始開始,在看到大量用戶時增加容量,在用戶數量減少時減少容量?
這裡面其實有一些問題:
區塊鏈本身無法可靠地檢測到有多少唯一用戶,因此這將需要某種治理來檢測和設定分片數量。針對容量限制的管理很容易成為分裂和衝突的根源。
如果許多使用者突然並意外退出,該怎麼辦?
增加啟動分叉所需的最小使用者數,使得惡意接管變得更加困難。
最低使用者數為 1,000,幾乎肯定是可以的。另一方面,最低用戶數設為 100 萬,這肯定是不行。甚至將最低用戶數設為 10,000,也是有點冒險的。因此,似乎很難證明擁有超過數百個分片的分片區塊鏈是合理的。
使用者真正珍視的區塊鏈的重要屬性是永久性。當公司破產或失去維護該生態系統的興趣時,儲存在伺服器上的數位資產將在 10 年內停止存在。另一方面,以太坊上的 NFT 是永久的。

是的,到2372年,人們仍能夠下載和檢查您的加密貓。
但是一旦區塊鏈的容量過高,儲存所有這些資料就會變得更加困難,直到某個時刻存在很大的風險,歷史的某些部分最終將…沒人儲存。
量化這種風險很容易。以區塊鏈的資料容量(MB / 秒)為單位,乘以〜30 即可得到每年以 TB 為單位儲存的資料量。目前的分片計劃的資料容量約為 1.3 MB / 秒,因此約為 40 TB / 年。如果將其增加 10 倍,則將變為 400 TB / 年。如果我們希望資料不僅可以訪問,而且可以方便地訪問,那麼我們還需要元資料(例如,對匯總交易進行解壓縮),因此,這就是每年 4 PB,或者十年後達到 40 PB。網路檔案(Internet Archive)才使用 50 PB。因此,這是分片區塊鏈安全的合理體積上限。
因此,看起來在這兩個維度上,以太坊分片設計實際上已經大致針對相當合理的最大安全值。常數可以增加一點,但不能增加太多。
嘗試擴展區塊鏈的方法有兩種:基本的技術改進和簡單地增加參數。首先,增加參數聽起來很有吸引力:如果您是在餐巾紙上進行數學運算,這很容易讓自己相信家用筆記型電腦每秒可以處理數千筆交易,不需要ZK-SNARK,匯總或分片。不幸的是,有許多微妙的理由可以解釋為什麼這種方法從根本上是有缺陷的。
運行區塊鏈節點的電腦無法花費100%的CPU 能力來驗證區塊鏈;他們需要很大的安全邊際來抵抗意外的DoS 攻擊,他們需要備用容量來執行諸如在記憶體池中處理交易之類的任務,並且您不希望在電腦上運行節點以使該電腦無法同時用於任何其他應用程式。頻寬同樣也有水分:10 MB / s 的連線並不代表您每秒可以擁有 10 MB 的區塊!也許是每 12 秒才能有 1-5 MB 的區塊。這與與存儲相同。增加對運行節點的硬體要求以及將節點的運行限制在專門的參與者上並不是一種解決方案。對於去中心化的區塊鏈而言,對於普通用戶而言,能夠運行節點並形成一種文化,即運行節點是一種普通活動,這一點至關重要。
另一方面,根本的技術改進是可行的。目前,以太坊的主要瓶頸是儲存大小,而無狀態性和狀態到期可以解決此問題,並允許將其增加最多約3 倍——但不能更多,因為我們希望運行一個節點比現在更容易。採用分片的區塊鏈可以進一步擴展,因為分片的區塊鏈中單一節點不需要處理每筆交易。但即使是分片區塊鏈,容量也有限制:隨著容量的增加,最小安全用戶數增加,歸檔區塊鏈的成本(以及如果沒有人去歸檔鏈,資料存在遺失的風險)就會上升。但是我們不必太擔心:這些限制足夠高,以至於我們可以在保證區塊鏈的完全安全性的同時每秒處理超過一百萬筆交易。但是在不犧牲使區塊鏈如此有價值的去中心化性質的前提下,還將需要做一些工作。
特別感謝 Fepx Lange,Martin Swende,Marius van der Wijden 和 Mark Tyneway 為本文提供的回饋和評論。
原文連結
歡迎加入律動 BlockBeats 官方社群:
Telegram 訂閱群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方帳號:https://twitter.com/BlockBeatsAsia