一覽以太坊擴展性的挑戰。

撰文:Remco Bloemen,0x 技術專家
編譯:Leo Young

你最近要是用了 DeFi 產品 ,一定會因 高額交易費 望而卻步。現在爲以太坊交易支付幾十到上百美元交易費再正常不過。以當前的費率,只有「 巨鯨 」交易才能獲利。就忘了那些所謂的「讓沒有銀行賬戶的人享受金融服務」 (banking-the-unbanked) 或「構建普惠大衆的無需許可金融基礎設施」這些高尚的目標吧。以太坊變成了 富人的樂園

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?小額交易手續費有時會高達 10%

高額交易費的背後是 區塊鏈可擴展性 問題。這個問題衆所周知,甚至還有一個專門維基百科頁面。可擴展性是目前區塊鏈發展的 最大限制 ,除此之外還有確定性時間長、易出現搶先交易、跨鏈互操作性等問題。

我們想要創造一個所有價值可自由流動的代幣化世界,區塊鏈的侷限卻正在阻礙我們實現這一使命。這就是爲什麼 0x Labs 專門成立工程師團隊,力圖解決這些侷限性的問題。通過我們的研究,我們希望通過本文來探討 以太坊的侷限性 ,及其如何影響 DeFi 用戶 。此外,本文也會簡單論及 下一代區塊鏈 。在未來,我們還將撰寫文章,探討不同的解決方案 Layer 2 ,並演示我們滿足 DeFi 需求的策略。

首先要說明,以太坊交易的大小以 gas 計算。區塊中收集交易,大約每 13 秒一個區塊。每個區塊所容納的交易數量空間有限,也就是「 gas 上限 」。目前每個區塊大約有 1,200 萬 gas 交易空間。純 ERC-20 代幣轉賬大約需要五萬 gas。也就是每個區塊可容納 最多 240 筆 代幣轉賬,約每秒 18 筆轉賬。DeFi 轉賬通常涉及多筆代幣轉賬和簿記,造成 交易成本翻倍 ,進而限制區塊吞吐量。「gas 上限」和區塊時間意味着需要持續提供交易所需的 gas。

首先,我們來看以太坊歷史上 gas 供應及其使用如何增長。

Gas 使用

每天以太坊上約有六千區塊挖出,有 幾十億價值 gas 交易空間。主要由於「gas 上限」增加,gas 交易數量也隨着時間改變、增加。同時,交易消耗總 gas 費也會隨着以太坊上的交易增多、變大而增長。

回顧以太坊整個歷史的 gas 供應 (灰色) 和消費 (黑色) ,如下圖:

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?從上圖可以看出,以太坊是企業級應用,因爲辦公時間應用最高

拜占庭 (Byzantium) 、君士坦丁堡 (Constantinople) 和繆爾冰川 (Muir Glacier) 硬分叉之前,以太坊 gas 供應有幾次 斷續下跌 。這都是以太坊「 難度炸彈 」 (也稱爲 「冰川時代」) 的影響。

在「 冰河時代 」,出塊時間大幅增加,造成單日出塊量減少,gas 供應降低。當然這種情況非常不受歡迎,迫使 網絡硬分叉 來調整。這樣做的目的就是:迫使硬分叉帶來升級改進,防止陷入創新停滯。伊斯坦布爾 (Istanbul) 硬分叉沒有重設「難度炸彈」,所以很快進行了繆爾冰川硬分叉。即將進行的 柏林 (Berlin) 硬分叉考慮更改這一機制 (EIP 2515) 。

看用量情況 (黑色) ,以太坊自從 2017 年 ICO 熱潮以來,gas 用量始終佔 60% 以上。之後「gas 上限」幾次增長到四倍,每次上限增長後 gas 用量也成比例增長。過去幾個月,以太坊用量一直卡在 95%。

要理解以太坊 gas 用量爲何不會超過 95%,需要先了解「 空塊 」 (empty block) 和「 叔塊 」 (ommer block) 的概念。

「空塊」和「叔塊」

以太坊歷史上,即使需求再高,gas 用量也從未超過 上限 95% 。讓人驚訝的是,剩餘 5% 浪費在完全空的區塊。這些空塊定期出現,大約每二十個塊有一個。有交易要付款進入打包入塊,爲什麼還會有人要挖空塊?先看以下數據:

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

