DTeam 技术日志

Doer、Delivery、Dream

Solidity 非权威开发指南(4): OpenGSN

胡键 Posted at — Dec 10, 2022 阅读

OpenZepplin 虽然提供了支持元交易的工具类(metatx 目录下),但并未对元交易场景提供完整的支持,甚至在其 MinimalForwarder.sol 的源代码的注释中都建议采用别的框架。这个框架就是本文主题:OpenGSN

OpenGSN 是元交易规范 ERC2771 的参考实现,它要解决的核心问题就是:如何让以太坊的用户在不交 gas fee 的前提下完成交易。也就是其官网的宣传语:“ETHless transactions made possible.”。

元交易

一个简单的类比:元交易提供了一种代付服务。其中涉及三方:交易发起方、元交易服务和交易执行方。

基本架构

它的实现机制可从其官网的架构图了解:

OpenGSN Architecture

关键组件:

整个交互过程如下图:

OpenGSN Flow

实现步骤

Contract

有两个关键 contract 需要实现:

注意,上面的 recipient 不必是全新的合约,它也可以是现有合约。ERC2771Recipient 的一个特点就是:它会自动判断 recipient 接收到的交易:到底是来自直接调用,还是从 relay service 发起。这样,使得 recipent 可以无缝应用于两种场景:支付和代付 gas fee。

在部署时,需在 recipient 构造函数中设置可信的 forwarder。

同时,OpenGSN 提供了现有的 paymaster,在决定自行实现之前,先查看是否有满足需要的现成合约。

Client

在 dapp 中引入:@opengsn/provider。然后在其中设置:web3 provder 和 paymaster 地址。也可以设置 relay server ,但这是可选的。

整个集成过程可以查看 OpenGSN 文档的这个教程

Relay Server

通常情况下,使用现成的 Relay Server 就行了,但对于特殊需要、想自立门户的,可以选择自建。这一点跟 WalletConnect 的 bridge server 类似。

其过程可以从此文档查看。

结语

本文对元交易框架 OpenGSN 提供了一个简要的整体介绍,目标是帮助开发者快速建立整体概念,降低上手的障碍。但要真正实际使用,还需自行阅读文档和研究代码。

与 OpenZepplin 的性质不同,OpenGSN 框架对于一般的合约编写并非必不可少,但假若你打算使你的 contract 能支持更多场景,简化目标客户使用系统的摩擦,它是一个不错的选择。


友情链接


相关文章