跳到内容

如何构建无 Gas 费的 Dapp

本博客探讨如何使用 Permissionless.js 和 ERC-4337 自定义 paymaster 智能合约创建无 gas 费的 dapp。

6 分钟阅读
如何构建无 Gas 费的 Dapp

在区块链上进行交易时,幕后会发生许多流程。每个流程都有相应的成本,我们将其称为"Gas 费用"。那么,Gas 究竟是什么?

Gas 是一种计量单位,用于衡量在区块链网络(如以太坊)上执行交易或运行智能合约所需的计算工作量。Gas 至关重要,因为它能够调节网络内的交易并确定其优先级。由于区块链网络的处理能力有限,Gas 费用具有两个核心作用:

  • 激励验证者或矿工:Gas 费用奖励验证者或矿工处理和确认交易,确保网络保持安全稳定运行。

  • 防止系统滥用:通过对每项操作收取费用,可有效遏制垃圾攻击和对计算资源的恶意利用,保护网络免遭潜在滥用。

考虑到 Gas 是区块链运行所需的"燃料",无 Gas dapp 的概念似乎自相矛盾——就像试图让汽车在没有燃料的情况下行驶一样。那么,区块链如何能够在没有 Gas 的情况下运行呢?

实际上,Gas 并不会消失。相反,支付 Gas 费用的责任从用户转移到了另一方——服务提供商或 dapp 本身。这种方式让用户无需直接承担 Gas 费用即可与 dapp 交互,从而提升了用户体验和可访问性。

使用 ERC-4337 和 Paymasters 智能合约实现无 Gas 交易

通常情况下,用户需要自行支付 Gas 费用,这会根据 Gas 价格增加交易成本。然而在无 Gas dapp 中,Gas 费用由第三方承担,由其代表用户签署并支付交易费用。这个第三方通常是中继者(relayer),但在某些情况下,也会使用账户抽象机制来替代。

实现无 Gas dapp 有两种标准:ERC-4337 和 ERC-2771。让我们来深入了解一下:

  • ERC-4337:该标准引入了账户抽象,使以太坊账户能够像智能合约一样运作。它为交易的发起和授权方式提供了更大的灵活性,尤其是通过将交易发起与传统外部拥有账户(EOA)解耦。这支持更复杂的交易工作流,例如将多个操作打包到一笔交易中,或启用可编程钱包。

  • ERC-2771:该标准引入了元交易框架,允许用户无需持有 ETH 即可直接与 dapp 交互,无需支付 Gas 费用。受信任的转发者代表用户处理交易,dapp 则向转发者报销 Gas 费用。这简化了没有 ETH 但仍希望与 dapp 交互的新用户的入门流程。

在本例中,我们将使用 permissionless.js 和 ERC-4337 创建一个自定义 paymaster,涵盖创建客户端(公共客户端和 Pimlico paymaster 客户端)、设置智能账户以及为 paymaster 定义自定义逻辑。但首先,让我们了解一下什么是 paymaster。

Paymaster 是以太坊账户抽象系统(如 ERC-4337)中的一种专用智能合约,充当交易 Gas 费用的赞助方,使用户能够使用 ETH 以外的代币支付费用,甚至可以完全免除费用。Paymaster 根据自定义逻辑决定是否赞助 Gas 费用,为 dapp 提供更大的灵活性——交易费用可由第三方承担,让用户无需持有 ETH 即可轻松完成操作。

  1. 首先,创建一个 utils/index.ts 文件,用于存储我们的代码。

  2. 创建公共客户端(可选):这是 Pimlico paymaster 客户端,将用于与 SimpleSmartAccount 交互:

import { createPublicClient, http } from "viem";
import { createPimlicoClient } from "permissionless/clients/pimlico";
import { lineaSepolia } from "viem/chains";

export const publicClient = createPublicClient({
	chain: lineaSepolia,
	transport: http("<https://rpc.ankr.com/eth_sepolia>"),
})

const pimlicoUrl = <https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}>

export const pimlicoClient = createPimlicoClient({
	transport: http(pimlicoUrl),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	},
})
复制
  1. 创建账户:可以是 permissionless.js 支持的任意账户,或符合接口规范的自定义账户。在本示例中,我们将使用 SimpleSmartAccount。

