OpenZepplin 虽然提供了支持元交易的工具类(metatx 目录下),但并未对元交易场景提供完整的支持,甚至在其 MinimalForwarder.sol 的源代码的注释中都建议采用别的框架。这个框架就是本文主题:OpenGSN。
OpenGSN 是元交易规范 ERC2771 的参考实现,它要解决的核心问题就是:如何让以太坊的用户在不交 gas fee 的前提下完成交易。也就是其官网的宣传语:“ETHless transactions made possible.”。
一个简单的类比:元交易提供了一种代付服务。其中涉及三方:交易发起方、元交易服务和交易执行方。
它的实现机制可从其官网的架构图了解:
关键组件:
整个交互过程如下图:
有两个关键 contract 需要实现:
注意,上面的 recipient 不必是全新的合约,它也可以是现有合约。ERC2771Recipient 的一个特点就是:它会自动判断 recipient 接收到的交易:到底是来自直接调用,还是从 relay service 发起。这样,使得 recipent 可以无缝应用于两种场景:支付和代付 gas fee。
在部署时,需在 recipient 构造函数中设置可信的 forwarder。
同时,OpenGSN 提供了现有的 paymaster,在决定自行实现之前,先查看是否有满足需要的现成合约。
在 dapp 中引入:@opengsn/provider。然后在其中设置:web3 provder 和 paymaster 地址。也可以设置 relay server ,但这是可选的。
整个集成过程可以查看 OpenGSN 文档的这个教程。
通常情况下,使用现成的 Relay Server 就行了,但对于特殊需要、想自立门户的,可以选择自建。这一点跟 WalletConnect 的 bridge server 类似。
其过程可以从此文档查看。
本文对元交易框架 OpenGSN 提供了一个简要的整体介绍,目标是帮助开发者快速建立整体概念,降低上手的障碍。但要真正实际使用,还需自行阅读文档和研究代码。
与 OpenZepplin 的性质不同,OpenGSN 框架对于一般的合约编写并非必不可少,但假若你打算使你的 contract 能支持更多场景,简化目标客户使用系统的摩擦,它是一个不错的选择。
觉得有帮助的话,不妨考虑购买付费文章来支持我们 🙂 :
付费文章