解放以太坊 2.0 的靈魂:分片(Sharding)

#26

嗨,早安!

最近這兩篇都是技術文章,因為理解的門檻較高,很多人無法辨別區塊鏈的能耐在哪,所以就吹捧或貶低。不過只要看懂之後,就能瞭解區塊鏈非全能,而是還在非常早期階段。

週二我在〈區塊鏈的三難抉擇〉的內文裡,提到區塊鏈如果要同時兼顧安全、效率及開放性,目前有兩種層次的解決方案正在開發中。

首先,完成度比較高的是閃電網絡(Lightning Network)雷電網絡(Raiden Network)這種第二層(layer 2)的解決方案。方法是把多數的交易轉移到區塊鏈下(off-chain),藉此減輕區塊鏈上(on-chain)的負擔。閃電網絡已經在 3 月正式上線。

另外,屬於第一層(layer 1)解決方案的分片技術(sharding),還在早期開發階段,目的是直接提升區塊鏈上(on-chain)的交易效率。今天我會告訴你分片技術是如何進行,以及預期可以達成什麼效果。


要提升以太坊的整體交易速度,最直覺的第一層解決方案,當然不是聽起來很嚇人的分片技術。而是直接多創建幾個以太坊出來即可。

換句話說,現在以太坊每秒處理 6 筆交易(Transactions Per Second),那麼只要創造 10 個以太坊出來,彼此相互溝通,不就可以每秒處理 60 筆交易了嗎?

這不是我發明的爛點子,而是資料庫(database)領域常用的方法,用來解決資料庫讀寫效率低落的問題。資料庫的用途是儲存、讀取資料,能夠讓使用者高效率的讀寫資料,就是一個好的資料庫。

對資料庫不熟悉的人,可以直接把資料庫想像成 PChome 24h 購物網站的物流倉庫。能夠快速的進貨、出貨的物流倉儲,才是一個好的倉儲管理。假設 PChome 無法在 24 小時內把商品送到台南,最直覺的方法就是在台南多建立一個物流倉庫。哪個縣市配送太慢,就去那個縣市設立一個物流倉庫,馬上就可以解決問題。

不過,這個方法明顯有三個障礙。首先,每個倉庫的存貨種類必須要相同,假如有台南的消費者要買護唇膏,結果只有台北的倉庫有庫存,那也無法在 24 小時內到貨。第二,這個方法必須耗費大量成本蓋倉庫,但是每蓋一個倉庫就只能快一點點,增加的效益有限。第三,不只蓋倉庫的成本,倉庫人力也同樣必須倍數擴增,否則反而服務水準下降。

要讓配送效率有顯著的進步,終究還是得回到倉儲管理。同樣道理套到資料庫、區塊鏈領域,也是完全適用。

光是新增幾個一樣的東西,很可能只是事倍功半。尤其是區塊鏈安全性是由礦工所貢獻的運算能力保護,如果新增了 10 個以太坊,但是礦工運算能力沒有同樣增加 10 倍,就等於是犧牲了 10 倍的安全性,換取 10 倍的效率。

所以,以太坊不是採取上述新建更多倉庫的方法,而是反方向把一個以太坊切成好幾個小片段的「分片技術(sharding)」。

分片技術:用既有資源改善規模化(scalability)問題

分片技術在資料庫領域,就是把一個完整的資料庫切分成幾個小的片段資料庫,讓每個片段資料庫都可以同時獨立運行。

舉例來說,下圖就是一份存有 4 筆資料的資料庫,分片在這個例子內就是橫向切割,讓資料依然是依照相同的類別分類,但是每一份都變成小片段了。因此,未來我要找 1、2 的數據就到上方的片段資料庫找,要找 3、4 就到下方的片段資料庫找。

你可能會問,我可以縱向切割嗎?可以。但是這樣就讓一個資料庫變成兩個不同的資料庫,而不是一個資料庫的「兩個片段」,這反而可能降低了資料的讀取、寫入效率。因此,一個資料庫應該如何切割最恰當,得根據資料的類型和使用情境單獨設計,很難有一招打天下的方法。

資料庫分片 / 圖片來源

那麼在區塊鏈上,分片技術能怎麼解決區塊鏈的規模化(scalability)問題呢?