import { toSimpleSmartAccount } from "permissionless/accounts";
import { privateKeyToAccount } from "viem/accounts";

const simpleAccount = await toSimpleSmartAccount({
	client: publicClient,
	owner: privateKeyToAccount("YOUR_PRIVATE_KEY"),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	}
})
复制
  1. 使用自定义 paymaster 逻辑创建智能账户客户端:在创建 smartAccountClient 时,可以传入一个 sponsorUserOperation 函数,该函数将在用户操作签署和发送之前被调用。此函数必须返回 paymasterAndData、preVerificationGas、verificationGasLimit 和 callGasLimit 字段。

import { createSmartAccountClient } from "permissionless";
import { lineaSepolia } from "viem/chains";

const smartAccountClient = createSmartAccountClient({
	account,
	chain: lineaSepolia,
	bundlerTransport: http(pimlicoUrl),
	paymaster: pimlicoClient,
	userOperation: {
		estimateFeesPerGas: async () => {
			return (await pimlicoClient.getUserOperationGasPrice()).fast
		},
	}
})
复制
  1. 发送交易:现在可以正常发送交易。sponsorUserOperation 函数将在每笔交易签署和发送之前被调用,应用您设置的自定义 paymaster 逻辑。

const txHash = await smartAccountClient.sendTransaction({
	to: "YOUR_CONTRACT_ADDRESS",
	value: parseEther("0.1")
});
复制

我们已使用 permissionless.js 和 Pimlico 客户端搭建了一个集成自定义 paymaster 逻辑的智能账户。该设置通过 paymaster 自动化处理 Gas 费用和交易管理,实现与区块链的无缝交互。现在,轮到您亲自尝试了。

无 Gas dapp 的安全注意事项

1. 受信任的中继者和 paymaster:由于无 Gas dapp 依赖第三方中继者或 paymaster 代表用户处理交易,确保这些实体的可信度和安全性至关重要。恶意或遭受攻击的中继者可能篡改或拦截交易。请使用信誉良好的服务,并在中继者发生故障时实施备用机制。

2. 交易完整性:使用中继者时,交易可能由中继者代表用户签署。请确保中继者在将交易提交至区块链之前不会以任何恶意方式篡改交易内容。确保智能合约或相关逻辑能够验证交易详情(如目标地址、金额)与用户意图一致。

3. Paymaster 逻辑安全性:由于 paymaster 根据自定义逻辑决定是否赞助 Gas 费用,请确保该逻辑安全可靠,防止未授权方利用 paymaster 执行免费交易。实施严格的规则和检查机制,避免滥用或意外赞助交易。

4. 智能合约审计:无 Gas dapp 通常涉及用于账户抽象或元交易的复杂智能合约。请定期对智能合约进行安全漏洞审计,因为这些合约负责管理交易流程和费用。合约漏洞可能导致攻击者操纵交易流程,引发潜在的安全风险。

5. Gas 价格操纵:在由 paymaster 承担 Gas 费用的无 Gas dapp 中,攻击者可能尝试操纵 Gas 价格,以增加 paymaster 的承担成本。请在 paymaster 逻辑中加入保护措施,设置 Gas 费用上限并拒绝成本过高的操作。

6. 私钥安全存储:在使用 permissionless.js 或 Pimlico 等解决方案时,请确保用于签署交易的私钥得到安全存储。切勿在应用程序中硬编码私钥,并考虑使用硬件钱包或安全飞地等安全环境进行密钥管理。

释放无 Gas dapp 的潜力

无 Gas dapp 是一种创新方式,通过将 Gas 费用转移给第三方来提升 dapp 的用户体验。借助 ERC-4337 等标准,开发者可以构建更灵活、更友好的应用程序,降低新用户的入门门槛。

所提供的代码片段展示了如何使用 permissionless.js、Pimlico 客户端和自定义 paymaster 逻辑实现无 Gas 交易。按照这些步骤,您可以构建简化区块链交互的 dapp,让更广泛的用户群体都能轻松使用。现在,轮到您来构建并探索无 Gas dapp 的无限潜力了!

AI 翻译。可能包含错误。请务必核实信息。

评价此翻译

本文作者: