本文介绍了如何使用 Gelato Relay 发送你的第一笔 Gasless 交易。通过 Gelato Relay,开发者可以构建无需用户持有原生代币支付 gas 费用的应用。文章详细讲解了在使用 Gelato Relay 前需要考虑的两个问题:是否需要用户身份验证和资金策略,并提供了相应的代码示例和步骤说明,以便开发者快速上手。
在不到 10 分钟内发送你的第一个无 Gas 交易!
为你的应用程序创建无 Gas 的用户体验将允许你构建出色的应用,并为你的用户提供发送交易的能力,而无需拥有任何原生 Token 来支付 Gas 费。
Gelato Relay 提供开箱即用的身份验证以及灵活的支付支持。
首先只需回答两个简单的问题,在你制作咖啡的时间里,你的第一个无 Gas 交易将准备好执行!
要验证用户身份,你需要知道他们的原始地址。由于我们进行的是链下无 Gas 交易,因此我们需要在链上获取用户地址。Gelato Relay 支持 ERC2771,以利用 EIP-712 签名,该签名在链上验证并恢复用户地址。
msgSender()
函数通过继承可用,允许你访问原始的 msg.sender。在 Relay 的上下文中,如果你尝试 msg.sender
,你将获得 Gelato 的 Relay 合约的地址。
在你的前端,你只需要签署请求即可。我们的演示应用程序将使用此流程来提交提案,以防止重复投票。在某些用例中,你可能根本不需要验证用户身份,例如,如果你正在构建一个任何人都可以创建提案的应用程序,则你无需验证用户身份。
简而言之,交易可以通过以下两种方式之一进行资助:
或者
有关付款方式的更深入说明,请参见 此处。
注意:我们建议使用 1Balance 以获得更简化的支付体验。
为了演示目的,我们将保持简单:对于我们的第一个无 Gas 交易,我们将使用目标合约余额进行支付。
对于我们的第二个无 Gas 交易,我们将向你展示如何使用 1Balance,这使我们能够自己资助和创建 SponsorKey。你可以在 此处 查看 1Balance beta 版!
一旦我们的资金策略最终确定,并且我们确定是否需要 Gelato 对用户进行身份验证的支持,那么就有两个简单的步骤:
准备目标合约以通过继承 Gelato 的辅助合约之一与 Relayer 通信,以及
在你的前端中构建并发送交易
使用下表,为我们的用例选择相关的合约和 SDK 方法:
Gelato 身份验证 | 支付 | 继承合约 | SDK/API 方法 |
---|---|---|---|
否 | 用户 | GelatoRelayContext | relayWithSyncFee |
是 | 用户 | GelatoRelayContextERC2771 | relayWithSyncFeeERC2771 |
否 | 1Balance | n. a. | relayWithSponsoredCall |
是¹ | 1Balance | ERC2771Context | relayWithSponsoredCallERC2771 |
¹ 需要 SponsorKey,请访问 Gelato 1Balance 此处
为了使目标合约执行我们的交易,它可能需要一些额外的数据,具体取决于付款方式或用户身份验证。
这是我们使合约“知道”需要什么数据的方式:
示例目标合约支付费用和匿名用户(无身份验证)
在这里,我们将继承 GelatoRelayContext
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import { GelatoRelayContext } from "@gelatonetwork/relay-context/contracts/GelatoRelayContext.sol";
….
contract GaslessProposing is {
…
// @notice
// @dev external only Gelato relayer
// @dev transfer Fee to Geato with _transferRelayFee();
function createProposal(bytes calldata payload) external onlyGelatoRelay {
…
_transferRelayFee();
}
…
}
只需进行三个小的更改,我们的合约现在就“知道 Relayer”了
import {GelatoRelayContext} from
"@gelatonetwork/relay-context/contracts/GelatoRelayContext.sol";
"@gelatonetwork/relay-context/contracts/GelatoRelayContext.sol";
contract GaslessProposing is GelatoRelayContext
function createProposal(bytes calldata payload) external onlyGelatoRelay {
…
_transferRelayFee();
}
使用 1Balance 和经过身份验证的用户的示例目标合约
在这里,我们将继承 ERC2771Context
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import {
ERC2771Context
} from "@gelatonetwork/relay-context/contracts/vendor/ERC2771Context.sol";
contract GaslessVoting is ERC2771Context {
…
constructor() ERC2771Context(address(0xBf175FCC7086b4f9bd59d5EAE8eA67b8f940DE0d)) {
}
modifier onlyTrustedForwarder() {
require(
isTrustedForwarder(msg.sender),
"Only callable by Trusted Forwarder"
);
_;
}
// @notice voting proposal
// @dev function called by the relayer implementing the onlyTrusted Forwarder
function votingProposal(bool positive) external onlyTrustedForwarder {
address voter = _msgSender();
_votingProposal(positive, voter);
}
在上面的示例中,我们仅需 3 个简单步骤就将合约转换为“Relay 感知合约”。
import { ERC2771Context} from "@gelatonetwork/relay-context/contracts/vendor/ERC2771Context.sol";
contract GaslessProposing is ERC2771Context
modifier onlyTrustedForwarder() {
require(isTrustedForwarder(msg.sender),"Only callable by Trusted Forwarder");
_;
}
function votingProposal(bool positive) external onlyTrustedForwarder {
address voter = _msgSender();
_votingProposal(positive, voter);
}
正如我们在此代码段中看到的那样,交易的原始 msg.sender 将在我们的合约中可用,调用 _msgSender()
方法
现在我们的合约已准备好接收 Relay 的交易,下一步是 构建对 Relayer 的请求。为此,我们将使用上表中描述的不同 SDK 方法。
支付费用和匿名用户的示例请求
在第一个示例中,我们不需要支持来验证用户身份,并且目标合同将支付交易费用。我们将使用 GelatoRelaySDK relayWithSyncFee 方法。
import { GelatoRelaySDK } from '@gelatonetwork/relay-sdk';
const feeToken = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
const { data } =
await this.readGaslessProposing.populateTransaction.createProposal(payload);
// populate the relay SDK request body
const request = {
chainId: 5, // Goerli in this case
target: targetContract.address, // target contract address
data: data!, // encoded transaction datas
isRelayContext: true, // are we using context contracts
feeToken: feeToken, // token to pay the relayer
};
// send relayRequest to Gelato Relay API
const relayResponse = await GelatoRelaySDK.relayWithSyncFee(request);
使用 1Balance 和经过身份验证的用户的示例请求
const { data } =
await this.gaslessVoting.populateTransaction.votingProposal(value);
const request = {
chainId: 5, // Goerli in this case
target: targetContract.Address, // target contract address
data: data!, // encoded transaction datas
user: userAddress!, //user sending the trasnaction
};
const sponsorApiKey = 'YOUR KEY';
const relayResponse = await GelatoRelaySDK.relayWithSponsoredCallERC2771(
request,
provider,
sponsorApiKey
);
当使用 relayWithSponsoredCallERC2771
方法时,将提示我们签署请求,以便我们的 ERC2771 后端可以解码签名。
通过帮助开发者增强他们的智能合约并使其无 Gas,Gelato Relay 消除了最终用户的多个摩擦点。通过使用无 Gas 交易使你的入门体验变得无缝,用户可以跳过获取网络原生 Token 的繁琐过程,而专注于享受你的应用程序。
Gelato 是一个 Web3 云平台,使开发人员能够创建自动化的、无 Gas 的和链下感知的 Layer 2 链和智能合约。400 多个 web3 项目多年来一直依赖 Gelato 来促进 DeFi、NFT 和游戏中的数百万笔交易。
Gelato RaaS: 一键部署你自己的定制 ZK 或 OP L2 链,内置原生账户抽象和所有 Gelato 中间件。
Web3 函数: 通过运行去中心化的云函数,将你的智能合约连接到链下数据和计算。
自动化: 通过以可靠、对开发者友好和去中心化的方式自动执行交易来自动化你的智能合约。
Relay: 通过易于使用的 API,让你的用户可以访问可靠、强大且可扩展的无 Gas 交易。
账户抽象 SDK: Gelato 与 Safe 合作构建了一个成熟的账户抽象 SDK,将 Gelato 行业最佳的无 Gas 交易能力与行业最安全的智能合约钱包相结合。
订阅我们的新闻通讯,并打开你的 Twitter 通知,以获取有关 Gelato 生态系统的最新更新! 如果你有兴趣成为 Gelato 团队的一员并构建互联网的未来,请浏览空缺职位并在此处申请 here。
- 原文链接: gelato.cloud/blog/how-to...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!