翻譯:Kyle
區塊鏈的可擴展性究竟能達到什麼程度? 真能如 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 網路不可避免地會帶來其自身的開銷:節點經常最終會多次下載並重新上載同一區塊(更不用說在包含在區塊中之前通過 mempool 廣播的交易)。
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 倍——但不能更多,因為我們希望運行一個節點比現在更容易。 採用分片的區塊鏈可以進一步擴展,因為分片的區塊鏈中單個節點不需要處理每筆交易。 但是即使是分片區塊鏈,容量也有局限性:隨著容量的增加,最小安全用戶數增加,歸檔區塊鏈的成本(以及如果沒有人去歸檔鏈,數據存在丟失的風險)就會上升。 但是我們不必太擔心:這些限制足夠高,以至於我們可以在保證區塊鏈的完全安全性的同時每秒處理超過一百萬筆交易。 但是在不犧牲使區塊鏈如此有價值的去中心化性質的前提下,還將需要做一些工作。
特別感謝 Felix Lange,Martin Swende,Marius van der Wijden 和 Mark Tyneway 為本文提供的反饋和評論。
冷萃財經原創,作者:awing,轉載請註明出處:https://www.lccjd.top/2021/05/25/v%e7%a5%9e%e6%9c%80%e6%96%b0%e7%a0%94%e7%a9%b6%ef%bc%9a%e5%8c%ba%e5%9d%97%e9%93%be%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e7%9a%84%e5%b1%80%e9%99%90%e6%80%a7%ef%bc%8c%e5%8f%8d%e9%a9%b3%e9%a9%ac-2/?variant=zh-tw
文章評論