空塊率隨着時間 穩定增長 ,目前是 5%。所有礦池的空塊率相等,所以挖空塊的不會是惡意礦工。相反,真實原因可能是 出塊過快 。如果挖塊時間低於六秒,那獲得空塊的概率便會幾何增長。

一個解釋就是,礦工一獲得新區塊頭,在完整個區塊沒打包完成前便開始挖下一個區塊。這種操作在比特幣裏稱爲 SPV 挖礦 ,讓礦工可以沒完成一個區塊驗證可即刻開始找下一個區塊,但只能加入空區塊。新區塊完全打包完成後,就可以添加下一個完整區塊,並切換去挖。

這種解釋的進一步證據就是,如果同一礦工快速 連續挖到兩個區塊 ,空塊率就會 降低 25%

挖空塊的另一種方法就是,在挖上一個區塊的同時,處理新區塊。這就造成同時挖出多個區塊。如果出現此類情況,以太坊會選出一個主幹區塊,把其他區塊標記爲「 叔塊 」 (ommer) 。挖到「叔塊」的礦工仍舊可以得到小額獎勵。這種情況出現的比率穩定:

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

2018 年 gas 用量達到峯值期間,「叔塊」率也到新高,但之後佔比降到所有挖出區塊的 5% 。這與礦工可能此時更改挖礦策略造成空塊率升高相吻合。

空塊率對以太坊可擴展性的傷害沒有立即表現出來,但確實有影響。自從拜占庭升級的 EIP-100 提案,難度調整維持一定主幹鏈區塊和「叔塊」比率。所以「叔塊」率高就表示浪費的「叔塊」增多,主鏈增加的塊減少。這就表現爲每日出塊時間延長,每日總 gas 量減少。 (造成出塊時間延長的另一個原因是「難度炸彈」)

「叔塊」或空塊都是以太坊網絡的 重要健康指標 。任何一個指標增長,都意味着每日用於交易的總 gas 減少。「叔塊」率分析是支持 EIP 2028 和 1559 研究 (參見 1、2、3) 的主要部分。意外的是,這兩個 EIP 都沒提到 空塊率 ,而且研究存在方法缺陷。用邏輯迴歸等恰當的統計學方法分析「叔塊」率和空塊率,這樣更嚴謹的分析會更好。

有方法可以降低空塊率和「叔塊」率。推定根本原因就是,由於網絡和處理延遲,礦池沒有最新的狀態可用。一個簡單但不太讓人滿意的解決方案就是,讓 礦池更中心化 ,最近的狀態就會集中在一起。

更去中心化一點的解決方案就是 bloXroute 那樣,創建礦池間專用連接。受「 間諜挖礦 」 (spy mining) 啓發,可以讓礦池 預先分享 目前在挖的區塊。其他礦池會準備可能會挖的後續區塊。礦池成功挖完自己的塊後,就已經知道後續可以挖哪些塊,立即切換。在堆棧上方,改進節點通訊協議和處理算法也有效,這些地方仍有改進空間。最終,降低空塊率和「叔塊」率才能單日提升最多 5% gas 供應量。

所以似乎有 95% gas 上限,但如果有人想要使用超過 95% 的量怎麼辦?

Gas 價格

以太坊 gas 上限到頂會怎樣?礦工可以自由選擇 打包交易 (後續詳述) ,但實際上礦工按「 高 gas 費優先原則 」打包交易,因爲這樣利潤最高。這樣就產生對可用 gas 的第一價格拍賣現象。

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

Gas 價格已成爲「 完美非彈性供應量 」的教科書範本。隨着網絡使用率超過 80%,漲到 95% 位置,gas 價格明顯增加。任何潛在需求增加只會增加價格,直到價格趕退需求,降回相同水平。

讓價格下降的唯一方式就是 增加 gas 供應 ,或降低需求,而最近 gas 上限增加不足以有效降低 gas 價格。

乍一看,對以太坊都興趣增加,只會推升價格,不會造成用量增長。實際上,高價值使用會驅逐低價值使用,便宜的遊戲類 非同質化代幣 (NFT) 交易減少, 大額 DeFi 交易 更多。

提案 EIP 1559 意在使短期內 gas 供應更加彈性。在需求高峯期,可以加大區塊容量 (高達 2,000 萬 gas) 。這就有助於保持高峯 gas 價格平穩,可以更快打包交易。但這樣無法改變長期供應量 不具彈性 的問題。

