分片技術-區塊鏈底層 Layer 1 擴容方案

什麼是分片(Sharding)

分片技術並不是什麼創新的概念,早在區塊鏈技術出現之前,就已經在傳統數據庫中運作了,主要用於大型商業數據庫的優化。其概念就是將數據庫中的數據,切割成很多數據分片,再將這些分片分配到不同的伺服器中儲存,如此一來,就不會因為短時間內出現大量數據訪問請求,而出現單一伺服器壓力過大的問題。

在傳統的區塊鏈網路中,交易必須有網路中的每個節點進行確認,以保證交易的安全,然而這也是導致交易速度難以提升的主因之一。

分片技術 - pow

而把分片技術運用到區塊鏈網路中的方式,是將區塊鏈網路劃分成若干個子網路 (或稱分片,shard),每一個子網路都會包含一部分節點,網路中的資料儲存與交易,會被隨機分配到各個分片中做處理,如此一來,每個節點只需要處理一小部份的工作,且不同分片上的交易可以並行處理,網路的交易速度便能因此獲得提升。

分片技術 - 分片

另外,傳統的區塊鏈大部分都是單鏈結構,所有礦工都會相互競爭取下一個區塊的計帳權。且大部分區塊鏈產生區塊的平均時間是固定的,例如比特幣平均每 10 分鐘產生一個區塊,即便有越來越多的礦工加入挖礦行列,區塊鏈也會自動提升挖礦難度,以確保區塊產生速度固定在每 10 分鐘產生一個區塊。簡單來說,區塊鏈網路中算力的提升沒辦法增加交易速度,這也就是為什麼區塊鏈會是不可擴展。

如果要用簡單一點的例子來形容的話,就好比你把汽車改車 V8 大馬力引擎,但汽車電腦卻設置了速度限制,不能開超過 60。

延伸閱讀: 比特幣挖礦

在分片技術中,區塊鏈算力的提升,意味著分片數量的提升。也就是說網路中所投入的算力越多,能夠同時並行處理的交易也會越多,整個網絡的交易速度也會線性提升。

運用在區塊鏈上的分片技術,又能夠分為三種 : 網路分片(network sharding)、交易分片(transaction sharding)、狀態分片(state sharding)。

網路分片(network sharding)

由於區塊鏈的區塊與區塊之間具有強連結性,也就是說,每一次的區塊新增,都需要礦工互相通信確認新區塊的有效性,雖然這能確保鏈上交易紀錄的正確性,卻也導致區塊鏈結構上存在不可擴展性的缺點。因此,分片的第一步,需要先將區塊鏈網路分片,再盡量降低互相通信的前提下,由各個分片處理鏈上交易。說的簡單一點就是將礦工隨機分組,再將工作分配給各組礦工獨立驗證。

網路分片涉及到的問題是,分片後如何確保鏈上交易安全性能夠維持。

  1. 隨機分配
    礦工分組之後,網路分片第一個會面臨到的問題是,攻擊者的攻擊成本會大幅降低。下方這張圖說明的是,本來假設有 100 個礦工, 要掌握 51 個才能癱瘓網路,自從有分片後, 假設是 100 個分片,礦工一人顧一個分片下,就變成我只要有全網 1% 的攻擊力,就有機會癱瘓某一個甚至兩個分片,而這 1% 在原本的 PoW 下,根本起不了作用。要防範攻擊者最好的做法,就是建立隨機性。

    分片技術-區塊鏈底層 Layer 1 擴容方案

    在區塊鏈領域建立隨機性的方式主要是利用可驗證隨機函數(VRF, Verifiable Random Function),利用此演算法,網路可以隨機抽取節點分組形成分片。這樣一種隨機抽樣的方式可以防止惡意節點控制單個分片。

  2. 分片的共識機制
    解決了礦工分組的問題後,所要面臨的問題是分組後的礦工,驗證過程如何達成共識。達成共識的算法可以選擇我們熟知的 PoWPoS、PBFT等共識機制

    簡單來說,網路分片就是礦工的挖礦規則,為了在分片的同時不失去去中心化特性,開發者需要盡可能地在安全與效率取得良好的平衡。例如,網路中分片的數量與每個分片中節點的數量等問題,都需要謹慎考慮。

交易分片(transaction sharding)

網路分片針對的是礦工的遊戲規則,而交易分片所針對的是哪些交易要被分配到哪些分片,然而,區塊鏈的帳本模型的不同會對交易分片的開發造成影響。

UTXO 帳本模型

UTXO 的帳本系統,例如比特幣,交易紀錄是由多個 input 和多個 output 構成,沒有帳戶的概念,也不會有餘額的紀錄,我們沒有辦法按照地址進行交易分片來有效地避免雙花問題

UTXO 較直觀的交易分片方式是按照交易 hash 值的最後幾位進行分片。例如,「如果哈希值的最後一個值是 0 的話,那麼交易將被分配給分片1,否則它被分配給分片 2 (假設只有兩個分片)。」