區塊鏈目前的共識機制,是每一台電腦(full node)都必須花時間驗證區塊鏈上每一筆交易的正確性。如果你把交易想像成是學生繳交的作業,而電腦是批改作業的老師。現在區塊鏈共識機制的做法,是每一位學生繳交的作業,都必須經過全校每一位老師的批改才行。

這種做法當然非常沒有效率,只要作業量增加,全校每位老師就都得熬夜改作業了。這就是現在區塊鏈上的交易量一增加,就會有很多排隊等待被驗證的交易出現的原因,也就是規模化(scalability)或效率問題。這種批改作業的機制,是為了確保每一份作業都沒有改錯,也就是確保區塊鏈上的交易安全性足夠。但是,你一定馬上就能想到更有效率的方法。

如果現在全校有 20,000 份作業,總共有 1,000 位老師。原本每位老師都要看 20,000 份作業,每份作業都被看過 1,000 次。

但是,如果把全校 1,000 位老師,每 10 位分成一組,總共分成 100 組彼此分工合作。每份作業只交給其中一組的 10 位老師批改一次,其實每份作業仍然會被看過 10 次,已經很難出錯了。但是每位老師的工作量,就只剩下原本的百分之一。在這個簡單的例子裡面,每一組老師和他們所負責批改的作業,就是一個分片(shard)。

你可能會說,那為什麼不每一位老師自成一組,那不是能分成更多組,就能更有效率嗎?

當然。但是這就變成一個老師定生死的集中式系統,而不是多個老師互相制衡的去中心化系統。所以,每一個分片還是必須要有足夠多位老師,來確保批改作業的正確性。又不用太多老師擠在同一組,導致資源的浪費。但也不能太少老師,導致區塊鏈失去去中心化的特色。只要每一個分片獨立運作,就可以兼顧效率、安全性及去中心化的特性。

總結來說,你可以將分片技術視為在足夠的安全性前提之下,犧牲原本「多餘的」安全性,來換取運作效率的方法。

分片技術的挑戰

首要的考量是安全性。

以太坊在第一階段,預計將整個以太坊切成 100 個分片,也就是將老師分成 100 組的意思。過去如果一個學生要作弊,他必須買通超過 500 位老師(50%)以上,都將他的錯誤答案打勾。但是,現在這位作弊的學生只要知道自己的作業由哪一組老師批改,就只要買通那一組老師(1%)即可。

因此,分片技術必須要搭配一套隨機分配(reshuffle)的機制,來避免這種作弊手段。只要老師不知道自己未來會被分配到哪一組,也就不知道會改哪位學生的作業,那就很難作弊。

除了安全性之外,第二個分片技術的重點是分片與分片之間的溝通(Cross-shard Communication)。

回到分片技術的最初目的,是要藉由區塊鏈每一個分片的「獨立運作」,來增加區塊鏈的交易吞吐量。既然已經把老師分成 100 組,那就希望跨組之間的互動少一點,否則我這組老師批改的作業還要跨組傳給另一組老師批改一次,那就跟沒有分組一樣了。

之所以會有跨組的互動,是每一個分片內除了老師(collator)被切成好幾個小組獨立批改作業(transaction)之外,全校的學生(account)也被切成同樣數量的分片。作業的舉例有其極限,因為交易是得從一方帳戶扣錢,另一方帳戶增加錢。這時候兩組老師的其中一方,得確認轉出的帳戶餘額是否足夠,另一方的老師得確認收到的錢是否已經提領。

因此,分片技術必須要設計一套安全的跨分片溝通機制(protocol),來確保一方有把錢付出去,另一方也有收到錢。但這樣的跨分片協作也不能過度頻繁,導致影響區塊鏈的效率。

今天文章的重點在於解釋分片技術是透過分組獨立運作的方式,來解決區塊鏈的規模化問題。分片技術正好跟我們一開始所說,多創建幾個區塊鏈的方法相反,是把一個區塊鏈切成好幾個小片段平行處理。在區塊鏈礦工的運算能力維持不變的情況下,提升區塊鏈的運作效率。

分片的概念從 2015 年以太坊第一次開發者大會,就已經被創辦人 Vitalik Buterin 提出。根據以太坊在 Sharding FAQ 的規劃,分片技術總共分為六個階段(phase),目前進度仍在第一階段開發中,離正式上線還有好幾年

如同一開始所說,當我們知道區塊鏈的能耐到哪,就能夠相對理性的判斷哪些應用適合區塊鏈,而哪些只是泡沫。

本文感謝陳昶吾、梁智程協助審稿