區塊鏈擴容方案

Published on
All posts

在評斷某條鏈的性能時,最重要指標是交易手續費以及交易速度,大家都希望有更快的交易速度與更低的手續費。由於區塊鏈產業的快速發展,幾年前才設計出來的架構,放到當下就已經顯得過時,也產生了對於性能升級的需求。

要提高效能,能從 Layer 1 或 Layer 2 去著手。L1 擴容指的是在區塊鏈底層協議上改動,L2 擴容指的是去想辦法再弄一條鏈,架在 L1 之上,讓它能夠與 L1 互動,用各種方式減輕主鏈的負擔。

從 Layer 1 上著手是釜底抽薪的作法。例如可以直接不用 Blockchain,改成 DAG、Holochain、Hashgraph 等等技術來實現 DLT。或是改用一個更強調性能的共識機制,例如 Solana 採用的 PoS + PoH 組合。

L1 擴容的另一個思路是調整一條鏈的底層參數,有兩種最簡單的方式:「增加每個 Block 的儲存空間」,目前 Bitcoin 是 1MB,Ethereum 大概是 15M gas;或是「縮短出塊時間」,Bitcoin 是 10 分鐘,Ethereum 大約是 12 秒。

但這兩種方式都對節點有更高的要求:需要更強大的硬體設備,以及更快的網路速度。這會導致符合規定的節點數變少,也就是變的不那麼去中心化。這涉及了設計理念的問題,以太坊發展到目前為止,給去中心化更高的優先級。之前 BSC 被駭的時候,幣安能停機來處理,究其本質就因為它一點都並不去中心化,當然,多去中心才叫做去中心,以及我們到底需要怎樣程度的去中心,都是個哲學問題。

三難問題是針對 L1 層面來說的,要進行 L1 的擴容,可以透過更新節點來進行升級。這種更新不是強制性的,節點自主選擇要不要更新,所以會產生分岔。如果更新過的與不更新的節點無法進行互動,稱之為硬分叉。相對的,如果更新過的與不更新的節點還能繼續互動,稱之為軟分叉

L2 的擴容技術就更五花八門了,最常聽到的有:Plasma、zk Rollup、Optimistic Rollup 等等。

總的來說,一條鏈可以有的優秀品質包含了:reliability、security、efficiency、privacy。在分析一個擴容方案的時候,看其在此四者之間做了怎樣的取捨,就能快速對一個擴容方案有概念。


Bitcoin 上的擴容

  • 現在 Bitcoin 的 TPS 大約是 3 左右,手續費則是 1 鎂附近。這東西是動態的,大概知道個數量級就行。
  • Bitcoin 上增加每個 Block 容量的提案是一個硬分叉,接受的節點分出去的鏈被叫做 比特幣現金(BCH),而沒有接受升級的就還是原先的 BTC。
  • 隔離見證(Segregated Witness):喜歡把一切詞彙簡稱的工程師也把它稱為 SegWit,主要概念就是把 Signature 這個欄位的資料拿到其他地方去做,讓 Block 上每一筆交易的資料簡化,降低每一筆交易佔用的空間,以達到更高的 TPS。
  • 在比較複雜的情況下,Signature 可以佔到所有資料的 3/4,也就是剔除之後,理論上 TPS 可以上升四倍,算是一個短期的擴容方案。這個軟分叉,在 2017 年的時候已經被實施。
  • BTC 上還有過的知名軟分叉是 Taproot,這是一個底層密碼學上的升級,可以簡單理解成,透過採用新的密碼架構,可以降低複雜交易的數據量,讓複雜交易看起來跟簡單交易很像,達到增強隱私性的效果。
  • Bitcoin 上還有過一個東西叫做 Lightning Network(閃電網路),因為 Ethereum 上也做過類似的方案,且讓我們放到後面一起講。

Ethereum 上的擴容方案

  • Ehereum 在 Layer 1 的升級上,除了大家熟知的從 PoW 轉換到 PoS 之外,目前的計畫主要是想引入分片技術(Sharding)
  • 在 L2 擴容的方案上有:Payment channel側鏈 Sidechain等離子體 PlasmazkRollupOptimistic RollupValidiumVolition。在寫這一篇的當下(2022.10),前三者基本被淘汰,zkRollup 跟 Optimistic Rollup 是當下的主流,而最後兩種有點像是 zkRollup 跟 Optimistic Rollup 的小改版。

