透過 Gas Station Network(GSN)打造更好的 DApp 開發與入門體驗

前一篇文章 Meta Transactions 如何改變 DApp 付費生態 介紹了 Meta Transactions 解決了一般使用者無法支付 gas,因而被 DApp 拒於門外的困境,但依然有許多問題可以更好地解決。

其中最主要的問題就是 Relayer 的中心化存在單點故障問題(Single Point of Failure, SPoF),可能是 Relayer 因為某種原因無法工作或關閉,或是資料因審查而被刻意拒絕上鏈,缺乏公正性。

這次介紹的 Gas Station Network 算是 Meta Transactions 的進階版,更複雜但也解決了上述的問題。

Image for post

GSN 也不是新概念,2018 年底以色列公司 TabooKey 提案 EIP-1613 Gas Stations Network,同樣是透過 Relayer 來代替使用者支付 Gas。

該協議相容於 EIP-1077: Gas relay for contract calls,提供一個公開的管道(智能合約),來註冊與管理 Relay 節點,任何節點都能加入 Gas Station Network 以避免單點故障(SPoF)。並有經濟激勵的機制,透過抵押、獎勵與處罰來抑制惡意的 Relay 節點,鼓勵 Relayer 做一個好人。

Image for post

知名的以太坊開發工具 OpenZeppelin 也提供支持,與 TabooKey 一起提供了成套的開源工具 tabookey-gasless(已更名為 openeth-dev/gsn),包含 RelayHub、RelayRecipient 等合約,用 docker 包裝好的 RelayServer 以及 Web Client。openeth-dev/gsnIt’s a mechanism for dApps to work with gas-less clients. Users are no longer required to buy Ether in order to use the…github.com


GSN 中的角色

Relay

  • GSN 網路中的節點,由志願者提供
  • 有意成為 Relay 的志願者須提前在 RelayHub 註冊並抵押 ether,若正確完成中繼會收到來自 RelayHub 的獎勵,若惡意攻擊則會被沒收抵押
  • Relay 管理者需確保有足夠 ether 來代替 DApp 使用者支付 Gas,若 ether 不足則會變成非活躍狀態,不會被 Client 所選擇
  • 發送 RelayAdded 和 RelayRemoved 事件讓 RelayClient 監聽以獲取 Relays 列表

RelayServer

  • 提供 Relay 功能的伺服器,提供 API 介面讓 RelayClient 可以發送請求

RelayHub

  • 智能合約,維護一份 Relays 列表讓 Client 查詢
  • 雖然 Relay 先支付了 Gas,但當中繼完成後 RelayHub 會退回 Relay 先代墊的費用避免 Relay 虧損,因此 RelayHub 才是實際支付 Gas 的角色
  • 在 Relay 支付 Gas 前會先檢查 RelayHub.balances[recipient] ,確認 DApp 開發者有存入足夠資金在 RelayHub 中以備支付 Gas
  • 在上鏈前會驗證資料,正確就提供獎勵給 Relay,錯誤則沒收抵押
  • 不同 DApp 可以共用同一個 RelayHub, 以太坊主網上的 RelayHub 位在 0xD216153c06E857cD7f72665E0aF1d7D82172F494 。
  • RelayHub 也可自行部署,但自行部署的 RelayHub 無法共享已存在的 Relays

RelayRecipient

  • 每個支援 GSN 的 DApp 都需要繼承 RelayRecipient,提供了與 RelayHub 溝通的介面
  • 部署 DApp 前需指定 RelayHub 的位址

RelayClient

  • 自帶 Web3 的客戶端套件,會向 RelayHub 查詢可用的 Relay 列表,再透過 http 或 whisper 等協定發送請求
  • 若 Relay 拒絕上鏈,Client 會在數秒後更換一個 Relay 再試一次

實現方法

假設我們要開發一款領養貓咪的 DApp,使用者要透過專屬前端(Web or App)來發送領養的請求,最終在 DApp 的合約中記載領養的貓咪,並於前端的 UI 呈現。

Image for post

