深度 | Eth2.0將要實現的Sharding(分片)是什麼?

買賣虛擬貨幣

來源 | Hackernoon

譯者 | 火火醬

責編 | Carol

出品 | 區塊鏈大本營

以太坊是所有區塊鏈中一直與分片概念同步的底層平臺,想要理解為什麼以太坊開發者社羣想要實現分片,重點是要理解分片是什麼,以及這個解決方案為何如此有吸引力。

根據ETH Gas Station的統計,向以太坊區塊鏈中新增一項交易大約需要1.78分鐘,每32秒生成一個新的區塊,平均每秒處理15-20個交易。這個生態系統創造了一個有利於礦工而非使用者的環境,如果使用者想要優先處理他們的交易,就必須要提高他們的gas價格。

由於低吞吐量、高延遲和高價格限制了以太坊網路效能,因此,目前以太坊上不太適合部署需要強可擴充套件性的服務和應用程式。

什麼是分片?

簡單來講,分片是一種分割槽方式,可以在P2P網路中分散計算任務和儲存工作負載,經過這種處理方式,每個節點不用負責處理整個網路的交易負載,只需要維護與其分割槽(或分片)相關的資訊就可以了。

為了進一步解釋分片,我們可以看一下最簡單的分片示例。以太坊的創始人Vitalik Buterin稱其為“透過1000山寨幣增加擴充套件性”。

在本例中,不是執行單條區塊鏈,而是執行多條區塊鏈,我們將每條區塊鏈稱為一個shard(分片),而不是稱之為區塊鏈。反過來說,每個分片都有自己的驗證器網路或者節點網路,可以使用PoW演算法挖掘區塊,也可以透過質押(staking)或投票(voting)來挖掘區塊。

分片所面臨的挑戰

在嘗試去使用分片時,我們面臨的第一個問題是,由於每個分片都有自己的節點集,所以每個分片的安全性都低於像以太坊這樣的單鏈。

所以如果具有x數量節點的以太坊決定硬分叉並分裂為一條分片鏈,且將整個網路分佈在超過10個分片上,那麼每個分片將具有原鏈1%的安全性。意味著透過控制原鏈5.1%(而不是51%)的節點,每個分片都可能會被破壞。

我們遇到的第二個問題是:“我們如何選擇哪個節點驗證哪個分片?”對於一個不怎麼好的參與者來說,只有當這5.1%的網路節點都在同一個分片中進行驗證時,要控制這些節點才會是個問題。

允許節點選擇其在哪個分片中驗證可能會導致頻繁的網路攻擊,因此將攻擊風險減到最低的最佳方法,就是不允許節點選擇驗證哪個分片

實際上,所有的分片架構都是隨機為分片分配節點的。將節點分配給分片需要非特定於分片的計算,並且幾乎所有這些設計都使用單獨的鏈來處理維護整個分片和節點網路。該鏈在以太坊中被稱為信標鏈,負責生成隨機數,將節點分配給分片,捕捉單個分片的快照,處理握手權益和其他各種功能。

信標鏈有一些缺點。因為它們負責前面提到過的記錄儲存計算,所以網路使用的分片越多,信標鏈需要做的工作就越多,那麼沒有分片的網路可能會遇到低吞吐量加高延遲的問題,因此分片網路的可擴充套件性有其天然的侷限性。

然而,分片網路具有可乘性,因此如果網路效率得到改善,導致網路中節點處理交易的速度提高四倍,那麼信標鏈就能夠處理四倍的分片數量,將網路速度提高16倍。

如何將資料分割為分片?

讓我們先看看節點通常在區塊鏈上執行的功能:

  1. 處理/驗證交易

  2. 將這些交易以及它們挖掘的區塊中繼給網路上的其他節點

  3. 儲存所有交易的歷史

隨著網路的發展,節點需要能夠跟上網路的需求及其發展需要。

  1. 要增加處理中的交易數量需要每個節點都增加更多計算力。

  2. 中繼的交易越多,需要節點提供的寬頻就越大。

  3. 要在區塊鏈上儲存所有的資料也就需要節點逐漸增加更多的儲存空間。

觀察這三個引數,你會發現,無論每秒的交易數或中繼的交易數是否增加,資料儲存量都會增加。

在編寫這篇文章之前,就已經提出過對儲存進行分片但不對交易進行分片的方法,而且有些專案已經實現了交易處理(而非儲存)的分片。

然而,最常見的分片型別被稱為“狀態分片(State Sharding)”,包括每個分片中構建其自己區塊鏈的節點,該區塊鏈包含整個全球網路中僅僅影響它們自己那部分的交易,這意味著節點只需要儲存它們分片的交易歷史,處理影響它們分片的交易,並在它們的分片中中繼這些交易。

接下來,我們將介紹跨分片交易、無效交易和惡意行為。

區塊鏈的分片和縮放

上文中,我們討論了分片是什麼,分片要解決的問題以及要有效實現分片需要克服的一些障礙。那麼接下來我們將討論跨分片交易無效交易惡意行為