根據提案 EIP-1559,長期仍有固定 gas 發行率,意味着 gas 價格會持續上升,直到需求足夠小。EIP-1559 仍舊鼓勵同一區塊內 支付溢價 的優先打包處理 (假設礦池繼續按原先順序挖區塊) 。這就意味着 搶先交易 、gas 競價和礦工牟利的情況仍舊存在。

圖中的數字代表下個區塊內可打包交易的最低價格。你願意 等得越久 ,gas 價格會越低。歷史數據表明,若你願意等兩分鐘或更久,那價格便會很低。EIP-1559 有助於降低溢價,便於更快處理交易。

因此,gas 上限促使 gas 價格上升,那我們該如何提高上限?

Gas 上限

礦池確定 gas 上限。下面簡要概述礦工和礦池 工作原理 :幾乎所有礦工都會把 算力資源 聚集一起。礦工們不會冒着長期沒有收穫的風險單獨去到下一個區塊,而是將資源聚集而獲得 穩定收入 。礦池來驗證每個礦工貢獻的算力,再繼續挖下個區塊,這種方式推動了礦池發展。大型礦池最終會挖得較大份額區塊。

下面來看以太坊上礦池份額的發展情況:

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

星火、Ethermine 和魚池三家獲得主要區塊。

除了進行硬分叉外,礦池運營者有重要 治理責任 :他們可以設置以太坊 gas 上限。與出塊時間和 gas 價格 (新特性) 不同,gas 上限由每個區塊各自確定。新 gas 上限限於上一區塊的 0.1% ,所以每個區塊僅能做出 微小浮動 (《黃皮書》公式 47) 。要是三家礦池一致同意快速複利滾動單邊浮動,兩個半小時 gas 上限就能翻倍或減半。要是意見不一致,gas 上限就是礦池規模的 加權平均數

目前由於缺少礦工實際操作的詳細信息,我們會用簡單的方法: 投票系統 。[…] 希望未來我們可以軟分叉,變爲更精確的算法。

以太坊設計原理 (2015 年 3 月首次加入)

以太坊早期礦工設定 gas 上限的方式是「 補缺解決方案 」。很多「補缺解決方案」足夠好,就變成了備用參數。EIP 1559 建議採用不同機制,目前正在討論在柏林分叉時應用。這之前,礦池運營者可像 OPEC 控制石油產量一樣 控制 gas 供應量

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?Ethermine 礦池運營者

最近兩大礦池一致決定 提升 gas 產量 25% ,頗有爭議。目的本是通過增加 gas 供應來緩解高交易費壓力。目前我們所看到的,交易需求增長快過 gas 上限增長速度。這就造成價格暫時趨緩,最終還是會上升。

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

提高 gas 上限會對以太坊安全帶來 巨大隱患 。如上所述,gas 上限會增加「叔塊」率和空塊率。正常交易負載下,這一增長很小。但對於安全問題,我們不關心正常行爲,只關心糟糕情況下的不利行爲。Perez 和 Livshits (2019 年) 研究了這種糟糕情況,結果就是同等 gas 成本下,糟糕時的交易要比正常交易 慢百倍 。需要九十秒區塊才能填滿交易。這就造成節點同步滯後,礦池挖「叔塊」和空塊。至本稿發佈,問題已有緩解,但不足以避免。這就引致兩位節點主開發者 Péter Szilágyi 和 Alexey Akhunov 批評提高 gas 上限的決定。

所以,gas 上限促使 gas 價格上升。似乎我們不該一味增加 gas 上限。那該怎麼做?或許可以降低交易所需的 gas 成本

Gas 成本

交易的 gas 成本主要由 EVM 運行成本 組成。交易是由衆多 EVM 操作組成,每次運行成本由 EIP 和硬分叉決定。過去幾次硬分叉中,有些操作的 gas 成本已經增加 (EIPs 150、160、1884) ,有些降低 (EIPs 1108、2028、2200) 。計劃中的 柏林硬分叉 也在在考慮變更一些特定操作的 gas 成本。

所有變更的目標是要讓費用更準確反應操作的 真實成本 。這就意味着,隨着計算機和算法變快,計算運行成本會降低。

