上一講中,我們簡單提到了什麼是分片。今天的文章我們會詳細介紹以太坊的分片技術。(Finally!)

什麼是分片?

分片是數據庫系統中抽離而來的一個詞。我們先來介紹下數據庫中分片的概念。假設你的網站上有大量的數據庫存儲,這不僅會導致數據搜索速度減慢,還會影響可擴展性。這種情況下我們可以做些什麼呢?

能不能把數據橫向切分成小的數據表格,並把他們存儲在不同的數據庫服務器中?

你或許會問爲什麼要進行橫向切分而不是垂直切分呢?這是由於數據表格本身的設計導致的。

我們現在進行垂直切分。

注意到了嗎?垂直切分後會把整個數據庫表切割成兩個完全不相干的數據表格(A 和 B 是一個;A+B 和 A-B 是一個)。

但是橫向切分的話,還是同一個由 A, B, A+B, A-B 構成的數據庫,只不過每個數據庫中的數據存量減少了。這些小的數據庫就是大的數據庫的分片。每一個分片的表格結構都相同。

區塊鏈中的分片

上一講中,我們提到過以太坊共識的問題在於所有的節點都必須對同一筆交易進行計算和確認。整個計算過程又慢又繁瑣。分片技術可以如何改善這個問題呢?

現在我們來設想一下:整個以太坊區塊鏈就是一個“萬國領土”(global state),可以分割給所有人。這個萬國領土的默克爾樹根會切分成大大小小不同的分片根,每一個分片根都擁有自己的國度。讓我們以默克爾樹的形式把這些國度表現出來:

這就是整個萬國領土切分成多個小國的簡單結構圖。現在讓我們來看一下內部機制。

分片啓動後會發生什麼呢?

*萬國領土被分割成多個分片
*每一個獨特的賬戶都代表着一個分片
*只有同一個分片裏的賬戶能相互轉賬。

在以太坊的開發者大會中,Vitalik 是這樣解釋分片的:

假設以太坊被分割成成千上萬個小的島嶼。每個島嶼都是自治的。每個島嶼都有自己的特色(features),島嶼上的每個人都可以跟其他島民互動,並且隨意享用這個島嶼的特色。如果你想跟其他島嶼互動,就必須使用某種特定的協議。

(注:feature 是指一個系統的功能,特點,是一種它可以提供的東西)

那麼問題來了,這種分片技術對區塊鏈有什麼影響呢?我們先來看一下比特幣和以太坊中一個正常的區塊長什麼樣子?

一個區塊中由區塊頭和包含所有交易的區塊主體構成。所有交易的默克爾根都存在在區塊頭中。

現在讓我們來自問一下:比特幣真的需要區塊嗎?真的需要區塊鏈嗎?中本聰本可以把上一筆交易的哈希記錄在一筆新的交易之中,用這種簡單的方式就可以構成一條交易鏈(transaction chain)。

把交易都記錄在區塊中的目的是爲了創造一層交互,讓整個過程更加可擴展。以太坊想做的是實現兩層交互。

第一層

第一層是交易組。每一個分片都有自己的交易羣。交易羣包括交易羣頭和交易羣主體。

交易羣頭包括左右兩個部分。左側包含的信息如下:

*分片 ID:交易組所屬的分片 ID (圖片中爲 43)
*前狀態根:這是交易執行前分片 43 的根狀態。
*後狀態根:交易執行後分片 43 的根狀態。

右側信息如下:

*右側是隨機選取的需要在分片內確認交易的確認者。
*交易組主體
*包含了分片中所有交易的 ID。

第一層的特徵

*每一筆交易對應着它所屬分片的 ID。
*某特定分片中的一筆交易表明這筆交易的發起和接收賬戶都在這個特定的分片中。
*交易羣組中的交易只存在於分片 ID 之中,具有特定的前後狀態根。

現在我們來看一下第二層交互

別跑!其實非常簡單。

這就是一般的區塊鏈結構,只不過現在包括兩個主要的根:

*狀態根 (state root)
*交易羣根

狀態根代表了整個以太系統的根。我們之前提到過,這個系統被切分成大大小小的分片,對應着它們各自的分國度。

交易羣根包含了某特定區塊裏所有的交易羣。

第二層的特徵

第二層是一個簡單的區塊鏈,記錄交易羣而不是交易本身。交易羣合法的唯一條件是:

*前狀態根與整個系統的分片根相符。
*交易羣組中的所有簽名都已經得到了確認。

交易羣進入區塊後,整個系統的根就變成了特定分片 ID 的後狀態根。

那麼跨分片通信是怎麼實現的呢?還記得之前的島嶼比喻嗎?

分片就相當於島嶼。它們如何互相聯繫呢?記住,分片的目的是讓很多平行交易同時發生來提高性能。如果以太坊允許任意的跨分片交流,那麼整個分片就毫無意義了。

因此以太坊協議要如何設計來允許跨分片通信呢?以太坊使用收據實現跨分片通信。

如你所見,每筆交易的收據只需通過這個交易羣的多個默克爾根就可以輕鬆訪問。分片中的每一筆交易都會做兩件事情:

*改變所屬分片的狀態
*產生收據

數據存儲在分佈式共享內存中,其他分片可以看到,但是無法修改。通過數據跨分片交流如下:

實行分片技術的挑戰有哪些?

*我們需要一種機制來知道每個節點執行了哪個分片,這種機制還要能保證系統安全又高效。
*根據以太坊研究員 Vlad Zamfir 的說法,在實現分片之前需要以太坊需要先轉到 POS 算法。節點之間可以互不信任,但是也需要能夠達成共識。如果某筆交易分割成多個分片,並分配給節點 A 和節點 B,節點 A 和 B 需要利用某種機制來證明自己完成了分片中各自對應的工作量。

總結

隨着以太坊的進一步崛起,大都會和寧靜階段的到來,分片對以太坊越來越重要。如果以太坊想要演化成新一代的互聯網,必須要解決可拓展性問題。採用分片後的以太坊會如何發展,讓我們拭目以待。

來源鏈接:None