分片 Sharding

  • 困難度高,但如果真的成功,是個一勞永逸的方案。
  • 概念就是把所有的節點平均且隨機的分組,一組就是一個分片,每個分片能夠獨立的去處理交易、驗證交易、執行合約。
  • 所以理論上,把 Ethereum 分成 N 片之後,效能應該要可以變成 N 倍。
  • 困難點一是分片與分片之間如何溝通,如何去相信那些它自己沒有經手驗證過的交易資料?困難點二是分片之後,每個分片中的節點數等於是變少了(與不分片相比),也可以理解成更中心化,這樣受到 51% 算力攻擊的可能性也會大大上升。
  • 前者目前是朝向結合用 zk proof 去做:分片可以提出一個證明(proof),理論上,此分片就是可以被相信的。後者主要是通過隨機分配節點,加上隨機的分配需要驗證跟執行的交易請求,讓一群同夥剛好在同個分片中,一起作惡的機率降低。
  • 分片是被放在以太坊 2.0 的升級計畫路線圖中的。

Payment Channel

  • 兩個用戶之間可以建立一個快速的網絡通道:兩者先在通道上存一部分資金,定時的去更新它們的最新狀態,最終要退出時,再到 Layer 1 上進行結算。
  • 所以只在兩個時間點上才需要與 Layer 1 互動:建立通道跟關閉通道的時候。
  • 優點是交易的雙方更有隱私(通道上的交易只有雙方看得到),且可以降低交易費用(中間不管交易多少次,只收開始跟關閉兩次的手續費),很適用於與固定對手方的小額高頻交易。
  • 缺點一是不支援智能合約帳戶(Contract Account),只能兩個 EOA 之間互動,少了可玩性。
  • 缺點二是很少會有人在通道上放上大筆資金,加上只能跟其他也在通道上的人進行交易,導致資金利用率會很低。就是例如我先放了 10 ETH 在通道上,但其實每次都只是小額的三五 ETH 在那邊交易,等於很常有資金是閒置的。
  • 比特幣上做 Payment Channel 的專案叫做閃電網路(Lightning Network); 以太坊上的專案叫做 Raiden Network

側鏈 Sidechains

  • 嚴格來說,sidechain 並不屬於一種 Layer 2。Layer 2 是必須是依存在某個 Layer 1 之上,且 Layer 2 不具有決定一個區塊正確與否的最終話語權。反過來說,Layer 2 的安全性,通常是由 Layer 1 來背書的,所以基本可靠。
  • 相對的,sidechain 是一條完整且獨立的區塊鏈,有自己獨立的共識機制以及驗證機制,只是剛好設計來跟某特定的 Layer 1 互動而已。
  • 至於要理解它們的互動關係,我們先想像自己是一顆代幣,今天在主鏈上跑來跑去是很貴的,這樣我可以先跑到側鏈上去玩,那邊跑起來通常比較便宜,然後等有什麼特殊需求一定要在主鏈上完成時,我還是可以回到主鏈上。就是單線道不夠用,就把路拓寬成雙線道的概念。
  • 優點是資料與程式碼獨立,因為它完完全全就是一條獨立的鏈,在架構的時候,主鏈不用去做出太多的改變。
  • 缺點是安全性通常比較差,由於沒有 Layer 1 來背書,它需要有一支自己的驗證者(Validator)或礦工隊伍來維持安全。
  • 比較有名的側鏈專案有 Matic Network 和 Skale Network,兩者都是與以太坊互動的側鏈,其中又以前者更出名。
  • Matic Network 是比較早期的名字,之後改名為眾所皆知的 Polygon(這也是為啥 Polygon 上面的原生代幣是 $MATIC 的原因)。
picture scaling_solution