存儲操作成本 有所不同。存儲與檢索成本視鏈上狀態大小而定,而以太坊狀態大小在持續增加。改善存儲設備或數據庫不會抵消狀態規模的增加。

這就意味着,存儲仍舊是 DeFi 應用的 大額成本 。創建新的餘額要兩萬 gas,修改現有餘額要五千 gas。轉賬至少要修改兩次餘額,匯兌至少要修改四次,DeFi 交易所需的狀態費用更高。似乎沒有簡單方法能降低相關存儲量,有需求,存儲費就會上升。好的一面, Layer 2 擴展解決方案 偏向輕量存儲和高計算量,似乎更有優勢。

最後,隨着 gas 上限提高,也會出現相同的安全擔憂:糟糕情況影響大。本地優化 gas 成本達到當前操作的 平均成本 很危險。

這樣就很清楚爲何以太坊擴展性的問題這麼棘手。在給出解決方案前,還需提及目前以太坊傷害 DeFi 用戶的另一侷限之處。

礦工牟利

區塊打包者遵守共識規則。共識規則保證交易選擇和排序等重要自由。對於普通代幣轉賬,問題不大。但對交易所等 DeFi 交易, 搶先交易 就有很高經濟價值。目標交易兩面受攻擊,便會出現更復雜的牟利行爲。Daian 等人 (2019) 稱之爲「 礦工 牟利 」 (miner extractable value) 。

礦池似乎不會惡意使用自己的交易排序自由,但仍可以用其牟利。礦池有可能使用 Geth 按 gas 價格排序交易 ( 參 見 1、2) 。這就會產生 gas 價格拍賣,最高競價交易優先。這會造成不良影響,任何人都可以通過 高競價 搶先交易。競爭交易者持續競價讓 gas 價格升高,直到交易利潤完全抵消 gas 費。目前,所有牟利都會變爲交易費 落入礦工口袋

其他情況下,恰好接着一筆交易會有價值,例如價格預言機更新後第一個清算倉位。這稱爲「 back-running 」,結果也是礦工獲益。

大價差、價格偏離、高手續費及更多 失敗交易 ,最終會讓 DeFi 用戶受損,礦工牟利。要有更好的 DeFi 體驗,這個問題就得解決。解決這個問題就要限制交易排序自由,例如要求一個區塊內最低 gas 價格的交易優先。

現在已完全瞭解以太坊的侷限,及其如何 影響 DeFi 。當然所有致力於擴展性的明星團隊終將解決這個問題,對吧。

強化底層,着眼二層

有很多出衆的團隊致力於不同可擴展性解決方案。解決方案有兩種: Layer 1Layer 2 。Layer 1 解決方案的目標是構建擴展性更好的以太坊,Layer 2 解決方案是要在以太坊的基礎上構建更具可擴展性的 基礎設施

從最明顯的問題開始:提升現有以太坊的 性能 ——這是 Eth1x 要做的事情。改進以太坊客戶端性能,仍舊可以有很多提高。糟糕的是,Eth1x 幾乎沒有得到任何應有的支持,所有進展很慢。

要了解 Eth1x 可以達到何種性能,可以先來看看 Solana 。Solona 吞吐量可達到以太坊千倍以上,還有提升空間。這種方法的主要劣勢是,運行全節點的 硬件要求 很高。

多數其他解決方案都有三個共同點:

  1. 使用 WebAssembly 作爲虛擬機,極簡狀態架構,和最重要的分片。目前以太坊上的所有交易都按序列執行。交易排序毫無疑問是區塊鏈的關鍵。這種模式的缺點是,很難並行處理,所以投入更多資源也無法輕鬆解決可擴展性問題。這就是下一代區塊鏈 Eth2.0 要解決的。
  2. 通過更改交易執行方式,讓交易平行處理。將區塊鏈分爲多個鬆散連接的域,也就是稱作「 分片 」的處理程序,來實現這一方案。一個分片內的交易仍舊按順序排列,但分片之間是異步進行。這就允許所有分片平行運行,依分片數量擴展網絡。
  3. 用以分離的域不一定與分片相匹配,同一個分片可以有多個域,甚至可以遷移域,達到負載平衡。如需深入瞭解分片技術,讀者請瀏覽 Near 協議的「 夜影 」論文。

