透过Gas Station Network(GSN)打造更好的DApp开发与入门体验
前一篇文章Meta Transactions如何改变DApp付费生态介绍了Meta Transactions解决了一般使用者无法支付gas,因而被DApp拒于门外的困境,但依然有许多问题可以更好地解决。
其中最主要的问题就是Relayer 的中心化存在单点故障问题(Single Point of Failure, SPoF),可能是Relayer 因为某种原因无法工作或关闭,或是资料因审查而被刻意拒绝上链,缺乏公正性。
这次介绍的Gas Station Network 算是Meta Transactions 的进阶版,更复杂但也解决了上述的问题。
GSN也不是新概念,2018年底以色列公司TabooKey提案EIP-1613 Gas Stations Network,同样是透过Relayer来代替使用者支付Gas。
该协议相容于EIP-1077: Gas relay for contract calls,提供一个公开的管道(智能合约),来注册与管理Relay节点,任何节点都能加入Gas Station Network以避免单点故障(SPoF)。并有经济激励的机制,透过抵押、奖励与处罚来抑制恶意的Relay节点,鼓励Relayer做一个好人。
知名的以太坊开发工具OpenZeppelin也提供支持,与TabooKey一起提供了成套的开源工具tabookey-gasless(已更名为openeth-dev/gsn),包含RelayHub、RelayRecipient等合约,用docker包装好的RelayServer以及Web Client 。
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 呈现。
步骤
志愿者架设RelayServer以运行Relay节点,节点必须先在RelayHub注册并抵押Ether Client到RelayHub查询可用的Relays列表 由于RelayHub没有直接提供public或query方法可供查询,所以必须找出过去曾触发RelayAdded事件的地址再过滤掉也触发RelayRemoved事件的地址,并持续监听这两个事件以持续获得最新的Relays列表 Client选择一个资金充足且活跃的节点,用本机端的私钥将资料与指令签名送达Relay,RelayServer会提供API介面给Client呼叫,若该Relay没有回应则在数秒后选择另一个Relay 估算开发者储值在RelayHub的金额是否足够,足够则先支付Gas发送交易,将Client签名后的资料转发给RelayHub RelayHub会检查是否来自已经注册的Relay,然后验证签名正确则上链 若验证正确,RelayHub会提供奖励给Relay,并归还Relay先行代垫的Gas费用;但若验证失败,RelayHub会没收Relay之前抵押的Ether作为处罚 Client透过Web3 得知猫咪已经被领养成功,显示在UI 上
以上是简化过的步骤,完整的流程请参考文件EIP-1613 Gas Stations Network
为什么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 的框架而开发。
声明:本站所提供的资讯信息不代表任何投资暗示, 本站所发布文章仅代表个人观点,仅供参考。