等離子體 Plasma

  • 最開始由 Vitalik Buterin 和 Joseph Poon(Lightning Network 的共同作者)在 2017 年共同提出。
  • Plasma MVP 是第一個被實現出來的版本(2018.01),Plasma Cash 是隨後改進的版本(2018.03)。
  • Plasma 可以理解成加強版本的 sidechain,也是一條獨立的鏈,差異是 Plasma 受到 Layer 1 的監管,在這個例子也就是 Ethereum。當 Plasma 的節點被 Ethereum 判斷作惡的時候,Plasma 允許使用者依照上一個合法的狀態(State)來抽回現金。
  • 說它像 sidechain,原因是它也像一個側鏈一樣,是把很多計算與驗證拉到 Plasma 上面去做,最後再給 Ethereum 一個結果,以此來減輕 L1 的負擔。
  • 說它是加強版,原因是 Plasma 並非一個一維的鏈,而是個二維的樹狀鏈:在 Ethereum 上先是有一個 Plasma 的根(第一層),從這個根出發,上面可以有多個 Plasma 節點(第二層),然後能再繼續往上推。這東西效率會好,就跟搞傳銷去拉下線是一樣的道理,而 Ethereum 就是最大的組頭。
  • Plasma 的有效性,也就是下線要跟組頭彙報的時候,通常組頭是不會輕信小弟的。會有一個查證機制叫做 欺詐證明(fault proofs)
  • 行走江湖,講的就是一個理字,每個人說話最好是有證據的,也就是所謂的證明(proof)。證明可以分成兩種:欺詐證明有效性證明(validity proofs)
  • 有效性證明: 這個組頭疑心病很重,很不相信自己的下線,每一個資訊過來,都要求要附上證據才行,例如可以附上之後會講到的 zk proof。這機制的缺點是很耗計算資源,因為證明是需要算出來的;但優點就是可靠,附上證明的資訊可以直接無腦相信。
  • 欺詐證明: 相信人性本善的組頭,直接默認下線是正確的,但提交過來的資訊,會讓其他人(節點)有一個 Dispute Time Frame(DTF)的機會去挑戰。這個 DTF 的期間內,如果其他節點覺得那提交的資訊有問題,則可以提出 fault proof,隨後也會有一個賞善罰惡的機制。如果後來發現真的是有問題,則會自動恢復到 L2 的上一個狀態。DTF 的時間越長,則越安全,但相對的,用戶也要等更久才能確認某個資訊沒問題。這機制的優點是可以減少所需要的計算資源,但缺點就是要等那個 DTF,這對很多要求時效性的應用來說,是阿基里斯之腱,是無法承受的缺點。
  • 為了要在 DTF 之中能發出挑戰,在 Plasma 上面的節點玩家,首先自己要存著一定數量的資料,不然根本沒有可挑戰的東西,這個叫做資料的可取性(The availability of data) 的問題,這是一個很重要也很常被討論的話題。
  • 舉例來說,站在 Ethereum 的角度來看,因為 Plasma 這個 L2 只會給最終結果,Ethereum 是不知道細節與過程的,如果那一天 Plasma 爆炸了,則單單從 Ethereum 是沒有辦法復原每一筆交易的,這是一個很大的潛在風險。
  • Plasma 的另一個難題是:要求節點要處於活躍狀態,不然錯過了 DTF,系統看到沒人要挑戰,會直接默認大家都同意。例如有些攻擊就是透過 DDoS 去攻擊節點,讓節點沈默,然後就通過了。
  • 總結來說,Plasma 是個有著樹狀結構的 L2 鏈,資料在這上面處理,然候把最後送到 Ethereum 那邊,中間的有效性是透過欺詐證明機制來維護的。
picture scaling_solution
Source: nirolution.com

Rollup

  • 依照 Vitalik 在這篇文章中對 Rollups 的定義:將運算放到 L2,但每筆交易都保留部分的資料在 L1。
  • 在 L2 上面會有一個樹狀的資料結構,用來記錄每個帳戶的餘額(account balance)。
  • 更新樹狀結構資料的方式,是經由提交 batch。batch 上面會紀錄著新的交易資訊。
  • 在 L1(以太坊)上面,有一個 rollup contract,上面會記錄著 state root,用來讓 L1 知道目前 L2 的最新資料是哪一個(state root 就是樹狀結構資料的標籤)。簡單來說,大量交易在 L2 上面進行,L1 上面只需要存放 state root 來紀錄最終結果。
  • (有另一支智能合約,來協助資金在 L1 與 L2 之間流動,這個小細節不影響理解,我們暫時忽略)
  • 整套邏輯跟 Plasma 很像,主要的差異在於:Rollup 有把重要的交易資訊(state root)存放到 L1 去。
  • 在質押一些資金之後,任何人都可以提交 batch;但如何確保提交的 batch 是正確的,這就是關鍵問題所在,而這也相應產生了 Optimistic rollups 與 ZK rollups 兩種流派。