下一代區塊鏈主鏈從哪裏分爲域何時分爲域,視情況而定。第二代區塊鏈可看作是從 細粒化 (衆多微小域) 到 粗粒化 (少量大域) 光譜。

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

兩個項目各佔粒度光譜兩邊: Dfinity 在細粒度一端,每個代理人有自己的域,每次代理人交互都是異步。 Near 協議細粒度化稍小,每個合約都有自己的域。粗粒度一端是 波卡 ,其域是就是整個分片,這種情況稱爲「平行鏈」更準確。從 DApp 開發者角度判斷 以太坊 2.0 爲時尚早。Eth1EE (Eth2 上的 Eth1 執行環境) 將爲粗粒度,有與分片一致的界限,目前的以太坊會成爲一個分片。細粒度解決方案的優勢是 透明 ;合約間調用無論是否跨分片邊界,都能看上去一樣。這就進而允許在分片間移動合約來輕鬆平衡負載。

缺點是跨域交易不再是 原子化 ,而是變成 並行 ,其中部分不可撤銷。Dfinity 和 Near 中顯示合約間調用爲 async ,返回約定等待 await 。await 期間所有發生的交易都會寫入鏈上。之後其他人的交易可以疊加之上。這時候之前的所有交易就不能撤銷。await 最終確認後,可返回合約調用成功或失敗指令。有多個提案避免這一情況,讓跨分片獲得一定原子化,但這樣也有劣勢。擁抱非原子化似乎是自然結果。

對於 DeFi, 異步 transferFrom 調用 構成很大挑戰。設想雙方進行簡單交易,Alice 和 Bob 想要用 ETH 和 DAI 交易。基本合約應該是:

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

但現在我需要處理錯誤。如果第一次交易失敗,我們可停止交易。如果第二次交易失敗,就需要將 1 個 ETH 退給 Alice。問題是,這時 Bob 可能已經把那 1 個 ETH 花了。解決這個問題的一個方式就是 託管

以太坊 Gas 費爲何阻礙了 DeFi 發展?怎麼辦?

這樣就行了,沒人會損失。但現在 Bob 就對 Alice 的交易有了 專屬自由選擇權 。Alice 的代幣被託管,不會再進行其他交易,也尚未保證與 Bob 的交易一定會成功。解決這個問題可以對違規者懲罰。而 DeFi 交易會很貴 ,就難以確定多少懲罰額度合適。解決這個問題可以要求市場各方最開始都在一個存款合約存入資金託管。而這樣又變成中心化狀態,根本上就不需要分片了。

另一個需要注意的是,這些併發問題到底能多複雜。真實交易中,也有需要更新的 序列填充狀態 (fill-state of the order) ,這就讓協議更加複雜。相比並發漏洞,困擾以太坊 1.0 的重入攻擊漏洞便不足爲奇。併發漏洞爲不確定性,測試中也不會發生。從上述簡單交易可知,要解決這個問題就需要重新思考基礎架構,唯一可靠的方式就是打翻重來。

交易是 DeFi 構建的基礎,是一系列處理程序。我們已知道交易所交易簿如何構成挑戰。 自動做市商交易所 就較爲簡單,因爲有託管儲備金在,但儲備金餘額形成妨礙並行的瓶頸。即使最快的傳統交易所,結算也沒有並行 (儘管會有冗餘) ,在單一匹配引擎排序完成。如需詳細瞭解傳統交易所工作原理,Brian Nigito 的演講非常棒。

這並不意味着這些問題無解。最簡單的解決方案就是這些所有協議在每個分片部署 獨立的實例 ,讓套利者保持彼此間同步。或許可以得到性能足夠的單獨同步分片納入所有 DeFi 交易,這樣就無需擔心併發的問題。

本文深入探討了以太坊擴展 DeFi 應用方面的侷限性。如上所述,這問題複雜而不可一蹴而就。之後我們會撰寫另外一篇文章探討 Layer 2 特定解決方案,並演示 0x 自己的策略。

參考

1. Daniel Perez & Benjamin Livshits (2019). “Broken Metre: Attacking Resource Metering in EVM.”

2. Daian et al. (2019). “Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges.”

3. Brian Nigito (2017). “How to Build an Exchange.”

4. Danny Ryan (2020). “The State of Eth2, June 2020.”

5. Scott Shapiro & William Villanueva (2020). “ETH 2 Phase 2 WIKI.”

6. Near Protocol sharding design