正如上文描述的分片的基本型別並不是非常有效或者實用的分片方法,因為它們不能彼此通訊,所以它們就像單一區塊鏈一樣。以簡單的付款為例,如果使用者A和使用者B在同一個分片上,那麼分片中的驗證器能夠毫無障礙地處理交易,但是當他們的賬戶在不同的分片上時,會出現什麼狀況呢?

使用者A在1#分片上,使用者B在2#分片上。各個分片上的驗證器將無法借記或貸記使用者的賬戶,因為它們沒有彼此分片的許可權。

然而,這個問題也是有解決方案的,下面就讓我們來更詳細地看一看其中一些解決方案:

同步(同時)跨分片交易

在這種情況下,當在1#分片的使用者A要向在2#分片的使用者B傳送資金時,將同時在每個分片生成包含與此交易相關的狀態轉換(state transition)的區塊,並且每個分片上的驗證器會協同工作以確認這筆交易。

早在2018年初,Vitalik Buterin就已提議將區塊與此解決方案合併。

(參見來源:https://ethresear.ch/t/merge-blocks-and-synchronous-cross-shard-state-execution/1240

非同步跨分片交易

這是一個較為容易完成的操作,並且協調起來也要簡單的多,因此它比同步交易要更受歡迎。

同樣,我們將使用1#分片上的使用者A想要給2#分片上的使用者B匯款的例子。在此場景下,負責貸記使用者B的賬戶的分片只有在有足夠證據證明負責借記使用者A賬戶的分片已經完成後,才會驗證這次交易中B自己負責的部分。

但是,這種方法並不是完美的,其中一個分片的一個區塊被捨棄的可能性並不為零。當概率非零時,無論概率有多小,也仍是一個不容忽視的弱點。

我們可以透過下圖來詳解一下原因:

這個區塊鏈有兩個分片,巧合的是,它們都剛好在交易被合併到1#分片中的A區塊和2#分片中的X’區塊時分叉。

當這樣的分叉發生時,分片必須捨棄一條鏈並接受另一條鏈。此時,如果鏈A、B等成為1#分片中接受的鏈,W’、X’等成為2#分片中接受的鏈,那麼交易將順利完成,皆大歡喜。

如果1#分片接受A’、B’等,2#分片接受W、X等,那麼整個交易將失敗,但這也是一種可以令人接受的結果,因為可以重新傳送交易。

但是如果1#分片接受鏈A、B等,2#分片接受鏈W、X等的話會發生什麼呢?交易中的一部分(A、B等)被完成,但另一部分(W、X等)會被捨棄。

分片中的惡意節點

現在,你已經對分片及其工作原理有了更深入的理解,你可能會覺得滿足了,也可能會有更多的問題,但至少還要考慮一件事:惡意節點。

1、惡意節點

這種情況非常常見,當有可能出現大交易日時,無論是什麼系統,都會有人想攻擊該系統。

2、批准無效區塊

惡意節點可能會透過建立企圖更改網路的區塊來攻擊網路。假設使用者1有10枚硬幣,使用者2有0枚硬幣。當使用者1想將這10枚硬幣傳送給使用者2時,網路上的惡意節點可能會試圖建立一個區塊,終端使用者1將失去所有的硬幣,而使用者2將擁有1000枚硬幣。

在未分片的常規區塊鏈中,這種型別的攻擊是不可能發生的,因為每一個節點都會驗證每一個區塊,如果發現一個無效區塊,所有的節點(無論是否是礦工)都會拒絕該區塊。

對於經典的區塊鏈來說,無論惡意節點建立了多少區塊,或者建立速度有多快,網路的誠實節點們都將始終忽略這些區塊並繼續構建誠實的區塊鏈。

如果因為惡意節點想透過構建無效區塊來向自己的賬戶充值大量代幣,導致一條鏈分裂成兩條。在這種情況下,惡意節點的數量甚至可能會超過誠實節點的數量。較短的鏈是誠實鏈,較長的鏈則是無效的鏈。

在常規的非分片區塊鏈中,每個參與者都有責任驗證他們收到的所有區塊並確認其狀態,因此任何在區塊鏈中擁有既得利益的人都會立即識別出無效鏈,並忽略(在本例中)較短的鏈。

因為參與者無法驗證每個分片上的每筆交易,所以分片鏈會稍微複雜一些。因此我們必須弄清楚如何確認分片的整個歷史中都沒有無效區塊。

由於信標鏈通常不具備驗證每個分片中的每個區塊的能力,所以我們需要其他的解決方案來確保每條鏈的完整性。

假設網路透過聯合操作,每個分片都具有拜占庭容錯機制(Byzantine Fault Tolerance mechanism),並且分片控制中的惡意節點小於66.667%,那麼就能構建一個機制,如果出現任何試圖生成無效區塊的行為,其中一個或多個誠實節點可以證實系統存在無效區塊,系統就會收到警報。

如果超過66.667%的分片由惡意節點控制,那麼理論上是可以對區塊進行最終確認的,然而只要分片中有一個節點是誠實的,就可以構建一種允許誠實節點質疑惡意節點的機制。

好了,看完這篇相信你已經對分片有所理解了。公鏈的效能提升是個長期的過程,無論是分片還是其他方法都有利有弊。

免責聲明:

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

推荐阅读

;