步驟

  1. 志願者架設 RelayServer 以運行 Relay 節點,節點必須先在 RelayHub 註冊並抵押 Ether
  2. Client 到 RelayHub 查詢可用的 Relays 列表
  3. 由於 RelayHub 沒有直接提供 public 或 query 方法可供查詢,所以必須找出過去曾觸發 RelayAdded 事件的地址再過濾掉也觸發 RelayRemoved 事件的地址,並持續監聽這兩個事件以持續獲得最新的 Relays 列表
  4. Client 選擇一個資金充足且活躍的節點,用本機端的私鑰將資料與指令簽名送達 RelayRelayServer 會提供 API 介面給 Client 呼叫,若該 Relay 沒有回應則在數秒後選擇另一個 Relay
  5. 估算開發者儲值在 RelayHub 的金額是否足夠,足夠則先支付 Gas 發送交易,將 Client 簽名後的資料轉發給 RelayHub
  6. RelayHub 會檢查是否來自已經註冊的 Relay,然後驗證簽名正確則上鏈
  7. 若驗證正確,RelayHub 會提供獎勵給 Relay,並歸還 Relay 先行代墊的 Gas 費用;但若驗證失敗,RelayHub 會沒收 Relay 之前抵押的 Ether 作為處罰
  8. Client 透過 Web3 得知貓咪已經被領養成功,顯示在 UI 上

以上是簡化過的步驟,完整的流程請參考文件 EIP-1613 Gas Stations Networkethereum/EIPsMake smart contracts (e.g. dapps) accessible to non-ether users by allowing contracts to accept ” collect-calls”…github.com


為什麼 GSN 是更好的解決方案

避免攻擊與審查

RelayServer 若要發起攻擊可能會付出極大的代價(沒收抵押),因此 Relay 會傾向忠實地中繼 Client 欲上鏈的資料而不去惡意竄改。

若 RelayServer 選擇性忽略請求,Client 等待數秒後沒收到回應,就可以更換一個 RelayServer 再嘗試發送請求。

若這種行為一再發生,有疑慮的 RelayServer 就會無人使用,達到避免審查的效果,改善集中式 Relayer 可能不夠公正的問題。

去中心化

曾聽一位 DApp 開發者提及他在 Ethereum 上開發 DApp 的窘境,他知道許多 Layer 2 解決方案包括 Meta Transactions 可以有效改善 DApp 的效能與 UX,但他不願意採用,因為目前多數的 Layer 2 服務都是中心化的。

類似的價值衝突其實存在於許多區塊鏈信仰者的心中,但 GSN 去中心化的設計提供給每位開發者一個不受監管的網路,更符合區塊鏈價值,並透過獎勵持續維持運作。

避免開發者跑路或單點故障

去中心化的網路也可以避免暫時性的單點故障(SPoF)或是開發者停止維護造成的使用者權益損失。

由於 Relay 的經營者與 DApp 開發者並無直接的利益關係,即便 DApp 開發團隊倒閉,Relay 還是會繼續為其他 DApp 服務,只要有至少一台 Relay 持續營運,使用者就能藉由 GSN 繼續使用 DApp,不過可能要透過別的方法儲值到 RelayHub。

共享經濟

要成為 Relay 不需要審查,只要下載開源程式碼就可以部署 RelayServer 開始賺以太幣,而由眾多 Relays 組成的網路公平地提供給所有 DApps 使用。

開發者將營運經費存進 RelayHub 的帳戶中,而志願者提供伺服器經營 Relay 節點收費,未來需要雲端計算資源不再只能從 AWS、GCP 或 Azure 中做選擇,也可以考慮由 GSN 所提供的共享網路。

標準介面

GSN 由 OpenZeppelin、TabooKey、Portis、Pillar、Groundhog、Ethereum Foundation、MetaCartel 與 Burner Wallet 等多家公司、基金會組成聯盟支持 ,制定出標準介面與框架,並提供從前端到合約完整的套件支援。

開發 Meta Transactions 的 DApp 不再需要從頭開始寫一堆程式碼,也不需要自行架設伺服器,而且任何一個支援 GSN 的 DApp Browser 都可以開啟使用 GSN 的 DApp,提供使用者更多彈性與選擇。


結論

GSN 是個完整解決方案,同時兼顧了去中心化與避免審查等 Meta Transactions 可能會有的缺點,而且有數家公司、基金會與眾多以太坊支持者擁護。

但用 GSN 也不是沒有缺點,因為使用 RelayHub 合約的關係,DApp 必需繼承 RelayRecipient 才能使用,也就是說目前大家熟悉的 DApp 像是 CryptoKitties 都無法馬上套用,但若是 GSN 能成為主流,也許未來會有更多 DApp 基於 GSN 的框架而開發。


感謝 Chang-Wu Chen 與 Yu-Te Lin 協助編輯與校稿

本文由 AMIS Hao Chen 提供

原文連結

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料