Optimistic Rollup

  • 採用 欺詐證明(fraud proofs),也就是先樂觀相信大家提交的 batch 是正確的,但提交過來的資訊,會讓其他人有一個 DTF 的機會去挑戰。
  • 在 DTF 的期間內,如果其他節點(sequencer)覺得提交的 batch 有問題,可以提出 fault proof 到 L1,L1 上的 Validators 會做出最終裁決(Dispute Assertions),當然,會搭配賞善罰惡的機制:如果詐欺證明被採納,提出 fault proof 的人會獲得獎勵,同時沒收原先提出具有詐欺性質 batch 者的押金。另外,這種欺詐需要回溯時,只需要對樹狀結構中,有問題的部分 重新計算即可,不需要全部重算。
  • DTF 的時間越長則越安全,但相對的,用戶也要等更久才能確認資訊沒問題,這對很多講求時效的金融服務是硬傷。
  • 綜合來看,Optimistic Rollup 相對於 zk Rollup,它優點有:能兼容智能合約(OVM)、計算資源需求低;但缺點有:理論安全性略低、資料壓縮上比較差、用戶資金退出需要等待長(DTF)
  • 當今採用 Optimistic Rollup 的 L2 主要有兩個:Optimism 與 Arbitrum。
  • 兩者主要的差異在於,出現爭執的情況時,Optimism 是按照上面的做法,會直接由 L1 進行一輪的裁決。但這種直接裁決的工作量是很大的,所以在 Arbitrum 中,它會先讓提出 batch 的人,與那位不同意的人(disputer)吵上一架,縮小範圍到兩人真正有爭執的那一步,才提交給 L1 的裁判。裁判只需要針對這個爭議來進行裁決就行,Arbitrum 的方式普遍被認為是更高效的。
  • 吵架來縮小爭議範圍的方法是:當 B 不同意 A 的時候,A 會把自己的認為對的東西拆成 100 份,而 B 必須指出它認為錯誤的那一份,並提供 B 自己覺得對的版本(A 肯定是不同意的);接著,B 的那個版本也是要再拆成 100 份,讓 A 來指認出它不同意的。一來一回,能使資料縮小 10000 倍,這過程會持續,直到找到兩人真正有爭議的那一部分。
  • 另外,雖然兩者都是 EVM 兼容的,但 Arbitrum 有自己的 Arbitrum Virtual Machine (AVM)。

zk Rollup

  • 採用有效性證明(validity proof),核心概念是,除非能可以提供正確的證明,不然會先預設提交者是錯的。zk Rollup 中使用的有效性證明,就是零知識證明(Zero-knowledge Proof, ZKP)。
  • 零知識證明是一種方法,通過它,一方(prover)可以向另一方(verifier)證明某訊息的真實性,但不揭露信息本身。最常見的舉例是,當去超市買酒的時候,店員想檢查的是年紀,如果有 ZKP,我們可以提供這個 Proof,而不需要拿出身分證,因為他還會透露例如姓名、性別、戶籍地等多餘的資訊。
  • ZKP 除了能保護隱私性之外,也能等價於對數據進行了壓縮。可以這樣去理解:把原先 10 筆簽名數據去做成一個 ZKP,只要拿著這一個 ZKP,就能證明這 10 筆數據的有效性。在實際的情況下,batch 可以包含數百筆的交易紀錄,整包去生成一個 ZKP,再把這個 ZKP 提交到 L1 上面。
  • zk Rollup 相對於 Optimistic Rollup,優點是效能更高(TPS)、用戶退出資金的時間短(沒有挑戰期)、天然有隱私保護;缺點是計算資源要求高,以及目前還不支援 EVM。
  • 還不能支援 EVM 是致命傷。當其他 DApp 想要搬遷到使用 zk Rollup 的生態時,需要自己用一種很難用的語言(R1CS)去寫智能合約。目前有很多團隊朝著做出 zkEVM 在努力,更多細節可以參考 這一篇這一篇
  • 當今實踐 zk Rollup 兩大天王是 zkSync 與 StarkNet。前者使用 SNARKs 的 ZKP,後者使用 STARKs 的 ZKP。SNARKs 與 STARKs 都是一種實踐 ZKP 的方法,差異在於,前者在最一開始,需要有個互信認證的過程,也就是一小群人,彼此要先是互信的,才能確保接下來不作惡。相對的,STARKs 不需要,是種更先進的做法。
  • zkSync 雖然使用比較老舊的 ZKP(SNARKs),但生態相對比較成熟,並在發佈 V2 後宣稱完成了 99% 的 EVM 兼容;另一方面,StarkNet 雖用了更新更強的 ZKP(STARKs),但目前不支援 EVM,而是需要使用 Cairo 這種程式語言來寫智能合約(EVM 上是用 Solidity)

比較

還有兩個比較不成熟的縫合怪,最後直接來簡單橫向比較一下:

  • Plasma = 欺詐證明 + 鏈下裁決
  • Optimistic Rollup= 欺詐證明 + 鏈上裁決
  • ZK-Rollup= 有效性證明 + 鏈上裁決
  • Validium = 有效性證明 + 鏈下裁決
  • Volition = 有效性證明 + 鏈上或鏈下裁決(隨需求而定)

鏈上裁決指的就是最終話語權給 L1,所以安全性好,但要拿效率來作為交換。

結語

Rollup 方面的擴容技術推陳出新,很讓人期待。即使現狀是 ZKP 不成熟,能真正實作的開法者不多,但長遠來看,ZKP 一定是個更好的選擇,我們可以樂觀的相信科技的進步。但也別忘了,上面所說的 L2 擴容,與 Sharding(分片)是可以同時存在的,在一個分片上面,是可以再疊 ZKR 或 OR 上去擴容,這也是以太坊的最終目標。