為了解決這個問題,GSN應運而出!GSN的全稱是Gas Station Network,翻譯過來就是加油站網路。GSN將本該由使用者支付的Gas轉嫁到了其它願意為使用者買單的人身上(一般為Dapp開發者),並且能夠保證交易的真實性。
GSN目前有兩個版本,v1和v2,在實現和流程上有所不同。本篇內容是基於v2版本整理。
二、相關角色
2.1 客戶端-Client
客戶端也就是各種Dapp,是GSN架構的最上層。客戶端負責發起對原交易進行簽名,並將簽名後的原交易傳送到中繼伺服器中。
2.2 中繼伺服器-RealServer
中繼伺服器主要用來處理使用者的元交易請求,主要的功能包括:
· 透過呼叫中繼路由(RelayHub)合約,判斷付款人(Paymaster)是否允許為該筆交易支付手續費,並且有足夠的以太幣
· 中繼伺服器將交易傳送到鏈上 對於中繼伺服器,多個客戶端可以使用一個,也可以一個客戶端對應一個。
2.3 付款人-Paymaster
付款人交易Gas的實際支付者。付款人是一個智慧合約,該合約最重要的是交易過濾器” acceptRelayedCall“,決定了可以為哪些交易支付費用。常用的過濾器包括:
· 白名單
· 令牌認證
· 對特定方法放行
· 鏈下委託授權
2.4 中繼路由-RelayHub
中繼路由本身是一份智慧合約,提供的功能包括:
· 維護一份中繼器列表,供客戶端查詢
· 提供RelayHub.balances[recipient]方法,供中繼伺服器在支付Gas前檢查Dapp開發者已存入足夠的ETH 中繼路由合約可以自行部署,也可以直接使用GSN提供的。自行部署的RelayHub無法共享已存在的中繼器。以太坊主網上的RelayHub合約地址:
0xD216153c06E857cD7f72665E0aF1d7D82172F494
2.5 中繼接收合約-RelayRecipient
每個支援GSN的DApp都需要繼承RelayRecipient,並提供與RelayHub通訊的介面。在部署Dapp合約時,需要初始化RelayHub的地址。需要注意的是,在繼承RelayRecipient合約後,使用_msgSender()替代msg.sender獲取元交易的使用者資訊。
2.6 Trusted Forwarder-可信轉發器
可信轉發器用來驗證傳送者簽名和Nonce值,RelayHub透過可信轉發器將元交易轉發到Dapp合約中。
三、架構
GSN的整體架構如下圖所示。
一個完整的流程為:1、Client 到 RelayHub 查詢可用的 Relays 列表 2、Client傳送原交易到RelayServer 3、RelayServer到RelayHub中驗證Dapp開發者有足夠的ETH用於支付Gas,並且付款人允許該交易 4、RelayServer返回給Client簽名後的交易,此時交易已經被RelayServer中的Relay支付 5、RelayServer將交易傳送給RelayHub合約 6、RelayHub合約呼叫內部的可信轉發器,對交易的簽名和nonce進行校驗 7、可信轉發器校驗透過後呼叫接收者合約
四、案例
GSN官方提供的MetaCoin案例:https://metacoin.opengsn.org/
五、參考
GSNv2官網文件:https://docs.opengsn.org/learn/index.html
GSNv2 GitHub https://github.com/opengsn/gsn