然而,我們說過,UTXO 的交易是由 input 和 output 構成,假設 A 發起了一筆交易,該交易的哈希值的最後一個值是 0,被分配到第一個分片驗證,此時,A 又發起一筆 input 相同但output 不同 (發給不同人) 的交易,該筆交易被分配到第二個分片,如果不採取任何措施,這兩筆交易將因為同時在兩個分片當中進行處理和驗證,而導致雙花攻擊。

在 UTXO 帳本系統的交易分片中,解決雙花攻擊的辦法是分片1和分片2相互通信,以確保同一筆錢沒有被重複花費。但是在實際過程中,分片數量眾多且交易的 hash 值是隨機的,交易會被隨機分配到各個分片,這就表示每個分片之間都必須相互溝通。很明顯,這方法行不通,因為如果這麼做,就代表分片無法獨立驗證,分片就沒有意義了,因此 UTXO 先天上就較難以實現分片。

Account 帳本模型

由於 UTXO 帳本模型較難實現交易分片,因此,大多數採用分片技術的區塊鏈,都是像以太坊一樣的 Account 帳戶帳本系統。有了帳戶,每一筆交易將會包含發送者的地址與餘額,因此我們只需要將交易按照發送者的地址進行分片,即可保證同一個帳戶發出的多筆交易將被在同一個分片當中被處理,這樣該分片即可有效的檢測雙花交易。不過一但涉及到跨分片交易,例如:分片1的帳戶要與分片10的帳戶進行交易,勢必需要跨分片的溝通來驗證交易的有效性,但與 UTXO 相比,至少不需要跟所有的分片溝通,只需要分片1與分片10溝通即可。

狀態分片(state sharding)

狀態分片可以簡單理解為,在區塊鏈資料分配在在不同分片中儲存。其所涉及的是鏈上資料的分片,也就是鏈上資料與交易紀錄分片儲存,藉此減少節點的存儲負擔。與其他兩個分片機制相比,狀態分片是最棘手的難題。目前的狀態分片有以下三個問題需要解決。

跨分片交易通訊的效益平衡

過去區塊鏈的狀態,例如帳戶餘額狀態儲存在全網中,由全網節點共同更新維護。但是在分片機制下,交易會根據地址分配在不同的分片處理,也就是說,狀態只會儲存在其地址所在的分片中,此時要面臨的一個問題是,交易不會只在一個分片中進行,時常會涉及到跨分片交易,因此若交易雙方帳戶被分配在不同分片,分片與分片之間勢必要進行溝通才能夠確保交易的有效性,頻繁的跨分片互動,很容易導致整體網路效率下降。

例如 : 

A 的地址分配在分片1,交易的紀錄也會儲存在分片1。

B 的地址分配在分片2,交易的紀錄就會儲存在分片2。

一但 A 要打幣給 B ,就會形成跨分片交易,分片2就會向分片1調用過去的交易紀錄,確認交易的有效性,A 頻繁的打幣給 B,分片2 就必須不斷跟分片1 互動,交易的處理效率便會因此降低。

分片動態刷新和節點狀態更新之間的平衡

區塊鏈的節點會隨著時間而增加,且節點若長時間未重新分配,會導致交易狀態過度集中化,降低遭受攻擊時的彈性。因此網路每隔一段時間需要重新調整網路節點,也就是所謂的動態分片,而新進節點也會藉此更新與同步其所在分片的狀態。然而每一次的節點調整,都必須在該分片完成網路同步後,才能開始處理交易,這會造成部分延遲問題,因此設計時必須掌握好節點調整的數量與時間,否則很可能會造成分片癱瘓。

全網數據備份與中心化風險之間的平衡

還有一個問題是,若某些特定的分片遭到了攻擊而導致其驗證失去有效性。由於分片並沒有複製系統 的全部狀態,所以網路也無法驗證那些依賴於該分片的交易。

解決此問題的方法是維護存檔或進行節點備份,這樣就能幫助系統進行故障修復以及恢復那些不可用的數據。但是,這樣就代表系統的狀態只會儲存在少數節點,這會引發一些中心化的風險。

總結

雖然分片技術與其他解決方案相比,較複雜也較難實現,但分片技術依然是目前備受期待的 Layer 1 擴容方案,知名的分片項目 Zilliqa 主網在2019年1月31日正式上線了,過去在測試網上都有相當不錯的表現,實際的效能還有待確認。

而我們所熟悉的以太坊,也將會慢慢開始進化,從以太坊1.X進化到以太坊2.0,除了會將共識機制從 PoW 改成 PoS 外,還會加入 Beacon Chain  讓分片技術得以在以太坊上實現。

分片技術的發展,或許將成為區塊鏈邁向落地應用的一項重要決定性因素。 
延伸閱讀-側鏈與跨鏈- 第二層(Layer2) 擴容方案

本文由 AMIS 首席科學家 – 陳昶吾博士協助審閱

相關文章